Statistics
| Revision:

root / trunk / org.gvsig.dwg / org.gvsig.dwg.lib / src / main / java / org / gvsig / dwg / lib / objects / DwgEllipse.java @ 5

History | View | Annotate | Download (8.98 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.gvsig.dwg.lib.DwgFile;
42
import org.gvsig.dwg.lib.DwgObject;
43
import org.gvsig.dwg.lib.IDwg2FMap;
44
import org.gvsig.dwg.lib.IDwg3DTestable;
45
import org.gvsig.dwg.lib.IDwgBlockMember;
46
import org.gvsig.dwg.lib.util.FMapUtil;
47
import org.gvsig.fmap.geom.Geometry;
48
import org.gvsig.fmap.geom.GeometryLocator;
49
import org.gvsig.fmap.geom.GeometryManager;
50
import org.gvsig.fmap.geom.exception.CreateGeometryException;
51
import org.gvsig.fmap.geom.primitive.EllipticArc;
52
import org.gvsig.fmap.geom.primitive.Point;
53

    
54

    
55
/**
56
 * The DwgEllipse class represents a DWG Ellipse
57
 *
58
 * @author jmorell
59
 */
60
public class DwgEllipse extends DwgObject
61
        implements IDwg3DTestable, IDwg2FMap, IDwgBlockMember{
62
        public DwgEllipse(int index) {
63
                super(index);
64
                // TODO Auto-generated constructor stub
65
        }
66
        private double[] center;
67
        private double[] semiMajorAxisVector;
68
        private double[] extrusion;
69
        private double axisRatio;
70
        private double initAngle;
71
        private double endAngle;
72

    
73
    /**
74
     * @return Returns the axisRatio.
75
     */
76
    public double getAxisRatio() {
77
        return axisRatio;
78
    }
79
    /**
80
     * @param axisRatio The axisRatio to set.
81
     */
82
    public void setAxisRatio(double axisRatio) {
83
        this.axisRatio = axisRatio;
84
    }
85
    /**
86
     * @return Returns the center.
87
     */
88
    public double[] getCenter() {
89
        return center;
90
    }
91
    /**
92
     * @param center The center to set.
93
     */
94
    public void setCenter(double[] center) {
95
        this.center = center;
96
    }
97
    /**
98
     * @return Returns the endAngle.
99
     */
100
    public double getEndAngle() {
101
        return endAngle;
102
    }
103
    /**
104
     * @param endAngle The endAngle to set.
105
     */
106
    public void setEndAngle(double endAngle) {
107
        this.endAngle = endAngle;
108
    }
109
    /**
110
     * @return Returns the initAngle.
111
     */
112
    public double getInitAngle() {
113
        return initAngle;
114
    }
115
    /**
116
     * @param initAngle The initAngle to set.
117
     */
118
    public void setInitAngle(double initAngle) {
119
        this.initAngle = initAngle;
120
    }
121
    /**
122
     * @return Returns the majorAxisVector.
123
     */
124
    public double[] getSemiMajorAxisVector() {
125
        return semiMajorAxisVector;
126
    }
127
    /**
128
     * @param semiMajorAxisVector The majorAxisVector to set.
129
     */
130
    public void setSemiMajorAxisVector(double[] semiMajorAxisVector) {
131
        this.semiMajorAxisVector = semiMajorAxisVector;
132
    }
133
    /**
134
     * @return Returns the extrusion.
135
     */
136
    public double[] getExtrusion() {
137
        return extrusion;
138
    }
139
        /**
140
         * @param extrusion The extrusion to set.
141
         */
142
        public void setExtrusion(double[] extrusion) {
143
                this.extrusion = extrusion;
144
        }
145
        /* (non-Javadoc)
146
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
147
         */
148
        public boolean has3DData() {
149
                return (getCenter()[2] !=0.0);
150
        }
151
        /* (non-Javadoc)
152
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
153
         */
154
        public double getZ() {
155
                return getCenter()[2];
156
        }
157
        /* (non-Javadoc)
158
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry(boolean)
159
         */
160
        public Geometry toFMapGeometry(boolean is3DFile) throws CreateGeometryException {
161

    
162
                GeometryManager gMan = GeometryLocator.getGeometryManager();
163
                double[] c = getCenter();
164
                double[] semiMajorAxisVector = getSemiMajorAxisVector();
165
                double axisRatio = getAxisRatio();
166
                double angSt = getInitAngle();
167
                double angEnd = getEndAngle();
168
                double angExt = FMapUtil.angleDistance(angSt, angEnd);
169

    
170

    
171
                //Point2D axis1Start = new Point2D.Double(center.getX()+smav.getX(), center.getY()+smav.getY());
172
                Point axis1Start = (Point)gMan.create(Geometry.TYPES.POINT,
173
                                getGeometrySubType(is3DFile));
174
                double[] tmp;
175
                tmp = new double[c.length];
176
                for (int i=0;i< c.length;i++){
177
                        tmp[i]=c[i]+semiMajorAxisVector[i];
178
                }
179
                axis1Start.setCoordinates(tmp);
180

    
181
                //Point2D axis1End = new Point2D.Double(center.getX()-smav.getX(), center.getY()-smav.getY());
182
                Point axis1End = (Point)gMan.create(Geometry.TYPES.POINT,
183
                                getGeometrySubType(is3DFile));
184

    
185
                tmp = new double[c.length];
186
                for (int i=0;i< c.length;i++){
187
                        tmp[i]=c[i]-semiMajorAxisVector[i];
188
                }
189
                axis1End.setCoordinates(tmp);
190

    
191

    
192
                Point2D smav = new Point2D.Double(semiMajorAxisVector[0],semiMajorAxisVector[1]);
193
                Point2D origen = new Point2D.Double(0.0,0.0);
194
                double semiMajorAxisLenght = origen.distance(smav);
195
                double semiMinorAxisLenght = semiMajorAxisLenght * axisRatio;
196

    
197

    
198

    
199
                EllipticArc ellipse = (EllipticArc) gMan.create(getGeometryType(),
200
                                getGeometrySubType(is3DFile));
201
                ellipse.setPoints(axis1Start, axis1End, semiMinorAxisLenght, -angSt,
202
                                -angExt);
203

    
204
                return ellipse;
205
        }
206

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

    
218
        public String toString(){
219
                return "Ellipse";
220
        }
221
        public void transform2Block(double[] bPoint, Point2D insPoint,
222
                        double[] scale, double rot,
223
                        List dwgObjectsWithoutBlocks,
224
                        Map handleObjWithoutBlocks,
225
                        DwgFile callBack) {
226
                DwgEllipse transformedEntity = null;
227
                double[] center = this.getCenter();
228
                Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], center[1] - bPoint[1]);
229
                double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
230
                double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
231
                double laZ = center[2] * scale[2];
232
                double[] transformedCenter = new double[]{laX, laY, laZ};
233
                double[] majorAxisVector = this.getSemiMajorAxisVector();
234
                double[] transformedMajorAxisVector = new double[]{majorAxisVector[0] * scale[0], majorAxisVector[1] * scale[1], majorAxisVector[2] * scale[2]};
235
                //TODO: Rotar un �ngulo rot el vector majorAxisVector fijado en
236
                // center.
237
                double axisRatio = this.getAxisRatio();
238
                double transformedAxisRatio = axisRatio;
239
                double initAngle = this.getInitAngle();
240
                double endAngle = this.getEndAngle();
241
        double transformedInitAngle = initAngle + rot;
242
        if (transformedInitAngle<0) {
243
            transformedInitAngle = transformedInitAngle + (2*Math.PI);
244
        } else if (transformedInitAngle>(2*Math.PI)) {
245
            transformedInitAngle = transformedInitAngle - (2*Math.PI);
246
        }
247
        double transformedEndAngle = endAngle + rot;
248
        if (transformedEndAngle<0) {
249
            transformedEndAngle = transformedEndAngle + (2*Math.PI);
250
        } else if (transformedEndAngle>(2*Math.PI)) {
251
            transformedEndAngle = transformedEndAngle - (2*Math.PI);
252
        }
253
                transformedEntity = (DwgEllipse)this.clone();
254
                transformedEntity.setCenter(transformedCenter);
255
                transformedEntity.setSemiMajorAxisVector(transformedMajorAxisVector);
256
                transformedEntity.setAxisRatio(transformedAxisRatio);
257
                transformedEntity.setInitAngle(transformedInitAngle);
258
                transformedEntity.setEndAngle(transformedEndAngle);
259
                dwgObjectsWithoutBlocks.add(transformedEntity);
260
                handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity);
261
//                dwgObjectsWithoutBlocks.add(this);
262
        }
263
        /* (non-Javadoc)
264
         * @see java.lang.Object#clone()
265
         */
266
        public Object clone(){
267
                DwgEllipse obj = new DwgEllipse(index);
268
                this.fill(obj);
269
                return obj;
270
        }
271

    
272
        protected void fill(DwgObject obj){
273
                super.fill(obj);
274
                DwgEllipse myObj = (DwgEllipse)obj;
275

    
276
                myObj.setAxisRatio(axisRatio);
277
                myObj.setCenter(center);
278
                myObj.setEndAngle(endAngle);
279
                myObj.setExtrusion(extrusion);
280
                myObj.setInitAngle(initAngle);
281
                myObj.setSemiMajorAxisVector(semiMajorAxisVector);
282

    
283
        }
284

    
285
        public int getGeometryType() {
286
                return Geometry.TYPES.ELLIPTICARC;
287
        }
288
}