Statistics
| Revision:

root / trunk / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / objects / DwgPolyline3D.java @ 10820

History | View | Annotate | Download (11.9 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
import java.util.Map;
41

    
42
import com.iver.cit.gvsig.fmap.core.FPolyline2D;
43
import com.iver.cit.gvsig.fmap.core.IGeometry;
44
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
45
import com.iver.cit.jdwglib.dwg.DwgFile;
46
import com.iver.cit.jdwglib.dwg.DwgHandleReference;
47
import com.iver.cit.jdwglib.dwg.DwgObject;
48
import com.iver.cit.jdwglib.dwg.IDwg2FMap;
49
import com.iver.cit.jdwglib.dwg.IDwg3DTestable;
50
import com.iver.cit.jdwglib.dwg.IDwgBlockMember;
51
import com.iver.cit.jdwglib.dwg.IDwgPolyline;
52
import com.iver.cit.jdwglib.dwg.IDwgVertex;
53
import com.iver.cit.jdwglib.util.FMapUtil;
54

    
55
/**
56
 * The DwgPolyline3D class represents a DWG Polyline3D
57
 * 
58
 * @author jmorell
59
 */
60
public class DwgPolyline3D extends DwgObject 
61
        implements IDwgPolyline, IDwg3DTestable, IDwg2FMap, IDwgBlockMember{
62
        
63
        private int splineFlags;
64
        private int closedFlags;
65
        private DwgHandleReference firstVertexHandle = null;
66
        private DwgHandleReference lastVertexHandle = null;
67
        private DwgHandleReference seqendHandle = null;
68
        private List vertices;
69
        private double[] bulges;
70
        
71
        public DwgPolyline3D(int index) {
72
                super(index);
73
                vertices = new ArrayList();
74
        }
75
        /**
76
         * @return Returns the closedFlags.
77
         */
78
        public int getClosedFlags() {
79
                return closedFlags;
80
        }
81
        /**
82
         * @param closedFlags The closedFlags to set.
83
         */
84
        public void setClosedFlags(int closedFlags) {
85
                this.closedFlags = closedFlags;
86
        }
87
        /**
88
         * @return Returns the firstVertexHandle.
89
         */
90
        public DwgHandleReference getFirstVertexHandle() {
91
                return firstVertexHandle;
92
        }
93
        /**
94
         * @param firstVertexHandle The firstVertexHandle to set.
95
         */
96
        public void setFirstVertexHandle(DwgHandleReference firstVertexHandle) {
97
                this.firstVertexHandle = firstVertexHandle;
98
        }
99
        /**
100
         * @return Returns the lastVertexHandle.
101
         */
102
        public DwgHandleReference getLastVertexHandle() {
103
                return lastVertexHandle;
104
        }
105
        /**
106
         * @param lastVertexHandle The lastVertexHandle to set.
107
         */
108
        public void setLastVertexHandle(DwgHandleReference lastVertexHandle) {
109
                this.lastVertexHandle = lastVertexHandle;
110
        }
111
        /**
112
         * @return Returns the pts.
113
         */
114
        public List getPts() {
115
                return vertices;
116
        }
117
        /**
118
         * @param pts The pts to set.
119
         */
120
        public void setPts(List pts) {
121
                this.vertices = pts;
122
        }
123
        /**
124
         * @return Returns the bulges.
125
         */
126
        public double[] getBulges() {
127
                return bulges;
128
        }
129
        /**
130
         * @param bulges The bulges to set.
131
         */
132
        public void setBulges(double[] bulges) {
133
                this.bulges = bulges;
134
        }
135

    
136
        /**
137
         * @return Returns the seqendHandle.
138
         */
139
        public DwgHandleReference getSeqendHandle() {
140
                return seqendHandle;
141
        }
142
        /**
143
         * @param seqendHandle The seqendHandle to set.
144
         */
145
        public void setSeqendHandle(DwgHandleReference seqendHandle) {
146
                this.seqendHandle = seqendHandle;
147
        }
148
        /**
149
         * @return Returns the splineFlags.
150
         */
151
        public int getSplineFlags() {
152
                return splineFlags;
153
        }
154
        /**
155
         * @param splineFlags The splineFlags to set.
156
         */
157
        public void setSplineFlags(int splineFlags) {
158
                this.splineFlags = splineFlags;
159
        }
160
        
161
        public void calculateGisModel(DwgFile dwgFile){
162
                
163
                int closedFlags = getClosedFlags();
164
                DwgHandleReference firstHandle = getFirstVertexHandle();
165
                DwgHandleReference lastHandle = getLastVertexHandle();
166
                ArrayList pts = new ArrayList();
167
                double[] pt = new double[3];
168
                double bulge = 0d;
169
                
170
                DwgObject first = dwgFile.getDwgObjectFromHandle(firstHandle.getOffset());
171
                DwgObject last = dwgFile.getDwgObjectFromHandle(lastHandle.getOffset());
172
                if(first == null || last == null){
173
                        System.out.println("Polyline3D con vertices inicial o final a null");
174
                        return;
175
                }
176
                
177
                if(!(first instanceof DwgVertex3D)){
178
                        System.out.println("El primer vertice de Polyline3D es "+
179
                                                        first.getClass().getName());
180
                        return;
181
                }
182
                
183
                if(!(last instanceof DwgVertex3D)){
184
                        System.out.println("El primer vertice de Polyline3D es "+
185
                                                        first.getClass().getName());
186
                        return;
187
                }
188
                
189
                 int firstObjIdx = dwgFile.getIndexOf(first);
190
                 int lastObjIdx =  dwgFile.getIndexOf(last);
191
                 if(firstObjIdx == -1 || lastObjIdx == -1){
192
                         System.out.println("Calculate GIS Model: Problemas en la LinkedList: 1?="+firstObjIdx+",Ultimo="+lastObjIdx);
193
                         return;
194
                 }
195
                 
196
                 
197
//                 pt = ((DwgVertex2D)first).getPoint();
198
//                 pts.add(new Point2D.Double(pt[0], pt[1]));
199
//                 double bulge = ((DwgVertex2D)first).getBulge();
200
//                 bulges.add(new Double(bulge));
201
                 
202
                 for(int i = firstObjIdx; i <= lastObjIdx; i++){
203
                         DwgObject obj = dwgFile.getDwgObject(i);
204
                         if(obj instanceof DwgVertex3D){
205
                                 DwgVertex3D vertex = (DwgVertex3D) obj;
206
                                 pt = ((DwgVertex3D)vertex).getPoint();
207
                                pts.add(new double[]{pt[0], pt[1], pt[2]});
208
                         }else if(obj instanceof DwgSeqend){
209
                                 //TODO En Polyline2D J.Morell no interrumpia el barrido,
210
                                 //pero aqu? S?. REVISAR
211
                                 break;
212
                         }else{
213
                                 System.out.println("Encontrado "+obj.getClass().getName()+" en la lista de vertices de Polyline3D");
214
                         }
215
                 }//for
216
                 
217
                 if (pts.size()>0) {
218
                        List newPts = new ArrayList();
219
                        for (int j=0;j<pts.size();j++) {
220
                                newPts.add(pts.get(j));
221
                        }
222
                        if ((closedFlags & 0x1)== 0x1) {
223
                                
224
                                newPts.add(pts.get(0));
225
                        } 
226
                        setPts(newPts);
227
                } else {
228
                        System.out.println("Encontrada polil?nea sin puntos ...");
229
                        // TODO: No se debe mandar nunca una polil?nea sin puntos, si esto
230
                        // ocurre es porque existe un error que hay que corregir ...
231
                }
232
                
233
        }
234
        
235
        //TODO Metodo antiguo y muy ineficiente. Se deja hasta que se 
236
        //revise que funciona el nuevo perfectamente
237
        public void calculateGisModel(List dwgObjects) {
238
                int closedFlags = getClosedFlags();
239
                
240
//                En estas dos lineas de abajo y en el resto del metodo
241
//                se mantiene el mecanismo anterior al refactoring.
242
//                TODO: Pensar si deberiamos coger el handle completo.
243
//                Tal vez deberiamos tomar el handle completo y evaluar
244
//                a donde apuntan (pueden haber 2 handles con codigo y offset
245
//                distintos y que, sin embargo apunten al mismo objeto).
246
                
247
                int firstHandle = getFirstVertexHandle().getOffset();
248
                int lastHandle = getLastVertexHandle().getOffset();
249
                ArrayList pts = new ArrayList();
250
                double[] pt = new double[3];
251
                
252
                //TODO Sustituir esto por un hashtable handle->DwgObject
253
                for (int j=0;j< dwgObjects.size();j++) {
254
                        DwgObject firstVertex = (DwgObject)dwgObjects.get(j);
255
                        if (firstVertex instanceof DwgVertex3D) {
256
                                int vertexHandle = firstVertex.getHandle().getOffset();
257
                                if (vertexHandle==firstHandle) {
258
                                        int k=0;
259
                                        while (true) {
260
                                                DwgObject vertex = (DwgObject)dwgObjects.get(j+k);
261
                                                int vHandle = vertex.getHandle().getOffset();
262
                                                if (vertex instanceof DwgVertex3D) {
263
                                                        pt = ((DwgVertex3D)vertex).getPoint();
264
                                                        pts.add(new double[]{pt[0], pt[1], pt[2]});
265
                                                        k++;
266
                                                        if (vHandle==lastHandle && vertex instanceof DwgVertex3D) {
267
                                                                break;
268
                                                        }
269
                                                } else if (vertex instanceof DwgSeqend) {
270
                                                        break;
271
                                                }//if
272
                                        }//while
273
                                }//if
274
                        }//if
275
                }//for 
276
                
277
                if (pts.size()>0) {
278
                        List newPts = new ArrayList();
279
                        for (int j=0;j<pts.size();j++) {
280
                                newPts.add(pts.get(j));
281
                        }
282
                        if ((closedFlags & 0x1)==0x1) {
283
                                newPts.add(pts.get(0));
284
                        }
285
                        setPts(newPts);
286
                } else {
287
//                        System.out.println("Encontrada polil?nea sin puntos ...");
288
                        // TODO: No se debe mandar nunca una polil?nea sin puntos, si esto
289
                        // ocurre es porque existe un error que hay que corregir ...
290
                }
291
        }
292
        /* (non-Javadoc)
293
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
294
         */
295
        public boolean has3DData() {
296
                
297
                List pts = getPts();
298
                if(pts == null)
299
                        return false;
300
                double z = 0d;
301
            for (int j = 0; j<pts.size(); j++) {
302
                z = ((double[])pts.get(j))[2];
303
                        if (z != 0.0) 
304
                                return true;
305
            }
306
            return false;
307
           
308
        }
309
        /* (non-Javadoc)
310
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
311
         */
312
        public double getZ() {
313
                List points3D = getPts();
314
                if (points3D != null) {
315
                        boolean constantElevation = true;
316
                        double[] firstPt = (double[]) points3D.get(0);
317
                        for (int j = 0; j < points3D.size(); j++) {
318
                                double[] pt = (double[]) points3D.get(j);
319
                                if (pt[2] != firstPt[2]) {
320
                                        constantElevation = false;
321
                                        break;
322
                                }
323
                        }
324
                        if (constantElevation)
325
                                return firstPt[2];
326
                }
327
                return 0d;
328
        }
329
        /* (non-Javadoc)
330
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry(boolean)
331
         */
332
        public IGeometry toFMapGeometry(boolean is3DFile) {
333
                FPolyline2D pline = null;
334
                List points3D = getPts();
335
                if (points3D != null) {
336
                        if (is3DFile) {
337
                                pline = FMapUtil.points3DToFPolyline3D(points3D);
338
                        } else {
339
                                List points2D = new ArrayList();
340
                                for (int j = 0; j < points3D.size(); j++) {
341
                                        double[] pt3d = (double[]) points3D.get(j);
342
                                        double[] pt  = new double[]{pt3d[0],
343
                                                        pt3d[1]};
344
                                        points2D.add(pt);
345
                                }
346
                                pline = FMapUtil.points2DToFPolyline2D(points2D);
347
                        }//if
348
                }//if
349
                return  ShapeFactory.createGeometry(pline);
350
        }
351
        /* (non-Javadoc)
352
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString(boolean)
353
         */
354
        public String toFMapString(boolean is3DFile) {
355
                if(is3DFile)
356
                        return "FPolyline3D";
357
                else
358
                        return "FPolyline2D";
359
        }
360
        
361
        public String toString(){
362
                return "Polyline3D";
363
        }
364
        /* (non-Javadoc)
365
         * @see java.lang.Object#clone()
366
         */
367
        public Object clone(){
368
                DwgPolyline3D obj = new DwgPolyline3D(index);
369
                this.fill(obj);
370
                return obj;
371
        }
372
        
373
        protected void fill(DwgObject obj){
374
                super.fill(obj);
375
                DwgPolyline3D myObj = (DwgPolyline3D)obj;
376

    
377
                myObj.setBulges(bulges);
378
                myObj.setClosedFlags(closedFlags);
379
                myObj.setFirstVertexHandle(firstVertexHandle);
380
                myObj.setLastVertexHandle(lastVertexHandle);
381
                myObj.setPts(vertices);
382
                myObj.setSeqendHandle(seqendHandle);
383
                myObj.setSplineFlags(splineFlags);
384
        }
385
        public void addVertex(IDwgVertex vertex) {
386
                vertices.add(vertex.getPoint());
387
        }
388
        
389
        //TODO Por qu? Polyline3D no ten?a implementado el transform2Block???
390
        public void transform2Block(double[] bPoint, Point2D insPoint, 
391
                        double[] scale, double rot, 
392
                        List dwgObjectsWithoutBlocks, 
393
                        Map handleObjWithoutBlocks, DwgFile callBack) {
394
                
395
                DwgPolyline3D transformedEntity = null;
396
                List vertices = this.getPts();
397
                
398
                if (vertices != null) {
399
                    List transformedVertices = new ArrayList();
400
                        for (int i=0;i < vertices.size();i++) {
401
                                double[] pointAux = null;
402
                            pointAux = new double[]{((double[]) vertices.get(i))[0] - bPoint[0],
403
                                            ((double[]) vertices.get(i))[1] - bPoint[1]};
404
                            
405
                                double laX = insPoint.getX() + ((pointAux[0] * scale[0])*Math.cos(rot) + (pointAux[1]*scale[1])*(-1)*Math.sin(rot));
406
                                double laY = insPoint.getY() + ((pointAux[0]*scale[0])*Math.sin(rot) + (pointAux[1]*scale[1])*Math.cos(rot));
407
                                double laZ = ((double[]) vertices.get(i))[2] - bPoint[2];
408
                                transformedVertices.add(new double[]{laX, laY, laZ});
409
                        }//for
410
                        transformedEntity = (DwgPolyline3D)this.clone();
411
                        transformedEntity.setPts(transformedVertices);
412
                        dwgObjectsWithoutBlocks.add(transformedEntity);
413
                        handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity);
414
                }
415
        }
416

    
417
}