Statistics
| Revision:

root / trunk / org.gvsig.dwg / org.gvsig.dwg.lib / src / main / java / org / gvsig / dwg / lib / objects / DwgPolyline2D.java @ 74

History | View | Annotate | Download (17.1 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.IDwgExtrusionable;
49
import org.gvsig.dwg.lib.IDwgPolyline;
50
import org.gvsig.dwg.lib.IDwgVertex;
51
import org.gvsig.dwg.lib.util.AcadExtrusionCalculator;
52
import org.gvsig.dwg.lib.util.FMapUtil;
53
import org.gvsig.dwg.lib.util.GisModelCurveCalculator;
54
import org.gvsig.fmap.geom.Geometry;
55
import org.gvsig.fmap.geom.exception.CreateGeometryException;
56
import org.slf4j.Logger;
57
import org.slf4j.LoggerFactory;
58

    
59

    
60
/**
61
 * The DwgPolyline2D class represents a DWG Polyline2D
62
 *
63
 * @author jmorell
64
 */
65
public class DwgPolyline2D extends DwgObject
66
        implements IDwgPolyline, IDwgExtrusionable, IDwg3DTestable, IDwg2FMap, IDwgBlockMember{
67

    
68
        private static Logger logger = LoggerFactory.getLogger(DwgPolyline2D.class.getName());
69

    
70
        private int flags;
71
        private int curveType;
72
        private double initWidth;
73
        private double endWidth;
74
        private double thickness;
75
        private double elevation;
76
        private double[] extrusion;
77
        private DwgHandleReference firstVertexHandle = null;
78
        private DwgHandleReference lastVertexHandle = null;
79
        private DwgHandleReference seqendHandle = null;
80
        private List vertices;
81
        private double[] bulges;
82
        private ArrayList vertexHandles;
83

    
84
        public DwgPolyline2D(int index) {
85
                super(index);
86
                vertices = new ArrayList();
87
                vertexHandles = new ArrayList();
88
        }
89
        /**
90
         * @return Returns the firstVertexHandle.
91
         */
92
        public DwgHandleReference getFirstVertexHandle() {
93
                return firstVertexHandle;
94
        }
95
        /**
96
         * @param firstVertexHandle The firstVertexHandle to set.
97
         */
98
        public void setFirstVertexHandle(DwgHandleReference firstVertexHandle) {
99
                this.firstVertexHandle = firstVertexHandle;
100
        }
101
        /**
102
         * @return Returns the flags.
103
         */
104
        public int getFlags() {
105
                return flags;
106
        }
107
        /**
108
         * @param flags The flags to set.
109
         */
110
        public void setFlags(int flags) {
111
                this.flags = flags;
112
        }
113
        /**
114
         * @return Returns the lastVertexHandle.
115
         */
116
        public DwgHandleReference getLastVertexHandle() {
117
                return lastVertexHandle;
118
        }
119
        /**
120
         * @param lastVertexHandle The lastVertexHandle to set.
121
         */
122
        public void setLastVertexHandle(DwgHandleReference lastVertexHandle) {
123
                this.lastVertexHandle = lastVertexHandle;
124
        }
125
        /**
126
         * @return Returns the pts.
127
         */
128
        public List getPts() {
129
                return vertices;
130
        }
131
        /**
132
         * @param pts The pts to set.
133
         */
134
        public void setPts(List pts) {
135
                this.vertices = pts;
136
        }
137
        /**
138
         * @return Returns the bulges.
139
         */
140
        public double[] getBulges() {
141
                return bulges;
142
        }
143
        /**
144
         * @param bulges The bulges to set.
145
         */
146
        public void setBulges(double[] bulges) {
147
                this.bulges = bulges;
148
        }
149
        /**
150
         * @return Returns the initWidth.
151
         */
152
        public double getInitWidth() {
153
                return initWidth;
154
        }
155
        /**
156
         * @param initWidth The initWidth to set.
157
         */
158
        public void setInitWidth(double initWidth) {
159
                this.initWidth = initWidth;
160
        }
161
        /**
162
         * @return Returns the seqendHandle.
163
         */
164
        public DwgHandleReference getSeqendHandle() {
165
                return seqendHandle;
166
        }
167
        /**
168
         * @param seqendHandle The seqendHandle to set.
169
         */
170
        public void setSeqendHandle(DwgHandleReference seqendHandle) {
171
                this.seqendHandle = seqendHandle;
172
        }
173
        /**
174
         * @return Returns the thickness.
175
         */
176
        public double getThickness() {
177
                return thickness;
178
        }
179
        /**
180
         * @param thickness The thickness to set.
181
         */
182
        public void setThickness(double thickness) {
183
                this.thickness = thickness;
184
        }
185
        /**
186
         * @return Returns the curveType.
187
         */
188
        public int getCurveType() {
189
                return curveType;
190
        }
191
        /**
192
         * @param curveType The curveType to set.
193
         */
194
        public void setCurveType(int curveType) {
195
                this.curveType = curveType;
196
        }
197
        /**
198
         * @return Returns the elevation.
199
         */
200
        public double getElevation() {
201
                return elevation;
202
        }
203
        /**
204
         * @param elevation The elevation to set.
205
         */
206
        public void setElevation(double elevation) {
207
                this.elevation = elevation;
208
        }
209
        /**
210
         * @return Returns the endWidth.
211
         */
212
        public double getEndWidth() {
213
                return endWidth;
214
        }
215
        /**
216
         * @param endWidth The endWidth to set.
217
         */
218
        public void setEndWidth(double endWidth) {
219
                this.endWidth = endWidth;
220
        }
221
        /**
222
         * @return Returns the extrusion.
223
         */
224
        public double[] getExtrusion() {
225
                return extrusion;
226
        }
227
        /**
228
         * @param extrusion The extrusion to set.
229
         */
230
        public void setExtrusion(double[] extrusion) {
231
                this.extrusion = extrusion;
232
        }
233

    
234
        /**
235
         * @param Handles The vertexHandles to set.
236
         */
237
        public void setVertexHandles(ArrayList handles){
238
                this.vertexHandles = handles;
239
        }
240

    
241
        /**
242
         * @return Returns the vertexHandles.
243
         */
244
        public ArrayList getVertexHandles(){
245
                return this.vertexHandles;
246
        }
247
        /**
248
         * @param Handle The vertexHandles to add.
249
         */
250
        public void addVertexHandle(DwgHandleReference handle){
251
                this.vertexHandles.add(handle);
252
        }
253

    
254

    
255
        public void calculateGisModel(DwgFile dwgFile){
256
                int flags = getFlags();
257
//                En este metodo se mantiene el mecanismo anterior
258
//                al refactoring de los handles references.
259
//                TODO: Pensar si deberiamos coger el handle completo.
260
//                Tal vez deberiamos tomar el handle completo y evaluar
261
//                a donde apuntan (pueden haber 2 handles con codigo y offset
262
//                distintos y que, sin embargo apunten al mismo objeto).
263

    
264
                ArrayList pts = new ArrayList();
265
                ArrayList bulges = new ArrayList();
266
                double[] pt = new double[3];
267
                double bulge = 0d;
268

    
269
                if(dwgFile.getDwgVersion().equalsIgnoreCase("Autocad R2004, R2005, R2006")){
270
                        ArrayList vertexHandles = getVertexHandles();
271
                        DwgObject seqend = null;
272
                        for (int i=0; i<vertexHandles.size(); i++){
273
                                DwgHandleReference vertice = (DwgHandleReference)vertexHandles.get(i);
274
                                DwgObject objVertex = dwgFile.getDwgObjectFromHandle(vertice.getOffset());
275
                                if (objVertex != null){
276
                                        if (objVertex instanceof DwgVertex2D) {
277
                                                pts.add(((DwgVertex2D)objVertex).getPoint());
278
                                                bulge = ((DwgVertex2D)objVertex).getBulge();
279
                                                bulges.add(new Double(bulge));
280
                                        } else {
281
                                                logger.warn("Encontrado un "+objVertex.getClass().getName()+" " +
282
                                                                "con indice "+i+" en la lista de vertices de Polyline2D");
283
                                        }
284
                                } else {
285
                                        logger.warn("No se ha encontrado el vertice "+i+" de "+vertexHandles.size()
286
                                                        +" de la Polyline2D "+this.getIndex());
287
                                        if (i==0){
288
                                                seqend = dwgFile.getDwgObjectFromHandle(seqendHandle.getOffset());
289
                                        }
290
                                }
291
                        }
292
                        if(seqend != null){
293
                                if (seqend instanceof DwgVertex2D) {
294
                                        pts.add(((DwgVertex2D)seqend).getPoint());
295
                                        bulge = ((DwgVertex2D)seqend).getBulge();
296
                                        bulges.add(new Double(bulge));
297
                                } else {
298
                                        logger.warn("Encontrado un "+seqend.getClass().getName()+" en seqend de Polyline2D "+
299
                                                        this.getIndex()+" cuando debería ser un DwgVertex2D");
300
                                }
301
                        }
302

    
303
                } else {
304
                        DwgHandleReference firstHandle = getFirstVertexHandle();
305
                        DwgHandleReference lastHandle = getLastVertexHandle();
306

    
307

    
308
                        DwgObject first = dwgFile.getDwgObjectFromHandle(firstHandle.getOffset());
309
                        DwgObject last = dwgFile.getDwgObjectFromHandle(lastHandle.getOffset());
310
                        if(first == null || last == null){
311
                                logger.warn("Polyline2D con vertices inicial o final a null");
312
                                return;
313
                        }
314

    
315
                        if(!(first instanceof DwgVertex2D)){
316
                                logger.warn("El primer vertice de Polyline2D es "+
317
                                                first.getClass().getName());
318
                                return;
319
                        }
320

    
321
                        if(!(last instanceof DwgVertex2D)){
322
                                logger.warn("El primer vertice de Polyline2D es "+
323
                                                first.getClass().getName());
324
                                return;
325
                        }
326

    
327
                        int firstObjIdx = dwgFile.getIndexOf(first);
328
                        int lastObjIdx =  dwgFile.getIndexOf(last);
329
                        if(firstObjIdx == -1 || lastObjIdx == -1){
330
                                logger.warn("Calculate GIS Model: Problemas en la LinkedList: 1�="+firstObjIdx+",Ultimo="+lastObjIdx);
331
                                return;
332
                        }
333

    
334
//                        pt = ((DwgVertex2D)first).getPoint();
335
//                        pts.add(new Point2D.Double(pt[0], pt[1]));
336
//                        bulge = ((DwgVertex2D)first).getBulge();
337
//                        bulges.add(new Double(bulge));
338

    
339
                        for(int i = firstObjIdx; i <= lastObjIdx; i++){
340
                                DwgObject obj = dwgFile.getDwgObject(i);
341
                                if(obj instanceof DwgVertex2D){
342
                                        DwgVertex2D vertex = (DwgVertex2D) obj;
343
                                        pt = vertex.getPoint();
344
                                        pts.add(new Point2D.Double(pt[0], pt[1]));
345
                                        bulge = vertex.getBulge();
346
                                        bulges.add(new Double(bulge));
347
                                }else{
348
                                        logger.warn("Encontrado "+obj.getClass().getName()+" en la lista de vertices de Polyline2D");
349
                                }
350
                        }//for
351
                }
352

    
353
                if (pts.size()>0) {
354
                        List newPts = new ArrayList();
355
                        if ((flags & 0x1)==0x1) {
356
                                for (int j=0;j<pts.size();j++) {
357
                                        newPts.add(pts.get(j));
358
                                }
359
                                newPts.add(pts.get(0));
360
                                bulges.add(new Double(0));
361
                        } else {
362
                                for (int j=0;j<pts.size();j++) {
363
                                        newPts.add(pts.get(j));
364
                                }
365
                        }
366
                        double[] bs = new double[bulges.size()];
367
                        for (int j=0;j<bulges.size();j++) {
368
                                bs[j] = ((Double)bulges.get(j)).doubleValue();
369
                        }
370
                        setBulges(bs);
371
                        List points = GisModelCurveCalculator.
372
                        calculateGisModelBulge(newPts, bs);
373
                        setPts(points);
374
                } else {
375
                        logger.warn("Encontrada polilínea sin puntos ...");
376
                        // TODO: No se debe mandar nunca una polil�nea sin puntos, si esto
377
                        // ocurre es porque existe un error que hay que corregir ...
378
                }
379
        }
380
        //TODO Este metodo es antiguo y MUY INEFICIENTE
381
        //No obstante lo dejo porque hace referencia a SeqEnd y a un posible bug
382
        public void calculateGisModel(List dwgObjects) {
383
                int flags = getFlags();
384
//                En estas dos lineas de abajo y en el resto del metodo
385
//                se mantiene el mecanismo anterior al refactoring.
386
//                TODO: Pensar si deberiamos coger el handle completo.
387
//                Tal vez deberiamos tomar el handle completo y evaluar
388
//                a donde apuntan (pueden haber 2 handles con codigo y offset
389
//                distintos y que, sin embargo apunten al mismo objeto).
390
                int firstHandle = getFirstVertexHandle().getOffset();
391
                int lastHandle = getLastVertexHandle().getOffset();
392
                ArrayList pts = new ArrayList();
393
                ArrayList bulges = new ArrayList();
394
                double[] pt = new double[3];
395

    
396
                //TODO Esto cambiarlo. Es lento y poco elegante
397

    
398
                for (int j=0;j<dwgObjects.size();j++) {
399
                        DwgObject firstVertex = (DwgObject)dwgObjects.get(j);
400

    
401
                        if (firstVertex instanceof DwgVertex2D) {
402
                                int vertexHandle = firstVertex.getHandle().getOffset();
403
                                if (vertexHandle==firstHandle) {
404
                                        int k=0;
405
                                        while (true) {
406
                                                DwgObject vertex = (DwgObject)dwgObjects.get(j+k);
407
                                                int vHandle = vertex.getHandle().getOffset();
408
                                                if (vertex instanceof DwgVertex2D) {
409
                                                        pt = ((DwgVertex2D)vertex).getPoint();
410
                                                        pts.add(new Point2D.Double(pt[0], pt[1]));
411
                                                        double bulge = ((DwgVertex2D)vertex).getBulge();
412
                                                        bulges.add(new Double(bulge));
413
                                                        k++;
414
                                                        if (vHandle==lastHandle && vertex instanceof DwgVertex2D) {
415
                                                                break;
416
                                                        }
417
                                                } else if (vertex instanceof DwgSeqend) {
418
                            // 051116, jmorell: Polil�neas_ACAD2000.dwg tiene un DwgSeqend en mitad de
419
                            //una secuencia de v�rtices. Precauci�n con esto puesto que es posible que esta
420
                            // condici�n fuera requerida en la carga de otros DWGs.
421
                            //break;
422
                            k++;
423
                                                }
424
                                        }//while
425
                                }//if first handle
426
                        }//if
427
                }//for
428

    
429
                if (pts.size()>0) {
430
                        List newPts = new ArrayList();
431
                        if ((flags & 0x1)==0x1) {
432
                                for (int j=0;j<pts.size();j++) {
433
                                        newPts.add(pts.get(j));
434
                                }
435
                                newPts.add(pts.get(0));
436
                                bulges.add(new Double(0));
437
                        } else {
438
                                for (int j=0;j<pts.size();j++) {
439
                                        newPts.add(pts.get(j));
440
                                }
441
                        }
442
                        double[] bs = new double[bulges.size()];
443
                        for (int j=0;j<bulges.size();j++) {
444
                                bs[j] = ((Double)bulges.get(j)).doubleValue();
445
                        }
446
                        setBulges(bs);
447
                        List points = GisModelCurveCalculator.
448
                                        calculateGisModelBulge(newPts, bs);
449
                        setPts(points);
450
                } else {
451
//                        System.out.println("Encontrada polil�nea sin puntos ...");
452
                        // TODO: No se debe mandar nunca una polil�nea sin puntos, si esto
453
                        // ocurre es porque existe un error que hay que corregir ...
454
                }
455
        }
456
        /* (non-Javadoc)
457
         * @see com.iver.cit.jdwglib.dwg.IDwgExtrusionable#applyExtrussion()
458
         */
459
        public void applyExtrussion() {
460
                  if(getPts() == null) {
461
                        return;
462
                }
463
                  List vertices = getPts();
464
              double[] polyline2DExt = getExtrusion();
465
              double elev = getElevation();
466
              double[][] polylinePoints3D = new double[vertices.size()][3];
467
              for (int j = 0;j < vertices.size(); j++) {
468
                  polylinePoints3D[j][0] = ((double[])vertices.get(j))[0];
469
                  polylinePoints3D[j][1] = ((double[])vertices.get(j))[1];
470
                  polylinePoints3D[j][2] = elev;
471
                  polylinePoints3D[j] = AcadExtrusionCalculator.extrude2(polylinePoints3D[j], polyline2DExt);
472
              }
473
              setElevation(elev);
474
              for (int j=0;j<vertices.size();j++) {
475
                  vertices.add(new double[]{(polylinePoints3D[j])[0], (polylinePoints3D[j])[1]});
476
              }
477
              setPts(vertices);
478
        }
479
        /* (non-Javadoc)
480
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
481
         */
482
        public boolean has3DData() {
483
                return (getElevation() != 0.0);
484
        }
485
        /* (non-Javadoc)
486
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
487
         */
488
        public double getZ() {
489
                return getElevation();
490
        }
491
        /* (non-Javadoc)
492
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry(boolean)
493
         */
494
        public Geometry toFMapGeometry(boolean is3DFile) throws CreateGeometryException {
495
                return FMapUtil.ptsToMultiLine(getPts(), getGeometrySubType(is3DFile));
496
        }
497
        /* (non-Javadoc)
498
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString(boolean)
499
         */
500
        public String toFMapString(boolean is3DFile) {
501
                if(is3DFile) {
502
                        return "FPolyline3D";
503
                } else {
504
                        return "FPolyline2D";
505
                }
506
        }
507

    
508
        public String toString(){
509
                return "Polyline2D";
510
        }
511
        public void transform2Block(double[] bPoint, Point2D insPoint,
512
                        double[] scale, double rot,
513
                        List dwgObjectsWithoutBlocks,
514
                        Map handleObjWithoutBlocks, DwgFile callBack) {
515

    
516
                DwgPolyline2D transformedEntity = null;
517
                List vertices = this.getPts();
518

    
519
                if (vertices != null) {
520
                    List transformedVertices = new ArrayList();
521
                        for (int i=0;i < vertices.size();i++) {
522
                                double[] pointAux = null;
523
                            pointAux = new double[]{((double[]) vertices.get(i))[0] - bPoint[0],
524
                                            ((double[]) vertices.get(i))[1] - bPoint[1]};
525

    
526
                                double laX = insPoint.getX() + ((pointAux[0] * scale[0])*Math.cos(rot) + (pointAux[1]*scale[1])*(-1)*Math.sin(rot));
527
                                double laY = insPoint.getY() + ((pointAux[0]*scale[0])*Math.sin(rot) + (pointAux[1]*scale[1])*Math.cos(rot));
528
                                transformedVertices.add(new double[]{laX, laY});
529
                        }//for
530
                        transformedEntity = (DwgPolyline2D)this.clone();
531
                        transformedEntity.setPts(transformedVertices);
532
                        transformedEntity.setElevation((this.getElevation() * scale[2]));
533
                        dwgObjectsWithoutBlocks.add(transformedEntity);
534
                        handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity);
535
                }
536
        }
537
        /* (non-Javadoc)
538
         * @see java.lang.Object#clone()
539
         */
540
        public Object clone(){
541
                DwgPolyline2D obj = new DwgPolyline2D(index);
542
                this.fill(obj);
543
                return obj;
544
        }
545

    
546
        protected void fill(DwgObject obj){
547
                super.fill(obj);
548
                DwgPolyline2D myObj = (DwgPolyline2D)obj;
549

    
550
                myObj.setBulges(bulges);
551
                myObj.setCurveType(curveType);
552
                myObj.setElevation(elevation);
553
                myObj.setEndWidth(endWidth);
554
                myObj.setExtrusion(extrusion);
555
                myObj.setFirstVertexHandle(firstVertexHandle);
556
                myObj.setFlags(flags);
557
                myObj.setInitWidth(initWidth);
558
                myObj.setLastVertexHandle(lastVertexHandle);
559
                myObj.setPts(vertices);
560
                myObj.setSeqendHandle(seqendHandle);
561
                myObj.setThickness(thickness);
562

    
563
        }
564
        public void addVertex(IDwgVertex vertex) {
565
                vertices.add(vertex.getPoint());
566
        }
567

    
568
        public int getGeometrySubType(boolean is3DFile) {
569
                return Geometry.SUBTYPES.GEOM2D;
570
        }
571

    
572
        public int getGeometryType() {
573
                return Geometry.TYPES.MULTICURVE;
574
        }
575

    
576
}