Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / objects / DwgArc.java @ 10064

History | View | Annotate | Download (7.77 KB)

1
/* jdwglib. Java Library for reading Dwg files.
2
 * 
3
 * Author: Jose Morell Rama (jose.morell@gmail.com).
4
 * Port from the Pythoncad Dwg library by Art Haas.
5
 *
6
 * Copyright (C) 2005 Jose Morell, IVER TI S.A. and Generalitat Valenciana
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
21
 *
22
 * For more information, contact:
23
 *
24
 * Jose Morell (jose.morell@gmail.com)
25
 * 
26
 * or
27
 *
28
 * IVER TI S.A.
29
 *  C/Salamanca, 50
30
 *  46005 Valencia
31
 *  Spain
32
 *  +34 963163400
33
 *  dac@iver.es
34
 */
35
package com.iver.cit.jdwglib.dwg.objects;
36

    
37
import java.awt.geom.Point2D;
38
import java.util.List;
39

    
40
import com.iver.cit.gvsig.fmap.core.FPolyline2D;
41
import com.iver.cit.gvsig.fmap.core.FShape;
42
import com.iver.cit.jdwglib.dwg.DwgFile;
43
import com.iver.cit.jdwglib.dwg.DwgObject;
44
import com.iver.cit.jdwglib.dwg.IDwg2FMap;
45
import com.iver.cit.jdwglib.dwg.IDwg3DTestable;
46
import com.iver.cit.jdwglib.dwg.IDwgBlockMember;
47
import com.iver.cit.jdwglib.dwg.IDwgExtrusionable;
48
import com.iver.cit.jdwglib.util.AcadExtrusionCalculator;
49
import com.iver.cit.jdwglib.util.FMapUtil;
50
import com.iver.cit.jdwglib.util.GisModelCurveCalculator;
51

    
52
/**
53
 * The DwgArc class represents a DWG Arc
54
 * 
55
 * @author jmorell
56
 */
