Statistics
| Revision:

root / trunk / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / objects / DwgArc.java @ 9843

History | View | Annotate | Download (9.87 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.ArrayList;
39
import java.util.List;
40

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

    
54
/**
55
 * The DwgArc class represents a DWG Arc
56
 * 
57
 * @author jmorell
58
 */
59
public class DwgArc extends DwgObject 
60
        implements IDwgExtrusionable, IDwg3DTestable, IDwg2FMap, IDwgBlockMember {
61
        
62
        private double[] center;
63
        private double radius;
64
        private double thickness;
65
        private double[] extrusion;
66
        private double initAngle;
67
        private double endAngle;
68
        
69
        public DwgArc(int index) {
70
                super(index);
71
        }
72
        
73
        /**
74
         * Read an Arc in the DWG format Version 15
75
         * 
76
         * @param data Array of unsigned bytes obtained from the DWG binary file
77
         * @param offset The current bit offset where the value begins
78
         * @throws Exception If an unexpected bit value is found in the DWG file. Occurs
79
         *                    when we are looking for LwPolylines.
80
         */
81
        public void readDwgArcV15(int[] data, int offset) throws Exception {
82
                //System.out.println("readDwgArc() executed ...");
83
                int bitPos = offset;
84
                bitPos = readObjectHeaderV15(data, bitPos);
85
                ArrayList v = DwgUtil.getBitDouble(data, bitPos);
86
                bitPos = ((Integer)v.get(0)).intValue();
87
                double x = ((Double)v.get(1)).doubleValue();
88
                v = DwgUtil.getBitDouble(data, bitPos);
89
                bitPos = ((Integer)v.get(0)).intValue();
90
                double y = ((Double)v.get(1)).doubleValue();
91
                v = DwgUtil.getBitDouble(data, bitPos);
92
                bitPos = ((Integer)v.get(0)).intValue();
93
                double z = ((Double)v.get(1)).doubleValue();
94
                double[] coord = new double[]{x, y, z};
95
                center = coord;
96
                v = DwgUtil.getBitDouble(data, bitPos);
97
                bitPos = ((Integer)v.get(0)).intValue();
98
                double val = ((Double)v.get(1)).doubleValue();
99
                radius = val;
100
                v = DwgUtil.testBit(data, bitPos);
101
                bitPos = ((Integer)v.get(0)).intValue();
102
                boolean flag = ((Boolean)v.get(1)).booleanValue();
103
                if (flag) {
104
                        val=0.0;
105
                } else {
106
                        v = DwgUtil.getBitDouble(data, bitPos);
107
                        bitPos = ((Integer)v.get(0)).intValue();
108
                        val = ((Double)v.get(1)).doubleValue();
109
                }
110
            thickness = val;
111
                v = DwgUtil.testBit(data, bitPos);
112
                bitPos = ((Integer)v.get(0)).intValue();
113
                flag = ((Boolean)v.get(1)).booleanValue();
114
                if (flag) {
115
                         x = y = 0.0;
116
                         z = 1.0;
117
                } else {
118
                        v = DwgUtil.getBitDouble(data, bitPos);
119
                        bitPos = ((Integer)v.get(0)).intValue();
120
                        x = ((Double)v.get(1)).doubleValue();
121
                        v = DwgUtil.getBitDouble(data, bitPos);
122
                        bitPos = ((Integer)v.get(0)).intValue();
123
                        y = ((Double)v.get(1)).doubleValue();
124
                        v = DwgUtil.getBitDouble(data, bitPos);
125
                        bitPos = ((Integer)v.get(0)).intValue();
126
                        z = ((Double)v.get(1)).doubleValue();
127
                }
128
                coord = new double[]{x, y, z};
129
                extrusion = coord;
130
                v = DwgUtil.getBitDouble(data, bitPos);
131
                bitPos = ((Integer)v.get(0)).intValue();
132
                val = ((Double)v.get(1)).doubleValue();
133
            initAngle = val;
134
                v = DwgUtil.getBitDouble(data, bitPos);
135
                bitPos = ((Integer)v.get(0)).intValue();
136
                val = ((Double)v.get(1)).doubleValue();
137
            endAngle = val;
138
                bitPos = readObjectTailV15(data, bitPos);
139
        }
140
        /**
141
         * @return Returns the center.
142
         */
143
        public double[] getCenter() {
144
                return center;
145
        }
146
        /**
147
         * @param center The center to set.
148
         */
149
        public void setCenter(double[] center) {
150
                this.center = center;
151
        }
152
        /**
153
         * @return Returns the endAngle.
154
         */
155
        public double getEndAngle() {
156
                return endAngle;
157
        }
158
        /**
159
         * @param endAngle The endAngle to set.
160
         */
161
        public void setEndAngle(double endAngle) {
162
                this.endAngle = endAngle;
163
        }
164
        /**
165
         * @return Returns the initAngle.
166
         */
167
        public double getInitAngle() {
168
                return initAngle;
169
        }
170
        /**
171
         * @param initAngle The initAngle to set.
172
         */
173
        public void setInitAngle(double initAngle) {
174
                this.initAngle = initAngle;
175
        }
176
        /**
177
         * @return Returns the radius.
178
         */
179
        public double getRadius() {
180
                return radius;
181
        }
182
        /**
183
         * @param radius The radius to set.
184
         */
185
        public void setRadius(double radius) {
186
                this.radius = radius;
187
        }
188
    /**
189
     * @return Returns the extrusion.
190
     */
191
    public double[] getExtrusion() {
192
        return extrusion;
193
    }
194
    
195
        /* (non-Javadoc)
196
         * @see java.lang.Object#clone()
197
         */
198
        public Object clone() {
199
                DwgArc dwgArc = new DwgArc(index);
200
                dwgArc.setType(type);
201
                dwgArc.setHandle(handle);
202
                dwgArc.setVersion(version);
203
                dwgArc.setMode(mode);
204
                dwgArc.setLayerHandle(layerHandle);
205
                dwgArc.setColor(color);
206
                dwgArc.setNumReactors(numReactors);
207
                dwgArc.setNoLinks(noLinks);
208
                dwgArc.setLinetypeFlags(linetypeFlags);
209
                dwgArc.setPlotstyleFlags(plotstyleFlags);
210
                dwgArc.setSizeInBits(sizeInBits);
211
                dwgArc.setExtendedData(extendedData);
212
                dwgArc.setGraphicData(graphicData);
213
                //dwgArc.setInsideBlock(insideBlock);
214
                dwgArc.setCenter(center);
215
                dwgArc.setRadius(radius);
216
                dwgArc.setThickness(thickness);
217
                dwgArc.setExtrusion(extrusion);
218
                dwgArc.setInitAngle(initAngle);
219
                dwgArc.setEndAngle(endAngle);
220
                return dwgArc;
221
        }
222
        /**
223
         * @return Returns the thickness.
224
         */
225
        public double getThickness() {
226
                return thickness;
227
        }
228
        /**
229
         * @param thickness The thickness to set.
230
         */
231
        public void setThickness(double thickness) {
232
                this.thickness = thickness;
233
        }
234
        /**
235
         * @param extrusion The extrusion to set.
236
         */
237
        public void setExtrusion(double[] extrusion) {
238
                this.extrusion = extrusion;
239
        }
240

    
241
        /* (non-Javadoc)
242
         * @see com.iver.cit.jdwglib.dwg.IDwgExtrusionable#applyExtrussion()
243
         */
244
        public void applyExtrussion() {
245
                 double[] arcCenter = getCenter();
246
         double[] arcExt = getExtrusion();
247
         arcCenter = AcadExtrusionCalculator.
248
                         CalculateAcadExtrusion(arcCenter, arcExt);
249
         setCenter(arcCenter);
250
                
251
        }
252

    
253
        /* (non-Javadoc)
254
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
255
         */
256
        public boolean has3DData() {
257
                return (getCenter()[2] != 0.0);
258
        }
259

    
260
        /* (non-Javadoc)
261
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry()
262
         */
263
        public FShape toFMapGeometry(boolean is3DFile) {
264
                double[] c = getCenter();
265
                Point2D center = new Point2D.Double(c[0], c[1]);
266
                double radius = getRadius();
267
                double initAngle = Math.toDegrees(getInitAngle());
268
                double endAngle = Math.toDegrees(getEndAngle());
269
                Point2D[] arc = GisModelCurveCalculator.calculateGisModelArc(
270
                                center, radius, initAngle, endAngle);
271
                FPolyline2D arcc;
272
                if (is3DFile) {
273
                        double[][] arc3D = new double[arc.length][3];
274
                        for (int j = 0; j < arc.length; j++) {
275
                                arc3D[j][0] = arc[j].getX();
276
                                arc3D[j][1] = arc[j].getY();
277
                                arc3D[j][2] = c[2];
278
                        }
279
                        arcc = FMapUtil.points3DToFPolyline3D(arc3D);
280
                        
281
                } else {
282
                        arcc = FMapUtil.points2DToFPolyline2D(arc);
283
                }
284
                return arcc;
285
        }
286
        
287
        public String toString(){
288
                return "Arc";
289
        }
290

    
291
        /* (non-Javadoc)
292
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString()
293
         */
294
        public String toFMapString(boolean is3dFile) {
295
                if(is3dFile)
296
                        return "FPolyline3D";
297
                else
298
                        return "FPolyline2D";
299
        }
300

    
301
        /* (non-Javadoc)
302
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
303
         */
304
        public double getZ() {
305
                return getCenter()[2];
306
        }
307

    
308
        public void transform2Block(double[] bPoint, Point2D insPoint, double[] scale, double rot, List dwgObjectsWithoutBlocks, DwgFile callBack) {
309
                double[] center = getCenter();
310
                Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], 
311
                                                                                        center[1] - bPoint[1]);
312
                double laX = insPoint.getX() + 
313
                        ((pointAux.getX()*scale[0])*Math.cos(rot) + 
314
                    (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
315
                double laY = insPoint.getY() + 
316
                        ((pointAux.getX()*scale[0])*Math.sin(rot) + 
317
                                        (pointAux.getY()*scale[1])*Math.cos(rot));
318
                double laZ = center[2] * scale[2];
319
                double[] transformedCenter = new double[]{laX, laY, laZ};
320
                
321
                double radius = getRadius();         
322
                double transformedRadius = radius * scale[0];
323
                double initAngle = getInitAngle();
324
                double endAngle = getEndAngle();
325
        double transformedInitAngle = initAngle + rot;
326
        if (transformedInitAngle<0) {
327
            transformedInitAngle = transformedInitAngle + (2*Math.PI);
328
        } else if (transformedInitAngle>(2*Math.PI)) {
329
            transformedInitAngle = transformedInitAngle - (2*Math.PI);
330
        }
331
        double transformedEndAngle = endAngle + rot;
332
        if (transformedEndAngle<0) {
333
            transformedEndAngle = transformedEndAngle + (2*Math.PI);
334
        } else if (transformedEndAngle>(2*Math.PI)) {
335
            transformedEndAngle = transformedEndAngle - (2*Math.PI);
336
        }
337
        
338
                setCenter(transformedCenter);
339
                setRadius(transformedRadius);
340
                setInitAngle(transformedInitAngle);
341
                setEndAngle(transformedEndAngle);
342
                dwgObjectsWithoutBlocks.add(this);
343
                
344
        }
345
}