summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c>2010-01-21 14:53:49 (GMT)
committerkintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c>2010-01-21 14:53:49 (GMT)
commit3542c1999239fa36d61f6a527b625991531718a7 (patch)
tree03aaac975c26149b2e60029df1ddf9adcb075a92
parentd19fbcb80115853e11415a844241701d176c0af6 (diff)
bugfix: INSERT with transformation didn't work
git-svn-id: http://svn.clifford.at/openscad/trunk@329 b57f626f-c46c-0410-a088-ec61d464b74c
-rw-r--r--TODO.txt1
-rw-r--r--dxfdata.cc70
-rw-r--r--testdata/transform-insert.dxf2980
-rw-r--r--testdata/transform-insert.scad1
4 files changed, 3025 insertions, 27 deletions
diff --git a/TODO.txt b/TODO.txt
index 658fe98..49cb080 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -66,7 +66,6 @@ o DXF Import
- Support for SPLINE entity
- Support for LEADER entity
- Support for MTEXT entity ?
- - Test INSERT with rotation. code looks wrong
- idea: DXF inline - convert from dxf to OpenSCAD syntax -> parametrize dxf content
o Mesh optimization on STL export
- Remove super small triangles (all sides are short)
diff --git a/dxfdata.cc b/dxfdata.cc
index 0d34d3e..67e7957 100644
--- a/dxfdata.cc
+++ b/dxfdata.cc
@@ -82,7 +82,9 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye
double coords[7][2]; // Used by DIMENSION entities
QVector<double> xverts;
QVector<double> yverts;
- double radius = 0, start_angle = 0, stop_angle = 0;
+ double radius = 0;
+ double arc_start_angle = 0, arc_stop_angle = 0;
+ double ellipse_start_angle = 0, ellipse_stop_angle = 0;
for (int i = 0; i < 7; i++)
for (int j = 0; j < 2; j++)
@@ -155,21 +157,21 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye
else if (mode == "ARC") {
Point center(xverts[0], yverts[0]);
int n = get_fragments_from_r(radius, fn, fs, fa);
- while (start_angle > stop_angle)
- stop_angle += 360.0;
- n = (int)ceil(n * (stop_angle-start_angle) / 360);
+ while (arc_start_angle > arc_stop_angle)
+ arc_stop_angle += 360.0;
+ n = (int)ceil(n * (arc_stop_angle-arc_start_angle) / 360);
for (int i = 0; i < n; i++) {
- double a1 = ((stop_angle-start_angle)*i)/n;
- double a2 = ((stop_angle-start_angle)*(i+1))/n;
- a1 = (start_angle + a1) * M_PI / 180.0;
- a2 = (start_angle + a2) * M_PI / 180.0;
+ double a1 = ((arc_stop_angle-arc_start_angle)*i)/n;
+ double a2 = ((arc_stop_angle-arc_start_angle)*(i+1))/n;
+ a1 = (arc_start_angle + a1) * M_PI / 180.0;
+ a2 = (arc_start_angle + a2) * M_PI / 180.0;
ADD_LINE(cos(a1)*radius + center.x, sin(a1)*radius + center.y,
cos(a2)*radius + center.x, sin(a2)*radius + center.y);
}
}
else if (mode == "ELLIPSE") {
// Commented code is meant as documentation of vector math
- while (start_angle > stop_angle) stop_angle += 2 * M_PI;
+ while (ellipse_start_angle > ellipse_stop_angle) ellipse_stop_angle += 2 * M_PI;
// Vector2d center(xverts[0], yverts[0]);
Point center(xverts[0], yverts[0]);
// Vector2d ce(xverts[1], yverts[1]);
@@ -190,13 +192,13 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye
// the ratio stored in 'radius; due to the parser code not checking entity type
double r_minor = r_major * radius;
- double sweep_angle = stop_angle-start_angle;
+ double sweep_angle = ellipse_stop_angle-ellipse_start_angle;
int n = get_fragments_from_r(r_major, fn, fs, fa);
n = (int)ceil(n * sweep_angle / (2 * M_PI));
// Vector2d p1;
Point p1;
for (int i=0;i<=n;i++) {
- double a = (start_angle + sweep_angle*i/n);
+ double a = (ellipse_start_angle + sweep_angle*i/n);
// Vector2d p2(cos(a)*r_major, sin(a)*r_minor);
Point p2(cos(a)*r_major, sin(a)*r_minor);
// p2.rotate(rot_angle);
@@ -215,16 +217,18 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye
}
}
else if (mode == "INSERT") {
+ // scale is stored in ellipse_start|stop_angle, rotation in arc_start_angle;
+ // due to the parser code not checking entity type
int n = blockdata[iddata].size();
for (int i = 0; i < n; i++) {
- double a = -start_angle * M_PI / 180.0;
- double lx1 = blockdata[iddata][i].p[0]->x;
- double ly1 = blockdata[iddata][i].p[0]->y;
- double lx2 = blockdata[iddata][i].p[1]->x;
- double ly2 = blockdata[iddata][i].p[1]->y;
- double px1 = cos(a)*lx1 + sin(a)*ly1 + xverts[0];
+ double a = arc_start_angle * M_PI / 180.0;
+ double lx1 = blockdata[iddata][i].p[0]->x * ellipse_start_angle;
+ double ly1 = blockdata[iddata][i].p[0]->y * ellipse_stop_angle;
+ double lx2 = blockdata[iddata][i].p[1]->x * ellipse_start_angle;
+ double ly2 = blockdata[iddata][i].p[1]->y * ellipse_stop_angle;
+ double px1 = cos(a)*lx1 - sin(a)*ly1 + xverts[0];
double py1 = sin(a)*lx1 + cos(a)*ly1 + yverts[0];
- double px2 = cos(a)*lx2 + sin(a)*ly2 + xverts[0];
+ double px2 = cos(a)*lx2 - sin(a)*ly2 + xverts[0];
double py2 = sin(a)*lx2 + cos(a)*ly2 + yverts[0];
ADD_LINE(px1, py1, px2, py2);
}
@@ -236,7 +240,7 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye
for (int i = 0; i < 7; i++)
for (int j = 0; j < 2; j++)
this->dims.last().coords[i][j] = coords[i][j];
- this->dims.last().angle = start_angle;
+ this->dims.last().angle = ellipse_start_angle;
this->dims.last().length = radius;
this->dims.last().name = name;
}
@@ -262,7 +266,11 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye
coords[i][j] = 0;
xverts.clear();
yverts.clear();
- radius = start_angle = stop_angle = 0;
+ radius = arc_start_angle = arc_stop_angle = 0;
+ ellipse_start_angle = ellipse_stop_angle = 0;
+ if (mode == "INSERT") {
+ ellipse_start_angle = ellipse_stop_angle = 1.0; // scale
+ }
break;
case 1:
name = data;
@@ -291,13 +299,23 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye
// DIMENSION (radial, diameter): Leader length
radius = data.toDouble() * scale;
break;
- case 41: // for ELLIPSE
- case 50: // for ARC
- start_angle = data.toDouble();
+ case 41:
+ // ELLIPSE: start_angle
+ // INSERT: X scale
+ ellipse_start_angle = data.toDouble();
+ break;
+ case 50:
+ // ARC: start_angle
+ // INSERT: rot angle
+ arc_start_angle = data.toDouble();
+ break;
+ case 42:
+ // ELLIPSE: stop_angle
+ // INSERT: Y scale
+ ellipse_stop_angle = data.toDouble();
break;
- case 42: // for ELLIPSE
- case 51: // for ARC
- stop_angle = data.toDouble();
+ case 51: // ARC
+ arc_stop_angle = data.toDouble();
break;
case 70:
// LWPOLYLINE: polyline flag
diff --git a/testdata/transform-insert.dxf b/testdata/transform-insert.dxf
new file mode 100644
index 0000000..40064c2
--- /dev/null
+++ b/testdata/transform-insert.dxf
@@ -0,0 +1,2980 @@
+999
+dxflib 2.2.0.0
+ 0
+SECTION
+ 2
+HEADER
+ 9
+$ACADVER
+ 1
+AC1015
+ 9
+$HANDSEED
+ 5
+FFFF
+ 9
+$DIMASZ
+ 40
+2.5
+ 9
+$PLIMMIN
+ 10
+0.0
+ 20
+0.0
+ 9
+$DIMEXE
+ 40
+1.25
+ 9
+$DIMGAP
+ 40
+0.625
+ 9
+$PLIMMAX
+ 10
+210.0
+ 20
+297.0
+ 9
+$INSUNITS
+ 70
+4
+ 9
+$DIMEXO
+ 40
+0.625
+ 9
+$DIMTXT
+ 40
+2.5
+ 9
+$CLAYER
+ 8
+0
+ 0
+ENDSEC
+ 0
+SECTION
+ 2
+TABLES
+ 0
+TABLE
+ 2
+VPORT
+ 5
+8
+100
+AcDbSymbolTable
+ 70
+1
+ 0
+VPORT
+ 5
+30
+100
+AcDbSymbolTableRecord
+100
+AcDbViewportTableRecord
+ 2
+*Active
+ 70
+0
+ 10
+0.0
+ 20
+0.0
+ 11
+1.0
+ 21
+1.0
+ 12
+286.3055555555554861
+ 22
+148.5
+ 13
+0.0
+ 23
+0.0
+ 14
+10.0
+ 24
+10.0
+ 15
+10.0
+ 25
+10.0
+ 16
+0.0
+ 26
+0.0
+ 36
+1.0
+ 17
+0.0
+ 27
+0.0
+ 37
+0.0
+ 40
+297.0
+ 41
+1.92798353909465
+ 42
+50.0
+ 43
+0.0
+ 44
+0.0
+ 50
+0.0
+ 51
+0.0
+ 71
+0
+ 72
+100
+ 73
+1
+ 74
+3
+ 75
+1
+ 76
+1
+ 77
+0
+ 78
+0
+281
+0
+ 65
+1
+110
+0.0
+120
+0.0
+130
+0.0
+111
+1.0
+121
+0.0
+131
+0.0
+112
+0.0
+122
+1.0
+132
+0.0
+ 79
+0
+146
+0.0
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+LTYPE
+ 5
+5
+100
+AcDbSymbolTable
+ 70
+21
+ 0
+LTYPE
+ 5
+14
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+ByBlock
+ 70
+0
+ 3
+
+ 72
+65
+ 73
+0
+ 40
+0.0
+ 0
+LTYPE
+ 5
+15
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+ByLayer
+ 70
+0
+ 3
+
+ 72
+65
+ 73
+0
+ 40
+0.0
+ 0
+LTYPE
+ 5
+16
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+CONTINUOUS
+ 70
+0
+ 3
+Solid line
+ 72
+65
+ 73
+0
+ 40
+0.0
+ 0
+LTYPE
+ 5
+31
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DOT
+ 70
+0
+ 3
+Dot . . . . . . . . . . . . . . . . . . . . . .
+ 72
+65
+ 73
+2
+ 40
+6.3499999999999996
+ 49
+0.0
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 0
+LTYPE
+ 5
+32
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DOT2
+ 70
+0
+ 3
+Dot (.5x) .....................................
+ 72
+65
+ 73
+2
+ 40
+3.1749999999999998
+ 49
+0.0
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 0
+LTYPE
+ 5
+33
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DOTX2
+ 70
+0
+ 3
+Dot (2x) . . . . . . . . . . . . .
+ 72
+65
+ 73
+2
+ 40
+12.6999999999999993
+ 49
+0.0
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 0
+LTYPE
+ 5
+34
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DASHED
+ 70
+0
+ 3
+Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _
+ 72
+65
+ 73
+2
+ 40
+19.0500000000000007
+ 49
+12.6999999999999993
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 0
+LTYPE
+ 5
+35
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DASHED2
+ 70
+0
+ 3
+Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ 72
+65
+ 73
+2
+ 40
+9.5250000000000004
+ 49
+6.3499999999999996
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 0
+LTYPE
+ 5
+36
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DASHEDX2
+ 70
+0
+ 3
+Dashed (2x) ____ ____ ____ ____ ____ ___
+ 72
+65
+ 73
+2
+ 40
+38.1000000000000014
+ 49
+25.3999999999999986
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 0
+LTYPE
+ 5
+37
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DASHDOT
+ 70
+0
+ 3
+Dash dot __ . __ . __ . __ . __ . __ . __ . __
+ 72
+65
+ 73
+4
+ 40
+25.3999999999999986
+ 49
+12.6999999999999993
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 0
+LTYPE
+ 5
+38
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DASHDOT2
+ 70
+0
+ 3
+Dash dot (.5x) _._._._._._._._._._._._._._._.
+ 72
+65
+ 73
+4
+ 40
+12.6999999999999993
+ 49
+6.3499999999999996
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 0
+LTYPE
+ 5
+39
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DASHDOTX2
+ 70
+0
+ 3
+Dash dot (2x) ____ . ____ . ____ . ___
+ 72
+65
+ 73
+4
+ 40
+50.7999999999999972
+ 49
+25.3999999999999986
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 0
+LTYPE
+ 5
+3A
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DIVIDE
+ 70
+0
+ 3
+Divide ____ . . ____ . . ____ . . ____ . . ____
+ 72
+65
+ 73
+6
+ 40
+31.75
+ 49
+12.6999999999999993
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 0
+LTYPE
+ 5
+3B
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DIVIDE2
+ 70
+0
+ 3
+Divide (.5x) __..__..__..__..__..__..__..__.._
+ 72
+65
+ 73
+6
+ 40
+15.875
+ 49
+6.3499999999999996
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 0
+LTYPE
+ 5
+3C
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+DIVIDEX2
+ 70
+0
+ 3
+Divide (2x) ________ . . ________ . . _
+ 72
+65
+ 73
+6
+ 40
+63.5
+ 49
+25.3999999999999986
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 0
+LTYPE
+ 5
+3D
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+CENTER
+ 70
+0
+ 3
+Center ____ _ ____ _ ____ _ ____ _ ____ _ ____
+ 72
+65
+ 73
+4
+ 40
+50.7999999999999972
+ 49
+31.75
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 49
+6.3499999999999996
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 0
+LTYPE
+ 5
+3E
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+CENTER2
+ 70
+0
+ 3
+Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___
+ 72
+65
+ 73
+4
+ 40
+28.5749999999999993
+ 49
+19.0500000000000007
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 49
+3.1749999999999998
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 0
+LTYPE
+ 5
+3F
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+CENTERX2
+ 70
+0
+ 3
+Center (2x) ________ __ ________ __ _____
+ 72
+65
+ 73
+4
+ 40
+101.5999999999999943
+ 49
+63.5
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 49
+12.6999999999999993
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 0
+LTYPE
+ 5
+40
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+BORDER
+ 70
+0
+ 3
+Border __ __ . __ __ . __ __ . __ __ . __ __ .
+ 72
+65
+ 73
+6
+ 40
+44.4500000000000028
+ 49
+12.6999999999999993
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 49
+12.6999999999999993
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-6.3499999999999996
+ 74
+0
+ 0
+LTYPE
+ 5
+41
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+BORDER2
+ 70
+0
+ 3
+Border (.5x) __.__.__.__.__.__.__.__.__.__.__.
+ 72
+65
+ 73
+6
+ 40
+22.2250000000000014
+ 49
+6.3499999999999996
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 49
+6.3499999999999996
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-3.1749999999999998
+ 74
+0
+ 0
+LTYPE
+ 5
+42
+100
+AcDbSymbolTableRecord
+100
+AcDbLinetypeTableRecord
+ 2
+BORDERX2
+ 70
+0
+ 3
+Border (2x) ____ ____ . ____ ____ . ___
+ 72
+65
+ 73
+6
+ 40
+88.9000000000000057
+ 49
+25.3999999999999986
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 49
+25.3999999999999986
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 49
+0.0
+ 74
+0
+ 49
+-12.6999999999999993
+ 74
+0
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+LAYER
+ 5
+2
+100
+AcDbSymbolTable
+ 70
+1
+ 0
+LAYER
+ 5
+10
+100
+AcDbSymbolTableRecord
+100
+AcDbLayerTableRecord
+ 2
+0
+ 70
+0
+ 62
+7
+420
+0
+ 6
+CONTINUOUS
+370
+25
+390
+F
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+STYLE
+ 5
+3
+100
+AcDbSymbolTable
+ 70
+1
+ 0
+STYLE
+ 5
+11
+100
+AcDbSymbolTableRecord
+100
+AcDbTextStyleTableRecord
+ 2
+Standard
+ 70
+0
+ 40
+0.0
+ 41
+0.75
+ 50
+0.0
+ 71
+0
+ 42
+2.5
+ 3
+txt
+ 4
+
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+VIEW
+ 5
+6
+100
+AcDbSymbolTable
+ 70
+0
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+UCS
+ 5
+7
+100
+AcDbSymbolTable
+ 70
+0
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+APPID
+ 5
+9
+100
+AcDbSymbolTable
+ 70
+1
+ 0
+APPID
+ 5
+12
+100
+AcDbSymbolTableRecord
+100
+AcDbRegAppTableRecord
+ 2
+ACAD
+ 70
+0
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+DIMSTYLE
+ 5
+A
+100
+AcDbSymbolTable
+ 70
+1
+100
+AcDbDimStyleTable
+ 71
+0
+ 0
+DIMSTYLE
+105
+27
+100
+AcDbSymbolTableRecord
+100
+AcDbDimStyleTableRecord
+ 2
+Standard
+ 41
+2.5
+ 42
+0.625
+ 43
+3.75
+ 44
+1.25
+ 70
+0
+ 73
+0
+ 74
+0
+ 77
+1
+ 78
+8
+140
+2.5
+141
+2.5
+143
+0.03937007874016
+147
+0.625
+171
+3
+172
+1
+271
+2
+272
+2
+274
+3
+278
+44
+283
+0
+284
+8
+340
+11
+ 0
+ENDTAB
+ 0
+TABLE
+ 2
+BLOCK_RECORD
+ 5
+1
+100
+AcDbSymbolTable
+ 70
+1
+ 0
+BLOCK_RECORD
+ 5
+1F
+100
+AcDbSymbolTableRecord
+100
+AcDbBlockTableRecord
+ 2
+*Model_Space
+340
+22
+ 0
+BLOCK_RECORD
+ 5
+1B
+100
+AcDbSymbolTableRecord
+100
+AcDbBlockTableRecord
+ 2
+*Paper_Space
+340
+1E
+ 0
+BLOCK_RECORD
+ 5
+23
+100
+AcDbSymbolTableRecord
+100
+AcDbBlockTableRecord
+ 2
+*Paper_Space0
+340
+26
+ 0
+BLOCK_RECORD
+ 5
+43
+100
+AcDbSymbolTableRecord
+100
+AcDbBlockTableRecord
+ 2
+testblock
+340
+0
+ 0
+BLOCK_RECORD
+ 5
+44
+100
+AcDbSymbolTableRecord
+100
+AcDbBlockTableRecord
+ 2
+testblock2
+340
+0
+ 0
+ENDTAB
+ 0
+ENDSEC
+ 0
+SECTION
+ 2
+BLOCKS
+ 0
+BLOCK
+ 5
+20
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockBegin
+ 2
+*Model_Space
+ 70
+0
+ 10
+0.0
+ 20
+0.0
+ 30
+0.0
+ 3
+*Model_Space
+ 1
+
+ 0
+ENDBLK
+ 5
+21
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockEnd
+ 0
+BLOCK
+ 5
+1C
+100
+AcDbEntity
+ 67
+1
+ 8
+0
+100
+AcDbBlockBegin
+ 2
+*Paper_Space
+ 70
+0
+ 10
+0.0
+ 20
+0.0
+ 30
+0.0
+ 3
+*Paper_Space
+ 1
+
+ 0
+ENDBLK
+ 5
+1D
+100
+AcDbEntity
+ 67
+1
+ 8
+0
+100
+AcDbBlockEnd
+ 0
+BLOCK
+ 5
+24
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockBegin
+ 2
+*Paper_Space0
+ 70
+0
+ 10
+0.0
+ 20
+0.0
+ 30
+0.0
+ 3
+*Paper_Space0
+ 1
+
+ 0
+ENDBLK
+ 5
+25
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockEnd
+ 0
+BLOCK
+ 5
+45
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockBegin
+ 2
+testblock
+ 70
+0
+ 10
+0.0
+ 20
+0.0
+ 30
+0.0
+ 3
+testblock
+ 1
+
+ 0
+LINE
+ 5
+46
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-1.0
+ 20
+0.0
+ 30
+0.0
+ 11
+-1.0
+ 21
+2.0
+ 31
+0.0
+ 0
+LINE
+ 5
+47
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-1.0
+ 20
+2.0
+ 30
+0.0
+ 11
+-3.0
+ 21
+2.0
+ 31
+0.0
+ 0
+LINE
+ 5
+48
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-3.0
+ 20
+2.0
+ 30
+0.0
+ 11
+-3.0
+ 21
+4.0
+ 31
+0.0
+ 0
+LINE
+ 5
+49
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-3.0
+ 20
+4.0
+ 30
+0.0
+ 11
+3.0
+ 21
+4.0
+ 31
+0.0
+ 0
+LINE
+ 5
+4A
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+3.0
+ 20
+4.0
+ 30
+0.0
+ 11
+3.0
+ 21
+2.0
+ 31
+0.0
+ 0
+LINE
+ 5
+4B
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+3.0
+ 20
+2.0
+ 30
+0.0
+ 11
+1.0
+ 21
+2.0
+ 31
+0.0
+ 0
+LINE
+ 5
+4C
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+1.0
+ 20
+2.0
+ 30
+0.0
+ 11
+1.0
+ 21
+0.0
+ 31
+0.0
+ 0
+ENDBLK
+ 5
+4D
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockEnd
+ 0
+BLOCK
+ 5
+4E
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockBegin
+ 2
+testblock2
+ 70
+0
+ 10
+0.0
+ 20
+0.0
+ 30
+0.0
+ 3
+testblock2
+ 1
+
+ 0
+LINE
+ 5
+4F
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-1.0000000000000004
+ 20
+6.0
+ 30
+0.0
+ 11
+-1.0
+ 21
+8.0
+ 31
+0.0
+ 0
+LINE
+ 5
+50
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-1.0
+ 20
+8.0
+ 30
+0.0
+ 11
+-3.0
+ 21
+8.0
+ 31
+0.0
+ 0
+LINE
+ 5
+51
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-3.0
+ 20
+8.0
+ 30
+0.0
+ 11
+-3.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+52
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-3.0
+ 20
+10.0
+ 30
+0.0
+ 11
+3.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+53
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+3.0
+ 20
+10.0
+ 30
+0.0
+ 11
+3.0
+ 21
+8.0
+ 31
+0.0
+ 0
+LINE
+ 5
+54
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+3.0
+ 20
+8.0
+ 30
+0.0
+ 11
+1.0
+ 21
+8.0
+ 31
+0.0
+ 0
+LINE
+ 5
+55
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+1.0
+ 20
+8.0
+ 30
+0.0
+ 11
+0.9999999999999998
+ 21
+6.0
+ 31
+0.0
+ 0
+ENDBLK
+ 5
+56
+100
+AcDbEntity
+ 8
+0
+100
+AcDbBlockEnd
+ 0
+ENDSEC
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+LINE
+ 5
+57
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+10.0
+ 20
+10.0
+ 30
+0.0
+ 11
+10.0
+ 21
+-10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+58
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-10.0
+ 20
+-10.0
+ 30
+0.0
+ 11
+-10.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+59
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-10.0
+ 20
+10.0
+ 30
+0.0
+ 11
+-1.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+5A
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+1.0
+ 20
+10.0
+ 30
+0.0
+ 11
+10.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+5B
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+10.0
+ 20
+-10.0
+ 30
+0.0
+ 11
+1.0
+ 21
+-10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+5C
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+-1.0
+ 20
+-10.0
+ 30
+0.0
+ 11
+-10.0
+ 21
+-10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+5D
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+40.0
+ 20
+10.0
+ 30
+0.0
+ 11
+40.0
+ 21
+-10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+5E
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+20.0
+ 20
+-10.0
+ 30
+0.0
+ 11
+20.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+5F
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+20.0
+ 20
+10.0
+ 30
+0.0
+ 11
+29.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+60
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+31.0
+ 20
+10.0
+ 30
+0.0
+ 11
+40.0
+ 21
+10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+61
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+40.0
+ 20
+-10.0
+ 30
+0.0
+ 11
+31.0
+ 21
+-10.0
+ 31
+0.0
+ 0
+LINE
+ 5
+62
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+29.0
+ 20
+-10.0
+ 30
+0.0
+ 11
+20.0
+ 21
+-10.0
+ 31
+0.0
+ 0
+INSERT
+ 5
+63
+100
+AcDbEntity
+100
+AcDbBlockReference
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 2
+testblock2
+ 10
+29.9999999999999964
+ 20
+-4.0
+ 30
+0.0
+ 41
+1.0
+ 42
+-1.0
+ 43
+1.0
+ 50
+360.0
+ 44
+1.0
+ 45
+1.0
+ 0
+INSERT
+ 5
+64
+100
+AcDbEntity
+100
+AcDbBlockReference
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 2
+testblock2
+ 10
+30.0
+ 20
+4.0
+ 30
+0.0
+ 44
+1.0
+ 45
+1.0
+ 0
+INSERT
+ 5
+65
+100
+AcDbEntity
+100
+AcDbBlockReference
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 2
+testblock
+ 10
+0.0
+ 20
+-10.0
+ 30
+0.0
+ 41
+1.0
+ 42
+-1.0
+ 43
+1.0
+ 50
+360.0
+ 44
+1.0
+ 45
+1.0
+ 0
+INSERT
+ 5
+66
+100
+AcDbEntity
+100
+AcDbBlockReference
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 2
+testblock
+ 10
+0.0
+ 20
+10.0
+ 30
+0.0
+ 44
+1.0
+ 45
+1.0
+ 0
+LINE
+ 5
+67
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+60.0
+ 20
+7.0710678118654755
+ 30
+0.0
+ 11
+67.0710678118654755
+ 21
+-0.0000000000000017
+ 31
+0.0
+ 0
+LINE
+ 5
+68
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+60.0
+ 20
+-7.0710678118654755
+ 30
+0.0
+ 11
+52.9289321881345245
+ 21
+0.0000000000000009
+ 31
+0.0
+ 0
+LINE
+ 5
+69
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+52.9289321881345245
+ 20
+0.0000000000000009
+ 30
+0.0
+ 11
+56.1109127034739927
+ 21
+3.1819805153394651
+ 31
+0.0
+ 0
+LINE
+ 5
+6A
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+56.8180194846605389
+ 20
+3.8890872965260113
+ 30
+0.0
+ 11
+60.0
+ 21
+7.0710678118654755
+ 31
+0.0
+ 0
+LINE
+ 5
+6B
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+67.0710678118654755
+ 20
+-0.0000000000000017
+ 30
+0.0
+ 11
+63.8890872965260073
+ 21
+-3.1819805153394651
+ 31
+0.0
+ 0
+LINE
+ 5
+6C
+100
+AcDbEntity
+100
+AcDbLine
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 10
+63.1819805153394611
+ 20
+-3.8890872965260117
+ 30
+0.0
+ 11
+60.0
+ 21
+-7.0710678118654755
+ 31
+0.0
+ 0
+INSERT
+ 5
+6D
+100
+AcDbEntity
+100
+AcDbBlockReference
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 2
+testblock2
+ 10
+58.5857864376269077
+ 20
+1.4142135623730963
+ 30
+0.0
+ 41
+0.5
+ 42
+0.5
+ 43
+1.0
+ 50
+45.0
+ 44
+1.0
+ 45
+1.0
+ 0
+INSERT
+ 5
+6E
+100
+AcDbEntity
+100
+AcDbBlockReference
+ 8
+0
+ 62
+256
+370
+-1
+ 6
+ByLayer
+ 2
+testblock2
+ 10
+61.4142135623730923
+ 20
+-1.4142135623730949
+ 30
+0.0
+ 41
+0.5
+ 42
+0.5
+ 43
+1.0
+ 50
+-135.0
+ 44
+1.0
+ 45
+1.0
+ 0
+ENDSEC
+ 0
+SECTION
+ 2
+OBJECTS
+ 0
+DICTIONARY
+ 5
+C
+100
+AcDbDictionary
+280
+0
+281
+1
+ 3
+ACAD_GROUP
+350
+D
+ 3
+ACAD_LAYOUT
+350
+1A
+ 3
+ACAD_MLINESTYLE
+350
+17
+ 3
+ACAD_PLOTSETTINGS
+350
+19
+ 3
+ACAD_PLOTSTYLENAME
+350
+E
+ 3
+AcDbVariableDictionary
+350
+6F
+ 0
+DICTIONARY
+ 5
+D
+100
+AcDbDictionary
+280
+0
+281
+1
+ 0
+ACDBDICTIONARYWDFLT
+ 5
+E
+100
+AcDbDictionary
+281
+1
+ 3
+Normal
+350
+F
+100
+AcDbDictionaryWithDefault
+340
+F
+ 0
+ACDBPLACEHOLDER
+ 5
+F
+ 0
+DICTIONARY
+ 5
+17
+100
+AcDbDictionary
+280
+0
+281
+1
+ 3
+Standard
+350
+18
+ 0
+MLINESTYLE
+ 5
+18
+100
+AcDbMlineStyle
+ 2
+STANDARD
+ 70
+0
+ 3
+
+ 62
+256
+ 51
+90.0
+ 52
+90.0
+ 71
+2
+ 49
+0.5
+ 62
+256
+ 6
+BYLAYER
+ 49
+-0.5
+ 62
+256
+ 6
+BYLAYER
+ 0
+DICTIONARY
+ 5
+19
+100
+AcDbDictionary
+280
+0
+281
+1
+ 0
+DICTIONARY
+ 5
+1A
+100
+AcDbDictionary
+281
+1
+ 3
+Layout1
+350
+1E
+ 3
+Layout2
+350
+26
+ 3
+Model
+350
+22
+ 0
+LAYOUT
+ 5
+1E
+100
+AcDbPlotSettings
+ 1
+
+ 2
+C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3
+ 4
+
+ 6
+
+ 40
+0.0
+ 41
+0.0
+ 42
+0.0
+ 43
+0.0
+ 44
+0.0
+ 45
+0.0
+ 46
+0.0
+ 47
+0.0
+ 48
+0.0
+ 49
+0.0
+140
+0.0
+141
+0.0
+142
+1.0
+143
+1.0
+ 70
+688
+ 72
+0
+ 73
+0
+ 74
+5
+ 7
+
+ 75
+16
+147
+1.0
+148
+0.0
+149
+0.0
+100
+AcDbLayout
+ 1
+Layout1
+ 70
+1
+ 71
+1
+ 10
+0.0
+ 20
+0.0
+ 11
+420.0
+ 21
+297.0
+ 12
+0.0
+ 22
+0.0
+ 32
+0.0
+ 14
+100000000000000000000.0
+ 24
+100000000000000000000.0
+ 34
+100000000000000000000.0
+ 15
+-100000000000000000000.0
+ 25
+-100000000000000000000.0
+ 35
+-100000000000000000000.0
+146
+0.0
+ 13
+0.0
+ 23
+0.0
+ 33
+0.0
+ 16
+1.0
+ 26
+0.0
+ 36
+0.0
+ 17
+0.0
+ 27
+1.0
+ 37
+0.0
+ 76
+0
+330
+1B
+ 0
+LAYOUT
+ 5
+22
+100
+AcDbPlotSettings
+ 1
+
+ 2
+C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3
+ 4
+
+ 6
+
+ 40
+0.0
+ 41
+0.0
+ 42
+0.0
+ 43
+0.0
+ 44
+0.0
+ 45
+0.0
+ 46
+0.0
+ 47
+0.0
+ 48
+0.0
+ 49
+0.0
+140
+0.0
+141
+0.0
+142
+1.0
+143
+1.0
+ 70
+1712
+ 72
+0
+ 73
+0
+ 74
+0
+ 7
+
+ 75
+0
+147
+1.0
+148
+0.0
+149
+0.0
+100
+AcDbLayout
+ 1
+Model
+ 70
+1
+ 71
+0
+ 10
+0.0
+ 20
+0.0
+ 11
+12.0
+ 21
+9.0
+ 12
+0.0
+ 22
+0.0
+ 32
+0.0
+ 14
+0.0
+ 24
+0.0
+ 34
+0.0
+ 15
+0.0
+ 25
+0.0
+ 35
+0.0
+146
+0.0
+ 13
+0.0
+ 23
+0.0
+ 33
+0.0
+ 16
+1.0
+ 26
+0.0
+ 36
+0.0
+ 17
+0.0
+ 27
+1.0
+ 37
+0.0
+ 76
+0
+330
+1F
+ 0
+LAYOUT
+ 5
+26
+100
+AcDbPlotSettings
+ 1
+
+ 2
+C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3
+ 4
+
+ 6
+
+ 40
+0.0
+ 41
+0.0
+ 42
+0.0
+ 43
+0.0
+ 44
+0.0
+ 45
+0.0
+ 46
+0.0
+ 47
+0.0
+ 48
+0.0
+ 49
+0.0
+140
+0.0
+141
+0.0
+142
+1.0
+143
+1.0
+ 70
+688
+ 72
+0
+ 73
+0
+ 74
+5
+ 7
+
+ 75
+16
+147
+1.0
+148
+0.0
+149
+0.0
+100
+AcDbLayout
+ 1
+Layout2
+ 70
+1
+ 71
+2
+ 10
+0.0
+ 20
+0.0
+ 11
+12.0
+ 21
+9.0
+ 12
+0.0
+ 22
+0.0
+ 32
+0.0
+ 14
+0.0
+ 24
+0.0
+ 34
+0.0
+ 15
+0.0
+ 25
+0.0
+ 35
+0.0
+146
+0.0
+ 13
+0.0
+ 23
+0.0
+ 33
+0.0
+ 16
+1.0
+ 26
+0.0
+ 36
+0.0
+ 17
+0.0
+ 27
+1.0
+ 37
+0.0
+ 76
+0
+330
+23
+ 0
+DICTIONARY
+ 5
+6F
+100
+AcDbDictionary
+281
+1
+ 3
+DIMASSOC
+350
+71
+ 3
+HIDETEXT
+350
+70
+ 0
+DICTIONARYVAR
+ 5
+70
+100
+DictionaryVariables
+280
+0
+ 1
+2
+ 0
+DICTIONARYVAR
+ 5
+71
+100
+DictionaryVariables
+280
+0
+ 1
+1
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/testdata/transform-insert.scad b/testdata/transform-insert.scad
new file mode 100644
index 0000000..1237bb2
--- /dev/null
+++ b/testdata/transform-insert.scad
@@ -0,0 +1 @@
+import_dxf("transform-insert.dxf");
contact: Jan Huwald // Impressum