Revision 10319

View differences:

trunk/libraries/libDwg/src-test/com/iver/cit/jdwglib/dwg/DwgFileTest.java
14 14

  
15 15
import com.iver.cit.jdwglib.dwg.readers.DwgFileV15Reader;
16 16
import com.iver.cit.jdwglib.dwg.readers.IDwgFileReader;
17
import com.iver.cit.jdwglib.util.AcadExtrusionCalculator;
17 18

  
18 19
import junit.framework.TestCase;
19 20

  
......
36 37
		super.tearDown();
37 38
	}
38 39
	public void test1() throws IOException, DwgVersionNotSupportedException {
39
		String fileName = baseDataPath.getAbsolutePath()+"/Un punto.dwg";
40
		DwgFile dwg = new DwgFile(fileName);
41

  
42
		dwg.read();
43
		dwg.calculateGisModelDwgPolylines();
44
		dwg.blockManagement();
45
		LinkedList dwgObjects = dwg.getDwgObjects();
40
//		String fileName = baseDataPath.getAbsolutePath()+"/Un punto.dwg";
41
//		DwgFile dwg = new DwgFile(fileName);
42
//
43
//		dwg.read();
44
//		dwg.calculateGisModelDwgPolylines();
45
//		dwg.blockManagement();
46
//		LinkedList dwgObjects = dwg.getDwgObjects();
46 47
	}
47 48
	
48 49
	public void test2() throws RuntimeException, CorruptedDwgEntityException{
......
61 62
                            9,130,151,21,242,151,21,190,
62 63
                            8,21,8,56};
63 64
         */
64
		int[] data = new int[]{62,128,64,71,99,
65
							   40,48,0,5,8,27,72,
66
							   100,126,23,169,68,
67
							   178,105,50,13,114,
68
							   63,11,82,165,162,130,
69
							   13,114,63,11,210,138,
70
							   105,50,8,173,114,59,
71
							   138,205,162,130,15,98,
72
							   141,192,241,58,105,50,
73
							   11,51,51,52,178,229,162,
74
							   130,14,110,102,98,97,234,
75
							   105,50,11,51,51,52,179,21,
76
							   162,130,10,149,192,240,42,
77
							   162,105,50,14,189,27,131,
78
							   107,69,162,130,14,31,169,
79
							   66,227,74,105,50,9,240,86,
80
							   185,27,117,162,130,11,59,
81
							   51,51,52,234,105,50,13,114,
82
							   63,11,83,85,162,130,9,74,228,
83
							   126,22,186,105,50,11,51,51,50,
84
							   51,53,162,130,11,137,232,82,190,
85
							   58,105,50,9,74,228,122,147,13,162,
86
							   130,11,137,232,82,189,106,105,50,9,
87
							   74,228,122,146,213,162,130,9,74,228,122,20,202,105,50,12,126,23,171,194,173,162,130,12,126,23,169,68,178,105,50,13,114,63,11,82,165,162,130,9,130,151,22,10,136,182,8,21,8,120};
88
        //1er intento: suponemos que la LWPOLYLINE cumple la especificaci?n
89
        //a rajatabla
90
        int bitPos = 0;
91
        List val = DwgUtil.getBitShort(data, bitPos);
92
        bitPos = ((Integer) val.get(0)).intValue();
93
        int type = ((Integer) val.get(1)).intValue();
94
        System.out.println("type = " + type);
95
       
96
        DwgHandleReference hr = new DwgHandleReference();
97
        bitPos = hr.read(data, bitPos);
98
        System.out.println("handle, code="+
99
                    hr.getCode()+
100
                    " ,offset="+
101
                    hr.getOffset());
102
       
103
        //Ahora pasamos a la extended data
104
        val = DwgUtil.getBitShort(data, bitPos);
105
        bitPos = ((Integer) val.get(0)).intValue();
106
        int extendedDataSize = ((Integer) val.get(1)).intValue();
107
        System.out.println("EED size="+extendedDataSize);
108
        //como el size es 0, me lo salto
109
       
110
        //ver si tiene datos graficos
111
        val = DwgUtil.testBit(data, bitPos);
112
        bitPos = ((Integer) val.get(0)).intValue();
113
        boolean hasGraphicsData = ((Boolean) val.get(1))
114
                .booleanValue();
115
        System.out.println("graphics = "+hasGraphicsData);
116
       
117
        //como se que no hay graphics me lo salto
118
        //tama?o en bits
