Statistics
| Revision:

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

History | View | Annotate | Download (10.4 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.util.ArrayList;
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.DwgHandleReference;
44
import com.iver.cit.jdwglib.dwg.DwgObject;
45
import com.iver.cit.jdwglib.dwg.IDwg2FMap;
46
import com.iver.cit.jdwglib.dwg.IDwg3DTestable;
47
import com.iver.cit.jdwglib.dwg.IDwgPolyline;
48
import com.iver.cit.jdwglib.dwg.IDwgVertex;
49
import com.iver.cit.jdwglib.util.FMapUtil;
50

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

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

    
373
                myObj.setBulges(bulges);
374
                myObj.setClosedFlags(closedFlags);
375
                myObj.setFirstVertexHandle(firstVertexHandle);
376
                myObj.setLastVertexHandle(lastVertexHandle);
377
                myObj.setPts(vertices);
378
                myObj.setSeqendHandle(seqendHandle);
379
                myObj.setSplineFlags(splineFlags);
380
        }
381
        public void addVertex(IDwgVertex vertex) {
382
                vertices.add(vertex.getPoint());
383
        }
384

    
385
}