root / trunk / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / objects / DwgPolyline3D.java @ 10820
History | View | Annotate | Download (11.9 KB)
1 | 2896 | jmorell | /* 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 | 10820 | azabala | import java.awt.geom.Point2D; |
38 | 7178 | azabala | import java.util.ArrayList; |
39 | 9825 | azabala | import java.util.List; |
40 | 10820 | azabala | import java.util.Map; |
41 | 2896 | jmorell | |
42 | 9825 | azabala | import com.iver.cit.gvsig.fmap.core.FPolyline2D; |
43 | 10820 | azabala | import com.iver.cit.gvsig.fmap.core.IGeometry; |
44 | import com.iver.cit.gvsig.fmap.core.ShapeFactory; |
||
45 | 9977 | azabala | import com.iver.cit.jdwglib.dwg.DwgFile; |
46 | 10012 | fdiaz | import com.iver.cit.jdwglib.dwg.DwgHandleReference; |
47 | 2896 | jmorell | import com.iver.cit.jdwglib.dwg.DwgObject; |
48 | 9825 | azabala | import com.iver.cit.jdwglib.dwg.IDwg2FMap; |
49 | import com.iver.cit.jdwglib.dwg.IDwg3DTestable; |
||
50 | 10820 | azabala | import com.iver.cit.jdwglib.dwg.IDwgBlockMember; |
51 | 9825 | azabala | import com.iver.cit.jdwglib.dwg.IDwgPolyline; |
52 | 10632 | azabala | import com.iver.cit.jdwglib.dwg.IDwgVertex; |
53 | 9825 | azabala | import com.iver.cit.jdwglib.util.FMapUtil; |
54 | 2896 | jmorell | |
55 | /**
|
||
56 | * The DwgPolyline3D class represents a DWG Polyline3D
|
||
57 | *
|
||
58 | * @author jmorell
|
||
59 | */
|
||
60 | 9825 | azabala | public class DwgPolyline3D extends DwgObject |
61 | 10820 | azabala | implements IDwgPolyline, IDwg3DTestable, IDwg2FMap, IDwgBlockMember{
|
62 | 10632 | azabala | |
63 | 2896 | jmorell | private int splineFlags; |
64 | private int closedFlags; |
||
65 | 10012 | fdiaz | private DwgHandleReference firstVertexHandle = null; |
66 | private DwgHandleReference lastVertexHandle = null; |
||
67 | private DwgHandleReference seqendHandle = null; |
||
68 | 10632 | azabala | private List vertices; |
69 | 2896 | jmorell | private double[] bulges; |
70 | |||
71 | 10632 | azabala | public DwgPolyline3D(int index) { |
72 | super(index);
|
||
73 | vertices = new ArrayList(); |
||
74 | } |
||
75 | 2896 | jmorell | /**
|
76 | * @return Returns the closedFlags.
|
||
77 | */
|
||
78 | public int getClosedFlags() { |
||
79 | return closedFlags;
|
||
80 | } |
||
81 | /**
|
||
82 | * @param closedFlags The closedFlags to set.
|
||
83 | */
|
||
84 | public void setClosedFlags(int closedFlags) { |
||
85 | this.closedFlags = closedFlags;
|
||
86 | } |
||
87 | /**
|
||
88 | * @return Returns the firstVertexHandle.
|
||
89 | */
|
||
90 | 10012 | fdiaz | public DwgHandleReference getFirstVertexHandle() {
|
91 | 2896 | jmorell | return firstVertexHandle;
|
92 | } |
||
93 | /**
|
||
94 | * @param firstVertexHandle The firstVertexHandle to set.
|
||
95 | */
|
||
96 | 10012 | fdiaz | public void setFirstVertexHandle(DwgHandleReference firstVertexHandle) { |
97 | 2896 | jmorell | this.firstVertexHandle = firstVertexHandle;
|
98 | } |
||
99 | /**
|
||
100 | * @return Returns the lastVertexHandle.
|
||
101 | */
|
||
102 | 10012 | fdiaz | public DwgHandleReference getLastVertexHandle() {
|
103 | 2896 | jmorell | return lastVertexHandle;
|
104 | } |
||
105 | /**
|
||
106 | * @param lastVertexHandle The lastVertexHandle to set.
|
||
107 | */
|
||
108 | 10012 | fdiaz | public void setLastVertexHandle(DwgHandleReference lastVertexHandle) { |
109 | 2896 | jmorell | this.lastVertexHandle = lastVertexHandle;
|
110 | } |
||
111 | /**
|
||
112 | * @return Returns the pts.
|
||
113 | */
|
||
114 | 10632 | azabala | public List getPts() { |
115 | return vertices;
|
||
116 | 2896 | jmorell | } |
117 | /**
|
||
118 | * @param pts The pts to set.
|
||
119 | */
|
||
120 | 10632 | azabala | public void setPts(List pts) { |
121 | this.vertices = pts;
|
||
122 | 2896 | jmorell | } |
123 | /**
|
||
124 | * @return Returns the bulges.
|
||
125 | */
|
||
126 | public double[] getBulges() { |
||
127 | return bulges;
|
||
128 | } |
||
129 | /**
|
||
130 | * @param bulges The bulges to set.
|
||
131 | */
|
||
132 | public void setBulges(double[] bulges) { |
||
133 | this.bulges = bulges;
|
||
134 | } |
||
135 | 10174 | fdiaz | |
136 | 2896 | jmorell | /**
|
137 | * @return Returns the seqendHandle.
|
||
138 | */
|
||
139 | 10012 | fdiaz | public DwgHandleReference getSeqendHandle() {
|
140 | 2896 | jmorell | return seqendHandle;
|
141 | } |
||
142 | /**
|
||
143 | * @param seqendHandle The seqendHandle to set.
|
||
144 | */
|
||
145 | 10012 | fdiaz | public void setSeqendHandle(DwgHandleReference seqendHandle) { |
146 | 2896 | jmorell | this.seqendHandle = seqendHandle;
|
147 | } |
||
148 | /**
|
||
149 | * @return Returns the splineFlags.
|
||
150 | */
|
||
151 | public int getSplineFlags() { |
||
152 | return splineFlags;
|
||
153 | } |
||
154 | /**
|
||
155 | * @param splineFlags The splineFlags to set.
|
||
156 | */
|
||
157 | public void setSplineFlags(int splineFlags) { |
||
158 | this.splineFlags = splineFlags;
|
||
159 | } |
||
160 | 9977 | azabala | |
161 | public void calculateGisModel(DwgFile dwgFile){ |
||
162 | |||
163 | int closedFlags = getClosedFlags();
|
||
164 | 10012 | fdiaz | DwgHandleReference firstHandle = getFirstVertexHandle(); |
165 | DwgHandleReference lastHandle = getLastVertexHandle(); |
||
166 | 9977 | azabala | ArrayList pts = new ArrayList(); |
167 | double[] pt = new double[3]; |
||
168 | double bulge = 0d; |
||
169 | |||
170 | 10012 | fdiaz | DwgObject first = dwgFile.getDwgObjectFromHandle(firstHandle.getOffset()); |
171 | DwgObject last = dwgFile.getDwgObjectFromHandle(lastHandle.getOffset()); |
||
172 | 9977 | azabala | if(first == null || last == null){ |
173 | System.out.println("Polyline3D con vertices inicial o final a null"); |
||
174 | return;
|
||
175 | } |
||
176 | |||
177 | if(!(first instanceof DwgVertex3D)){ |
||
178 | System.out.println("El primer vertice de Polyline3D es "+ |
||
179 | first.getClass().getName()); |
||
180 | return;
|
||
181 | } |
||
182 | |||
183 | if(!(last instanceof DwgVertex3D)){ |
||
184 | System.out.println("El primer vertice de Polyline3D es "+ |
||
185 | first.getClass().getName()); |
||
186 | return;
|
||
187 | } |
||
188 | |||
189 | int firstObjIdx = dwgFile.getIndexOf(first);
|
||
190 | int lastObjIdx = dwgFile.getIndexOf(last);
|
||
191 | if(firstObjIdx == -1 || lastObjIdx == -1){ |
||
192 | System.out.println("Calculate GIS Model: Problemas en la LinkedList: 1?="+firstObjIdx+",Ultimo="+lastObjIdx); |
||
193 | return;
|
||
194 | } |
||
195 | |||
196 | |||
197 | // pt = ((DwgVertex2D)first).getPoint();
|
||
198 | // pts.add(new Point2D.Double(pt[0], pt[1]));
|
||
199 | // double bulge = ((DwgVertex2D)first).getBulge();
|
||
200 | // bulges.add(new Double(bulge));
|
||
201 | |||
202 | for(int i = firstObjIdx; i <= lastObjIdx; i++){ |
||
203 | DwgObject obj = dwgFile.getDwgObject(i); |
||
204 | if(obj instanceof DwgVertex3D){ |
||
205 | DwgVertex3D vertex = (DwgVertex3D) obj; |
||
206 | pt = ((DwgVertex3D)vertex).getPoint(); |
||
207 | pts.add(new double[]{pt[0], pt[1], pt[2]}); |
||
208 | }else if(obj instanceof DwgSeqend){ |
||
209 | //TODO En Polyline2D J.Morell no interrumpia el barrido,
|
||
210 | //pero aqu? S?. REVISAR
|
||
211 | break;
|
||
212 | }else{
|
||
213 | System.out.println("Encontrado "+obj.getClass().getName()+" en la lista de vertices de Polyline3D"); |
||
214 | } |
||
215 | }//for
|
||
216 | |||
217 | if (pts.size()>0) { |
||
218 | 10632 | azabala | List newPts = new ArrayList(); |
219 | for (int j=0;j<pts.size();j++) { |
||
220 | newPts.add(pts.get(j)); |
||
221 | } |
||
222 | 9977 | azabala | if ((closedFlags & 0x1)== 0x1) { |
223 | 10632 | azabala | |
224 | newPts.add(pts.get(0));
|
||
225 | } |
||
226 | 9977 | azabala | setPts(newPts); |
227 | } else {
|
||
228 | System.out.println("Encontrada polil?nea sin puntos ..."); |
||
229 | // TODO: No se debe mandar nunca una polil?nea sin puntos, si esto
|
||
230 | // ocurre es porque existe un error que hay que corregir ...
|
||
231 | } |
||
232 | |||
233 | } |
||
234 | |||
235 | //TODO Metodo antiguo y muy ineficiente. Se deja hasta que se
|
||
236 | 10012 | fdiaz | //revise que funciona el nuevo perfectamente
|
237 | 9825 | azabala | public void calculateGisModel(List dwgObjects) { |
238 | int closedFlags = getClosedFlags();
|
||
239 | 10012 | fdiaz | |
240 | // En estas dos lineas de abajo y en el resto del metodo
|
||
241 | // se mantiene el mecanismo anterior al refactoring.
|
||
242 | // TODO: Pensar si deberiamos coger el handle completo.
|
||
243 | // Tal vez deberiamos tomar el handle completo y evaluar
|
||
244 | // a donde apuntan (pueden haber 2 handles con codigo y offset
|
||
245 | // distintos y que, sin embargo apunten al mismo objeto).
|
||
246 | |||
247 | int firstHandle = getFirstVertexHandle().getOffset();
|
||
248 | int lastHandle = getLastVertexHandle().getOffset();
|
||
249 | 9825 | azabala | ArrayList pts = new ArrayList(); |
250 | double[] pt = new double[3]; |
||
251 | |||
252 | //TODO Sustituir esto por un hashtable handle->DwgObject
|
||
253 | for (int j=0;j< dwgObjects.size();j++) { |
||
254 | DwgObject firstVertex = (DwgObject)dwgObjects.get(j); |
||
255 | if (firstVertex instanceof DwgVertex3D) { |
||
256 | 10012 | fdiaz | int vertexHandle = firstVertex.getHandle().getOffset();
|
257 | 9825 | azabala | if (vertexHandle==firstHandle) {
|
258 | int k=0; |
||
259 | while (true) { |
||
260 | DwgObject vertex = (DwgObject)dwgObjects.get(j+k); |
||
261 | 10012 | fdiaz | int vHandle = vertex.getHandle().getOffset();
|
262 | 9825 | azabala | if (vertex instanceof DwgVertex3D) { |
263 | pt = ((DwgVertex3D)vertex).getPoint(); |
||
264 | pts.add(new double[]{pt[0], pt[1], pt[2]}); |
||
265 | k++; |
||
266 | if (vHandle==lastHandle && vertex instanceof DwgVertex3D) { |
||
267 | break;
|
||
268 | } |
||
269 | } else if (vertex instanceof DwgSeqend) { |
||
270 | break;
|
||
271 | }//if
|
||
272 | }//while
|
||
273 | }//if
|
||
274 | }//if
|
||
275 | }//for
|
||
276 | |||
277 | if (pts.size()>0) { |
||
278 | 10632 | azabala | List newPts = new ArrayList(); |
279 | for (int j=0;j<pts.size();j++) { |
||
280 | newPts.add(pts.get(j)); |
||
281 | } |
||
282 | 9825 | azabala | if ((closedFlags & 0x1)==0x1) { |
283 | 10632 | azabala | newPts.add(pts.get(0));
|
284 | } |
||
285 | 9825 | azabala | setPts(newPts); |
286 | } else {
|
||
287 | // System.out.println("Encontrada polil?nea sin puntos ...");
|
||
288 | // TODO: No se debe mandar nunca una polil?nea sin puntos, si esto
|
||
289 | // ocurre es porque existe un error que hay que corregir ...
|
||
290 | } |
||
291 | } |
||
292 | /* (non-Javadoc)
|
||
293 | * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
|
||
294 | */
|
||
295 | public boolean has3DData() { |
||
296 | |||
297 | 10632 | azabala | List pts = getPts();
|
298 | 9825 | azabala | if(pts == null) |
299 | return false; |
||
300 | double z = 0d; |
||
301 | 10632 | azabala | for (int j = 0; j<pts.size(); j++) { |
302 | z = ((double[])pts.get(j))[2]; |
||
303 | 9825 | azabala | if (z != 0.0) |
304 | return true; |
||
305 | } |
||
306 | return false; |
||
307 | |||
308 | } |
||
309 | /* (non-Javadoc)
|
||
310 | * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
|
||
311 | */
|
||
312 | public double getZ() { |
||
313 | 10632 | azabala | List points3D = getPts();
|
314 | 9825 | azabala | if (points3D != null) { |
315 | boolean constantElevation = true; |
||
316 | 10632 | azabala | double[] firstPt = (double[]) points3D.get(0); |
317 | for (int j = 0; j < points3D.size(); j++) { |
||
318 | double[] pt = (double[]) points3D.get(j); |
||
319 | if (pt[2] != firstPt[2]) { |
||
320 | 9825 | azabala | constantElevation = false;
|
321 | break;
|
||
322 | } |
||
323 | } |
||
324 | if (constantElevation)
|
||
325 | 10632 | azabala | return firstPt[2]; |
326 | 9825 | azabala | } |
327 | return 0d; |
||
328 | } |
||
329 | /* (non-Javadoc)
|
||
330 | * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry(boolean)
|
||
331 | */
|
||
332 | 10820 | azabala | public IGeometry toFMapGeometry(boolean is3DFile) { |
333 | 9825 | azabala | FPolyline2D pline = null;
|
334 | 10632 | azabala | List points3D = getPts();
|
335 | 9825 | azabala | if (points3D != null) { |
336 | if (is3DFile) {
|
||
337 | pline = FMapUtil.points3DToFPolyline3D(points3D); |
||
338 | } else {
|
||
339 | 10632 | azabala | List points2D = new ArrayList(); |
340 | for (int j = 0; j < points3D.size(); j++) { |
||
341 | double[] pt3d = (double[]) points3D.get(j); |
||
342 | double[] pt = new double[]{pt3d[0], |
||
343 | pt3d[1]};
|
||
344 | points2D.add(pt); |
||
345 | 9825 | azabala | } |
346 | pline = FMapUtil.points2DToFPolyline2D(points2D); |
||
347 | }//if
|
||
348 | }//if
|
||
349 | 10820 | azabala | return ShapeFactory.createGeometry(pline);
|
350 | 9825 | azabala | } |
351 | /* (non-Javadoc)
|
||
352 | * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString(boolean)
|
||
353 | */
|
||
354 | public String toFMapString(boolean is3DFile) { |
||
355 | if(is3DFile)
|
||
356 | return "FPolyline3D"; |
||
357 | else
|
||
358 | return "FPolyline2D"; |
||
359 | } |
||
360 | |||
361 | public String toString(){ |
||
362 | return "Polyline3D"; |
||
363 | } |
||
364 | 10174 | fdiaz | /* (non-Javadoc)
|
365 | * @see java.lang.Object#clone()
|
||
366 | */
|
||
367 | public Object clone(){ |
||
368 | DwgPolyline3D obj = new DwgPolyline3D(index);
|
||
369 | this.fill(obj);
|
||
370 | return obj;
|
||
371 | } |
||
372 | |||
373 | protected void fill(DwgObject obj){ |
||
374 | super.fill(obj);
|
||
375 | DwgPolyline3D myObj = (DwgPolyline3D)obj; |
||
376 | |||
377 | myObj.setBulges(bulges); |
||
378 | myObj.setClosedFlags(closedFlags); |
||
379 | myObj.setFirstVertexHandle(firstVertexHandle); |
||
380 | myObj.setLastVertexHandle(lastVertexHandle); |
||
381 | 10632 | azabala | myObj.setPts(vertices); |
382 | 10174 | fdiaz | myObj.setSeqendHandle(seqendHandle); |
383 | myObj.setSplineFlags(splineFlags); |
||
384 | } |
||
385 | 10632 | azabala | public void addVertex(IDwgVertex vertex) { |
386 | vertices.add(vertex.getPoint()); |
||
387 | } |
||
388 | 10820 | azabala | |
389 | //TODO Por qu? Polyline3D no ten?a implementado el transform2Block???
|
||
390 | public void transform2Block(double[] bPoint, Point2D insPoint, |
||
391 | double[] scale, double rot, |
||
392 | List dwgObjectsWithoutBlocks,
|
||
393 | Map handleObjWithoutBlocks, DwgFile callBack) {
|
||
394 | |||
395 | DwgPolyline3D transformedEntity = null;
|
||
396 | List vertices = this.getPts(); |
||
397 | |||
398 | if (vertices != null) { |
||
399 | List transformedVertices = new ArrayList(); |
||
400 | for (int i=0;i < vertices.size();i++) { |
||
401 | double[] pointAux = null; |
||
402 | pointAux = new double[]{((double[]) vertices.get(i))[0] - bPoint[0], |
||
403 | ((double[]) vertices.get(i))[1] - bPoint[1]}; |
||
404 | |||
405 | double laX = insPoint.getX() + ((pointAux[0] * scale[0])*Math.cos(rot) + (pointAux[1]*scale[1])*(-1)*Math.sin(rot)); |
||
406 | double laY = insPoint.getY() + ((pointAux[0]*scale[0])*Math.sin(rot) + (pointAux[1]*scale[1])*Math.cos(rot)); |
||
407 | double laZ = ((double[]) vertices.get(i))[2] - bPoint[2]; |
||
408 | transformedVertices.add(new double[]{laX, laY, laZ}); |
||
409 | }//for
|
||
410 | transformedEntity = (DwgPolyline3D)this.clone();
|
||
411 | transformedEntity.setPts(transformedVertices); |
||
412 | dwgObjectsWithoutBlocks.add(transformedEntity); |
||
413 | handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity); |
||
414 | } |
||
415 | } |
||
416 | 10174 | fdiaz | |
417 | 2896 | jmorell | } |