119
        val = DwgUtil.getRawLong(data, bitPos);
120
        bitPos = ((Integer) val.get(0)).intValue();
121
        int sizeInBits = ((Integer) val.get(1)).intValue();
122
        System.out.println("sizeInBits = "+sizeInBits);
123
        
124
        /*
125
         * Ahora, lo que viene es lo que en la spec se dice
126
         * "Common entity data". Revisar bien pues PythonCAD no lo lee
127
         * como en la spec.
128
         * 
129
         * pag 42.
130
          R13-R14 Only:
131
          	RL	:	Size of object data in bits
132
          	6B	:	Flags (FEDCBA)
133
          	6B	:	Common parameters (CCSSII)
134
          	Segun esto, deberia leer 6 bits y 6 bits
135
          	
136
          	FLAGS
137
	      	Mas adelante (pag 43), dice:
138
	      	DC	:	This is the number of reactors attached to an 
139
	      	entity as a bitshort. 
140
	      	This feature may have been dormant in R13, 
141
	      	but it appears in R14, and in files saved as R13 by R14.
142
	      	
143
	      	Ahora bien, pythoncad las est? leyendo como bitLong
144
          	?En que quedamos, son 2 bits, 1 bitLong o 1 bitShort?
145
          	TODO REVISAR
146
          	
147
          	COMMON PARAMETERS
148
          	Al principio, dice que son 6 bits (CC, SS, II)
149
          	pero luego dice (pag 43):
150
          	CC	:	Color bitshort
151
          	SS	:	Linetype scale bitdouble
152
          	II	:	"Invisible" flag bitshort
153

  
154
			Pythoncad, en vez de como 2 bits, los est? leyendo
155
			como BitShort, BitDouble y BitShort
156
          	
157
         * */
158
        
159
        Integer mode = (Integer) DwgUtil.getBits(data, 2, bitPos);
160
		bitPos += 2;
161
		System.out.println("mode = "+mode);
