svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libDwg / src / org / gvsig / dwg / lib / util / AcadExtrusionCalculator.java @ 29001
History | View | Annotate | Download (5.54 KB)
1 | 9720 | azabala | /* 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 | 28969 | jmvivo | package org.gvsig.dwg.lib.util; |
36 | 9720 | azabala | |
37 | import java.lang.Math; |
||
38 | |||
39 | /**
|
||
40 | * This class allows to apply the extrusion transformation of Autocad given by an array
|
||
41 | 10357 | azabala | * of doubles to a point given by an array of doubles too.
|
42 | 9720 | azabala | *
|
43 | 10357 | azabala | * @author azabala
|
44 | 9720 | azabala | */
|
45 | 10357 | azabala | /*
|
46 | * The maths behind all this stuff, and the reasons to do this could be complex.
|
||
47 | *
|
||
48 | * Some links:
|
||
49 | * http://www.autodesk.com/techpubs/autocad/acadr14/dxf/object_coordinate_systems_40ocs41_al_u05_c.htm
|
||
50 | * http://www.autodesk.com/techpubs/autocad/acadr14/dxf/arbitrary_axis_algorithm_al_u05_c.htm
|
||
51 | * http://personales.unican.es/togoresr/Sco-en.html
|
||
52 | *
|
||
53 | * In ACAD, 3D entities has their coordinates in World Coordinate System (WCS: utm, etc.)
|
||
54 | * but 2D entities has their coordinates in an Object Coordinate System (OCS).
|
||
55 | *
|
||
56 | * To work with the coordinates saved in the file, we must to transform them (extrude) from OCS
|
||
57 | * to WCS
|
||
58 | *
|
||
59 | |||
60 | * */
|
||
61 | 9720 | azabala | public class AcadExtrusionCalculator { |
62 | |||
63 | 10357 | azabala | public static Matrix4D computeTransform(double[] extrusion, double[] coord) |
64 | 10345 | azabala | { |
65 | |||
66 | 10514 | azabala | Vector3D Ax = null;
|
67 | 10345 | azabala | if(extrusion[0] == 0d && extrusion[1] == 0d && extrusion[2] > 0d && coord[2] == 0d) |
68 | return null; |
||
69 | if((extrusion[0] >= 0f ? extrusion[0]:-extrusion[0]) < 0.015625F |
||
70 | && |
||
71 | 10357 | azabala | (extrusion[1] >= 0f ? extrusion[1]:-extrusion[1]) < 0.015625F){ |
72 | 10345 | azabala | |
73 | 10514 | azabala | Ax = new Vector3D(extrusion[2], 0f, -extrusion[0]); |
74 | 10345 | azabala | }else{
|
75 | 10514 | azabala | Ax = new Vector3D(-extrusion[1],extrusion[0], 0f); |
76 | 10345 | azabala | } |
77 | 10514 | azabala | double len = Ax.length();
|
78 | Ax.scale(1d / len);
|
||
79 | 10345 | azabala | Vector3D upward = new Vector3D(extrusion[0], extrusion[1], extrusion[2]); |
80 | 10514 | azabala | Vector3D Ay = upward.cross(Ax); |
81 | |||
82 | Matrix4D aaa = new Matrix4D(Ax.x, Ay.x, upward.x, coord[2] * upward.x, |
||
83 | Ax.y, Ay.y, upward.y, coord[2] * upward.y,
|
||
84 | Ax.z, Ay.z, upward.z, coord[2] * upward.z,
|
||
85 | 0.0F, 0.0F, 0.0F, 1.0F); |
||
86 | |||
87 | //Creo que la transformacion comentada es para pasar de WCS a OCS, y no al reves
|
||
88 | 10345 | azabala | |
89 | 10514 | azabala | /*
|
90 | Matrix4D aaa = new Matrix4D(Ax.x, Ax.y, Ax.z, 0f,
|
||
91 | Ay.x, Ay.y, Ay.z, 0f,
|
||
92 | upward.x, upward.y, upward.z, 0f,
|
||
93 | coord[2] * upward.x, coord[2] * upward.y, coord[2] * upward.z, 1f);
|
||
94 | |||
95 | */
|
||
96 | 10345 | azabala | return aaa;
|
97 | } |
||
98 | |||
99 | 10357 | azabala | public static double[] extrude2(double[] coord_in, double[] xtru){ |
100 | |||
101 | //antes de cambiar el plano, aplicamos una extrusion con valor
|
||
102 | //la altura del punto
|
||
103 | 10514 | azabala | // coord_in[0] += (xtru[0] * coord_in[2]);
|
104 | // coord_in[1] += (xtru[1] * coord_in[2]);
|
||
105 | // coord_in[2] += (xtru[2] * coord_in[2]);
|
||
106 | 10357 | azabala | |
107 | |||
108 | |||
109 | Matrix4D transform = computeTransform(xtru, coord_in); |
||
110 | if(transform == null)//xtru es el eje Z |
||
111 | return coord_in;
|
||
112 | Point3D p = new Point3D(coord_in[0], coord_in[1], coord_in[2]); |
||
113 | transform.transform(p); |
||
114 | return new double[]{p.x, p.y, p.z}; |
||
115 | |||
116 | } |
||
117 | |||
118 | |||
119 | |||
120 | 10345 | azabala | /*
|
121 | |||
122 | llamamos a finalConv, y este llama a extrude internamente
|
||
123 | |||
124 | static DrawAble finalConv(DrawAble dl, DxfEntity entity, boolean doTransform)
|
||
125 | {
|
||
126 | if(dl == null)
|
||
127 | return null;
|
||
128 | DrawAble dr;
|
||
129 | if(doTransform)
|
||
130 | {
|
||
131 | if(entity.getExtrusion() != 0.0F)
|
||
132 | dr = dl.extrude(entity.getExtrusion());
|
||
133 | else
|
||
134 | dr = dl;
|
||
135 | Matrix4D mat = entity.calcArbitMat();
|
||
136 | if(mat != null)
|
||
137 | dr.transformBy(mat);
|
||
138 | } else
|
||
139 | if(entity.getExtrusion() != 0.0F)
|
||
140 | dr = dl.extrude(entity.getExtrusion(), entity.getUpwardVector());
|
||
141 | else
|
||
142 | dr = dl;
|
||
143 | return dr;
|
||
144 | }
|
||
145 | |||
146 | public DrawAble extrude(float dist, Vector3D up)
|
||
147 | {
|
||
148 | if(dist == 0.0F)
|
||
149 | return this;
|
||
150 | Vector3D ex = new Vector3D(dist * up.x, dist * up.y, dist * up.z);
|
||
151 | DrawSet set = new DrawSet(2 + nrPoints);
|
||
152 | DrawLines second = new DrawLines(nrPoints);
|
||
153 | set.setLayer(super.layer);
|
||
154 | set.setColor(super.color);
|
||
155 | second.setLayer(super.layer);
|
||
156 | second.setColor(super.color);
|
||
157 | set.addDrawable(this);
|
||
158 | for(int i = 0; i < nrPoints; i++)
|
||
159 | {
|
||
160 | second.addPoint(line[i].x + ex.x, line[i].y + ex.y, line[i].z + ex.z);
|
||
161 | DrawLines conn = new DrawLines(2);
|
||
162 | conn.setLayer(super.layer);
|
||
163 | conn.setColor(super.color);
|
||
164 | conn.addPoint(line[i]);
|
||
165 | conn.addPoint(second.line[i]);
|
||
166 | set.addDrawable(conn);
|
||
167 | }
|
||
168 | |||
169 | if(isClosed)
|
||
170 | second.close();
|
||
171 | set.addDrawable(second);
|
||
172 | return set;
|
||
173 | }
|
||
174 | |||
175 | |||
176 | |||
177 | */
|
||
178 | 9720 | azabala | } |