Statistics
| Revision:

svn-gvsig-desktop / branches / v10 / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / objects / DwgPolyline3D.java @ 10539

History | View | Annotate | Download (11.3 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.DwgHandleReference;
45
import com.iver.cit.jdwglib.dwg.DwgObject;
46
import com.iver.cit.jdwglib.dwg.IDwg2FMap;
47
import com.iver.cit.jdwglib.dwg.IDwg3DTestable;
48
import com.iver.cit.jdwglib.dwg.IDwgPolyline;
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
        public DwgPolyline3D(int index) {
59
                super(index);
60
                // TODO Auto-generated constructor stub
61
        }
62
        private int splineFlags;
63
        private int closedFlags;
64
        private DwgHandleReference firstVertexHandle = null;
65
        private DwgHandleReference lastVertexHandle = null;
66
        private DwgHandleReference seqendHandle = null;
67
        private double[][] pts;
68
        private double[] bulges;
69
        
70
        /**
71
         * @return Returns the closedFlags.
72
         */
73
        public int getClosedFlags() {
74
                return closedFlags;
75
        }
76
        /**
77
         * @param closedFlags The closedFlags to set.
78
         */
79
        public void setClosedFlags(int closedFlags) {
80
                this.closedFlags = closedFlags;
81
        }
82
        /**
83
         * @return Returns the firstVertexHandle.
84
         */
85
        public DwgHandleReference getFirstVertexHandle() {
86
                return firstVertexHandle;
87
        }
88
        /**
89
         * @param firstVertexHandle The firstVertexHandle to set.
90
         */
91
        public void setFirstVertexHandle(DwgHandleReference firstVertexHandle) {
92
                this.firstVertexHandle = firstVertexHandle;
93
        }
94
        /**
95
         * @return Returns the lastVertexHandle.
96
         */
97
        public DwgHandleReference getLastVertexHandle() {
98
                return lastVertexHandle;
99
        }
100
        /**
101
         * @param lastVertexHandle The lastVertexHandle to set.
102
         */
103
        public void setLastVertexHandle(DwgHandleReference lastVertexHandle) {
104
                this.lastVertexHandle = lastVertexHandle;
105
        }
106
        /**
107
         * @return Returns the pts.
108
         */
109
        public double[][] getPts() {
110
                return pts;
111
        }
112
        /**
113
         * @param pts The pts to set.
114
         */
115
        public void setPts(double[][] pts) {
116
                this.pts = pts;
117
        }
118
        /**
119
         * @return Returns the bulges.
120
         */
121
        public double[] getBulges() {
122
                return bulges;
123
        }
124
        /**
125
         * @param bulges The bulges to set.
126
         */
127
        public void setBulges(double[] bulges) {
128
                this.bulges = bulges;
129
        }
130

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

    
390
                myObj.setBulges(bulges);
391
                myObj.setClosedFlags(closedFlags);
392
                myObj.setFirstVertexHandle(firstVertexHandle);
393
                myObj.setLastVertexHandle(lastVertexHandle);
394
                myObj.setPts(pts);
395
                myObj.setSeqendHandle(seqendHandle);
396
                myObj.setSplineFlags(splineFlags);
397
        }
398

    
399
}