65
//		int[] data = new int[]{62,128,64,71,99,
66
//							   40,48,0,5,8,27,72,
67
//							   100,126,23,169,68,
68
//							   178,105,50,13,114,
69
//							   63,11,82,165,162,130,
70
//							   13,114,63,11,210,138,
71
//							   105,50,8,173,114,59,
72
//							   138,205,162,130,15,98,
73
//							   141,192,241,58,105,50,
74
//							   11,51,51,52,178,229,162,
75
//							   130,14,110,102,98,97,234,
76
//							   105,50,11,51,51,52,179,21,
77
//							   162,130,10,149,192,240,42,
78
//							   162,105,50,14,189,27,131,
79
//							   107,69,162,130,14,31,169,
80
//							   66,227,74,105,50,9,240,86,
81
//							   185,27,117,162,130,11,59,
82
//							   51,51,52,234,105,50,13,114,
83
//							   63,11,83,85,162,130,9,74,228,
84
//							   126,22,186,105,50,11,51,51,50,
85
//							   51,53,162,130,11,137,232,82,190,
86
//							   58,105,50,9,74,228,122,147,13,162,
87
//							   130,11,137,232,82,189,106,105,50,9,
88
//							   74,228,122,146,213,162,130,9,74,228,122,20,202,105,50,12,126,23,171,194,173,162,130,12,126,23,169,68,178,105,50,13,114,63,11,82,165,162,130,9,130,151,22,10,136,182,8,21,8,120};
89
//        //1er intento: suponemos que la LWPOLYLINE cumple la especificaci?n
90
//        //a rajatabla
91
//        int bitPos = 0;
92
//        List val = DwgUtil.getBitShort(data, bitPos);
93
//        bitPos = ((Integer) val.get(0)).intValue();
94
//        int type = ((Integer) val.get(1)).intValue();
95
//        System.out.println("type = " + type);
96
//       
97
//        DwgHandleReference hr = new DwgHandleReference();
98
//        bitPos = hr.read(data, bitPos);
99
//        System.out.println("handle, code="+
100
//                    hr.getCode()+
101
//                    " ,offset="+
102
//                    hr.getOffset());
103
//       
104
//        //Ahora pasamos a la extended data
105
//        val = DwgUtil.getBitShort(data, bitPos);
106
//        bitPos = ((Integer) val.get(0)).intValue();
107
//        int extendedDataSize = ((Integer) val.get(1)).intValue();
108
//        System.out.println("EED size="+extendedDataSize);
109
//        //como el size es 0, me lo salto
110
//       
111
//        //ver si tiene datos graficos
112
//        val = DwgUtil.testBit(data, bitPos);
113
//        bitPos = ((Integer) val.get(0)).intValue();
114
//        boolean hasGraphicsData = ((Boolean) val.get(1))
115
//                .booleanValue();
116
//        System.out.println("graphics = "+hasGraphicsData);
117
//       
118
//        //como se que no hay graphics me lo salto
119
//        //tama?o en bits
120
//        val = DwgUtil.getRawLong(data, bitPos);
121
//        bitPos = ((Integer) val.get(0)).intValue();
122
//        int sizeInBits = ((Integer) val.get(1)).intValue();
123
//        System.out.println("sizeInBits = "+sizeInBits);
124
//        
125
//        /*
126
//         * Ahora, lo que viene es lo que en la spec se dice
127
//         * "Common entity data". Revisar bien pues PythonCAD no lo lee
128
//         * como en la spec.
129
//         * 
130
//         * pag 42.
131
//          R13-R14 Only:
132
//          	RL	:	Size of object data in bits
133
//          	6B	:	Flags (FEDCBA)
134
//          	6B	:	Common parameters (CCSSII)
135
//          	Segun esto, deberia leer 6 bits y 6 bits
136
//          	
137
//          	FLAGS
138
//	      	Mas adelante (pag 43), dice:
139
//	      	DC	:	This is the number of reactors attached to an 
140
//	      	entity as a bitshort. 
141
//	      	This feature may have been dormant in R13, 
142
//	      	but it appears in R14, and in files saved as R13 by R14.
143
//	      	
144
//	      	Ahora bien, pythoncad las est? leyendo como bitLong
145
//          	?En que quedamos, son 2 bits, 1 bitLong o 1 bitShort?
146
//          	TODO REVISAR
147
//          	
148
//          	COMMON PARAMETERS
149
//          	Al principio, dice que son 6 bits (CC, SS, II)
150
//          	pero luego dice (pag 43):
151
//          	CC	:	Color bitshort
152
//          	SS	:	Linetype scale bitdouble
153
//          	II	:	"Invisible" flag bitshort
154
//
155
//			Pythoncad, en vez de como 2 bits, los est? leyendo
156
//			como BitShort, BitDouble y BitShort
157
//          	
158
//         * */
159
//        
160
//        Integer mode = (Integer) DwgUtil.getBits(data, 2, bitPos);
161
//		bitPos += 2;
162
//		System.out.println("mode = "+mode);
163
//		
164
//	/*
165
//		val = DwgUtil.getBitLong(data, bitPos);
166
//		bitPos = ((Integer) val.get(0)).intValue();
167
//		int rnum = ((Integer) val.get(1)).intValue();
168
//		System.out.println("numReactors = "+rnum);
169
//*/
170
//		val = DwgUtil.getBitShort(data, bitPos);
171
//		bitPos = ((Integer) val.get(0)).intValue();
172
//		int rnum = ((Integer) val.get(1)).intValue();
173
//		System.out.println("numReactors = "+rnum);
174
//		
175
//		
176
//		val = DwgUtil.testBit(data, bitPos);
177
//		bitPos = ((Integer) val.get(0)).intValue();
178
//		boolean isLyrByLineType = ((Boolean) val.get(1)).booleanValue();
179
//		System.out.println("isLyrByLineType="+isLyrByLineType);
180
//		
181
//		val = DwgUtil.testBit(data, bitPos);
182
//		bitPos = ((Integer) val.get(0)).intValue();
183
//		boolean noLinks = ((Boolean) val.get(1)).booleanValue();
184
//		System.out.println("noLinks="+noLinks);
185
//
186
//		
187
//		val = DwgUtil.getBitShort(data, bitPos);
188
//		bitPos = ((Integer) val.get(0)).intValue();
189
//		int color = ((Integer) val.get(1)).intValue();
190
//		System.out.println("color="+color);
191
//		
192
//		
193
//		val = DwgUtil.getBitDouble(data, bitPos);
194
//		bitPos = ((Integer) val.get(0)).intValue();
195
//		float ltscale = ((Double) val.get(1)).floatValue();
196
//		System.out.println("ltscale="+ltscale);
197
//		
198
//		val = DwgUtil.getBitShort(data, bitPos);
199
//		bitPos = ((Integer) val.get(0)).intValue();
200
//		int invis = ((Integer) val.get(1)).intValue();
201
//		System.out.println("invis="+invis);
202
//		
203
//		val = DwgUtil.getBitShort(data, bitPos);
204
//		bitPos = ((Integer) val.get(0)).intValue();
205
//		int flag = ((Integer) val.get(1)).intValue();
206
//		System.out.println("flag="+flag);
207
//		
208
//		double dVal = 0d;
209
//		if((flag & 0x4) > 0){
210
//			val = DwgUtil.getBitDouble(data, bitPos);
211
//			bitPos = ((Integer) val.get(0)).intValue();
212
//			dVal = ((Double) val.get(1)).doubleValue();
213
//		}
214
//		System.out.println("constWidth="+dVal);
215
//		
216
//		dVal = 0d;
217
//		if((flag & 0x8) > 0){
218
//			val = DwgUtil.getBitDouble(data, bitPos);
219
//			bitPos = ((Integer) val.get(0)).intValue();
220
//			dVal = ((Double) val.get(1)).doubleValue();
221
//		}
222
//		System.out.println("elevation="+dVal);
223
//		
224
//		dVal = 0d;
225
//		if ((flag & 0x2) > 0){
226
//			val = DwgUtil.getBitDouble(data, bitPos);
227
//			bitPos = ((Integer) val.get(0)).intValue();
228
//			dVal = ((Double) val.get(1)).doubleValue();
229
//		}
230
//		System.out.println("thickness="+dVal);
231
//		
232
//		double x, y, z ;
233
//		x = 0d;
234
//		y = 0d; 
235
//		z = 0d;
236
//		
237
//		if ((flag & 0x1) > 0){
238
//			val = DwgUtil.getBitDouble(data, bitPos);
239
//			bitPos = ((Integer) val.get(0)).intValue();
240
//			x = ((Double) val.get(1)).doubleValue();
241
//			
242
//			val = DwgUtil.getBitDouble(data, bitPos);
243
//			bitPos = ((Integer) val.get(0)).intValue();
244
//			y = ((Double) val.get(1)).doubleValue();
245
//			
246
//			val = DwgUtil.getBitDouble(data, bitPos);
247
//			bitPos = ((Integer) val.get(0)).intValue();
248
//			z = ((Double) val.get(1)).doubleValue();
249
//		}
250
//		System.out.println("normal="+x+","+y+","+z);
251
//		
252
//		val = DwgUtil.getBitLong(data, bitPos);
253
//		bitPos = ((Integer) val.get(0)).intValue();
254
//		int np = ((Integer) val.get(1)).intValue();
255
//		System.out.println("numPoints="+np);
256
//		
257
//		int nb = 0;
258
//		if((flag & 0x10) > 0){
259
//			val = DwgUtil.getBitLong(data, bitPos);
260
//			bitPos = ((Integer) val.get(0)).intValue();
261
//			nb = ((Integer) val.get(1)).intValue();
262
//		}
263
//		System.out.println("numBulges="+nb);
264
//		int nw = 0;
265
//		if((flag & 0x20) > 0){
266
//			val = DwgUtil.getBitLong(data, bitPos);
267
//			bitPos = ((Integer) val.get(0)).intValue();
268
//			nw = ((Integer) val.get(1)).intValue();
269
//		}
270
//		System.out.println("numWidths="+nw);
271
//		if(np > 0){
272
//			Point2D[] points = new Point2D[np];
273
//			for(int i = 0; i < np; i++){
274
//				val = DwgUtil.getRawDouble(data, bitPos);
275
//				bitPos = ((Integer) val.get(0)).intValue();
276
//				x = ((Double) val.get(1)).doubleValue();
277
//				
278
//				val = DwgUtil.getRawDouble(data, bitPos);
279
//				bitPos = ((Integer) val.get(0)).intValue();
280
//				y = ((Double) val.get(1)).doubleValue();
281
//				
282
//				points[i] = new Point2D.Double(x, y);
283
//				System.out.println("Punto"+i+"="+x+","+y);
284
//			}//for
285
//		}//if np
286
//		
287
//		if(nb > 0){
288
//			double[] bulges = new double[nb];
289
//			for(int i = 0; i < nb; i++){
290
//				val = DwgUtil.getRawDouble(data, bitPos);
291
//				bitPos = ((Integer) val.get(0)).intValue();
292
//				bulges[i] = ((Double) val.get(1)).doubleValue();
293
//				System.out.println("Bulge"+i+"="+bulges[i]);
294
//			}//for
295
//			
296
//		}//if nb
297
//		
298
//		if(nw > 0){
299
//			double[][] widths = new double[nw][2];
300
//			for(int i = 0; i < nw; i++){
301
//				val = DwgUtil.getBitDouble(data, bitPos);
302
//				bitPos = ((Integer) val.get(0)).intValue();
303
//				double sw = ((Double) val.get(1)).doubleValue();
304
//				
305
//				val = DwgUtil.getBitDouble(data, bitPos);
306
//				bitPos = ((Integer) val.get(0)).intValue();
307
//				double ew = ((Double) val.get(1)).doubleValue();
308
//				
309
//				widths[i][0] = sw;
310
//				widths[i][1] = ew;
311
//				System.out.println("Width"+i+"="+sw+","+ew);
312
//			}//for
313
//		}
314
     }
