Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_0_Build_2059 / libraries / libDwg / src / org / gvsig / dwg / lib / objects / DwgArc.java @ 39305

History | View | Annotate | Download (8.01 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 org.gvsig.dwg.lib.objects;
36

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

    
41
import org.slf4j.Logger;
42
import org.slf4j.LoggerFactory;
43

    
44
import org.gvsig.dwg.lib.DwgFile;
45
import org.gvsig.dwg.lib.DwgObject;
46
import org.gvsig.dwg.lib.IDwg2FMap;
47
import org.gvsig.dwg.lib.IDwg3DTestable;
48
import org.gvsig.dwg.lib.IDwgBlockMember;
49
import org.gvsig.dwg.lib.IDwgExtrusionable;
50
import org.gvsig.dwg.lib.util.AcadExtrusionCalculator;
51
import org.gvsig.dwg.lib.util.FMapUtil;
52
import org.gvsig.fmap.geom.Geometry;
53
import org.gvsig.fmap.geom.GeometryLocator;
54
import org.gvsig.fmap.geom.GeometryManager;
55
import org.gvsig.fmap.geom.exception.CreateGeometryException;
56
import org.gvsig.fmap.geom.primitive.Arc;
57
import org.gvsig.fmap.geom.primitive.Point;
58
import org.gvsig.fmap.geom.util.UtilFunctions;
59

    
60

    
61
/**
62
 * The DwgArc class represents a DWG Arc
63
 *
64
 * @author jmorell
65
 */
66
public class DwgArc extends DwgObject
67
        implements IDwgExtrusionable, IDwg3DTestable, IDwg2FMap, IDwgBlockMember {
68

    
69
    private static Logger logger = LoggerFactory.getLogger(DwgArc.class);
70
        private double[] center;
71
        private double radius;
72
        private double thickness;
73
        private double[] extrusion;
74
        private double initAngle;
75
        private double endAngle;
76

    
77
        public DwgArc(int index) {
78
                super(index);
79
        }
80

    
81

    
82
        /**
83
         * @return Returns the center.
84
         */
85
        public double[] getCenter() {
86
                return center;
87
        }
88
        /**
89
         * @param center The center to set.
90
         */
91
        public void setCenter(double[] center) {
92
                this.center = center;
93
        }
94
        /**
95
         * @return Returns the endAngle.
96
         */
97
        public double getEndAngle() {
98
                return endAngle;
99
        }
100
        /**
101
         * @param endAngle The endAngle to set.
102
         */
103
        public void setEndAngle(double endAngle) {
104
                this.endAngle = endAngle;
105
        }
106
        /**
107
         * @return Returns the initAngle.
108
         */
109
        public double getInitAngle() {
110
                return initAngle;
111
        }
112
        /**
113
         * @param initAngle The initAngle to set.
114
         */
115
        public void setInitAngle(double initAngle) {
116
                this.initAngle = initAngle;
117
        }
118
        /**
119
         * @return Returns the radius.
120
         */
121
        public double getRadius() {
122
                return radius;
123
        }
124
        /**
125
         * @param radius The radius to set.
126
         */
127
        public void setRadius(double radius) {
128
                this.radius = radius;
129
        }
130
    /**
131
     * @return Returns the extrusion.
132
     */
133
    public double[] getExtrusion() {
134
        return extrusion;
135
    }
136

    
137
        /**
138
         * @return Returns the thickness.
139
         */
140
        public double getThickness() {
141
                return thickness;
142
        }
143
        /**
144
         * @param thickness The thickness to set.
145
         */
146
        public void setThickness(double thickness) {
147
                this.thickness = thickness;
148
        }
149
        /**
150
         * @param extrusion The extrusion to set.
151
         */
152
        public void setExtrusion(double[] extrusion) {
153
                this.extrusion = extrusion;
154
        }
155

    
156
        /* (non-Javadoc)
157
         * @see com.iver.cit.jdwglib.dwg.IDwgExtrusionable#applyExtrussion()
158
         */
159
        public void applyExtrussion() {
160
                 double[] arcCenter = getCenter();
161
         double[] arcExt = getExtrusion();
162
         arcCenter = AcadExtrusionCalculator.
163
                         extrude2(arcCenter, arcExt);
164
         setCenter(arcCenter);
165

    
166
        }
167

    
168
        /* (non-Javadoc)
169
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
170
         */
171
        public boolean has3DData() {
172
                return (getCenter()[2] != 0.0);
173
        }
174

    
175
        /* (non-Javadoc)
176
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry()
177
         */
178
        public Geometry toFMapGeometry(boolean is3DFile) throws CreateGeometryException {
179

    
180
                GeometryManager gMan = GeometryLocator.getGeometryManager();
181

    
182
                double[] center = getCenter();
183
                //FIXME: ¿qué hacer cuando llega un radio negativo?
184
                //        De momento, tomamos el valor absoluto del radio, pero
185
                //        ¿habría que modificar de alguna manera los angulos?
186
                double radius = Math.abs(getRadius());
187
                double angSt = getInitAngle();
188
                double angEnd = getEndAngle();
189
                double angExt = UtilFunctions.angleDistance(angSt, angEnd);
190
                Arc arc = (Arc) gMan.create(getGeometryType(),getGeometrySubType(is3DFile));
191
                Point point = (Point) gMan.create(Geometry.TYPES.POINT,getGeometrySubType(is3DFile));
192
                point.setCoordinates(center);
193
                
194
                try {
195
                    arc.setPoints(point, radius, angSt, -angExt);
196
                } catch (IllegalArgumentException ex) {
197
                    logger.info("Unable to create arc from points.");
198
                    arc = null;
199
                }
200
                
201
                return arc;
202
        }
203

    
204
        public String toString(){
205
                return "Arc";
206
        }
207

    
208
        /* (non-Javadoc)
209
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString()
210
         */
211
        public String toFMapString(boolean is3dFile) {
212
                if(is3dFile) {
213
                        return "FPolyline3D";
214
                } else {
215
                        return "FPolyline2D";
216
                }
217
        }
218

    
219
        /* (non-Javadoc)
220
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
221
         */
222
        public double getZ() {
223
                return getCenter()[2];
224
        }
225

    
226
        public void transform2Block(double[] bPoint, Point2D insPoint, double[] scale, double rot,
227
                        List dwgObjectsWithoutBlocks, Map handleObjWithoutBlocks, DwgFile callBack) {
228
                //DwgArc transformedEntity = new DwgArc(getIndex());
229
                double[] center = this.getCenter();
230
                Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], center[1] - bPoint[1]);
231
                double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
232
                double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
233
                double laZ = center[2] * scale[2];
234
                double[] transformedCenter = new double[]{laX, laY, laZ};
235
                double radius = this.getRadius();
236
                double transformedRadius = radius * scale[0];
237
                double initAngle = this.getInitAngle();
238
                double endAngle = this.getEndAngle();
239
                double transformedInitAngle = initAngle + rot;
240
                if (transformedInitAngle<0) {
241
                    transformedInitAngle = transformedInitAngle + (2*Math.PI);
242
                } else if (transformedInitAngle>(2*Math.PI)) {
243
                    transformedInitAngle = transformedInitAngle - (2*Math.PI);
244
                }
245
                double transformedEndAngle = endAngle + rot;
246
                if (transformedEndAngle<0) {
247
                    transformedEndAngle = transformedEndAngle + (2*Math.PI);
248
                } else if (transformedEndAngle>(2*Math.PI)) {
249
                    transformedEndAngle = transformedEndAngle - (2*Math.PI);
250
                }
251
                DwgArc transformedEntity = (DwgArc) this.clone();
252
                transformedEntity.setCenter(transformedCenter);
253
                transformedEntity.setRadius(transformedRadius);
254
                transformedEntity.setInitAngle(transformedInitAngle);
255
                transformedEntity.setEndAngle(transformedEndAngle);
256
                transformedEntity.setHandle(this.getHandle());
257

    
258
                dwgObjectsWithoutBlocks.add(transformedEntity);
259
                handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity);
260

    
261
//                setCenter(transformedCenter);
262
//                setRadius(transformedRadius);
263
//                setInitAngle(transformedInitAngle);
264
//                setEndAngle(transformedEndAngle);
265
//                dwgObjectsWithoutBlocks.add(this);
266
        }
267
        /* (non-Javadoc)
268
         * @see java.lang.Object#clone()
269
         */
270
public Object clone(){
271
                DwgArc obj = new DwgArc(index);
272
                this.fill(obj);
273
                return obj;
274
        }
275

    
276
        protected void fill(DwgObject obj){
277
                super.fill(obj);
278
                DwgArc myObj = (DwgArc)obj;
279

    
280
                myObj.setCenter(center);
281
                myObj.setEndAngle(endAngle);
282
                myObj.setExtrusion(extrusion);
283
                myObj.setInitAngle(initAngle);
284
                myObj.setRadius(radius);
285
                myObj.setThickness(thickness);
286

    
287
        }
288

    
289
        public int getGeometryType() {
290
                return Geometry.TYPES.ARC;
291
        }
292

    
293
}