57
public class DwgArc extends DwgObject 
58
        implements IDwgExtrusionable, IDwg3DTestable, IDwg2FMap, IDwgBlockMember {
59
        
60
        private double[] center;
61
        private double radius;
62
        private double thickness;
63
        private double[] extrusion;
64
        private double initAngle;
65
        private double endAngle;
66
        
67
        public DwgArc(int index) {
68
                super(index);
69
        }
70
        
71
        
72
        /**
73
         * @return Returns the center.
74
         */
75
        public double[] getCenter() {
76
                return center;
77
        }
78
        /**
79
         * @param center The center to set.
80
         */
81
        public void setCenter(double[] center) {
82
                this.center = center;
83
        }
84
        /**
85
         * @return Returns the endAngle.
86
         */
87
        public double getEndAngle() {
88
                return endAngle;
89
        }
90
        /**
91
         * @param endAngle The endAngle to set.
92
         */
93
        public void setEndAngle(double endAngle) {
94
                this.endAngle = endAngle;
95
        }
96
        /**
97
         * @return Returns the initAngle.
98
         */
99
        public double getInitAngle() {
100
                return initAngle;
101
        }
102
        /**
103
         * @param initAngle The initAngle to set.
104
         */
105
        public void setInitAngle(double initAngle) {
106
                this.initAngle = initAngle;
107
        }
108
        /**
109
         * @return Returns the radius.
110
         */
111
        public double getRadius() {
112
                return radius;
113
        }
114
        /**
115
         * @param radius The radius to set.
116
         */
117
        public void setRadius(double radius) {
118
                this.radius = radius;
119
        }
120
    /**
121
     * @return Returns the extrusion.
122
     */
123
    public double[] getExtrusion() {
124
        return extrusion;
125
    }
126
    
127
        /* (non-Javadoc)
128
         * @see java.lang.Object#clone()
129
         */
130
        public Object clone() {
131
                DwgArc dwgArc = new DwgArc(index);
132
                dwgArc.setType(type);
133
                dwgArc.setHandle(handle);
134
                dwgArc.setVersion(version);
135
                dwgArc.setMode(mode);
136
                dwgArc.setLayerHandle(layerHandle);
137
                dwgArc.setColor(color);
138
                dwgArc.setNumReactors(numReactors);
139
                dwgArc.setNoLinks(noLinks);
140
                dwgArc.setLinetypeFlags(linetypeFlags);
141
                dwgArc.setPlotstyleFlags(plotstyleFlags);
142
                dwgArc.setSizeInBits(sizeInBits);
143
                dwgArc.setExtendedData(extendedData);
144
                dwgArc.setGraphicData(graphicData);
145
                //dwgArc.setInsideBlock(insideBlock);
146
                dwgArc.setCenter(center);
147
                dwgArc.setRadius(radius);
148
                dwgArc.setThickness(thickness);
149
                dwgArc.setExtrusion(extrusion);
150
                dwgArc.setInitAngle(initAngle);
151
                dwgArc.setEndAngle(endAngle);
152
                return dwgArc;
153
        }
154
        /**
155
         * @return Returns the thickness.
156
         */
157
        public double getThickness() {
158
                return thickness;
159
        }
160
        /**
161
         * @param thickness The thickness to set.
162
         */
163
        public void setThickness(double thickness) {
164
                this.thickness = thickness;
165
        }
166
        /**
167
         * @param extrusion The extrusion to set.
168
         */
169
        public void setExtrusion(double[] extrusion) {
170
                this.extrusion = extrusion;
171
        }
172

    
173
        /* (non-Javadoc)
174
         * @see com.iver.cit.jdwglib.dwg.IDwgExtrusionable#applyExtrussion()
175
         */
176
        public void applyExtrussion() {
177
                 double[] arcCenter = getCenter();
178
         double[] arcExt = getExtrusion();
179
         arcCenter = AcadExtrusionCalculator.
180
                         CalculateAcadExtrusion(arcCenter, arcExt);
181
         setCenter(arcCenter);
182
                
183
        }
184

    
185
        /* (non-Javadoc)
186
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
187
         */
188
        public boolean has3DData() {
189
                return (getCenter()[2] != 0.0);
190
        }
191

    
192
        /* (non-Javadoc)
193
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry()
194
         */
195
        public FShape toFMapGeometry(boolean is3DFile) {
196
                double[] c = getCenter();
197
                Point2D center = new Point2D.Double(c[0], c[1]);
198
                double radius = getRadius();
199
                double initAngle = Math.toDegrees(getInitAngle());
200
                double endAngle = Math.toDegrees(getEndAngle());
201
                Point2D[] arc = GisModelCurveCalculator.calculateGisModelArc(
202
                                center, radius, initAngle, endAngle);
203
                FPolyline2D arcc;
204
                if (is3DFile) {
205
                        double[][] arc3D = new double[arc.length][3];
206
                        for (int j = 0; j < arc.length; j++) {
207
                                arc3D[j][0] = arc[j].getX();
208
                                arc3D[j][1] = arc[j].getY();
209
                                arc3D[j][2] = c[2];
210
                        }
211
                        arcc = FMapUtil.points3DToFPolyline3D(arc3D);
212
                        
213
                } else {
214
                        arcc = FMapUtil.points2DToFPolyline2D(arc);
215
                }
216
                return arcc;
217
        }
218
        
219
        public String toString(){
220
                return "Arc";
221
        }
222

    
223
        /* (non-Javadoc)
224
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString()
225
         */
226
        public String toFMapString(boolean is3dFile) {
227
                if(is3dFile)
228
                        return "FPolyline3D";
229
                else
230
                        return "FPolyline2D";
231
        }
232

    
233
        /* (non-Javadoc)
234
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
235
         */
236
        public double getZ() {
237
                return getCenter()[2];
238
        }
239

    
240
        public void transform2Block(double[] bPoint, Point2D insPoint, double[] scale, double rot, List dwgObjectsWithoutBlocks, DwgFile callBack) {
241
                //DwgArc transformedEntity = new DwgArc(getIndex());
242
                double[] center = this.getCenter();
243
                Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], center[1] - bPoint[1]);
244
                double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
245
                double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
246
                double laZ = center[2] * scale[2];
247
                double[] transformedCenter = new double[]{laX, laY, laZ};
248
                double radius = this.getRadius();
249
                double transformedRadius = radius * scale[0];
250
                double initAngle = this.getInitAngle();
251
                double endAngle = this.getEndAngle();
252
                double transformedInitAngle = initAngle + rot;
253
                if (transformedInitAngle<0) {
254
                    transformedInitAngle = transformedInitAngle + (2*Math.PI);
255
                } else if (transformedInitAngle>(2*Math.PI)) {
256
                    transformedInitAngle = transformedInitAngle - (2*Math.PI);
257
                }
258
                double transformedEndAngle = endAngle + rot;
259
                if (transformedEndAngle<0) {
260
                    transformedEndAngle = transformedEndAngle + (2*Math.PI);
261
                } else if (transformedEndAngle>(2*Math.PI)) {
262
                    transformedEndAngle = transformedEndAngle - (2*Math.PI);
263
                }
264
                DwgArc transformedEntity = (DwgArc) this.clone();
265
                transformedEntity.setCenter(transformedCenter);
266
                transformedEntity.setRadius(transformedRadius);
267
                transformedEntity.setInitAngle(transformedInitAngle);
268
                transformedEntity.setEndAngle(transformedEndAngle);
269
                transformedEntity.setHandle(this.getHandle());
270
                
271
                
272
                
273
                
274
                
275
                
276
                dwgObjectsWithoutBlocks.add(transformedEntity);
277
                
278
//                setCenter(transformedCenter);
279
//                setRadius(transformedRadius);
280
//                setInitAngle(transformedInitAngle);
281
//                setEndAngle(transformedEndAngle);
282
//                dwgObjectsWithoutBlocks.add(this);
283
        }
284
}