315
	
316
	public void test3(){
317
		//test of extrusion
318
		double[] coord = new double[]{790091.78, 4477972.37, 11.2};
319
		double[] extrusion = new double[]{-0.504, 0.07, 0.86};
320
		double[] extrusion2 = new double[]{0, 0, 1};
162 321
		
163
	/*
164
		val = DwgUtil.getBitLong(data, bitPos);
165
		bitPos = ((Integer) val.get(0)).intValue();
166
		int rnum = ((Integer) val.get(1)).intValue();
167
		System.out.println("numReactors = "+rnum);
168
*/
169
		val = DwgUtil.getBitShort(data, bitPos);
170
		bitPos = ((Integer) val.get(0)).intValue();
171
		int rnum = ((Integer) val.get(1)).intValue();
172
		System.out.println("numReactors = "+rnum);
173
		
174
		
175
		val = DwgUtil.testBit(data, bitPos);
176
		bitPos = ((Integer) val.get(0)).intValue();
177
		boolean isLyrByLineType = ((Boolean) val.get(1)).booleanValue();
178
		System.out.println("isLyrByLineType="+isLyrByLineType);
179
		
180
		val = DwgUtil.testBit(data, bitPos);
181
		bitPos = ((Integer) val.get(0)).intValue();
182
		boolean noLinks = ((Boolean) val.get(1)).booleanValue();
183
		System.out.println("noLinks="+noLinks);
184

  
185
		
186
		val = DwgUtil.getBitShort(data, bitPos);
187
		bitPos = ((Integer) val.get(0)).intValue();
188
		int color = ((Integer) val.get(1)).intValue();
189
		System.out.println("color="+color);
190
		
191
		
192
		val = DwgUtil.getBitDouble(data, bitPos);
193
		bitPos = ((Integer) val.get(0)).intValue();
194
		float ltscale = ((Double) val.get(1)).floatValue();
195
		System.out.println("ltscale="+ltscale);
196
		
197
		val = DwgUtil.getBitShort(data, bitPos);
198
		bitPos = ((Integer) val.get(0)).intValue();
199
		int invis = ((Integer) val.get(1)).intValue();
200
		System.out.println("invis="+invis);
201
		
202
		val = DwgUtil.getBitShort(data, bitPos);
203
		bitPos = ((Integer) val.get(0)).intValue();
204
		int flag = ((Integer) val.get(1)).intValue();
205
		System.out.println("flag="+flag);
206
		
207
		double dVal = 0d;
208
		if((flag & 0x4) > 0){
209
			val = DwgUtil.getBitDouble(data, bitPos);
210
			bitPos = ((Integer) val.get(0)).intValue();
211
			dVal = ((Double) val.get(1)).doubleValue();
212
		}
213
		System.out.println("constWidth="+dVal);
214
		
215
		dVal = 0d;
216
		if((flag & 0x8) > 0){
217
			val = DwgUtil.getBitDouble(data, bitPos);
218
			bitPos = ((Integer) val.get(0)).intValue();
219
			dVal = ((Double) val.get(1)).doubleValue();
220
		}
221
		System.out.println("elevation="+dVal);
222
		
223
		dVal = 0d;
224
		if ((flag & 0x2) > 0){
225
			val = DwgUtil.getBitDouble(data, bitPos);
226
			bitPos = ((Integer) val.get(0)).intValue();
227
			dVal = ((Double) val.get(1)).doubleValue();
228
		}
229
		System.out.println("thickness="+dVal);
230
		
231
		double x, y, z ;
232
		x = 0d;
233
		y = 0d; 
234
		z = 0d;
235
		
236
		if ((flag & 0x1) > 0){
237
			val = DwgUtil.getBitDouble(data, bitPos);
238
			bitPos = ((Integer) val.get(0)).intValue();
239
			x = ((Double) val.get(1)).doubleValue();
240
			
241
			val = DwgUtil.getBitDouble(data, bitPos);
242
			bitPos = ((Integer) val.get(0)).intValue();
243
			y = ((Double) val.get(1)).doubleValue();
244
			
245
			val = DwgUtil.getBitDouble(data, bitPos);
246
			bitPos = ((Integer) val.get(0)).intValue();
247
			z = ((Double) val.get(1)).doubleValue();
248
		}
249
		System.out.println("normal="+x+","+y+","+z);
250
		
251
		val = DwgUtil.getBitLong(data, bitPos);
252
		bitPos = ((Integer) val.get(0)).intValue();
253
		int np = ((Integer) val.get(1)).intValue();
254
		System.out.println("numPoints="+np);
255
		
256
		int nb = 0;
257
		if((flag & 0x10) > 0){
258
			val = DwgUtil.getBitLong(data, bitPos);
259
			bitPos = ((Integer) val.get(0)).intValue();
260
			nb = ((Integer) val.get(1)).intValue();
261
		}
262
		System.out.println("numBulges="+nb);
263
		int nw = 0;
264
		if((flag & 0x20) > 0){
265
			val = DwgUtil.getBitLong(data, bitPos);
266
			bitPos = ((Integer) val.get(0)).intValue();
267
			nw = ((Integer) val.get(1)).intValue();
268
		}
269
		System.out.println("numWidths="+nw);
270
		if(np > 0){
271
			Point2D[] points = new Point2D[np];
272
			for(int i = 0; i < np; i++){
273
				val = DwgUtil.getRawDouble(data, bitPos);
274
				bitPos = ((Integer) val.get(0)).intValue();
275
				x = ((Double) val.get(1)).doubleValue();
276
				
277
				val = DwgUtil.getRawDouble(data, bitPos);
278
				bitPos = ((Integer) val.get(0)).intValue();
279
				y = ((Double) val.get(1)).doubleValue();
280
				
281
				points[i] = new Point2D.Double(x, y);
282
				System.out.println("Punto"+i+"="+x+","+y);
283
			}//for
284
		}//if np
285
		
286
		if(nb > 0){
287
			double[] bulges = new double[nb];
288
			for(int i = 0; i < nb; i++){
289
				val = DwgUtil.getRawDouble(data, bitPos);
290
				bitPos = ((Integer) val.get(0)).intValue();
291
				bulges[i] = ((Double) val.get(1)).doubleValue();
292
				System.out.println("Bulge"+i+"="+bulges[i]);
293
			}//for
294
			
295
		}//if nb
296
		
297
		if(nw > 0){
298
			double[][] widths = new double[nw][2];
299
			for(int i = 0; i < nw; i++){
300
				val = DwgUtil.getBitDouble(data, bitPos);
301
				bitPos = ((Integer) val.get(0)).intValue();
302
				double sw = ((Double) val.get(1)).doubleValue();
303
				
304
				val = DwgUtil.getBitDouble(data, bitPos);
305
				bitPos = ((Integer) val.get(0)).intValue();
306
				double ew = ((Double) val.get(1)).doubleValue();
307
				
308
				widths[i][0] = sw;
309
				widths[i][1] = ew;
310
				System.out.println("Width"+i+"="+sw+","+ew);
311
			}//for
312
		}
313
     }
