Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libDwg / src / org / gvsig / dwg / lib / objects / DwgPolyline3D.java @ 29001

History | View | Annotate | Download (14.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 org.gvsig.dwg.lib.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 org.gvsig.dwg.lib.DwgFile;
43
import org.gvsig.dwg.lib.DwgHandleReference;
44
import org.gvsig.dwg.lib.DwgObject;
45
import org.gvsig.dwg.lib.IDwg2FMap;
46
import org.gvsig.dwg.lib.IDwg3DTestable;
47
import org.gvsig.dwg.lib.IDwgBlockMember;
48
import org.gvsig.dwg.lib.IDwgPolyline;
49
import org.gvsig.dwg.lib.IDwgVertex;
50
import org.gvsig.dwg.lib.util.FMapUtil;
51
import org.gvsig.fmap.geom.Geometry;
52
import org.gvsig.fmap.geom.exception.CreateGeometryException;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

    
56

    
57
/**
58
 * The DwgPolyline3D class represents a DWG Polyline3D
59
 *
60
 * @author jmorell
61
 */
62
public class DwgPolyline3D extends DwgObject
63
        implements IDwgPolyline, IDwg3DTestable, IDwg2FMap, IDwgBlockMember{
64

    
65
        private int splineFlags;
66
        private int closedFlags;
67
        private DwgHandleReference firstVertexHandle = null;
68
        private DwgHandleReference lastVertexHandle = null;
69
        private DwgHandleReference seqendHandle = null;
70
        private ArrayList vertexHandles;
71
        private List vertices;
72
        private double[] bulges;
73

    
74
        private static Logger logger = LoggerFactory.getLogger(DwgPolyline3D.class.getName());
75

    
76
        public DwgPolyline3D(int index) {
77
                super(index);
78
                vertices = new ArrayList();
79
                vertexHandles = new ArrayList();
80
        }
81

    
82

    
83
        /**
84
         * @return Returns the closedFlags.
85
         */
86
        public int getClosedFlags() {
87
                return closedFlags;
88
        }
89
        /**
90
         * @param closedFlags The closedFlags to set.
91
         */
92
        public void setClosedFlags(int closedFlags) {
93
                this.closedFlags = closedFlags;
94
        }
95
        /**
96
         * @return Returns the firstVertexHandle.
97
         */
98
        public DwgHandleReference getFirstVertexHandle() {
99
                return firstVertexHandle;
100
        }
101
        /**
102
         * @param firstVertexHandle The firstVertexHandle to set.
103
         */
104
        public void setFirstVertexHandle(DwgHandleReference firstVertexHandle) {
105
                this.firstVertexHandle = firstVertexHandle;
106
        }
107
        /**
108
         * @return Returns the lastVertexHandle.
109
         */
110
        public DwgHandleReference getLastVertexHandle() {
111
                return lastVertexHandle;
112
        }
113
        /**
114
         * @param lastVertexHandle The lastVertexHandle to set.
115
         */
116
        public void setLastVertexHandle(DwgHandleReference lastVertexHandle) {
117
                this.lastVertexHandle = lastVertexHandle;
118
        }
119
        /**
120
         * @return Returns the pts.
121
         */
122
        public List getPts() {
123
                return vertices;
124
        }
125
        /**
126
         * @param pts The pts to set.
127
         */
128
        public void setPts(List pts) {
129
                this.vertices = pts;
130
        }
131
        /**
132
         * @return Returns the bulges.
133
         */
134
        public double[] getBulges() {
135
                return bulges;
136
        }
137
        /**
138
         * @param bulges The bulges to set.
139
         */
140
        public void setBulges(double[] bulges) {
141
                this.bulges = bulges;
142
        }
143

    
144
        /**
145
         * @return Returns the seqendHandle.
146
         */
147
        public DwgHandleReference getSeqendHandle() {
148
                return seqendHandle;
149
        }
150
        /**
151
         * @param seqendHandle The seqendHandle to set.
152
         */
153
        public void setSeqendHandle(DwgHandleReference seqendHandle) {
154
                this.seqendHandle = seqendHandle;
155
        }
156
        /**
157
         * @return Returns the splineFlags.
158
         */
159
        public int getSplineFlags() {
160
                return splineFlags;
161
        }
162
        /**
163
         * @param splineFlags The splineFlags to set.
164
         */
165
        public void setSplineFlags(int splineFlags) {
166
                this.splineFlags = splineFlags;
167
        }
168

    
169
        public void calculateGisModel(DwgFile dwgFile){
170
                ArrayList pts = new ArrayList();
171
                double[] pt = new double[3];
172

    
173
                int closedFlags = getClosedFlags();
174
                if(dwgFile.getDwgVersion().equalsIgnoreCase("Autocad R2004, R2005, R2006")){
175
                        ArrayList vertexHandles = getVertexHandles();
176
                        DwgObject seqend = null;
177
                        for (int i=0; i<vertexHandles.size(); i++){
178
                                DwgHandleReference vertice = (DwgHandleReference)vertexHandles.get(i);
179
                                DwgObject objVertex = dwgFile.getDwgObjectFromHandle(vertice.getOffset());
180
                                if (objVertex != null){
181
                                        if (objVertex instanceof DwgVertex3D) {
182
                                                pts.add(((DwgVertex3D)objVertex).getPoint());
183
                                        } else {
184
                                                logger.warn("Encontrado un "+objVertex.getClass().getName()+" " +
185
                                                                "con indice "+i+" en la lista de vertices de Polyline3D");
186
                                        }
187
                                } else {
188
                                        logger.warn("No se ha encontrado el vertice "+i+" de "+vertexHandles.size()
189
                                                        +" de la Polyline3D "+this.getIndex());
190
                                        if (i==0){
191
                                                seqend = dwgFile.getDwgObjectFromHandle(seqendHandle.getOffset());
192
                                        }
193
                                }
194
                        }
195
                        if(seqend != null){
196
                                if (seqend instanceof DwgVertex3D) {
197
                                        pts.add(((DwgVertex3D)seqend).getPoint());
198
                                } else {
199
                                        logger.warn("Encontrado un "+seqend.getClass().getName()+" en seqend de Polyline3D "+
200
                                                        this.getIndex()+" cuando debería ser un DwgVertex3D");
201
                                }
202
                        }
203

    
204
                } else {
205
                        DwgHandleReference firstHandle = getFirstVertexHandle();
206
                        DwgHandleReference lastHandle = getLastVertexHandle();
207
                        double bulge = 0d;
208

    
209
                        DwgObject first = dwgFile.getDwgObjectFromHandle(firstHandle.getOffset());
210
                        DwgObject last = dwgFile.getDwgObjectFromHandle(lastHandle.getOffset());
211
                        DwgObject seqend = dwgFile.getDwgObjectFromHandle(seqendHandle.getOffset());
212
                        if(last == null){
213
                                logger.warn("Polyline3D con vertice final a null");
214
                                return;
215
                        }
216
                        if(first == null){
217
                                logger.warn("Polyline3D con offset = "+this.getHandle().getOffset() +" con vertice inicial a null");
218
                                if(seqend != null){
219
                                        first = last;
220
                                        last = seqend;
221
                                } else {
222
                                        logger.warn("Polyline3D con vertice seqend a null");
223
                                }
224
                        }
225

    
226
                        if(!(first instanceof DwgVertex3D)){
227
                                logger.warn("El primer vertice de Polyline3D es "+
228
                                                first.getClass().getName());
229
                                return;
230
                        }
231

    
232
                        if(!(last instanceof DwgVertex3D)){
233
                                logger.warn("El ultimo vertice de Polyline3D es "+
234
                                                last.getClass().getName());
235
                                return;
236
                        }
237

    
238
                        int firstObjIdx = dwgFile.getIndexOf(first);
239
                        int lastObjIdx =  dwgFile.getIndexOf(last);
240
                        if(firstObjIdx == -1 || lastObjIdx == -1){
241
                                logger.warn("Calculate GIS Model: Problemas en la LinkedList: 1º="+firstObjIdx+",Ultimo="+lastObjIdx);
242
                                return;
243
                        }
244

    
245
                        for(int i = firstObjIdx; i <= lastObjIdx; i++){
246
                                DwgObject obj = dwgFile.getDwgObject(i);
247
                                if(obj instanceof DwgVertex3D){
248
                                        DwgVertex3D vertex = (DwgVertex3D) obj;
249
                                        pt = (vertex).getPoint();
250
                                        pts.add(new double[]{pt[0], pt[1], pt[2]});
251
                                }else if(obj instanceof DwgSeqend){
252
                                        //TODO En Polyline2D J.Morell no interrumpia el barrido,
253
                                        //pero aquí Sí. REVISAR
254
                                        break;
255
                                }else{
256
                                        logger.warn("Encontrado "+obj.getClass().getName()+" en la lista de vertices de Polyline3D");
257
                                }
258
                        }//for
259
                }
260
                if (pts.size()>0) {
261
                        List newPts = new ArrayList();
262
                        for (int j=0;j<pts.size();j++) {
263
                                newPts.add(pts.get(j));
264
                        }
265
                        if ((closedFlags & 0x1)== 0x1) {
266

    
267
                                newPts.add(pts.get(0));
268
                        }
269
                        setPts(newPts);
270
                } else {
271
                        logger.warn("Encontrada polilínea sin puntos ...");
272
                        // TODO: No se debe mandar nunca una polilínea sin puntos, si esto
273
                        // ocurre es porque existe un error que hay que corregir ...
274
                }
275

    
276
        }
277

    
278
        //TODO Metodo antiguo y muy ineficiente. Se deja hasta que se
279
        //revise que funciona el nuevo perfectamente
280
        public void calculateGisModel(List dwgObjects) {
281
                int closedFlags = getClosedFlags();
282

    
283
//                En estas dos lineas de abajo y en el resto del metodo
284
//                se mantiene el mecanismo anterior al refactoring.
285
//                TODO: Pensar si deberiamos coger el handle completo.
286
//                Tal vez deberiamos tomar el handle completo y evaluar
287
//                a donde apuntan (pueden haber 2 handles con codigo y offset
288
//                distintos y que, sin embargo apunten al mismo objeto).
289

    
290
                int firstHandle = getFirstVertexHandle().getOffset();
291
                int lastHandle = getLastVertexHandle().getOffset();
292
                ArrayList pts = new ArrayList();
293
                double[] pt = new double[3];
294

    
295
                //TODO Sustituir esto por un hashtable handle->DwgObject
296
                for (int j=0;j< dwgObjects.size();j++) {
297
                        DwgObject firstVertex = (DwgObject)dwgObjects.get(j);
298
                        if (firstVertex instanceof DwgVertex3D) {
299
                                int vertexHandle = firstVertex.getHandle().getOffset();
300
                                if (vertexHandle==firstHandle) {
301
                                        int k=0;
302
                                        while (true) {
303
                                                DwgObject vertex = (DwgObject)dwgObjects.get(j+k);
304
                                                int vHandle = vertex.getHandle().getOffset();
305
                                                if (vertex instanceof DwgVertex3D) {
306
                                                        pt = ((DwgVertex3D)vertex).getPoint();
307
                                                        pts.add(new double[]{pt[0], pt[1], pt[2]});
308
                                                        k++;
309
                                                        if (vHandle==lastHandle && vertex instanceof DwgVertex3D) {
310
                                                                break;
311
                                                        }
312
                                                } else if (vertex instanceof DwgSeqend) {
313
                                                        break;
314
                                                }//if
315
                                        }//while
316
                                }//if
317
                        }//if
318
                }//for
319

    
320
                if (pts.size()>0) {
321
                        List newPts = new ArrayList();
322
                        for (int j=0;j<pts.size();j++) {
323
                                newPts.add(pts.get(j));
324
                        }
325
                        if ((closedFlags & 0x1)==0x1) {
326
                                newPts.add(pts.get(0));
327
                        }
328
                        setPts(newPts);
329
                } else {
330
//                        System.out.println("Encontrada polilinea sin puntos ...");
331
                        // TODO: No se debe mandar nunca una polilinea sin puntos, si esto
332
                        // ocurre es porque existe un error que hay que corregir ...
333
                }
334
        }
335
        /* (non-Javadoc)
336
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
337
         */
338
        public boolean has3DData() {
339

    
340
                List pts = getPts();
341
                if(pts == null) {
342
                        return false;
343
                }
344
                double z = 0d;
345
            for (int j = 0; j<pts.size(); j++) {
346
                z = ((double[])pts.get(j))[2];
347
                        if (z != 0.0) {
348
                                return true;
349
                        }
350
            }
351
            return false;
352

    
353
        }
354
        /* (non-Javadoc)
355
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
356
         */
357
        public double getZ() {
358
                List points3D = getPts();
359
                if (points3D != null) {
360
                        boolean constantElevation = true;
361
                        double[] firstPt = (double[]) points3D.get(0);
362
                        for (int j = 0; j < points3D.size(); j++) {
363
                                double[] pt = (double[]) points3D.get(j);
364
                                if (pt[2] != firstPt[2]) {
365
                                        constantElevation = false;
366
                                        break;
367
                                }
368
                        }
369
                        if (constantElevation) {
370
                                return firstPt[2];
371
                        }
372
                }
373
                return 0d;
374
        }
375

    
376
        public double[] getPZ() {
377
                List points3D = getPts();
378
                if (points3D != null) {
379
                        double [] pZ = new double[points3D.size()];
380
                        for (int i = 0; i < points3D.size(); i++) {
381
                                double[] pt = (double[]) points3D.get(i);
382
                                pZ[i] = pt[2];
383
                        }
384
                        return pZ;
385
                }
386
                return new double[] {0};
387
        }
388

    
389
        /* (non-Javadoc)
390
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry(boolean)
391
         */
392
        public Geometry toFMapGeometry(boolean is3DFile) throws CreateGeometryException {
393
                return FMapUtil.ptsToMultiCurve(getPts(), getGeometrySubType(is3DFile));
394
        }
395
//        public Geometry toFMapGeometry_old(boolean is3DFile) {
396
//                FPolyline2D pline = null;
397
//                List points3D = getPts();
398
//                if (points3D != null && points3D.size() > 0) {
399
//                        if (is3DFile) {
400
//                                pline = FMapUtil.points3DToFPolyline3D(points3D);
401
//                        } else {
402
//                                List points2D = new ArrayList();
403
//                                for (int j = 0; j < points3D.size(); j++) {
404
//                                        double[] pt3d = (double[]) points3D.get(j);
405
//                                        double[] pt  = new double[]{pt3d[0],
406
//                                                        pt3d[1]};
407
//                                        points2D.add(pt);
408
//                                }
409
//                                pline = FMapUtil.points2DToFPolyline2D(points2D);
410
//                        }//if
411
//                        return  ShapeFactory.createGeometry(pline);
412
//                }//if
413
//                return null;
414
//
415
//        }
416
        /* (non-Javadoc)
417
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString(boolean)
418
         */
419
        public String toFMapString(boolean is3DFile) {
420
                if(is3DFile) {
421
                        return "FPolyline3D";
422
                } else {
423
                        return "FPolyline2D";
424
                }
425
        }
426

    
427
        public String toString(){
428
                return "Polyline3D";
429
        }
430
        /* (non-Javadoc)
431
         * @see java.lang.Object#clone()
432
         */
433
        public Object clone(){
434
                DwgPolyline3D obj = new DwgPolyline3D(index);
435
                this.fill(obj);
436
                return obj;
437
        }
438

    
439
        protected void fill(DwgObject obj){
440
                super.fill(obj);
441
                DwgPolyline3D myObj = (DwgPolyline3D)obj;
442

    
443
                myObj.setBulges(bulges);
444
                myObj.setClosedFlags(closedFlags);
445
                myObj.setFirstVertexHandle(firstVertexHandle);
446
                myObj.setLastVertexHandle(lastVertexHandle);
447
                myObj.setPts(vertices);
448
                myObj.setSeqendHandle(seqendHandle);
449
                myObj.setSplineFlags(splineFlags);
450
        }
451
        public void addVertex(IDwgVertex vertex) {
452
                vertices.add(vertex.getPoint());
453
        }
454

    
455
        //TODO Por qué Polyline3D no tenía implementado el transform2Block???
456
        public void transform2Block(double[] bPoint, Point2D insPoint,
457
                        double[] scale, double rot,
458
                        List dwgObjectsWithoutBlocks,
459
                        Map handleObjWithoutBlocks, DwgFile callBack) {
460

    
461
                DwgPolyline3D transformedEntity = null;
462
                List vertices = this.getPts();
463

    
464
                if (vertices != null) {
465
                    List transformedVertices = new ArrayList();
466
                        for (int i=0;i < vertices.size();i++) {
467
                                double[] pointAux = null;
468
                            pointAux = new double[]{((double[]) vertices.get(i))[0] - bPoint[0],
469
                                            ((double[]) vertices.get(i))[1] - bPoint[1]};
470

    
471
                                double laX = insPoint.getX() + ((pointAux[0] * scale[0])*Math.cos(rot) + (pointAux[1]*scale[1])*(-1)*Math.sin(rot));
472
                                double laY = insPoint.getY() + ((pointAux[0]*scale[0])*Math.sin(rot) + (pointAux[1]*scale[1])*Math.cos(rot));
473
                                double laZ = ((double[]) vertices.get(i))[2] - bPoint[2];
474
                                transformedVertices.add(new double[]{laX, laY, laZ});
475
                        }//for
476
                        transformedEntity = (DwgPolyline3D)this.clone();
477
                        transformedEntity.setPts(transformedVertices);
478
                        dwgObjectsWithoutBlocks.add(transformedEntity);
479
                        handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity);
480
                }
481
        }
482

    
483
        /**
484
         * @param Handles The vertexHandles to set.
485
         */
486
        public void setVertexHandles(ArrayList Handles){
487
                this.vertexHandles = Handles;
488
        }
489

    
490
        /**
491
         * @return Returns the vertexHandles.
492
         */
493
        public ArrayList getVertexHandles(){
494
                return this.vertexHandles;
495
        }
496
        /**
497
         * @param Handle The vertexHandles to add.
498
         */
499
        public void addVertexHandle(DwgHandleReference handle){
500
                this.vertexHandles.add(handle);
501
        }
502

    
503
        public int getGeometrySubType(boolean is3DFile) {
504
                return Geometry.SUBTYPES.GEOM3D;
505
        }
506

    
507
        public int getGeometryType() {
508
                return Geometry.TYPES.MULTICURVE;
509
        }
510

    
511

    
512

    
513
}