Statistics
| Revision:

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

History | View | Annotate | Download (13.7 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
import org.apache.log4j.Logger;
42

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

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

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

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

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

    
81

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

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

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

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

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

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

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

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

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

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

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

    
275
        }
276

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

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

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

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

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

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

    
350
        }
351
        /* (non-Javadoc)
352
         * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
353
         */
354
        public double getZ() {
355
                List points3D = getPts();
356
                if (points3D != null) {
357
                        boolean constantElevation = true;
358
                        double[] firstPt = (double[]) points3D.get(0);
359
                        for (int j = 0; j < points3D.size(); j++) {
360
                                double[] pt = (double[]) points3D.get(j);
361
                                if (pt[2] != firstPt[2]) {
362
                                        constantElevation = false;
363
                                        break;
364
                                }
365
                        }
366
                        if (constantElevation)
367
                                return firstPt[2];
368
                }
369
                return 0d;
370
        }
371
        /* (non-Javadoc)
372
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry(boolean)
373
         */
374
        public IGeometry toFMapGeometry(boolean is3DFile) {
375
                FPolyline2D pline = null;
376
                List points3D = getPts();
377
                if (points3D != null && points3D.size() > 0) {
378
                        if (is3DFile) {
379
                                pline = FMapUtil.points3DToFPolyline3D(points3D);
380
                        } else {
381
                                List points2D = new ArrayList();
382
                                for (int j = 0; j < points3D.size(); j++) {
383
                                        double[] pt3d = (double[]) points3D.get(j);
384
                                        double[] pt  = new double[]{pt3d[0],
385
                                                        pt3d[1]};
386
                                        points2D.add(pt);
387
                                }
388
                                pline = FMapUtil.points2DToFPolyline2D(points2D);
389
                        }//if
390
                        return  ShapeFactory.createGeometry(pline);
391
                }//if
392
                return null;
393

    
394
        }
395
        /* (non-Javadoc)
396
         * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString(boolean)
397
         */
398
        public String toFMapString(boolean is3DFile) {
399
                if(is3DFile)
400
                        return "FPolyline3D";
401
                else
402
                        return "FPolyline2D";
403
        }
404

    
405
        public String toString(){
406
                return "Polyline3D";
407
        }
408
        /* (non-Javadoc)
409
         * @see java.lang.Object#clone()
410
         */
411
        public Object clone(){
412
                DwgPolyline3D obj = new DwgPolyline3D(index);
413
                this.fill(obj);
414
                return obj;
415
        }
416

    
417
        protected void fill(DwgObject obj){
418
                super.fill(obj);
419
                DwgPolyline3D myObj = (DwgPolyline3D)obj;
420

    
421
                myObj.setBulges(bulges);
422
                myObj.setClosedFlags(closedFlags);
423
                myObj.setFirstVertexHandle(firstVertexHandle);
424
                myObj.setLastVertexHandle(lastVertexHandle);
425
                myObj.setPts(vertices);
426
                myObj.setSeqendHandle(seqendHandle);
427
                myObj.setSplineFlags(splineFlags);
428
        }
429
        public void addVertex(IDwgVertex vertex) {
430
                vertices.add(vertex.getPoint());
431
        }
432

    
433
        //TODO Por qué Polyline3D no tenía implementado el transform2Block???
434
        public void transform2Block(double[] bPoint, Point2D insPoint,
435
                        double[] scale, double rot,
436
                        List dwgObjectsWithoutBlocks,
437
                        Map handleObjWithoutBlocks, DwgFile callBack) {
438

    
439
                DwgPolyline3D transformedEntity = null;
440
                List vertices = this.getPts();
441

    
442
                if (vertices != null) {
443
                    List transformedVertices = new ArrayList();
444
                        for (int i=0;i < vertices.size();i++) {
445
                                double[] pointAux = null;
446
                            pointAux = new double[]{((double[]) vertices.get(i))[0] - bPoint[0],
447
                                            ((double[]) vertices.get(i))[1] - bPoint[1]};
448

    
449
                                double laX = insPoint.getX() + ((pointAux[0] * scale[0])*Math.cos(rot) + (pointAux[1]*scale[1])*(-1)*Math.sin(rot));
450
                                double laY = insPoint.getY() + ((pointAux[0]*scale[0])*Math.sin(rot) + (pointAux[1]*scale[1])*Math.cos(rot));
451
                                double laZ = ((double[]) vertices.get(i))[2] - bPoint[2];
452
                                transformedVertices.add(new double[]{laX, laY, laZ});
453
                        }//for
454
                        transformedEntity = (DwgPolyline3D)this.clone();
455
                        transformedEntity.setPts(transformedVertices);
456
                        dwgObjectsWithoutBlocks.add(transformedEntity);
457
                        handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity);
458
                }
459
        }
460

    
461
        /**
462
         * @param Handles The vertexHandles to set.
463
         */
464
        public void setVertexHandles(ArrayList Handles){
465
                this.vertexHandles = Handles;
466
        }
467

    
468
        /**
469
         * @return Returns the vertexHandles.
470
         */
471
        public ArrayList getVertexHandles(){
472
                return this.vertexHandles;
473
        }
474
        /**
475
         * @param Handle The vertexHandles to add.
476
         */
477
        public void addVertexHandle(DwgHandleReference handle){
478
                this.vertexHandles.add(handle);
479
        }
480

    
481

    
482

    
483
}