322
		double[] newnew = AcadExtrusionCalculator.extrude(coord, extrusion); 
323
		newnew = AcadExtrusionCalculator.extrude(coord, extrusion2);
324
	}
314 325
}
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgMText.java
233 233
	public void applyExtrussion() {
234 234
		 double[] mtextPoint = getInsertionPoint();
235 235
         double[] mtextExt = getExtrusion();
236
         mtextPoint = AcadExtrusionCalculator.CalculateAcadExtrusion(mtextPoint, mtextExt);
236
         mtextPoint = AcadExtrusionCalculator.extrude2(mtextPoint, mtextExt);
237 237
         setInsertionPoint(mtextPoint);
238 238
	}
239 239
	/* (non-Javadoc)
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgInsert.java
179 179
	public void applyExtrussion() {
180 180
		 double[] insertPoint = getInsertionPoint();
181 181
         double[] insertExt = getExtrusion();
182
         insertPoint = AcadExtrusionCalculator.CalculateAcadExtrusion(insertPoint, insertExt);
182
         insertPoint = AcadExtrusionCalculator.extrude2(insertPoint, insertExt);
183 183
         setInsertionPoint(insertPoint);
184 184
	}
185 185
	/* (non-Javadoc)
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgAttrib.java
317 317
				attribElevation};
318 318
          double[] attribExt = getExtrusion();
319 319
          attribInsertionPoint3D = AcadExtrusionCalculator.
320
		  	CalculateAcadExtrusion(attribInsertionPoint3D, attribExt);
320
		  	extrude2(attribInsertionPoint3D, attribExt);
321 321
          setInsertionPoint(new Point2D.Double(attribInsertionPoint3D[0], 
322 322
          									attribInsertionPoint3D[1]));
323 323
         setElevation(attribInsertionPoint3D[2]);
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgLwPolyline.java
273 273
             lwPolylinePoints3D[j][0] = vertices[j].getX();
274 274
             lwPolylinePoints3D[j][1] = vertices[j].getY();
275 275
             lwPolylinePoints3D[j][2] = elev;
276
             lwPolylinePoints3D[j] = AcadExtrusionCalculator.CalculateAcadExtrusion(lwPolylinePoints3D[j], lwPolylineExt);
276
             lwPolylinePoints3D[j] = AcadExtrusionCalculator.extrude2(lwPolylinePoints3D[j], lwPolylineExt);
277 277
         }
278 278
         setElevation(elev);
279 279
         for (int j=0;j<vertices.length;j++) {
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgCircle.java
145 145
	public void applyExtrussion() {
146 146
		 double[] circleCenter = getCenter();
147 147
         double[] circleExt = getExtrusion();
148
         circleCenter = AcadExtrusionCalculator.CalculateAcadExtrusion(circleCenter, circleExt);
148
         circleCenter = AcadExtrusionCalculator.extrude2(circleCenter, circleExt);
149 149
         setCenter(circleCenter);
150 150
	}
151 151
	/* (non-Javadoc)
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgArc.java
151 151
		 double[] arcCenter = getCenter();
152 152
         double[] arcExt = getExtrusion();
153 153
         arcCenter = AcadExtrusionCalculator.
154
		 	CalculateAcadExtrusion(arcCenter, arcExt);
154
		 	extrude2(arcCenter, arcExt);
155 155
         setCenter(arcCenter);
156 156
		
157 157
	}
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgSolid.java
200 200
         double[] corner3 = getCorner3();
201 201
         double[] corner4 = getCorner4();
202 202
         double[] solidExt = getExtrusion();
203
         corner1 = AcadExtrusionCalculator.CalculateAcadExtrusion(corner1, solidExt);
203
         corner1 = AcadExtrusionCalculator.extrude2(corner1, solidExt);
204 204
         setCorner1(corner1);
205 205
         setCorner2(corner2);
206 206
         setCorner3(corner3);
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgPolyline2D.java
402 402
	          polylinePoints3D[j][0] = vertices[j].getX();
403 403
	          polylinePoints3D[j][1] = vertices[j].getY();
404 404
	          polylinePoints3D[j][2] = elev;
405
	          polylinePoints3D[j] = AcadExtrusionCalculator.CalculateAcadExtrusion(polylinePoints3D[j], polyline2DExt);
405
	          polylinePoints3D[j] = AcadExtrusionCalculator.extrude2(polylinePoints3D[j], polyline2DExt);
406 406
	      }
407 407
	      setElevation(elev);
408 408
	      for (int j=0;j<vertices.length;j++) {
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgText.java
267 267
         double elev = getElevation();
268 268
         double[] textPoint = new double[]{tpoint.getX(), tpoint.getY(), elev};
269 269
         double[] textExt = getExtrusion();
270
         textPoint = AcadExtrusionCalculator.CalculateAcadExtrusion(textPoint, textExt);
270
         textPoint = AcadExtrusionCalculator.extrude2(textPoint, textExt);
271 271
         setInsertionPoint(new Point2D.Double(textPoint[0], textPoint[1]));
272 272
         setElevation(elev);
273 273
	}
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgLine.java
165 165
             lineP2 = new double[]{lineP2[0], lineP2[1], 0.0};
166 166
         }
167 167
         double[] lineExt = getExtrusion();
168
         lineP1 = AcadExtrusionCalculator.CalculateAcadExtrusion(lineP1, lineExt);
169
         lineP2 = AcadExtrusionCalculator.CalculateAcadExtrusion(lineP2, lineExt);
168
         lineP1 = AcadExtrusionCalculator.extrude2(lineP1, lineExt);
169
         lineP2 = AcadExtrusionCalculator.extrude2(lineP2, lineExt);
170 170
         setP1(lineP1);
171 171
         setP2(lineP2);
172 172
	}
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgPoint.java
114 114
	public void applyExtrussion() {
115 115
		 double[] point = getPoint();
116 116
         double[] pointExt = getExtrusion();
117
         point = AcadExtrusionCalculator.CalculateAcadExtrusion(point, pointExt);
117
         point = AcadExtrusionCalculator.extrude2(point, pointExt);
118 118
         setPoint(point);
119 119
	}
120 120
	/* (non-Javadoc)
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/util/AcadExtrusionCalculator.java
45 45
 */
46 46
public class AcadExtrusionCalculator {
47 47
    
48
	final static double[] WY = new double[]{0,1,0};
49
	final static double[] WZ = new double[]{0,0,1};
50
	final static double MINLENGHT = 1d/64d;
51
	/*
52
	 * http://personales.unican.es/togoresr/Sco-en.html
53
	 * http://www.autodesk.com/techpubs/autocad/acadr14/dxf/object_coordinate_systems_40ocs41_al_u05_c.htm
54
	 * http://www.autodesk.com/techpubs/autocad/acadr14/dxf/arbitrary_axis_algorithm_al_u05_c.htm
55
	 * http://vis.cs.brown.edu/resources/doc/gluebase-2.0/vector3d_8H-source.html
56
	 * */
57
	public static double[] extrude(double[] coordToExtrude, double[] extrusionVector){
58
		double[] solution = null;
59
		double[] ax = null;
60
		double[] ay = null;
61
		
62
		double normalLenght = length(extrusionVector);
63
		
64
		if( (Math.abs(extrusionVector[0]) > MINLENGHT) && (Math.abs(extrusionVector[1]) > MINLENGHT)){
65
			ax = crossProduct(WY, extrusionVector);
66
		}else{
67
			ax = crossProduct(WZ, extrusionVector);
68
		}
69
		ax = makeUnitary(ax);
70
		
71
		ay = crossProduct(extrusionVector, ax);
72
		ay = makeUnitary(ay);
73
		
74
		//Llegados a este punto, tenemos tres vectores unitarios
75
		
76
		double x = ax[0] * coordToExtrude[0] + ay[0] * coordToExtrude[1] + extrusionVector[0] * coordToExtrude[2];
77
		double y = ax[1] * coordToExtrude[0] + ay[1] * coordToExtrude[1] + extrusionVector[1] * coordToExtrude[2];
78
		double z = ax[2] * coordToExtrude[0] + ay[2] * coordToExtrude[1] + extrusionVector[2] * coordToExtrude[2];
79
		
80
		solution = new double[]{x, y, z};
81
		return solution;
82
	}
83
	
84
	public static double[] crossProduct(double[] a, double[] b){
85
		
86
		return new double[]{ a[1] * b[2] - a[2] * b[1], 
87
							a[2] * b[0] - a[0] * b[2],
88
							a[0] * b[1] - a[1] * b[0]};
89
	}
90
	
91
	
92
	public static double[] makeUnitary(double[] vector){
93
		double[] solution = null;
94
		double vectorLenght = length(vector);
95
		
96
		double x = vector[0] / vectorLenght;
97
		double y = vector[1] / vectorLenght;
98
		double z = vector[2] / vectorLenght;
99
		
100
		solution = new double[]{x, y, z};
101
		return solution;
102
	}
103
	
104
	public static double length(double[] vector){
105
		return Math.sqrt( (vector[0] * vector[0]) + 
106
				(vector[1] * vector[1]) + 
107
				(vector[2] * vector[2]));
108
	}
109
	
110
	
111
	
48 112
    /**
49 113
     * Method that allows to apply the extrusion transformation of Autocad
50 114
     * 
......
53 117
     * @return double[] Is the result of the application of the extrusion transformation
54 118
     * 		   to the input point
55 119
     */
56
	public static double[] CalculateAcadExtrusion(double[] coord_in, double[] xtru) {
120
	public static double[] extrude2(double[] coord_in, double[] xtru) {
57 121
		double[] coord_out;
58 122
		
59 123
        double dxt0 = 0D, dyt0 = 0D, dzt0 = 0D;

Also available in: Unified diff