Graft pcb-tools-extension master onto gerbonara main
This commit is contained in:
commit
889ea37d9b
103 changed files with 107700 additions and 2 deletions
|
|
@ -49,5 +49,3 @@ nc_drill.render(ctx, 'composite.svg')
|
|||
---
|
||||
|
||||
Made with ❤️ and 🐍.
|
||||
=======
|
||||
pcb-tools
|
||||
|
|
|
|||
74
examples/genimage.py
Executable file
74
examples/genimage.py
Executable file
|
|
@ -0,0 +1,74 @@
|
|||
#!/usr/bin/env python
|
||||
import sys, os
|
||||
from gerber import load_layer
|
||||
from gerber.render import RenderSettings, theme
|
||||
from gerber.render.cairo_backend import GerberCairoContext
|
||||
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
|
||||
def putstr(text):
|
||||
sys.stdout.write(text)
|
||||
sys.stdout.flush()
|
||||
|
||||
putstr('loading ')
|
||||
copper = load_layer('outputs/panelized.GTL')
|
||||
putstr('.')
|
||||
mask = load_layer('outputs/panelized.GTS')
|
||||
putstr('.')
|
||||
silk = load_layer('outputs/panelized.GTO')
|
||||
putstr('.')
|
||||
drill = load_layer('outputs/panelized.TXT')
|
||||
putstr('.')
|
||||
outline = load_layer('outputs/panelized-fill.GML')
|
||||
putstr('. end\n')
|
||||
|
||||
putstr('drawing ')
|
||||
ctx = GerberCairoContext(scale=20)
|
||||
putstr('.')
|
||||
|
||||
metal_settings = RenderSettings(color=(30.0/255.0, 119.0/255.0, 93/255.0))
|
||||
bg_settings = RenderSettings(color=(30.0/300.0, 110.0/300.0, 93/300.0))
|
||||
ctx.render_layer(copper, settings=metal_settings, bgsettings=bg_settings)
|
||||
putstr('.')
|
||||
|
||||
copper_settings = RenderSettings(color=(0.7*1.2, 0.5*1.2, 0.1*1.2))
|
||||
ctx.render_layer(mask, settings=copper_settings)
|
||||
putstr('.')
|
||||
|
||||
our_settings = RenderSettings(color=theme.COLORS['white'], alpha=0.80)
|
||||
ctx.render_layer(silk, settings=our_settings)
|
||||
putstr('.')
|
||||
|
||||
ctx.render_layer(outline)
|
||||
putstr('.')
|
||||
ctx.render_layer(drill)
|
||||
putstr('. end\n')
|
||||
|
||||
putstr('dumping ... ')
|
||||
ctx.dump('outputs/board-top.png')
|
||||
putstr('end \n')
|
||||
|
||||
ctx.clear()
|
||||
putstr('loading bottom ')
|
||||
copper = load_layer('outputs/panelized.GBL')
|
||||
putstr('.')
|
||||
mask = load_layer('outputs/panelized.GBS')
|
||||
putstr('.')
|
||||
silk = load_layer('outputs/panelized.GBO')
|
||||
putstr('. end\n')
|
||||
|
||||
putstr('drawing bottom ')
|
||||
ctx.render_layer(copper, settings=metal_settings, bgsettings=bg_settings)
|
||||
putstr('.')
|
||||
ctx.render_layer(mask, settings=copper_settings)
|
||||
putstr('.')
|
||||
ctx.render_layer(silk, settings=our_settings)
|
||||
putstr('.')
|
||||
ctx.render_layer(outline)
|
||||
putstr('.')
|
||||
ctx.render_layer(drill)
|
||||
putstr('. end\n')
|
||||
|
||||
putstr('dumping bottom ...')
|
||||
ctx.dump('outputs/board-bottom.png')
|
||||
putstr(' end\n')
|
||||
696
examples/inputs/mousebites.dxf
Normal file
696
examples/inputs/mousebites.dxf
Normal file
|
|
@ -0,0 +1,696 @@
|
|||
0
|
||||
SECTION
|
||||
2
|
||||
HEADER
|
||||
9
|
||||
$INSUNITS
|
||||
70
|
||||
4
|
||||
9
|
||||
$ACADVER
|
||||
1
|
||||
AC1014
|
||||
9
|
||||
$HANDSEED
|
||||
5
|
||||
FFFF
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
TABLES
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
VPORT
|
||||
5
|
||||
8
|
||||
100
|
||||
AcDbSymbolTable
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
LTYPE
|
||||
5
|
||||
5
|
||||
100
|
||||
AcDbSymbolTable
|
||||
0
|
||||
LTYPE
|
||||
5
|
||||
14
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbLinetypeTableRecord
|
||||
2
|
||||
BYBLOCK
|
||||
70
|
||||
0
|
||||
0
|
||||
LTYPE
|
||||
5
|
||||
15
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbLinetypeTableRecord
|
||||
2
|
||||
BYLAYER
|
||||
70
|
||||
0
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
LAYER
|
||||
5
|
||||
2
|
||||
100
|
||||
AcDbSymbolTable
|
||||
70
|
||||
2
|
||||
0
|
||||
LAYER
|
||||
5
|
||||
50
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbLayerTableRecord
|
||||
2
|
||||
0
|
||||
70
|
||||
0
|
||||
6
|
||||
CONTINUOUS
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
STYLE
|
||||
5
|
||||
3
|
||||
100
|
||||
AcDbSymbolTable
|
||||
70
|
||||
1
|
||||
0
|
||||
STYLE
|
||||
5
|
||||
11
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbTextStyleTableRecord
|
||||
2
|
||||
STANDARD
|
||||
70
|
||||
0
|
||||
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
|
||||
2
|
||||
0
|
||||
APPID
|
||||
5
|
||||
12
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbRegAppTableRecord
|
||||
2
|
||||
ACAD
|
||||
70
|
||||
0
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
DIMSTYLE
|
||||
5
|
||||
A
|
||||
100
|
||||
AcDbSymbolTable
|
||||
70
|
||||
1
|
||||
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
|
||||
0
|
||||
BLOCK_RECORD
|
||||
5
|
||||
1B
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbBlockTableRecord
|
||||
2
|
||||
*PAPER_SPACE
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
BLOCKS
|
||||
0
|
||||
BLOCK
|
||||
5
|
||||
20
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockBegin
|
||||
2
|
||||
*MODEL_SPACE
|
||||
0
|
||||
ENDBLK
|
||||
5
|
||||
21
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockEnd
|
||||
0
|
||||
BLOCK
|
||||
5
|
||||
1C
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockBegin
|
||||
2
|
||||
*PAPER_SPACE
|
||||
0
|
||||
ENDBLK
|
||||
5
|
||||
1D
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockEnd
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
ENTITIES
|
||||
0
|
||||
LINE
|
||||
5
|
||||
100
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
21
|
||||
20
|
||||
43.050000000000004
|
||||
30
|
||||
0
|
||||
11
|
||||
44
|
||||
21
|
||||
43.050000000000004
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
101
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
1.9000000000000004
|
||||
20
|
||||
57.250000000000007
|
||||
30
|
||||
0
|
||||
11
|
||||
12.000000000000002
|
||||
21
|
||||
57.250000000000007
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
102
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
1.9000000000000004
|
||||
20
|
||||
59.75
|
||||
30
|
||||
0
|
||||
11
|
||||
13.5
|
||||
21
|
||||
59.75
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
103
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
22.200000000000003
|
||||
20
|
||||
59.75
|
||||
30
|
||||
0
|
||||
11
|
||||
33.199999999999996
|
||||
21
|
||||
59.75
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
104
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
41.5
|
||||
20
|
||||
59.75
|
||||
30
|
||||
0
|
||||
11
|
||||
53.200000000000003
|
||||
21
|
||||
59.75
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
105
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
81.970000000000027
|
||||
20
|
||||
88.5
|
||||
30
|
||||
0
|
||||
11
|
||||
81.970000000000013
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
106
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
78.250000000000043
|
||||
20
|
||||
88.499999999999972
|
||||
30
|
||||
0
|
||||
11
|
||||
78.250000000000028
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
107
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
59.970000000000006
|
||||
20
|
||||
88.499999999999972
|
||||
30
|
||||
0
|
||||
11
|
||||
59.970000000000013
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
108
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
55.650000000000013
|
||||
20
|
||||
88.499999999999972
|
||||
30
|
||||
0
|
||||
11
|
||||
55.650000000000006
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
109
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
39.749999999999993
|
||||
20
|
||||
88.499999999999972
|
||||
30
|
||||
0
|
||||
11
|
||||
39.75
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
110
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
35.650000000000006
|
||||
20
|
||||
88.499999999999972
|
||||
30
|
||||
0
|
||||
11
|
||||
35.650000000000006
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
111
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
19.749999999999993
|
||||
20
|
||||
88.499999999999972
|
||||
30
|
||||
0
|
||||
11
|
||||
19.749999999999996
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
112
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
15.650000000000009
|
||||
20
|
||||
88.499999999999972
|
||||
30
|
||||
0
|
||||
11
|
||||
15.650000000000004
|
||||
21
|
||||
71.5
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
113
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
65.25
|
||||
20
|
||||
16.500250410747213
|
||||
30
|
||||
0
|
||||
11
|
||||
65.25
|
||||
21
|
||||
3.5002504107472134
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
114
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
79.752051115713613
|
||||
20
|
||||
9.0215259002820929
|
||||
30
|
||||
0
|
||||
11
|
||||
92.554551904872312
|
||||
21
|
||||
11.278952209952195
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
115
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
12.25
|
||||
20
|
||||
47.094063415349972
|
||||
30
|
||||
0
|
||||
11
|
||||
12.25
|
||||
21
|
||||
55.520659651813133
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
116
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
21.5
|
||||
20
|
||||
22.25
|
||||
30
|
||||
0
|
||||
11
|
||||
43.5
|
||||
21
|
||||
22.249999999999996
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
117
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
21.5
|
||||
20
|
||||
20.550000000000001
|
||||
30
|
||||
0
|
||||
11
|
||||
43.5
|
||||
21
|
||||
20.550000000000004
|
||||
31
|
||||
0
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
OBJECTS
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
C
|
||||
100
|
||||
AcDbDictionary
|
||||
3
|
||||
ACAD_GROUP
|
||||
350
|
||||
D
|
||||
3
|
||||
ACAD_MLINESTYLE
|
||||
350
|
||||
17
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
D
|
||||
100
|
||||
AcDbDictionary
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
1A
|
||||
330
|
||||
C
|
||||
100
|
||||
AcDbDictionary
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
17
|
||||
100
|
||||
AcDbDictionary
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
EOF
|
||||
4244
examples/inputs/outline.dxf
Normal file
4244
examples/inputs/outline.dxf
Normal file
File diff suppressed because it is too large
Load diff
3976
examples/inputs/rcstick-f-small.GBL
Normal file
3976
examples/inputs/rcstick-f-small.GBL
Normal file
File diff suppressed because it is too large
Load diff
2334
examples/inputs/rcstick-f-small.GBO
Normal file
2334
examples/inputs/rcstick-f-small.GBO
Normal file
File diff suppressed because it is too large
Load diff
58
examples/inputs/rcstick-f-small.GBP
Normal file
58
examples/inputs/rcstick-f-small.GBP
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.700000X0.600000*%
|
||||
%ADD11R,0.600000X0.700000*%
|
||||
%ADD12C,1.900000*%
|
||||
%ADD13R,1.400000X1.000000*%
|
||||
%ADD14R,1.900000X1.200000*%
|
||||
|
||||
|
||||
D10*
|
||||
X114300Y73240D03*
|
||||
X114300Y84240D03*
|
||||
D11*
|
||||
X61380Y214630D03*
|
||||
X50380Y214630D03*
|
||||
D10*
|
||||
X78740Y235800D03*
|
||||
X78740Y246800D03*
|
||||
D11*
|
||||
X96100Y260350D03*
|
||||
X107100Y260350D03*
|
||||
D10*
|
||||
X64770Y77890D03*
|
||||
X64770Y66890D03*
|
||||
X106680Y151550D03*
|
||||
X106680Y140550D03*
|
||||
X59690Y151550D03*
|
||||
X59690Y140550D03*
|
||||
X49530Y151550D03*
|
||||
X49530Y140550D03*
|
||||
X138430Y206590D03*
|
||||
X138430Y217590D03*
|
||||
D11*
|
||||
X104990Y232410D03*
|
||||
X115990Y232410D03*
|
||||
D12*
|
||||
X18500Y34350D02*
|
||||
X18500Y19350D01*
|
||||
X135500Y19350D02*
|
||||
X135500Y34350D01*
|
||||
D13*
|
||||
X101170Y72390D03*
|
||||
X79170Y81890D03*
|
||||
X79170Y62890D03*
|
||||
D14*
|
||||
X123090Y204090D03*
|
||||
X97890Y204090D03*
|
||||
X97890Y220090D03*
|
||||
X123090Y220090D03*
|
||||
M02*
|
||||
83
examples/inputs/rcstick-f-small.GBS
Normal file
83
examples/inputs/rcstick-f-small.GBS
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.700000X0.600000*%
|
||||
%ADD11R,0.600000X0.700000*%
|
||||
%ADD12C,1.420000*%
|
||||
%ADD13C,1.900000*%
|
||||
%ADD14C,1.200000*%
|
||||
%ADD15C,0.812800*%
|
||||
%ADD16R,1.400000X1.000000*%
|
||||
%ADD17R,1.900000X1.200000*%
|
||||
%ADD18C,1.400000*%
|
||||
|
||||
|
||||
D10*
|
||||
X114300Y73240D03*
|
||||
X114300Y84240D03*
|
||||
D11*
|
||||
X61380Y214630D03*
|
||||
X50380Y214630D03*
|
||||
D10*
|
||||
X78740Y235800D03*
|
||||
X78740Y246800D03*
|
||||
D11*
|
||||
X96100Y260350D03*
|
||||
X107100Y260350D03*
|
||||
D10*
|
||||
X64770Y77890D03*
|
||||
X64770Y66890D03*
|
||||
X106680Y151550D03*
|
||||
X106680Y140550D03*
|
||||
X59690Y151550D03*
|
||||
X59690Y140550D03*
|
||||
X49530Y151550D03*
|
||||
X49530Y140550D03*
|
||||
X138430Y206590D03*
|
||||
X138430Y217590D03*
|
||||
D11*
|
||||
X104990Y232410D03*
|
||||
X115990Y232410D03*
|
||||
D12*
|
||||
X112000Y47850D03*
|
||||
X87000Y47850D03*
|
||||
X67000Y47850D03*
|
||||
X42000Y47850D03*
|
||||
D13*
|
||||
X18500Y34350D02*
|
||||
X18500Y19350D01*
|
||||
X135500Y19350D02*
|
||||
X135500Y34350D01*
|
||||
D14*
|
||||
X54500Y26850D03*
|
||||
X99500Y26850D03*
|
||||
D15*
|
||||
X24684Y62530D02*
|
||||
X16556Y62530D01*
|
||||
X16556Y75030D02*
|
||||
X24684Y75030D01*
|
||||
X24684Y87530D02*
|
||||
X16556Y87530D01*
|
||||
X16556Y100030D02*
|
||||
X24684Y100030D01*
|
||||
D14*
|
||||
X55880Y255270D03*
|
||||
D16*
|
||||
X101170Y72390D03*
|
||||
X79170Y81890D03*
|
||||
X79170Y62890D03*
|
||||
D17*
|
||||
X123090Y204090D03*
|
||||
X97890Y204090D03*
|
||||
X97890Y220090D03*
|
||||
X123090Y220090D03*
|
||||
D18*
|
||||
X77470Y222250D03*
|
||||
M02*
|
||||
1513
examples/inputs/rcstick-f-small.GML
Normal file
1513
examples/inputs/rcstick-f-small.GML
Normal file
File diff suppressed because it is too large
Load diff
6525
examples/inputs/rcstick-f-small.GTL
Normal file
6525
examples/inputs/rcstick-f-small.GTL
Normal file
File diff suppressed because it is too large
Load diff
6614
examples/inputs/rcstick-f-small.GTO
Normal file
6614
examples/inputs/rcstick-f-small.GTO
Normal file
File diff suppressed because it is too large
Load diff
339
examples/inputs/rcstick-f-small.GTP
Normal file
339
examples/inputs/rcstick-f-small.GTP
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11R,0.700000X0.600000*%
|
||||
%ADD12C,1.900000*%
|
||||
%ADD13R,1.050000X1.080000*%
|
||||
%ADD14R,1.450000X0.650000*%
|
||||
%ADD15R,0.540000X1.400000*%
|
||||
%ADD16R,0.280000X1.260000*%
|
||||
%ADD17R,1.260000X0.280000*%
|
||||
%ADD18R,2.400000X2.400000*%
|
||||
%ADD19R,1.200000X1.900000*%
|
||||
|
||||
|
||||
D10*
|
||||
X124040Y196850D03*
|
||||
X135040Y196850D03*
|
||||
X19470Y256540D03*
|
||||
X8470Y256540D03*
|
||||
X35980Y288290D03*
|
||||
X24980Y288290D03*
|
||||
X75780Y281940D03*
|
||||
X86780Y281940D03*
|
||||
X35980Y298450D03*
|
||||
X24980Y298450D03*
|
||||
X108800Y283210D03*
|
||||
X119800Y283210D03*
|
||||
D11*
|
||||
X134620Y248500D03*
|
||||
X134620Y259500D03*
|
||||
D10*
|
||||
X55460Y314960D03*
|
||||
X66460Y314960D03*
|
||||
X55460Y304800D03*
|
||||
X66460Y304800D03*
|
||||
X87210Y294640D03*
|
||||
X98210Y294640D03*
|
||||
X87210Y314960D03*
|
||||
X98210Y314960D03*
|
||||
X118960Y299720D03*
|
||||
X129960Y299720D03*
|
||||
X129960Y320040D03*
|
||||
X118960Y320040D03*
|
||||
X124040Y207010D03*
|
||||
X135040Y207010D03*
|
||||
X124040Y217170D03*
|
||||
X135040Y217170D03*
|
||||
D12*
|
||||
X18500Y34350D02*
|
||||
X18500Y19350D01*
|
||||
X135500Y19350D02*
|
||||
X135500Y34350D01*
|
||||
D10*
|
||||
X98210Y325120D03*
|
||||
X87210Y325120D03*
|
||||
X98210Y304800D03*
|
||||
X87210Y304800D03*
|
||||
X129960Y309880D03*
|
||||
X118960Y309880D03*
|
||||
D13*
|
||||
X29070Y214630D03*
|
||||
X11570Y214630D03*
|
||||
D10*
|
||||
X138850Y105410D03*
|
||||
X127850Y105410D03*
|
||||
X8470Y266700D03*
|
||||
X19470Y266700D03*
|
||||
X28360Y200660D03*
|
||||
X17360Y200660D03*
|
||||
D14*
|
||||
X95360Y84410D03*
|
||||
X140860Y84410D03*
|
||||
X95360Y62910D03*
|
||||
X140860Y62910D03*
|
||||
D15*
|
||||
G36*
|
||||
X132012Y174172D02*
|
||||
X135830Y170354D01*
|
||||
X125932Y160456D01*
|
||||
X122114Y164274D01*
|
||||
X132012Y174172D01*
|
||||
G37*
|
||||
G36*
|
||||
X126355Y179829D02*
|
||||
X130173Y176011D01*
|
||||
X120275Y166113D01*
|
||||
X116457Y169931D01*
|
||||
X126355Y179829D01*
|
||||
G37*
|
||||
G36*
|
||||
X120699Y185486D02*
|
||||
X124517Y181668D01*
|
||||
X114619Y171770D01*
|
||||
X110801Y175588D01*
|
||||
X120699Y185486D01*
|
||||
G37*
|
||||
G36*
|
||||
X115042Y191143D02*
|
||||
X118860Y187325D01*
|
||||
X108962Y177427D01*
|
||||
X105144Y181245D01*
|
||||
X115042Y191143D01*
|
||||
G37*
|
||||
G36*
|
||||
X109385Y196800D02*
|
||||
X113203Y192982D01*
|
||||
X103305Y183084D01*
|
||||
X99487Y186902D01*
|
||||
X109385Y196800D01*
|
||||
G37*
|
||||
G36*
|
||||
X103799Y202386D02*
|
||||
X107617Y198568D01*
|
||||
X97719Y188670D01*
|
||||
X93901Y192488D01*
|
||||
X103799Y202386D01*
|
||||
G37*
|
||||
G36*
|
||||
X98142Y208043D02*
|
||||
X101960Y204225D01*
|
||||
X92062Y194327D01*
|
||||
X88244Y198145D01*
|
||||
X98142Y208043D01*
|
||||
G37*
|
||||
G36*
|
||||
X92485Y213700D02*
|
||||
X96303Y209882D01*
|
||||
X86405Y199984D01*
|
||||
X82587Y203802D01*
|
||||
X92485Y213700D01*
|
||||
G37*
|
||||
G36*
|
||||
X57768Y209952D02*
|
||||
X61586Y213770D01*
|
||||
X71484Y203872D01*
|
||||
X67666Y200054D01*
|
||||
X57768Y209952D01*
|
||||
G37*
|
||||
G36*
|
||||
X52111Y204295D02*
|
||||
X55929Y208113D01*
|
||||
X65827Y198215D01*
|
||||
X62009Y194397D01*
|
||||
X52111Y204295D01*
|
||||
G37*
|
||||
G36*
|
||||
X46454Y198639D02*
|
||||
X50272Y202457D01*
|
||||
X60170Y192559D01*
|
||||
X56352Y188741D01*
|
||||
X46454Y198639D01*
|
||||
G37*
|
||||
G36*
|
||||
X40797Y192982D02*
|
||||
X44615Y196800D01*
|
||||
X54513Y186902D01*
|
||||
X50695Y183084D01*
|
||||
X40797Y192982D01*
|
||||
G37*
|
||||
G36*
|
||||
X35140Y187325D02*
|
||||
X38958Y191143D01*
|
||||
X48856Y181245D01*
|
||||
X45038Y177427D01*
|
||||
X35140Y187325D01*
|
||||
G37*
|
||||
G36*
|
||||
X29483Y181668D02*
|
||||
X33301Y185486D01*
|
||||
X43199Y175588D01*
|
||||
X39381Y171770D01*
|
||||
X29483Y181668D01*
|
||||
G37*
|
||||
G36*
|
||||
X23827Y176011D02*
|
||||
X27645Y179829D01*
|
||||
X37543Y169931D01*
|
||||
X33725Y166113D01*
|
||||
X23827Y176011D01*
|
||||
G37*
|
||||
G36*
|
||||
X18170Y170354D02*
|
||||
X21988Y174172D01*
|
||||
X31886Y164274D01*
|
||||
X28068Y160456D01*
|
||||
X18170Y170354D01*
|
||||
G37*
|
||||
G36*
|
||||
X21988Y135708D02*
|
||||
X18170Y139526D01*
|
||||
X28068Y149424D01*
|
||||
X31886Y145606D01*
|
||||
X21988Y135708D01*
|
||||
G37*
|
||||
G36*
|
||||
X27645Y130051D02*
|
||||
X23827Y133869D01*
|
||||
X33725Y143767D01*
|
||||
X37543Y139949D01*
|
||||
X27645Y130051D01*
|
||||
G37*
|
||||
G36*
|
||||
X33301Y124394D02*
|
||||
X29483Y128212D01*
|
||||
X39381Y138110D01*
|
||||
X43199Y134292D01*
|
||||
X33301Y124394D01*
|
||||
G37*
|
||||
G36*
|
||||
X38958Y118737D02*
|
||||
X35140Y122555D01*
|
||||
X45038Y132453D01*
|
||||
X48856Y128635D01*
|
||||
X38958Y118737D01*
|
||||
G37*
|
||||
G36*
|
||||
X44615Y113080D02*
|
||||
X40797Y116898D01*
|
||||
X50695Y126796D01*
|
||||
X54513Y122978D01*
|
||||
X44615Y113080D01*
|
||||
G37*
|
||||
G36*
|
||||
X50272Y107423D02*
|
||||
X46454Y111241D01*
|
||||
X56352Y121139D01*
|
||||
X60170Y117321D01*
|
||||
X50272Y107423D01*
|
||||
G37*
|
||||
G36*
|
||||
X55929Y101767D02*
|
||||
X52111Y105585D01*
|
||||
X62009Y115483D01*
|
||||
X65827Y111665D01*
|
||||
X55929Y101767D01*
|
||||
G37*
|
||||
G36*
|
||||
X61586Y96110D02*
|
||||
X57768Y99928D01*
|
||||
X67666Y109826D01*
|
||||
X71484Y106008D01*
|
||||
X61586Y96110D01*
|
||||
G37*
|
||||
G36*
|
||||
X96232Y99928D02*
|
||||
X92414Y96110D01*
|
||||
X82516Y106008D01*
|
||||
X86334Y109826D01*
|
||||
X96232Y99928D01*
|
||||
G37*
|
||||
G36*
|
||||
X101889Y105585D02*
|
||||
X98071Y101767D01*
|
||||
X88173Y111665D01*
|
||||
X91991Y115483D01*
|
||||
X101889Y105585D01*
|
||||
G37*
|
||||
G36*
|
||||
X107546Y111241D02*
|
||||
X103728Y107423D01*
|
||||
X93830Y117321D01*
|
||||
X97648Y121139D01*
|
||||
X107546Y111241D01*
|
||||
G37*
|
||||
G36*
|
||||
X113203Y116898D02*
|
||||
X109385Y113080D01*
|
||||
X99487Y122978D01*
|
||||
X103305Y126796D01*
|
||||
X113203Y116898D01*
|
||||
G37*
|
||||
G36*
|
||||
X118860Y122555D02*
|
||||
X115042Y118737D01*
|
||||
X105144Y128635D01*
|
||||
X108962Y132453D01*
|
||||
X118860Y122555D01*
|
||||
G37*
|
||||
G36*
|
||||
X124517Y128212D02*
|
||||
X120699Y124394D01*
|
||||
X110801Y134292D01*
|
||||
X114619Y138110D01*
|
||||
X124517Y128212D01*
|
||||
G37*
|
||||
G36*
|
||||
X130173Y133869D02*
|
||||
X126355Y130051D01*
|
||||
X116457Y139949D01*
|
||||
X120275Y143767D01*
|
||||
X130173Y133869D01*
|
||||
G37*
|
||||
G36*
|
||||
X135830Y139526D02*
|
||||
X132012Y135708D01*
|
||||
X122114Y145606D01*
|
||||
X125932Y149424D01*
|
||||
X135830Y139526D01*
|
||||
G37*
|
||||
D16*
|
||||
X45880Y234970D03*
|
||||
X50880Y234970D03*
|
||||
X55880Y234970D03*
|
||||
X60880Y234970D03*
|
||||
X65880Y234970D03*
|
||||
D17*
|
||||
X76180Y245270D03*
|
||||
X76180Y250270D03*
|
||||
X76180Y255270D03*
|
||||
X76180Y260270D03*
|
||||
X76180Y265270D03*
|
||||
D16*
|
||||
X65880Y275570D03*
|
||||
X60880Y275570D03*
|
||||
X55880Y275570D03*
|
||||
X50880Y275570D03*
|
||||
X45880Y275570D03*
|
||||
D17*
|
||||
X35580Y265270D03*
|
||||
X35580Y260270D03*
|
||||
X35580Y255270D03*
|
||||
X35580Y250270D03*
|
||||
X35580Y245270D03*
|
||||
D18*
|
||||
X55880Y255270D03*
|
||||
D19*
|
||||
X106300Y266600D03*
|
||||
X106300Y241400D03*
|
||||
X122300Y241400D03*
|
||||
X122300Y266600D03*
|
||||
M02*
|
||||
364
examples/inputs/rcstick-f-small.GTS
Normal file
364
examples/inputs/rcstick-f-small.GTS
Normal file
|
|
@ -0,0 +1,364 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11R,0.700000X0.600000*%
|
||||
%ADD12C,1.420000*%
|
||||
%ADD13C,1.900000*%
|
||||
%ADD14C,1.200000*%
|
||||
%ADD15C,0.812800*%
|
||||
%ADD16R,1.050000X1.080000*%
|
||||
%ADD17R,1.450000X0.650000*%
|
||||
%ADD18R,0.540000X1.400000*%
|
||||
%ADD19R,0.280000X1.260000*%
|
||||
%ADD20R,1.260000X0.280000*%
|
||||
%ADD21R,2.400000X2.400000*%
|
||||
%ADD22R,1.200000X1.900000*%
|
||||
%ADD23C,1.400000*%
|
||||
|
||||
|
||||
D10*
|
||||
X124040Y196850D03*
|
||||
X135040Y196850D03*
|
||||
X19470Y256540D03*
|
||||
X8470Y256540D03*
|
||||
X35980Y288290D03*
|
||||
X24980Y288290D03*
|
||||
X75780Y281940D03*
|
||||
X86780Y281940D03*
|
||||
X35980Y298450D03*
|
||||
X24980Y298450D03*
|
||||
X108800Y283210D03*
|
||||
X119800Y283210D03*
|
||||
D11*
|
||||
X134620Y248500D03*
|
||||
X134620Y259500D03*
|
||||
D10*
|
||||
X55460Y314960D03*
|
||||
X66460Y314960D03*
|
||||
X55460Y304800D03*
|
||||
X66460Y304800D03*
|
||||
X87210Y294640D03*
|
||||
X98210Y294640D03*
|
||||
X87210Y314960D03*
|
||||
X98210Y314960D03*
|
||||
X118960Y299720D03*
|
||||
X129960Y299720D03*
|
||||
X129960Y320040D03*
|
||||
X118960Y320040D03*
|
||||
X124040Y207010D03*
|
||||
X135040Y207010D03*
|
||||
X124040Y217170D03*
|
||||
X135040Y217170D03*
|
||||
D12*
|
||||
X112000Y47850D03*
|
||||
X87000Y47850D03*
|
||||
X67000Y47850D03*
|
||||
X42000Y47850D03*
|
||||
D13*
|
||||
X18500Y34350D02*
|
||||
X18500Y19350D01*
|
||||
X135500Y19350D02*
|
||||
X135500Y34350D01*
|
||||
D14*
|
||||
X54500Y26850D03*
|
||||
X99500Y26850D03*
|
||||
D15*
|
||||
X24684Y62530D02*
|
||||
X16556Y62530D01*
|
||||
X16556Y75030D02*
|
||||
X24684Y75030D01*
|
||||
X24684Y87530D02*
|
||||
X16556Y87530D01*
|
||||
X16556Y100030D02*
|
||||
X24684Y100030D01*
|
||||
D10*
|
||||
X98210Y325120D03*
|
||||
X87210Y325120D03*
|
||||
X98210Y304800D03*
|
||||
X87210Y304800D03*
|
||||
X129960Y309880D03*
|
||||
X118960Y309880D03*
|
||||
D16*
|
||||
X29070Y214630D03*
|
||||
X11570Y214630D03*
|
||||
D10*
|
||||
X138850Y105410D03*
|
||||
X127850Y105410D03*
|
||||
X8470Y266700D03*
|
||||
X19470Y266700D03*
|
||||
X28360Y200660D03*
|
||||
X17360Y200660D03*
|
||||
D17*
|
||||
X95360Y84410D03*
|
||||
X140860Y84410D03*
|
||||
X95360Y62910D03*
|
||||
X140860Y62910D03*
|
||||
D18*
|
||||
G36*
|
||||
X132012Y174172D02*
|
||||
X135830Y170354D01*
|
||||
X125932Y160456D01*
|
||||
X122114Y164274D01*
|
||||
X132012Y174172D01*
|
||||
G37*
|
||||
G36*
|
||||
X126355Y179829D02*
|
||||
X130173Y176011D01*
|
||||
X120275Y166113D01*
|
||||
X116457Y169931D01*
|
||||
X126355Y179829D01*
|
||||
G37*
|
||||
G36*
|
||||
X120699Y185486D02*
|
||||
X124517Y181668D01*
|
||||
X114619Y171770D01*
|
||||
X110801Y175588D01*
|
||||
X120699Y185486D01*
|
||||
G37*
|
||||
G36*
|
||||
X115042Y191143D02*
|
||||
X118860Y187325D01*
|
||||
X108962Y177427D01*
|
||||
X105144Y181245D01*
|
||||
X115042Y191143D01*
|
||||
G37*
|
||||
G36*
|
||||
X109385Y196800D02*
|
||||
X113203Y192982D01*
|
||||
X103305Y183084D01*
|
||||
X99487Y186902D01*
|
||||
X109385Y196800D01*
|
||||
G37*
|
||||
G36*
|
||||
X103799Y202386D02*
|
||||
X107617Y198568D01*
|
||||
X97719Y188670D01*
|
||||
X93901Y192488D01*
|
||||
X103799Y202386D01*
|
||||
G37*
|
||||
G36*
|
||||
X98142Y208043D02*
|
||||
X101960Y204225D01*
|
||||
X92062Y194327D01*
|
||||
X88244Y198145D01*
|
||||
X98142Y208043D01*
|
||||
G37*
|
||||
G36*
|
||||
X92485Y213700D02*
|
||||
X96303Y209882D01*
|
||||
X86405Y199984D01*
|
||||
X82587Y203802D01*
|
||||
X92485Y213700D01*
|
||||
G37*
|
||||
G36*
|
||||
X57768Y209952D02*
|
||||
X61586Y213770D01*
|
||||
X71484Y203872D01*
|
||||
X67666Y200054D01*
|
||||
X57768Y209952D01*
|
||||
G37*
|
||||
G36*
|
||||
X52111Y204295D02*
|
||||
X55929Y208113D01*
|
||||
X65827Y198215D01*
|
||||
X62009Y194397D01*
|
||||
X52111Y204295D01*
|
||||
G37*
|
||||
G36*
|
||||
X46454Y198639D02*
|
||||
X50272Y202457D01*
|
||||
X60170Y192559D01*
|
||||
X56352Y188741D01*
|
||||
X46454Y198639D01*
|
||||
G37*
|
||||
G36*
|
||||
X40797Y192982D02*
|
||||
X44615Y196800D01*
|
||||
X54513Y186902D01*
|
||||
X50695Y183084D01*
|
||||
X40797Y192982D01*
|
||||
G37*
|
||||
G36*
|
||||
X35140Y187325D02*
|
||||
X38958Y191143D01*
|
||||
X48856Y181245D01*
|
||||
X45038Y177427D01*
|
||||
X35140Y187325D01*
|
||||
G37*
|
||||
G36*
|
||||
X29483Y181668D02*
|
||||
X33301Y185486D01*
|
||||
X43199Y175588D01*
|
||||
X39381Y171770D01*
|
||||
X29483Y181668D01*
|
||||
G37*
|
||||
G36*
|
||||
X23827Y176011D02*
|
||||
X27645Y179829D01*
|
||||
X37543Y169931D01*
|
||||
X33725Y166113D01*
|
||||
X23827Y176011D01*
|
||||
G37*
|
||||
G36*
|
||||
X18170Y170354D02*
|
||||
X21988Y174172D01*
|
||||
X31886Y164274D01*
|
||||
X28068Y160456D01*
|
||||
X18170Y170354D01*
|
||||
G37*
|
||||
G36*
|
||||
X21988Y135708D02*
|
||||
X18170Y139526D01*
|
||||
X28068Y149424D01*
|
||||
X31886Y145606D01*
|
||||
X21988Y135708D01*
|
||||
G37*
|
||||
G36*
|
||||
X27645Y130051D02*
|
||||
X23827Y133869D01*
|
||||
X33725Y143767D01*
|
||||
X37543Y139949D01*
|
||||
X27645Y130051D01*
|
||||
G37*
|
||||
G36*
|
||||
X33301Y124394D02*
|
||||
X29483Y128212D01*
|
||||
X39381Y138110D01*
|
||||
X43199Y134292D01*
|
||||
X33301Y124394D01*
|
||||
G37*
|
||||
G36*
|
||||
X38958Y118737D02*
|
||||
X35140Y122555D01*
|
||||
X45038Y132453D01*
|
||||
X48856Y128635D01*
|
||||
X38958Y118737D01*
|
||||
G37*
|
||||
G36*
|
||||
X44615Y113080D02*
|
||||
X40797Y116898D01*
|
||||
X50695Y126796D01*
|
||||
X54513Y122978D01*
|
||||
X44615Y113080D01*
|
||||
G37*
|
||||
G36*
|
||||
X50272Y107423D02*
|
||||
X46454Y111241D01*
|
||||
X56352Y121139D01*
|
||||
X60170Y117321D01*
|
||||
X50272Y107423D01*
|
||||
G37*
|
||||
G36*
|
||||
X55929Y101767D02*
|
||||
X52111Y105585D01*
|
||||
X62009Y115483D01*
|
||||
X65827Y111665D01*
|
||||
X55929Y101767D01*
|
||||
G37*
|
||||
G36*
|
||||
X61586Y96110D02*
|
||||
X57768Y99928D01*
|
||||
X67666Y109826D01*
|
||||
X71484Y106008D01*
|
||||
X61586Y96110D01*
|
||||
G37*
|
||||
G36*
|
||||
X96232Y99928D02*
|
||||
X92414Y96110D01*
|
||||
X82516Y106008D01*
|
||||
X86334Y109826D01*
|
||||
X96232Y99928D01*
|
||||
G37*
|
||||
G36*
|
||||
X101889Y105585D02*
|
||||
X98071Y101767D01*
|
||||
X88173Y111665D01*
|
||||
X91991Y115483D01*
|
||||
X101889Y105585D01*
|
||||
G37*
|
||||
G36*
|
||||
X107546Y111241D02*
|
||||
X103728Y107423D01*
|
||||
X93830Y117321D01*
|
||||
X97648Y121139D01*
|
||||
X107546Y111241D01*
|
||||
G37*
|
||||
G36*
|
||||
X113203Y116898D02*
|
||||
X109385Y113080D01*
|
||||
X99487Y122978D01*
|
||||
X103305Y126796D01*
|
||||
X113203Y116898D01*
|
||||
G37*
|
||||
G36*
|
||||
X118860Y122555D02*
|
||||
X115042Y118737D01*
|
||||
X105144Y128635D01*
|
||||
X108962Y132453D01*
|
||||
X118860Y122555D01*
|
||||
G37*
|
||||
G36*
|
||||
X124517Y128212D02*
|
||||
X120699Y124394D01*
|
||||
X110801Y134292D01*
|
||||
X114619Y138110D01*
|
||||
X124517Y128212D01*
|
||||
G37*
|
||||
G36*
|
||||
X130173Y133869D02*
|
||||
X126355Y130051D01*
|
||||
X116457Y139949D01*
|
||||
X120275Y143767D01*
|
||||
X130173Y133869D01*
|
||||
G37*
|
||||
G36*
|
||||
X135830Y139526D02*
|
||||
X132012Y135708D01*
|
||||
X122114Y145606D01*
|
||||
X125932Y149424D01*
|
||||
X135830Y139526D01*
|
||||
G37*
|
||||
D19*
|
||||
X45880Y234970D03*
|
||||
X50880Y234970D03*
|
||||
X55880Y234970D03*
|
||||
X60880Y234970D03*
|
||||
X65880Y234970D03*
|
||||
D20*
|
||||
X76180Y245270D03*
|
||||
X76180Y250270D03*
|
||||
X76180Y255270D03*
|
||||
X76180Y260270D03*
|
||||
X76180Y265270D03*
|
||||
D19*
|
||||
X65880Y275570D03*
|
||||
X60880Y275570D03*
|
||||
X55880Y275570D03*
|
||||
X50880Y275570D03*
|
||||
X45880Y275570D03*
|
||||
D20*
|
||||
X35580Y265270D03*
|
||||
X35580Y260270D03*
|
||||
X35580Y255270D03*
|
||||
X35580Y250270D03*
|
||||
X35580Y245270D03*
|
||||
D21*
|
||||
X55880Y255270D03*
|
||||
D14*
|
||||
X55880Y255270D03*
|
||||
D22*
|
||||
X106300Y266600D03*
|
||||
X106300Y241400D03*
|
||||
X122300Y241400D03*
|
||||
X122300Y266600D03*
|
||||
D23*
|
||||
X77470Y222250D03*
|
||||
M02*
|
||||
52
examples/inputs/rcstick-f-small.TXT
Normal file
52
examples/inputs/rcstick-f-small.TXT
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
M48
|
||||
;GenerationSoftware,Autodesk,EAGLE,9.3.0*%
|
||||
;CreationDate,2019-03-31T08:46:35Z*%
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T5C0.350
|
||||
T4C0.508
|
||||
T3C0.800
|
||||
T2C0.930
|
||||
T1C1.200
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T1
|
||||
X9950Y2685
|
||||
X5450Y2685
|
||||
T2
|
||||
X4200Y4785
|
||||
X6700Y4785
|
||||
X8700Y4785
|
||||
X11200Y4785
|
||||
T3
|
||||
X5588Y25527
|
||||
T4
|
||||
X2062Y10003
|
||||
X2062Y8753
|
||||
X2062Y7503
|
||||
X2062Y6253
|
||||
T5
|
||||
X4064Y27178
|
||||
X7112Y27178
|
||||
X8890Y26035
|
||||
X1651Y24892
|
||||
X6096Y22479
|
||||
X12700Y18796
|
||||
X13335Y18161
|
||||
X7747Y22225
|
||||
X7112Y23907
|
||||
X7747Y9017
|
||||
X7747Y17018
|
||||
X11557Y15494
|
||||
X4191Y15113
|
||||
X13589Y15748
|
||||
X1397Y15748
|
||||
X11303Y33528
|
||||
X8763Y33528
|
||||
X6223Y33528
|
||||
X3683Y33528
|
||||
X1143Y33528
|
||||
X14450Y34250
|
||||
M30
|
||||
1922
examples/inputs/rcstick-f.GBL
Normal file
1922
examples/inputs/rcstick-f.GBL
Normal file
File diff suppressed because it is too large
Load diff
236
examples/inputs/rcstick-f.GBO
Normal file
236
examples/inputs/rcstick-f.GBO
Normal file
|
|
@ -0,0 +1,236 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSilk bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,0.050800*%
|
||||
|
||||
|
||||
D10*
|
||||
X68610Y208534D02*
|
||||
X70191Y208534D01*
|
||||
X70269Y208536D01*
|
||||
X70346Y208542D01*
|
||||
X70423Y208551D01*
|
||||
X70499Y208564D01*
|
||||
X70575Y208581D01*
|
||||
X70650Y208602D01*
|
||||
X70723Y208626D01*
|
||||
X70796Y208654D01*
|
||||
X70867Y208686D01*
|
||||
X70936Y208721D01*
|
||||
X71003Y208759D01*
|
||||
X71069Y208800D01*
|
||||
X71132Y208845D01*
|
||||
X71193Y208893D01*
|
||||
X71252Y208943D01*
|
||||
X71308Y208997D01*
|
||||
X71362Y209053D01*
|
||||
X71412Y209112D01*
|
||||
X71460Y209173D01*
|
||||
X71505Y209236D01*
|
||||
X71546Y209302D01*
|
||||
X71584Y209369D01*
|
||||
X71619Y209438D01*
|
||||
X71651Y209509D01*
|
||||
X71679Y209582D01*
|
||||
X71703Y209655D01*
|
||||
X71724Y209730D01*
|
||||
X71741Y209806D01*
|
||||
X71754Y209882D01*
|
||||
X71763Y209959D01*
|
||||
X71769Y210036D01*
|
||||
X71771Y210114D01*
|
||||
X71771Y214066D01*
|
||||
X71769Y214144D01*
|
||||
X71763Y214221D01*
|
||||
X71754Y214298D01*
|
||||
X71741Y214374D01*
|
||||
X71724Y214450D01*
|
||||
X71703Y214525D01*
|
||||
X71679Y214598D01*
|
||||
X71651Y214671D01*
|
||||
X71619Y214742D01*
|
||||
X71584Y214811D01*
|
||||
X71546Y214878D01*
|
||||
X71505Y214944D01*
|
||||
X71460Y215007D01*
|
||||
X71412Y215068D01*
|
||||
X71362Y215127D01*
|
||||
X71308Y215183D01*
|
||||
X71252Y215237D01*
|
||||
X71193Y215287D01*
|
||||
X71132Y215335D01*
|
||||
X71069Y215380D01*
|
||||
X71003Y215421D01*
|
||||
X70936Y215459D01*
|
||||
X70867Y215494D01*
|
||||
X70796Y215526D01*
|
||||
X70723Y215554D01*
|
||||
X70650Y215578D01*
|
||||
X70575Y215599D01*
|
||||
X70499Y215616D01*
|
||||
X70423Y215629D01*
|
||||
X70346Y215638D01*
|
||||
X70269Y215644D01*
|
||||
X70191Y215646D01*
|
||||
X68610Y215646D01*
|
||||
X66038Y214066D02*
|
||||
X64062Y215646D01*
|
||||
X64062Y208534D01*
|
||||
X62087Y208534D02*
|
||||
X66038Y208534D01*
|
||||
X59180Y214066D02*
|
||||
X57204Y215646D01*
|
||||
X57204Y208534D01*
|
||||
X55229Y208534D02*
|
||||
X59180Y208534D01*
|
||||
X132110Y259334D02*
|
||||
X133691Y259334D01*
|
||||
X133769Y259336D01*
|
||||
X133846Y259342D01*
|
||||
X133923Y259351D01*
|
||||
X133999Y259364D01*
|
||||
X134075Y259381D01*
|
||||
X134150Y259402D01*
|
||||
X134223Y259426D01*
|
||||
X134296Y259454D01*
|
||||
X134367Y259486D01*
|
||||
X134436Y259521D01*
|
||||
X134503Y259559D01*
|
||||
X134569Y259600D01*
|
||||
X134632Y259645D01*
|
||||
X134693Y259693D01*
|
||||
X134752Y259743D01*
|
||||
X134808Y259797D01*
|
||||
X134862Y259853D01*
|
||||
X134912Y259912D01*
|
||||
X134960Y259973D01*
|
||||
X135005Y260036D01*
|
||||
X135046Y260102D01*
|
||||
X135084Y260169D01*
|
||||
X135119Y260238D01*
|
||||
X135151Y260309D01*
|
||||
X135179Y260382D01*
|
||||
X135203Y260455D01*
|
||||
X135224Y260530D01*
|
||||
X135241Y260606D01*
|
||||
X135254Y260682D01*
|
||||
X135263Y260759D01*
|
||||
X135269Y260836D01*
|
||||
X135271Y260914D01*
|
||||
X135271Y264866D01*
|
||||
X135269Y264944D01*
|
||||
X135263Y265021D01*
|
||||
X135254Y265098D01*
|
||||
X135241Y265174D01*
|
||||
X135224Y265250D01*
|
||||
X135203Y265325D01*
|
||||
X135179Y265398D01*
|
||||
X135151Y265471D01*
|
||||
X135119Y265542D01*
|
||||
X135084Y265611D01*
|
||||
X135046Y265678D01*
|
||||
X135005Y265744D01*
|
||||
X134960Y265807D01*
|
||||
X134912Y265868D01*
|
||||
X134862Y265927D01*
|
||||
X134808Y265983D01*
|
||||
X134752Y266037D01*
|
||||
X134693Y266087D01*
|
||||
X134632Y266135D01*
|
||||
X134569Y266180D01*
|
||||
X134503Y266221D01*
|
||||
X134436Y266259D01*
|
||||
X134367Y266294D01*
|
||||
X134296Y266326D01*
|
||||
X134223Y266354D01*
|
||||
X134150Y266378D01*
|
||||
X134075Y266399D01*
|
||||
X133999Y266416D01*
|
||||
X133923Y266429D01*
|
||||
X133846Y266438D01*
|
||||
X133769Y266444D01*
|
||||
X133691Y266446D01*
|
||||
X132110Y266446D01*
|
||||
X129538Y264866D02*
|
||||
X127562Y266446D01*
|
||||
X127562Y259334D01*
|
||||
X125587Y259334D02*
|
||||
X129538Y259334D01*
|
||||
X122680Y259334D02*
|
||||
X120309Y259334D01*
|
||||
X120231Y259336D01*
|
||||
X120154Y259342D01*
|
||||
X120077Y259351D01*
|
||||
X120001Y259364D01*
|
||||
X119925Y259381D01*
|
||||
X119850Y259402D01*
|
||||
X119777Y259426D01*
|
||||
X119704Y259454D01*
|
||||
X119633Y259486D01*
|
||||
X119564Y259521D01*
|
||||
X119497Y259559D01*
|
||||
X119431Y259600D01*
|
||||
X119368Y259645D01*
|
||||
X119307Y259693D01*
|
||||
X119248Y259743D01*
|
||||
X119192Y259797D01*
|
||||
X119138Y259853D01*
|
||||
X119088Y259912D01*
|
||||
X119040Y259973D01*
|
||||
X118995Y260036D01*
|
||||
X118954Y260102D01*
|
||||
X118916Y260169D01*
|
||||
X118881Y260238D01*
|
||||
X118849Y260309D01*
|
||||
X118821Y260382D01*
|
||||
X118797Y260455D01*
|
||||
X118776Y260530D01*
|
||||
X118759Y260606D01*
|
||||
X118746Y260682D01*
|
||||
X118737Y260759D01*
|
||||
X118731Y260836D01*
|
||||
X118729Y260914D01*
|
||||
X118729Y261705D01*
|
||||
X118731Y261783D01*
|
||||
X118737Y261860D01*
|
||||
X118746Y261937D01*
|
||||
X118759Y262013D01*
|
||||
X118776Y262089D01*
|
||||
X118797Y262164D01*
|
||||
X118821Y262237D01*
|
||||
X118849Y262310D01*
|
||||
X118881Y262381D01*
|
||||
X118916Y262450D01*
|
||||
X118954Y262517D01*
|
||||
X118995Y262583D01*
|
||||
X119040Y262646D01*
|
||||
X119088Y262707D01*
|
||||
X119138Y262766D01*
|
||||
X119192Y262822D01*
|
||||
X119248Y262876D01*
|
||||
X119307Y262926D01*
|
||||
X119368Y262974D01*
|
||||
X119431Y263019D01*
|
||||
X119497Y263060D01*
|
||||
X119564Y263098D01*
|
||||
X119633Y263133D01*
|
||||
X119704Y263165D01*
|
||||
X119777Y263193D01*
|
||||
X119850Y263217D01*
|
||||
X119925Y263238D01*
|
||||
X120001Y263255D01*
|
||||
X120077Y263268D01*
|
||||
X120154Y263277D01*
|
||||
X120231Y263283D01*
|
||||
X120309Y263285D01*
|
||||
X122680Y263285D01*
|
||||
X122680Y266446D01*
|
||||
X118729Y266446D01*
|
||||
M02*
|
||||
25
examples/inputs/rcstick-f.GBP
Normal file
25
examples/inputs/rcstick-f.GBP
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11C,1.900000*%
|
||||
|
||||
|
||||
D10*
|
||||
X69000Y203200D03*
|
||||
X58000Y203200D03*
|
||||
X121500Y254000D03*
|
||||
X132500Y254000D03*
|
||||
D11*
|
||||
X79500Y35620D02*
|
||||
X79500Y20620D01*
|
||||
X196500Y20620D02*
|
||||
X196500Y35620D01*
|
||||
M02*
|
||||
48
examples/inputs/rcstick-f.GBS
Normal file
48
examples/inputs/rcstick-f.GBS
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11C,1.420000*%
|
||||
%ADD12C,1.900000*%
|
||||
%ADD13C,1.200000*%
|
||||
%ADD14R,1.778000X1.778000*%
|
||||
%ADD15C,1.778000*%
|
||||
%ADD16C,1.400000*%
|
||||
|
||||
|
||||
D10*
|
||||
X69000Y203200D03*
|
||||
X58000Y203200D03*
|
||||
X121500Y254000D03*
|
||||
X132500Y254000D03*
|
||||
D11*
|
||||
X173000Y49120D03*
|
||||
X148000Y49120D03*
|
||||
X128000Y49120D03*
|
||||
X103000Y49120D03*
|
||||
D12*
|
||||
X79500Y35620D02*
|
||||
X79500Y20620D01*
|
||||
X196500Y20620D02*
|
||||
X196500Y35620D01*
|
||||
D13*
|
||||
X115500Y28120D03*
|
||||
X160500Y28120D03*
|
||||
D14*
|
||||
X21590Y16510D03*
|
||||
D15*
|
||||
X21590Y41910D03*
|
||||
X21590Y67310D03*
|
||||
X21590Y92710D03*
|
||||
D13*
|
||||
X76200Y245110D03*
|
||||
D16*
|
||||
X130810Y204470D03*
|
||||
M02*
|
||||
1014
examples/inputs/rcstick-f.GML
Normal file
1014
examples/inputs/rcstick-f.GML
Normal file
File diff suppressed because it is too large
Load diff
9251
examples/inputs/rcstick-f.GTL
Normal file
9251
examples/inputs/rcstick-f.GTL
Normal file
File diff suppressed because it is too large
Load diff
8076
examples/inputs/rcstick-f.GTO
Normal file
8076
examples/inputs/rcstick-f.GTO
Normal file
File diff suppressed because it is too large
Load diff
370
examples/inputs/rcstick-f.GTP
Normal file
370
examples/inputs/rcstick-f.GTP
Normal file
|
|
@ -0,0 +1,370 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.700000X0.600000*%
|
||||
%ADD11R,0.600000X0.700000*%
|
||||
%ADD12C,1.900000*%
|
||||
%ADD13R,1.080000X1.050000*%
|
||||
%ADD14R,1.450000X0.650000*%
|
||||
%ADD15R,0.540000X1.400000*%
|
||||
%ADD16R,0.280000X1.260000*%
|
||||
%ADD17R,1.260000X0.280000*%
|
||||
%ADD18R,2.400000X2.400000*%
|
||||
%ADD19R,1.400000X1.000000*%
|
||||
%ADD20R,1.200000X1.900000*%
|
||||
|
||||
|
||||
D10*
|
||||
X214630Y29630D03*
|
||||
X214630Y18630D03*
|
||||
D11*
|
||||
X172300Y189230D03*
|
||||
X183300Y189230D03*
|
||||
X97370Y214630D03*
|
||||
X108370Y214630D03*
|
||||
X35980Y241300D03*
|
||||
X24980Y241300D03*
|
||||
X53760Y285750D03*
|
||||
X42760Y285750D03*
|
||||
X96100Y279400D03*
|
||||
X107100Y279400D03*
|
||||
X53760Y274320D03*
|
||||
X42760Y274320D03*
|
||||
D10*
|
||||
X255270Y47410D03*
|
||||
X255270Y36410D03*
|
||||
D11*
|
||||
X134200Y275590D03*
|
||||
X145200Y275590D03*
|
||||
D10*
|
||||
X161290Y239610D03*
|
||||
X161290Y250610D03*
|
||||
D11*
|
||||
X84670Y314960D03*
|
||||
X95670Y314960D03*
|
||||
X84670Y303530D03*
|
||||
X95670Y303530D03*
|
||||
X121500Y292100D03*
|
||||
X132500Y292100D03*
|
||||
X121500Y314960D03*
|
||||
X132500Y314960D03*
|
||||
X158330Y298450D03*
|
||||
X169330Y298450D03*
|
||||
X169330Y321310D03*
|
||||
X158330Y321310D03*
|
||||
D10*
|
||||
X199390Y145200D03*
|
||||
X199390Y134200D03*
|
||||
X55880Y132930D03*
|
||||
X55880Y143930D03*
|
||||
X44450Y132930D03*
|
||||
X44450Y143930D03*
|
||||
X234950Y179920D03*
|
||||
X234950Y190920D03*
|
||||
D11*
|
||||
X209130Y215900D03*
|
||||
X220130Y215900D03*
|
||||
X172300Y212090D03*
|
||||
X183300Y212090D03*
|
||||
X172300Y200660D03*
|
||||
X183300Y200660D03*
|
||||
D12*
|
||||
X79500Y35620D02*
|
||||
X79500Y20620D01*
|
||||
X196500Y20620D02*
|
||||
X196500Y35620D01*
|
||||
D11*
|
||||
X132500Y326390D03*
|
||||
X121500Y326390D03*
|
||||
X132500Y303530D03*
|
||||
X121500Y303530D03*
|
||||
X169330Y309880D03*
|
||||
X158330Y309880D03*
|
||||
D13*
|
||||
X27940Y187820D03*
|
||||
X27940Y170320D03*
|
||||
D11*
|
||||
X236640Y114300D03*
|
||||
X225640Y114300D03*
|
||||
X24980Y252730D03*
|
||||
X35980Y252730D03*
|
||||
D10*
|
||||
X43180Y184570D03*
|
||||
X43180Y173570D03*
|
||||
D14*
|
||||
X208390Y99650D03*
|
||||
X253890Y99650D03*
|
||||
X208390Y78150D03*
|
||||
X253890Y78150D03*
|
||||
D15*
|
||||
G36*
|
||||
X182012Y158932D02*
|
||||
X185830Y155114D01*
|
||||
X175932Y145216D01*
|
||||
X172114Y149034D01*
|
||||
X182012Y158932D01*
|
||||
G37*
|
||||
G36*
|
||||
X176355Y164589D02*
|
||||
X180173Y160771D01*
|
||||
X170275Y150873D01*
|
||||
X166457Y154691D01*
|
||||
X176355Y164589D01*
|
||||
G37*
|
||||
G36*
|
||||
X170699Y170246D02*
|
||||
X174517Y166428D01*
|
||||
X164619Y156530D01*
|
||||
X160801Y160348D01*
|
||||
X170699Y170246D01*
|
||||
G37*
|
||||
G36*
|
||||
X165042Y175903D02*
|
||||
X168860Y172085D01*
|
||||
X158962Y162187D01*
|
||||
X155144Y166005D01*
|
||||
X165042Y175903D01*
|
||||
G37*
|
||||
G36*
|
||||
X159385Y181560D02*
|
||||
X163203Y177742D01*
|
||||
X153305Y167844D01*
|
||||
X149487Y171662D01*
|
||||
X159385Y181560D01*
|
||||
G37*
|
||||
G36*
|
||||
X153799Y187146D02*
|
||||
X157617Y183328D01*
|
||||
X147719Y173430D01*
|
||||
X143901Y177248D01*
|
||||
X153799Y187146D01*
|
||||
G37*
|
||||
G36*
|
||||
X148142Y192803D02*
|
||||
X151960Y188985D01*
|
||||
X142062Y179087D01*
|
||||
X138244Y182905D01*
|
||||
X148142Y192803D01*
|
||||
G37*
|
||||
G36*
|
||||
X142485Y198460D02*
|
||||
X146303Y194642D01*
|
||||
X136405Y184744D01*
|
||||
X132587Y188562D01*
|
||||
X142485Y198460D01*
|
||||
G37*
|
||||
G36*
|
||||
X107768Y194712D02*
|
||||
X111586Y198530D01*
|
||||
X121484Y188632D01*
|
||||
X117666Y184814D01*
|
||||
X107768Y194712D01*
|
||||
G37*
|
||||
G36*
|
||||
X102111Y189055D02*
|
||||
X105929Y192873D01*
|
||||
X115827Y182975D01*
|
||||
X112009Y179157D01*
|
||||
X102111Y189055D01*
|
||||
G37*
|
||||
G36*
|
||||
X96454Y183399D02*
|
||||
X100272Y187217D01*
|
||||
X110170Y177319D01*
|
||||
X106352Y173501D01*
|
||||
X96454Y183399D01*
|
||||
G37*
|
||||
G36*
|
||||
X90797Y177742D02*
|
||||
X94615Y181560D01*
|
||||
X104513Y171662D01*
|
||||
X100695Y167844D01*
|
||||
X90797Y177742D01*
|
||||
G37*
|
||||
G36*
|
||||
X85140Y172085D02*
|
||||
X88958Y175903D01*
|
||||
X98856Y166005D01*
|
||||
X95038Y162187D01*
|
||||
X85140Y172085D01*
|
||||
G37*
|
||||
G36*
|
||||
X79483Y166428D02*
|
||||
X83301Y170246D01*
|
||||
X93199Y160348D01*
|
||||
X89381Y156530D01*
|
||||
X79483Y166428D01*
|
||||
G37*
|
||||
G36*
|
||||
X73827Y160771D02*
|
||||
X77645Y164589D01*
|
||||
X87543Y154691D01*
|
||||
X83725Y150873D01*
|
||||
X73827Y160771D01*
|
||||
G37*
|
||||
G36*
|
||||
X68170Y155114D02*
|
||||
X71988Y158932D01*
|
||||
X81886Y149034D01*
|
||||
X78068Y145216D01*
|
||||
X68170Y155114D01*
|
||||
G37*
|
||||
G36*
|
||||
X71988Y120468D02*
|
||||
X68170Y124286D01*
|
||||
X78068Y134184D01*
|
||||
X81886Y130366D01*
|
||||
X71988Y120468D01*
|
||||
G37*
|
||||
G36*
|
||||
X77645Y114811D02*
|
||||
X73827Y118629D01*
|
||||
X83725Y128527D01*
|
||||
X87543Y124709D01*
|
||||
X77645Y114811D01*
|
||||
G37*
|
||||
G36*
|
||||
X83301Y109154D02*
|
||||
X79483Y112972D01*
|
||||
X89381Y122870D01*
|
||||
X93199Y119052D01*
|
||||
X83301Y109154D01*
|
||||
G37*
|
||||
G36*
|
||||
X88958Y103497D02*
|
||||
X85140Y107315D01*
|
||||
X95038Y117213D01*
|
||||
X98856Y113395D01*
|
||||
X88958Y103497D01*
|
||||
G37*
|
||||
G36*
|
||||
X94615Y97840D02*
|
||||
X90797Y101658D01*
|
||||
X100695Y111556D01*
|
||||
X104513Y107738D01*
|
||||
X94615Y97840D01*
|
||||
G37*
|
||||
G36*
|
||||
X100272Y92183D02*
|
||||
X96454Y96001D01*
|
||||
X106352Y105899D01*
|
||||
X110170Y102081D01*
|
||||
X100272Y92183D01*
|
||||
G37*
|
||||
G36*
|
||||
X105929Y86527D02*
|
||||
X102111Y90345D01*
|
||||
X112009Y100243D01*
|
||||
X115827Y96425D01*
|
||||
X105929Y86527D01*
|
||||
G37*
|
||||
G36*
|
||||
X111586Y80870D02*
|
||||
X107768Y84688D01*
|
||||
X117666Y94586D01*
|
||||
X121484Y90768D01*
|
||||
X111586Y80870D01*
|
||||
G37*
|
||||
G36*
|
||||
X146232Y84688D02*
|
||||
X142414Y80870D01*
|
||||
X132516Y90768D01*
|
||||
X136334Y94586D01*
|
||||
X146232Y84688D01*
|
||||
G37*
|
||||
G36*
|
||||
X151889Y90345D02*
|
||||
X148071Y86527D01*
|
||||
X138173Y96425D01*
|
||||
X141991Y100243D01*
|
||||
X151889Y90345D01*
|
||||
G37*
|
||||
G36*
|
||||
X157546Y96001D02*
|
||||
X153728Y92183D01*
|
||||
X143830Y102081D01*
|
||||
X147648Y105899D01*
|
||||
X157546Y96001D01*
|
||||
G37*
|
||||
G36*
|
||||
X163203Y101658D02*
|
||||
X159385Y97840D01*
|
||||
X149487Y107738D01*
|
||||
X153305Y111556D01*
|
||||
X163203Y101658D01*
|
||||
G37*
|
||||
G36*
|
||||
X168860Y107315D02*
|
||||
X165042Y103497D01*
|
||||
X155144Y113395D01*
|
||||
X158962Y117213D01*
|
||||
X168860Y107315D01*
|
||||
G37*
|
||||
G36*
|
||||
X174517Y112972D02*
|
||||
X170699Y109154D01*
|
||||
X160801Y119052D01*
|
||||
X164619Y122870D01*
|
||||
X174517Y112972D01*
|
||||
G37*
|
||||
G36*
|
||||
X180173Y118629D02*
|
||||
X176355Y114811D01*
|
||||
X166457Y124709D01*
|
||||
X170275Y128527D01*
|
||||
X180173Y118629D01*
|
||||
G37*
|
||||
G36*
|
||||
X185830Y124286D02*
|
||||
X182012Y120468D01*
|
||||
X172114Y130366D01*
|
||||
X175932Y134184D01*
|
||||
X185830Y124286D01*
|
||||
G37*
|
||||
D16*
|
||||
X66200Y224810D03*
|
||||
X71200Y224810D03*
|
||||
X76200Y224810D03*
|
||||
X81200Y224810D03*
|
||||
X86200Y224810D03*
|
||||
D17*
|
||||
X96500Y235110D03*
|
||||
X96500Y240110D03*
|
||||
X96500Y245110D03*
|
||||
X96500Y250110D03*
|
||||
X96500Y255110D03*
|
||||
D16*
|
||||
X86200Y265410D03*
|
||||
X81200Y265410D03*
|
||||
X76200Y265410D03*
|
||||
X71200Y265410D03*
|
||||
X66200Y265410D03*
|
||||
D17*
|
||||
X55900Y255110D03*
|
||||
X55900Y250110D03*
|
||||
X55900Y245110D03*
|
||||
X55900Y240110D03*
|
||||
X55900Y235110D03*
|
||||
D18*
|
||||
X76200Y245110D03*
|
||||
D19*
|
||||
X218870Y41910D03*
|
||||
X240870Y51410D03*
|
||||
X240870Y32410D03*
|
||||
D20*
|
||||
X222630Y172820D03*
|
||||
X222630Y198020D03*
|
||||
X206630Y198020D03*
|
||||
X206630Y172820D03*
|
||||
X131700Y257710D03*
|
||||
X131700Y232510D03*
|
||||
X147700Y232510D03*
|
||||
X147700Y257710D03*
|
||||
M02*
|
||||
393
examples/inputs/rcstick-f.GTS
Normal file
393
examples/inputs/rcstick-f.GTS
Normal file
|
|
@ -0,0 +1,393 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.700000X0.600000*%
|
||||
%ADD11R,0.600000X0.700000*%
|
||||
%ADD12C,1.420000*%
|
||||
%ADD13C,1.900000*%
|
||||
%ADD14C,1.200000*%
|
||||
%ADD15R,1.778000X1.778000*%
|
||||
%ADD16C,1.778000*%
|
||||
%ADD17R,1.080000X1.050000*%
|
||||
%ADD18R,1.450000X0.650000*%
|
||||
%ADD19R,0.540000X1.400000*%
|
||||
%ADD20R,0.280000X1.260000*%
|
||||
%ADD21R,1.260000X0.280000*%
|
||||
%ADD22R,2.400000X2.400000*%
|
||||
%ADD23R,1.400000X1.000000*%
|
||||
%ADD24R,1.200000X1.900000*%
|
||||
%ADD25C,1.400000*%
|
||||
|
||||
|
||||
D10*
|
||||
X214630Y29630D03*
|
||||
X214630Y18630D03*
|
||||
D11*
|
||||
X172300Y189230D03*
|
||||
X183300Y189230D03*
|
||||
X97370Y214630D03*
|
||||
X108370Y214630D03*
|
||||
X35980Y241300D03*
|
||||
X24980Y241300D03*
|
||||
X53760Y285750D03*
|
||||
X42760Y285750D03*
|
||||
X96100Y279400D03*
|
||||
X107100Y279400D03*
|
||||
X53760Y274320D03*
|
||||
X42760Y274320D03*
|
||||
D10*
|
||||
X255270Y47410D03*
|
||||
X255270Y36410D03*
|
||||
D11*
|
||||
X134200Y275590D03*
|
||||
X145200Y275590D03*
|
||||
D10*
|
||||
X161290Y239610D03*
|
||||
X161290Y250610D03*
|
||||
D11*
|
||||
X84670Y314960D03*
|
||||
X95670Y314960D03*
|
||||
X84670Y303530D03*
|
||||
X95670Y303530D03*
|
||||
X121500Y292100D03*
|
||||
X132500Y292100D03*
|
||||
X121500Y314960D03*
|
||||
X132500Y314960D03*
|
||||
X158330Y298450D03*
|
||||
X169330Y298450D03*
|
||||
X169330Y321310D03*
|
||||
X158330Y321310D03*
|
||||
D10*
|
||||
X199390Y145200D03*
|
||||
X199390Y134200D03*
|
||||
X55880Y132930D03*
|
||||
X55880Y143930D03*
|
||||
X44450Y132930D03*
|
||||
X44450Y143930D03*
|
||||
X234950Y179920D03*
|
||||
X234950Y190920D03*
|
||||
D11*
|
||||
X209130Y215900D03*
|
||||
X220130Y215900D03*
|
||||
X172300Y212090D03*
|
||||
X183300Y212090D03*
|
||||
X172300Y200660D03*
|
||||
X183300Y200660D03*
|
||||
D12*
|
||||
X173000Y49120D03*
|
||||
X148000Y49120D03*
|
||||
X128000Y49120D03*
|
||||
X103000Y49120D03*
|
||||
D13*
|
||||
X79500Y35620D02*
|
||||
X79500Y20620D01*
|
||||
X196500Y20620D02*
|
||||
X196500Y35620D01*
|
||||
D14*
|
||||
X115500Y28120D03*
|
||||
X160500Y28120D03*
|
||||
D15*
|
||||
X21590Y16510D03*
|
||||
D16*
|
||||
X21590Y41910D03*
|
||||
X21590Y67310D03*
|
||||
X21590Y92710D03*
|
||||
D11*
|
||||
X132500Y326390D03*
|
||||
X121500Y326390D03*
|
||||
X132500Y303530D03*
|
||||
X121500Y303530D03*
|
||||
X169330Y309880D03*
|
||||
X158330Y309880D03*
|
||||
D17*
|
||||
X27940Y187820D03*
|
||||
X27940Y170320D03*
|
||||
D11*
|
||||
X236640Y114300D03*
|
||||
X225640Y114300D03*
|
||||
X24980Y252730D03*
|
||||
X35980Y252730D03*
|
||||
D10*
|
||||
X43180Y184570D03*
|
||||
X43180Y173570D03*
|
||||
D18*
|
||||
X208390Y99650D03*
|
||||
X253890Y99650D03*
|
||||
X208390Y78150D03*
|
||||
X253890Y78150D03*
|
||||
D19*
|
||||
G36*
|
||||
X182012Y158932D02*
|
||||
X185830Y155114D01*
|
||||
X175932Y145216D01*
|
||||
X172114Y149034D01*
|
||||
X182012Y158932D01*
|
||||
G37*
|
||||
G36*
|
||||
X176355Y164589D02*
|
||||
X180173Y160771D01*
|
||||
X170275Y150873D01*
|
||||
X166457Y154691D01*
|
||||
X176355Y164589D01*
|
||||
G37*
|
||||
G36*
|
||||
X170699Y170246D02*
|
||||
X174517Y166428D01*
|
||||
X164619Y156530D01*
|
||||
X160801Y160348D01*
|
||||
X170699Y170246D01*
|
||||
G37*
|
||||
G36*
|
||||
X165042Y175903D02*
|
||||
X168860Y172085D01*
|
||||
X158962Y162187D01*
|
||||
X155144Y166005D01*
|
||||
X165042Y175903D01*
|
||||
G37*
|
||||
G36*
|
||||
X159385Y181560D02*
|
||||
X163203Y177742D01*
|
||||
X153305Y167844D01*
|
||||
X149487Y171662D01*
|
||||
X159385Y181560D01*
|
||||
G37*
|
||||
G36*
|
||||
X153799Y187146D02*
|
||||
X157617Y183328D01*
|
||||
X147719Y173430D01*
|
||||
X143901Y177248D01*
|
||||
X153799Y187146D01*
|
||||
G37*
|
||||
G36*
|
||||
X148142Y192803D02*
|
||||
X151960Y188985D01*
|
||||
X142062Y179087D01*
|
||||
X138244Y182905D01*
|
||||
X148142Y192803D01*
|
||||
G37*
|
||||
G36*
|
||||
X142485Y198460D02*
|
||||
X146303Y194642D01*
|
||||
X136405Y184744D01*
|
||||
X132587Y188562D01*
|
||||
X142485Y198460D01*
|
||||
G37*
|
||||
G36*
|
||||
X107768Y194712D02*
|
||||
X111586Y198530D01*
|
||||
X121484Y188632D01*
|
||||
X117666Y184814D01*
|
||||
X107768Y194712D01*
|
||||
G37*
|
||||
G36*
|
||||
X102111Y189055D02*
|
||||
X105929Y192873D01*
|
||||
X115827Y182975D01*
|
||||
X112009Y179157D01*
|
||||
X102111Y189055D01*
|
||||
G37*
|
||||
G36*
|
||||
X96454Y183399D02*
|
||||
X100272Y187217D01*
|
||||
X110170Y177319D01*
|
||||
X106352Y173501D01*
|
||||
X96454Y183399D01*
|
||||
G37*
|
||||
G36*
|
||||
X90797Y177742D02*
|
||||
X94615Y181560D01*
|
||||
X104513Y171662D01*
|
||||
X100695Y167844D01*
|
||||
X90797Y177742D01*
|
||||
G37*
|
||||
G36*
|
||||
X85140Y172085D02*
|
||||
X88958Y175903D01*
|
||||
X98856Y166005D01*
|
||||
X95038Y162187D01*
|
||||
X85140Y172085D01*
|
||||
G37*
|
||||
G36*
|
||||
X79483Y166428D02*
|
||||
X83301Y170246D01*
|
||||
X93199Y160348D01*
|
||||
X89381Y156530D01*
|
||||
X79483Y166428D01*
|
||||
G37*
|
||||
G36*
|
||||
X73827Y160771D02*
|
||||
X77645Y164589D01*
|
||||
X87543Y154691D01*
|
||||
X83725Y150873D01*
|
||||
X73827Y160771D01*
|
||||
G37*
|
||||
G36*
|
||||
X68170Y155114D02*
|
||||
X71988Y158932D01*
|
||||
X81886Y149034D01*
|
||||
X78068Y145216D01*
|
||||
X68170Y155114D01*
|
||||
G37*
|
||||
G36*
|
||||
X71988Y120468D02*
|
||||
X68170Y124286D01*
|
||||
X78068Y134184D01*
|
||||
X81886Y130366D01*
|
||||
X71988Y120468D01*
|
||||
G37*
|
||||
G36*
|
||||
X77645Y114811D02*
|
||||
X73827Y118629D01*
|
||||
X83725Y128527D01*
|
||||
X87543Y124709D01*
|
||||
X77645Y114811D01*
|
||||
G37*
|
||||
G36*
|
||||
X83301Y109154D02*
|
||||
X79483Y112972D01*
|
||||
X89381Y122870D01*
|
||||
X93199Y119052D01*
|
||||
X83301Y109154D01*
|
||||
G37*
|
||||
G36*
|
||||
X88958Y103497D02*
|
||||
X85140Y107315D01*
|
||||
X95038Y117213D01*
|
||||
X98856Y113395D01*
|
||||
X88958Y103497D01*
|
||||
G37*
|
||||
G36*
|
||||
X94615Y97840D02*
|
||||
X90797Y101658D01*
|
||||
X100695Y111556D01*
|
||||
X104513Y107738D01*
|
||||
X94615Y97840D01*
|
||||
G37*
|
||||
G36*
|
||||
X100272Y92183D02*
|
||||
X96454Y96001D01*
|
||||
X106352Y105899D01*
|
||||
X110170Y102081D01*
|
||||
X100272Y92183D01*
|
||||
G37*
|
||||
G36*
|
||||
X105929Y86527D02*
|
||||
X102111Y90345D01*
|
||||
X112009Y100243D01*
|
||||
X115827Y96425D01*
|
||||
X105929Y86527D01*
|
||||
G37*
|
||||
G36*
|
||||
X111586Y80870D02*
|
||||
X107768Y84688D01*
|
||||
X117666Y94586D01*
|
||||
X121484Y90768D01*
|
||||
X111586Y80870D01*
|
||||
G37*
|
||||
G36*
|
||||
X146232Y84688D02*
|
||||
X142414Y80870D01*
|
||||
X132516Y90768D01*
|
||||
X136334Y94586D01*
|
||||
X146232Y84688D01*
|
||||
G37*
|
||||
G36*
|
||||
X151889Y90345D02*
|
||||
X148071Y86527D01*
|
||||
X138173Y96425D01*
|
||||
X141991Y100243D01*
|
||||
X151889Y90345D01*
|
||||
G37*
|
||||
G36*
|
||||
X157546Y96001D02*
|
||||
X153728Y92183D01*
|
||||
X143830Y102081D01*
|
||||
X147648Y105899D01*
|
||||
X157546Y96001D01*
|
||||
G37*
|
||||
G36*
|
||||
X163203Y101658D02*
|
||||
X159385Y97840D01*
|
||||
X149487Y107738D01*
|
||||
X153305Y111556D01*
|
||||
X163203Y101658D01*
|
||||
G37*
|
||||
G36*
|
||||
X168860Y107315D02*
|
||||
X165042Y103497D01*
|
||||
X155144Y113395D01*
|
||||
X158962Y117213D01*
|
||||
X168860Y107315D01*
|
||||
G37*
|
||||
G36*
|
||||
X174517Y112972D02*
|
||||
X170699Y109154D01*
|
||||
X160801Y119052D01*
|
||||
X164619Y122870D01*
|
||||
X174517Y112972D01*
|
||||
G37*
|
||||
G36*
|
||||
X180173Y118629D02*
|
||||
X176355Y114811D01*
|
||||
X166457Y124709D01*
|
||||
X170275Y128527D01*
|
||||
X180173Y118629D01*
|
||||
G37*
|
||||
G36*
|
||||
X185830Y124286D02*
|
||||
X182012Y120468D01*
|
||||
X172114Y130366D01*
|
||||
X175932Y134184D01*
|
||||
X185830Y124286D01*
|
||||
G37*
|
||||
D20*
|
||||
X66200Y224810D03*
|
||||
X71200Y224810D03*
|
||||
X76200Y224810D03*
|
||||
X81200Y224810D03*
|
||||
X86200Y224810D03*
|
||||
D21*
|
||||
X96500Y235110D03*
|
||||
X96500Y240110D03*
|
||||
X96500Y245110D03*
|
||||
X96500Y250110D03*
|
||||
X96500Y255110D03*
|
||||
D20*
|
||||
X86200Y265410D03*
|
||||
X81200Y265410D03*
|
||||
X76200Y265410D03*
|
||||
X71200Y265410D03*
|
||||
X66200Y265410D03*
|
||||
D21*
|
||||
X55900Y255110D03*
|
||||
X55900Y250110D03*
|
||||
X55900Y245110D03*
|
||||
X55900Y240110D03*
|
||||
X55900Y235110D03*
|
||||
D22*
|
||||
X76200Y245110D03*
|
||||
D14*
|
||||
X76200Y245110D03*
|
||||
D23*
|
||||
X218870Y41910D03*
|
||||
X240870Y51410D03*
|
||||
X240870Y32410D03*
|
||||
D24*
|
||||
X222630Y172820D03*
|
||||
X222630Y198020D03*
|
||||
X206630Y198020D03*
|
||||
X206630Y172820D03*
|
||||
X131700Y257710D03*
|
||||
X131700Y232510D03*
|
||||
X147700Y232510D03*
|
||||
X147700Y257710D03*
|
||||
D25*
|
||||
X130810Y204470D03*
|
||||
M02*
|
||||
45
examples/inputs/rcstick-f.TXT
Normal file
45
examples/inputs/rcstick-f.TXT
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
M48
|
||||
;GenerationSoftware,Autodesk,EAGLE,9.3.0*%
|
||||
;CreationDate,2019-03-17T23:47:54Z*%
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T7C0.350
|
||||
T6C0.400
|
||||
T5C0.500
|
||||
T4C0.800
|
||||
T3C0.930
|
||||
T2C1.000
|
||||
T1C1.200
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T1
|
||||
X11550Y2812
|
||||
X16050Y2812
|
||||
T2
|
||||
X2159Y1651
|
||||
X2159Y4191
|
||||
X2159Y6731
|
||||
X2159Y9271
|
||||
T3
|
||||
X17300Y4912
|
||||
X14800Y4912
|
||||
X12800Y4912
|
||||
X10300Y4912
|
||||
T4
|
||||
X7620Y24511
|
||||
T5
|
||||
X10668Y22606
|
||||
T6
|
||||
X22098Y6604
|
||||
X14859Y13843
|
||||
X11430Y15240
|
||||
T7
|
||||
X11049Y25019
|
||||
X5461Y26416
|
||||
X8128Y21209
|
||||
X3556Y23114
|
||||
X9525Y26924
|
||||
X13081Y20447
|
||||
M30
|
||||
19
examples/inputs/rcstick-jig.GBL
Normal file
19
examples/inputs/rcstick-jig.GBL
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INBottom layer*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,1.500000*%
|
||||
|
||||
|
||||
D10*
|
||||
X22860Y69850D03*
|
||||
X48260Y69850D03*
|
||||
X73660Y69850D03*
|
||||
X99060Y69850D03*
|
||||
M02*
|
||||
13
examples/inputs/rcstick-jig.GBO
Normal file
13
examples/inputs/rcstick-jig.GBO
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSilk bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
|
||||
|
||||
M02*
|
||||
13
examples/inputs/rcstick-jig.GBP
Normal file
13
examples/inputs/rcstick-jig.GBP
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
|
||||
|
||||
M02*
|
||||
19
examples/inputs/rcstick-jig.GBS
Normal file
19
examples/inputs/rcstick-jig.GBS
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,1.500000*%
|
||||
|
||||
|
||||
D10*
|
||||
X22860Y69850D03*
|
||||
X48260Y69850D03*
|
||||
X73660Y69850D03*
|
||||
X99060Y69850D03*
|
||||
M02*
|
||||
20
examples/inputs/rcstick-jig.GML
Normal file
20
examples/inputs/rcstick-jig.GML
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSlot drills/holes*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,0.000000*%
|
||||
|
||||
|
||||
D10*
|
||||
X0Y0D02*
|
||||
X0Y130000D01*
|
||||
X120000Y130000D01*
|
||||
X120000Y0D01*
|
||||
X0Y0D01*
|
||||
M02*
|
||||
37
examples/inputs/rcstick-jig.GTL
Normal file
37
examples/inputs/rcstick-jig.GTL
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INTop Layer*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,1.270000X3.000000*%
|
||||
%ADD11C,1.500000*%
|
||||
%ADD12C,0.200000*%
|
||||
|
||||
|
||||
D10*
|
||||
X48260Y101600D03*
|
||||
X73660Y101600D03*
|
||||
X22860Y101600D03*
|
||||
X99060Y101600D03*
|
||||
D11*
|
||||
X22860Y69850D03*
|
||||
D12*
|
||||
X22860Y101600D01*
|
||||
D11*
|
||||
X48260Y69850D03*
|
||||
D12*
|
||||
X48260Y101600D01*
|
||||
D11*
|
||||
X73660Y69850D03*
|
||||
D12*
|
||||
X73660Y101600D01*
|
||||
D11*
|
||||
X99060Y69850D03*
|
||||
D12*
|
||||
X99060Y101600D01*
|
||||
M02*
|
||||
1175
examples/inputs/rcstick-jig.GTO
Normal file
1175
examples/inputs/rcstick-jig.GTO
Normal file
File diff suppressed because it is too large
Load diff
19
examples/inputs/rcstick-jig.GTP
Normal file
19
examples/inputs/rcstick-jig.GTP
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,1.270000X3.000000*%
|
||||
|
||||
|
||||
D10*
|
||||
X48260Y101600D03*
|
||||
X73660Y101600D03*
|
||||
X22860Y101600D03*
|
||||
X99060Y101600D03*
|
||||
M02*
|
||||
25
examples/inputs/rcstick-jig.GTS
Normal file
25
examples/inputs/rcstick-jig.GTS
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,1.270000X3.000000*%
|
||||
%ADD11C,1.500000*%
|
||||
|
||||
|
||||
D10*
|
||||
X48260Y101600D03*
|
||||
X73660Y101600D03*
|
||||
X22860Y101600D03*
|
||||
X99060Y101600D03*
|
||||
D11*
|
||||
X22860Y69850D03*
|
||||
X48260Y69850D03*
|
||||
X73660Y69850D03*
|
||||
X99060Y69850D03*
|
||||
M02*
|
||||
16
examples/inputs/rcstick-jig.TXT
Normal file
16
examples/inputs/rcstick-jig.TXT
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
M48
|
||||
;GenerationSoftware,Autodesk,EAGLE,9.3.0*%
|
||||
;CreationDate,2019-03-18T12:35:50Z*%
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T1C1.000
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T1
|
||||
X2286Y6985
|
||||
X4826Y6985
|
||||
X7366Y6985
|
||||
X9906Y6985
|
||||
M30
|
||||
1815
examples/inputs/sonopi-digi.GBL
Normal file
1815
examples/inputs/sonopi-digi.GBL
Normal file
File diff suppressed because it is too large
Load diff
13
examples/inputs/sonopi-digi.GBO
Normal file
13
examples/inputs/sonopi-digi.GBO
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSilk bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
|
||||
|
||||
M02*
|
||||
13
examples/inputs/sonopi-digi.GBP
Normal file
13
examples/inputs/sonopi-digi.GBP
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
|
||||
|
||||
M02*
|
||||
70
examples/inputs/sonopi-digi.GBS
Normal file
70
examples/inputs/sonopi-digi.GBS
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,1.381250*%
|
||||
%ADD11C,1.725000*%
|
||||
%ADD12C,2.750000*%
|
||||
%ADD13R,1.778000X1.778000*%
|
||||
%ADD14C,1.778000*%
|
||||
|
||||
|
||||
D10*
|
||||
X110950Y107470D03*
|
||||
X110950Y82070D03*
|
||||
X110950Y56670D03*
|
||||
D11*
|
||||
X84650Y107470D03*
|
||||
X84650Y56670D03*
|
||||
D12*
|
||||
X35000Y168000D03*
|
||||
X615000Y168000D03*
|
||||
D13*
|
||||
X83700Y155300D03*
|
||||
D14*
|
||||
X83700Y180700D03*
|
||||
X109100Y155300D03*
|
||||
X109100Y180700D03*
|
||||
X134500Y155300D03*
|
||||
X134500Y180700D03*
|
||||
X159900Y155300D03*
|
||||
X159900Y180700D03*
|
||||
X185300Y155300D03*
|
||||
X185300Y180700D03*
|
||||
X210700Y155300D03*
|
||||
X210700Y180700D03*
|
||||
X236100Y155300D03*
|
||||
X236100Y180700D03*
|
||||
X261500Y155300D03*
|
||||
X261500Y180700D03*
|
||||
X286900Y155300D03*
|
||||
X286900Y180700D03*
|
||||
X312300Y155300D03*
|
||||
X312300Y180700D03*
|
||||
X337700Y155300D03*
|
||||
X337700Y180700D03*
|
||||
X363100Y155300D03*
|
||||
X363100Y180700D03*
|
||||
X388500Y155300D03*
|
||||
X388500Y180700D03*
|
||||
X413900Y155300D03*
|
||||
X413900Y180700D03*
|
||||
X439300Y155300D03*
|
||||
X439300Y180700D03*
|
||||
X464700Y155300D03*
|
||||
X464700Y180700D03*
|
||||
X490100Y155300D03*
|
||||
X490100Y180700D03*
|
||||
X515500Y155300D03*
|
||||
X515500Y180700D03*
|
||||
X540900Y155300D03*
|
||||
X540900Y180700D03*
|
||||
X566300Y155300D03*
|
||||
X566300Y180700D03*
|
||||
M02*
|
||||
794
examples/inputs/sonopi-digi.GML
Normal file
794
examples/inputs/sonopi-digi.GML
Normal file
|
|
@ -0,0 +1,794 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSlot drills/holes*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,0.000000*%
|
||||
|
||||
|
||||
D10*
|
||||
X0Y30000D02*
|
||||
X9Y29275D01*
|
||||
X35Y28551D01*
|
||||
X79Y27827D01*
|
||||
X140Y27105D01*
|
||||
X219Y26384D01*
|
||||
X315Y25665D01*
|
||||
X428Y24949D01*
|
||||
X559Y24236D01*
|
||||
X707Y23526D01*
|
||||
X872Y22821D01*
|
||||
X1054Y22119D01*
|
||||
X1253Y21422D01*
|
||||
X1468Y20729D01*
|
||||
X1701Y20043D01*
|
||||
X1950Y19362D01*
|
||||
X2215Y18687D01*
|
||||
X2496Y18019D01*
|
||||
X2794Y17358D01*
|
||||
X3107Y16704D01*
|
||||
X3436Y16058D01*
|
||||
X3781Y15420D01*
|
||||
X4141Y14791D01*
|
||||
X4516Y14171D01*
|
||||
X4906Y13560D01*
|
||||
X5310Y12958D01*
|
||||
X5729Y12366D01*
|
||||
X6163Y11785D01*
|
||||
X6610Y11214D01*
|
||||
X7071Y10655D01*
|
||||
X7545Y10106D01*
|
||||
X8032Y9570D01*
|
||||
X8532Y9045D01*
|
||||
X9045Y8532D01*
|
||||
X9570Y8032D01*
|
||||
X10106Y7545D01*
|
||||
X10655Y7071D01*
|
||||
X11214Y6610D01*
|
||||
X11785Y6163D01*
|
||||
X12366Y5729D01*
|
||||
X12958Y5310D01*
|
||||
X13560Y4906D01*
|
||||
X14171Y4516D01*
|
||||
X14791Y4141D01*
|
||||
X15420Y3781D01*
|
||||
X16058Y3436D01*
|
||||
X16704Y3107D01*
|
||||
X17358Y2794D01*
|
||||
X18019Y2496D01*
|
||||
X18687Y2215D01*
|
||||
X19362Y1950D01*
|
||||
X20043Y1701D01*
|
||||
X20729Y1468D01*
|
||||
X21422Y1253D01*
|
||||
X22119Y1054D01*
|
||||
X22821Y872D01*
|
||||
X23526Y707D01*
|
||||
X24236Y559D01*
|
||||
X24949Y428D01*
|
||||
X25665Y315D01*
|
||||
X26384Y219D01*
|
||||
X27105Y140D01*
|
||||
X27827Y79D01*
|
||||
X28551Y35D01*
|
||||
X29275Y9D01*
|
||||
X30000Y0D01*
|
||||
X620000Y0D01*
|
||||
X620725Y9D01*
|
||||
X621449Y35D01*
|
||||
X622173Y79D01*
|
||||
X622895Y140D01*
|
||||
X623616Y219D01*
|
||||
X624335Y315D01*
|
||||
X625051Y428D01*
|
||||
X625764Y559D01*
|
||||
X626474Y707D01*
|
||||
X627179Y872D01*
|
||||
X627881Y1054D01*
|
||||
X628578Y1253D01*
|
||||
X629271Y1468D01*
|
||||
X629957Y1701D01*
|
||||
X630638Y1950D01*
|
||||
X631313Y2215D01*
|
||||
X631981Y2496D01*
|
||||
X632642Y2794D01*
|
||||
X633296Y3107D01*
|
||||
X633942Y3436D01*
|
||||
X634580Y3781D01*
|
||||
X635209Y4141D01*
|
||||
X635829Y4516D01*
|
||||
X636440Y4906D01*
|
||||
X637042Y5310D01*
|
||||
X637634Y5729D01*
|
||||
X638215Y6163D01*
|
||||
X638786Y6610D01*
|
||||
X639345Y7071D01*
|
||||
X639894Y7545D01*
|
||||
X640430Y8032D01*
|
||||
X640955Y8532D01*
|
||||
X641468Y9045D01*
|
||||
X641968Y9570D01*
|
||||
X642455Y10106D01*
|
||||
X642929Y10655D01*
|
||||
X643390Y11214D01*
|
||||
X643837Y11785D01*
|
||||
X644271Y12366D01*
|
||||
X644690Y12958D01*
|
||||
X645094Y13560D01*
|
||||
X645484Y14171D01*
|
||||
X645859Y14791D01*
|
||||
X646219Y15420D01*
|
||||
X646564Y16058D01*
|
||||
X646893Y16704D01*
|
||||
X647206Y17358D01*
|
||||
X647504Y18019D01*
|
||||
X647785Y18687D01*
|
||||
X648050Y19362D01*
|
||||
X648299Y20043D01*
|
||||
X648532Y20729D01*
|
||||
X648747Y21422D01*
|
||||
X648946Y22119D01*
|
||||
X649128Y22821D01*
|
||||
X649293Y23526D01*
|
||||
X649441Y24236D01*
|
||||
X649572Y24949D01*
|
||||
X649685Y25665D01*
|
||||
X649781Y26384D01*
|
||||
X649860Y27105D01*
|
||||
X649921Y27827D01*
|
||||
X649965Y28551D01*
|
||||
X649991Y29275D01*
|
||||
X650000Y30000D01*
|
||||
X650000Y173000D01*
|
||||
X649991Y173725D01*
|
||||
X649965Y174449D01*
|
||||
X649921Y175173D01*
|
||||
X649860Y175895D01*
|
||||
X649781Y176616D01*
|
||||
X649685Y177335D01*
|
||||
X649572Y178051D01*
|
||||
X649441Y178764D01*
|
||||
X649293Y179474D01*
|
||||
X649128Y180179D01*
|
||||
X648946Y180881D01*
|
||||
X648747Y181578D01*
|
||||
X648532Y182271D01*
|
||||
X648299Y182957D01*
|
||||
X648050Y183638D01*
|
||||
X647785Y184313D01*
|
||||
X647504Y184981D01*
|
||||
X647206Y185642D01*
|
||||
X646893Y186296D01*
|
||||
X646564Y186942D01*
|
||||
X646219Y187580D01*
|
||||
X645859Y188209D01*
|
||||
X645484Y188829D01*
|
||||
X645094Y189440D01*
|
||||
X644690Y190042D01*
|
||||
X644271Y190634D01*
|
||||
X643837Y191215D01*
|
||||
X643390Y191786D01*
|
||||
X642929Y192345D01*
|
||||
X642455Y192894D01*
|
||||
X641968Y193430D01*
|
||||
X641468Y193955D01*
|
||||
X640955Y194468D01*
|
||||
X640430Y194968D01*
|
||||
X639894Y195455D01*
|
||||
X639345Y195929D01*
|
||||
X638786Y196390D01*
|
||||
X638215Y196837D01*
|
||||
X637634Y197271D01*
|
||||
X637042Y197690D01*
|
||||
X636440Y198094D01*
|
||||
X635829Y198484D01*
|
||||
X635209Y198859D01*
|
||||
X634580Y199219D01*
|
||||
X633942Y199564D01*
|
||||
X633296Y199893D01*
|
||||
X632642Y200206D01*
|
||||
X631981Y200504D01*
|
||||
X631313Y200785D01*
|
||||
X630638Y201050D01*
|
||||
X629957Y201299D01*
|
||||
X629271Y201532D01*
|
||||
X628578Y201747D01*
|
||||
X627881Y201946D01*
|
||||
X627179Y202128D01*
|
||||
X626474Y202293D01*
|
||||
X625764Y202441D01*
|
||||
X625051Y202572D01*
|
||||
X624335Y202685D01*
|
||||
X623616Y202781D01*
|
||||
X622895Y202860D01*
|
||||
X622173Y202921D01*
|
||||
X621449Y202965D01*
|
||||
X620725Y202991D01*
|
||||
X620000Y203000D01*
|
||||
X30000Y203000D01*
|
||||
X29275Y202991D01*
|
||||
X28551Y202965D01*
|
||||
X27827Y202921D01*
|
||||
X27105Y202860D01*
|
||||
X26384Y202781D01*
|
||||
X25665Y202685D01*
|
||||
X24949Y202572D01*
|
||||
X24236Y202441D01*
|
||||
X23526Y202293D01*
|
||||
X22821Y202128D01*
|
||||
X22119Y201946D01*
|
||||
X21422Y201747D01*
|
||||
X20729Y201532D01*
|
||||
X20043Y201299D01*
|
||||
X19362Y201050D01*
|
||||
X18687Y200785D01*
|
||||
X18019Y200504D01*
|
||||
X17358Y200206D01*
|
||||
X16704Y199893D01*
|
||||
X16058Y199564D01*
|
||||
X15420Y199219D01*
|
||||
X14791Y198859D01*
|
||||
X14171Y198484D01*
|
||||
X13560Y198094D01*
|
||||
X12958Y197690D01*
|
||||
X12366Y197271D01*
|
||||
X11785Y196837D01*
|
||||
X11214Y196390D01*
|
||||
X10655Y195929D01*
|
||||
X10106Y195455D01*
|
||||
X9570Y194968D01*
|
||||
X9045Y194468D01*
|
||||
X8532Y193955D01*
|
||||
X8032Y193430D01*
|
||||
X7545Y192894D01*
|
||||
X7071Y192345D01*
|
||||
X6610Y191786D01*
|
||||
X6163Y191215D01*
|
||||
X5729Y190634D01*
|
||||
X5310Y190042D01*
|
||||
X4906Y189440D01*
|
||||
X4516Y188829D01*
|
||||
X4141Y188209D01*
|
||||
X3781Y187580D01*
|
||||
X3436Y186942D01*
|
||||
X3107Y186296D01*
|
||||
X2794Y185642D01*
|
||||
X2496Y184981D01*
|
||||
X2215Y184313D01*
|
||||
X1950Y183638D01*
|
||||
X1701Y182957D01*
|
||||
X1468Y182271D01*
|
||||
X1253Y181578D01*
|
||||
X1054Y180881D01*
|
||||
X872Y180179D01*
|
||||
X707Y179474D01*
|
||||
X559Y178764D01*
|
||||
X428Y178051D01*
|
||||
X315Y177335D01*
|
||||
X219Y176616D01*
|
||||
X140Y175895D01*
|
||||
X79Y175173D01*
|
||||
X35Y174449D01*
|
||||
X9Y173725D01*
|
||||
X0Y173000D01*
|
||||
X0Y30000D01*
|
||||
X21250Y168000D02*
|
||||
X21254Y168337D01*
|
||||
X21267Y168675D01*
|
||||
X21287Y169012D01*
|
||||
X21316Y169348D01*
|
||||
X21353Y169683D01*
|
||||
X21399Y170018D01*
|
||||
X21452Y170351D01*
|
||||
X21514Y170682D01*
|
||||
X21584Y171013D01*
|
||||
X21662Y171341D01*
|
||||
X21748Y171667D01*
|
||||
X21842Y171991D01*
|
||||
X21944Y172313D01*
|
||||
X22054Y172632D01*
|
||||
X22171Y172949D01*
|
||||
X22297Y173262D01*
|
||||
X22430Y173572D01*
|
||||
X22570Y173879D01*
|
||||
X22718Y174182D01*
|
||||
X22874Y174482D01*
|
||||
X23036Y174777D01*
|
||||
X23206Y175069D01*
|
||||
X23383Y175356D01*
|
||||
X23567Y175639D01*
|
||||
X23758Y175917D01*
|
||||
X23956Y176191D01*
|
||||
X24160Y176459D01*
|
||||
X24371Y176723D01*
|
||||
X24588Y176981D01*
|
||||
X24812Y177234D01*
|
||||
X25042Y177481D01*
|
||||
X25277Y177723D01*
|
||||
X25519Y177958D01*
|
||||
X25766Y178188D01*
|
||||
X26019Y178412D01*
|
||||
X26277Y178629D01*
|
||||
X26541Y178840D01*
|
||||
X26809Y179044D01*
|
||||
X27083Y179242D01*
|
||||
X27361Y179433D01*
|
||||
X27644Y179617D01*
|
||||
X27931Y179794D01*
|
||||
X28223Y179964D01*
|
||||
X28518Y180126D01*
|
||||
X28818Y180282D01*
|
||||
X29121Y180430D01*
|
||||
X29428Y180570D01*
|
||||
X29738Y180703D01*
|
||||
X30051Y180829D01*
|
||||
X30368Y180946D01*
|
||||
X30687Y181056D01*
|
||||
X31009Y181158D01*
|
||||
X31333Y181252D01*
|
||||
X31659Y181338D01*
|
||||
X31987Y181416D01*
|
||||
X32318Y181486D01*
|
||||
X32649Y181548D01*
|
||||
X32982Y181601D01*
|
||||
X33317Y181647D01*
|
||||
X33652Y181684D01*
|
||||
X33988Y181713D01*
|
||||
X34325Y181733D01*
|
||||
X34663Y181746D01*
|
||||
X35000Y181750D01*
|
||||
X35337Y181746D01*
|
||||
X35675Y181733D01*
|
||||
X36012Y181713D01*
|
||||
X36348Y181684D01*
|
||||
X36683Y181647D01*
|
||||
X37018Y181601D01*
|
||||
X37351Y181548D01*
|
||||
X37682Y181486D01*
|
||||
X38013Y181416D01*
|
||||
X38341Y181338D01*
|
||||
X38667Y181252D01*
|
||||
X38991Y181158D01*
|
||||
X39313Y181056D01*
|
||||
X39632Y180946D01*
|
||||
X39949Y180829D01*
|
||||
X40262Y180703D01*
|
||||
X40572Y180570D01*
|
||||
X40879Y180430D01*
|
||||
X41182Y180282D01*
|
||||
X41482Y180126D01*
|
||||
X41777Y179964D01*
|
||||
X42069Y179794D01*
|
||||
X42356Y179617D01*
|
||||
X42639Y179433D01*
|
||||
X42917Y179242D01*
|
||||
X43191Y179044D01*
|
||||
X43459Y178840D01*
|
||||
X43723Y178629D01*
|
||||
X43981Y178412D01*
|
||||
X44234Y178188D01*
|
||||
X44481Y177958D01*
|
||||
X44723Y177723D01*
|
||||
X44958Y177481D01*
|
||||
X45188Y177234D01*
|
||||
X45412Y176981D01*
|
||||
X45629Y176723D01*
|
||||
X45840Y176459D01*
|
||||
X46044Y176191D01*
|
||||
X46242Y175917D01*
|
||||
X46433Y175639D01*
|
||||
X46617Y175356D01*
|
||||
X46794Y175069D01*
|
||||
X46964Y174777D01*
|
||||
X47126Y174482D01*
|
||||
X47282Y174182D01*
|
||||
X47430Y173879D01*
|
||||
X47570Y173572D01*
|
||||
X47703Y173262D01*
|
||||
X47829Y172949D01*
|
||||
X47946Y172632D01*
|
||||
X48056Y172313D01*
|
||||
X48158Y171991D01*
|
||||
X48252Y171667D01*
|
||||
X48338Y171341D01*
|
||||
X48416Y171013D01*
|
||||
X48486Y170682D01*
|
||||
X48548Y170351D01*
|
||||
X48601Y170018D01*
|
||||
X48647Y169683D01*
|
||||
X48684Y169348D01*
|
||||
X48713Y169012D01*
|
||||
X48733Y168675D01*
|
||||
X48746Y168337D01*
|
||||
X48750Y168000D01*
|
||||
X48746Y167663D01*
|
||||
X48733Y167325D01*
|
||||
X48713Y166988D01*
|
||||
X48684Y166652D01*
|
||||
X48647Y166317D01*
|
||||
X48601Y165982D01*
|
||||
X48548Y165649D01*
|
||||
X48486Y165318D01*
|
||||
X48416Y164987D01*
|
||||
X48338Y164659D01*
|
||||
X48252Y164333D01*
|
||||
X48158Y164009D01*
|
||||
X48056Y163687D01*
|
||||
X47946Y163368D01*
|
||||
X47829Y163051D01*
|
||||
X47703Y162738D01*
|
||||
X47570Y162428D01*
|
||||
X47430Y162121D01*
|
||||
X47282Y161818D01*
|
||||
X47126Y161518D01*
|
||||
X46964Y161223D01*
|
||||
X46794Y160931D01*
|
||||
X46617Y160644D01*
|
||||
X46433Y160361D01*
|
||||
X46242Y160083D01*
|
||||
X46044Y159809D01*
|
||||
X45840Y159541D01*
|
||||
X45629Y159277D01*
|
||||
X45412Y159019D01*
|
||||
X45188Y158766D01*
|
||||
X44958Y158519D01*
|
||||
X44723Y158277D01*
|
||||
X44481Y158042D01*
|
||||
X44234Y157812D01*
|
||||
X43981Y157588D01*
|
||||
X43723Y157371D01*
|
||||
X43459Y157160D01*
|
||||
X43191Y156956D01*
|
||||
X42917Y156758D01*
|
||||
X42639Y156567D01*
|
||||
X42356Y156383D01*
|
||||
X42069Y156206D01*
|
||||
X41777Y156036D01*
|
||||
X41482Y155874D01*
|
||||
X41182Y155718D01*
|
||||
X40879Y155570D01*
|
||||
X40572Y155430D01*
|
||||
X40262Y155297D01*
|
||||
X39949Y155171D01*
|
||||
X39632Y155054D01*
|
||||
X39313Y154944D01*
|
||||
X38991Y154842D01*
|
||||
X38667Y154748D01*
|
||||
X38341Y154662D01*
|
||||
X38013Y154584D01*
|
||||
X37682Y154514D01*
|
||||
X37351Y154452D01*
|
||||
X37018Y154399D01*
|
||||
X36683Y154353D01*
|
||||
X36348Y154316D01*
|
||||
X36012Y154287D01*
|
||||
X35675Y154267D01*
|
||||
X35337Y154254D01*
|
||||
X35000Y154250D01*
|
||||
X34663Y154254D01*
|
||||
X34325Y154267D01*
|
||||
X33988Y154287D01*
|
||||
X33652Y154316D01*
|
||||
X33317Y154353D01*
|
||||
X32982Y154399D01*
|
||||
X32649Y154452D01*
|
||||
X32318Y154514D01*
|
||||
X31987Y154584D01*
|
||||
X31659Y154662D01*
|
||||
X31333Y154748D01*
|
||||
X31009Y154842D01*
|
||||
X30687Y154944D01*
|
||||
X30368Y155054D01*
|
||||
X30051Y155171D01*
|
||||
X29738Y155297D01*
|
||||
X29428Y155430D01*
|
||||
X29121Y155570D01*
|
||||
X28818Y155718D01*
|
||||
X28518Y155874D01*
|
||||
X28223Y156036D01*
|
||||
X27931Y156206D01*
|
||||
X27644Y156383D01*
|
||||
X27361Y156567D01*
|
||||
X27083Y156758D01*
|
||||
X26809Y156956D01*
|
||||
X26541Y157160D01*
|
||||
X26277Y157371D01*
|
||||
X26019Y157588D01*
|
||||
X25766Y157812D01*
|
||||
X25519Y158042D01*
|
||||
X25277Y158277D01*
|
||||
X25042Y158519D01*
|
||||
X24812Y158766D01*
|
||||
X24588Y159019D01*
|
||||
X24371Y159277D01*
|
||||
X24160Y159541D01*
|
||||
X23956Y159809D01*
|
||||
X23758Y160083D01*
|
||||
X23567Y160361D01*
|
||||
X23383Y160644D01*
|
||||
X23206Y160931D01*
|
||||
X23036Y161223D01*
|
||||
X22874Y161518D01*
|
||||
X22718Y161818D01*
|
||||
X22570Y162121D01*
|
||||
X22430Y162428D01*
|
||||
X22297Y162738D01*
|
||||
X22171Y163051D01*
|
||||
X22054Y163368D01*
|
||||
X21944Y163687D01*
|
||||
X21842Y164009D01*
|
||||
X21748Y164333D01*
|
||||
X21662Y164659D01*
|
||||
X21584Y164987D01*
|
||||
X21514Y165318D01*
|
||||
X21452Y165649D01*
|
||||
X21399Y165982D01*
|
||||
X21353Y166317D01*
|
||||
X21316Y166652D01*
|
||||
X21287Y166988D01*
|
||||
X21267Y167325D01*
|
||||
X21254Y167663D01*
|
||||
X21250Y168000D01*
|
||||
X601250Y168000D02*
|
||||
X601254Y168337D01*
|
||||
X601267Y168675D01*
|
||||
X601287Y169012D01*
|
||||
X601316Y169348D01*
|
||||
X601353Y169683D01*
|
||||
X601399Y170018D01*
|
||||
X601452Y170351D01*
|
||||
X601514Y170682D01*
|
||||
X601584Y171013D01*
|
||||
X601662Y171341D01*
|
||||
X601748Y171667D01*
|
||||
X601842Y171991D01*
|
||||
X601944Y172313D01*
|
||||
X602054Y172632D01*
|
||||
X602171Y172949D01*
|
||||
X602297Y173262D01*
|
||||
X602430Y173572D01*
|
||||
X602570Y173879D01*
|
||||
X602718Y174182D01*
|
||||
X602874Y174482D01*
|
||||
X603036Y174777D01*
|
||||
X603206Y175069D01*
|
||||
X603383Y175356D01*
|
||||
X603567Y175639D01*
|
||||
X603758Y175917D01*
|
||||
X603956Y176191D01*
|
||||
X604160Y176459D01*
|
||||
X604371Y176723D01*
|
||||
X604588Y176981D01*
|
||||
X604812Y177234D01*
|
||||
X605042Y177481D01*
|
||||
X605277Y177723D01*
|
||||
X605519Y177958D01*
|
||||
X605766Y178188D01*
|
||||
X606019Y178412D01*
|
||||
X606277Y178629D01*
|
||||
X606541Y178840D01*
|
||||
X606809Y179044D01*
|
||||
X607083Y179242D01*
|
||||
X607361Y179433D01*
|
||||
X607644Y179617D01*
|
||||
X607931Y179794D01*
|
||||
X608223Y179964D01*
|
||||
X608518Y180126D01*
|
||||
X608818Y180282D01*
|
||||
X609121Y180430D01*
|
||||
X609428Y180570D01*
|
||||
X609738Y180703D01*
|
||||
X610051Y180829D01*
|
||||
X610368Y180946D01*
|
||||
X610687Y181056D01*
|
||||
X611009Y181158D01*
|
||||
X611333Y181252D01*
|
||||
X611659Y181338D01*
|
||||
X611987Y181416D01*
|
||||
X612318Y181486D01*
|
||||
X612649Y181548D01*
|
||||
X612982Y181601D01*
|
||||
X613317Y181647D01*
|
||||
X613652Y181684D01*
|
||||
X613988Y181713D01*
|
||||
X614325Y181733D01*
|
||||
X614663Y181746D01*
|
||||
X615000Y181750D01*
|
||||
X615337Y181746D01*
|
||||
X615675Y181733D01*
|
||||
X616012Y181713D01*
|
||||
X616348Y181684D01*
|
||||
X616683Y181647D01*
|
||||
X617018Y181601D01*
|
||||
X617351Y181548D01*
|
||||
X617682Y181486D01*
|
||||
X618013Y181416D01*
|
||||
X618341Y181338D01*
|
||||
X618667Y181252D01*
|
||||
X618991Y181158D01*
|
||||
X619313Y181056D01*
|
||||
X619632Y180946D01*
|
||||
X619949Y180829D01*
|
||||
X620262Y180703D01*
|
||||
X620572Y180570D01*
|
||||
X620879Y180430D01*
|
||||
X621182Y180282D01*
|
||||
X621482Y180126D01*
|
||||
X621777Y179964D01*
|
||||
X622069Y179794D01*
|
||||
X622356Y179617D01*
|
||||
X622639Y179433D01*
|
||||
X622917Y179242D01*
|
||||
X623191Y179044D01*
|
||||
X623459Y178840D01*
|
||||
X623723Y178629D01*
|
||||
X623981Y178412D01*
|
||||
X624234Y178188D01*
|
||||
X624481Y177958D01*
|
||||
X624723Y177723D01*
|
||||
X624958Y177481D01*
|
||||
X625188Y177234D01*
|
||||
X625412Y176981D01*
|
||||
X625629Y176723D01*
|
||||
X625840Y176459D01*
|
||||
X626044Y176191D01*
|
||||
X626242Y175917D01*
|
||||
X626433Y175639D01*
|
||||
X626617Y175356D01*
|
||||
X626794Y175069D01*
|
||||
X626964Y174777D01*
|
||||
X627126Y174482D01*
|
||||
X627282Y174182D01*
|
||||
X627430Y173879D01*
|
||||
X627570Y173572D01*
|
||||
X627703Y173262D01*
|
||||
X627829Y172949D01*
|
||||
X627946Y172632D01*
|
||||
X628056Y172313D01*
|
||||
X628158Y171991D01*
|
||||
X628252Y171667D01*
|
||||
X628338Y171341D01*
|
||||
X628416Y171013D01*
|
||||
X628486Y170682D01*
|
||||
X628548Y170351D01*
|
||||
X628601Y170018D01*
|
||||
X628647Y169683D01*
|
||||
X628684Y169348D01*
|
||||
X628713Y169012D01*
|
||||
X628733Y168675D01*
|
||||
X628746Y168337D01*
|
||||
X628750Y168000D01*
|
||||
X628746Y167663D01*
|
||||
X628733Y167325D01*
|
||||
X628713Y166988D01*
|
||||
X628684Y166652D01*
|
||||
X628647Y166317D01*
|
||||
X628601Y165982D01*
|
||||
X628548Y165649D01*
|
||||
X628486Y165318D01*
|
||||
X628416Y164987D01*
|
||||
X628338Y164659D01*
|
||||
X628252Y164333D01*
|
||||
X628158Y164009D01*
|
||||
X628056Y163687D01*
|
||||
X627946Y163368D01*
|
||||
X627829Y163051D01*
|
||||
X627703Y162738D01*
|
||||
X627570Y162428D01*
|
||||
X627430Y162121D01*
|
||||
X627282Y161818D01*
|
||||
X627126Y161518D01*
|
||||
X626964Y161223D01*
|
||||
X626794Y160931D01*
|
||||
X626617Y160644D01*
|
||||
X626433Y160361D01*
|
||||
X626242Y160083D01*
|
||||
X626044Y159809D01*
|
||||
X625840Y159541D01*
|
||||
X625629Y159277D01*
|
||||
X625412Y159019D01*
|
||||
X625188Y158766D01*
|
||||
X624958Y158519D01*
|
||||
X624723Y158277D01*
|
||||
X624481Y158042D01*
|
||||
X624234Y157812D01*
|
||||
X623981Y157588D01*
|
||||
X623723Y157371D01*
|
||||
X623459Y157160D01*
|
||||
X623191Y156956D01*
|
||||
X622917Y156758D01*
|
||||
X622639Y156567D01*
|
||||
X622356Y156383D01*
|
||||
X622069Y156206D01*
|
||||
X621777Y156036D01*
|
||||
X621482Y155874D01*
|
||||
X621182Y155718D01*
|
||||
X620879Y155570D01*
|
||||
X620572Y155430D01*
|
||||
X620262Y155297D01*
|
||||
X619949Y155171D01*
|
||||
X619632Y155054D01*
|
||||
X619313Y154944D01*
|
||||
X618991Y154842D01*
|
||||
X618667Y154748D01*
|
||||
X618341Y154662D01*
|
||||
X618013Y154584D01*
|
||||
X617682Y154514D01*
|
||||
X617351Y154452D01*
|
||||
X617018Y154399D01*
|
||||
X616683Y154353D01*
|
||||
X616348Y154316D01*
|
||||
X616012Y154287D01*
|
||||
X615675Y154267D01*
|
||||
X615337Y154254D01*
|
||||
X615000Y154250D01*
|
||||
X614663Y154254D01*
|
||||
X614325Y154267D01*
|
||||
X613988Y154287D01*
|
||||
X613652Y154316D01*
|
||||
X613317Y154353D01*
|
||||
X612982Y154399D01*
|
||||
X612649Y154452D01*
|
||||
X612318Y154514D01*
|
||||
X611987Y154584D01*
|
||||
X611659Y154662D01*
|
||||
X611333Y154748D01*
|
||||
X611009Y154842D01*
|
||||
X610687Y154944D01*
|
||||
X610368Y155054D01*
|
||||
X610051Y155171D01*
|
||||
X609738Y155297D01*
|
||||
X609428Y155430D01*
|
||||
X609121Y155570D01*
|
||||
X608818Y155718D01*
|
||||
X608518Y155874D01*
|
||||
X608223Y156036D01*
|
||||
X607931Y156206D01*
|
||||
X607644Y156383D01*
|
||||
X607361Y156567D01*
|
||||
X607083Y156758D01*
|
||||
X606809Y156956D01*
|
||||
X606541Y157160D01*
|
||||
X606277Y157371D01*
|
||||
X606019Y157588D01*
|
||||
X605766Y157812D01*
|
||||
X605519Y158042D01*
|
||||
X605277Y158277D01*
|
||||
X605042Y158519D01*
|
||||
X604812Y158766D01*
|
||||
X604588Y159019D01*
|
||||
X604371Y159277D01*
|
||||
X604160Y159541D01*
|
||||
X603956Y159809D01*
|
||||
X603758Y160083D01*
|
||||
X603567Y160361D01*
|
||||
X603383Y160644D01*
|
||||
X603206Y160931D01*
|
||||
X603036Y161223D01*
|
||||
X602874Y161518D01*
|
||||
X602718Y161818D01*
|
||||
X602570Y162121D01*
|
||||
X602430Y162428D01*
|
||||
X602297Y162738D01*
|
||||
X602171Y163051D01*
|
||||
X602054Y163368D01*
|
||||
X601944Y163687D01*
|
||||
X601842Y164009D01*
|
||||
X601748Y164333D01*
|
||||
X601662Y164659D01*
|
||||
X601584Y164987D01*
|
||||
X601514Y165318D01*
|
||||
X601452Y165649D01*
|
||||
X601399Y165982D01*
|
||||
X601353Y166317D01*
|
||||
X601316Y166652D01*
|
||||
X601287Y166988D01*
|
||||
X601267Y167325D01*
|
||||
X601254Y167663D01*
|
||||
X601250Y168000D01*
|
||||
M02*
|
||||
5269
examples/inputs/sonopi-digi.GTL
Normal file
5269
examples/inputs/sonopi-digi.GTL
Normal file
File diff suppressed because it is too large
Load diff
17028
examples/inputs/sonopi-digi.GTO
Normal file
17028
examples/inputs/sonopi-digi.GTO
Normal file
File diff suppressed because it is too large
Load diff
63
examples/inputs/sonopi-digi.GTP
Normal file
63
examples/inputs/sonopi-digi.GTP
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,1.080000X1.050000*%
|
||||
%ADD11R,1.800000X0.450000*%
|
||||
%ADD12R,1.000000X0.450000*%
|
||||
%ADD13R,1.900000X1.200000*%
|
||||
|
||||
|
||||
D10*
|
||||
X227330Y81930D03*
|
||||
X227330Y64430D03*
|
||||
X349250Y122570D03*
|
||||
X349250Y105070D03*
|
||||
X251460Y23790D03*
|
||||
X251460Y41290D03*
|
||||
X323850Y41290D03*
|
||||
X323850Y23790D03*
|
||||
X154940Y86020D03*
|
||||
X154940Y103520D03*
|
||||
D11*
|
||||
X252790Y124020D03*
|
||||
X252790Y117520D03*
|
||||
X252790Y111020D03*
|
||||
X252790Y104520D03*
|
||||
X252790Y98020D03*
|
||||
X252790Y91520D03*
|
||||
X252790Y85020D03*
|
||||
X252790Y78520D03*
|
||||
X252790Y72020D03*
|
||||
X252790Y65520D03*
|
||||
X323790Y65520D03*
|
||||
X323790Y72020D03*
|
||||
X323790Y78520D03*
|
||||
X323790Y85020D03*
|
||||
X323790Y91520D03*
|
||||
X323790Y98020D03*
|
||||
X323790Y104520D03*
|
||||
X323790Y111020D03*
|
||||
X323790Y117520D03*
|
||||
X323790Y124020D03*
|
||||
D12*
|
||||
X176690Y109310D03*
|
||||
X196690Y109310D03*
|
||||
X176690Y101310D03*
|
||||
X196690Y101310D03*
|
||||
X176690Y93310D03*
|
||||
X196690Y93310D03*
|
||||
X176690Y85310D03*
|
||||
X196690Y85310D03*
|
||||
D13*
|
||||
X275690Y24540D03*
|
||||
X300890Y24540D03*
|
||||
X300890Y40540D03*
|
||||
X275690Y40540D03*
|
||||
M02*
|
||||
120
examples/inputs/sonopi-digi.GTS
Normal file
120
examples/inputs/sonopi-digi.GTS
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,1.080000X1.050000*%
|
||||
%ADD11R,1.800000X0.450000*%
|
||||
%ADD12C,1.381250*%
|
||||
%ADD13C,1.725000*%
|
||||
%ADD14R,1.000000X0.450000*%
|
||||
%ADD15C,2.750000*%
|
||||
%ADD16R,1.778000X1.778000*%
|
||||
%ADD17C,1.778000*%
|
||||
%ADD18R,1.900000X1.200000*%
|
||||
|
||||
|
||||
D10*
|
||||
X227330Y81930D03*
|
||||
X227330Y64430D03*
|
||||
X349250Y122570D03*
|
||||
X349250Y105070D03*
|
||||
X251460Y23790D03*
|
||||
X251460Y41290D03*
|
||||
X323850Y41290D03*
|
||||
X323850Y23790D03*
|
||||
X154940Y86020D03*
|
||||
X154940Y103520D03*
|
||||
D11*
|
||||
X252790Y124020D03*
|
||||
X252790Y117520D03*
|
||||
X252790Y111020D03*
|
||||
X252790Y104520D03*
|
||||
X252790Y98020D03*
|
||||
X252790Y91520D03*
|
||||
X252790Y85020D03*
|
||||
X252790Y78520D03*
|
||||
X252790Y72020D03*
|
||||
X252790Y65520D03*
|
||||
X323790Y65520D03*
|
||||
X323790Y72020D03*
|
||||
X323790Y78520D03*
|
||||
X323790Y85020D03*
|
||||
X323790Y91520D03*
|
||||
X323790Y98020D03*
|
||||
X323790Y104520D03*
|
||||
X323790Y111020D03*
|
||||
X323790Y117520D03*
|
||||
X323790Y124020D03*
|
||||
D12*
|
||||
X110950Y107470D03*
|
||||
X110950Y82070D03*
|
||||
X110950Y56670D03*
|
||||
D13*
|
||||
X84650Y107470D03*
|
||||
X84650Y56670D03*
|
||||
D14*
|
||||
X176690Y109310D03*
|
||||
X196690Y109310D03*
|
||||
X176690Y101310D03*
|
||||
X196690Y101310D03*
|
||||
X176690Y93310D03*
|
||||
X196690Y93310D03*
|
||||
X176690Y85310D03*
|
||||
X196690Y85310D03*
|
||||
D15*
|
||||
X35000Y168000D03*
|
||||
X615000Y168000D03*
|
||||
D16*
|
||||
X83700Y155300D03*
|
||||
D17*
|
||||
X83700Y180700D03*
|
||||
X109100Y155300D03*
|
||||
X109100Y180700D03*
|
||||
X134500Y155300D03*
|
||||
X134500Y180700D03*
|
||||
X159900Y155300D03*
|
||||
X159900Y180700D03*
|
||||
X185300Y155300D03*
|
||||
X185300Y180700D03*
|
||||
X210700Y155300D03*
|
||||
X210700Y180700D03*
|
||||
X236100Y155300D03*
|
||||
X236100Y180700D03*
|
||||
X261500Y155300D03*
|
||||
X261500Y180700D03*
|
||||
X286900Y155300D03*
|
||||
X286900Y180700D03*
|
||||
X312300Y155300D03*
|
||||
X312300Y180700D03*
|
||||
X337700Y155300D03*
|
||||
X337700Y180700D03*
|
||||
X363100Y155300D03*
|
||||
X363100Y180700D03*
|
||||
X388500Y155300D03*
|
||||
X388500Y180700D03*
|
||||
X413900Y155300D03*
|
||||
X413900Y180700D03*
|
||||
X439300Y155300D03*
|
||||
X439300Y180700D03*
|
||||
X464700Y155300D03*
|
||||
X464700Y180700D03*
|
||||
X490100Y155300D03*
|
||||
X490100Y180700D03*
|
||||
X515500Y155300D03*
|
||||
X515500Y180700D03*
|
||||
X540900Y155300D03*
|
||||
X540900Y180700D03*
|
||||
X566300Y155300D03*
|
||||
X566300Y180700D03*
|
||||
D18*
|
||||
X275690Y24540D03*
|
||||
X300890Y24540D03*
|
||||
X300890Y40540D03*
|
||||
X275690Y40540D03*
|
||||
M02*
|
||||
92
examples/inputs/sonopi-digi.TXT
Normal file
92
examples/inputs/sonopi-digi.TXT
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
M48
|
||||
;GenerationSoftware,Autodesk,EAGLE,9.3.0*%
|
||||
;CreationDate,2019-03-17T12:32:03Z*%
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T5C0.350
|
||||
T4C0.850
|
||||
T3C1.000
|
||||
T2C1.150
|
||||
T1C2.750
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T1
|
||||
X61500Y16800
|
||||
X3500Y16800
|
||||
T2
|
||||
X8465Y5667
|
||||
X8465Y10747
|
||||
T3
|
||||
X56630Y18070
|
||||
X15990Y15530
|
||||
X56630Y15530
|
||||
X54090Y18070
|
||||
X54090Y15530
|
||||
X51550Y18070
|
||||
X51550Y15530
|
||||
X49010Y18070
|
||||
X49010Y15530
|
||||
X46470Y18070
|
||||
X46470Y15530
|
||||
X43930Y18070
|
||||
X43930Y15530
|
||||
X41390Y18070
|
||||
X41390Y15530
|
||||
X38850Y18070
|
||||
X38850Y15530
|
||||
X36310Y18070
|
||||
X36310Y15530
|
||||
X33770Y18070
|
||||
X33770Y15530
|
||||
X31230Y18070
|
||||
X31230Y15530
|
||||
X26150Y15530
|
||||
X23610Y18070
|
||||
X23610Y15530
|
||||
X28690Y18070
|
||||
X13450Y15530
|
||||
X8370Y15530
|
||||
X8370Y18070
|
||||
X10910Y15530
|
||||
X10910Y18070
|
||||
X28690Y15530
|
||||
X13450Y18070
|
||||
X26150Y18070
|
||||
X15990Y18070
|
||||
X18530Y15530
|
||||
X18530Y18070
|
||||
X21070Y15530
|
||||
X21070Y18070
|
||||
T4
|
||||
X11095Y5667
|
||||
X11095Y8207
|
||||
X11095Y10747
|
||||
T5
|
||||
X40640Y8509
|
||||
X39243Y8509
|
||||
X35306Y8509
|
||||
X36576Y8509
|
||||
X37846Y8509
|
||||
X15748Y12700
|
||||
X17018Y12192
|
||||
X17018Y13462
|
||||
X19558Y12192
|
||||
X19558Y13462
|
||||
X18288Y12700
|
||||
X22098Y12192
|
||||
X22098Y13462
|
||||
X20828Y12700
|
||||
X23368Y12700
|
||||
X29718Y7620
|
||||
X29083Y8890
|
||||
X28448Y7620
|
||||
X27178Y7620
|
||||
X27813Y8890
|
||||
X28448Y10160
|
||||
X27178Y10160
|
||||
X27178Y11430
|
||||
X42164Y8509
|
||||
X34036Y8509
|
||||
M30
|
||||
4664
examples/inputs/stm32breakout.GBL
Normal file
4664
examples/inputs/stm32breakout.GBL
Normal file
File diff suppressed because it is too large
Load diff
995
examples/inputs/stm32breakout.GBO
Normal file
995
examples/inputs/stm32breakout.GBO
Normal file
|
|
@ -0,0 +1,995 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSilk bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,0.050800*%
|
||||
%ADD11C,0.127000*%
|
||||
%ADD12C,0.076200*%
|
||||
|
||||
|
||||
D10*
|
||||
X232821Y106934D02*
|
||||
X234402Y106934D01*
|
||||
X234480Y106936D01*
|
||||
X234557Y106942D01*
|
||||
X234634Y106951D01*
|
||||
X234710Y106964D01*
|
||||
X234786Y106981D01*
|
||||
X234861Y107002D01*
|
||||
X234934Y107026D01*
|
||||
X235007Y107054D01*
|
||||
X235078Y107086D01*
|
||||
X235147Y107121D01*
|
||||
X235214Y107159D01*
|
||||
X235280Y107200D01*
|
||||
X235343Y107245D01*
|
||||
X235404Y107293D01*
|
||||
X235463Y107343D01*
|
||||
X235519Y107397D01*
|
||||
X235573Y107453D01*
|
||||
X235623Y107512D01*
|
||||
X235671Y107573D01*
|
||||
X235716Y107636D01*
|
||||
X235757Y107702D01*
|
||||
X235795Y107769D01*
|
||||
X235830Y107838D01*
|
||||
X235862Y107909D01*
|
||||
X235890Y107982D01*
|
||||
X235914Y108055D01*
|
||||
X235935Y108130D01*
|
||||
X235952Y108206D01*
|
||||
X235965Y108282D01*
|
||||
X235974Y108359D01*
|
||||
X235980Y108436D01*
|
||||
X235982Y108514D01*
|
||||
X235982Y112466D01*
|
||||
X235980Y112544D01*
|
||||
X235974Y112621D01*
|
||||
X235965Y112698D01*
|
||||
X235952Y112774D01*
|
||||
X235935Y112850D01*
|
||||
X235914Y112925D01*
|
||||
X235890Y112998D01*
|
||||
X235862Y113071D01*
|
||||
X235830Y113142D01*
|
||||
X235795Y113211D01*
|
||||
X235757Y113278D01*
|
||||
X235716Y113344D01*
|
||||
X235671Y113407D01*
|
||||
X235623Y113468D01*
|
||||
X235573Y113527D01*
|
||||
X235519Y113583D01*
|
||||
X235463Y113637D01*
|
||||
X235404Y113687D01*
|
||||
X235343Y113735D01*
|
||||
X235280Y113780D01*
|
||||
X235214Y113821D01*
|
||||
X235147Y113859D01*
|
||||
X235078Y113894D01*
|
||||
X235007Y113926D01*
|
||||
X234934Y113954D01*
|
||||
X234861Y113978D01*
|
||||
X234786Y113999D01*
|
||||
X234710Y114016D01*
|
||||
X234634Y114029D01*
|
||||
X234557Y114038D01*
|
||||
X234480Y114044D01*
|
||||
X234402Y114046D01*
|
||||
X232821Y114046D01*
|
||||
X230249Y110885D02*
|
||||
X227878Y110885D01*
|
||||
X227800Y110883D01*
|
||||
X227723Y110877D01*
|
||||
X227646Y110868D01*
|
||||
X227570Y110855D01*
|
||||
X227494Y110838D01*
|
||||
X227419Y110817D01*
|
||||
X227346Y110793D01*
|
||||
X227273Y110765D01*
|
||||
X227202Y110733D01*
|
||||
X227133Y110698D01*
|
||||
X227066Y110660D01*
|
||||
X227000Y110619D01*
|
||||
X226937Y110574D01*
|
||||
X226876Y110526D01*
|
||||
X226817Y110476D01*
|
||||
X226761Y110422D01*
|
||||
X226707Y110366D01*
|
||||
X226657Y110307D01*
|
||||
X226609Y110246D01*
|
||||
X226564Y110183D01*
|
||||
X226523Y110117D01*
|
||||
X226485Y110050D01*
|
||||
X226450Y109981D01*
|
||||
X226418Y109910D01*
|
||||
X226390Y109837D01*
|
||||
X226366Y109764D01*
|
||||
X226345Y109689D01*
|
||||
X226328Y109613D01*
|
||||
X226315Y109537D01*
|
||||
X226306Y109460D01*
|
||||
X226300Y109383D01*
|
||||
X226298Y109305D01*
|
||||
X226298Y108910D01*
|
||||
X226297Y108910D02*
|
||||
X226299Y108823D01*
|
||||
X226305Y108735D01*
|
||||
X226314Y108648D01*
|
||||
X226328Y108562D01*
|
||||
X226345Y108476D01*
|
||||
X226366Y108392D01*
|
||||
X226391Y108308D01*
|
||||
X226420Y108225D01*
|
||||
X226452Y108144D01*
|
||||
X226487Y108064D01*
|
||||
X226526Y107986D01*
|
||||
X226569Y107909D01*
|
||||
X226615Y107835D01*
|
||||
X226664Y107763D01*
|
||||
X226716Y107693D01*
|
||||
X226772Y107625D01*
|
||||
X226830Y107560D01*
|
||||
X226891Y107497D01*
|
||||
X226955Y107438D01*
|
||||
X227022Y107381D01*
|
||||
X227090Y107327D01*
|
||||
X227162Y107276D01*
|
||||
X227235Y107229D01*
|
||||
X227310Y107184D01*
|
||||
X227388Y107143D01*
|
||||
X227467Y107106D01*
|
||||
X227547Y107072D01*
|
||||
X227629Y107042D01*
|
||||
X227712Y107015D01*
|
||||
X227797Y106992D01*
|
||||
X227882Y106973D01*
|
||||
X227968Y106958D01*
|
||||
X228055Y106946D01*
|
||||
X228142Y106938D01*
|
||||
X228229Y106934D01*
|
||||
X228317Y106934D01*
|
||||
X228404Y106938D01*
|
||||
X228491Y106946D01*
|
||||
X228578Y106958D01*
|
||||
X228664Y106973D01*
|
||||
X228749Y106992D01*
|
||||
X228834Y107015D01*
|
||||
X228917Y107042D01*
|
||||
X228999Y107072D01*
|
||||
X229079Y107106D01*
|
||||
X229158Y107143D01*
|
||||
X229236Y107184D01*
|
||||
X229311Y107229D01*
|
||||
X229384Y107276D01*
|
||||
X229456Y107327D01*
|
||||
X229524Y107381D01*
|
||||
X229591Y107438D01*
|
||||
X229655Y107497D01*
|
||||
X229716Y107560D01*
|
||||
X229774Y107625D01*
|
||||
X229830Y107693D01*
|
||||
X229882Y107763D01*
|
||||
X229931Y107835D01*
|
||||
X229977Y107909D01*
|
||||
X230020Y107986D01*
|
||||
X230059Y108064D01*
|
||||
X230094Y108144D01*
|
||||
X230126Y108225D01*
|
||||
X230155Y108308D01*
|
||||
X230180Y108392D01*
|
||||
X230201Y108476D01*
|
||||
X230218Y108562D01*
|
||||
X230232Y108648D01*
|
||||
X230241Y108735D01*
|
||||
X230247Y108823D01*
|
||||
X230249Y108910D01*
|
||||
X230249Y110885D01*
|
||||
X230247Y110995D01*
|
||||
X230241Y111106D01*
|
||||
X230232Y111215D01*
|
||||
X230218Y111325D01*
|
||||
X230201Y111434D01*
|
||||
X230180Y111542D01*
|
||||
X230155Y111650D01*
|
||||
X230127Y111756D01*
|
||||
X230094Y111862D01*
|
||||
X230058Y111966D01*
|
||||
X230019Y112069D01*
|
||||
X229976Y112171D01*
|
||||
X229929Y112271D01*
|
||||
X229879Y112369D01*
|
||||
X229826Y112466D01*
|
||||
X229769Y112560D01*
|
||||
X229709Y112653D01*
|
||||
X229645Y112743D01*
|
||||
X229579Y112831D01*
|
||||
X229509Y112917D01*
|
||||
X229437Y113000D01*
|
||||
X229362Y113081D01*
|
||||
X229284Y113159D01*
|
||||
X229203Y113234D01*
|
||||
X229120Y113306D01*
|
||||
X229034Y113376D01*
|
||||
X228946Y113442D01*
|
||||
X228856Y113506D01*
|
||||
X228763Y113566D01*
|
||||
X228669Y113623D01*
|
||||
X228572Y113676D01*
|
||||
X228474Y113726D01*
|
||||
X228374Y113773D01*
|
||||
X228272Y113816D01*
|
||||
X228169Y113855D01*
|
||||
X228065Y113891D01*
|
||||
X227959Y113924D01*
|
||||
X227853Y113952D01*
|
||||
X227745Y113977D01*
|
||||
X227637Y113998D01*
|
||||
X227528Y114015D01*
|
||||
X227418Y114029D01*
|
||||
X227309Y114038D01*
|
||||
X227198Y114044D01*
|
||||
X227088Y114046D01*
|
||||
X234091Y59944D02*
|
||||
X235672Y59944D01*
|
||||
X235750Y59946D01*
|
||||
X235827Y59952D01*
|
||||
X235904Y59961D01*
|
||||
X235980Y59974D01*
|
||||
X236056Y59991D01*
|
||||
X236131Y60012D01*
|
||||
X236204Y60036D01*
|
||||
X236277Y60064D01*
|
||||
X236348Y60096D01*
|
||||
X236417Y60131D01*
|
||||
X236484Y60169D01*
|
||||
X236550Y60210D01*
|
||||
X236613Y60255D01*
|
||||
X236674Y60303D01*
|
||||
X236733Y60353D01*
|
||||
X236789Y60407D01*
|
||||
X236843Y60463D01*
|
||||
X236893Y60522D01*
|
||||
X236941Y60583D01*
|
||||
X236986Y60646D01*
|
||||
X237027Y60712D01*
|
||||
X237065Y60779D01*
|
||||
X237100Y60848D01*
|
||||
X237132Y60919D01*
|
||||
X237160Y60992D01*
|
||||
X237184Y61065D01*
|
||||
X237205Y61140D01*
|
||||
X237222Y61216D01*
|
||||
X237235Y61292D01*
|
||||
X237244Y61369D01*
|
||||
X237250Y61446D01*
|
||||
X237252Y61524D01*
|
||||
X237252Y65476D01*
|
||||
X237250Y65554D01*
|
||||
X237244Y65631D01*
|
||||
X237235Y65708D01*
|
||||
X237222Y65784D01*
|
||||
X237205Y65860D01*
|
||||
X237184Y65935D01*
|
||||
X237160Y66008D01*
|
||||
X237132Y66081D01*
|
||||
X237100Y66152D01*
|
||||
X237065Y66221D01*
|
||||
X237027Y66288D01*
|
||||
X236986Y66354D01*
|
||||
X236941Y66417D01*
|
||||
X236893Y66478D01*
|
||||
X236843Y66537D01*
|
||||
X236789Y66593D01*
|
||||
X236733Y66647D01*
|
||||
X236674Y66697D01*
|
||||
X236613Y66745D01*
|
||||
X236550Y66790D01*
|
||||
X236484Y66831D01*
|
||||
X236417Y66869D01*
|
||||
X236348Y66904D01*
|
||||
X236277Y66936D01*
|
||||
X236204Y66964D01*
|
||||
X236131Y66988D01*
|
||||
X236056Y67009D01*
|
||||
X235980Y67026D01*
|
||||
X235904Y67039D01*
|
||||
X235827Y67048D01*
|
||||
X235750Y67054D01*
|
||||
X235672Y67056D01*
|
||||
X234091Y67056D01*
|
||||
X231519Y67056D02*
|
||||
X231519Y66266D01*
|
||||
X231519Y67056D02*
|
||||
X227568Y67056D01*
|
||||
X229543Y59944D01*
|
||||
X125182Y52324D02*
|
||||
X123601Y52324D01*
|
||||
X125182Y52324D02*
|
||||
X125260Y52326D01*
|
||||
X125337Y52332D01*
|
||||
X125414Y52341D01*
|
||||
X125490Y52354D01*
|
||||
X125566Y52371D01*
|
||||
X125641Y52392D01*
|
||||
X125714Y52416D01*
|
||||
X125787Y52444D01*
|
||||
X125858Y52476D01*
|
||||
X125927Y52511D01*
|
||||
X125994Y52549D01*
|
||||
X126060Y52590D01*
|
||||
X126123Y52635D01*
|
||||
X126184Y52683D01*
|
||||
X126243Y52733D01*
|
||||
X126299Y52787D01*
|
||||
X126353Y52843D01*
|
||||
X126403Y52902D01*
|
||||
X126451Y52963D01*
|
||||
X126496Y53026D01*
|
||||
X126537Y53092D01*
|
||||
X126575Y53159D01*
|
||||
X126610Y53228D01*
|
||||
X126642Y53299D01*
|
||||
X126670Y53372D01*
|
||||
X126694Y53445D01*
|
||||
X126715Y53520D01*
|
||||
X126732Y53596D01*
|
||||
X126745Y53672D01*
|
||||
X126754Y53749D01*
|
||||
X126760Y53826D01*
|
||||
X126762Y53904D01*
|
||||
X126762Y57856D01*
|
||||
X126760Y57934D01*
|
||||
X126754Y58011D01*
|
||||
X126745Y58088D01*
|
||||
X126732Y58164D01*
|
||||
X126715Y58240D01*
|
||||
X126694Y58315D01*
|
||||
X126670Y58388D01*
|
||||
X126642Y58461D01*
|
||||
X126610Y58532D01*
|
||||
X126575Y58601D01*
|
||||
X126537Y58668D01*
|
||||
X126496Y58734D01*
|
||||
X126451Y58797D01*
|
||||
X126403Y58858D01*
|
||||
X126353Y58917D01*
|
||||
X126299Y58973D01*
|
||||
X126243Y59027D01*
|
||||
X126184Y59077D01*
|
||||
X126123Y59125D01*
|
||||
X126060Y59170D01*
|
||||
X125994Y59211D01*
|
||||
X125927Y59249D01*
|
||||
X125858Y59284D01*
|
||||
X125787Y59316D01*
|
||||
X125714Y59344D01*
|
||||
X125641Y59368D01*
|
||||
X125566Y59389D01*
|
||||
X125490Y59406D01*
|
||||
X125414Y59419D01*
|
||||
X125337Y59428D01*
|
||||
X125260Y59434D01*
|
||||
X125182Y59436D01*
|
||||
X123601Y59436D01*
|
||||
X121029Y54300D02*
|
||||
X121027Y54387D01*
|
||||
X121021Y54475D01*
|
||||
X121012Y54562D01*
|
||||
X120998Y54648D01*
|
||||
X120981Y54734D01*
|
||||
X120960Y54818D01*
|
||||
X120935Y54902D01*
|
||||
X120906Y54985D01*
|
||||
X120874Y55066D01*
|
||||
X120839Y55146D01*
|
||||
X120800Y55224D01*
|
||||
X120757Y55301D01*
|
||||
X120711Y55375D01*
|
||||
X120662Y55447D01*
|
||||
X120610Y55517D01*
|
||||
X120554Y55585D01*
|
||||
X120496Y55650D01*
|
||||
X120435Y55713D01*
|
||||
X120371Y55772D01*
|
||||
X120304Y55829D01*
|
||||
X120236Y55883D01*
|
||||
X120164Y55934D01*
|
||||
X120091Y55981D01*
|
||||
X120016Y56026D01*
|
||||
X119938Y56067D01*
|
||||
X119859Y56104D01*
|
||||
X119779Y56138D01*
|
||||
X119697Y56168D01*
|
||||
X119614Y56195D01*
|
||||
X119529Y56218D01*
|
||||
X119444Y56237D01*
|
||||
X119358Y56252D01*
|
||||
X119271Y56264D01*
|
||||
X119184Y56272D01*
|
||||
X119097Y56276D01*
|
||||
X119009Y56276D01*
|
||||
X118922Y56272D01*
|
||||
X118835Y56264D01*
|
||||
X118748Y56252D01*
|
||||
X118662Y56237D01*
|
||||
X118577Y56218D01*
|
||||
X118492Y56195D01*
|
||||
X118409Y56168D01*
|
||||
X118327Y56138D01*
|
||||
X118247Y56104D01*
|
||||
X118168Y56067D01*
|
||||
X118090Y56026D01*
|
||||
X118015Y55981D01*
|
||||
X117942Y55934D01*
|
||||
X117870Y55883D01*
|
||||
X117802Y55829D01*
|
||||
X117735Y55772D01*
|
||||
X117671Y55713D01*
|
||||
X117610Y55650D01*
|
||||
X117552Y55585D01*
|
||||
X117496Y55517D01*
|
||||
X117444Y55447D01*
|
||||
X117395Y55375D01*
|
||||
X117349Y55301D01*
|
||||
X117306Y55224D01*
|
||||
X117267Y55146D01*
|
||||
X117232Y55066D01*
|
||||
X117200Y54985D01*
|
||||
X117171Y54902D01*
|
||||
X117146Y54818D01*
|
||||
X117125Y54734D01*
|
||||
X117108Y54648D01*
|
||||
X117094Y54562D01*
|
||||
X117085Y54475D01*
|
||||
X117079Y54387D01*
|
||||
X117077Y54300D01*
|
||||
X117079Y54213D01*
|
||||
X117085Y54125D01*
|
||||
X117094Y54038D01*
|
||||
X117108Y53952D01*
|
||||
X117125Y53866D01*
|
||||
X117146Y53782D01*
|
||||
X117171Y53698D01*
|
||||
X117200Y53615D01*
|
||||
X117232Y53534D01*
|
||||
X117267Y53454D01*
|
||||
X117306Y53376D01*
|
||||
X117349Y53299D01*
|
||||
X117395Y53225D01*
|
||||
X117444Y53153D01*
|
||||
X117496Y53083D01*
|
||||
X117552Y53015D01*
|
||||
X117610Y52950D01*
|
||||
X117671Y52887D01*
|
||||
X117735Y52828D01*
|
||||
X117802Y52771D01*
|
||||
X117870Y52717D01*
|
||||
X117942Y52666D01*
|
||||
X118015Y52619D01*
|
||||
X118090Y52574D01*
|
||||
X118168Y52533D01*
|
||||
X118247Y52496D01*
|
||||
X118327Y52462D01*
|
||||
X118409Y52432D01*
|
||||
X118492Y52405D01*
|
||||
X118577Y52382D01*
|
||||
X118662Y52363D01*
|
||||
X118748Y52348D01*
|
||||
X118835Y52336D01*
|
||||
X118922Y52328D01*
|
||||
X119009Y52324D01*
|
||||
X119097Y52324D01*
|
||||
X119184Y52328D01*
|
||||
X119271Y52336D01*
|
||||
X119358Y52348D01*
|
||||
X119444Y52363D01*
|
||||
X119529Y52382D01*
|
||||
X119614Y52405D01*
|
||||
X119697Y52432D01*
|
||||
X119779Y52462D01*
|
||||
X119859Y52496D01*
|
||||
X119938Y52533D01*
|
||||
X120016Y52574D01*
|
||||
X120091Y52619D01*
|
||||
X120164Y52666D01*
|
||||
X120236Y52717D01*
|
||||
X120304Y52771D01*
|
||||
X120371Y52828D01*
|
||||
X120435Y52887D01*
|
||||
X120496Y52950D01*
|
||||
X120554Y53015D01*
|
||||
X120610Y53083D01*
|
||||
X120662Y53153D01*
|
||||
X120711Y53225D01*
|
||||
X120757Y53299D01*
|
||||
X120800Y53376D01*
|
||||
X120839Y53454D01*
|
||||
X120874Y53534D01*
|
||||
X120906Y53615D01*
|
||||
X120935Y53698D01*
|
||||
X120960Y53782D01*
|
||||
X120981Y53866D01*
|
||||
X120998Y53952D01*
|
||||
X121012Y54038D01*
|
||||
X121021Y54125D01*
|
||||
X121027Y54213D01*
|
||||
X121029Y54300D01*
|
||||
X120633Y57856D02*
|
||||
X120631Y57935D01*
|
||||
X120625Y58013D01*
|
||||
X120615Y58091D01*
|
||||
X120602Y58169D01*
|
||||
X120584Y58246D01*
|
||||
X120563Y58322D01*
|
||||
X120538Y58396D01*
|
||||
X120509Y58470D01*
|
||||
X120477Y58542D01*
|
||||
X120441Y58612D01*
|
||||
X120401Y58680D01*
|
||||
X120358Y58746D01*
|
||||
X120312Y58810D01*
|
||||
X120263Y58872D01*
|
||||
X120211Y58931D01*
|
||||
X120156Y58987D01*
|
||||
X120098Y59041D01*
|
||||
X120038Y59091D01*
|
||||
X119975Y59139D01*
|
||||
X119910Y59183D01*
|
||||
X119843Y59224D01*
|
||||
X119774Y59262D01*
|
||||
X119703Y59296D01*
|
||||
X119630Y59327D01*
|
||||
X119556Y59354D01*
|
||||
X119481Y59377D01*
|
||||
X119405Y59396D01*
|
||||
X119327Y59412D01*
|
||||
X119249Y59424D01*
|
||||
X119171Y59432D01*
|
||||
X119092Y59436D01*
|
||||
X119014Y59436D01*
|
||||
X118935Y59432D01*
|
||||
X118857Y59424D01*
|
||||
X118779Y59412D01*
|
||||
X118701Y59396D01*
|
||||
X118625Y59377D01*
|
||||
X118550Y59354D01*
|
||||
X118476Y59327D01*
|
||||
X118403Y59296D01*
|
||||
X118332Y59262D01*
|
||||
X118263Y59224D01*
|
||||
X118196Y59183D01*
|
||||
X118131Y59139D01*
|
||||
X118068Y59091D01*
|
||||
X118008Y59041D01*
|
||||
X117950Y58987D01*
|
||||
X117895Y58931D01*
|
||||
X117843Y58872D01*
|
||||
X117794Y58810D01*
|
||||
X117748Y58746D01*
|
||||
X117705Y58680D01*
|
||||
X117665Y58612D01*
|
||||
X117629Y58542D01*
|
||||
X117597Y58470D01*
|
||||
X117568Y58396D01*
|
||||
X117543Y58322D01*
|
||||
X117522Y58246D01*
|
||||
X117504Y58169D01*
|
||||
X117491Y58091D01*
|
||||
X117481Y58013D01*
|
||||
X117475Y57935D01*
|
||||
X117473Y57856D01*
|
||||
X117475Y57777D01*
|
||||
X117481Y57699D01*
|
||||
X117491Y57621D01*
|
||||
X117504Y57543D01*
|
||||
X117522Y57466D01*
|
||||
X117543Y57390D01*
|
||||
X117568Y57316D01*
|
||||
X117597Y57242D01*
|
||||
X117629Y57170D01*
|
||||
X117665Y57100D01*
|
||||
X117705Y57032D01*
|
||||
X117748Y56966D01*
|
||||
X117794Y56902D01*
|
||||
X117843Y56840D01*
|
||||
X117895Y56781D01*
|
||||
X117950Y56725D01*
|
||||
X118008Y56671D01*
|
||||
X118068Y56621D01*
|
||||
X118131Y56573D01*
|
||||
X118196Y56529D01*
|
||||
X118263Y56488D01*
|
||||
X118332Y56450D01*
|
||||
X118403Y56416D01*
|
||||
X118476Y56385D01*
|
||||
X118550Y56358D01*
|
||||
X118625Y56335D01*
|
||||
X118701Y56316D01*
|
||||
X118779Y56300D01*
|
||||
X118857Y56288D01*
|
||||
X118935Y56280D01*
|
||||
X119014Y56276D01*
|
||||
X119092Y56276D01*
|
||||
X119171Y56280D01*
|
||||
X119249Y56288D01*
|
||||
X119327Y56300D01*
|
||||
X119405Y56316D01*
|
||||
X119481Y56335D01*
|
||||
X119556Y56358D01*
|
||||
X119630Y56385D01*
|
||||
X119703Y56416D01*
|
||||
X119774Y56450D01*
|
||||
X119843Y56488D01*
|
||||
X119910Y56529D01*
|
||||
X119975Y56573D01*
|
||||
X120038Y56621D01*
|
||||
X120098Y56671D01*
|
||||
X120156Y56725D01*
|
||||
X120211Y56781D01*
|
||||
X120263Y56840D01*
|
||||
X120312Y56902D01*
|
||||
X120358Y56966D01*
|
||||
X120401Y57032D01*
|
||||
X120441Y57100D01*
|
||||
X120477Y57170D01*
|
||||
X120509Y57242D01*
|
||||
X120538Y57316D01*
|
||||
X120563Y57390D01*
|
||||
X120584Y57466D01*
|
||||
X120602Y57543D01*
|
||||
X120615Y57621D01*
|
||||
X120625Y57699D01*
|
||||
X120631Y57777D01*
|
||||
X120633Y57856D01*
|
||||
X111212Y52324D02*
|
||||
X109631Y52324D01*
|
||||
X111212Y52324D02*
|
||||
X111290Y52326D01*
|
||||
X111367Y52332D01*
|
||||
X111444Y52341D01*
|
||||
X111520Y52354D01*
|
||||
X111596Y52371D01*
|
||||
X111671Y52392D01*
|
||||
X111744Y52416D01*
|
||||
X111817Y52444D01*
|
||||
X111888Y52476D01*
|
||||
X111957Y52511D01*
|
||||
X112024Y52549D01*
|
||||
X112090Y52590D01*
|
||||
X112153Y52635D01*
|
||||
X112214Y52683D01*
|
||||
X112273Y52733D01*
|
||||
X112329Y52787D01*
|
||||
X112383Y52843D01*
|
||||
X112433Y52902D01*
|
||||
X112481Y52963D01*
|
||||
X112526Y53026D01*
|
||||
X112567Y53092D01*
|
||||
X112605Y53159D01*
|
||||
X112640Y53228D01*
|
||||
X112672Y53299D01*
|
||||
X112700Y53372D01*
|
||||
X112724Y53445D01*
|
||||
X112745Y53520D01*
|
||||
X112762Y53596D01*
|
||||
X112775Y53672D01*
|
||||
X112784Y53749D01*
|
||||
X112790Y53826D01*
|
||||
X112792Y53904D01*
|
||||
X112792Y57856D01*
|
||||
X112790Y57934D01*
|
||||
X112784Y58011D01*
|
||||
X112775Y58088D01*
|
||||
X112762Y58164D01*
|
||||
X112745Y58240D01*
|
||||
X112724Y58315D01*
|
||||
X112700Y58388D01*
|
||||
X112672Y58461D01*
|
||||
X112640Y58532D01*
|
||||
X112605Y58601D01*
|
||||
X112567Y58668D01*
|
||||
X112526Y58734D01*
|
||||
X112481Y58797D01*
|
||||
X112433Y58858D01*
|
||||
X112383Y58917D01*
|
||||
X112329Y58973D01*
|
||||
X112273Y59027D01*
|
||||
X112214Y59077D01*
|
||||
X112153Y59125D01*
|
||||
X112090Y59170D01*
|
||||
X112024Y59211D01*
|
||||
X111957Y59249D01*
|
||||
X111888Y59284D01*
|
||||
X111817Y59316D01*
|
||||
X111744Y59344D01*
|
||||
X111671Y59368D01*
|
||||
X111596Y59389D01*
|
||||
X111520Y59406D01*
|
||||
X111444Y59419D01*
|
||||
X111367Y59428D01*
|
||||
X111290Y59434D01*
|
||||
X111212Y59436D01*
|
||||
X109631Y59436D01*
|
||||
X105479Y55485D02*
|
||||
X103108Y55485D01*
|
||||
X105479Y55485D02*
|
||||
X105557Y55487D01*
|
||||
X105634Y55493D01*
|
||||
X105711Y55502D01*
|
||||
X105787Y55515D01*
|
||||
X105863Y55532D01*
|
||||
X105938Y55553D01*
|
||||
X106011Y55577D01*
|
||||
X106084Y55605D01*
|
||||
X106155Y55637D01*
|
||||
X106224Y55672D01*
|
||||
X106291Y55710D01*
|
||||
X106357Y55751D01*
|
||||
X106420Y55796D01*
|
||||
X106481Y55844D01*
|
||||
X106540Y55894D01*
|
||||
X106596Y55948D01*
|
||||
X106650Y56004D01*
|
||||
X106700Y56063D01*
|
||||
X106748Y56124D01*
|
||||
X106793Y56187D01*
|
||||
X106834Y56253D01*
|
||||
X106872Y56320D01*
|
||||
X106907Y56389D01*
|
||||
X106939Y56460D01*
|
||||
X106967Y56533D01*
|
||||
X106991Y56606D01*
|
||||
X107012Y56681D01*
|
||||
X107029Y56757D01*
|
||||
X107042Y56833D01*
|
||||
X107051Y56910D01*
|
||||
X107057Y56987D01*
|
||||
X107059Y57065D01*
|
||||
X107059Y57460D01*
|
||||
X107057Y57547D01*
|
||||
X107051Y57635D01*
|
||||
X107042Y57722D01*
|
||||
X107028Y57808D01*
|
||||
X107011Y57894D01*
|
||||
X106990Y57978D01*
|
||||
X106965Y58062D01*
|
||||
X106936Y58145D01*
|
||||
X106904Y58226D01*
|
||||
X106869Y58306D01*
|
||||
X106830Y58384D01*
|
||||
X106787Y58461D01*
|
||||
X106741Y58535D01*
|
||||
X106692Y58607D01*
|
||||
X106640Y58677D01*
|
||||
X106584Y58745D01*
|
||||
X106526Y58810D01*
|
||||
X106465Y58873D01*
|
||||
X106401Y58932D01*
|
||||
X106334Y58989D01*
|
||||
X106266Y59043D01*
|
||||
X106194Y59094D01*
|
||||
X106121Y59141D01*
|
||||
X106046Y59186D01*
|
||||
X105968Y59227D01*
|
||||
X105889Y59264D01*
|
||||
X105809Y59298D01*
|
||||
X105727Y59328D01*
|
||||
X105644Y59355D01*
|
||||
X105559Y59378D01*
|
||||
X105474Y59397D01*
|
||||
X105388Y59412D01*
|
||||
X105301Y59424D01*
|
||||
X105214Y59432D01*
|
||||
X105127Y59436D01*
|
||||
X105039Y59436D01*
|
||||
X104952Y59432D01*
|
||||
X104865Y59424D01*
|
||||
X104778Y59412D01*
|
||||
X104692Y59397D01*
|
||||
X104607Y59378D01*
|
||||
X104522Y59355D01*
|
||||
X104439Y59328D01*
|
||||
X104357Y59298D01*
|
||||
X104277Y59264D01*
|
||||
X104198Y59227D01*
|
||||
X104120Y59186D01*
|
||||
X104045Y59141D01*
|
||||
X103972Y59094D01*
|
||||
X103900Y59043D01*
|
||||
X103832Y58989D01*
|
||||
X103765Y58932D01*
|
||||
X103701Y58873D01*
|
||||
X103640Y58810D01*
|
||||
X103582Y58745D01*
|
||||
X103526Y58677D01*
|
||||
X103474Y58607D01*
|
||||
X103425Y58535D01*
|
||||
X103379Y58461D01*
|
||||
X103336Y58384D01*
|
||||
X103297Y58306D01*
|
||||
X103262Y58226D01*
|
||||
X103230Y58145D01*
|
||||
X103201Y58062D01*
|
||||
X103176Y57978D01*
|
||||
X103155Y57894D01*
|
||||
X103138Y57808D01*
|
||||
X103124Y57722D01*
|
||||
X103115Y57635D01*
|
||||
X103109Y57547D01*
|
||||
X103107Y57460D01*
|
||||
X103108Y57460D02*
|
||||
X103108Y55485D01*
|
||||
X103110Y55375D01*
|
||||
X103116Y55264D01*
|
||||
X103125Y55155D01*
|
||||
X103139Y55045D01*
|
||||
X103156Y54936D01*
|
||||
X103177Y54828D01*
|
||||
X103202Y54720D01*
|
||||
X103230Y54614D01*
|
||||
X103263Y54508D01*
|
||||
X103299Y54404D01*
|
||||
X103338Y54301D01*
|
||||
X103381Y54199D01*
|
||||
X103428Y54099D01*
|
||||
X103478Y54001D01*
|
||||
X103531Y53905D01*
|
||||
X103588Y53810D01*
|
||||
X103648Y53717D01*
|
||||
X103712Y53627D01*
|
||||
X103778Y53539D01*
|
||||
X103848Y53453D01*
|
||||
X103920Y53370D01*
|
||||
X103995Y53289D01*
|
||||
X104073Y53211D01*
|
||||
X104154Y53136D01*
|
||||
X104237Y53064D01*
|
||||
X104323Y52994D01*
|
||||
X104411Y52928D01*
|
||||
X104501Y52864D01*
|
||||
X104594Y52804D01*
|
||||
X104689Y52747D01*
|
||||
X104785Y52694D01*
|
||||
X104883Y52644D01*
|
||||
X104983Y52597D01*
|
||||
X105085Y52554D01*
|
||||
X105188Y52515D01*
|
||||
X105292Y52479D01*
|
||||
X105398Y52446D01*
|
||||
X105504Y52418D01*
|
||||
X105612Y52393D01*
|
||||
X105720Y52372D01*
|
||||
X105829Y52355D01*
|
||||
X105939Y52341D01*
|
||||
X106048Y52332D01*
|
||||
X106159Y52326D01*
|
||||
X106269Y52324D01*
|
||||
D11*
|
||||
X193590Y103250D02*
|
||||
X193528Y103252D01*
|
||||
X193467Y103258D01*
|
||||
X193406Y103267D01*
|
||||
X193346Y103280D01*
|
||||
X193287Y103297D01*
|
||||
X193229Y103318D01*
|
||||
X193172Y103342D01*
|
||||
X193117Y103369D01*
|
||||
X193064Y103400D01*
|
||||
X193012Y103434D01*
|
||||
X192963Y103471D01*
|
||||
X192916Y103511D01*
|
||||
X192872Y103554D01*
|
||||
X192831Y103599D01*
|
||||
X192792Y103647D01*
|
||||
X192756Y103698D01*
|
||||
X192724Y103750D01*
|
||||
X192695Y103804D01*
|
||||
X192669Y103860D01*
|
||||
X192647Y103918D01*
|
||||
X192628Y103976D01*
|
||||
X192613Y104036D01*
|
||||
X192602Y104097D01*
|
||||
X192594Y104158D01*
|
||||
X192590Y104219D01*
|
||||
X192590Y104281D01*
|
||||
X192594Y104342D01*
|
||||
X192602Y104403D01*
|
||||
X192613Y104464D01*
|
||||
X192628Y104524D01*
|
||||
X192647Y104582D01*
|
||||
X192669Y104640D01*
|
||||
X192695Y104696D01*
|
||||
X192724Y104750D01*
|
||||
X192756Y104802D01*
|
||||
X192792Y104853D01*
|
||||
X192831Y104901D01*
|
||||
X192872Y104946D01*
|
||||
X192916Y104989D01*
|
||||
X192963Y105029D01*
|
||||
X193012Y105066D01*
|
||||
X193064Y105100D01*
|
||||
X193117Y105131D01*
|
||||
X193172Y105158D01*
|
||||
X193229Y105182D01*
|
||||
X193287Y105203D01*
|
||||
X193346Y105220D01*
|
||||
X193406Y105233D01*
|
||||
X193467Y105242D01*
|
||||
X193528Y105248D01*
|
||||
X193590Y105250D01*
|
||||
X193652Y105248D01*
|
||||
X193713Y105242D01*
|
||||
X193774Y105233D01*
|
||||
X193834Y105220D01*
|
||||
X193893Y105203D01*
|
||||
X193951Y105182D01*
|
||||
X194008Y105158D01*
|
||||
X194063Y105131D01*
|
||||
X194116Y105100D01*
|
||||
X194168Y105066D01*
|
||||
X194217Y105029D01*
|
||||
X194264Y104989D01*
|
||||
X194308Y104946D01*
|
||||
X194349Y104901D01*
|
||||
X194388Y104853D01*
|
||||
X194424Y104802D01*
|
||||
X194456Y104750D01*
|
||||
X194485Y104696D01*
|
||||
X194511Y104640D01*
|
||||
X194533Y104582D01*
|
||||
X194552Y104524D01*
|
||||
X194567Y104464D01*
|
||||
X194578Y104403D01*
|
||||
X194586Y104342D01*
|
||||
X194590Y104281D01*
|
||||
X194590Y104219D01*
|
||||
X194586Y104158D01*
|
||||
X194578Y104097D01*
|
||||
X194567Y104036D01*
|
||||
X194552Y103976D01*
|
||||
X194533Y103918D01*
|
||||
X194511Y103860D01*
|
||||
X194485Y103804D01*
|
||||
X194456Y103750D01*
|
||||
X194424Y103698D01*
|
||||
X194388Y103647D01*
|
||||
X194349Y103599D01*
|
||||
X194308Y103554D01*
|
||||
X194264Y103511D01*
|
||||
X194217Y103471D01*
|
||||
X194168Y103434D01*
|
||||
X194116Y103400D01*
|
||||
X194063Y103369D01*
|
||||
X194008Y103342D01*
|
||||
X193951Y103318D01*
|
||||
X193893Y103297D01*
|
||||
X193834Y103280D01*
|
||||
X193774Y103267D01*
|
||||
X193713Y103258D01*
|
||||
X193652Y103252D01*
|
||||
X193590Y103250D01*
|
||||
X197360Y87360D02*
|
||||
X197360Y85360D01*
|
||||
X229360Y85360D02*
|
||||
X229360Y87360D01*
|
||||
X214360Y73860D02*
|
||||
X212360Y73860D01*
|
||||
X212360Y98860D02*
|
||||
X214360Y98860D01*
|
||||
D12*
|
||||
X246288Y91059D02*
|
||||
X252554Y81661D01*
|
||||
X246288Y81661D02*
|
||||
X252554Y91059D01*
|
||||
X242888Y88971D02*
|
||||
X240277Y91059D01*
|
||||
X240277Y81661D01*
|
||||
X242888Y81661D02*
|
||||
X237666Y81661D01*
|
||||
M02*
|
||||
31
examples/inputs/stm32breakout.GBP
Normal file
31
examples/inputs/stm32breakout.GBP
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11R,0.700000X0.600000*%
|
||||
%ADD12R,1.900000X1.200000*%
|
||||
|
||||
|
||||
D10*
|
||||
X206590Y110490D03*
|
||||
X217590Y110490D03*
|
||||
X218860Y63500D03*
|
||||
X207860Y63500D03*
|
||||
D11*
|
||||
X121920Y33870D03*
|
||||
X121920Y44870D03*
|
||||
X107950Y33870D03*
|
||||
X107950Y44870D03*
|
||||
D12*
|
||||
X200760Y94360D03*
|
||||
X225960Y94360D03*
|
||||
X225960Y78360D03*
|
||||
X200760Y78360D03*
|
||||
M02*
|
||||
76
examples/inputs/stm32breakout.GBS
Normal file
76
examples/inputs/stm32breakout.GBS
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask bottom*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11R,0.700000X0.600000*%
|
||||
%ADD12R,1.500000X1.500000*%
|
||||
%ADD13C,1.500000*%
|
||||
%ADD14R,1.900000X1.900000*%
|
||||
%ADD15R,1.900000X1.200000*%
|
||||
|
||||
|
||||
D10*
|
||||
X206590Y110490D03*
|
||||
X217590Y110490D03*
|
||||
X218860Y63500D03*
|
||||
X207860Y63500D03*
|
||||
D11*
|
||||
X121920Y33870D03*
|
||||
X121920Y44870D03*
|
||||
X107950Y33870D03*
|
||||
X107950Y44870D03*
|
||||
D12*
|
||||
X12700Y12700D03*
|
||||
D13*
|
||||
X38100Y12700D03*
|
||||
X63500Y12700D03*
|
||||
X88900Y12700D03*
|
||||
X114300Y12700D03*
|
||||
X139700Y12700D03*
|
||||
X165100Y12700D03*
|
||||
X190500Y12700D03*
|
||||
X215900Y12700D03*
|
||||
X241300Y12700D03*
|
||||
X266700Y12700D03*
|
||||
X292100Y12700D03*
|
||||
X317500Y12700D03*
|
||||
X342900Y12700D03*
|
||||
X368300Y12700D03*
|
||||
X393700Y12700D03*
|
||||
X393700Y165100D03*
|
||||
X368300Y165100D03*
|
||||
X342900Y165100D03*
|
||||
X317500Y165100D03*
|
||||
X292100Y165100D03*
|
||||
X266700Y165100D03*
|
||||
X241300Y165100D03*
|
||||
X215900Y165100D03*
|
||||
X190500Y165100D03*
|
||||
X165100Y165100D03*
|
||||
X139700Y165100D03*
|
||||
X114300Y165100D03*
|
||||
X88900Y165100D03*
|
||||
X63500Y165100D03*
|
||||
X38100Y165100D03*
|
||||
X12700Y165100D03*
|
||||
D14*
|
||||
X391160Y76900D03*
|
||||
X391160Y100900D03*
|
||||
D13*
|
||||
X12700Y127000D03*
|
||||
X12700Y101600D03*
|
||||
X12700Y76200D03*
|
||||
X12700Y50800D03*
|
||||
D15*
|
||||
X200760Y94360D03*
|
||||
X225960Y94360D03*
|
||||
X225960Y78360D03*
|
||||
X200760Y78360D03*
|
||||
M02*
|
||||
20
examples/inputs/stm32breakout.GML
Normal file
20
examples/inputs/stm32breakout.GML
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSlot drills/holes*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10C,0.000000*%
|
||||
|
||||
|
||||
D10*
|
||||
X406400Y0D02*
|
||||
X0Y0D01*
|
||||
X0Y177800D01*
|
||||
X406400Y177800D01*
|
||||
X406400Y0D01*
|
||||
M02*
|
||||
5526
examples/inputs/stm32breakout.GTL
Normal file
5526
examples/inputs/stm32breakout.GTL
Normal file
File diff suppressed because it is too large
Load diff
4815
examples/inputs/stm32breakout.GTO
Normal file
4815
examples/inputs/stm32breakout.GTO
Normal file
File diff suppressed because it is too large
Load diff
288
examples/inputs/stm32breakout.GTP
Normal file
288
examples/inputs/stm32breakout.GTP
Normal file
|
|
@ -0,0 +1,288 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder paste top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11R,0.700000X0.600000*%
|
||||
%ADD12R,1.900000X1.800000*%
|
||||
%ADD13R,1.750000X0.400000*%
|
||||
%ADD14R,1.600000X2.100000*%
|
||||
%ADD15R,1.450000X0.650000*%
|
||||
%ADD16R,0.540000X1.400000*%
|
||||
%ADD17R,1.000000X1.400000*%
|
||||
|
||||
|
||||
D10*
|
||||
X315810Y52070D03*
|
||||
X326810Y52070D03*
|
||||
X32600Y38100D03*
|
||||
X43600Y38100D03*
|
||||
X312000Y120650D03*
|
||||
X323000Y120650D03*
|
||||
D11*
|
||||
X142240Y83400D03*
|
||||
X142240Y94400D03*
|
||||
X265430Y94400D03*
|
||||
X265430Y83400D03*
|
||||
X276860Y94400D03*
|
||||
X276860Y83400D03*
|
||||
D12*
|
||||
X391160Y128900D03*
|
||||
X391160Y48900D03*
|
||||
D13*
|
||||
X362410Y88900D03*
|
||||
X362410Y95400D03*
|
||||
X362410Y82400D03*
|
||||
X362410Y101900D03*
|
||||
X362410Y75900D03*
|
||||
D14*
|
||||
X365660Y119900D03*
|
||||
X365660Y57900D03*
|
||||
D10*
|
||||
X35140Y138430D03*
|
||||
X46140Y138430D03*
|
||||
D15*
|
||||
X73770Y130130D03*
|
||||
X119270Y130130D03*
|
||||
X73770Y108630D03*
|
||||
X119270Y108630D03*
|
||||
X73770Y67900D03*
|
||||
X119270Y67900D03*
|
||||
X73770Y46400D03*
|
||||
X119270Y46400D03*
|
||||
D16*
|
||||
G36*
|
||||
X148188Y69668D02*
|
||||
X144370Y73486D01*
|
||||
X154268Y83384D01*
|
||||
X158086Y79566D01*
|
||||
X148188Y69668D01*
|
||||
G37*
|
||||
G36*
|
||||
X153845Y64011D02*
|
||||
X150027Y67829D01*
|
||||
X159925Y77727D01*
|
||||
X163743Y73909D01*
|
||||
X153845Y64011D01*
|
||||
G37*
|
||||
G36*
|
||||
X159501Y58354D02*
|
||||
X155683Y62172D01*
|
||||
X165581Y72070D01*
|
||||
X169399Y68252D01*
|
||||
X159501Y58354D01*
|
||||
G37*
|
||||
G36*
|
||||
X165158Y52697D02*
|
||||
X161340Y56515D01*
|
||||
X171238Y66413D01*
|
||||
X175056Y62595D01*
|
||||
X165158Y52697D01*
|
||||
G37*
|
||||
G36*
|
||||
X170815Y47040D02*
|
||||
X166997Y50858D01*
|
||||
X176895Y60756D01*
|
||||
X180713Y56938D01*
|
||||
X170815Y47040D01*
|
||||
G37*
|
||||
G36*
|
||||
X176401Y41454D02*
|
||||
X172583Y45272D01*
|
||||
X182481Y55170D01*
|
||||
X186299Y51352D01*
|
||||
X176401Y41454D01*
|
||||
G37*
|
||||
G36*
|
||||
X182058Y35797D02*
|
||||
X178240Y39615D01*
|
||||
X188138Y49513D01*
|
||||
X191956Y45695D01*
|
||||
X182058Y35797D01*
|
||||
G37*
|
||||
G36*
|
||||
X187715Y30140D02*
|
||||
X183897Y33958D01*
|
||||
X193795Y43856D01*
|
||||
X197613Y40038D01*
|
||||
X187715Y30140D01*
|
||||
G37*
|
||||
G36*
|
||||
X222432Y33888D02*
|
||||
X218614Y30070D01*
|
||||
X208716Y39968D01*
|
||||
X212534Y43786D01*
|
||||
X222432Y33888D01*
|
||||
G37*
|
||||
G36*
|
||||
X228089Y39545D02*
|
||||
X224271Y35727D01*
|
||||
X214373Y45625D01*
|
||||
X218191Y49443D01*
|
||||
X228089Y39545D01*
|
||||
G37*
|
||||
G36*
|
||||
X233746Y45201D02*
|
||||
X229928Y41383D01*
|
||||
X220030Y51281D01*
|
||||
X223848Y55099D01*
|
||||
X233746Y45201D01*
|
||||
G37*
|
||||
G36*
|
||||
X239403Y50858D02*
|
||||
X235585Y47040D01*
|
||||
X225687Y56938D01*
|
||||
X229505Y60756D01*
|
||||
X239403Y50858D01*
|
||||
G37*
|
||||
G36*
|
||||
X245060Y56515D02*
|
||||
X241242Y52697D01*
|
||||
X231344Y62595D01*
|
||||
X235162Y66413D01*
|
||||
X245060Y56515D01*
|
||||
G37*
|
||||
G36*
|
||||
X250717Y62172D02*
|
||||
X246899Y58354D01*
|
||||
X237001Y68252D01*
|
||||
X240819Y72070D01*
|
||||
X250717Y62172D01*
|
||||
G37*
|
||||
G36*
|
||||
X256373Y67829D02*
|
||||
X252555Y64011D01*
|
||||
X242657Y73909D01*
|
||||
X246475Y77727D01*
|
||||
X256373Y67829D01*
|
||||
G37*
|
||||
G36*
|
||||
X262030Y73486D02*
|
||||
X258212Y69668D01*
|
||||
X248314Y79566D01*
|
||||
X252132Y83384D01*
|
||||
X262030Y73486D01*
|
||||
G37*
|
||||
G36*
|
||||
X258212Y108132D02*
|
||||
X262030Y104314D01*
|
||||
X252132Y94416D01*
|
||||
X248314Y98234D01*
|
||||
X258212Y108132D01*
|
||||
G37*
|
||||
G36*
|
||||
X252555Y113789D02*
|
||||
X256373Y109971D01*
|
||||
X246475Y100073D01*
|
||||
X242657Y103891D01*
|
||||
X252555Y113789D01*
|
||||
G37*
|
||||
G36*
|
||||
X246899Y119446D02*
|
||||
X250717Y115628D01*
|
||||
X240819Y105730D01*
|
||||
X237001Y109548D01*
|
||||
X246899Y119446D01*
|
||||
G37*
|
||||
G36*
|
||||
X241242Y125103D02*
|
||||
X245060Y121285D01*
|
||||
X235162Y111387D01*
|
||||
X231344Y115205D01*
|
||||
X241242Y125103D01*
|
||||
G37*
|
||||
G36*
|
||||
X235585Y130760D02*
|
||||
X239403Y126942D01*
|
||||
X229505Y117044D01*
|
||||
X225687Y120862D01*
|
||||
X235585Y130760D01*
|
||||
G37*
|
||||
G36*
|
||||
X229928Y136417D02*
|
||||
X233746Y132599D01*
|
||||
X223848Y122701D01*
|
||||
X220030Y126519D01*
|
||||
X229928Y136417D01*
|
||||
G37*
|
||||
G36*
|
||||
X224271Y142073D02*
|
||||
X228089Y138255D01*
|
||||
X218191Y128357D01*
|
||||
X214373Y132175D01*
|
||||
X224271Y142073D01*
|
||||
G37*
|
||||
G36*
|
||||
X218614Y147730D02*
|
||||
X222432Y143912D01*
|
||||
X212534Y134014D01*
|
||||
X208716Y137832D01*
|
||||
X218614Y147730D01*
|
||||
G37*
|
||||
G36*
|
||||
X183968Y143912D02*
|
||||
X187786Y147730D01*
|
||||
X197684Y137832D01*
|
||||
X193866Y134014D01*
|
||||
X183968Y143912D01*
|
||||
G37*
|
||||
G36*
|
||||
X178311Y138255D02*
|
||||
X182129Y142073D01*
|
||||
X192027Y132175D01*
|
||||
X188209Y128357D01*
|
||||
X178311Y138255D01*
|
||||
G37*
|
||||
G36*
|
||||
X172654Y132599D02*
|
||||
X176472Y136417D01*
|
||||
X186370Y126519D01*
|
||||
X182552Y122701D01*
|
||||
X172654Y132599D01*
|
||||
G37*
|
||||
G36*
|
||||
X166997Y126942D02*
|
||||
X170815Y130760D01*
|
||||
X180713Y120862D01*
|
||||
X176895Y117044D01*
|
||||
X166997Y126942D01*
|
||||
G37*
|
||||
G36*
|
||||
X161340Y121285D02*
|
||||
X165158Y125103D01*
|
||||
X175056Y115205D01*
|
||||
X171238Y111387D01*
|
||||
X161340Y121285D01*
|
||||
G37*
|
||||
G36*
|
||||
X155683Y115628D02*
|
||||
X159501Y119446D01*
|
||||
X169399Y109548D01*
|
||||
X165581Y105730D01*
|
||||
X155683Y115628D01*
|
||||
G37*
|
||||
G36*
|
||||
X150027Y109971D02*
|
||||
X153845Y113789D01*
|
||||
X163743Y103891D01*
|
||||
X159925Y100073D01*
|
||||
X150027Y109971D01*
|
||||
G37*
|
||||
G36*
|
||||
X144370Y104314D02*
|
||||
X148188Y108132D01*
|
||||
X158086Y98234D01*
|
||||
X154268Y94416D01*
|
||||
X144370Y104314D01*
|
||||
G37*
|
||||
D17*
|
||||
X316230Y76630D03*
|
||||
X306730Y98630D03*
|
||||
X325730Y98630D03*
|
||||
M02*
|
||||
333
examples/inputs/stm32breakout.GTS
Normal file
333
examples/inputs/stm32breakout.GTS
Normal file
|
|
@ -0,0 +1,333 @@
|
|||
G04 EAGLE Gerber RS-274X export*
|
||||
G75*
|
||||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%LPD*%
|
||||
%INSolder Mask top*%
|
||||
%IPPOS*%
|
||||
%AMOC8*
|
||||
5,1,8,0,0,1.08239X$1,22.5*%
|
||||
G01*
|
||||
%ADD10R,0.600000X0.700000*%
|
||||
%ADD11R,0.700000X0.600000*%
|
||||
%ADD12R,1.500000X1.500000*%
|
||||
%ADD13C,1.500000*%
|
||||
%ADD14R,1.900000X1.800000*%
|
||||
%ADD15R,1.750000X0.400000*%
|
||||
%ADD16R,1.600000X2.100000*%
|
||||
%ADD17R,1.900000X1.900000*%
|
||||
%ADD18R,1.450000X0.650000*%
|
||||
%ADD19R,0.540000X1.400000*%
|
||||
%ADD20R,1.000000X1.400000*%
|
||||
|
||||
|
||||
D10*
|
||||
X315810Y52070D03*
|
||||
X326810Y52070D03*
|
||||
X32600Y38100D03*
|
||||
X43600Y38100D03*
|
||||
X312000Y120650D03*
|
||||
X323000Y120650D03*
|
||||
D11*
|
||||
X142240Y83400D03*
|
||||
X142240Y94400D03*
|
||||
X265430Y94400D03*
|
||||
X265430Y83400D03*
|
||||
X276860Y94400D03*
|
||||
X276860Y83400D03*
|
||||
D12*
|
||||
X12700Y12700D03*
|
||||
D13*
|
||||
X38100Y12700D03*
|
||||
X63500Y12700D03*
|
||||
X88900Y12700D03*
|
||||
X114300Y12700D03*
|
||||
X139700Y12700D03*
|
||||
X165100Y12700D03*
|
||||
X190500Y12700D03*
|
||||
X215900Y12700D03*
|
||||
X241300Y12700D03*
|
||||
X266700Y12700D03*
|
||||
X292100Y12700D03*
|
||||
X317500Y12700D03*
|
||||
X342900Y12700D03*
|
||||
X368300Y12700D03*
|
||||
X393700Y12700D03*
|
||||
X393700Y165100D03*
|
||||
X368300Y165100D03*
|
||||
X342900Y165100D03*
|
||||
X317500Y165100D03*
|
||||
X292100Y165100D03*
|
||||
X266700Y165100D03*
|
||||
X241300Y165100D03*
|
||||
X215900Y165100D03*
|
||||
X190500Y165100D03*
|
||||
X165100Y165100D03*
|
||||
X139700Y165100D03*
|
||||
X114300Y165100D03*
|
||||
X88900Y165100D03*
|
||||
X63500Y165100D03*
|
||||
X38100Y165100D03*
|
||||
X12700Y165100D03*
|
||||
D14*
|
||||
X391160Y128900D03*
|
||||
X391160Y48900D03*
|
||||
D15*
|
||||
X362410Y88900D03*
|
||||
X362410Y95400D03*
|
||||
X362410Y82400D03*
|
||||
X362410Y101900D03*
|
||||
X362410Y75900D03*
|
||||
D16*
|
||||
X365660Y119900D03*
|
||||
X365660Y57900D03*
|
||||
D17*
|
||||
X391160Y76900D03*
|
||||
X391160Y100900D03*
|
||||
D10*
|
||||
X35140Y138430D03*
|
||||
X46140Y138430D03*
|
||||
D18*
|
||||
X73770Y130130D03*
|
||||
X119270Y130130D03*
|
||||
X73770Y108630D03*
|
||||
X119270Y108630D03*
|
||||
X73770Y67900D03*
|
||||
X119270Y67900D03*
|
||||
X73770Y46400D03*
|
||||
X119270Y46400D03*
|
||||
D13*
|
||||
X12700Y127000D03*
|
||||
X12700Y101600D03*
|
||||
X12700Y76200D03*
|
||||
X12700Y50800D03*
|
||||
D19*
|
||||
G36*
|
||||
X148188Y69668D02*
|
||||
X144370Y73486D01*
|
||||
X154268Y83384D01*
|
||||
X158086Y79566D01*
|
||||
X148188Y69668D01*
|
||||
G37*
|
||||
G36*
|
||||
X153845Y64011D02*
|
||||
X150027Y67829D01*
|
||||
X159925Y77727D01*
|
||||
X163743Y73909D01*
|
||||
X153845Y64011D01*
|
||||
G37*
|
||||
G36*
|
||||
X159501Y58354D02*
|
||||
X155683Y62172D01*
|
||||
X165581Y72070D01*
|
||||
X169399Y68252D01*
|
||||
X159501Y58354D01*
|
||||
G37*
|
||||
G36*
|
||||
X165158Y52697D02*
|
||||
X161340Y56515D01*
|
||||
X171238Y66413D01*
|
||||
X175056Y62595D01*
|
||||
X165158Y52697D01*
|
||||
G37*
|
||||
G36*
|
||||
X170815Y47040D02*
|
||||
X166997Y50858D01*
|
||||
X176895Y60756D01*
|
||||
X180713Y56938D01*
|
||||
X170815Y47040D01*
|
||||
G37*
|
||||
G36*
|
||||
X176401Y41454D02*
|
||||
X172583Y45272D01*
|
||||
X182481Y55170D01*
|
||||
X186299Y51352D01*
|
||||
X176401Y41454D01*
|
||||
G37*
|
||||
G36*
|
||||
X182058Y35797D02*
|
||||
X178240Y39615D01*
|
||||
X188138Y49513D01*
|
||||
X191956Y45695D01*
|
||||
X182058Y35797D01*
|
||||
G37*
|
||||
G36*
|
||||
X187715Y30140D02*
|
||||
X183897Y33958D01*
|
||||
X193795Y43856D01*
|
||||
X197613Y40038D01*
|
||||
X187715Y30140D01*
|
||||
G37*
|
||||
G36*
|
||||
X222432Y33888D02*
|
||||
X218614Y30070D01*
|
||||
X208716Y39968D01*
|
||||
X212534Y43786D01*
|
||||
X222432Y33888D01*
|
||||
G37*
|
||||
G36*
|
||||
X228089Y39545D02*
|
||||
X224271Y35727D01*
|
||||
X214373Y45625D01*
|
||||
X218191Y49443D01*
|
||||
X228089Y39545D01*
|
||||
G37*
|
||||
G36*
|
||||
X233746Y45201D02*
|
||||
X229928Y41383D01*
|
||||
X220030Y51281D01*
|
||||
X223848Y55099D01*
|
||||
X233746Y45201D01*
|
||||
G37*
|
||||
G36*
|
||||
X239403Y50858D02*
|
||||
X235585Y47040D01*
|
||||
X225687Y56938D01*
|
||||
X229505Y60756D01*
|
||||
X239403Y50858D01*
|
||||
G37*
|
||||
G36*
|
||||
X245060Y56515D02*
|
||||
X241242Y52697D01*
|
||||
X231344Y62595D01*
|
||||
X235162Y66413D01*
|
||||
X245060Y56515D01*
|
||||
G37*
|
||||
G36*
|
||||
X250717Y62172D02*
|
||||
X246899Y58354D01*
|
||||
X237001Y68252D01*
|
||||
X240819Y72070D01*
|
||||
X250717Y62172D01*
|
||||
G37*
|
||||
G36*
|
||||
X256373Y67829D02*
|
||||
X252555Y64011D01*
|
||||
X242657Y73909D01*
|
||||
X246475Y77727D01*
|
||||
X256373Y67829D01*
|
||||
G37*
|
||||
G36*
|
||||
X262030Y73486D02*
|
||||
X258212Y69668D01*
|
||||
X248314Y79566D01*
|
||||
X252132Y83384D01*
|
||||
X262030Y73486D01*
|
||||
G37*
|
||||
G36*
|
||||
X258212Y108132D02*
|
||||
X262030Y104314D01*
|
||||
X252132Y94416D01*
|
||||
X248314Y98234D01*
|
||||
X258212Y108132D01*
|
||||
G37*
|
||||
G36*
|
||||
X252555Y113789D02*
|
||||
X256373Y109971D01*
|
||||
X246475Y100073D01*
|
||||
X242657Y103891D01*
|
||||
X252555Y113789D01*
|
||||
G37*
|
||||
G36*
|
||||
X246899Y119446D02*
|
||||
X250717Y115628D01*
|
||||
X240819Y105730D01*
|
||||
X237001Y109548D01*
|
||||
X246899Y119446D01*
|
||||
G37*
|
||||
G36*
|
||||
X241242Y125103D02*
|
||||
X245060Y121285D01*
|
||||
X235162Y111387D01*
|
||||
X231344Y115205D01*
|
||||
X241242Y125103D01*
|
||||
G37*
|
||||
G36*
|
||||
X235585Y130760D02*
|
||||
X239403Y126942D01*
|
||||
X229505Y117044D01*
|
||||
X225687Y120862D01*
|
||||
X235585Y130760D01*
|
||||
G37*
|
||||
G36*
|
||||
X229928Y136417D02*
|
||||
X233746Y132599D01*
|
||||
X223848Y122701D01*
|
||||
X220030Y126519D01*
|
||||
X229928Y136417D01*
|
||||
G37*
|
||||
G36*
|
||||
X224271Y142073D02*
|
||||
X228089Y138255D01*
|
||||
X218191Y128357D01*
|
||||
X214373Y132175D01*
|
||||
X224271Y142073D01*
|
||||
G37*
|
||||
G36*
|
||||
X218614Y147730D02*
|
||||
X222432Y143912D01*
|
||||
X212534Y134014D01*
|
||||
X208716Y137832D01*
|
||||
X218614Y147730D01*
|
||||
G37*
|
||||
G36*
|
||||
X183968Y143912D02*
|
||||
X187786Y147730D01*
|
||||
X197684Y137832D01*
|
||||
X193866Y134014D01*
|
||||
X183968Y143912D01*
|
||||
G37*
|
||||
G36*
|
||||
X178311Y138255D02*
|
||||
X182129Y142073D01*
|
||||
X192027Y132175D01*
|
||||
X188209Y128357D01*
|
||||
X178311Y138255D01*
|
||||
G37*
|
||||
G36*
|
||||
X172654Y132599D02*
|
||||
X176472Y136417D01*
|
||||
X186370Y126519D01*
|
||||
X182552Y122701D01*
|
||||
X172654Y132599D01*
|
||||
G37*
|
||||
G36*
|
||||
X166997Y126942D02*
|
||||
X170815Y130760D01*
|
||||
X180713Y120862D01*
|
||||
X176895Y117044D01*
|
||||
X166997Y126942D01*
|
||||
G37*
|
||||
G36*
|
||||
X161340Y121285D02*
|
||||
X165158Y125103D01*
|
||||
X175056Y115205D01*
|
||||
X171238Y111387D01*
|
||||
X161340Y121285D01*
|
||||
G37*
|
||||
G36*
|
||||
X155683Y115628D02*
|
||||
X159501Y119446D01*
|
||||
X169399Y109548D01*
|
||||
X165581Y105730D01*
|
||||
X155683Y115628D01*
|
||||
G37*
|
||||
G36*
|
||||
X150027Y109971D02*
|
||||
X153845Y113789D01*
|
||||
X163743Y103891D01*
|
||||
X159925Y100073D01*
|
||||
X150027Y109971D01*
|
||||
G37*
|
||||
G36*
|
||||
X144370Y104314D02*
|
||||
X148188Y108132D01*
|
||||
X158086Y98234D01*
|
||||
X154268Y94416D01*
|
||||
X144370Y104314D01*
|
||||
G37*
|
||||
D20*
|
||||
X316230Y76630D03*
|
||||
X306730Y98630D03*
|
||||
X325730Y98630D03*
|
||||
M02*
|
||||
65
examples/inputs/stm32breakout.TXT
Normal file
65
examples/inputs/stm32breakout.TXT
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
M48
|
||||
;GenerationSoftware,Autodesk,EAGLE,9.3.0*%
|
||||
;CreationDate,2019-03-23T08:22:29Z*%
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T4C0.350
|
||||
T3C0.500
|
||||
T2C1.000
|
||||
T1C1.200
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T1
|
||||
X39116Y10090
|
||||
X39116Y7690
|
||||
T2
|
||||
X1270Y5080
|
||||
X39370Y16510
|
||||
X1270Y7620
|
||||
X1270Y10160
|
||||
X1270Y12700
|
||||
X36830Y1270
|
||||
X1270Y16510
|
||||
X1270Y1270
|
||||
X3810Y1270
|
||||
X6350Y1270
|
||||
X8890Y1270
|
||||
X11430Y1270
|
||||
X13970Y1270
|
||||
X16510Y1270
|
||||
X19050Y1270
|
||||
X21590Y1270
|
||||
X24130Y1270
|
||||
X26670Y1270
|
||||
X29210Y1270
|
||||
X31750Y1270
|
||||
X34290Y1270
|
||||
X3810Y16510
|
||||
X39370Y1270
|
||||
X6350Y16510
|
||||
X36830Y16510
|
||||
X34290Y16510
|
||||
X31750Y16510
|
||||
X29210Y16510
|
||||
X26670Y16510
|
||||
X24130Y16510
|
||||
X21590Y16510
|
||||
X19050Y16510
|
||||
X16510Y16510
|
||||
X13970Y16510
|
||||
X11430Y16510
|
||||
X8890Y16510
|
||||
T3
|
||||
X29210Y11430
|
||||
X9017Y12827
|
||||
T4
|
||||
X18161Y8382
|
||||
X21082Y12192
|
||||
X20320Y12827
|
||||
X34544Y9398
|
||||
X34544Y8382
|
||||
X18034Y7239
|
||||
X17145Y8001
|
||||
M30
|
||||
72
examples/panelize.py
Executable file
72
examples/panelize.py
Executable file
|
|
@ -0,0 +1,72 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import sys, os
|
||||
import gerberex
|
||||
from gerberex import DxfFile, GerberComposition, DrillComposition
|
||||
|
||||
exts = ['GTL', 'GTO', 'GTP', 'GTS', 'GBL', 'GBO', 'GBP', 'GBS', 'TXT']
|
||||
boards=[
|
||||
('inputs/sonopi-digi.', 0, 0, 0),
|
||||
('inputs/sonopi-digi.', 0, 22.5, 0),
|
||||
('inputs/rcstick-f-small.', 0, 60, 0),
|
||||
('inputs/rcstick-f-small.', 20, 60, 0),
|
||||
('inputs/rcstick-f-small.', 40, 60, 0),
|
||||
('inputs/rcstick-f.', 92.216, 55.238, 190),
|
||||
('inputs/rcstick-jig.', 0, 44, 0),
|
||||
('inputs/stm32breakout.', 78.0, 59.36, 90),
|
||||
('inputs/stm32breakout.', 100.0, 59.36, 90),
|
||||
]
|
||||
outline = 'inputs/outline.dxf'
|
||||
mousebites = 'inputs/mousebites.dxf'
|
||||
outputs = 'outputs/panelized'
|
||||
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
try:
|
||||
os.mkdir('outputs')
|
||||
except FileExistsError:
|
||||
pass
|
||||
|
||||
def putstr(text):
|
||||
sys.stdout.write(text)
|
||||
sys.stdout.flush()
|
||||
|
||||
for ext in exts:
|
||||
putstr('merging %s: ' % ext)
|
||||
if ext == 'TXT':
|
||||
ctx = DrillComposition()
|
||||
else:
|
||||
ctx = GerberComposition()
|
||||
for path, x_offset, y_offset, angle in boards:
|
||||
file = gerberex.read(path + ext)
|
||||
file.to_metric()
|
||||
file.rotate(angle)
|
||||
file.offset(x_offset, y_offset)
|
||||
ctx.merge(file)
|
||||
putstr('.')
|
||||
if ext == 'TXT':
|
||||
file = gerberex.read(mousebites)
|
||||
file.draw_mode = DxfFile.DM_MOUSE_BITES
|
||||
file.to_metric()
|
||||
file.width = 0.5
|
||||
file.format = (3, 3)
|
||||
ctx.merge(file)
|
||||
else:
|
||||
file = gerberex.read(outline)
|
||||
ctx.merge(file)
|
||||
ctx.dump(outputs + '.' + ext)
|
||||
putstr(' end\n')
|
||||
|
||||
putstr('generating GML: ')
|
||||
file = gerberex.read(outline)
|
||||
file.write(outputs + '.GML')
|
||||
putstr('.')
|
||||
ctx = GerberComposition()
|
||||
base = gerberex.rectangle(width=100, height=100, left=0, bottom=0, units='metric')
|
||||
base.draw_mode = DxfFile.DM_FILL
|
||||
ctx.merge(base)
|
||||
file.draw_mode = DxfFile.DM_FILL
|
||||
file.negate_polarity()
|
||||
ctx.merge(file)
|
||||
ctx.dump(outputs + '-fill.GML')
|
||||
|
||||
putstr('. end\n')
|
||||
15
gerberex/__init__.py
Normal file
15
gerberex/__init__.py
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
"""
|
||||
Gerber Tools Extension
|
||||
======================
|
||||
**Gerber Tools Extenstion**
|
||||
gerber-tools-extension is a extention package for gerber-tools.
|
||||
This package provide panelizing of PCB fucntion.
|
||||
"""
|
||||
|
||||
from gerberex.common import read, loads, rectangle
|
||||
from gerberex.composition import GerberComposition, DrillComposition
|
||||
from gerberex.dxf import DxfFile
|
||||
184
gerberex/am_expression.py
Normal file
184
gerberex/am_expression.py
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
from gerber.utils import *
|
||||
from gerber.am_eval import OpCode
|
||||
from gerber.am_statements import *
|
||||
|
||||
class AMExpression(object):
|
||||
CONSTANT = 1
|
||||
VARIABLE = 2
|
||||
OPERATOR = 3
|
||||
|
||||
def __init__(self, kind):
|
||||
self.kind = kind
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self
|
||||
|
||||
def optimize(self):
|
||||
pass
|
||||
|
||||
def to_inch(self):
|
||||
return AMOperatorExpression(AMOperatorExpression.DIV, self,
|
||||
AMConstantExpression(MILLIMETERS_PER_INCH))
|
||||
|
||||
def to_metric(self):
|
||||
return AMOperatorExpression(AMOperatorExpression.MUL, self,
|
||||
AMConstantExpression(MILLIMETERS_PER_INCH))
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
pass
|
||||
|
||||
def to_instructions(self):
|
||||
pass
|
||||
|
||||
class AMConstantExpression(AMExpression):
|
||||
def __init__(self, value):
|
||||
super(AMConstantExpression, self).__init__(AMExpression.CONSTANT)
|
||||
self._value = value
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self._value
|
||||
|
||||
def optimize(self):
|
||||
return self
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
if isinstance(self._value, str):
|
||||
return self._value
|
||||
gerber = '%.6g' % self._value
|
||||
return '%.6f' % self._value if 'e' in gerber else gerber
|
||||
|
||||
def to_instructions(self):
|
||||
return [(OpCode.PUSH, self._value)]
|
||||
|
||||
class AMVariableExpression(AMExpression):
|
||||
def __init__(self, number):
|
||||
super(AMVariableExpression, self).__init__(AMExpression.VARIABLE)
|
||||
self.number = number
|
||||
|
||||
def optimize(self):
|
||||
return self
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
return '$%d' % self.number
|
||||
|
||||
def to_instructions(self):
|
||||
return (OpCode.LOAD, self.number)
|
||||
|
||||
class AMOperatorExpression(AMExpression):
|
||||
ADD = '+'
|
||||
SUB = '-'
|
||||
MUL = 'X'
|
||||
DIV = '/'
|
||||
|
||||
def __init__(self, op, lvalue, rvalue):
|
||||
super(AMOperatorExpression, self).__init__(AMExpression.OPERATOR)
|
||||
self.op = op
|
||||
self.lvalue = lvalue
|
||||
self.rvalue = rvalue
|
||||
|
||||
def optimize(self):
|
||||
self.lvalue = self.lvalue.optimize()
|
||||
self.rvalue = self.rvalue.optimize()
|
||||
|
||||
if isinstance(self.lvalue, AMConstantExpression) and isinstance(self.rvalue, AMConstantExpression):
|
||||
lvalue = float(self.lvalue.value)
|
||||
rvalue = float(self.rvalue.value)
|
||||
value = lvalue + rvalue if self.op == self.ADD else \
|
||||
lvalue - rvalue if self.op == self.SUB else \
|
||||
lvalue * rvalue if self.op == self.MUL else \
|
||||
lvalue / rvalue if self.op == self.DIV else None
|
||||
return AMConstantExpression(value)
|
||||
elif self.op == self.ADD:
|
||||
if self.rvalue.value == 0:
|
||||
return self.lvalue
|
||||
elif self.lvalue.value == 0:
|
||||
return self.rvalue
|
||||
elif self.op == self.SUB:
|
||||
if self.rvalue.value == 0:
|
||||
return self.lvalue
|
||||
elif self.lvalue.value == 0 and isinstance(self.rvalue, AMConstantExpression):
|
||||
return AMConstantExpression(-self.rvalue.value)
|
||||
elif self.op == self.MUL:
|
||||
if self.rvalue.value == 1:
|
||||
return self.lvalue
|
||||
elif self.lvalue.value == 1:
|
||||
return self.rvalue
|
||||
elif self.lvalue == 0 or self.rvalue == 0:
|
||||
return AMConstantExpression(0)
|
||||
elif self.op == self.DIV:
|
||||
if self.rvalue.value == 1:
|
||||
return self.lvalue
|
||||
elif self.lvalue.value == 0:
|
||||
return AMConstantExpression(0)
|
||||
|
||||
return self
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
return '(%s)%s(%s)' % (self.lvalue.to_gerber(settings), self.op, self.rvalue.to_gerber(settings))
|
||||
|
||||
def to_instructions(self):
|
||||
for i in self.lvalue.to_instructions():
|
||||
yield i
|
||||
for i in self.rvalue.to_instructions():
|
||||
yield i
|
||||
op = OpCode.ADD if self.op == self.ADD else\
|
||||
OpCode.SUB if self.op == self.SUB else\
|
||||
OpCode.MUL if self.op == self.MUL else\
|
||||
OpCode.DIV
|
||||
yield (op, None)
|
||||
|
||||
def eval_macro(instructions):
|
||||
stack = []
|
||||
|
||||
def pop():
|
||||
return stack.pop()
|
||||
|
||||
def push(op):
|
||||
stack.append(op)
|
||||
|
||||
def top():
|
||||
return stack[-1]
|
||||
|
||||
def empty():
|
||||
return len(stack) == 0
|
||||
|
||||
for opcode, argument in instructions:
|
||||
if opcode == OpCode.PUSH:
|
||||
push(AMConstantExpression(argument))
|
||||
|
||||
elif opcode == OpCode.LOAD:
|
||||
push(AMVariableExpression(argument))
|
||||
|
||||
elif opcode == OpCode.STORE:
|
||||
yield (-argument, [pop()])
|
||||
|
||||
elif opcode == OpCode.ADD:
|
||||
op1 = pop()
|
||||
op2 = pop()
|
||||
push(AMOperatorExpression(AMOperatorExpression.ADD, op2, op1))
|
||||
|
||||
elif opcode == OpCode.SUB:
|
||||
op1 = pop()
|
||||
op2 = pop()
|
||||
push(AMOperatorExpression(AMOperatorExpression.SUB, op2, op1))
|
||||
|
||||
elif opcode == OpCode.MUL:
|
||||
op1 = pop()
|
||||
op2 = pop()
|
||||
push(AMOperatorExpression(AMOperatorExpression.MUL, op2, op1))
|
||||
|
||||
elif opcode == OpCode.DIV:
|
||||
op1 = pop()
|
||||
op2 = pop()
|
||||
push(AMOperatorExpression(AMOperatorExpression.DIV, op2, op1))
|
||||
|
||||
elif opcode == OpCode.PRIM:
|
||||
yield (argument, stack)
|
||||
stack = []
|
||||
448
gerberex/am_primitive.py
Normal file
448
gerberex/am_primitive.py
Normal file
|
|
@ -0,0 +1,448 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
from gerber.utils import *
|
||||
from gerber.am_statements import *
|
||||
from gerber.am_eval import OpCode
|
||||
|
||||
from gerberex.am_expression import eval_macro, AMConstantExpression, AMOperatorExpression
|
||||
|
||||
class AMPrimitiveDef(AMPrimitive):
|
||||
def __init__(self, code, exposure=None, rotation=None):
|
||||
super(AMPrimitiveDef, self).__init__(code, exposure)
|
||||
if not rotation:
|
||||
rotation = AMConstantExpression(0)
|
||||
self.rotation = rotation
|
||||
|
||||
def rotate(self, angle, center=None):
|
||||
self.rotation = AMOperatorExpression(AMOperatorExpression.ADD,
|
||||
self.rotation,
|
||||
AMConstantExpression(float(angle)))
|
||||
self.rotation = self.rotation.optimize()
|
||||
|
||||
def to_inch(self):
|
||||
pass
|
||||
|
||||
def to_metric(self):
|
||||
pass
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
pass
|
||||
|
||||
def to_instructions(self):
|
||||
pass
|
||||
|
||||
class AMCommentPrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
return cls(code, modifiers[0])
|
||||
|
||||
def __init__(self, code, comment):
|
||||
super(AMCommentPrimitiveDef, self).__init__(code)
|
||||
self.comment = comment
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
return '%d %s*' % (self.code, self.comment.to_gerber())
|
||||
|
||||
def to_instructions(self):
|
||||
return [(OpCode.PUSH, self.comment), (OpCode.PRIM, self.code)]
|
||||
|
||||
class AMCirclePrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
exposure = 'on' if modifiers[0].value == 1 else 'off'
|
||||
diameter = modifiers[1]
|
||||
center_x = modifiers[2]
|
||||
center_y = modifiers[3]
|
||||
rotation = modifiers[4] if len(modifiers)>4 else AMConstantExpression(float(0))
|
||||
return cls(code, exposure, diameter, center_x, center_y, rotation)
|
||||
|
||||
def __init__(self, code, exposure, diameter, center_x, center_y, rotation):
|
||||
super(AMCirclePrimitiveDef, self).__init__(code, exposure, rotation)
|
||||
self.diameter = diameter
|
||||
self.center_x = center_x
|
||||
self.center_y = center_y
|
||||
|
||||
def to_inch(self):
|
||||
self.diameter = self.diameter.to_inch().optimize()
|
||||
self.center_x = self.center_x.to_inch().optimize()
|
||||
self.center_y = self.center_y.to_inch().optimize()
|
||||
|
||||
def to_metric(self):
|
||||
self.diameter = self.diameter.to_metric().optimize()
|
||||
self.center_x = self.center_x.to_metric().optimize()
|
||||
self.center_y = self.center_y.to_metric().optimize()
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
data = dict(code = self.code,
|
||||
exposure = 1 if self.exposure == 'on' else 0,
|
||||
diameter = self.diameter.to_gerber(settings),
|
||||
x = self.center_x.to_gerber(settings),
|
||||
y = self.center_y.to_gerber(settings),
|
||||
rotation = self.rotation.to_gerber(settings))
|
||||
return '{code},{exposure},{diameter},{x},{y},{rotation}*'.format(**data)
|
||||
|
||||
def to_instructions(self):
|
||||
yield (OpCode.PUSH, 1 if self.exposure == 'on' else 0)
|
||||
for modifier in [self.diameter, self.center_x, self.center_y, self.rotation]:
|
||||
for i in modifier.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.PRIM, self.code)
|
||||
|
||||
class AMVectorLinePrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
code = code
|
||||
exposure = 'on' if modifiers[0].value == 1 else 'off'
|
||||
width = modifiers[1]
|
||||
start_x = modifiers[2]
|
||||
start_y = modifiers[3]
|
||||
end_x = modifiers[4]
|
||||
end_y = modifiers[5]
|
||||
rotation = modifiers[6]
|
||||
return cls(code, exposure, width, start_x, start_y, end_x, end_y, rotation)
|
||||
|
||||
def __init__(self, code, exposure, width, start_x, start_y, end_x, end_y, rotation):
|
||||
super(AMVectorLinePrimitiveDef, self).__init__(code, exposure, rotation)
|
||||
self.width = width
|
||||
self.start_x = start_x
|
||||
self.start_y = start_y
|
||||
self.end_x = end_x
|
||||
self.end_y = end_y
|
||||
|
||||
def to_inch(self):
|
||||
self.width = self.width.to_inch().optimize()
|
||||
self.start_x = self.start_x.to_inch().optimize()
|
||||
self.start_y = self.start_y.to_inch().optimize()
|
||||
self.end_x = self.end_x.to_inch().optimize()
|
||||
self.end_y = self.end_y.to_inch().optimize()
|
||||
|
||||
def to_metric(self):
|
||||
self.width = self.width.to_metric().optimize()
|
||||
self.start_x = self.start_x.to_metric().optimize()
|
||||
self.start_y = self.start_y.to_metric().optimize()
|
||||
self.end_x = self.end_x.to_metric().optimize()
|
||||
self.end_y = self.end_y.to_metric().optimize()
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
data = dict(code = self.code,
|
||||
exposure = 1 if self.exposure == 'on' else 0,
|
||||
width = self.width.to_gerber(settings),
|
||||
start_x = self.start_x.to_gerber(settings),
|
||||
start_y = self.start_y.to_gerber(settings),
|
||||
end_x = self.end_x.to_gerber(settings),
|
||||
end_y = self.end_y.to_gerber(settings),
|
||||
rotation = self.rotation.to_gerber(settings))
|
||||
return '{code},{exposure},{width},{start_x},{start_y},{end_x},{end_y},{rotation}*'.format(**data)
|
||||
|
||||
def to_instructions(self):
|
||||
yield (OpCode.PUSH, 1 if self.exposure == 'on' else 0)
|
||||
modifiers = [self.width, self.start_x, self.start_y, self.end_x, self.end_y, self.rotation]
|
||||
for modifier in modifiers:
|
||||
for i in modifier.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.PRIM, self.code)
|
||||
|
||||
class AMCenterLinePrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
code = code
|
||||
exposure = 'on' if modifiers[0].value == 1 else 'off'
|
||||
width = modifiers[1]
|
||||
height = modifiers[2]
|
||||
x = modifiers[3]
|
||||
y = modifiers[4]
|
||||
rotation = modifiers[5]
|
||||
return cls(code, exposure, width, height, x, y, rotation)
|
||||
|
||||
def __init__(self, code, exposure, width, height, x, y, rotation):
|
||||
super(AMCenterLinePrimitiveDef, self).__init__(code, exposure, rotation)
|
||||
self.width = width
|
||||
self.height = height
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def to_inch(self):
|
||||
self.width = self.width.to_inch().optimize()
|
||||
self.height = self.height.to_inch().optimize()
|
||||
self.x = self.x.to_inch().optimize()
|
||||
self.y = self.y.to_inch().optimize()
|
||||
|
||||
def to_metric(self):
|
||||
self.width = self.width.to_metric().optimize()
|
||||
self.height = self.height.to_metric().optimize()
|
||||
self.x = self.x.to_metric().optimize()
|
||||
self.y = self.y.to_metric().optimize()
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
data = dict(code = self.code,
|
||||
exposure = 1 if self.exposure == 'on' else 0,
|
||||
width = self.width.to_gerber(settings),
|
||||
height = self.height.to_gerber(settings),
|
||||
x = self.x.to_gerber(settings),
|
||||
y = self.y.to_gerber(settings),
|
||||
rotation = self.rotation.to_gerber(settings))
|
||||
return '{code},{exposure},{width},{height},{x},{y},{rotation}*'.format(**data)
|
||||
|
||||
def to_instructions(self):
|
||||
yield (OpCode.PUSH, 1 if self.exposure == 'on' else 0)
|
||||
modifiers = [self.width, self.height, self.x, self.y, self.rotation]
|
||||
for modifier in modifiers:
|
||||
for i in modifier.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.PRIM, self.code)
|
||||
|
||||
class AMOutlinePrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
num_points = int(modifiers[1].value + 1)
|
||||
code = code
|
||||
exposure = 'on' if modifiers[0].value == 1 else 'off'
|
||||
addrs = modifiers[2:num_points * 2 + 2]
|
||||
rotation = modifiers[2 + num_points * 2]
|
||||
return cls(code, exposure, addrs, rotation)
|
||||
|
||||
def __init__(self, code, exposure, addrs, rotation):
|
||||
super(AMOutlinePrimitiveDef, self).__init__(code, exposure, rotation)
|
||||
self.addrs = addrs
|
||||
|
||||
def to_inch(self):
|
||||
self.addrs = [i.to_inch().optimize() for i in self.addrs]
|
||||
|
||||
def to_metric(self):
|
||||
self.addrs = [i.to_metric().optimize() for i in self.addrs]
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
def strs():
|
||||
yield '%d,%d,%d' % (self.code,
|
||||
1 if self.exposure == 'on' else 0,
|
||||
len(self.addrs) / 2 - 1)
|
||||
for i in self.addrs:
|
||||
yield i.to_gerber(settings)
|
||||
yield self.rotation.to_gerber(settings)
|
||||
|
||||
return '%s*' % ','.join(strs())
|
||||
|
||||
def to_instructions(self):
|
||||
yield (OpCode.PUSH, 1 if self.exposure == 'on' else 0)
|
||||
yield (OpCode.PUSH, int(len(self.addrs) / 2 - 1))
|
||||
for modifier in self.addrs:
|
||||
for i in modifier.to_instructions():
|
||||
yield i
|
||||
for i in self.rotation.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.PRIM, self.code)
|
||||
|
||||
class AMPolygonPrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
code = code
|
||||
exposure = 'on' if modifiers[0].value == 1 else 'off'
|
||||
vertices = modifiers[1]
|
||||
x = modifiers[2]
|
||||
y = modifiers[3]
|
||||
diameter = modifiers[4]
|
||||
rotation = modifiers[5]
|
||||
return cls(code, exposure, vertices, x, y, diameter, rotation)
|
||||
|
||||
def __init__(self, code, exposure, vertices, x, y, diameter, rotation):
|
||||
super(AMPolygonPrimitiveDef, self).__init__(code, exposure, rotation)
|
||||
self.vertices = vertices
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.diameter = diameter
|
||||
|
||||
def to_inch(self):
|
||||
self.x = self.x.to_inch().optimize()
|
||||
self.y = self.y.to_inch().optimize()
|
||||
self.diameter = self.diameter.to_inch().optimize()
|
||||
|
||||
def to_metric(self):
|
||||
self.x = self.x.to_metric().optimize()
|
||||
self.y = self.y.to_metric().optimize()
|
||||
self.diameter = self.diameter.to_metric().optimize()
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
data = dict(code = self.code,
|
||||
exposure = 1 if self.exposure == 'on' else 0,
|
||||
vertices = self.vertices.to_gerber(settings),
|
||||
x = self.x.to_gerber(settings),
|
||||
y = self.y.to_gerber(settings),
|
||||
diameter = self.diameter.to_gerber(settings),
|
||||
rotation = self.rotation.to_gerber(settings))
|
||||
return '{code},{exposure},{vertices},{x},{y},{diameter},{rotation}*'.format(**data)
|
||||
|
||||
def to_instructions(self):
|
||||
yield (OpCode.PUSH, 1 if self.exposure == 'on' else 0)
|
||||
modifiers = [self.vertices, self.x, self.y, self.diameter, self.rotation]
|
||||
for modifier in modifiers:
|
||||
for i in modifier.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.PRIM, self.code)
|
||||
|
||||
class AMMoirePrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
code = code
|
||||
exposure = 'on'
|
||||
x = modifiers[0]
|
||||
y = modifiers[1]
|
||||
diameter = modifiers[2]
|
||||
ring_thickness = modifiers[3]
|
||||
gap = modifiers[4]
|
||||
max_rings = modifiers[5]
|
||||
crosshair_thickness = modifiers[6]
|
||||
crosshair_length = modifiers[7]
|
||||
rotation = modifiers[8]
|
||||
return cls(code, exposure, x, y, diameter, ring_thickness, gap,
|
||||
max_rings, crosshair_thickness, crosshair_length, rotation)
|
||||
|
||||
def __init__(self, code, exposure, x, y, diameter, ring_thickness, gap, max_rings, crosshair_thickness, crosshair_length, rotation):
|
||||
super(AMMoirePrimitiveDef, self).__init__(code, exposure, rotation)
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.diameter = diameter
|
||||
self.ring_thickness = ring_thickness
|
||||
self.gap = gap
|
||||
self.max_rings = max_rings
|
||||
self.crosshair_thickness = crosshair_thickness
|
||||
self.crosshair_length = crosshair_length
|
||||
|
||||
def to_inch(self):
|
||||
self.x = self.x.to_inch().optimize()
|
||||
self.y = self.y.to_inch().optimize()
|
||||
self.diameter = self.diameter.to_inch().optimize()
|
||||
self.ring_thickness = self.ring_thickness.to_inch().optimize()
|
||||
self.gap = self.gap.to_inch().optimize()
|
||||
self.crosshair_thickness = self.crosshair_thickness.to_inch().optimize()
|
||||
self.crosshair_length = self.crosshair_length.to_inch().optimize()
|
||||
|
||||
def to_metric(self):
|
||||
self.x = self.x.to_metric().optimize()
|
||||
self.y = self.y.to_metric().optimize()
|
||||
self.diameter = self.diameter.to_metric().optimize()
|
||||
self.ring_thickness = self.ring_thickness.to_metric().optimize()
|
||||
self.gap = self.gap.to_metric().optimize()
|
||||
self.crosshair_thickness = self.crosshair_thickness.to_metric().optimize()
|
||||
self.crosshair_length = self.crosshair_length.to_metric().optimize()
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
data = dict(code = self.code,
|
||||
x = self.x.to_gerber(settings),
|
||||
y = self.y.to_gerber(settings),
|
||||
diameter = self.diameter.to_gerber(settings),
|
||||
ring_thickness = self.ring_thickness.to_gerber(settings),
|
||||
gap = self.gap.to_gerber(settings),
|
||||
max_rings = self.max_rings.to_gerber(settings),
|
||||
crosshair_thickness = self.crosshair_thickness.to_gerber(settings),
|
||||
crosshair_length = self.crosshair_length.to_gerber(settings),
|
||||
rotation = self.rotation.to_gerber(settings))
|
||||
return '{code},{x},{y},{diameter},{ring_thickness},{gap},{max_rings},'\
|
||||
'{crosshair_thickness},{crosshair_length},{rotation}*'.format(**data)
|
||||
|
||||
def to_instructions(self):
|
||||
modifiers = [self.x, self.y, self.diameter,
|
||||
self.ring_thickness, self.gap, self.max_rings,
|
||||
self.crosshair_thickness, self.crosshair_length,
|
||||
self.rotation]
|
||||
for modifier in modifiers:
|
||||
for i in modifier.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.PRIM, self.code)
|
||||
|
||||
class AMThermalPrimitiveDef(AMPrimitiveDef):
|
||||
@classmethod
|
||||
def from_modifiers(cls, code, modifiers):
|
||||
code = code
|
||||
exposure = 'on'
|
||||
x = modifiers[0]
|
||||
y = modifiers[1]
|
||||
outer_diameter = modifiers[2]
|
||||
inner_diameter = modifiers[3]
|
||||
gap = modifiers[4]
|
||||
rotation = modifiers[5]
|
||||
return cls(code, exposure, x, y, outer_diameter, inner_diameter, gap, rotation)
|
||||
|
||||
def __init__(self, code, exposure, x, y, outer_diameter, inner_diameter, gap, rotation):
|
||||
super(AMThermalPrimitiveDef, self).__init__(code, exposure, rotation)
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.outer_diameter = outer_diameter
|
||||
self.inner_diameter = inner_diameter
|
||||
self.gap = gap
|
||||
|
||||
def to_inch(self):
|
||||
self.x = self.x.to_inch().optimize()
|
||||
self.y = self.y.to_inch().optimize()
|
||||
self.outer_diameter = self.outer_diameter.to_inch().optimize()
|
||||
self.inner_diameter = self.inner_diameter.to_inch().optimize()
|
||||
self.gap = self.gap.to_inch().optimize()
|
||||
|
||||
def to_metric(self):
|
||||
self.x = self.x.to_metric().optimize()
|
||||
self.y = self.y.to_metric().optimize()
|
||||
self.outer_diameter = self.outer_diameter.to_metric().optimize()
|
||||
self.inner_diameter = self.inner_diameter.to_metric().optimize()
|
||||
self.gap = self.gap.to_metric().optimize()
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
data = dict(code = self.code,
|
||||
x = self.x.to_gerber(settings),
|
||||
y = self.y.to_gerber(settings),
|
||||
outer_diameter = self.outer_diameter.to_gerber(settings),
|
||||
inner_diameter = self.inner_diameter.to_gerber(settings),
|
||||
gap = self.gap.to_gerber(settings),
|
||||
rotation = self.rotation.to_gerber(settings))
|
||||
return '{code},{x},{y},{outer_diameter},{inner_diameter},'\
|
||||
'{gap},{rotation}*'.format(**data)
|
||||
|
||||
def to_instructions(self):
|
||||
modifiers = [self.x, self.y, self.outer_diameter,
|
||||
self.inner_diameter, self.gap, self.rotation]
|
||||
for modifier in modifiers:
|
||||
for i in modifier.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.PRIM, self.code)
|
||||
|
||||
class AMVariableDef(object):
|
||||
def __init__(self, number, value):
|
||||
self.number = number
|
||||
self.value = value
|
||||
|
||||
def to_inch(self):
|
||||
return self
|
||||
|
||||
def to_metric(self):
|
||||
return self
|
||||
|
||||
def to_gerber(self, settings=None):
|
||||
return '$%d=%s*' % (self.number, self.value.to_gerber(settings))
|
||||
|
||||
def to_instructions(self):
|
||||
for i in self.value.to_instructions():
|
||||
yield i
|
||||
yield (OpCode.STORE, self.number)
|
||||
|
||||
def rotate(self, angle, center=None):
|
||||
pass
|
||||
|
||||
def to_primitive_defs(instructions):
|
||||
classes = {
|
||||
0: AMCommentPrimitiveDef,
|
||||
1: AMCirclePrimitiveDef,
|
||||
2: AMVectorLinePrimitiveDef,
|
||||
20: AMVectorLinePrimitiveDef,
|
||||
21: AMCenterLinePrimitiveDef,
|
||||
4: AMOutlinePrimitiveDef,
|
||||
5: AMPolygonPrimitiveDef,
|
||||
6: AMMoirePrimitiveDef,
|
||||
7: AMThermalPrimitiveDef,
|
||||
}
|
||||
for code, modifiers in eval_macro(instructions):
|
||||
if code < 0:
|
||||
yield AMVariableDef(-code, modifiers[0])
|
||||
else:
|
||||
primitive = classes[code]
|
||||
yield primitive.from_modifiers(code, modifiers)
|
||||
40
gerberex/common.py
Normal file
40
gerberex/common.py
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
import os
|
||||
from gerber.common import loads as loads_org
|
||||
from gerber.exceptions import ParseError
|
||||
from gerber.utils import detect_file_format
|
||||
import gerber.rs274x
|
||||
import gerber.ipc356
|
||||
import gerberex.rs274x
|
||||
import gerberex.excellon
|
||||
import gerberex.dxf
|
||||
|
||||
def read(filename, format=None):
|
||||
with open(filename, 'rU') as f:
|
||||
data = f.read()
|
||||
return loads(data, filename, format=format)
|
||||
|
||||
|
||||
def loads(data, filename=None, format=None):
|
||||
if os.path.splitext(filename if filename else '')[1].lower() == '.dxf':
|
||||
return gerberex.dxf.loads(data, filename)
|
||||
|
||||
fmt = detect_file_format(data)
|
||||
if fmt == 'rs274x':
|
||||
file = gerberex.rs274x.loads(data, filename=filename)
|
||||
return gerberex.rs274x.GerberFile.from_gerber_file(file)
|
||||
elif fmt == 'excellon':
|
||||
return gerberex.excellon.loads(data, filename=filename, format=format)
|
||||
elif fmt == 'ipc_d_356':
|
||||
return ipc356.loads(data, filename=filename)
|
||||
else:
|
||||
raise ParseError('Unable to detect file format')
|
||||
|
||||
|
||||
def rectangle(width, height, left=0, bottom=0, units='metric', draw_mode=None, filename=None):
|
||||
return gerberex.dxf.DxfFile.rectangle(
|
||||
width, height, left, bottom, units, draw_mode, filename)
|
||||
192
gerberex/composition.py
Normal file
192
gerberex/composition.py
Normal file
|
|
@ -0,0 +1,192 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
import os
|
||||
from functools import reduce
|
||||
from gerber.cam import FileSettings
|
||||
from gerber.gerber_statements import EofStmt
|
||||
from gerber.excellon_statements import *
|
||||
from gerber.excellon import DrillSlot, DrillHit
|
||||
import gerberex.rs274x
|
||||
import gerberex.excellon
|
||||
import gerberex.dxf
|
||||
|
||||
class Composition(object):
|
||||
def __init__(self, settings = None, comments = None):
|
||||
self.settings = settings
|
||||
self.comments = comments if comments != None else []
|
||||
|
||||
class GerberComposition(Composition):
|
||||
APERTURE_ID_BIAS = 10
|
||||
|
||||
def __init__(self, settings=None, comments=None):
|
||||
super(GerberComposition, self).__init__(settings, comments)
|
||||
self.aperture_macros = {}
|
||||
self.apertures = []
|
||||
self.drawings = []
|
||||
|
||||
def merge(self, file):
|
||||
if isinstance(file, gerberex.rs274x.GerberFile):
|
||||
self._merge_gerber(file)
|
||||
elif isinstance(file, gerberex.dxf.DxfFile):
|
||||
self._merge_dxf(file)
|
||||
else:
|
||||
raise Exception('unsupported file type')
|
||||
|
||||
def dump(self, path):
|
||||
def statements():
|
||||
for k in self.aperture_macros:
|
||||
yield self.aperture_macros[k]
|
||||
for s in self.apertures:
|
||||
yield s
|
||||
for s in self.drawings:
|
||||
yield s
|
||||
yield EofStmt()
|
||||
self.settings.notation = 'absolute'
|
||||
self.settings.zeros = 'trailing'
|
||||
with open(path, 'w') as f:
|
||||
gerberex.rs274x.write_gerber_header(f, self.settings)
|
||||
for statement in statements():
|
||||
f.write(statement.to_gerber(self.settings) + '\n')
|
||||
|
||||
def _merge_gerber(self, file):
|
||||
aperture_macro_map = {}
|
||||
aperture_map = {}
|
||||
|
||||
if self.settings:
|
||||
if self.settings.units == 'metric':
|
||||
file.to_metric()
|
||||
else:
|
||||
file.to_inch()
|
||||
|
||||
for macro in file.aperture_macros:
|
||||
statement = file.aperture_macros[macro]
|
||||
name = statement.name
|
||||
newname = self._register_aperture_macro(statement)
|
||||
aperture_macro_map[name] = newname
|
||||
|
||||
for statement in file.aperture_defs:
|
||||
if statement.param == 'AD':
|
||||
if statement.shape in aperture_macro_map:
|
||||
statement.shape = aperture_macro_map[statement.shape]
|
||||
dnum = statement.d
|
||||
newdnum = self._register_aperture(statement)
|
||||
aperture_map[dnum] = newdnum
|
||||
|
||||
for statement in file.main_statements:
|
||||
if statement.type == 'APERTURE':
|
||||
statement.d = aperture_map[statement.d]
|
||||
self.drawings.append(statement)
|
||||
|
||||
if not self.settings:
|
||||
self.settings = file.context
|
||||
|
||||
def _merge_dxf(self, file):
|
||||
if self.settings:
|
||||
if self.settings.units == 'metric':
|
||||
file.to_metric()
|
||||
else:
|
||||
file.to_inch()
|
||||
|
||||
file.dcode = self._register_aperture(file.aperture)
|
||||
self.drawings.append(file.statements)
|
||||
|
||||
if not self.settings:
|
||||
self.settings = file.settings
|
||||
|
||||
|
||||
def _register_aperture_macro(self, statement):
|
||||
name = statement.name
|
||||
newname = name
|
||||
offset = 0
|
||||
while newname in self.aperture_macros:
|
||||
offset += 1
|
||||
newname = '%s_%d' % (name, offset)
|
||||
statement.name = newname
|
||||
self.aperture_macros[newname] = statement
|
||||
return newname
|
||||
|
||||
def _register_aperture(self, statement):
|
||||
statement.d = len(self.apertures) + self.APERTURE_ID_BIAS
|
||||
self.apertures.append(statement)
|
||||
return statement.d
|
||||
|
||||
class DrillComposition(Composition):
|
||||
def __init__(self, settings=None, comments=None):
|
||||
super(DrillComposition, self).__init__(settings, comments)
|
||||
self.tools = []
|
||||
self.hits = []
|
||||
self.dxf_statements = []
|
||||
|
||||
def merge(self, file):
|
||||
if isinstance(file, gerberex.excellon.ExcellonFileEx):
|
||||
self._merge_excellon(file)
|
||||
elif isinstance(file, gerberex.DxfFile):
|
||||
self._merge_dxf(file)
|
||||
else:
|
||||
raise Exception('unsupported file type')
|
||||
|
||||
def dump(self, path):
|
||||
def statements():
|
||||
for t in self.tools:
|
||||
yield ToolSelectionStmt(t.number).to_excellon(self.settings)
|
||||
for h in self.hits:
|
||||
if h.tool.number == t.number:
|
||||
yield h.to_excellon(self.settings)
|
||||
for num, statement in self.dxf_statements:
|
||||
if num == t.number:
|
||||
yield statement.to_excellon(self.settings)
|
||||
yield EndOfProgramStmt().to_excellon()
|
||||
|
||||
self.settings.notation = 'absolute'
|
||||
self.settings.zeros = 'trailing'
|
||||
with open(path, 'w') as f:
|
||||
gerberex.excellon.write_excellon_header(f, self.settings, self.tools)
|
||||
for statement in statements():
|
||||
f.write(statement + '\n')
|
||||
|
||||
def _merge_excellon(self, file):
|
||||
tool_map = {}
|
||||
|
||||
if not self.settings:
|
||||
self.settings = file.settings
|
||||
else:
|
||||
if self.settings.units == 'metric':
|
||||
file.to_metric()
|
||||
else:
|
||||
file.to_inch()
|
||||
|
||||
for tool in iter(file.tools.values()):
|
||||
num = tool.number
|
||||
tool_map[num] = self._register_tool(tool)
|
||||
|
||||
for hit in file.hits:
|
||||
hit.tool = tool_map[hit.tool.number]
|
||||
self.hits.append(hit)
|
||||
|
||||
def _merge_dxf(self, file):
|
||||
if not self.settings:
|
||||
self.settings = file.settings
|
||||
else:
|
||||
if self.settings.units == 'metric':
|
||||
file.to_metric()
|
||||
else:
|
||||
file.to_inch()
|
||||
|
||||
tool = self._register_tool(ExcellonTool(self.settings, number=1, diameter=file.width))
|
||||
self.dxf_statements.append((tool.number, file.statements))
|
||||
|
||||
def _register_tool(self, tool):
|
||||
for existing in self.tools:
|
||||
if existing.equivalent(tool):
|
||||
return existing
|
||||
new_tool = ExcellonTool.from_tool(tool)
|
||||
new_tool.settings = self.settings
|
||||
def toolnums():
|
||||
for tool in self.tools:
|
||||
yield tool.number
|
||||
max_num = reduce(lambda x, y: x if x > y else y, toolnums(), 0)
|
||||
new_tool.number = max_num + 1
|
||||
self.tools.append(new_tool)
|
||||
return new_tool
|
||||
796
gerberex/dxf.py
Normal file
796
gerberex/dxf.py
Normal file
|
|
@ -0,0 +1,796 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
import io, sys
|
||||
from math import pi, cos, sin, tan, atan, atan2, acos, asin, sqrt
|
||||
import dxfgrabber
|
||||
from gerber.cam import CamFile, FileSettings
|
||||
from gerber.utils import inch, metric, write_gerber_value, rotate_point
|
||||
from gerber.gerber_statements import ADParamStmt
|
||||
from gerber.excellon_statements import ExcellonTool
|
||||
from gerber.excellon_statements import CoordinateStmt
|
||||
from gerberex.utility import is_equal_point, is_equal_value
|
||||
from gerberex.dxf_path import generate_paths, judge_containment
|
||||
from gerberex.excellon import write_excellon_header
|
||||
from gerberex.rs274x import write_gerber_header
|
||||
|
||||
ACCEPTABLE_ERROR = 0.001
|
||||
|
||||
def _normalize_angle(start_angle, end_angle):
|
||||
angle = end_angle - start_angle
|
||||
if angle > 0:
|
||||
start = start_angle % 360
|
||||
else:
|
||||
angle = -angle
|
||||
start = end_angle % 360
|
||||
angle = min(angle, 360)
|
||||
start = start - 360 if start > 180 else start
|
||||
|
||||
regions = []
|
||||
while angle > 0:
|
||||
end = start + angle
|
||||
if end <= 180:
|
||||
regions.append((start * pi / 180, end * pi / 180))
|
||||
angle = 0
|
||||
else:
|
||||
regions.append((start * pi / 180, pi))
|
||||
angle = end - 180
|
||||
start = -180
|
||||
return regions
|
||||
|
||||
def _intersections_of_line_and_circle(start, end, center, radius, error_range):
|
||||
x1 = start[0] - center[0]
|
||||
y1 = start[1] - center[1]
|
||||
x2 = end[0] - center[0]
|
||||
y2 = end[1] - center[1]
|
||||
|
||||
dx = x2 - x1
|
||||
dy = y2 - y1
|
||||
dr = sqrt(dx * dx + dy * dy)
|
||||
D = x1 * y2 - x2 * y1
|
||||
|
||||
distance = abs(dy * x1 - dx * y1) / dr
|
||||
|
||||
D2 = D * D
|
||||
dr2 = dr * dr
|
||||
r2 = radius * radius
|
||||
delta = r2 * dr2 - D2
|
||||
if distance > radius - error_range and distance < radius + error_range:
|
||||
delta = 0
|
||||
if delta < 0:
|
||||
return None
|
||||
|
||||
sqrt_D = sqrt(delta)
|
||||
E_x = -dx * sqrt_D if dy < 0 else dx * sqrt_D
|
||||
E_y = abs(dy) * sqrt_D
|
||||
|
||||
p1_x = (D * dy + E_x) / dr2
|
||||
p2_x = (D * dy - E_x) / dr2
|
||||
p1_y = (-D * dx + E_y) / dr2
|
||||
p2_y = (-D * dx - E_y) / dr2
|
||||
|
||||
p1_angle = atan2(p1_y, p1_x)
|
||||
p2_angle = atan2(p2_y, p2_x)
|
||||
if dx == 0:
|
||||
p1_t = (p1_y - y1) / dy
|
||||
p2_t = (p2_y - y1) / dy
|
||||
else:
|
||||
p1_t = (p1_x - x1) / dx
|
||||
p2_t = (p2_x - x1) / dx
|
||||
|
||||
if delta == 0:
|
||||
return (
|
||||
(p1_x + center[0], p1_y + center[1]),
|
||||
None,
|
||||
p1_angle, None,
|
||||
p1_t, None
|
||||
)
|
||||
else:
|
||||
return (
|
||||
(p1_x + center[0], p1_y + center[1]),
|
||||
(p2_x + center[0], p2_y + center[1]),
|
||||
p1_angle, p2_angle,
|
||||
p1_t, p2_t
|
||||
)
|
||||
|
||||
class DxfStatement(object):
|
||||
def __init__(self, entity):
|
||||
self.entity = entity
|
||||
self.start = None
|
||||
self.end = None
|
||||
self.is_closed = False
|
||||
|
||||
def to_inch(self):
|
||||
pass
|
||||
|
||||
def to_metric(self):
|
||||
pass
|
||||
|
||||
def is_equal_to(self, target, error_range=0):
|
||||
return False
|
||||
|
||||
def reverse(self):
|
||||
raise Exception('Not implemented')
|
||||
|
||||
def offset(self, offset_x, offset_y):
|
||||
raise Exception('Not supported')
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
raise Exception('Not supported')
|
||||
|
||||
|
||||
class DxfLineStatement(DxfStatement):
|
||||
@classmethod
|
||||
def from_entity(cls, entity):
|
||||
start = (entity.start[0], entity.start[1])
|
||||
end = (entity.end[0], entity.end[1])
|
||||
return cls(entity, start, end)
|
||||
|
||||
@property
|
||||
def bounding_box(self):
|
||||
return (min(self.start[0], self.end[0]),
|
||||
min(self.start[1], self.end[1]),
|
||||
max(self.start[0], self.end[0]),
|
||||
max(self.start[1], self.end[1]))
|
||||
|
||||
def __init__(self, entity, start, end):
|
||||
super(DxfLineStatement, self).__init__(entity)
|
||||
self.start = start
|
||||
self.end = end
|
||||
|
||||
def to_inch(self):
|
||||
self.start = (
|
||||
inch(self.start[0]), inch(self.start[1]))
|
||||
self.end = (
|
||||
inch(self.end[0]), inch(self.end[1]))
|
||||
|
||||
def to_metric(self):
|
||||
self.start = (
|
||||
metric(self.start[0]), metric(self.start[1]))
|
||||
self.end = (
|
||||
metric(self.end[0]), metric(self.end[1]))
|
||||
|
||||
def is_equal_to(self, target, error_range=0):
|
||||
if not isinstance(target, DxfLineStatement):
|
||||
return False
|
||||
return (is_equal_point(self.start, target.start, error_range) and \
|
||||
is_equal_point(self.end, target.end, error_range)) or \
|
||||
(is_equal_point(self.start, target.end, error_range) and \
|
||||
is_equal_point(self.end, target.start, error_range))
|
||||
|
||||
def reverse(self):
|
||||
pt = self.start
|
||||
self.start = self.end
|
||||
self.end = pt
|
||||
|
||||
def dots(self, pitch, width, offset=0):
|
||||
x0, y0 = self.start
|
||||
x1, y1 = self.end
|
||||
y1 = self.end[1]
|
||||
xp = x1 - x0
|
||||
yp = y1 - y0
|
||||
l = sqrt(xp * xp + yp * yp)
|
||||
xd = xp * pitch / l
|
||||
yd = yp * pitch / l
|
||||
x0 += xp * offset / l
|
||||
y0 += yp * offset / l
|
||||
|
||||
if offset > l + width / 2:
|
||||
return (None, offset - l)
|
||||
else:
|
||||
d = offset;
|
||||
while d < l + width / 2:
|
||||
yield ((x0, y0), d - l)
|
||||
x0 += xd
|
||||
y0 += yd
|
||||
d += pitch
|
||||
|
||||
def offset(self, offset_x, offset_y):
|
||||
self.start = (self.start[0] + offset_x, self.start[1] + offset_y)
|
||||
self.end = (self.end[0] + offset_x, self.end[1] + offset_y)
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
self.start = rotate_point(self.start, angle, center)
|
||||
self.end = rotate_point(self.end, angle, center)
|
||||
|
||||
def intersections_with_halfline(self, point_from, point_to, error_range):
|
||||
denominator = (self.end[0] - self.start[0]) * (point_to[1] - point_from[1]) - \
|
||||
(self.end[1] - self.start[1]) * (point_to[0] - point_from[0])
|
||||
de = error_range * error_range
|
||||
if denominator >= -de and denominator <= de:
|
||||
return []
|
||||
from_dx = point_from[0] - self.start[0]
|
||||
from_dy = point_from[1] - self.start[1]
|
||||
r = ((point_to[1] - point_from[1]) * from_dx -
|
||||
(point_to[0] - point_from[0]) * from_dy) / denominator
|
||||
s = ((self.end[1] - self.start[1]) * from_dx -
|
||||
(self.end[0] - self.start[0]) * from_dy) / denominator
|
||||
dx = (self.end[0] - self.start[0])
|
||||
dy = (self.end[1] - self.start[1])
|
||||
le = error_range / sqrt(dx * dx + dy * dy)
|
||||
if s < 0 or r < -le or r > 1 + le:
|
||||
return []
|
||||
|
||||
pt = (self.start[0] + (self.end[0] - self.start[0]) * r,
|
||||
self.start[1] + (self.end[1] - self.start[1]) * r)
|
||||
if is_equal_point(pt, self.start, error_range):
|
||||
return []
|
||||
else:
|
||||
return [pt]
|
||||
|
||||
def intersections_with_arc(self, center, radius, angle_regions, error_range):
|
||||
intersection = \
|
||||
_intersections_of_line_and_circle(self.start, self.end, center, radius, error_range)
|
||||
if intersection is None:
|
||||
return []
|
||||
else:
|
||||
p1, p2, p1_angle, p2_angle, p1_t, p2_t = intersection
|
||||
|
||||
pts = []
|
||||
if p1_t >= 0 and p1_t <= 1:
|
||||
for region in angle_regions:
|
||||
if p1_angle >= region[0] and p1_angle <= region[1]:
|
||||
pts.append(p1)
|
||||
break
|
||||
if p2 is not None and p2_t >= 0 and p2_t <= 1:
|
||||
for region in angle_regions:
|
||||
if p2_angle >= region[0] and p2_angle <= region[1]:
|
||||
pts.append(p2)
|
||||
break
|
||||
|
||||
return pts
|
||||
|
||||
class DxfArcStatement(DxfStatement):
|
||||
def __init__(self, entity):
|
||||
super(DxfArcStatement, self).__init__(entity)
|
||||
if entity.dxftype == 'CIRCLE':
|
||||
self.radius = self.entity.radius
|
||||
self.center = (self.entity.center[0], self.entity.center[1])
|
||||
self.start = (self.center[0] + self.radius, self.center[1])
|
||||
self.end = self.start
|
||||
self.start_angle = 0
|
||||
self.end_angle = 360
|
||||
self.is_closed = True
|
||||
elif entity.dxftype == 'ARC':
|
||||
self.start_angle = self.entity.start_angle
|
||||
self.end_angle = self.entity.end_angle
|
||||
self.radius = self.entity.radius
|
||||
self.center = (self.entity.center[0], self.entity.center[1])
|
||||
self.start = (
|
||||
self.center[0] + self.radius * cos(self.start_angle / 180. * pi),
|
||||
self.center[1] + self.radius * sin(self.start_angle / 180. * pi),
|
||||
)
|
||||
self.end = (
|
||||
self.center[0] + self.radius * cos(self.end_angle / 180. * pi),
|
||||
self.center[1] + self.radius * sin(self.end_angle / 180. * pi),
|
||||
)
|
||||
angle = self.end_angle - self.start_angle
|
||||
self.is_closed = angle >= 360 or angle <= -360
|
||||
else:
|
||||
raise Exception('invalid DXF type was specified')
|
||||
self.angle_regions = _normalize_angle(self.start_angle, self.end_angle)
|
||||
|
||||
@property
|
||||
def bounding_box(self):
|
||||
return (self.center[0] - self.radius, self.center[1] - self.radius,
|
||||
self.center[0] + self.radius, self.center[1] + self.radius)
|
||||
|
||||
def to_inch(self):
|
||||
self.radius = inch(self.radius)
|
||||
self.center = (inch(self.center[0]), inch(self.center[1]))
|
||||
self.start = (inch(self.start[0]), inch(self.start[1]))
|
||||
self.end = (inch(self.end[0]), inch(self.end[1]))
|
||||
|
||||
def to_metric(self):
|
||||
self.radius = metric(self.radius)
|
||||
self.center = (metric(self.center[0]), metric(self.center[1]))
|
||||
self.start = (metric(self.start[0]), metric(self.start[1]))
|
||||
self.end = (metric(self.end[0]), metric(self.end[1]))
|
||||
|
||||
def is_equal_to(self, target, error_range=0):
|
||||
if not isinstance(target, DxfArcStatement):
|
||||
return False
|
||||
aerror_range = error_range / pi * self.radius * 180
|
||||
return is_equal_point(self.center, target.center, error_range) and \
|
||||
is_equal_value(self.radius, target.radius, error_range) and \
|
||||
((is_equal_value(self.start_angle, target.start_angle, aerror_range) and
|
||||
is_equal_value(self.end_angle, target.end_angle, aerror_range)) or
|
||||
(is_equal_value(self.start_angle, target.end_angle, aerror_range) and
|
||||
is_equal_value(self.end_angle, target.end_angle, aerror_range)))
|
||||
|
||||
def reverse(self):
|
||||
tmp = self.start_angle
|
||||
self.start_angle = self.end_angle
|
||||
self.end_angle = tmp
|
||||
tmp = self.start
|
||||
self.start = self.end
|
||||
self.end = tmp
|
||||
|
||||
def dots(self, pitch, width, offset=0):
|
||||
angle = self.end_angle - self.start_angle
|
||||
afactor = 1 if angle > 0 else -1
|
||||
aangle = angle * afactor
|
||||
L = 2 * pi * self.radius
|
||||
l = L * aangle / 360
|
||||
pangle = pitch / L * 360
|
||||
wangle = width / L * 360
|
||||
oangle = offset / L * 360
|
||||
|
||||
if offset > l + width / 2:
|
||||
yield (None, offset - l)
|
||||
else:
|
||||
da = oangle
|
||||
while da < aangle + wangle / 2:
|
||||
cangle = self.start_angle + da * afactor
|
||||
x = self.radius * cos(cangle / 180 * pi) + self.center[0]
|
||||
y = self.radius * sin(cangle / 180 * pi) + self.center[1]
|
||||
remain = (da - aangle) / 360 * L
|
||||
yield((x, y), remain)
|
||||
da += pangle
|
||||
|
||||
def offset(self, offset_x, offset_y):
|
||||
self.center = (self.center[0] + offset_x, self.center[1] + offset_y)
|
||||
self.start = (self.start[0] + offset_x, self.start[1] + offset_y)
|
||||
self.end = (self.end[0] + offset_x, self.end[1] + offset_y)
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
self.start_angle += angle
|
||||
self.end_angle += angle
|
||||
self.center = rotate_point(self.center, angle, center)
|
||||
self.start = rotate_point(self.start, angle, center)
|
||||
self.end = rotate_point(self.end, angle, center)
|
||||
self.angle_regions = _normalize_angle(self.start_angle, self.end_angle)
|
||||
|
||||
def intersections_with_halfline(self, point_from, point_to, error_range):
|
||||
intersection = \
|
||||
_intersections_of_line_and_circle(
|
||||
point_from, point_to, self.center, self.radius, error_range)
|
||||
if intersection is None:
|
||||
return []
|
||||
else:
|
||||
p1, p2, p1_angle, p2_angle, p1_t, p2_t = intersection
|
||||
|
||||
if is_equal_point(p1, self.start, error_range):
|
||||
p1 = None
|
||||
elif p2 is not None and is_equal_point(p2, self.start, error_range):
|
||||
p2 = None
|
||||
|
||||
def is_contained(angle, region, error):
|
||||
if angle >= region[0] - error and angle <= region[1] + error:
|
||||
return True
|
||||
if angle < 0 and region[1] > 0:
|
||||
angle = angle + 2 * pi
|
||||
elif angle > 0 and region[0] < 0:
|
||||
angle = angle - 2 * pi
|
||||
return angle >= region[0] - error and angle <= region[1] + error
|
||||
|
||||
aerror = error_range * self.radius
|
||||
pts = []
|
||||
if p1 is not None and p1_t >= 0 and not is_equal_point(p1, self.start, error_range):
|
||||
for region in self.angle_regions:
|
||||
if is_contained(p1_angle, region, aerror):
|
||||
pts.append(p1)
|
||||
break
|
||||
if p2 is not None and p2_t >= 0 and not is_equal_point(p2, self.start, error_range):
|
||||
for region in self.angle_regions:
|
||||
if is_contained(p2_angle, region, aerror):
|
||||
pts.append(p2)
|
||||
break
|
||||
|
||||
return pts
|
||||
|
||||
def intersections_with_arc(self, center, radius, angle_regions, error_range):
|
||||
x1 = center[0] - self.center[0]
|
||||
y1 = center[1] - self.center[1]
|
||||
r1 = self.radius
|
||||
r2 = radius
|
||||
cd_sq = x1 * x1 + y1 * y1
|
||||
cd = sqrt(cd_sq)
|
||||
rd = abs(r1 - r2)
|
||||
|
||||
if (cd >= 0 and cd <= rd) or cd >= r1 + r2:
|
||||
return []
|
||||
|
||||
A = (cd_sq + r1 * r1 - r2 * r2) / 2
|
||||
scale = sqrt(cd_sq * r1 * r1 - A * A) / cd_sq
|
||||
xl = A * x1 / cd_sq
|
||||
xr = y1 * scale
|
||||
yl = A * y1 / cd_sq
|
||||
yr = x1 * scale
|
||||
|
||||
pt1_x = xl + xr
|
||||
pt1_y = yl - yr
|
||||
pt2_x = xl - xr
|
||||
pt2_y = yl + yr
|
||||
pt1_angle1 = atan2(pt1_y, pt1_x)
|
||||
pt1_angle2 = atan2(pt1_y - y1, pt1_x - x1)
|
||||
pt2_angle1 = atan2(pt2_y, pt2_x)
|
||||
pt2_angle2 = atan2(pt2_y - y1, pt2_x - x1)
|
||||
|
||||
aerror = error_range * self.radius
|
||||
pts=[]
|
||||
for region in self.angle_regions:
|
||||
if pt1_angle1 >= region[0] and pt1_angle1 <= region[1]:
|
||||
for region in angle_regions:
|
||||
if pt1_angle2 >= region[0] - aerror and pt1_angle2 <= region[1] + aerror:
|
||||
pts.append((pt1_x + self.center[0], pt1_y + self.center[1]))
|
||||
break
|
||||
break
|
||||
for region in self.angle_regions:
|
||||
if pt2_angle1 >= region[0] and pt2_angle1 <= region[1]:
|
||||
for region in angle_regions:
|
||||
if pt2_angle2 >= region[0] - aerror and pt2_angle2 <= region[1] + aerror:
|
||||
pts.append((pt2_x + self.center[0], pt2_y + self.center[1]))
|
||||
break
|
||||
break
|
||||
return pts
|
||||
|
||||
class DxfPolylineStatement(DxfStatement):
|
||||
def __init__(self, entity):
|
||||
super(DxfPolylineStatement, self).__init__(entity)
|
||||
self.start = (self.entity.points[0][0], self.entity.points[0][1])
|
||||
self.is_closed = self.entity.is_closed
|
||||
if self.is_closed:
|
||||
self.end = self.start
|
||||
else:
|
||||
self.end = (self.entity.points[-1][0], self.entity.points[-1][1])
|
||||
|
||||
def disassemble(self):
|
||||
class Item:
|
||||
pass
|
||||
|
||||
def ptseq():
|
||||
for i in range(1, len(self.entity.points)):
|
||||
yield i
|
||||
if self.entity.is_closed:
|
||||
yield 0
|
||||
|
||||
x0 = self.entity.points[0][0]
|
||||
y0 = self.entity.points[0][1]
|
||||
b = self.entity.bulge[0]
|
||||
for idx in ptseq():
|
||||
pt = self.entity.points[idx]
|
||||
x1 = pt[0]
|
||||
y1 = pt[1]
|
||||
if b == 0:
|
||||
item = Item()
|
||||
item.dxftype = 'LINE'
|
||||
item.start = (x0, y0)
|
||||
item.end = (x1, y1)
|
||||
item.is_closed = False
|
||||
yield DxfLineStatement.from_entity(item)
|
||||
else:
|
||||
ang = 4 * atan(b)
|
||||
xm = x0 + x1
|
||||
ym = y0 + y1
|
||||
t = 1 / tan(ang / 2)
|
||||
xc = (xm - t * (y1 - y0)) / 2
|
||||
yc = (ym + t * (x1 - x0)) / 2
|
||||
r = sqrt((x0 - xc)*(x0 - xc) + (y0 - yc)*(y0 - yc))
|
||||
rx0 = x0 - xc
|
||||
ry0 = y0 - yc
|
||||
rc = max(min(rx0 / r, 1.0), -1.0)
|
||||
start_angle = acos(rc) if ry0 > 0 else 2 * pi - acos(rc)
|
||||
start_angle *= 180 / pi
|
||||
end_angle = start_angle + ang * 180 / pi
|
||||
|
||||
item = Item()
|
||||
item.dxftype = 'ARC'
|
||||
item.start = (x0, y0)
|
||||
item.end = (x1, y1)
|
||||
item.start_angle = start_angle
|
||||
item.end_angle = end_angle
|
||||
item.radius = r
|
||||
item.center = (xc, yc)
|
||||
item.is_closed = end_angle - start_angle >= 360
|
||||
yield DxfArcStatement(item)
|
||||
|
||||
x0 = x1
|
||||
y0 = y1
|
||||
b = self.entity.bulge[idx]
|
||||
|
||||
def to_inch(self):
|
||||
self.start = (inch(self.start[0]), inch(self.start[1]))
|
||||
self.end = (inch(self.end[0]), inch(self.end[1]))
|
||||
for idx in range(0, len(self.entity.points)):
|
||||
self.entity.points[idx] = (
|
||||
inch(self.entity.points[idx][0]), inch(self.entity.points[idx][1]))
|
||||
|
||||
def to_metric(self):
|
||||
self.start = (metric(self.start[0]), metric(self.start[1]))
|
||||
self.end = (metric(self.end[0]), metric(self.end[1]))
|
||||
for idx in range(0, len(self.entity.points)):
|
||||
self.entity.points[idx] = (
|
||||
metric(self.entity.points[idx][0]), metric(self.entity.points[idx][1]))
|
||||
|
||||
def offset(self, offset_x, offset_y):
|
||||
for idx in range(len(self.entity.points)):
|
||||
self.entity.points[idx] = (
|
||||
self.entity.points[idx][0] + offset_x, self.entity.points[idx][1] + offset_y)
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
for idx in range(len(self.entity.points)):
|
||||
self.entity.points[idx] = rotate_point(self.entity.points[idx], angle, center)
|
||||
|
||||
class DxfStatements(object):
|
||||
def __init__(self, statements, units, dcode=10, draw_mode=None, fill_mode=None):
|
||||
if draw_mode is None:
|
||||
draw_mode = DxfFile.DM_LINE
|
||||
if fill_mode is None:
|
||||
fill_mode = DxfFile.FM_TURN_OVER
|
||||
self._units = units
|
||||
self.dcode = dcode
|
||||
self.draw_mode = draw_mode
|
||||
self.fill_mode = fill_mode
|
||||
self.pitch = inch(1) if self._units == 'inch' else 1
|
||||
self.width = 0
|
||||
self.error_range = inch(ACCEPTABLE_ERROR) if self._units == 'inch' else ACCEPTABLE_ERROR
|
||||
self.statements = list(filter(
|
||||
lambda i: not (isinstance(i, DxfLineStatement) and \
|
||||
is_equal_point(i.start, i.end, self.error_range)),
|
||||
statements
|
||||
))
|
||||
self.close_paths, self.open_paths = generate_paths(self.statements, self.error_range)
|
||||
self.sorted_close_paths = []
|
||||
self.polarity = True # True means dark, False means clear
|
||||
|
||||
@property
|
||||
def units(self):
|
||||
return _units
|
||||
|
||||
def _polarity_command(self, polarity=None):
|
||||
if polarity is None:
|
||||
polarity = self.polarity
|
||||
return '%LPD*%' if polarity else '%LPC*%'
|
||||
|
||||
def _prepare_sorted_close_paths(self):
|
||||
if self.sorted_close_paths:
|
||||
return
|
||||
for i in range(0, len(self.close_paths)):
|
||||
for j in range(i + 1, len(self.close_paths)):
|
||||
containee, container = judge_containment(
|
||||
self.close_paths[i], self.close_paths[j], self.error_range)
|
||||
if containee is not None:
|
||||
containee.containers.append(container)
|
||||
self.sorted_close_paths = sorted(self.close_paths, key=lambda path: len(path.containers))
|
||||
|
||||
def to_gerber(self, settings=FileSettings()):
|
||||
def gerbers():
|
||||
yield 'G75*'
|
||||
yield self._polarity_command()
|
||||
yield 'D{0}*'.format(self.dcode)
|
||||
if self.draw_mode == DxfFile.DM_FILL:
|
||||
yield 'G36*'
|
||||
if self.fill_mode == DxfFile.FM_TURN_OVER:
|
||||
self._prepare_sorted_close_paths()
|
||||
polarity = self.polarity
|
||||
level = 0
|
||||
for path in self.sorted_close_paths:
|
||||
if len(path.containers) > level:
|
||||
level = len(path.containers)
|
||||
polarity = not polarity
|
||||
yield 'G37*'
|
||||
yield self._polarity_command(polarity)
|
||||
yield 'G36*'
|
||||
yield path.to_gerber(settings)
|
||||
else:
|
||||
for path in self.close_paths:
|
||||
yield path.to_gerber(settings)
|
||||
yield 'G37*'
|
||||
else:
|
||||
pitch = self.pitch if self.draw_mode == DxfFile.DM_MOUSE_BITES else 0
|
||||
for path in self.open_paths:
|
||||
yield path.to_gerber(settings, pitch=pitch, width=self.width)
|
||||
for path in self.close_paths:
|
||||
yield path.to_gerber(settings, pitch=pitch, width=self.width)
|
||||
|
||||
return '\n'.join(gerbers())
|
||||
|
||||
def to_excellon(self, settings=FileSettings()):
|
||||
if self.draw_mode == DxfFile.DM_FILL:
|
||||
return
|
||||
def drills():
|
||||
pitch = self.pitch if self.draw_mode == DxfFile.DM_MOUSE_BITES else 0
|
||||
for path in self.open_paths:
|
||||
yield path.to_excellon(settings, pitch=pitch, width=self.width)
|
||||
for path in self.close_paths:
|
||||
yield path.to_excellon(settings, pitch=pitch, width=self.width)
|
||||
return '\n'.join(drills())
|
||||
|
||||
def to_inch(self):
|
||||
if self._units == 'metric':
|
||||
self._units = 'inch'
|
||||
self.pitch = inch(self.pitch)
|
||||
self.width = inch(self.width)
|
||||
self.error_range = inch(self.error_range)
|
||||
for path in self.open_paths:
|
||||
path.to_inch()
|
||||
for path in self.close_paths:
|
||||
path.to_inch()
|
||||
|
||||
def to_metric(self):
|
||||
if self._units == 'inch':
|
||||
self._units = 'metric'
|
||||
self.pitch = metric(self.pitch)
|
||||
self.width = metric(self.width)
|
||||
self.error_range = metric(self.error_range)
|
||||
for path in self.open_paths:
|
||||
path.to_metric()
|
||||
for path in self.close_paths:
|
||||
path.to_metric()
|
||||
|
||||
def offset(self, offset_x, offset_y):
|
||||
for path in self.open_paths:
|
||||
path.offset(offset_x, offset_y)
|
||||
for path in self.close_paths:
|
||||
path.offset(offset_x, offset_y)
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
for path in self.open_paths:
|
||||
path.rotate(angle, center)
|
||||
for path in self.close_paths:
|
||||
path.rotate(angle, center)
|
||||
|
||||
class DxfFile(CamFile):
|
||||
DM_LINE = 0
|
||||
DM_FILL = 1
|
||||
DM_MOUSE_BITES = 2
|
||||
|
||||
FM_SIMPLE = 0
|
||||
FM_TURN_OVER = 1
|
||||
|
||||
FT_RX274X = 0
|
||||
FT_EXCELLON = 1
|
||||
|
||||
@classmethod
|
||||
def from_dxf(cls, dxf, settings=None, draw_mode=None, filename=None):
|
||||
fsettings = settings if settings else \
|
||||
FileSettings(zero_suppression='leading')
|
||||
|
||||
if dxf.header['$INSUNITS'] == 1:
|
||||
fsettings.units = 'inch'
|
||||
if not settings:
|
||||
fsettings.format = (2, 5)
|
||||
else:
|
||||
fsettings.units = 'metric'
|
||||
if not settings:
|
||||
fsettings.format = (3, 4)
|
||||
|
||||
statements = []
|
||||
for entity in dxf.entities:
|
||||
if entity.dxftype == 'LWPOLYLINE':
|
||||
statements.append(DxfPolylineStatement(entity))
|
||||
elif entity.dxftype == 'LINE':
|
||||
statements.append(DxfLineStatement.from_entity(entity))
|
||||
elif entity.dxftype == 'CIRCLE':
|
||||
statements.append(DxfArcStatement(entity))
|
||||
elif entity.dxftype == 'ARC':
|
||||
statements.append(DxfArcStatement(entity))
|
||||
|
||||
return cls(statements, fsettings, draw_mode, filename)
|
||||
|
||||
@classmethod
|
||||
def rectangle(cls, width, height, left=0, bottom=0, units='metric', draw_mode=None, filename=None):
|
||||
if units == 'metric':
|
||||
settings = FileSettings(units=units, zero_suppression='leading', format=(3,4))
|
||||
else:
|
||||
settings = FileSettings(units=units, zero_suppression='leading', format=(2,5))
|
||||
statements = [
|
||||
DxfLineStatement(None, (left, bottom), (left + width, bottom)),
|
||||
DxfLineStatement(None, (left + width, bottom), (left + width, bottom + height)),
|
||||
DxfLineStatement(None, (left + width, bottom + height), (left, bottom + height)),
|
||||
DxfLineStatement(None, (left, bottom + height), (left, bottom)),
|
||||
]
|
||||
return cls(statements, settings, draw_mode, filename)
|
||||
|
||||
def __init__(self, statements, settings=None, draw_mode=None, filename=None):
|
||||
if not settings:
|
||||
settings = FileSettings(units='metric', format=(3,4), zero_suppression='leading')
|
||||
if draw_mode == None:
|
||||
draw_mode = self.DM_LINE
|
||||
|
||||
super(DxfFile, self).__init__(settings=settings, filename=filename)
|
||||
self._draw_mode = draw_mode
|
||||
self._fill_mode = self.FM_TURN_OVER
|
||||
|
||||
self.aperture = ADParamStmt.circle(dcode=10, diameter=0.0)
|
||||
if settings.units == 'inch':
|
||||
self.aperture.to_inch()
|
||||
else:
|
||||
self.aperture.to_metric()
|
||||
self.statements = DxfStatements(
|
||||
statements, self.units, dcode=self.aperture.d, draw_mode=self.draw_mode, fill_mode=self.filename)
|
||||
|
||||
@property
|
||||
def dcode(self):
|
||||
return self.aperture.dcode
|
||||
|
||||
@dcode.setter
|
||||
def dcode(self, value):
|
||||
self.aperture.d = value
|
||||
self.statements.dcode = value
|
||||
|
||||
@property
|
||||
def width(self):
|
||||
return self.aperture.modifiers[0][0]
|
||||
|
||||
@width.setter
|
||||
def width(self, value):
|
||||
self.aperture.modifiers = ([float(value),],)
|
||||
self.statements.width = value
|
||||
|
||||
@property
|
||||
def draw_mode(self):
|
||||
return self._draw_mode
|
||||
|
||||
@draw_mode.setter
|
||||
def draw_mode(self, value):
|
||||
self._draw_mode = value
|
||||
self.statements.draw_mode = value
|
||||
|
||||
@property
|
||||
def fill_mode(self):
|
||||
return self._fill_mode
|
||||
|
||||
@fill_mode.setter
|
||||
def fill_mode(self, value):
|
||||
self._fill_mode = value
|
||||
self.statements.fill_mode = value
|
||||
|
||||
@property
|
||||
def pitch(self):
|
||||
return self.statements.pitch
|
||||
|
||||
@pitch.setter
|
||||
def pitch(self, value):
|
||||
self.statements.pitch = value
|
||||
|
||||
def write(self, filename=None, filetype=FT_RX274X):
|
||||
self.settings.notation = 'absolute'
|
||||
self.settings.zeros = 'trailing'
|
||||
filename = filename if filename is not None else self.filename
|
||||
with open(filename, 'w') as f:
|
||||
if filetype == self.FT_RX274X:
|
||||
write_gerber_header(f, self.settings)
|
||||
f.write(self.aperture.to_gerber(self.settings) + '\n')
|
||||
f.write(self.statements.to_gerber(self.settings) + '\n')
|
||||
f.write('M02*\n')
|
||||
else:
|
||||
tools = [ExcellonTool(self.settings, number=1, diameter=self.width)]
|
||||
write_excellon_header(f, self.settings, tools)
|
||||
f.write('T01\n')
|
||||
f.write(self.statements.to_excellon(self.settings) + '\n')
|
||||
f.write('M30\n')
|
||||
|
||||
|
||||
def to_inch(self):
|
||||
if self.units == 'metric':
|
||||
self.aperture.to_inch()
|
||||
self.statements.to_inch()
|
||||
self.pitch = inch(self.pitch)
|
||||
self.units = 'inch'
|
||||
|
||||
def to_metric(self):
|
||||
if self.units == 'inch':
|
||||
self.aperture.to_metric()
|
||||
self.statements.to_metric()
|
||||
self.pitch = metric(self.pitch)
|
||||
self.units = 'metric'
|
||||
|
||||
def offset(self, offset_x, offset_y):
|
||||
self.statements.offset(offset_x, offset_y)
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
self.statements.rotate(angle, center)
|
||||
|
||||
def negate_polarity(self):
|
||||
self.statements.polarity = not self.statements.polarity
|
||||
|
||||
def loads(data, filename=None):
|
||||
if sys.version_info.major == 2:
|
||||
data = unicode(data)
|
||||
stream = io.StringIO(data)
|
||||
dxf = dxfgrabber.read(stream)
|
||||
return DxfFile.from_dxf(dxf)
|
||||
412
gerberex/dxf_path.py
Normal file
412
gerberex/dxf_path.py
Normal file
|
|
@ -0,0 +1,412 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
from gerber.utils import inch, metric, write_gerber_value
|
||||
from gerber.cam import FileSettings
|
||||
from gerberex.utility import is_equal_point, is_equal_value, normalize_vec2d, dot_vec2d
|
||||
from gerberex.excellon import CoordinateStmtEx
|
||||
|
||||
class DxfPath(object):
|
||||
def __init__(self, statements, error_range=0):
|
||||
self.statements = statements
|
||||
self.error_range = error_range
|
||||
self.bounding_box = statements[0].bounding_box
|
||||
self.containers = []
|
||||
for statement in statements[1:]:
|
||||
self._merge_bounding_box(statement.bounding_box)
|
||||
|
||||
@property
|
||||
def start(self):
|
||||
return self.statements[0].start
|
||||
|
||||
@property
|
||||
def end(self):
|
||||
return self.statements[-1].end
|
||||
|
||||
@property
|
||||
def is_closed(self):
|
||||
if len(self.statements) == 1:
|
||||
return self.statements[0].is_closed
|
||||
else:
|
||||
return is_equal_point(self.start, self.end, self.error_range)
|
||||
|
||||
def is_equal_to(self, target, error_range=0):
|
||||
if not isinstance(target, DxfPath):
|
||||
return False
|
||||
if len(self.statements) != len(target.statements):
|
||||
return False
|
||||
if is_equal_point(self.start, target.start, error_range) and \
|
||||
is_equal_point(self.end, target.end, error_range):
|
||||
for i in range(0, len(self.statements)):
|
||||
if not self.statements[i].is_equal_to(target.statements[i], error_range):
|
||||
return False
|
||||
return True
|
||||
elif is_equal_point(self.start, target.end, error_range) and \
|
||||
is_equal_point(self.end, target.start, error_range):
|
||||
for i in range(0, len(self.statements)):
|
||||
if not self.statements[i].is_equal_to(target.statements[-1 - i], error_range):
|
||||
return False
|
||||
return True
|
||||
return False
|
||||
|
||||
def contain(self, target, error_range=0):
|
||||
for statement in self.statements:
|
||||
if statement.is_equal_to(target, error_range):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def to_inch(self):
|
||||
self.error_range = inch(self.error_range)
|
||||
for statement in self.statements:
|
||||
statement.to_inch()
|
||||
|
||||
def to_metric(self):
|
||||
self.error_range = metric(self.error_range)
|
||||
for statement in self.statements:
|
||||
statement.to_metric()
|
||||
|
||||
def offset(self, offset_x, offset_y):
|
||||
for statement in self.statements:
|
||||
statement.offset(offset_x, offset_y)
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
for statement in self.statements:
|
||||
statement.rotate(angle, center)
|
||||
|
||||
def reverse(self):
|
||||
rlist = []
|
||||
for statement in reversed(self.statements):
|
||||
statement.reverse()
|
||||
rlist.append(statement)
|
||||
self.statements = rlist
|
||||
|
||||
def merge(self, element, error_range=0):
|
||||
if self.is_closed or element.is_closed:
|
||||
return False
|
||||
if not error_range:
|
||||
error_range = self.error_range
|
||||
if is_equal_point(self.end, element.start, error_range):
|
||||
return self._append_at_end(element, error_range)
|
||||
elif is_equal_point(self.end, element.end, error_range):
|
||||
element.reverse()
|
||||
return self._append_at_end(element, error_range)
|
||||
elif is_equal_point(self.start, element.end, error_range):
|
||||
return self._insert_on_top(element, error_range)
|
||||
elif is_equal_point(self.start, element.start, error_range):
|
||||
element.reverse()
|
||||
return self._insert_on_top(element, error_range)
|
||||
else:
|
||||
return False
|
||||
|
||||
def _append_at_end(self, element, error_range=0):
|
||||
if isinstance(element, DxfPath):
|
||||
if self.is_equal_to(element, error_range):
|
||||
return False
|
||||
for i in range(0, min(len(self.statements), len(element.statements))):
|
||||
if not self.statements[-1 - i].is_equal_to(element.statements[i]):
|
||||
break
|
||||
for j in range(0, min(len(self.statements), len(element.statements))):
|
||||
if not self.statements[j].is_equal_to(element.statements[-1 - j]):
|
||||
break
|
||||
if i + j >= len(element.statements):
|
||||
return False
|
||||
mergee = list(element.statements)
|
||||
if i > 0:
|
||||
del mergee[0:i]
|
||||
del self.statements[-i]
|
||||
if j > 0:
|
||||
del mergee[-j]
|
||||
del self.statements[0:j]
|
||||
for statement in mergee:
|
||||
self._merge_bounding_box(statement.bounding_box)
|
||||
self.statements.extend(mergee)
|
||||
return True
|
||||
else:
|
||||
if self.statements[-1].is_equal_to(element, error_range) or \
|
||||
self.statements[0].is_equal_to(element, error_range):
|
||||
return False
|
||||
self._merge_bounding_box(element.bounding_box)
|
||||
self.statements.appen(element)
|
||||
return True
|
||||
|
||||
def _insert_on_top(self, element, error_range=0):
|
||||
if isinstance(element, DxfPath):
|
||||
if self.is_equal_to(element, error_range):
|
||||
return False
|
||||
for i in range(0, min(len(self.statements), len(element.statements))):
|
||||
if not self.statements[-1 - i].is_equal_to(element.statements[i]):
|
||||
break
|
||||
for j in range(0, min(len(self.statements), len(element.statements))):
|
||||
if not self.statements[j].is_equal_to(element.statements[-1 - j]):
|
||||
break
|
||||
if i + j >= len(element.statements):
|
||||
return False
|
||||
mergee = list(element.statements)
|
||||
if i > 0:
|
||||
del mergee[0:i]
|
||||
del self.statements[-i]
|
||||
if j > 0:
|
||||
del mergee[-j]
|
||||
del self.statements[0:j]
|
||||
self.statements[0:0] = mergee
|
||||
return True
|
||||
else:
|
||||
if self.statements[-1].is_equal_to(element, error_range) or \
|
||||
self.statements[0].is_equal_to(element, error_range):
|
||||
return False
|
||||
self.statements.insert(0, element)
|
||||
return True
|
||||
|
||||
def _merge_bounding_box(self, box):
|
||||
self.bounding_box = (min(self.bounding_box[0], box[0]),
|
||||
min(self.bounding_box[1], box[1]),
|
||||
max(self.bounding_box[2], box[2]),
|
||||
max(self.bounding_box[3], box[3]))
|
||||
|
||||
def may_be_in_collision(self, path):
|
||||
if self.bounding_box[0] >= path.bounding_box[2] or \
|
||||
self.bounding_box[1] >= path.bounding_box[3] or \
|
||||
self.bounding_box[2] <= path.bounding_box[0] or \
|
||||
self.bounding_box[3] <= path.bounding_box[1]:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def to_gerber(self, settings=FileSettings(), pitch=0, width=0):
|
||||
from gerberex.dxf import DxfArcStatement
|
||||
if pitch == 0:
|
||||
x0, y0 = self.statements[0].start
|
||||
gerber = 'G01*\nX{0}Y{1}D02*\nG75*'.format(
|
||||
write_gerber_value(x0, settings.format,
|
||||
settings.zero_suppression),
|
||||
write_gerber_value(y0, settings.format,
|
||||
settings.zero_suppression),
|
||||
)
|
||||
|
||||
for statement in self.statements:
|
||||
x0, y0 = statement.start
|
||||
x1, y1 = statement.end
|
||||
if isinstance(statement, DxfArcStatement):
|
||||
xc, yc = statement.center
|
||||
gerber += '\nG{0}*\nX{1}Y{2}I{3}J{4}D01*'.format(
|
||||
'03' if statement.end_angle > statement.start_angle else '02',
|
||||
write_gerber_value(x1, settings.format,
|
||||
settings.zero_suppression),
|
||||
write_gerber_value(y1, settings.format,
|
||||
settings.zero_suppression),
|
||||
write_gerber_value(xc - x0, settings.format,
|
||||
settings.zero_suppression),
|
||||
write_gerber_value(yc - y0, settings.format,
|
||||
settings.zero_suppression)
|
||||
)
|
||||
else:
|
||||
gerber += '\nG01*\nX{0}Y{1}D01*'.format(
|
||||
write_gerber_value(x1, settings.format,
|
||||
settings.zero_suppression),
|
||||
write_gerber_value(y1, settings.format,
|
||||
settings.zero_suppression),
|
||||
)
|
||||
else:
|
||||
def ploter(x, y):
|
||||
return 'X{0}Y{1}D03*\n'.format(
|
||||
write_gerber_value(x, settings.format,
|
||||
settings.zero_suppression),
|
||||
write_gerber_value(y, settings.format,
|
||||
settings.zero_suppression),
|
||||
)
|
||||
gerber = self._plot_dots(pitch, width, ploter)
|
||||
|
||||
return gerber
|
||||
|
||||
def to_excellon(self, settings=FileSettings(), pitch=0, width=0):
|
||||
from gerberex.dxf import DxfArcStatement
|
||||
if pitch == 0:
|
||||
x0, y0 = self.statements[0].start
|
||||
excellon = 'G00{0}\nM15\n'.format(
|
||||
CoordinateStmtEx(x=x0, y=y0).to_excellon(settings))
|
||||
|
||||
for statement in self.statements:
|
||||
x0, y0 = statement.start
|
||||
x1, y1 = statement.end
|
||||
if isinstance(statement, DxfArcStatement):
|
||||
i = statement.center[0] - x0
|
||||
j = statement.center[1] - y0
|
||||
excellon += '{0}{1}\n'.format(
|
||||
'G03' if statement.end_angle > statement.start_angle else 'G02',
|
||||
CoordinateStmtEx(x=x1, y=y1, i=i, j=j).to_excellon(settings))
|
||||
else:
|
||||
excellon += 'G01{0}\n'.format(
|
||||
CoordinateStmtEx(x=x1, y=y1).to_excellon(settings))
|
||||
|
||||
excellon += 'M16\nG05\n'
|
||||
else:
|
||||
def ploter(x, y):
|
||||
return CoordinateStmtEx(x=x, y=y).to_excellon(settings) + '\n'
|
||||
excellon = self._plot_dots(pitch, width, ploter)
|
||||
|
||||
return excellon
|
||||
|
||||
def _plot_dots(self, pitch, width, ploter):
|
||||
out = ''
|
||||
offset = 0
|
||||
for idx in range(0, len(self.statements)):
|
||||
statement = self.statements[idx]
|
||||
if offset < 0:
|
||||
offset += pitch
|
||||
for dot, offset in statement.dots(pitch, width, offset):
|
||||
if dot is None:
|
||||
break
|
||||
if offset > 0 and (statement.is_closed or idx != len(self.statements) - 1):
|
||||
break
|
||||
#if idx == len(self.statements) - 1 and statement.is_closed and offset > -pitch:
|
||||
# break
|
||||
out += ploter(dot[0], dot[1])
|
||||
return out
|
||||
|
||||
def intersections_with_halfline(self, point_from, point_to, error_range=0):
|
||||
def calculator(statement):
|
||||
return statement.intersections_with_halfline(point_from, point_to, error_range)
|
||||
def validator(pt, statement, idx):
|
||||
if is_equal_point(pt, statement.end, error_range) and \
|
||||
not self._judge_cross(point_from, point_to, idx, error_range):
|
||||
return False
|
||||
return True
|
||||
return self._collect_intersections(calculator, validator, error_range)
|
||||
|
||||
def intersections_with_arc(self, center, radius, angle_regions, error_range=0):
|
||||
def calculator(statement):
|
||||
return statement.intersections_with_arc(center, radius, angle_regions, error_range)
|
||||
return self._collect_intersections(calculator, None, error_range)
|
||||
|
||||
def _collect_intersections(self, calculator, validator, error_range):
|
||||
allpts = []
|
||||
last = allpts
|
||||
for i in range(0, len(self.statements)):
|
||||
statement = self.statements[i]
|
||||
cur = calculator(statement)
|
||||
if cur:
|
||||
for pt in cur:
|
||||
for dest in allpts:
|
||||
if is_equal_point(pt, dest, error_range):
|
||||
break
|
||||
else:
|
||||
if validator is not None and not validator(pt, statement, i):
|
||||
continue
|
||||
allpts.append(pt)
|
||||
last = cur
|
||||
return allpts
|
||||
|
||||
def _judge_cross(self, from_pt, to_pt, index, error_range):
|
||||
standard = normalize_vec2d((to_pt[0] - from_pt[0], to_pt[1] - from_pt[1]))
|
||||
normal = (standard[1], -standard[0])
|
||||
def statements():
|
||||
for i in range(index, len(self.statements)):
|
||||
yield self.statements[i]
|
||||
for i in range(0, index):
|
||||
yield self.statements[i]
|
||||
dot_standard = None
|
||||
for statement in statements():
|
||||
tstart = statement.start
|
||||
tend = statement.end
|
||||
target = normalize_vec2d((tend[0] - tstart[0], tend[1] - tstart[1]))
|
||||
dot= dot_vec2d(normal, target)
|
||||
if dot_standard is None:
|
||||
dot_standard = dot
|
||||
continue
|
||||
if is_equal_point(standard, target, error_range):
|
||||
continue
|
||||
return (dot_standard > 0 and dot > 0) or (dot_standard < 0 and dot < 0)
|
||||
raise Exception('inconsistensy is detected while cross judgement between paths')
|
||||
|
||||
def generate_paths(statements, error_range=0):
|
||||
from gerberex.dxf import DxfPolylineStatement
|
||||
|
||||
paths = []
|
||||
for statement in filter(lambda s: isinstance(s, DxfPolylineStatement), statements):
|
||||
units = [unit for unit in statement.disassemble()]
|
||||
paths.append(DxfPath(units, error_range))
|
||||
|
||||
unique_statements = []
|
||||
redundant = 0
|
||||
for statement in filter(lambda s: not isinstance(s, DxfPolylineStatement), statements):
|
||||
for path in paths:
|
||||
if path.contain(statement):
|
||||
redundant += 1
|
||||
break
|
||||
else:
|
||||
for target in unique_statements:
|
||||
if statement.is_equal_to(target, error_range):
|
||||
redundant += 1
|
||||
break
|
||||
else:
|
||||
unique_statements.append(statement)
|
||||
|
||||
paths.extend([DxfPath([s], error_range) for s in unique_statements])
|
||||
|
||||
prev_paths_num = 0
|
||||
while prev_paths_num != len(paths):
|
||||
working = []
|
||||
for i in range(len(paths)):
|
||||
mergee = paths[i]
|
||||
for j in range(i + 1, len(paths)):
|
||||
target = paths[j]
|
||||
if target.merge(mergee, error_range):
|
||||
break
|
||||
else:
|
||||
working.append(mergee)
|
||||
prev_paths_num = len(paths)
|
||||
paths = working
|
||||
|
||||
closed_path = list(filter(lambda p: p.is_closed, paths))
|
||||
open_path = list(filter(lambda p: not p.is_closed, paths))
|
||||
return (closed_path, open_path)
|
||||
|
||||
def judge_containment(path1, path2, error_range=0):
|
||||
from gerberex.dxf import DxfArcStatement, DxfLineStatement
|
||||
|
||||
nocontainment = (None, None)
|
||||
if not path1.may_be_in_collision(path2):
|
||||
return nocontainment
|
||||
|
||||
def is_in_line_segment(point_from, point_to, point):
|
||||
dx = point_to[0] - point_from[0]
|
||||
ratio = (point[0] - point_from[0]) / dx if dx != 0 else \
|
||||
(point[1] - point_from[1]) / (point_to[1] - point_from[1])
|
||||
return ratio >= 0 and ratio <= 1
|
||||
|
||||
def contain_in_path(statement, path):
|
||||
if isinstance(statement, DxfLineStatement):
|
||||
segment = (statement.start, statement.end)
|
||||
elif isinstance(statement, DxfArcStatement):
|
||||
if statement.start == statement.end:
|
||||
segment = (statement.start, statement.center)
|
||||
else:
|
||||
segment = (statement.start, statement.end)
|
||||
else:
|
||||
raise Exception('invalid dxf statement type')
|
||||
pts = path.intersections_with_halfline(segment[0], segment[1], error_range)
|
||||
if len(pts) % 2 == 0:
|
||||
return False
|
||||
for pt in pts:
|
||||
if is_in_line_segment(segment[0], segment[1], pt):
|
||||
return False
|
||||
if isinstance(statement, DxfArcStatement):
|
||||
pts = path.intersections_with_arc(
|
||||
statement.center, statement.radius, statement.angle_regions, error_range)
|
||||
if len(pts) > 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
if contain_in_path(path1.statements[0], path2):
|
||||
containment = [path1, path2]
|
||||
elif contain_in_path(path2.statements[0], path1):
|
||||
containment = [path2, path1]
|
||||
else:
|
||||
return nocontainment
|
||||
for i in range(1, len(containment[0].statements)):
|
||||
if not contain_in_path(containment[0].statements[i], containment[1]):
|
||||
return nocontainment
|
||||
return containment
|
||||
404
gerberex/excellon.py
Normal file
404
gerberex/excellon.py
Normal file
|
|
@ -0,0 +1,404 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
import operator
|
||||
|
||||
import gerber.excellon
|
||||
from gerber.excellon import ExcellonParser, detect_excellon_format, ExcellonFile, DrillHit, DrillSlot
|
||||
from gerber.excellon_statements import ExcellonStatement, UnitStmt, CoordinateStmt, UnknownStmt, \
|
||||
SlotStmt, DrillModeStmt, RouteModeStmt, LinearModeStmt, \
|
||||
ToolSelectionStmt, ZAxisRoutPositionStmt, \
|
||||
RetractWithClampingStmt, RetractWithoutClampingStmt, \
|
||||
EndOfProgramStmt
|
||||
from gerber.cam import FileSettings
|
||||
from gerber.utils import inch, metric, write_gerber_value, parse_gerber_value
|
||||
from gerberex.utility import rotate
|
||||
|
||||
def loads(data, filename=None, settings=None, tools=None, format=None):
|
||||
if not settings:
|
||||
settings = FileSettings(**detect_excellon_format(data))
|
||||
if format:
|
||||
settings.format = format
|
||||
gerber.excellon.CoordinateStmt = CoordinateStmtEx
|
||||
gerber.excellon.UnitStmt = UnitStmtEx
|
||||
file = ExcellonParser(settings, tools).parse_raw(data, filename)
|
||||
return ExcellonFileEx.from_file(file)
|
||||
|
||||
def write_excellon_header(file, settings, tools):
|
||||
file.write('M48\nFMAT,2\nICI,OFF\n%s\n' %
|
||||
UnitStmtEx(settings.units, settings.zeros, settings.format).to_excellon(settings))
|
||||
for tool in tools:
|
||||
file.write(tool.to_excellon(settings) + '\n')
|
||||
file.write('%%\nG90\n%s\n' % ('M72' if settings.units == 'inch' else 'M71'))
|
||||
|
||||
class ExcellonFileEx(ExcellonFile):
|
||||
@classmethod
|
||||
def from_file(cls, file):
|
||||
def correct_statements():
|
||||
for stmt in file.statements:
|
||||
if isinstance(stmt, UnknownStmt):
|
||||
line = stmt.stmt.strip()
|
||||
if line[:3] == 'G02':
|
||||
yield CircularCWModeStmt()
|
||||
if len(line) > 3:
|
||||
yield CoordinateStmtEx.from_excellon(line[3:], file.settings)
|
||||
elif line[:3] == 'G03':
|
||||
yield CircularCCWModeStmt()
|
||||
if len(line) > 3:
|
||||
yield CoordinateStmtEx.from_excellon(line[3:], file.settings)
|
||||
elif line[0] == 'X' or line[0] == 'Y' or line[0] == 'A' or line[0] == 'I':
|
||||
yield CoordinateStmtEx.from_excellon(line, file.settings)
|
||||
else:
|
||||
yield stmt
|
||||
else:
|
||||
yield stmt
|
||||
|
||||
def generate_hits(statements):
|
||||
class CoordinateCtx:
|
||||
def __init__(self, notation):
|
||||
self.notation = notation
|
||||
self.x = 0.
|
||||
self.y = 0.
|
||||
self.radius = None
|
||||
self.center_offset = None
|
||||
|
||||
def update(self, x=None, y=None, radius=None, center_offset=None):
|
||||
if self.notation == 'absolute':
|
||||
if x is not None:
|
||||
self.x = x
|
||||
if y is not None:
|
||||
self.y = y
|
||||
else:
|
||||
if x is not None:
|
||||
self.x += x
|
||||
if y is not None:
|
||||
self.y += y
|
||||
if radius is not None:
|
||||
self.radius = radius
|
||||
if center_offset is not None:
|
||||
self.center_offset = center_offset
|
||||
|
||||
def node(self, mode, center_offset):
|
||||
radius, offset = None, None
|
||||
if mode == DrillRout.MODE_CIRCULER_CW or mode == DrillRout.MODE_CIRCULER_CCW:
|
||||
if center_offset is None:
|
||||
radius = self.radius
|
||||
offset = self.center_offset
|
||||
else:
|
||||
radius = None
|
||||
offset = center_offset
|
||||
return DrillRout.Node(mode, self.x, self.y, radius, offset)
|
||||
|
||||
STAT_DRILL = 0
|
||||
STAT_ROUT_UP = 1
|
||||
STAT_ROUT_DOWN = 2
|
||||
|
||||
status = STAT_DRILL
|
||||
current_tool = None
|
||||
rout_mode = None
|
||||
coordinate_ctx = CoordinateCtx(file.notation)
|
||||
rout_nodes = []
|
||||
|
||||
last_position = (0., 0.)
|
||||
last_radius = None
|
||||
last_center_offset = None
|
||||
|
||||
def make_rout(status, nodes):
|
||||
if status != STAT_ROUT_DOWN or len(nodes) == 0 or current_tool is None:
|
||||
return None
|
||||
return DrillRout(current_tool, nodes)
|
||||
|
||||
for stmt in statements:
|
||||
if isinstance(stmt, ToolSelectionStmt):
|
||||
current_tool = file.tools[stmt.tool]
|
||||
elif isinstance(stmt, DrillModeStmt):
|
||||
rout = make_rout(status, rout_nodes)
|
||||
rout_nodes = []
|
||||
if rout is not None:
|
||||
yield rout
|
||||
status = STAT_DRILL
|
||||
rout_mode = None
|
||||
elif isinstance(stmt, RouteModeStmt):
|
||||
if status == STAT_DRILL:
|
||||
status = STAT_ROUT_UP
|
||||
rout_mode = DrillRout.MODE_ROUT
|
||||
else:
|
||||
rout_mode = DrillRout.MODE_LINEAR
|
||||
|
||||
elif isinstance(stmt, LinearModeStmt):
|
||||
rout_mode = DrillRout.MODE_LINEAR
|
||||
elif isinstance(stmt, CircularCWModeStmt):
|
||||
rout_mode = DrillRout.MODE_CIRCULER_CW
|
||||
elif isinstance(stmt, CircularCCWModeStmt):
|
||||
rout_mode = DrillRout.MODE_CIRCULER_CCW
|
||||
elif isinstance(stmt, ZAxisRoutPositionStmt) and status == STAT_ROUT_UP:
|
||||
status = STAT_ROUT_DOWN
|
||||
elif isinstance(stmt, RetractWithClampingStmt) or isinstance(stmt, RetractWithoutClampingStmt):
|
||||
rout = make_rout(status, rout_nodes)
|
||||
rout_nodes = []
|
||||
if rout is not None:
|
||||
yield rout
|
||||
status = STAT_ROUT_UP
|
||||
elif isinstance(stmt, SlotStmt):
|
||||
coordinate_ctx.update(stmt.x_start, stmt.y_start)
|
||||
x_start = coordinate_ctx.x
|
||||
y_start = coordinate_ctx.y
|
||||
coordinate_ctx.update(stmt.x_end, stmt.y_end)
|
||||
x_end = coordinate_ctx.x
|
||||
y_end = coordinate_ctx.y
|
||||
yield DrillSlotEx(current_tool, (x_start, y_start),
|
||||
(x_end, y_end), DrillSlotEx.TYPE_G85)
|
||||
elif isinstance(stmt, CoordinateStmtEx):
|
||||
center_offset = (stmt.i, stmt.j) \
|
||||
if stmt.i is not None and stmt.j is not None else None
|
||||
coordinate_ctx.update(stmt.x, stmt.y, stmt.radius, center_offset)
|
||||
if stmt.x is not None or stmt.y is not None:
|
||||
if status == STAT_DRILL:
|
||||
yield DrillHitEx(current_tool, (coordinate_ctx.x, coordinate_ctx.y))
|
||||
elif status == STAT_ROUT_UP:
|
||||
rout_nodes = [coordinate_ctx.node(DrillRout.MODE_ROUT, None)]
|
||||
elif status == STAT_ROUT_DOWN:
|
||||
rout_nodes.append(coordinate_ctx.node(rout_mode, center_offset))
|
||||
|
||||
statements = [s for s in correct_statements()]
|
||||
hits = [h for h in generate_hits(statements)]
|
||||
return cls(statements, file.tools, hits, file.settings, file.filename)
|
||||
|
||||
@property
|
||||
def primitives(self):
|
||||
return []
|
||||
|
||||
def __init__(self, statements, tools, hits, settings, filename=None):
|
||||
super(ExcellonFileEx, self).__init__(statements, tools, hits, settings, filename)
|
||||
|
||||
def rotate(self, angle, center=(0,0)):
|
||||
if angle % 360 == 0:
|
||||
return
|
||||
for hit in self.hits:
|
||||
hit.rotate(angle, center)
|
||||
|
||||
def to_inch(self):
|
||||
if self.units == 'metric':
|
||||
for stmt in self.statements:
|
||||
stmt.to_inch()
|
||||
for tool in self.tools:
|
||||
self.tools[tool].to_inch()
|
||||
for hit in self.hits:
|
||||
hit.to_inch()
|
||||
self.units = 'inch'
|
||||
|
||||
def to_metric(self):
|
||||
if self.units == 'inch':
|
||||
for stmt in self.statements:
|
||||
stmt.to_metric()
|
||||
for tool in self.tools:
|
||||
self.tools[tool].to_metric()
|
||||
for hit in self.hits:
|
||||
hit.to_metric()
|
||||
self.units = 'metric'
|
||||
|
||||
def write(self, filename=None):
|
||||
self.notation = 'absolute'
|
||||
self.zeros = 'trailing'
|
||||
filename = filename if filename is not None else self.filename
|
||||
with open(filename, 'w') as f:
|
||||
write_excellon_header(f, self.settings, [self.tools[t] for t in self.tools])
|
||||
for tool in iter(self.tools.values()):
|
||||
f.write(ToolSelectionStmt(
|
||||
tool.number).to_excellon(self.settings) + '\n')
|
||||
for hit in self.hits:
|
||||
if hit.tool.number == tool.number:
|
||||
f.write(hit.to_excellon(self.settings) + '\n')
|
||||
f.write(EndOfProgramStmt().to_excellon() + '\n')
|
||||
|
||||
class DrillHitEx(DrillHit):
|
||||
def to_inch(self):
|
||||
self.position = tuple(map(inch, self.position))
|
||||
|
||||
def to_metric(self):
|
||||
self.position = tuple(map(metric, self.position))
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
self.position = rotate(*self.position, angle, center)
|
||||
|
||||
def to_excellon(self, settings):
|
||||
return CoordinateStmtEx(*self.position).to_excellon(settings)
|
||||
|
||||
class DrillSlotEx(DrillSlot):
|
||||
def to_inch(self):
|
||||
self.start = tuple(map(inch, self.start))
|
||||
self.end = tuple(map(inch, self.end))
|
||||
|
||||
def to_metric(self):
|
||||
self.start = tuple(map(metric, self.start))
|
||||
self.end = tuple(map(metric, self.end))
|
||||
|
||||
def rotate(self, angle, center=(0,0)):
|
||||
self.start = rotate(*self.start, angle, center)
|
||||
self.end = rotate(*self.end, angle, center)
|
||||
|
||||
def to_excellon(self, settings):
|
||||
return SlotStmt(*self.start, *self.end).to_excellon(settings)
|
||||
|
||||
class DrillRout(object):
|
||||
MODE_ROUT = 'G00'
|
||||
MODE_LINEAR = 'G01'
|
||||
MODE_CIRCULER_CW = 'G02'
|
||||
MODE_CIRCULER_CCW = 'G03'
|
||||
|
||||
class Node(object):
|
||||
def __init__(self, mode, x, y, radius=None, center_offset=None):
|
||||
self.mode = mode
|
||||
self.position = (x, y)
|
||||
self.radius = radius
|
||||
self.center_offset = center_offset
|
||||
|
||||
def to_excellon(self, settings):
|
||||
center_offset = self.center_offset \
|
||||
if self.center_offset is not None else (None, None)
|
||||
return self.mode + CoordinateStmtEx(
|
||||
*self.position, self.radius, *center_offset).to_excellon(settings)
|
||||
|
||||
def __init__(self, tool, nodes):
|
||||
self.tool = tool
|
||||
self.nodes = nodes
|
||||
self.nodes[0].mode = self.MODE_ROUT
|
||||
|
||||
def to_excellon(self, settings):
|
||||
excellon = self.nodes[0].to_excellon(settings) + '\nM15\n'
|
||||
for node in self.nodes[1:]:
|
||||
excellon += node.to_excellon(settings) + '\n'
|
||||
excellon += 'M16\nG05'
|
||||
return excellon
|
||||
|
||||
def to_inch(self):
|
||||
for node in self.nodes:
|
||||
node.position = tuple(map(inch, node.position))
|
||||
node.radius = inch(
|
||||
node.radius) if node.radius is not None else None
|
||||
if node.center_offset is not None:
|
||||
node.center_offset = tuple(map(inch, node.center_offset))
|
||||
|
||||
def to_metric(self):
|
||||
for node in self.nodes:
|
||||
node.position = tuple(map(metric, node.position))
|
||||
node.radius = metric(
|
||||
node.radius) if node.radius is not None else None
|
||||
if node.center_offset is not None:
|
||||
node.center_offset = tuple(map(metric, node.center_offset))
|
||||
|
||||
def offset(self, x_offset=0, y_offset=0):
|
||||
for node in self.nodes:
|
||||
node.position = tuple(map(operator.add, node.position, (x_offset, y_offset)))
|
||||
|
||||
def rotate(self, angle, center=(0, 0)):
|
||||
for node in self.nodes:
|
||||
node.position = rotate(*node.position, angle, center)
|
||||
if node.center_offset is not None:
|
||||
node.center_offset = rotate(*node.center_offset, angle, (0., 0.))
|
||||
|
||||
class UnitStmtEx(UnitStmt):
|
||||
@classmethod
|
||||
def from_statement(cls, stmt):
|
||||
return cls(units=stmt.units, zeros=stmt.zeros, format=stmt.format, id=stmt.id)
|
||||
|
||||
def __init__(self, units='inch', zeros='leading', format=None, **kwargs):
|
||||
super(UnitStmtEx, self).__init__(units, zeros, format, **kwargs)
|
||||
|
||||
def to_excellon(self, settings=None):
|
||||
format = settings.format if settings else self.format
|
||||
stmt = None
|
||||
if self.units == 'inch' and format == (2, 4):
|
||||
stmt = 'INCH,%s' % ('LZ' if self.zeros == 'leading' else 'TZ')
|
||||
else:
|
||||
stmt = '%s,%s,%s.%s' % ('INCH' if self.units == 'inch' else 'METRIC',
|
||||
'LZ' if self.zeros == 'leading' else 'TZ',
|
||||
'0' * format[0], '0' * format[1])
|
||||
return stmt
|
||||
|
||||
class CircularCWModeStmt(ExcellonStatement):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super(CircularCWModeStmt, self).__init__(**kwargs)
|
||||
|
||||
def to_excellon(self, settings=None):
|
||||
return 'G02'
|
||||
|
||||
class CircularCCWModeStmt(ExcellonStatement):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super(CircularCCWModeStmt, self).__init__(**kwargs)
|
||||
|
||||
def to_excellon(self, settings=None):
|
||||
return 'G02'
|
||||
|
||||
class CoordinateStmtEx(CoordinateStmt):
|
||||
@classmethod
|
||||
def from_statement(cls, stmt):
|
||||
newStmt = cls(x=stmt.x, y=stmt.y)
|
||||
newStmt.radius = stmt.radius if isinstance(stmt, CoordinateStmtEx) else None
|
||||
return newStmt
|
||||
|
||||
@classmethod
|
||||
def from_excellon(cls, line, settings, **kwargs):
|
||||
stmt = None
|
||||
if 'A' in line:
|
||||
parts = line.split('A')
|
||||
stmt = cls.from_statement(CoordinateStmt.from_excellon(parts[0], settings)) \
|
||||
if parts[0] != '' else cls()
|
||||
stmt.radius = parse_gerber_value(
|
||||
parts[1], settings.format, settings.zero_suppression)
|
||||
elif 'I' in line:
|
||||
jparts = line.split('J')
|
||||
iparts = jparts[0].split('I')
|
||||
stmt = cls.from_statement(CoordinateStmt.from_excellon(iparts[0], settings)) \
|
||||
if iparts[0] != '' else cls()
|
||||
stmt.i = parse_gerber_value(
|
||||
iparts[1], settings.format, settings.zero_suppression)
|
||||
stmt.j = parse_gerber_value(
|
||||
jparts[1], settings.format, settings.zero_suppression)
|
||||
else:
|
||||
stmt = cls.from_statement(CoordinateStmt.from_excellon(line, settings))
|
||||
|
||||
return stmt
|
||||
|
||||
def __init__(self, x=None, y=None, radius=None, i=None, j=None, **kwargs):
|
||||
super(CoordinateStmtEx, self).__init__(x, y, **kwargs)
|
||||
self.radius = radius
|
||||
self.i = i
|
||||
self.j = j
|
||||
|
||||
def to_excellon(self, settings):
|
||||
stmt = ''
|
||||
if self.x is not None:
|
||||
stmt += 'X%s' % write_gerber_value(self.x, settings.format,
|
||||
settings.zero_suppression)
|
||||
if self.y is not None:
|
||||
stmt += 'Y%s' % write_gerber_value(self.y, settings.format,
|
||||
settings.zero_suppression)
|
||||
if self.radius is not None:
|
||||
stmt += 'A%s' % write_gerber_value(self.radius, settings.format,
|
||||
settings.zero_suppression)
|
||||
elif self.i is not None and self.j is not None:
|
||||
stmt += 'I%sJ%s' % (write_gerber_value(self.i, settings.format,
|
||||
settings.zero_suppression),
|
||||
write_gerber_value(self.j, settings.format,
|
||||
settings.zero_suppression))
|
||||
return stmt
|
||||
|
||||
def __str__(self):
|
||||
coord_str = ''
|
||||
if self.x is not None:
|
||||
coord_str += 'X: %g ' % self.x
|
||||
if self.y is not None:
|
||||
coord_str += 'Y: %g ' % self.y
|
||||
if self.radius is not None:
|
||||
coord_str += 'A: %g ' % self.radius
|
||||
if self.i is not None:
|
||||
coord_str += 'I: %g ' % self.i
|
||||
if self.j is not None:
|
||||
coord_str += 'J: %g ' % self.j
|
||||
|
||||
return '<Coordinate Statement: %s>' % (coord_str)
|
||||
115
gerberex/gerber_statements.py
Normal file
115
gerberex/gerber_statements.py
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
from gerber.gerber_statements import AMParamStmt, ADParamStmt
|
||||
from gerber.utils import inch, metric
|
||||
from gerberex.am_primitive import to_primitive_defs
|
||||
|
||||
class AMParamStmtEx(AMParamStmt):
|
||||
@classmethod
|
||||
def from_stmt(cls, stmt):
|
||||
return cls(stmt.param, stmt.name, stmt.macro, stmt.units)
|
||||
|
||||
@classmethod
|
||||
def circle(cls, name, units):
|
||||
return cls('AM', name, '1,1,$1,0,0,0*1,0,$2,0,0,0', units)
|
||||
|
||||
@classmethod
|
||||
def rectangle(cls, name, units):
|
||||
return cls('AM', name, '21,1,$1,$2,0,0,0*1,0,$3,0,0,0', units)
|
||||
|
||||
@classmethod
|
||||
def landscape_obround(cls, name, units):
|
||||
return cls(
|
||||
'AM', name,
|
||||
'$4=$1-$2*'
|
||||
'$5=$1-$4*'
|
||||
'21,1,$5,$2,0,0,0*'
|
||||
'1,1,$4,$4/2,0,0*'
|
||||
'1,1,$4,-$4/2,0,0*'
|
||||
'1,0,$3,0,0,0', units)
|
||||
|
||||
@classmethod
|
||||
def portrate_obround(cls, name, units):
|
||||
return cls(
|
||||
'AM', name,
|
||||
'$4=$2-$1*'
|
||||
'$5=$2-$4*'
|
||||
'21,1,$1,$5,0,0,0*'
|
||||
'1,1,$4,0,$4/2,0*'
|
||||
'1,1,$4,0,-$4/2,0*'
|
||||
'1,0,$3,0,0,0', units)
|
||||
|
||||
@classmethod
|
||||
def polygon(cls, name, units):
|
||||
return cls('AM', name, '5,1,$2,0,0,$1,$3*1,0,$4,0,0,0', units)
|
||||
|
||||
def __init__(self, param, name, macro, units):
|
||||
super(AMParamStmtEx, self).__init__(param, name, macro)
|
||||
self.units = units
|
||||
self.primitive_defs = list(to_primitive_defs(self.instructions))
|
||||
|
||||
def to_inch(self):
|
||||
if self.units == 'metric':
|
||||
self.units = 'inch'
|
||||
for p in self.primitive_defs:
|
||||
p.to_inch()
|
||||
|
||||
def to_metric(self):
|
||||
if self.units == 'inch':
|
||||
self.units = 'metric'
|
||||
for p in self.primitive_defs:
|
||||
p.to_metric()
|
||||
|
||||
def to_gerber(self, settings = None):
|
||||
def plist():
|
||||
for p in self.primitive_defs:
|
||||
yield p.to_gerber(settings)
|
||||
return "%%AM%s*\n%s%%" % (self.name, '\n'.join(plist()))
|
||||
|
||||
def rotate(self, angle, center=None):
|
||||
for primitive_def in self.primitive_defs:
|
||||
primitive_def.rotate(angle, center)
|
||||
|
||||
class ADParamStmtEx(ADParamStmt):
|
||||
GEOMETRIES = {
|
||||
'C': [0,1],
|
||||
'R': [0,1,2],
|
||||
'O': [0,1,2],
|
||||
'P': [0,3],
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_stmt(cls, stmt):
|
||||
modstr = ','.join([
|
||||
'X'.join(['{0}'.format(x) for x in modifier])
|
||||
for modifier in stmt.modifiers])
|
||||
return cls(stmt.param, stmt.d, stmt.shape, modstr, stmt.units)
|
||||
|
||||
def __init__(self, param, d, shape, modifiers, units):
|
||||
super(ADParamStmtEx, self).__init__(param, d, shape, modifiers)
|
||||
self.units = units
|
||||
|
||||
def to_inch(self):
|
||||
if self.units == 'inch':
|
||||
return
|
||||
self.units = 'inch'
|
||||
if self.shape in self.GEOMETRIES:
|
||||
indices = self.GEOMETRIES[self.shape]
|
||||
self.modifiers = [tuple([
|
||||
inch(self.modifiers[0][i]) if i in indices else self.modifiers[0][i] \
|
||||
for i in range(len(self.modifiers[0]))
|
||||
])]
|
||||
|
||||
def to_metric(self):
|
||||
if self.units == 'metric':
|
||||
return
|
||||
self.units = 'metric'
|
||||
if self.shape in self.GEOMETRIES:
|
||||
indices = self.GEOMETRIES[self.shape]
|
||||
self.modifiers = [tuple([
|
||||
metric(self.modifiers[0][i]) if i in indices else self.modifiers[0][i] \
|
||||
for i in range(len(self.modifiers[0]))
|
||||
])]
|
||||
331
gerberex/rs274x.py
Normal file
331
gerberex/rs274x.py
Normal file
|
|
@ -0,0 +1,331 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
from gerber.cam import FileSettings
|
||||
import gerber.rs274x
|
||||
from gerber.gerber_statements import *
|
||||
from gerberex.gerber_statements import AMParamStmt, AMParamStmtEx, ADParamStmtEx
|
||||
from gerberex.utility import rotate
|
||||
import re
|
||||
|
||||
def loads(data, filename=None):
|
||||
cls = gerber.rs274x.GerberParser
|
||||
cls.SF = \
|
||||
r"(?P<param>SF)(A(?P<a>{decimal}))?(B(?P<b>{decimal}))?".format(decimal=cls.DECIMAL)
|
||||
cls.PARAMS = (cls.FS, cls.MO, cls.LP, cls.AD_CIRCLE,
|
||||
cls.AD_RECT, cls.AD_OBROUND, cls.AD_POLY,
|
||||
cls.AD_MACRO, cls.AM, cls.AS, cls.IF, cls.IN,
|
||||
cls.IP, cls.IR, cls.MI, cls.OF, cls.SF, cls.LN)
|
||||
cls.PARAM_STMT = [re.compile(r"%?{0}\*%?".format(p)) for p in cls.PARAMS]
|
||||
return cls().parse_raw(data, filename)
|
||||
|
||||
def write_gerber_header(file, settings):
|
||||
file.write('%s\n%s\n%%IPPOS*%%\n' % (
|
||||
MOParamStmt('MO', settings.units).to_gerber(settings),
|
||||
FSParamStmt('FS', settings.zero_suppression,
|
||||
settings.notation, settings.format).to_gerber(settings)))
|
||||
|
||||
class GerberFile(gerber.rs274x.GerberFile):
|
||||
@classmethod
|
||||
def from_gerber_file(cls, gerber_file):
|
||||
if not isinstance(gerber_file, gerber.rs274x.GerberFile):
|
||||
raise Exception('only gerber.rs274x.GerberFile object is specified')
|
||||
|
||||
return cls(gerber_file.statements, gerber_file.settings, gerber_file.primitives,\
|
||||
gerber_file.apertures, gerber_file.filename)
|
||||
|
||||
def __init__(self, statements, settings, primitives, apertures, filename=None):
|
||||
super(GerberFile, self).__init__(statements, settings, primitives, apertures, filename)
|
||||
self.context = GerberContext.from_settings(self.settings)
|
||||
self.aperture_macros = {}
|
||||
self.aperture_defs = []
|
||||
self.main_statements = []
|
||||
for stmt in self.statements:
|
||||
type, stmts = self.context.normalize_statement(stmt)
|
||||
if type == self.context.TYPE_AM:
|
||||
for mdef in stmts:
|
||||
self.aperture_macros[mdef.name] = mdef
|
||||
elif type == self.context.TYPE_AD:
|
||||
self.aperture_defs.extend(stmts)
|
||||
elif type == self.context.TYPE_MAIN:
|
||||
self.main_statements.extend(stmts)
|
||||
if self.context.angle != 0:
|
||||
self.rotate(self.context.angle)
|
||||
if self.context.is_negative:
|
||||
self.nagate_polarity()
|
||||
self.context.notation = 'absolute'
|
||||
self.context.zeros = 'trailing'
|
||||
|
||||
def write(self, filename=None):
|
||||
self.context.notation = 'absolute'
|
||||
self.context.zeros = 'trailing'
|
||||
self.context.format = self.format
|
||||
self.units = self.units
|
||||
filename=filename if filename is not None else self.filename
|
||||
with open(filename, 'w') as f:
|
||||
write_gerber_header(f, self.context)
|
||||
for macro in self.aperture_macros:
|
||||
f.write(self.aperture_macros[macro].to_gerber(self.context) + '\n')
|
||||
for aperture in self.aperture_defs:
|
||||
f.write(aperture.to_gerber(self.context) + '\n')
|
||||
for statement in self.main_statements:
|
||||
f.write(statement.to_gerber(self.context) + '\n')
|
||||
f.write('M02*\n')
|
||||
|
||||
def to_inch(self):
|
||||
if self.units == 'metric':
|
||||
for macro in self.aperture_macros:
|
||||
self.aperture_macros[macro].to_inch()
|
||||
for aperture in self.aperture_defs:
|
||||
aperture.to_inch()
|
||||
for statement in self.statements:
|
||||
statement.to_inch()
|
||||
self.units = 'inch'
|
||||
self.context.units = 'inch'
|
||||
|
||||
def to_metric(self):
|
||||
if self.units == 'inch':
|
||||
for macro in self.aperture_macros:
|
||||
self.aperture_macros[macro].to_metric()
|
||||
for aperture in self.aperture_defs:
|
||||
aperture.to_metric()
|
||||
for statement in self.statements:
|
||||
statement.to_metric()
|
||||
self.units='metric'
|
||||
self.context.units='metric'
|
||||
|
||||
def offset(self, x_offset=0, y_offset=0):
|
||||
for statement in self.main_statements:
|
||||
if isinstance(statement, CoordStmt):
|
||||
if statement.x is not None:
|
||||
statement.x += x_offset
|
||||
if statement.y is not None:
|
||||
statement.y += y_offset
|
||||
for primitive in self.primitives:
|
||||
primitive.offset(x_offset, y_offset)
|
||||
|
||||
def rotate(self, angle, center=(0,0)):
|
||||
if angle % 360 == 0:
|
||||
return
|
||||
self._generalize_aperture()
|
||||
last_x = 0
|
||||
last_y = 0
|
||||
last_rx = 0
|
||||
last_ry = 0
|
||||
for name in self.aperture_macros:
|
||||
self.aperture_macros[name].rotate(angle, center)
|
||||
for statement in self.main_statements:
|
||||
if isinstance(statement, CoordStmt) and statement.x != None and statement.y != None:
|
||||
if statement.i != None and statement.j != None:
|
||||
cx = last_x + statement.i
|
||||
cy = last_y + statement.j
|
||||
cx, cy = rotate(cx, cy, angle, center)
|
||||
statement.i = cx - last_rx
|
||||
statement.j = cy - last_ry
|
||||
last_x = statement.x
|
||||
last_y = statement.y
|
||||
last_rx, last_ry = rotate(statement.x, statement.y, angle, center)
|
||||
statement.x = last_rx
|
||||
statement.y = last_ry
|
||||
|
||||
def nagate_polarity(self):
|
||||
for statement in self.main_statements:
|
||||
if isinstance(statement, LPParamStmt):
|
||||
statement.lp = 'dark' if statement.lp == 'clear' else 'clear'
|
||||
|
||||
def _generalize_aperture(self):
|
||||
RECTANGLE = 0
|
||||
LANDSCAPE_OBROUND = 1
|
||||
PORTRATE_OBROUND = 2
|
||||
POLYGON = 3
|
||||
macro_defs = [
|
||||
('MACR', AMParamStmtEx.rectangle),
|
||||
('MACLO', AMParamStmtEx.landscape_obround),
|
||||
('MACPO', AMParamStmtEx.portrate_obround),
|
||||
('MACP', AMParamStmtEx.polygon)
|
||||
]
|
||||
|
||||
need_to_change = False
|
||||
for statement in self.aperture_defs:
|
||||
if isinstance(statement, ADParamStmt) and statement.shape in ['R', 'O', 'P']:
|
||||
need_to_change = True
|
||||
|
||||
if need_to_change:
|
||||
for idx in range(0, len(macro_defs)):
|
||||
macro_def = macro_defs[idx]
|
||||
name = macro_def[0]
|
||||
num = 1
|
||||
while name in self.aperture_macros:
|
||||
name = '%s_%d' % (macro_def[0], num)
|
||||
num += 1
|
||||
self.aperture_macros[name] = macro_def[1](name, self.units)
|
||||
macro_defs[idx] = (name, macro_def[1])
|
||||
for statement in self.aperture_defs:
|
||||
if isinstance(statement, ADParamStmt):
|
||||
if statement.shape == 'R':
|
||||
statement.shape = macro_defs[RECTANGLE][0]
|
||||
elif statement.shape == 'O':
|
||||
x = statement.modifiers[0][0] \
|
||||
if len(statement.modifiers[0]) > 0 else 0
|
||||
y = statement.modifiers[0][1] \
|
||||
if len(statement.modifiers[0]) > 1 else 0
|
||||
statement.shape = macro_defs[LANDSCAPE_OBROUND][0] \
|
||||
if x > y else macro_defs[PORTRATE_OBROUND][0]
|
||||
elif statement.shape == 'P':
|
||||
statement.shape = macro_defs[POLYGON][0]
|
||||
|
||||
class GerberContext(FileSettings):
|
||||
TYPE_NONE = 'none'
|
||||
TYPE_AM = 'am'
|
||||
TYPE_AD = 'ad'
|
||||
TYPE_MAIN = 'main'
|
||||
IP_LINEAR = 'lenear'
|
||||
IP_ARC = 'arc'
|
||||
DIR_CLOCKWISE = 'cw'
|
||||
DIR_COUNTERCLOCKWISE = 'ccw'
|
||||
|
||||
ignored_stmt = ('FSParamStmt', 'MOParamStmt', 'ASParamStmt',
|
||||
'INParamStmt', 'IPParamStmt', 'IRParamStmt',
|
||||
'MIParamStmt', 'OFParamStmt', 'SFParamStmt',
|
||||
'LNParamStmt', 'CommentStmt', 'EofStmt',)
|
||||
|
||||
@classmethod
|
||||
def from_settings(cls, settings):
|
||||
return cls(settings.notation, settings.units, settings.zero_suppression,
|
||||
settings.format, settings.zeros, settings.angle_units)
|
||||
|
||||
def __init__(self, notation='absolute', units='inch',
|
||||
zero_suppression=None, format=(2, 5), zeros=None,
|
||||
angle_units='degrees',
|
||||
name=None,
|
||||
mirror=(False, False), offset=(0., 0.), scale=(1., 1.),
|
||||
angle=0., axis='xy'):
|
||||
super(GerberContext, self).__init__(notation, units, zero_suppression,
|
||||
format, zeros, angle_units)
|
||||
self.name = name
|
||||
self.mirror = mirror
|
||||
self.offset = offset
|
||||
self.scale = scale
|
||||
self.angle = angle
|
||||
self.axis = axis
|
||||
|
||||
self.matrix = (1, 0,
|
||||
1, 0,
|
||||
1, 1)
|
||||
|
||||
self.is_negative = False
|
||||
self.is_first_coordinate = True
|
||||
self.no_polarity = True
|
||||
self.in_single_quadrant_mode = False
|
||||
self.op = None
|
||||
self.interpolation = self.IP_LINEAR
|
||||
self.direction = self.DIR_CLOCKWISE
|
||||
self.x = 0.
|
||||
self.y = 0.
|
||||
|
||||
def normalize_statement(self, stmt):
|
||||
additional_stmts = None
|
||||
if isinstance(stmt, INParamStmt):
|
||||
self.name = stmt.name
|
||||
elif isinstance(stmt, MIParamStmt):
|
||||
self.mirror = (stmt.a, stmt.b)
|
||||
self._update_matrix()
|
||||
elif isinstance(stmt, OFParamStmt):
|
||||
self.offset = (stmt.a, stmt.b)
|
||||
self._update_matrix()
|
||||
elif isinstance(stmt, SFParamStmt):
|
||||
self.scale = (stmt.a, stmt.b)
|
||||
self._update_matrix()
|
||||
elif isinstance(stmt, ASParamStmt):
|
||||
self.axis = 'yx' if stmt.mode == 'AYBX' else 'xy'
|
||||
self._update_matrix()
|
||||
elif isinstance(stmt, IRParamStmt):
|
||||
self.angle = stmt.angle
|
||||
elif isinstance(stmt, AMParamStmt) and not isinstance(stmt, AMParamStmtEx):
|
||||
stmt = AMParamStmtEx.from_stmt(stmt)
|
||||
return (self.TYPE_AM, [stmt])
|
||||
elif isinstance(stmt, ADParamStmt) and not isinstance(stmt, AMParamStmtEx):
|
||||
stmt = ADParamStmtEx.from_stmt(stmt)
|
||||
return (self.TYPE_AD, [stmt])
|
||||
elif isinstance(stmt, QuadrantModeStmt):
|
||||
self.in_single_quadrant_mode = stmt.mode == 'single-quadrant'
|
||||
stmt.mode = 'multi-quadrant'
|
||||
elif isinstance(stmt, IPParamStmt):
|
||||
self.is_negative = stmt.ip == 'negative'
|
||||
elif isinstance(stmt, LPParamStmt):
|
||||
self.no_polarity = False
|
||||
elif isinstance(stmt, CoordStmt):
|
||||
self._normalize_coordinate(stmt)
|
||||
if self.is_first_coordinate:
|
||||
self.is_first_coordinate = False
|
||||
if self.no_polarity:
|
||||
additional_stmts = [LPParamStmt('LP', 'dark'), stmt]
|
||||
|
||||
if type(stmt).__name__ in self.ignored_stmt:
|
||||
return (self.TYPE_NONE, None)
|
||||
elif additional_stmts is not None:
|
||||
return (self.TYPE_MAIN, additional_stmts)
|
||||
else:
|
||||
return (self.TYPE_MAIN, [stmt])
|
||||
|
||||
def _update_matrix(self):
|
||||
if self.axis == 'xy':
|
||||
mx = -1 if self.mirror[0] else 1
|
||||
my = -1 if self.mirror[1] else 1
|
||||
self.matrix = (
|
||||
self.scale[0] * mx, self.offset[0],
|
||||
self.scale[1] * my, self.offset[1],
|
||||
self.scale[0] * mx, self.scale[1] * my)
|
||||
else:
|
||||
mx = -1 if self.mirror[1] else 1
|
||||
my = -1 if self.mirror[0] else 1
|
||||
self.matrix = (
|
||||
self.scale[1] * mx, self.offset[1],
|
||||
self.scale[0] * my, self.offset[0],
|
||||
self.scale[1] * mx, self.scale[0] * my)
|
||||
|
||||
def _normalize_coordinate(self, stmt):
|
||||
if stmt.function == 'G01' or stmt.function == 'G1':
|
||||
self.interpolation = self.IP_LINEAR
|
||||
elif stmt.function == 'G02' or stmt.function == 'G2':
|
||||
self.interpolation = self.IP_ARC
|
||||
self.direction = self.DIR_CLOCKWISE
|
||||
if self.mirror[0] != self.mirror[1]:
|
||||
stmt.function = 'G03'
|
||||
elif stmt.function == 'G03' or stmt.function == 'G3':
|
||||
self.interpolation = self.IP_ARC
|
||||
self.direction = self.DIR_COUNTERCLOCKWISE
|
||||
if self.mirror[0] != self.mirror[1]:
|
||||
stmt.function = 'G02'
|
||||
if stmt.only_function:
|
||||
return
|
||||
|
||||
last_x = self.x
|
||||
last_y = self.y
|
||||
if self.notation == 'absolute':
|
||||
x = stmt.x if stmt.x is not None else self.x
|
||||
y = stmt.y if stmt.y is not None else self.y
|
||||
else:
|
||||
x = self.x + stmt.x if stmt.x is not None else 0
|
||||
y = self.y + stmt.y if stmt.y is not None else 0
|
||||
self.x, self.y = x, y
|
||||
self.op = stmt.op if stmt.op is not None else self.op
|
||||
|
||||
stmt.op = self.op
|
||||
stmt.x = self.matrix[0] * x + self.matrix[1]
|
||||
stmt.y = self.matrix[2] * y + self.matrix[3]
|
||||
if stmt.op == 'D01' and self.interpolation == self.IP_ARC:
|
||||
qx, qy = 1, 1
|
||||
if self.in_single_quadrant_mode:
|
||||
if self.direction == self.DIR_CLOCKWISE:
|
||||
qx = 1 if y > last_y else -1
|
||||
qy = 1 if x < last_x else -1
|
||||
else:
|
||||
qx = 1 if y < last_y else -1
|
||||
qy = 1 if x > last_x else -1
|
||||
if last_x == x and last_y == y:
|
||||
qx, qy = 0, 0
|
||||
stmt.i = qx * self.matrix[4] * stmt.i if stmt.i is not None else 0
|
||||
stmt.j = qy * self.matrix[5] * stmt.j if stmt.j is not None else 0
|
||||
27
gerberex/utility.py
Normal file
27
gerberex/utility.py
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
from math import cos, sin, pi, sqrt
|
||||
|
||||
def rotate(x, y, angle, center):
|
||||
x0 = x - center[0]
|
||||
y0 = y - center[1]
|
||||
angle = angle * pi / 180.0
|
||||
return (cos(angle) * x0 - sin(angle) * y0 + center[0],
|
||||
sin(angle) * x0 + cos(angle) * y0 + center[1])
|
||||
|
||||
def is_equal_value(a, b, error_range=0):
|
||||
return (a - b) * (a - b) <= error_range * error_range
|
||||
|
||||
def is_equal_point(a, b, error_range=0):
|
||||
return is_equal_value(a[0], b[0], error_range) and \
|
||||
is_equal_value(a[1], b[1], error_range)
|
||||
|
||||
def normalize_vec2d(vec):
|
||||
length = sqrt(vec[0] * vec[0] + vec[1] * vec[1])
|
||||
return (vec[0] / length, vec[1] / length)
|
||||
|
||||
def dot_vec2d(vec1, vec2):
|
||||
return vec1[0] * vec2[0] + vec1[1] * vec2[1]
|
||||
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
41
tests/data/ref_drill_inch.txt
Normal file
41
tests/data/ref_drill_inch.txt
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
INCH,TZ
|
||||
T01C0.0236
|
||||
T02C0.0275
|
||||
T03C0.0314
|
||||
T04C0.0393
|
||||
%
|
||||
G90
|
||||
M72
|
||||
T01
|
||||
X1815Y960
|
||||
X1815Y1344
|
||||
X1421Y2402G85X827Y2402
|
||||
T02
|
||||
X1421Y1535
|
||||
X1421Y768
|
||||
X843Y768
|
||||
X807Y1535
|
||||
T03
|
||||
G00X1421Y1152
|
||||
M15
|
||||
G01X843Y1152
|
||||
M16
|
||||
G05
|
||||
X1417Y2795
|
||||
T04
|
||||
G00X236Y669
|
||||
M15
|
||||
G02X630Y276I0J-394
|
||||
G03X1024Y-118A394
|
||||
G03X1417Y276A394
|
||||
G01X2598Y276
|
||||
G01X2598Y1024
|
||||
G03X1614Y2008I-984J0
|
||||
G01X236Y2008
|
||||
G01X236Y669
|
||||
M16
|
||||
G05
|
||||
M30
|
||||
47
tests/data/ref_drill_metric.txt
Normal file
47
tests/data/ref_drill_metric.txt
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T01C0.600
|
||||
T02C0.700
|
||||
T03C0.800
|
||||
T04C1.000
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T01
|
||||
X4610Y2438
|
||||
X4610Y3413
|
||||
X3610Y6100G85X2100Y6100
|
||||
T02
|
||||
X3610Y3900
|
||||
X3610Y1950
|
||||
X2140Y1950
|
||||
X2050Y3900
|
||||
T03
|
||||
G00X3610Y2925
|
||||
M15
|
||||
G01X2140Y2925
|
||||
M16
|
||||
G05
|
||||
X3600Y7100
|
||||
T04
|
||||
G00
|
||||
X600Y1700
|
||||
M15
|
||||
I0J-1000
|
||||
G02X1600Y700
|
||||
G03
|
||||
A1000
|
||||
I-2000J0
|
||||
X2600Y-300
|
||||
X3600Y700
|
||||
G01X6600
|
||||
Y2600
|
||||
G03X4100Y5100I-2500J0
|
||||
G01
|
||||
X600
|
||||
Y1700
|
||||
M16
|
||||
G05
|
||||
M30
|
||||
7500
tests/data/ref_dxf_complex.dxf
Normal file
7500
tests/data/ref_dxf_complex.dxf
Normal file
File diff suppressed because it is too large
Load diff
654
tests/data/ref_dxf_metric.dxf
Normal file
654
tests/data/ref_dxf_metric.dxf
Normal file
|
|
@ -0,0 +1,654 @@
|
|||
0
|
||||
SECTION
|
||||
2
|
||||
HEADER
|
||||
9
|
||||
$INSUNITS
|
||||
70
|
||||
4
|
||||
9
|
||||
$ACADVER
|
||||
1
|
||||
AC1014
|
||||
9
|
||||
$HANDSEED
|
||||
5
|
||||
FFFF
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
TABLES
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
VPORT
|
||||
5
|
||||
8
|
||||
100
|
||||
AcDbSymbolTable
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
LTYPE
|
||||
5
|
||||
5
|
||||
100
|
||||
AcDbSymbolTable
|
||||
0
|
||||
LTYPE
|
||||
5
|
||||
14
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbLinetypeTableRecord
|
||||
2
|
||||
BYBLOCK
|
||||
70
|
||||
0
|
||||
0
|
||||
LTYPE
|
||||
5
|
||||
15
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbLinetypeTableRecord
|
||||
2
|
||||
BYLAYER
|
||||
70
|
||||
0
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
LAYER
|
||||
5
|
||||
2
|
||||
100
|
||||
AcDbSymbolTable
|
||||
70
|
||||
2
|
||||
0
|
||||
LAYER
|
||||
5
|
||||
50
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbLayerTableRecord
|
||||
2
|
||||
0
|
||||
70
|
||||
0
|
||||
6
|
||||
CONTINUOUS
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
STYLE
|
||||
5
|
||||
3
|
||||
100
|
||||
AcDbSymbolTable
|
||||
70
|
||||
1
|
||||
0
|
||||
STYLE
|
||||
5
|
||||
11
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbTextStyleTableRecord
|
||||
2
|
||||
STANDARD
|
||||
70
|
||||
0
|
||||
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
|
||||
2
|
||||
0
|
||||
APPID
|
||||
5
|
||||
12
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbRegAppTableRecord
|
||||
2
|
||||
ACAD
|
||||
70
|
||||
0
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
TABLE
|
||||
2
|
||||
DIMSTYLE
|
||||
5
|
||||
A
|
||||
100
|
||||
AcDbSymbolTable
|
||||
70
|
||||
1
|
||||
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
|
||||
0
|
||||
BLOCK_RECORD
|
||||
5
|
||||
1B
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
AcDbBlockTableRecord
|
||||
2
|
||||
*PAPER_SPACE
|
||||
0
|
||||
ENDTAB
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
BLOCKS
|
||||
0
|
||||
BLOCK
|
||||
5
|
||||
20
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockBegin
|
||||
2
|
||||
*MODEL_SPACE
|
||||
0
|
||||
ENDBLK
|
||||
5
|
||||
21
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockEnd
|
||||
0
|
||||
BLOCK
|
||||
5
|
||||
1C
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockBegin
|
||||
2
|
||||
*PAPER_SPACE
|
||||
0
|
||||
ENDBLK
|
||||
5
|
||||
1D
|
||||
100
|
||||
AcDbEntity
|
||||
100
|
||||
AcDbBlockEnd
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
ENTITIES
|
||||
0
|
||||
LWPOLYLINE
|
||||
5
|
||||
100
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbPolyline
|
||||
90
|
||||
8
|
||||
70
|
||||
1
|
||||
43
|
||||
0.0
|
||||
10
|
||||
40
|
||||
20
|
||||
0
|
||||
10
|
||||
9.9999999999999982
|
||||
20
|
||||
1.1102230246251565e-15
|
||||
42
|
||||
-0.41421356237309565
|
||||
10
|
||||
1.1102230246251565e-15
|
||||
20
|
||||
10
|
||||
10
|
||||
1.1102230246251565e-15
|
||||
20
|
||||
40
|
||||
42
|
||||
-0.41421356237309553
|
||||
10
|
||||
10
|
||||
20
|
||||
50
|
||||
10
|
||||
40
|
||||
20
|
||||
50
|
||||
42
|
||||
-0.41421356237309603
|
||||
10
|
||||
50
|
||||
20
|
||||
40
|
||||
10
|
||||
50
|
||||
20
|
||||
9.9999999999999982
|
||||
42
|
||||
-0.41421356237309548
|
||||
0
|
||||
LWPOLYLINE
|
||||
5
|
||||
101
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbPolyline
|
||||
90
|
||||
8
|
||||
70
|
||||
1
|
||||
43
|
||||
0.0
|
||||
10
|
||||
74.270404858697972
|
||||
20
|
||||
75.039392445007664
|
||||
10
|
||||
74.270404858697972
|
||||
20
|
||||
45.039392445007664
|
||||
42
|
||||
-0.41421356237309553
|
||||
10
|
||||
64.270404858697972
|
||||
20
|
||||
35.039392445007664
|
||||
10
|
||||
34.270404858697965
|
||||
20
|
||||
35.039392445007664
|
||||
42
|
||||
-0.41421356237309553
|
||||
10
|
||||
24.270404858697965
|
||||
20
|
||||
45.039392445007664
|
||||
10
|
||||
24.270404858697958
|
||||
20
|
||||
75.039392445007664
|
||||
42
|
||||
-0.41421356237309553
|
||||
10
|
||||
34.270404858697965
|
||||
20
|
||||
85.039392445007678
|
||||
10
|
||||
64.270404858697972
|
||||
20
|
||||
85.039392445007678
|
||||
42
|
||||
-0.41421356237309603
|
||||
0
|
||||
CIRCLE
|
||||
5
|
||||
102
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbCircle
|
||||
10
|
||||
80.154604804025013
|
||||
20
|
||||
12.631646043929035
|
||||
30
|
||||
0
|
||||
40
|
||||
12.546259950593821
|
||||
210
|
||||
0
|
||||
220
|
||||
0
|
||||
230
|
||||
1
|
||||
0
|
||||
CIRCLE
|
||||
5
|
||||
103
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbCircle
|
||||
10
|
||||
50
|
||||
20
|
||||
65
|
||||
30
|
||||
0
|
||||
40
|
||||
10.277260744660863
|
||||
210
|
||||
0
|
||||
220
|
||||
0
|
||||
230
|
||||
1
|
||||
0
|
||||
ARC
|
||||
5
|
||||
104
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbCircle
|
||||
10
|
||||
50
|
||||
20
|
||||
65
|
||||
30
|
||||
0
|
||||
40
|
||||
6.4592498736207826
|
||||
210
|
||||
0
|
||||
220
|
||||
-0
|
||||
230
|
||||
1
|
||||
100
|
||||
AcDbArc
|
||||
50
|
||||
90
|
||||
51
|
||||
345.73898023603914
|
||||
0
|
||||
LINE
|
||||
5
|
||||
105
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
50
|
||||
20
|
||||
65
|
||||
30
|
||||
0
|
||||
11
|
||||
56.26019871530297
|
||||
21
|
||||
63.408830312383643
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
106
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
50
|
||||
20
|
||||
65
|
||||
30
|
||||
0
|
||||
11
|
||||
50
|
||||
21
|
||||
71.459249873620777
|
||||
31
|
||||
0
|
||||
0
|
||||
LWPOLYLINE
|
||||
5
|
||||
107
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbPolyline
|
||||
90
|
||||
4
|
||||
70
|
||||
1
|
||||
43
|
||||
0.0
|
||||
10
|
||||
38.203772564818578
|
||||
20
|
||||
42.206179116779516
|
||||
10
|
||||
13.451174232106741
|
||||
20
|
||||
42.206179116779516
|
||||
10
|
||||
13.451174232106741
|
||||
20
|
||||
13.596032991956758
|
||||
10
|
||||
38.203772564818578
|
||||
20
|
||||
13.596032991956758
|
||||
0
|
||||
LINE
|
||||
5
|
||||
108
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
80
|
||||
20
|
||||
85
|
||||
30
|
||||
0
|
||||
11
|
||||
80
|
||||
21
|
||||
35
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
109
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
90
|
||||
20
|
||||
85
|
||||
30
|
||||
0
|
||||
11
|
||||
90
|
||||
21
|
||||
35
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
110
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
20
|
||||
20
|
||||
32.938987371135568
|
||||
30
|
||||
0
|
||||
11
|
||||
32.582672402541192
|
||||
21
|
||||
32.938987371135568
|
||||
31
|
||||
0
|
||||
0
|
||||
LINE
|
||||
5
|
||||
111
|
||||
100
|
||||
AcDbEntity
|
||||
8
|
||||
0
|
||||
100
|
||||
AcDbLine
|
||||
10
|
||||
32.582672402541192
|
||||
20
|
||||
32.938987371135568
|
||||
30
|
||||
0
|
||||
11
|
||||
32.582672402541192
|
||||
21
|
||||
17.844276543429842
|
||||
31
|
||||
0
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
SECTION
|
||||
2
|
||||
OBJECTS
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
C
|
||||
100
|
||||
AcDbDictionary
|
||||
3
|
||||
ACAD_GROUP
|
||||
350
|
||||
D
|
||||
3
|
||||
ACAD_MLINESTYLE
|
||||
350
|
||||
17
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
D
|
||||
100
|
||||
AcDbDictionary
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
1A
|
||||
330
|
||||
C
|
||||
100
|
||||
AcDbDictionary
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
17
|
||||
100
|
||||
AcDbDictionary
|
||||
0
|
||||
ENDSEC
|
||||
0
|
||||
EOF
|
||||
79
tests/data/ref_gerber_inch.gtl
Normal file
79
tests/data/ref_gerber_inch.gtl
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
%MOIN*%
|
||||
%FSLAX25Y25*%
|
||||
%INTop Layer*%
|
||||
%IPPOS*%
|
||||
%AMCOMP*
|
||||
20,1,0.00787402,0,0.00393701,0.015748,0.00393701,$1*
|
||||
21,1,0.015748,0.00787402,-0.00787402,-0.00393701,$1*
|
||||
1,1,0.015748,-0.0472441,0,$1*
|
||||
4,1,4,0.0472441,0,0.0551181,-0.00787402,0.0472441,-0.015748,0.0393701,-0.00787402,0.0472441,0,$1*
|
||||
5,1,6,0.0472441,0.00787402,0.015748,$1*
|
||||
6,-0.0275591,0,0.019685,0.0019685,0.00590551,2,0.0019685,0.023622,$1*
|
||||
7,0.0275591,0,0.023622,0.019685,0.00590551,$1*%
|
||||
%ADD10C,0.0003937*%
|
||||
%ADD11C,0.03937X0.01575*%
|
||||
%ADD12R,0.03937X0.01969X0.007874*%
|
||||
%ADD13O,0.03937X0.01969X0.007874*%
|
||||
%ADD14O,0.01969X0.03937X0.007874*%
|
||||
%ADD15P,0.03937X5X90X0.007874*%
|
||||
%ADD16COMP,0*%
|
||||
%ADD17COMP,45*%
|
||||
%ADD18COMP,-45*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X3937Y0D02*
|
||||
X35433Y0D01*
|
||||
G03*
|
||||
X39370Y3937I0J3937D01*
|
||||
G01*
|
||||
X39370Y35433D01*
|
||||
G03*
|
||||
X35433Y39370I-3937J0D01*
|
||||
G01*
|
||||
X3937Y39370D01*
|
||||
G03*
|
||||
X0Y35433I0J-3937D01*
|
||||
G01*
|
||||
X0Y3937D01*
|
||||
G03*
|
||||
X3937Y0I3937J0D01*
|
||||
G01*
|
||||
G36*
|
||||
G01*
|
||||
X17717Y3937D02*
|
||||
X19685Y3937D01*
|
||||
G03*
|
||||
X21654Y5906I0J1969D01*
|
||||
G01*
|
||||
X21654Y33465D01*
|
||||
G03*
|
||||
X19685Y35433I-1969J0D01*
|
||||
G01*
|
||||
X17717Y35433D01*
|
||||
G03*
|
||||
X15748Y33465I0J-1969D01*
|
||||
G01*
|
||||
X15748Y5906D01*
|
||||
G03*
|
||||
X17717Y3937I1969J0D01*
|
||||
G01*
|
||||
G37*
|
||||
D11*
|
||||
X9843Y3937D03*
|
||||
D12*
|
||||
X9843Y11811D03*
|
||||
D13*
|
||||
X9843Y19685D03*
|
||||
D14*
|
||||
X9843Y27559D03*
|
||||
D15*
|
||||
X9843Y35433D03*
|
||||
D16*
|
||||
X29528Y19685D03*
|
||||
D17*
|
||||
X29528Y29528D03*
|
||||
D18*
|
||||
X29528Y9843D03*
|
||||
M02*
|
||||
84
tests/data/ref_gerber_metric.gtl
Normal file
84
tests/data/ref_gerber_metric.gtl
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%INTop Layer*%
|
||||
%IPPOS*%
|
||||
%AMCOMP*
|
||||
20,1,0.2,0,0.1,0.4,0.1,$1*
|
||||
21,1,0.4,0.2,-0.2,-0.1,$1*
|
||||
1,1,0.4,-1.2,0,$1*
|
||||
4,1,4,1.2,0,1.4,-0.2,1.2,-0.4,1,-0.2,1.2,0,$1*
|
||||
5,1,6,1.2,0.2,0.4,$1*
|
||||
6,-0.7,0,0.5,0.05,0.15,2,0.05,0.6,$1*
|
||||
7,0.7,0,0.6,0.5,0.15,$1*%
|
||||
%ADD10C,0.01*%
|
||||
%ADD11C,1X0.4*%
|
||||
%ADD12R,1X0.5X0.2*%
|
||||
%ADD13O,1X0.5X0.2*%
|
||||
%ADD14O,0.5X1X0.2*%
|
||||
%ADD15P,1X5X90X0.2*%
|
||||
%ADD16COMP,0*%
|
||||
%ADD17COMP,45*%
|
||||
%ADD18COMP,-45*%
|
||||
G75*
|
||||
%LPD*%
|
||||
|
||||
D10*
|
||||
G01*
|
||||
X10000Y0D02*
|
||||
X90000Y0D01*
|
||||
G03*
|
||||
X100000Y10000I0J10000D01*
|
||||
G01*
|
||||
X100000Y90000D01*
|
||||
G03*
|
||||
X90000Y100000I-10000J0D01*
|
||||
G01*
|
||||
X10000Y100000D01*
|
||||
G03*
|
||||
X0Y90000I0J-10000D01*
|
||||
G01*
|
||||
X0Y10000D01*
|
||||
G03*
|
||||
X10000Y0I10000J0D01*
|
||||
G01*
|
||||
|
||||
G36*
|
||||
G01*
|
||||
X45000Y10000D02*
|
||||
X50000Y10000D01*
|
||||
G03*
|
||||
X55000Y15000I0J5000D01*
|
||||
G01*
|
||||
X55000Y85000D01*
|
||||
G03*
|
||||
X50000Y90000I-5000J0D01*
|
||||
G01*
|
||||
X45000Y90000D01*
|
||||
G03*
|
||||
X40000Y85000I0J-5000D01*
|
||||
G01*
|
||||
X40000Y15000D01*
|
||||
G03*
|
||||
X45000Y10000I5000J0D01*
|
||||
G01*
|
||||
G37*
|
||||
|
||||
D11*
|
||||
X25000Y10000D03*
|
||||
D12*
|
||||
X25000Y30000D03*
|
||||
D13*
|
||||
X25000Y50000D03*
|
||||
D14*
|
||||
X25000Y70000D03*
|
||||
D15*
|
||||
X25000Y90000D03*
|
||||
|
||||
D16*
|
||||
X75000Y50000D03*
|
||||
D17*
|
||||
X75000Y75000D03*
|
||||
D18*
|
||||
X75000Y25000D03*
|
||||
|
||||
M02*
|
||||
40
tests/data/ref_gerber_single_quadrant.gtl
Normal file
40
tests/data/ref_gerber_single_quadrant.gtl
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0.1*%
|
||||
G74*
|
||||
%LPD*%
|
||||
|
||||
D10*
|
||||
|
||||
G36*
|
||||
G01*
|
||||
X0Y10000D02*
|
||||
Y90000D01*
|
||||
G02*
|
||||
X10000Y100000I10000*
|
||||
X20000Y90000J10000*
|
||||
G01*
|
||||
Y20000*
|
||||
X40000*
|
||||
G02*
|
||||
X50000Y10000J10000*
|
||||
X40000Y0I10000*
|
||||
G01*
|
||||
X10000*
|
||||
G02*
|
||||
X0Y10000J10000*
|
||||
G37*
|
||||
|
||||
G03*
|
||||
X70000Y50000D02*
|
||||
X60000Y60000I10000D01*
|
||||
X50000Y50000J10000*
|
||||
X60000Y40000I10000*
|
||||
X70000Y50000J10000*
|
||||
|
||||
G02*
|
||||
X60000Y90000D02*
|
||||
X60000Y90000I10000D01*
|
||||
|
||||
M02*
|
||||
78
tests/expects/RS2724x_offset.gtl
Normal file
78
tests/expects/RS2724x_offset.gtl
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%AMCOMP*
|
||||
20,1,0.2,0,0.1,0.4,0.1,$1*
|
||||
21,1,0.4,0.2,-0.2,-0.1,$1*
|
||||
1,1,0.4,-1.2,0,$1*
|
||||
4,1,4,1.2,0,1.4,-0.2,1.2,-0.4,1,-0.2,1.2,0,$1*
|
||||
5,1,6,1.2,0.2,0.4,$1*
|
||||
6,-0.7,0,0.5,0.05,0.15,2,0.05,0.6,$1*
|
||||
7,0.7,0,0.6,0.5,0.15,$1*%
|
||||
%ADD10C,0.01*%
|
||||
%ADD11C,1X0.4*%
|
||||
%ADD12R,1X0.5X0.2*%
|
||||
%ADD13O,1X0.5X0.2*%
|
||||
%ADD14O,0.5X1X0.2*%
|
||||
%ADD15P,1X5X90X0.2*%
|
||||
%ADD16COMP,0*%
|
||||
%ADD17COMP,45*%
|
||||
%ADD18COMP,-45*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X120000Y50000D02*
|
||||
X200000Y50000D01*
|
||||
G03*
|
||||
X210000Y60000I0J10000D01*
|
||||
G01*
|
||||
X210000Y140000D01*
|
||||
G03*
|
||||
X200000Y150000I-10000J0D01*
|
||||
G01*
|
||||
X120000Y150000D01*
|
||||
G03*
|
||||
X110000Y140000I0J-10000D01*
|
||||
G01*
|
||||
X110000Y60000D01*
|
||||
G03*
|
||||
X120000Y50000I10000J0D01*
|
||||
G01*
|
||||
G36*
|
||||
G01*
|
||||
X155000Y60000D02*
|
||||
X160000Y60000D01*
|
||||
G03*
|
||||
X165000Y65000I0J5000D01*
|
||||
G01*
|
||||
X165000Y135000D01*
|
||||
G03*
|
||||
X160000Y140000I-5000J0D01*
|
||||
G01*
|
||||
X155000Y140000D01*
|
||||
G03*
|
||||
X150000Y135000I0J-5000D01*
|
||||
G01*
|
||||
X150000Y65000D01*
|
||||
G03*
|
||||
X155000Y60000I5000J0D01*
|
||||
G01*
|
||||
G37*
|
||||
D11*
|
||||
X135000Y60000D03*
|
||||
D12*
|
||||
X135000Y80000D03*
|
||||
D13*
|
||||
X135000Y100000D03*
|
||||
D14*
|
||||
X135000Y120000D03*
|
||||
D15*
|
||||
X135000Y140000D03*
|
||||
D16*
|
||||
X185000Y100000D03*
|
||||
D17*
|
||||
X185000Y125000D03*
|
||||
D18*
|
||||
X185000Y75000D03*
|
||||
M02*
|
||||
98
tests/expects/RS2724x_rotate.gtl
Normal file
98
tests/expects/RS2724x_rotate.gtl
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%AMCOMP*
|
||||
20,1,0.2,0,0.1,0.4,0.1,($1)+(20)*
|
||||
21,1,0.4,0.2,-0.2,-0.1,($1)+(20)*
|
||||
1,1,0.4,-1.2,0,($1)+(20)*
|
||||
4,1,4,1.2,0,1.4,-0.2,1.2,-0.4,1,-0.2,1.2,0,($1)+(20)*
|
||||
5,1,6,1.2,0.2,0.4,($1)+(20)*
|
||||
6,-0.7,0,0.5,0.05,0.15,2,0.05,0.6,($1)+(20)*
|
||||
7,0.7,0,0.6,0.5,0.15,($1)+(20)*%
|
||||
%AMMACR*
|
||||
21,1,$1,$2,0,0,20*
|
||||
1,0,$3,0,0,20*%
|
||||
%AMMACLO*
|
||||
$4=($1)-($2)*
|
||||
$5=($1)-($4)*
|
||||
21,1,$5,$2,0,0,20*
|
||||
1,1,$4,($4)/(2),0,20*
|
||||
1,1,$4,($4)/(-2),0,20*
|
||||
1,0,$3,0,0,20*%
|
||||
%AMMACPO*
|
||||
$4=($2)-($1)*
|
||||
$5=($2)-($4)*
|
||||
21,1,$1,$5,0,0,20*
|
||||
1,1,$4,0,($4)/(2),20*
|
||||
1,1,$4,0,($4)/(-2),20*
|
||||
1,0,$3,0,0,20*%
|
||||
%AMMACP*
|
||||
5,1,$2,0,0,$1,($3)+(20)*
|
||||
1,0,$4,0,0,20*%
|
||||
%ADD10C,0.01*%
|
||||
%ADD11C,1X0.4*%
|
||||
%ADD12MACR,1X0.5X0.2*%
|
||||
%ADD13MACLO,1X0.5X0.2*%
|
||||
%ADD14MACPO,0.5X1X0.2*%
|
||||
%ADD15MACP,1X5X90X0.2*%
|
||||
%ADD16COMP,0*%
|
||||
%ADD17COMP,45*%
|
||||
%ADD18COMP,-45*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X49630Y-24751D02*
|
||||
X124805Y2611D01*
|
||||
G03*
|
||||
X130782Y15428I-3420J9397D01*
|
||||
G01*
|
||||
X103420Y90603D01*
|
||||
G03*
|
||||
X90603Y96580I-9397J-3420D01*
|
||||
G01*
|
||||
X15428Y69218D01*
|
||||
G03*
|
||||
X9451Y56401I3420J-9397D01*
|
||||
G01*
|
||||
X36813Y-18774D01*
|
||||
G03*
|
||||
X49630Y-24751I9397J3420D01*
|
||||
G01*
|
||||
G36*
|
||||
G01*
|
||||
X79099Y-3383D02*
|
||||
X83797Y-1673D01*
|
||||
G03*
|
||||
X86786Y4735I-1710J4698D01*
|
||||
G01*
|
||||
X62844Y70514D01*
|
||||
G03*
|
||||
X56436Y73502I-4698J-1710D01*
|
||||
G01*
|
||||
X51737Y71792D01*
|
||||
G03*
|
||||
X48749Y65383I1710J-4698D01*
|
||||
G01*
|
||||
X72690Y-395D01*
|
||||
G03*
|
||||
X79099Y-3383I4698J1710D01*
|
||||
G01*
|
||||
G37*
|
||||
D11*
|
||||
X60305Y-10224D03*
|
||||
D12*
|
||||
X53464Y8570D03*
|
||||
D13*
|
||||
X46624Y27364D03*
|
||||
D14*
|
||||
X39784Y46158D03*
|
||||
D15*
|
||||
X32943Y64952D03*
|
||||
D16*
|
||||
X93609Y44465D03*
|
||||
D17*
|
||||
X85058Y67957D03*
|
||||
D18*
|
||||
X102159Y20973D03*
|
||||
M02*
|
||||
78
tests/expects/RS2724x_save.gtl
Normal file
78
tests/expects/RS2724x_save.gtl
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%AMCOMP*
|
||||
20,1,0.2,0,0.1,0.4,0.1,$1*
|
||||
21,1,0.4,0.2,-0.2,-0.1,$1*
|
||||
1,1,0.4,-1.2,0,$1*
|
||||
4,1,4,1.2,0,1.4,-0.2,1.2,-0.4,1,-0.2,1.2,0,$1*
|
||||
5,1,6,1.2,0.2,0.4,$1*
|
||||
6,-0.7,0,0.5,0.05,0.15,2,0.05,0.6,$1*
|
||||
7,0.7,0,0.6,0.5,0.15,$1*%
|
||||
%ADD10C,0.01*%
|
||||
%ADD11C,1X0.4*%
|
||||
%ADD12R,1X0.5X0.2*%
|
||||
%ADD13O,1X0.5X0.2*%
|
||||
%ADD14O,0.5X1X0.2*%
|
||||
%ADD15P,1X5X90X0.2*%
|
||||
%ADD16COMP,0*%
|
||||
%ADD17COMP,45*%
|
||||
%ADD18COMP,-45*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X10000Y0D02*
|
||||
X90000Y0D01*
|
||||
G03*
|
||||
X100000Y10000I0J10000D01*
|
||||
G01*
|
||||
X100000Y90000D01*
|
||||
G03*
|
||||
X90000Y100000I-10000J0D01*
|
||||
G01*
|
||||
X10000Y100000D01*
|
||||
G03*
|
||||
X0Y90000I0J-10000D01*
|
||||
G01*
|
||||
X0Y10000D01*
|
||||
G03*
|
||||
X10000Y0I10000J0D01*
|
||||
G01*
|
||||
G36*
|
||||
G01*
|
||||
X45000Y10000D02*
|
||||
X50000Y10000D01*
|
||||
G03*
|
||||
X55000Y15000I0J5000D01*
|
||||
G01*
|
||||
X55000Y85000D01*
|
||||
G03*
|
||||
X50000Y90000I-5000J0D01*
|
||||
G01*
|
||||
X45000Y90000D01*
|
||||
G03*
|
||||
X40000Y85000I0J-5000D01*
|
||||
G01*
|
||||
X40000Y15000D01*
|
||||
G03*
|
||||
X45000Y10000I5000J0D01*
|
||||
G01*
|
||||
G37*
|
||||
D11*
|
||||
X25000Y10000D03*
|
||||
D12*
|
||||
X25000Y30000D03*
|
||||
D13*
|
||||
X25000Y50000D03*
|
||||
D14*
|
||||
X25000Y70000D03*
|
||||
D15*
|
||||
X25000Y90000D03*
|
||||
D16*
|
||||
X75000Y50000D03*
|
||||
D17*
|
||||
X75000Y75000D03*
|
||||
D18*
|
||||
X75000Y25000D03*
|
||||
M02*
|
||||
35
tests/expects/RS2724x_single_quadrant.gtl
Normal file
35
tests/expects/RS2724x_single_quadrant.gtl
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0.1*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G36*
|
||||
G01*
|
||||
X0Y10000D02*
|
||||
X0Y90000D01*
|
||||
G02*
|
||||
X10000Y100000I10000J0D01*
|
||||
X20000Y90000I0J-10000D01*
|
||||
G01*
|
||||
X20000Y20000D01*
|
||||
X40000Y20000D01*
|
||||
G02*
|
||||
X50000Y10000I0J-10000D01*
|
||||
X40000Y0I-10000J0D01*
|
||||
G01*
|
||||
X10000Y0D01*
|
||||
G02*
|
||||
X0Y10000I0J10000D01*
|
||||
G37*
|
||||
G03*
|
||||
X70000Y50000D02*
|
||||
X60000Y60000I-10000J0D01*
|
||||
X50000Y50000I0J-10000D01*
|
||||
X60000Y40000I10000J0D01*
|
||||
X70000Y50000I0J10000D01*
|
||||
G02*
|
||||
X60000Y90000D02*
|
||||
X60000Y90000I0J0D01*
|
||||
M02*
|
||||
78
tests/expects/RS2724x_to_inch.gtl
Normal file
78
tests/expects/RS2724x_to_inch.gtl
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
%MOIN*%
|
||||
%FSLAX25Y25*%
|
||||
%IPPOS*%
|
||||
%AMCOMP*
|
||||
20,1,0.00787402,0,0.00393701,0.015748,0.00393701,$1*
|
||||
21,1,0.015748,0.00787402,-0.00787402,-0.00393701,$1*
|
||||
1,1,0.015748,-0.0472441,0,$1*
|
||||
4,1,4,0.0472441,0,0.0551181,-0.00787402,0.0472441,-0.015748,0.0393701,-0.00787402,0.0472441,0,$1*
|
||||
5,1,6,0.0472441,0.00787402,0.015748,$1*
|
||||
6,-0.0275591,0,0.019685,0.0019685,0.00590551,2,0.0019685,0.023622,$1*
|
||||
7,0.0275591,0,0.023622,0.019685,0.00590551,$1*%
|
||||
%ADD10C,0.0003937*%
|
||||
%ADD11C,0.03937X0.01575*%
|
||||
%ADD12R,0.03937X0.01969X0.007874*%
|
||||
%ADD13O,0.03937X0.01969X0.007874*%
|
||||
%ADD14O,0.01969X0.03937X0.007874*%
|
||||
%ADD15P,0.03937X5X90X0.007874*%
|
||||
%ADD16COMP,0*%
|
||||
%ADD17COMP,45*%
|
||||
%ADD18COMP,-45*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X3937Y0D02*
|
||||
X35433Y0D01*
|
||||
G03*
|
||||
X39370Y3937I0J3937D01*
|
||||
G01*
|
||||
X39370Y35433D01*
|
||||
G03*
|
||||
X35433Y39370I-3937J0D01*
|
||||
G01*
|
||||
X3937Y39370D01*
|
||||
G03*
|
||||
X0Y35433I0J-3937D01*
|
||||
G01*
|
||||
X0Y3937D01*
|
||||
G03*
|
||||
X3937Y0I3937J0D01*
|
||||
G01*
|
||||
G36*
|
||||
G01*
|
||||
X17717Y3937D02*
|
||||
X19685Y3937D01*
|
||||
G03*
|
||||
X21654Y5906I0J1969D01*
|
||||
G01*
|
||||
X21654Y33465D01*
|
||||
G03*
|
||||
X19685Y35433I-1969J0D01*
|
||||
G01*
|
||||
X17717Y35433D01*
|
||||
G03*
|
||||
X15748Y33465I0J-1969D01*
|
||||
G01*
|
||||
X15748Y5906D01*
|
||||
G03*
|
||||
X17717Y3937I1969J0D01*
|
||||
G01*
|
||||
G37*
|
||||
D11*
|
||||
X9843Y3937D03*
|
||||
D12*
|
||||
X9843Y11811D03*
|
||||
D13*
|
||||
X9843Y19685D03*
|
||||
D14*
|
||||
X9843Y27559D03*
|
||||
D15*
|
||||
X9843Y35433D03*
|
||||
D16*
|
||||
X29528Y19685D03*
|
||||
D17*
|
||||
X29528Y29528D03*
|
||||
D18*
|
||||
X29528Y9843D03*
|
||||
M02*
|
||||
78
tests/expects/RS2724x_to_metric.gtl
Normal file
78
tests/expects/RS2724x_to_metric.gtl
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%AMCOMP*
|
||||
20,1,0.2,0,0.1,0.399999,0.1,$1*
|
||||
21,1,0.399999,0.2,-0.2,-0.1,$1*
|
||||
1,1,0.399999,-1.2,0,$1*
|
||||
4,1,4,1.2,0,1.4,-0.2,1.2,-0.399999,1,-0.2,1.2,0,$1*
|
||||
5,1,6,1.2,0.2,0.399999,$1*
|
||||
6,-0.700001,0,0.499999,0.0499999,0.15,2,0.0499999,0.599999,$1*
|
||||
7,0.700001,0,0.599999,0.499999,0.15,$1*%
|
||||
%ADD10C,0.01*%
|
||||
%ADD11C,1X0.4*%
|
||||
%ADD12R,1X0.5001X0.2*%
|
||||
%ADD13O,1X0.5001X0.2*%
|
||||
%ADD14O,0.5001X1X0.2*%
|
||||
%ADD15P,1X5X90X0.2*%
|
||||
%ADD16COMP,0*%
|
||||
%ADD17COMP,45*%
|
||||
%ADD18COMP,-45*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X10000Y0D02*
|
||||
X90000Y0D01*
|
||||
G03*
|
||||
X100000Y10000I0J10000D01*
|
||||
G01*
|
||||
X100000Y90000D01*
|
||||
G03*
|
||||
X90000Y100000I-10000J0D01*
|
||||
G01*
|
||||
X10000Y100000D01*
|
||||
G03*
|
||||
X0Y90000I0J-10000D01*
|
||||
G01*
|
||||
X0Y10000D01*
|
||||
G03*
|
||||
X10000Y0I10000J0D01*
|
||||
G01*
|
||||
G36*
|
||||
G01*
|
||||
X45001Y10000D02*
|
||||
X50000Y10000D01*
|
||||
G03*
|
||||
X55001Y15001I0J5001D01*
|
||||
G01*
|
||||
X55001Y85001D01*
|
||||
G03*
|
||||
X50000Y90000I-5001J0D01*
|
||||
G01*
|
||||
X45001Y90000D01*
|
||||
G03*
|
||||
X40000Y85001I0J-5001D01*
|
||||
G01*
|
||||
X40000Y15001D01*
|
||||
G03*
|
||||
X45001Y10000I5001J0D01*
|
||||
G01*
|
||||
G37*
|
||||
D11*
|
||||
X25001Y10000D03*
|
||||
D12*
|
||||
X25001Y30000D03*
|
||||
D13*
|
||||
X25001Y50000D03*
|
||||
D14*
|
||||
X25001Y70000D03*
|
||||
D15*
|
||||
X25001Y90000D03*
|
||||
D16*
|
||||
X75001Y50000D03*
|
||||
D17*
|
||||
X75001Y75001D03*
|
||||
D18*
|
||||
X75001Y25001D03*
|
||||
M02*
|
||||
729
tests/expects/dxf_complex_fill.gtl
Normal file
729
tests/expects/dxf_complex_fill.gtl
Normal file
|
|
@ -0,0 +1,729 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G36*
|
||||
G01*
|
||||
X800000Y150000D02*
|
||||
G75*
|
||||
G03*
|
||||
X780000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X774000Y170000D01*
|
||||
G03*
|
||||
X754000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X754000Y50000D01*
|
||||
G01*
|
||||
X600000Y50000D01*
|
||||
G01*
|
||||
X600000Y150000D01*
|
||||
G03*
|
||||
X580000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X574000Y170000D01*
|
||||
G03*
|
||||
X554000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X554000Y50000D01*
|
||||
G01*
|
||||
X400000Y50000D01*
|
||||
G01*
|
||||
X400000Y150000D01*
|
||||
G03*
|
||||
X380000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X374000Y170000D01*
|
||||
G03*
|
||||
X354000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X354000Y50000D01*
|
||||
G01*
|
||||
X200000Y50000D01*
|
||||
G01*
|
||||
X200000Y150000D01*
|
||||
G03*
|
||||
X180000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X174000Y170000D01*
|
||||
G03*
|
||||
X154000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X154000Y50000D01*
|
||||
G01*
|
||||
X0Y50000D01*
|
||||
G01*
|
||||
X0Y450000D01*
|
||||
G01*
|
||||
X17000Y450000D01*
|
||||
G03*
|
||||
X37000Y470000I0J20000D01*
|
||||
G03*
|
||||
X17000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X0Y490000D01*
|
||||
G01*
|
||||
X0Y560000D01*
|
||||
G01*
|
||||
X17000Y560000D01*
|
||||
G03*
|
||||
X37000Y580000I0J20000D01*
|
||||
G03*
|
||||
X17000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X0Y600000D01*
|
||||
G01*
|
||||
X0Y1000000D01*
|
||||
G01*
|
||||
X154000Y1000000D01*
|
||||
G01*
|
||||
X154000Y900000D01*
|
||||
G03*
|
||||
X174000Y880000I20000J0D01*
|
||||
G01*
|
||||
X180000Y880000D01*
|
||||
G03*
|
||||
X200000Y900000I0J20000D01*
|
||||
G01*
|
||||
X200000Y1000000D01*
|
||||
G01*
|
||||
X354000Y1000000D01*
|
||||
G01*
|
||||
X354000Y900000D01*
|
||||
G03*
|
||||
X374000Y880000I20000J0D01*
|
||||
G01*
|
||||
X380000Y880000D01*
|
||||
G03*
|
||||
X400000Y900000I0J20000D01*
|
||||
G01*
|
||||
X400000Y1000000D01*
|
||||
G01*
|
||||
X554000Y1000000D01*
|
||||
G01*
|
||||
X554000Y900000D01*
|
||||
G03*
|
||||
X574000Y880000I20000J0D01*
|
||||
G01*
|
||||
X580000Y880000D01*
|
||||
G03*
|
||||
X600000Y900000I0J20000D01*
|
||||
G01*
|
||||
X600000Y1000000D01*
|
||||
G01*
|
||||
X754000Y1000000D01*
|
||||
G01*
|
||||
X754000Y900000D01*
|
||||
G03*
|
||||
X774000Y880000I20000J0D01*
|
||||
G01*
|
||||
X780000Y880000D01*
|
||||
G03*
|
||||
X800000Y900000I0J20000D01*
|
||||
G01*
|
||||
X800000Y1000000D01*
|
||||
G01*
|
||||
X954000Y1000000D01*
|
||||
G01*
|
||||
X954000Y600000D01*
|
||||
G01*
|
||||
X937000Y600000D01*
|
||||
G03*
|
||||
X917000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X937000Y560000I20000J0D01*
|
||||
G01*
|
||||
X954000Y560000D01*
|
||||
G01*
|
||||
X954000Y490000D01*
|
||||
G01*
|
||||
X937000Y490000D01*
|
||||
G03*
|
||||
X917000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X937000Y450000I20000J0D01*
|
||||
G01*
|
||||
X954000Y450000D01*
|
||||
G01*
|
||||
X954000Y50000D01*
|
||||
G01*
|
||||
X800000Y50000D01*
|
||||
G01*
|
||||
X800000Y150000D01*
|
||||
G37*
|
||||
%LPC*%
|
||||
G36*
|
||||
G01*
|
||||
X624500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X624500Y633350D01*
|
||||
G03*
|
||||
X612500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X612500Y620350D01*
|
||||
G03*
|
||||
X624500Y620350I6000J0D01*
|
||||
G01*
|
||||
X824500Y620350D02*
|
||||
G75*
|
||||
G02*
|
||||
X812500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X812500Y633350D01*
|
||||
G02*
|
||||
X824500Y633350I6000J0D01*
|
||||
G01*
|
||||
X824500Y620350D01*
|
||||
G01*
|
||||
X729500Y633350D02*
|
||||
G75*
|
||||
G02*
|
||||
X741500Y633350I6000J0D01*
|
||||
G01*
|
||||
X741500Y620350D01*
|
||||
G02*
|
||||
X729500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X729500Y633350D01*
|
||||
G01*
|
||||
X141500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X141500Y633350D01*
|
||||
G03*
|
||||
X129500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X129500Y620350D01*
|
||||
G03*
|
||||
X141500Y620350I6000J0D01*
|
||||
G01*
|
||||
X212500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X212500Y416650D01*
|
||||
G03*
|
||||
X224500Y416650I6000J0D01*
|
||||
G01*
|
||||
X224500Y429650D01*
|
||||
G03*
|
||||
X212500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X341500Y416650D02*
|
||||
G75*
|
||||
G01*
|
||||
X341500Y429650D01*
|
||||
G03*
|
||||
X329500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X329500Y416650D01*
|
||||
G03*
|
||||
X341500Y416650I6000J0D01*
|
||||
G01*
|
||||
X341500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X341500Y633350D01*
|
||||
G03*
|
||||
X329500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X329500Y620350D01*
|
||||
G03*
|
||||
X341500Y620350I6000J0D01*
|
||||
G01*
|
||||
X624500Y416650D02*
|
||||
G75*
|
||||
G01*
|
||||
X624500Y429650D01*
|
||||
G03*
|
||||
X612500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X612500Y416650D01*
|
||||
G03*
|
||||
X624500Y416650I6000J0D01*
|
||||
G01*
|
||||
X729500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X729500Y416650D01*
|
||||
G03*
|
||||
X741500Y416650I6000J0D01*
|
||||
G01*
|
||||
X741500Y429650D01*
|
||||
G03*
|
||||
X729500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X541500Y620350D02*
|
||||
G75*
|
||||
G02*
|
||||
X529500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X529500Y633350D01*
|
||||
G02*
|
||||
X541500Y633350I6000J0D01*
|
||||
G01*
|
||||
X541500Y620350D01*
|
||||
G01*
|
||||
X929500Y633350D02*
|
||||
G75*
|
||||
G02*
|
||||
X941500Y633350I6000J0D01*
|
||||
G01*
|
||||
X941500Y620350D01*
|
||||
G02*
|
||||
X929500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X929500Y633350D01*
|
||||
G01*
|
||||
X412500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X412500Y416650D01*
|
||||
G03*
|
||||
X424500Y416650I6000J0D01*
|
||||
G01*
|
||||
X424500Y429650D01*
|
||||
G03*
|
||||
X412500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X224500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X224500Y633350D01*
|
||||
G03*
|
||||
X212500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X212500Y620350D01*
|
||||
G03*
|
||||
X224500Y620350I6000J0D01*
|
||||
G01*
|
||||
X541500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X529500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X529500Y429650D01*
|
||||
G02*
|
||||
X541500Y429650I6000J0D01*
|
||||
G01*
|
||||
X541500Y416650D01*
|
||||
G01*
|
||||
X129500Y429650D02*
|
||||
G75*
|
||||
G02*
|
||||
X141500Y429650I6000J0D01*
|
||||
G01*
|
||||
X141500Y416650D01*
|
||||
G02*
|
||||
X129500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X129500Y429650D01*
|
||||
G01*
|
||||
X24500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X12500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X12500Y429650D01*
|
||||
G02*
|
||||
X24500Y429650I6000J0D01*
|
||||
G01*
|
||||
X24500Y416650D01*
|
||||
G01*
|
||||
X941500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X929500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X929500Y429650D01*
|
||||
G02*
|
||||
X941500Y429650I6000J0D01*
|
||||
G01*
|
||||
X941500Y416650D01*
|
||||
G01*
|
||||
X424500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X424500Y633350D01*
|
||||
G03*
|
||||
X412500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X412500Y620350D01*
|
||||
G03*
|
||||
X424500Y620350I6000J0D01*
|
||||
G01*
|
||||
X824500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X812500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X812500Y429650D01*
|
||||
G02*
|
||||
X824500Y429650I6000J0D01*
|
||||
G01*
|
||||
X824500Y416650D01*
|
||||
G01*
|
||||
X12500Y633350D02*
|
||||
G75*
|
||||
G01*
|
||||
X12500Y620350D01*
|
||||
G03*
|
||||
X24500Y620350I6000J0D01*
|
||||
G01*
|
||||
X24500Y633350D01*
|
||||
G03*
|
||||
X12500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X660500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X660500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X905500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X905500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X505500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X505500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X860500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X860500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X705500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X705500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X705500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X705500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X660500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X660500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X505500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X505500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X260500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X260500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X905500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X905500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X460500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X460500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X460500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X460500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X60500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X60500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X105500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X105500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X60500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X60500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X305500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X305500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X860500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X860500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X541500Y633350D02*
|
||||
G75*
|
||||
G01*
|
||||
X541500Y620350D01*
|
||||
G02*
|
||||
X529500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X529500Y633350D01*
|
||||
G02*
|
||||
X541500Y633350I6000J0D01*
|
||||
G01*
|
||||
X941500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X941500Y416650D01*
|
||||
G02*
|
||||
X929500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X929500Y429650D01*
|
||||
G02*
|
||||
X941500Y429650I6000J0D01*
|
||||
G01*
|
||||
X260500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X260500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X305500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X305500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X824500Y633350D02*
|
||||
G75*
|
||||
G03*
|
||||
X812500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X812500Y620350D01*
|
||||
G03*
|
||||
X824500Y620350I6000J0D01*
|
||||
G01*
|
||||
X824500Y633350D01*
|
||||
G01*
|
||||
X105500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X105500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X217000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X237000Y580000I0J20000D01*
|
||||
G03*
|
||||
X217000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X200000Y600000D01*
|
||||
G01*
|
||||
X200000Y700000D01*
|
||||
G03*
|
||||
X180000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X174000Y720000D01*
|
||||
G03*
|
||||
X154000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X154000Y600000D01*
|
||||
G01*
|
||||
X137000Y600000D01*
|
||||
G03*
|
||||
X117000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X137000Y560000I20000J0D01*
|
||||
G01*
|
||||
X217000Y560000D01*
|
||||
G01*
|
||||
X417000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X437000Y580000I0J20000D01*
|
||||
G03*
|
||||
X417000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X400000Y600000D01*
|
||||
G01*
|
||||
X400000Y700000D01*
|
||||
G03*
|
||||
X380000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X374000Y720000D01*
|
||||
G03*
|
||||
X354000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X354000Y600000D01*
|
||||
G01*
|
||||
X337000Y600000D01*
|
||||
G03*
|
||||
X317000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X337000Y560000I20000J0D01*
|
||||
G01*
|
||||
X417000Y560000D01*
|
||||
G01*
|
||||
X617000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X637000Y580000I0J20000D01*
|
||||
G03*
|
||||
X617000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X600000Y600000D01*
|
||||
G01*
|
||||
X600000Y700000D01*
|
||||
G03*
|
||||
X580000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X574000Y720000D01*
|
||||
G03*
|
||||
X554000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X554000Y600000D01*
|
||||
G01*
|
||||
X537000Y600000D01*
|
||||
G03*
|
||||
X517000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X537000Y560000I20000J0D01*
|
||||
G01*
|
||||
X617000Y560000D01*
|
||||
G01*
|
||||
X817000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X837000Y580000I0J20000D01*
|
||||
G03*
|
||||
X817000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X800000Y600000D01*
|
||||
G01*
|
||||
X800000Y700000D01*
|
||||
G03*
|
||||
X780000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X774000Y720000D01*
|
||||
G03*
|
||||
X754000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X754000Y600000D01*
|
||||
G01*
|
||||
X737000Y600000D01*
|
||||
G03*
|
||||
X717000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X737000Y560000I20000J0D01*
|
||||
G01*
|
||||
X817000Y560000D01*
|
||||
G01*
|
||||
X180000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X200000Y350000I0J20000D01*
|
||||
G01*
|
||||
X200000Y450000D01*
|
||||
G01*
|
||||
X217000Y450000D01*
|
||||
G03*
|
||||
X237000Y470000I0J20000D01*
|
||||
G03*
|
||||
X217000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X137000Y490000D01*
|
||||
G03*
|
||||
X117000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X137000Y450000I20000J0D01*
|
||||
G01*
|
||||
X154000Y450000D01*
|
||||
G01*
|
||||
X154000Y350000D01*
|
||||
G03*
|
||||
X174000Y330000I20000J0D01*
|
||||
G01*
|
||||
X180000Y330000D01*
|
||||
G01*
|
||||
X380000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X400000Y350000I0J20000D01*
|
||||
G01*
|
||||
X400000Y450000D01*
|
||||
G01*
|
||||
X417000Y450000D01*
|
||||
G03*
|
||||
X437000Y470000I0J20000D01*
|
||||
G03*
|
||||
X417000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X337000Y490000D01*
|
||||
G03*
|
||||
X317000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X337000Y450000I20000J0D01*
|
||||
G01*
|
||||
X354000Y450000D01*
|
||||
G01*
|
||||
X354000Y350000D01*
|
||||
G03*
|
||||
X374000Y330000I20000J0D01*
|
||||
G01*
|
||||
X380000Y330000D01*
|
||||
G01*
|
||||
X580000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X600000Y350000I0J20000D01*
|
||||
G01*
|
||||
X600000Y450000D01*
|
||||
G01*
|
||||
X617000Y450000D01*
|
||||
G03*
|
||||
X637000Y470000I0J20000D01*
|
||||
G03*
|
||||
X617000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X537000Y490000D01*
|
||||
G03*
|
||||
X517000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X537000Y450000I20000J0D01*
|
||||
G01*
|
||||
X554000Y450000D01*
|
||||
G01*
|
||||
X554000Y350000D01*
|
||||
G03*
|
||||
X574000Y330000I20000J0D01*
|
||||
G01*
|
||||
X580000Y330000D01*
|
||||
G01*
|
||||
X780000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X800000Y350000I0J20000D01*
|
||||
G01*
|
||||
X800000Y450000D01*
|
||||
G01*
|
||||
X817000Y450000D01*
|
||||
G03*
|
||||
X837000Y470000I0J20000D01*
|
||||
G03*
|
||||
X817000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X737000Y490000D01*
|
||||
G03*
|
||||
X717000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X737000Y450000I20000J0D01*
|
||||
G01*
|
||||
X754000Y450000D01*
|
||||
G01*
|
||||
X754000Y350000D01*
|
||||
G03*
|
||||
X774000Y330000I20000J0D01*
|
||||
G01*
|
||||
X780000Y330000D01*
|
||||
G37*
|
||||
M02*
|
||||
746
tests/expects/dxf_complex_fill_flip.gtl
Normal file
746
tests/expects/dxf_complex_fill_flip.gtl
Normal file
|
|
@ -0,0 +1,746 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
%ADD11C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G36*
|
||||
G01*
|
||||
X0Y1000000D02*
|
||||
G75*
|
||||
G01*
|
||||
X0Y0D01*
|
||||
G01*
|
||||
X1000000Y0D01*
|
||||
G01*
|
||||
X1000000Y1000000D01*
|
||||
G01*
|
||||
X0Y1000000D01*
|
||||
G37*
|
||||
G75*
|
||||
%LPC*%
|
||||
D11*
|
||||
G36*
|
||||
G01*
|
||||
X800000Y150000D02*
|
||||
G75*
|
||||
G03*
|
||||
X780000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X774000Y170000D01*
|
||||
G03*
|
||||
X754000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X754000Y50000D01*
|
||||
G01*
|
||||
X600000Y50000D01*
|
||||
G01*
|
||||
X600000Y150000D01*
|
||||
G03*
|
||||
X580000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X574000Y170000D01*
|
||||
G03*
|
||||
X554000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X554000Y50000D01*
|
||||
G01*
|
||||
X400000Y50000D01*
|
||||
G01*
|
||||
X400000Y150000D01*
|
||||
G03*
|
||||
X380000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X374000Y170000D01*
|
||||
G03*
|
||||
X354000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X354000Y50000D01*
|
||||
G01*
|
||||
X200000Y50000D01*
|
||||
G01*
|
||||
X200000Y150000D01*
|
||||
G03*
|
||||
X180000Y170000I-20000J0D01*
|
||||
G01*
|
||||
X174000Y170000D01*
|
||||
G03*
|
||||
X154000Y150000I0J-20000D01*
|
||||
G01*
|
||||
X154000Y50000D01*
|
||||
G01*
|
||||
X0Y50000D01*
|
||||
G01*
|
||||
X0Y450000D01*
|
||||
G01*
|
||||
X17000Y450000D01*
|
||||
G03*
|
||||
X37000Y470000I0J20000D01*
|
||||
G03*
|
||||
X17000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X0Y490000D01*
|
||||
G01*
|
||||
X0Y560000D01*
|
||||
G01*
|
||||
X17000Y560000D01*
|
||||
G03*
|
||||
X37000Y580000I0J20000D01*
|
||||
G03*
|
||||
X17000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X0Y600000D01*
|
||||
G01*
|
||||
X0Y1000000D01*
|
||||
G01*
|
||||
X154000Y1000000D01*
|
||||
G01*
|
||||
X154000Y900000D01*
|
||||
G03*
|
||||
X174000Y880000I20000J0D01*
|
||||
G01*
|
||||
X180000Y880000D01*
|
||||
G03*
|
||||
X200000Y900000I0J20000D01*
|
||||
G01*
|
||||
X200000Y1000000D01*
|
||||
G01*
|
||||
X354000Y1000000D01*
|
||||
G01*
|
||||
X354000Y900000D01*
|
||||
G03*
|
||||
X374000Y880000I20000J0D01*
|
||||
G01*
|
||||
X380000Y880000D01*
|
||||
G03*
|
||||
X400000Y900000I0J20000D01*
|
||||
G01*
|
||||
X400000Y1000000D01*
|
||||
G01*
|
||||
X554000Y1000000D01*
|
||||
G01*
|
||||
X554000Y900000D01*
|
||||
G03*
|
||||
X574000Y880000I20000J0D01*
|
||||
G01*
|
||||
X580000Y880000D01*
|
||||
G03*
|
||||
X600000Y900000I0J20000D01*
|
||||
G01*
|
||||
X600000Y1000000D01*
|
||||
G01*
|
||||
X754000Y1000000D01*
|
||||
G01*
|
||||
X754000Y900000D01*
|
||||
G03*
|
||||
X774000Y880000I20000J0D01*
|
||||
G01*
|
||||
X780000Y880000D01*
|
||||
G03*
|
||||
X800000Y900000I0J20000D01*
|
||||
G01*
|
||||
X800000Y1000000D01*
|
||||
G01*
|
||||
X954000Y1000000D01*
|
||||
G01*
|
||||
X954000Y600000D01*
|
||||
G01*
|
||||
X937000Y600000D01*
|
||||
G03*
|
||||
X917000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X937000Y560000I20000J0D01*
|
||||
G01*
|
||||
X954000Y560000D01*
|
||||
G01*
|
||||
X954000Y490000D01*
|
||||
G01*
|
||||
X937000Y490000D01*
|
||||
G03*
|
||||
X917000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X937000Y450000I20000J0D01*
|
||||
G01*
|
||||
X954000Y450000D01*
|
||||
G01*
|
||||
X954000Y50000D01*
|
||||
G01*
|
||||
X800000Y50000D01*
|
||||
G01*
|
||||
X800000Y150000D01*
|
||||
G37*
|
||||
%LPD*%
|
||||
G36*
|
||||
G01*
|
||||
X624500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X624500Y633350D01*
|
||||
G03*
|
||||
X612500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X612500Y620350D01*
|
||||
G03*
|
||||
X624500Y620350I6000J0D01*
|
||||
G01*
|
||||
X824500Y620350D02*
|
||||
G75*
|
||||
G02*
|
||||
X812500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X812500Y633350D01*
|
||||
G02*
|
||||
X824500Y633350I6000J0D01*
|
||||
G01*
|
||||
X824500Y620350D01*
|
||||
G01*
|
||||
X729500Y633350D02*
|
||||
G75*
|
||||
G02*
|
||||
X741500Y633350I6000J0D01*
|
||||
G01*
|
||||
X741500Y620350D01*
|
||||
G02*
|
||||
X729500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X729500Y633350D01*
|
||||
G01*
|
||||
X141500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X141500Y633350D01*
|
||||
G03*
|
||||
X129500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X129500Y620350D01*
|
||||
G03*
|
||||
X141500Y620350I6000J0D01*
|
||||
G01*
|
||||
X212500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X212500Y416650D01*
|
||||
G03*
|
||||
X224500Y416650I6000J0D01*
|
||||
G01*
|
||||
X224500Y429650D01*
|
||||
G03*
|
||||
X212500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X341500Y416650D02*
|
||||
G75*
|
||||
G01*
|
||||
X341500Y429650D01*
|
||||
G03*
|
||||
X329500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X329500Y416650D01*
|
||||
G03*
|
||||
X341500Y416650I6000J0D01*
|
||||
G01*
|
||||
X341500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X341500Y633350D01*
|
||||
G03*
|
||||
X329500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X329500Y620350D01*
|
||||
G03*
|
||||
X341500Y620350I6000J0D01*
|
||||
G01*
|
||||
X624500Y416650D02*
|
||||
G75*
|
||||
G01*
|
||||
X624500Y429650D01*
|
||||
G03*
|
||||
X612500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X612500Y416650D01*
|
||||
G03*
|
||||
X624500Y416650I6000J0D01*
|
||||
G01*
|
||||
X729500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X729500Y416650D01*
|
||||
G03*
|
||||
X741500Y416650I6000J0D01*
|
||||
G01*
|
||||
X741500Y429650D01*
|
||||
G03*
|
||||
X729500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X541500Y620350D02*
|
||||
G75*
|
||||
G02*
|
||||
X529500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X529500Y633350D01*
|
||||
G02*
|
||||
X541500Y633350I6000J0D01*
|
||||
G01*
|
||||
X541500Y620350D01*
|
||||
G01*
|
||||
X929500Y633350D02*
|
||||
G75*
|
||||
G02*
|
||||
X941500Y633350I6000J0D01*
|
||||
G01*
|
||||
X941500Y620350D01*
|
||||
G02*
|
||||
X929500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X929500Y633350D01*
|
||||
G01*
|
||||
X412500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X412500Y416650D01*
|
||||
G03*
|
||||
X424500Y416650I6000J0D01*
|
||||
G01*
|
||||
X424500Y429650D01*
|
||||
G03*
|
||||
X412500Y429650I-6000J0D01*
|
||||
G01*
|
||||
X224500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X224500Y633350D01*
|
||||
G03*
|
||||
X212500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X212500Y620350D01*
|
||||
G03*
|
||||
X224500Y620350I6000J0D01*
|
||||
G01*
|
||||
X541500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X529500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X529500Y429650D01*
|
||||
G02*
|
||||
X541500Y429650I6000J0D01*
|
||||
G01*
|
||||
X541500Y416650D01*
|
||||
G01*
|
||||
X129500Y429650D02*
|
||||
G75*
|
||||
G02*
|
||||
X141500Y429650I6000J0D01*
|
||||
G01*
|
||||
X141500Y416650D01*
|
||||
G02*
|
||||
X129500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X129500Y429650D01*
|
||||
G01*
|
||||
X24500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X12500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X12500Y429650D01*
|
||||
G02*
|
||||
X24500Y429650I6000J0D01*
|
||||
G01*
|
||||
X24500Y416650D01*
|
||||
G01*
|
||||
X941500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X929500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X929500Y429650D01*
|
||||
G02*
|
||||
X941500Y429650I6000J0D01*
|
||||
G01*
|
||||
X941500Y416650D01*
|
||||
G01*
|
||||
X424500Y620350D02*
|
||||
G75*
|
||||
G01*
|
||||
X424500Y633350D01*
|
||||
G03*
|
||||
X412500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X412500Y620350D01*
|
||||
G03*
|
||||
X424500Y620350I6000J0D01*
|
||||
G01*
|
||||
X824500Y416650D02*
|
||||
G75*
|
||||
G02*
|
||||
X812500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X812500Y429650D01*
|
||||
G02*
|
||||
X824500Y429650I6000J0D01*
|
||||
G01*
|
||||
X824500Y416650D01*
|
||||
G01*
|
||||
X12500Y633350D02*
|
||||
G75*
|
||||
G01*
|
||||
X12500Y620350D01*
|
||||
G03*
|
||||
X24500Y620350I6000J0D01*
|
||||
G01*
|
||||
X24500Y633350D01*
|
||||
G03*
|
||||
X12500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X660500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X660500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X905500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X905500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X505500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X505500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X860500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X860500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X705500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X705500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X705500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X705500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X660500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X660500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X505500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X505500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X260500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X260500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X905500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X905500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X460500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X460500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X460500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X460500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X60500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X60500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X105500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X105500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X60500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X60500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X305500Y626850D02*
|
||||
G75*
|
||||
G03*
|
||||
X305500Y626850I-6000J0D01*
|
||||
G01*
|
||||
X860500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X860500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X541500Y633350D02*
|
||||
G75*
|
||||
G01*
|
||||
X541500Y620350D01*
|
||||
G02*
|
||||
X529500Y620350I-6000J0D01*
|
||||
G01*
|
||||
X529500Y633350D01*
|
||||
G02*
|
||||
X541500Y633350I6000J0D01*
|
||||
G01*
|
||||
X941500Y429650D02*
|
||||
G75*
|
||||
G01*
|
||||
X941500Y416650D01*
|
||||
G02*
|
||||
X929500Y416650I-6000J0D01*
|
||||
G01*
|
||||
X929500Y429650D01*
|
||||
G02*
|
||||
X941500Y429650I6000J0D01*
|
||||
G01*
|
||||
X260500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X260500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X305500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X305500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X824500Y633350D02*
|
||||
G75*
|
||||
G03*
|
||||
X812500Y633350I-6000J0D01*
|
||||
G01*
|
||||
X812500Y620350D01*
|
||||
G03*
|
||||
X824500Y620350I6000J0D01*
|
||||
G01*
|
||||
X824500Y633350D01*
|
||||
G01*
|
||||
X105500Y423150D02*
|
||||
G75*
|
||||
G03*
|
||||
X105500Y423150I-6000J0D01*
|
||||
G01*
|
||||
X217000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X237000Y580000I0J20000D01*
|
||||
G03*
|
||||
X217000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X200000Y600000D01*
|
||||
G01*
|
||||
X200000Y700000D01*
|
||||
G03*
|
||||
X180000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X174000Y720000D01*
|
||||
G03*
|
||||
X154000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X154000Y600000D01*
|
||||
G01*
|
||||
X137000Y600000D01*
|
||||
G03*
|
||||
X117000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X137000Y560000I20000J0D01*
|
||||
G01*
|
||||
X217000Y560000D01*
|
||||
G01*
|
||||
X417000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X437000Y580000I0J20000D01*
|
||||
G03*
|
||||
X417000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X400000Y600000D01*
|
||||
G01*
|
||||
X400000Y700000D01*
|
||||
G03*
|
||||
X380000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X374000Y720000D01*
|
||||
G03*
|
||||
X354000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X354000Y600000D01*
|
||||
G01*
|
||||
X337000Y600000D01*
|
||||
G03*
|
||||
X317000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X337000Y560000I20000J0D01*
|
||||
G01*
|
||||
X417000Y560000D01*
|
||||
G01*
|
||||
X617000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X637000Y580000I0J20000D01*
|
||||
G03*
|
||||
X617000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X600000Y600000D01*
|
||||
G01*
|
||||
X600000Y700000D01*
|
||||
G03*
|
||||
X580000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X574000Y720000D01*
|
||||
G03*
|
||||
X554000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X554000Y600000D01*
|
||||
G01*
|
||||
X537000Y600000D01*
|
||||
G03*
|
||||
X517000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X537000Y560000I20000J0D01*
|
||||
G01*
|
||||
X617000Y560000D01*
|
||||
G01*
|
||||
X817000Y560000D02*
|
||||
G75*
|
||||
G03*
|
||||
X837000Y580000I0J20000D01*
|
||||
G03*
|
||||
X817000Y600000I-20000J0D01*
|
||||
G01*
|
||||
X800000Y600000D01*
|
||||
G01*
|
||||
X800000Y700000D01*
|
||||
G03*
|
||||
X780000Y720000I-20000J0D01*
|
||||
G01*
|
||||
X774000Y720000D01*
|
||||
G03*
|
||||
X754000Y700000I0J-20000D01*
|
||||
G01*
|
||||
X754000Y600000D01*
|
||||
G01*
|
||||
X737000Y600000D01*
|
||||
G03*
|
||||
X717000Y580000I0J-20000D01*
|
||||
G03*
|
||||
X737000Y560000I20000J0D01*
|
||||
G01*
|
||||
X817000Y560000D01*
|
||||
G01*
|
||||
X180000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X200000Y350000I0J20000D01*
|
||||
G01*
|
||||
X200000Y450000D01*
|
||||
G01*
|
||||
X217000Y450000D01*
|
||||
G03*
|
||||
X237000Y470000I0J20000D01*
|
||||
G03*
|
||||
X217000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X137000Y490000D01*
|
||||
G03*
|
||||
X117000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X137000Y450000I20000J0D01*
|
||||
G01*
|
||||
X154000Y450000D01*
|
||||
G01*
|
||||
X154000Y350000D01*
|
||||
G03*
|
||||
X174000Y330000I20000J0D01*
|
||||
G01*
|
||||
X180000Y330000D01*
|
||||
G01*
|
||||
X380000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X400000Y350000I0J20000D01*
|
||||
G01*
|
||||
X400000Y450000D01*
|
||||
G01*
|
||||
X417000Y450000D01*
|
||||
G03*
|
||||
X437000Y470000I0J20000D01*
|
||||
G03*
|
||||
X417000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X337000Y490000D01*
|
||||
G03*
|
||||
X317000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X337000Y450000I20000J0D01*
|
||||
G01*
|
||||
X354000Y450000D01*
|
||||
G01*
|
||||
X354000Y350000D01*
|
||||
G03*
|
||||
X374000Y330000I20000J0D01*
|
||||
G01*
|
||||
X380000Y330000D01*
|
||||
G01*
|
||||
X580000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X600000Y350000I0J20000D01*
|
||||
G01*
|
||||
X600000Y450000D01*
|
||||
G01*
|
||||
X617000Y450000D01*
|
||||
G03*
|
||||
X637000Y470000I0J20000D01*
|
||||
G03*
|
||||
X617000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X537000Y490000D01*
|
||||
G03*
|
||||
X517000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X537000Y450000I20000J0D01*
|
||||
G01*
|
||||
X554000Y450000D01*
|
||||
G01*
|
||||
X554000Y350000D01*
|
||||
G03*
|
||||
X574000Y330000I20000J0D01*
|
||||
G01*
|
||||
X580000Y330000D01*
|
||||
G01*
|
||||
X780000Y330000D02*
|
||||
G75*
|
||||
G03*
|
||||
X800000Y350000I0J20000D01*
|
||||
G01*
|
||||
X800000Y450000D01*
|
||||
G01*
|
||||
X817000Y450000D01*
|
||||
G03*
|
||||
X837000Y470000I0J20000D01*
|
||||
G03*
|
||||
X817000Y490000I-20000J0D01*
|
||||
G01*
|
||||
X737000Y490000D01*
|
||||
G03*
|
||||
X717000Y470000I0J-20000D01*
|
||||
G03*
|
||||
X737000Y450000I20000J0D01*
|
||||
G01*
|
||||
X754000Y450000D01*
|
||||
G01*
|
||||
X754000Y350000D01*
|
||||
G03*
|
||||
X774000Y330000I20000J0D01*
|
||||
G01*
|
||||
X780000Y330000D01*
|
||||
G37*
|
||||
M02*
|
||||
93
tests/expects/dxf_offset.gtl
Normal file
93
tests/expects/dxf_offset.gtl
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X910000Y900000D02*
|
||||
G75*
|
||||
G01*
|
||||
X910000Y400000D01*
|
||||
G01*
|
||||
X1010000Y900000D02*
|
||||
G75*
|
||||
G01*
|
||||
X1010000Y400000D01*
|
||||
G01*
|
||||
X310000Y379390D02*
|
||||
G75*
|
||||
G01*
|
||||
X435827Y379390D01*
|
||||
G01*
|
||||
X435827Y228443D01*
|
||||
G01*
|
||||
X510000Y50000D02*
|
||||
G75*
|
||||
G01*
|
||||
X210000Y50000D01*
|
||||
G02*
|
||||
X110000Y150000I0J100000D01*
|
||||
G01*
|
||||
X110000Y450000D01*
|
||||
G02*
|
||||
X210000Y550000I100000J0D01*
|
||||
G01*
|
||||
X510000Y550000D01*
|
||||
G02*
|
||||
X610000Y450000I0J-100000D01*
|
||||
G01*
|
||||
X610000Y150000D01*
|
||||
G02*
|
||||
X510000Y50000I-100000J0D01*
|
||||
G01*
|
||||
X852704Y800394D02*
|
||||
G75*
|
||||
G01*
|
||||
X852704Y500394D01*
|
||||
G02*
|
||||
X752704Y400394I-100000J0D01*
|
||||
G01*
|
||||
X452704Y400394D01*
|
||||
G02*
|
||||
X352704Y500394I0J100000D01*
|
||||
G01*
|
||||
X352704Y800394D01*
|
||||
G02*
|
||||
X452704Y900394I100000J0D01*
|
||||
G01*
|
||||
X752704Y900394D01*
|
||||
G02*
|
||||
X852704Y800394I0J-100000D01*
|
||||
G01*
|
||||
X492038Y472062D02*
|
||||
G75*
|
||||
G01*
|
||||
X244512Y472062D01*
|
||||
G01*
|
||||
X244512Y185960D01*
|
||||
G01*
|
||||
X492038Y185960D01*
|
||||
G01*
|
||||
X492038Y472062D01*
|
||||
G01*
|
||||
X1037009Y176316D02*
|
||||
G75*
|
||||
G03*
|
||||
X1037009Y176316I-125463J0D01*
|
||||
G01*
|
||||
X712773Y700000D02*
|
||||
G75*
|
||||
G03*
|
||||
X712773Y700000I-102773J0D01*
|
||||
G01*
|
||||
X610000Y700000D02*
|
||||
G75*
|
||||
G01*
|
||||
X610000Y764592D01*
|
||||
G03*
|
||||
X672602Y684088I0J-64592D01*
|
||||
G01*
|
||||
X610000Y700000D01*
|
||||
M02*
|
||||
19
tests/expects/dxf_rectangle_inch.gtl
Normal file
19
tests/expects/dxf_rectangle_inch.gtl
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
%MOIN*%
|
||||
%FSLAX25Y25*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X0Y39370D02*
|
||||
G75*
|
||||
G01*
|
||||
X0Y0D01*
|
||||
G01*
|
||||
X39370Y0D01*
|
||||
G01*
|
||||
X39370Y39370D01*
|
||||
G01*
|
||||
X0Y39370D01*
|
||||
M02*
|
||||
19
tests/expects/dxf_rectangle_metric.gtl
Normal file
19
tests/expects/dxf_rectangle_metric.gtl
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X0Y100000D02*
|
||||
G75*
|
||||
G01*
|
||||
X0Y0D01*
|
||||
G01*
|
||||
X100000Y0D01*
|
||||
G01*
|
||||
X100000Y100000D01*
|
||||
G01*
|
||||
X0Y100000D01*
|
||||
M02*
|
||||
93
tests/expects/dxf_rotate.gtl
Normal file
93
tests/expects/dxf_rotate.gtl
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X501270Y1044184D02*
|
||||
G75*
|
||||
G01*
|
||||
X672280Y574337D01*
|
||||
G01*
|
||||
X595239Y1078386D02*
|
||||
G75*
|
||||
G01*
|
||||
X766249Y608539D01*
|
||||
G01*
|
||||
X115513Y349758D02*
|
||||
G75*
|
||||
G01*
|
||||
X233752Y392793D01*
|
||||
G01*
|
||||
X285379Y250949D01*
|
||||
G01*
|
||||
X416110Y108637D02*
|
||||
G75*
|
||||
G01*
|
||||
X134202Y6031D01*
|
||||
G02*
|
||||
X6031Y65798I-34202J93969D01*
|
||||
G01*
|
||||
X-96575Y347706D01*
|
||||
G02*
|
||||
X-36808Y475877I93969J34202D01*
|
||||
G01*
|
||||
X245100Y578483D01*
|
||||
G02*
|
||||
X373271Y518716I34202J-93969D01*
|
||||
G01*
|
||||
X475877Y236808D01*
|
||||
G02*
|
||||
X416110Y108637I-93969J-34202D01*
|
||||
G01*
|
||||
X481496Y930988D02*
|
||||
G75*
|
||||
G01*
|
||||
X584102Y649080D01*
|
||||
G02*
|
||||
X524335Y520909I-93969J-34202D01*
|
||||
G01*
|
||||
X242427Y418303D01*
|
||||
G02*
|
||||
X114256Y478070I-34202J93969D01*
|
||||
G01*
|
||||
X11650Y759978D01*
|
||||
G02*
|
||||
X71417Y888149I93969J34202D01*
|
||||
G01*
|
||||
X353325Y990755D01*
|
||||
G02*
|
||||
X481496Y930988I34202J-93969D01*
|
||||
G01*
|
||||
X254877Y499102D02*
|
||||
G75*
|
||||
G01*
|
||||
X22279Y414443D01*
|
||||
G01*
|
||||
X120131Y145595D01*
|
||||
G01*
|
||||
X352730Y230254D01*
|
||||
G01*
|
||||
X254877Y499102D01*
|
||||
G01*
|
||||
X868133Y407583D02*
|
||||
G75*
|
||||
G03*
|
||||
X868133Y407583I-117896J-42911D01*
|
||||
G01*
|
||||
X384341Y788789D02*
|
||||
G75*
|
||||
G03*
|
||||
X384341Y788789I-96575J-35150D01*
|
||||
G01*
|
||||
X287766Y753639D02*
|
||||
G75*
|
||||
G01*
|
||||
X265674Y814336D01*
|
||||
G03*
|
||||
X352035Y760098I22092J-60697D01*
|
||||
G01*
|
||||
X287766Y753639D01*
|
||||
M02*
|
||||
84
tests/expects/dxf_save_fill.gtl
Normal file
84
tests/expects/dxf_save_fill.gtl
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G36*
|
||||
G01*
|
||||
X400000Y0D02*
|
||||
G75*
|
||||
G01*
|
||||
X100000Y0D01*
|
||||
G02*
|
||||
X0Y100000I0J100000D01*
|
||||
G01*
|
||||
X0Y400000D01*
|
||||
G02*
|
||||
X100000Y500000I100000J0D01*
|
||||
G01*
|
||||
X400000Y500000D01*
|
||||
G02*
|
||||
X500000Y400000I0J-100000D01*
|
||||
G01*
|
||||
X500000Y100000D01*
|
||||
G02*
|
||||
X400000Y0I-100000J0D01*
|
||||
G01*
|
||||
X742704Y750394D02*
|
||||
G75*
|
||||
G01*
|
||||
X742704Y450394D01*
|
||||
G02*
|
||||
X642704Y350394I-100000J0D01*
|
||||
G01*
|
||||
X342704Y350394D01*
|
||||
G02*
|
||||
X242704Y450394I0J100000D01*
|
||||
G01*
|
||||
X242704Y750394D01*
|
||||
G02*
|
||||
X342704Y850394I100000J0D01*
|
||||
G01*
|
||||
X642704Y850394D01*
|
||||
G02*
|
||||
X742704Y750394I0J-100000D01*
|
||||
G01*
|
||||
X927009Y126316D02*
|
||||
G75*
|
||||
G03*
|
||||
X927009Y126316I-125463J0D01*
|
||||
G37*
|
||||
%LPC*%
|
||||
G36*
|
||||
G01*
|
||||
X382038Y422062D02*
|
||||
G75*
|
||||
G01*
|
||||
X134512Y422062D01*
|
||||
G01*
|
||||
X134512Y135960D01*
|
||||
G01*
|
||||
X382038Y135960D01*
|
||||
G01*
|
||||
X382038Y422062D01*
|
||||
G01*
|
||||
X602773Y650000D02*
|
||||
G75*
|
||||
G03*
|
||||
X602773Y650000I-102773J0D01*
|
||||
G37*
|
||||
%LPD*%
|
||||
G36*
|
||||
G01*
|
||||
X500000Y650000D02*
|
||||
G75*
|
||||
G01*
|
||||
X500000Y714592D01*
|
||||
G03*
|
||||
X562602Y634088I0J-64592D01*
|
||||
G01*
|
||||
X500000Y650000D01*
|
||||
G37*
|
||||
M02*
|
||||
78
tests/expects/dxf_save_fill_simple.gtl
Normal file
78
tests/expects/dxf_save_fill_simple.gtl
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G36*
|
||||
G01*
|
||||
X400000Y0D02*
|
||||
G75*
|
||||
G01*
|
||||
X100000Y0D01*
|
||||
G02*
|
||||
X0Y100000I0J100000D01*
|
||||
G01*
|
||||
X0Y400000D01*
|
||||
G02*
|
||||
X100000Y500000I100000J0D01*
|
||||
G01*
|
||||
X400000Y500000D01*
|
||||
G02*
|
||||
X500000Y400000I0J-100000D01*
|
||||
G01*
|
||||
X500000Y100000D01*
|
||||
G02*
|
||||
X400000Y0I-100000J0D01*
|
||||
G01*
|
||||
X742704Y750394D02*
|
||||
G75*
|
||||
G01*
|
||||
X742704Y450394D01*
|
||||
G02*
|
||||
X642704Y350394I-100000J0D01*
|
||||
G01*
|
||||
X342704Y350394D01*
|
||||
G02*
|
||||
X242704Y450394I0J100000D01*
|
||||
G01*
|
||||
X242704Y750394D01*
|
||||
G02*
|
||||
X342704Y850394I100000J0D01*
|
||||
G01*
|
||||
X642704Y850394D01*
|
||||
G02*
|
||||
X742704Y750394I0J-100000D01*
|
||||
G01*
|
||||
X382038Y422062D02*
|
||||
G75*
|
||||
G01*
|
||||
X134512Y422062D01*
|
||||
G01*
|
||||
X134512Y135960D01*
|
||||
G01*
|
||||
X382038Y135960D01*
|
||||
G01*
|
||||
X382038Y422062D01*
|
||||
G01*
|
||||
X927009Y126316D02*
|
||||
G75*
|
||||
G03*
|
||||
X927009Y126316I-125463J0D01*
|
||||
G01*
|
||||
X602773Y650000D02*
|
||||
G75*
|
||||
G03*
|
||||
X602773Y650000I-102773J0D01*
|
||||
G01*
|
||||
X500000Y650000D02*
|
||||
G75*
|
||||
G01*
|
||||
X500000Y714592D01*
|
||||
G03*
|
||||
X562602Y634088I0J-64592D01*
|
||||
G01*
|
||||
X500000Y650000D01*
|
||||
G37*
|
||||
M02*
|
||||
93
tests/expects/dxf_save_line.gtl
Normal file
93
tests/expects/dxf_save_line.gtl
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0.2*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X800000Y850000D02*
|
||||
G75*
|
||||
G01*
|
||||
X800000Y350000D01*
|
||||
G01*
|
||||
X900000Y850000D02*
|
||||
G75*
|
||||
G01*
|
||||
X900000Y350000D01*
|
||||
G01*
|
||||
X200000Y329390D02*
|
||||
G75*
|
||||
G01*
|
||||
X325827Y329390D01*
|
||||
G01*
|
||||
X325827Y178443D01*
|
||||
G01*
|
||||
X400000Y0D02*
|
||||
G75*
|
||||
G01*
|
||||
X100000Y0D01*
|
||||
G02*
|
||||
X0Y100000I0J100000D01*
|
||||
G01*
|
||||
X0Y400000D01*
|
||||
G02*
|
||||
X100000Y500000I100000J0D01*
|
||||
G01*
|
||||
X400000Y500000D01*
|
||||
G02*
|
||||
X500000Y400000I0J-100000D01*
|
||||
G01*
|
||||
X500000Y100000D01*
|
||||
G02*
|
||||
X400000Y0I-100000J0D01*
|
||||
G01*
|
||||
X742704Y750394D02*
|
||||
G75*
|
||||
G01*
|
||||
X742704Y450394D01*
|
||||
G02*
|
||||
X642704Y350394I-100000J0D01*
|
||||
G01*
|
||||
X342704Y350394D01*
|
||||
G02*
|
||||
X242704Y450394I0J100000D01*
|
||||
G01*
|
||||
X242704Y750394D01*
|
||||
G02*
|
||||
X342704Y850394I100000J0D01*
|
||||
G01*
|
||||
X642704Y850394D01*
|
||||
G02*
|
||||
X742704Y750394I0J-100000D01*
|
||||
G01*
|
||||
X382038Y422062D02*
|
||||
G75*
|
||||
G01*
|
||||
X134512Y422062D01*
|
||||
G01*
|
||||
X134512Y135960D01*
|
||||
G01*
|
||||
X382038Y135960D01*
|
||||
G01*
|
||||
X382038Y422062D01*
|
||||
G01*
|
||||
X927009Y126316D02*
|
||||
G75*
|
||||
G03*
|
||||
X927009Y126316I-125463J0D01*
|
||||
G01*
|
||||
X602773Y650000D02*
|
||||
G75*
|
||||
G03*
|
||||
X602773Y650000I-102773J0D01*
|
||||
G01*
|
||||
X500000Y650000D02*
|
||||
G75*
|
||||
G01*
|
||||
X500000Y714592D01*
|
||||
G03*
|
||||
X562602Y634088I0J-64592D01*
|
||||
G01*
|
||||
X500000Y650000D01*
|
||||
M02*
|
||||
84
tests/expects/dxf_save_line.txt
Normal file
84
tests/expects/dxf_save_line.txt
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T01C0.200
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T01
|
||||
G00X80000Y85000
|
||||
M15
|
||||
G01X80000Y35000
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X90000Y85000
|
||||
M15
|
||||
G01X90000Y35000
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X20000Y32939
|
||||
M15
|
||||
G01X32583Y32939
|
||||
G01X32583Y17844
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X40000Y0
|
||||
M15
|
||||
G01X10000Y0
|
||||
G02X0Y10000I0J10000
|
||||
G01X0Y40000
|
||||
G02X10000Y50000I10000J0
|
||||
G01X40000Y50000
|
||||
G02X50000Y40000I0J-10000
|
||||
G01X50000Y10000
|
||||
G02X40000Y0I-10000J0
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X74270Y75039
|
||||
M15
|
||||
G01X74270Y45039
|
||||
G02X64270Y35039I-10000J0
|
||||
G01X34270Y35039
|
||||
G02X24270Y45039I0J10000
|
||||
G01X24270Y75039
|
||||
G02X34270Y85039I10000J0
|
||||
G01X64270Y85039
|
||||
G02X74270Y75039I0J-10000
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X38204Y42206
|
||||
M15
|
||||
G01X13451Y42206
|
||||
G01X13451Y13596
|
||||
G01X38204Y13596
|
||||
G01X38204Y42206
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X92701Y12632
|
||||
M15
|
||||
G03X92701Y12632I-12546J0
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X60277Y65000
|
||||
M15
|
||||
G03X60277Y65000I-10277J0
|
||||
M16
|
||||
G05
|
||||
|
||||
G00X50000Y65000
|
||||
M15
|
||||
G01X50000Y71459
|
||||
G03X56260Y63409I0J-6459
|
||||
G01X50000Y65000
|
||||
M16
|
||||
G05
|
||||
|
||||
M30
|
||||
582
tests/expects/dxf_save_mousebites.gtl
Normal file
582
tests/expects/dxf_save_mousebites.gtl
Normal file
|
|
@ -0,0 +1,582 @@
|
|||
%MOMM*%
|
||||
%FSLAX34Y34*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0.5*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
X800000Y850000D03*
|
||||
X800000Y836000D03*
|
||||
X800000Y822000D03*
|
||||
X800000Y808000D03*
|
||||
X800000Y794000D03*
|
||||
X800000Y780000D03*
|
||||
X800000Y766000D03*
|
||||
X800000Y752000D03*
|
||||
X800000Y738000D03*
|
||||
X800000Y724000D03*
|
||||
X800000Y710000D03*
|
||||
X800000Y696000D03*
|
||||
X800000Y682000D03*
|
||||
X800000Y668000D03*
|
||||
X800000Y654000D03*
|
||||
X800000Y640000D03*
|
||||
X800000Y626000D03*
|
||||
X800000Y612000D03*
|
||||
X800000Y598000D03*
|
||||
X800000Y584000D03*
|
||||
X800000Y570000D03*
|
||||
X800000Y556000D03*
|
||||
X800000Y542000D03*
|
||||
X800000Y528000D03*
|
||||
X800000Y514000D03*
|
||||
X800000Y500000D03*
|
||||
X800000Y486000D03*
|
||||
X800000Y472000D03*
|
||||
X800000Y458000D03*
|
||||
X800000Y444000D03*
|
||||
X800000Y430000D03*
|
||||
X800000Y416000D03*
|
||||
X800000Y402000D03*
|
||||
X800000Y388000D03*
|
||||
X800000Y374000D03*
|
||||
X800000Y360000D03*
|
||||
|
||||
X900000Y850000D03*
|
||||
X900000Y836000D03*
|
||||
X900000Y822000D03*
|
||||
X900000Y808000D03*
|
||||
X900000Y794000D03*
|
||||
X900000Y780000D03*
|
||||
X900000Y766000D03*
|
||||
X900000Y752000D03*
|
||||
X900000Y738000D03*
|
||||
X900000Y724000D03*
|
||||
X900000Y710000D03*
|
||||
X900000Y696000D03*
|
||||
X900000Y682000D03*
|
||||
X900000Y668000D03*
|
||||
X900000Y654000D03*
|
||||
X900000Y640000D03*
|
||||
X900000Y626000D03*
|
||||
X900000Y612000D03*
|
||||
X900000Y598000D03*
|
||||
X900000Y584000D03*
|
||||
X900000Y570000D03*
|
||||
X900000Y556000D03*
|
||||
X900000Y542000D03*
|
||||
X900000Y528000D03*
|
||||
X900000Y514000D03*
|
||||
X900000Y500000D03*
|
||||
X900000Y486000D03*
|
||||
X900000Y472000D03*
|
||||
X900000Y458000D03*
|
||||
X900000Y444000D03*
|
||||
X900000Y430000D03*
|
||||
X900000Y416000D03*
|
||||
X900000Y402000D03*
|
||||
X900000Y388000D03*
|
||||
X900000Y374000D03*
|
||||
X900000Y360000D03*
|
||||
|
||||
X200000Y329390D03*
|
||||
X214000Y329390D03*
|
||||
X228000Y329390D03*
|
||||
X242000Y329390D03*
|
||||
X256000Y329390D03*
|
||||
X270000Y329390D03*
|
||||
X284000Y329390D03*
|
||||
X298000Y329390D03*
|
||||
X312000Y329390D03*
|
||||
X325827Y329217D03*
|
||||
X325827Y315217D03*
|
||||
X325827Y301217D03*
|
||||
X325827Y287217D03*
|
||||
X325827Y273217D03*
|
||||
X325827Y259217D03*
|
||||
X325827Y245217D03*
|
||||
X325827Y231217D03*
|
||||
X325827Y217217D03*
|
||||
X325827Y203217D03*
|
||||
X325827Y189217D03*
|
||||
|
||||
X400000Y0D03*
|
||||
X386000Y0D03*
|
||||
X372000Y0D03*
|
||||
X358000Y0D03*
|
||||
X344000Y0D03*
|
||||
X330000Y0D03*
|
||||
X316000Y0D03*
|
||||
X302000Y0D03*
|
||||
X288000Y0D03*
|
||||
X274000Y0D03*
|
||||
X260000Y0D03*
|
||||
X246000Y0D03*
|
||||
X232000Y0D03*
|
||||
X218000Y0D03*
|
||||
X204000Y0D03*
|
||||
X190000Y0D03*
|
||||
X176000Y0D03*
|
||||
X162000Y0D03*
|
||||
X148000Y0D03*
|
||||
X134000Y0D03*
|
||||
X120000Y0D03*
|
||||
X106000Y0D03*
|
||||
X92009Y320D03*
|
||||
X78177Y2410D03*
|
||||
X64773Y6410D03*
|
||||
X52057Y12242D03*
|
||||
X40280Y19790D03*
|
||||
X29672Y28909D03*
|
||||
X20440Y39418D03*
|
||||
X12764Y51113D03*
|
||||
X6796Y63764D03*
|
||||
X2652Y77125D03*
|
||||
X412Y90933D03*
|
||||
X0Y104920D03*
|
||||
X0Y118920D03*
|
||||
X0Y132920D03*
|
||||
X0Y146920D03*
|
||||
X0Y160920D03*
|
||||
X0Y174920D03*
|
||||
X0Y188920D03*
|
||||
X0Y202920D03*
|
||||
X0Y216920D03*
|
||||
X0Y230920D03*
|
||||
X0Y244920D03*
|
||||
X0Y258920D03*
|
||||
X0Y272920D03*
|
||||
X0Y286920D03*
|
||||
X0Y300920D03*
|
||||
X0Y314920D03*
|
||||
X0Y328920D03*
|
||||
X0Y342920D03*
|
||||
X0Y356920D03*
|
||||
X0Y370920D03*
|
||||
X0Y384920D03*
|
||||
X0Y398920D03*
|
||||
X834Y412884D03*
|
||||
X3602Y426596D03*
|
||||
X8256Y439788D03*
|
||||
X14706Y452201D03*
|
||||
X22825Y463592D03*
|
||||
X32454Y473739D03*
|
||||
X43404Y482444D03*
|
||||
X55463Y489534D03*
|
||||
X68392Y494873D03*
|
||||
X81940Y498356D03*
|
||||
X95842Y499914D03*
|
||||
X109841Y500000D03*
|
||||
X123841Y500000D03*
|
||||
X137841Y500000D03*
|
||||
X151841Y500000D03*
|
||||
X165841Y500000D03*
|
||||
X179841Y500000D03*
|
||||
X193841Y500000D03*
|
||||
X207841Y500000D03*
|
||||
X221841Y500000D03*
|
||||
X235841Y500000D03*
|
||||
X249841Y500000D03*
|
||||
X263841Y500000D03*
|
||||
X277841Y500000D03*
|
||||
X291841Y500000D03*
|
||||
X305841Y500000D03*
|
||||
X319841Y500000D03*
|
||||
X333841Y500000D03*
|
||||
X347841Y500000D03*
|
||||
X361841Y500000D03*
|
||||
X375841Y500000D03*
|
||||
X389841Y500000D03*
|
||||
X403840Y499926D03*
|
||||
X417746Y498413D03*
|
||||
X431305Y494974D03*
|
||||
X444252Y489676D03*
|
||||
X456333Y482623D03*
|
||||
X467311Y473954D03*
|
||||
X476972Y463838D03*
|
||||
X485127Y452472D03*
|
||||
X491617Y440080D03*
|
||||
X496313Y426903D03*
|
||||
X499125Y413200D03*
|
||||
X500000Y399239D03*
|
||||
X500000Y385239D03*
|
||||
X500000Y371239D03*
|
||||
X500000Y357239D03*
|
||||
X500000Y343239D03*
|
||||
X500000Y329239D03*
|
||||
X500000Y315239D03*
|
||||
X500000Y301239D03*
|
||||
X500000Y287239D03*
|
||||
X500000Y273239D03*
|
||||
X500000Y259239D03*
|
||||
X500000Y245239D03*
|
||||
X500000Y231239D03*
|
||||
X500000Y217239D03*
|
||||
X500000Y203239D03*
|
||||
X500000Y189239D03*
|
||||
X500000Y175239D03*
|
||||
X500000Y161239D03*
|
||||
X500000Y147239D03*
|
||||
X500000Y133239D03*
|
||||
X500000Y119239D03*
|
||||
X500000Y105239D03*
|
||||
X499616Y91250D03*
|
||||
X497421Y77435D03*
|
||||
X493319Y64061D03*
|
||||
X487391Y51391D03*
|
||||
X479753Y39672D03*
|
||||
X470554Y29133D03*
|
||||
X459975Y19981D03*
|
||||
X448222Y12395D03*
|
||||
X435525Y6523D03*
|
||||
X422134Y2480D03*
|
||||
X408309Y346D03*
|
||||
|
||||
X742704Y750394D03*
|
||||
X742704Y736394D03*
|
||||
X742704Y722394D03*
|
||||
X742704Y708394D03*
|
||||
X742704Y694394D03*
|
||||
X742704Y680394D03*
|
||||
X742704Y666394D03*
|
||||
X742704Y652394D03*
|
||||
X742704Y638394D03*
|
||||
X742704Y624394D03*
|
||||
X742704Y610394D03*
|
||||
X742704Y596394D03*
|
||||
X742704Y582394D03*
|
||||
X742704Y568394D03*
|
||||
X742704Y554394D03*
|
||||
X742704Y540394D03*
|
||||
X742704Y526394D03*
|
||||
X742704Y512394D03*
|
||||
X742704Y498394D03*
|
||||
X742704Y484394D03*
|
||||
X742704Y470394D03*
|
||||
X742704Y456394D03*
|
||||
X742384Y442402D03*
|
||||
X740294Y428571D03*
|
||||
X736294Y415167D03*
|
||||
X730462Y402451D03*
|
||||
X722914Y390674D03*
|
||||
X713795Y380066D03*
|
||||
X703286Y370834D03*
|
||||
X691591Y363158D03*
|
||||
X678940Y357190D03*
|
||||
X665579Y353045D03*
|
||||
X651771Y350806D03*
|
||||
X637784Y350394D03*
|
||||
X623784Y350394D03*
|
||||
X609784Y350394D03*
|
||||
X595784Y350394D03*
|
||||
X581784Y350394D03*
|
||||
X567784Y350394D03*
|
||||
X553784Y350394D03*
|
||||
X539784Y350394D03*
|
||||
X525784Y350394D03*
|
||||
X511784Y350394D03*
|
||||
X497784Y350394D03*
|
||||
X483784Y350394D03*
|
||||
X469784Y350394D03*
|
||||
X455784Y350394D03*
|
||||
X441784Y350394D03*
|
||||
X427784Y350394D03*
|
||||
X413784Y350394D03*
|
||||
X399784Y350394D03*
|
||||
X385784Y350394D03*
|
||||
X371784Y350394D03*
|
||||
X357784Y350394D03*
|
||||
X343784Y350394D03*
|
||||
X329820Y351227D03*
|
||||
X316108Y353996D03*
|
||||
X302916Y358650D03*
|
||||
X290503Y365100D03*
|
||||
X279112Y373219D03*
|
||||
X268965Y382848D03*
|
||||
X260261Y393798D03*
|
||||
X253170Y405856D03*
|
||||
X247831Y418786D03*
|
||||
X244348Y432334D03*
|
||||
X242791Y446236D03*
|
||||
X242704Y460235D03*
|
||||
X242704Y474235D03*
|
||||
X242704Y488235D03*
|
||||
X242704Y502235D03*
|
||||
X242704Y516235D03*
|
||||
X242704Y530235D03*
|
||||
X242704Y544235D03*
|
||||
X242704Y558235D03*
|
||||
X242704Y572235D03*
|
||||
X242704Y586235D03*
|
||||
X242704Y600235D03*
|
||||
X242704Y614235D03*
|
||||
X242704Y628235D03*
|
||||
X242704Y642235D03*
|
||||
X242704Y656235D03*
|
||||
X242704Y670235D03*
|
||||
X242704Y684235D03*
|
||||
X242704Y698235D03*
|
||||
X242704Y712235D03*
|
||||
X242704Y726235D03*
|
||||
X242704Y740235D03*
|
||||
X242778Y754234D03*
|
||||
X244291Y768140D03*
|
||||
X247731Y781699D03*
|
||||
X253028Y794646D03*
|
||||
X260081Y806727D03*
|
||||
X268750Y817705D03*
|
||||
X278866Y827366D03*
|
||||
X290232Y835521D03*
|
||||
X302624Y842011D03*
|
||||
X315801Y846707D03*
|
||||
X329504Y849519D03*
|
||||
X343465Y850394D03*
|
||||
X357465Y850394D03*
|
||||
X371465Y850394D03*
|
||||
X385465Y850394D03*
|
||||
X399465Y850394D03*
|
||||
X413465Y850394D03*
|
||||
X427465Y850394D03*
|
||||
X441465Y850394D03*
|
||||
X455465Y850394D03*
|
||||
X469465Y850394D03*
|
||||
X483465Y850394D03*
|
||||
X497465Y850394D03*
|
||||
X511465Y850394D03*
|
||||
X525465Y850394D03*
|
||||
X539465Y850394D03*
|
||||
X553465Y850394D03*
|
||||
X567465Y850394D03*
|
||||
X581465Y850394D03*
|
||||
X595465Y850394D03*
|
||||
X609465Y850394D03*
|
||||
X623465Y850394D03*
|
||||
X637465Y850394D03*
|
||||
X651454Y850010D03*
|
||||
X665269Y847815D03*
|
||||
X678643Y843713D03*
|
||||
X691313Y837785D03*
|
||||
X703032Y830147D03*
|
||||
X713571Y820948D03*
|
||||
X722723Y810369D03*
|
||||
X730309Y798616D03*
|
||||
X736181Y785919D03*
|
||||
X740224Y772528D03*
|
||||
X742358Y758703D03*
|
||||
|
||||
X382038Y422062D03*
|
||||
X368038Y422062D03*
|
||||
X354038Y422062D03*
|
||||
X340038Y422062D03*
|
||||
X326038Y422062D03*
|
||||
X312038Y422062D03*
|
||||
X298038Y422062D03*
|
||||
X284038Y422062D03*
|
||||
X270038Y422062D03*
|
||||
X256038Y422062D03*
|
||||
X242038Y422062D03*
|
||||
X228038Y422062D03*
|
||||
X214038Y422062D03*
|
||||
X200038Y422062D03*
|
||||
X186038Y422062D03*
|
||||
X172038Y422062D03*
|
||||
X158038Y422062D03*
|
||||
X144038Y422062D03*
|
||||
X134512Y417588D03*
|
||||
X134512Y403588D03*
|
||||
X134512Y389588D03*
|
||||
X134512Y375588D03*
|
||||
X134512Y361588D03*
|
||||
X134512Y347588D03*
|
||||
X134512Y333588D03*
|
||||
X134512Y319588D03*
|
||||
X134512Y305588D03*
|
||||
X134512Y291588D03*
|
||||
X134512Y277588D03*
|
||||
X134512Y263588D03*
|
||||
X134512Y249588D03*
|
||||
X134512Y235588D03*
|
||||
X134512Y221588D03*
|
||||
X134512Y207588D03*
|
||||
X134512Y193588D03*
|
||||
X134512Y179588D03*
|
||||
X134512Y165588D03*
|
||||
X134512Y151588D03*
|
||||
X134512Y137588D03*
|
||||
X146884Y135960D03*
|
||||
X160884Y135960D03*
|
||||
X174884Y135960D03*
|
||||
X188884Y135960D03*
|
||||
X202884Y135960D03*
|
||||
X216884Y135960D03*
|
||||
X230884Y135960D03*
|
||||
X244884Y135960D03*
|
||||
X258884Y135960D03*
|
||||
X272884Y135960D03*
|
||||
X286884Y135960D03*
|
||||
X300884Y135960D03*
|
||||
X314884Y135960D03*
|
||||
X328884Y135960D03*
|
||||
X342884Y135960D03*
|
||||
X356884Y135960D03*
|
||||
X370884Y135960D03*
|
||||
X382038Y138807D03*
|
||||
X382038Y152807D03*
|
||||
X382038Y166807D03*
|
||||
X382038Y180807D03*
|
||||
X382038Y194807D03*
|
||||
X382038Y208807D03*
|
||||
X382038Y222807D03*
|
||||
X382038Y236807D03*
|
||||
X382038Y250807D03*
|
||||
X382038Y264807D03*
|
||||
X382038Y278807D03*
|
||||
X382038Y292807D03*
|
||||
X382038Y306807D03*
|
||||
X382038Y320807D03*
|
||||
X382038Y334807D03*
|
||||
X382038Y348807D03*
|
||||
X382038Y362807D03*
|
||||
X382038Y376807D03*
|
||||
X382038Y390807D03*
|
||||
X382038Y404807D03*
|
||||
X382038Y418807D03*
|
||||
|
||||
X927009Y126316D03*
|
||||
X926228Y140287D03*
|
||||
X923897Y154085D03*
|
||||
X920044Y167536D03*
|
||||
X914717Y180475D03*
|
||||
X907982Y192741D03*
|
||||
X899924Y204180D03*
|
||||
X890641Y214651D03*
|
||||
X880251Y224022D03*
|
||||
X868881Y232179D03*
|
||||
X856674Y239019D03*
|
||||
X843781Y244457D03*
|
||||
X830363Y248425D03*
|
||||
X816586Y250874D03*
|
||||
X802622Y251774D03*
|
||||
X788645Y251114D03*
|
||||
X774828Y248901D03*
|
||||
X761344Y245164D03*
|
||||
X748360Y239948D03*
|
||||
X736037Y233319D03*
|
||||
X724529Y225358D03*
|
||||
X713979Y216166D03*
|
||||
X704519Y205856D03*
|
||||
X696265Y194557D03*
|
||||
X689321Y182409D03*
|
||||
X683773Y169563D03*
|
||||
X679689Y156179D03*
|
||||
X677122Y142424D03*
|
||||
X676102Y128469D03*
|
||||
X676642Y114486D03*
|
||||
X678737Y100651D03*
|
||||
X682358Y87135D03*
|
||||
X687463Y74107D03*
|
||||
X693986Y61728D03*
|
||||
X701847Y50152D03*
|
||||
X710949Y39524D03*
|
||||
X721177Y29975D03*
|
||||
X732405Y21625D03*
|
||||
X744493Y14576D03*
|
||||
X757291Y8918D03*
|
||||
X770639Y4720D03*
|
||||
X784372Y2035D03*
|
||||
X798318Y895D03*
|
||||
X812304Y1316D03*
|
||||
X826157Y3291D03*
|
||||
X839703Y6797D03*
|
||||
X852775Y11789D03*
|
||||
X865210Y18206D03*
|
||||
X876852Y25968D03*
|
||||
X887558Y34978D03*
|
||||
X897195Y45124D03*
|
||||
X905641Y56280D03*
|
||||
X912793Y68307D03*
|
||||
X918560Y81056D03*
|
||||
X922873Y94367D03*
|
||||
X925676Y108077D03*
|
||||
X926935Y122013D03*
|
||||
|
||||
X602773Y650000D03*
|
||||
X601821Y663957D03*
|
||||
X598982Y677655D03*
|
||||
X594309Y690841D03*
|
||||
X587889Y703270D03*
|
||||
X579841Y714712D03*
|
||||
X570313Y724955D03*
|
||||
X559483Y733809D03*
|
||||
X547550Y741111D03*
|
||||
X534737Y746724D03*
|
||||
X521280Y750545D03*
|
||||
X507428Y752504D03*
|
||||
X493439Y752563D03*
|
||||
X479572Y750722D03*
|
||||
X466083Y747015D03*
|
||||
X453222Y741510D03*
|
||||
X441228Y734310D03*
|
||||
X430323Y725547D03*
|
||||
X420709Y715385D03*
|
||||
X412565Y704012D03*
|
||||
X406040Y691637D03*
|
||||
X401256Y678491D03*
|
||||
X398301Y664818D03*
|
||||
X397231Y650870D03*
|
||||
X398065Y636905D03*
|
||||
X400788Y623184D03*
|
||||
X405348Y609959D03*
|
||||
X411663Y597476D03*
|
||||
X419614Y585966D03*
|
||||
X429055Y575643D03*
|
||||
X439810Y566697D03*
|
||||
X451680Y559295D03*
|
||||
X464446Y553573D03*
|
||||
X477870Y549638D03*
|
||||
X491705Y547563D03*
|
||||
X505693Y547385D03*
|
||||
X519575Y549109D03*
|
||||
X533095Y552702D03*
|
||||
X546002Y558098D03*
|
||||
X558056Y565196D03*
|
||||
X569035Y573866D03*
|
||||
X578734Y583946D03*
|
||||
X586975Y595251D03*
|
||||
X593605Y607569D03*
|
||||
X598500Y620674D03*
|
||||
X601570Y634322D03*
|
||||
X602758Y648261D03*
|
||||
|
||||
X500000Y650000D03*
|
||||
X500000Y664000D03*
|
||||
X500000Y678000D03*
|
||||
X500000Y692000D03*
|
||||
X500000Y706000D03*
|
||||
X494599Y714366D03*
|
||||
X480883Y711699D03*
|
||||
X468062Y706144D03*
|
||||
X456736Y697962D03*
|
||||
X447434Y687536D03*
|
||||
X440591Y675353D03*
|
||||
X436529Y661984D03*
|
||||
X435437Y648054D03*
|
||||
X437366Y634216D03*
|
||||
X442226Y621115D03*
|
||||
X449789Y609367D03*
|
||||
X459702Y599520D03*
|
||||
X471501Y592035D03*
|
||||
X484633Y587262D03*
|
||||
X498484Y585425D03*
|
||||
X512407Y586610D03*
|
||||
X525748Y590761D03*
|
||||
X537885Y597685D03*
|
||||
X548249Y607056D03*
|
||||
X556356Y618437D03*
|
||||
X561825Y631294D03*
|
||||
X551844Y636823D03*
|
||||
X538276Y640271D03*
|
||||
X524707Y643720D03*
|
||||
X511139Y647169D03*
|
||||
|
||||
M02*
|
||||
584
tests/expects/dxf_save_mousebites.txt
Normal file
584
tests/expects/dxf_save_mousebites.txt
Normal file
|
|
@ -0,0 +1,584 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T01C0.500
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T01
|
||||
X80000Y85000
|
||||
X80000Y83600
|
||||
X80000Y82200
|
||||
X80000Y80800
|
||||
X80000Y79400
|
||||
X80000Y78000
|
||||
X80000Y76600
|
||||
X80000Y75200
|
||||
X80000Y73800
|
||||
X80000Y72400
|
||||
X80000Y71000
|
||||
X80000Y69600
|
||||
X80000Y68200
|
||||
X80000Y66800
|
||||
X80000Y65400
|
||||
X80000Y64000
|
||||
X80000Y62600
|
||||
X80000Y61200
|
||||
X80000Y59800
|
||||
X80000Y58400
|
||||
X80000Y57000
|
||||
X80000Y55600
|
||||
X80000Y54200
|
||||
X80000Y52800
|
||||
X80000Y51400
|
||||
X80000Y50000
|
||||
X80000Y48600
|
||||
X80000Y47200
|
||||
X80000Y45800
|
||||
X80000Y44400
|
||||
X80000Y43000
|
||||
X80000Y41600
|
||||
X80000Y40200
|
||||
X80000Y38800
|
||||
X80000Y37400
|
||||
X80000Y36000
|
||||
|
||||
X90000Y85000
|
||||
X90000Y83600
|
||||
X90000Y82200
|
||||
X90000Y80800
|
||||
X90000Y79400
|
||||
X90000Y78000
|
||||
X90000Y76600
|
||||
X90000Y75200
|
||||
X90000Y73800
|
||||
X90000Y72400
|
||||
X90000Y71000
|
||||
X90000Y69600
|
||||
X90000Y68200
|
||||
X90000Y66800
|
||||
X90000Y65400
|
||||
X90000Y64000
|
||||
X90000Y62600
|
||||
X90000Y61200
|
||||
X90000Y59800
|
||||
X90000Y58400
|
||||
X90000Y57000
|
||||
X90000Y55600
|
||||
X90000Y54200
|
||||
X90000Y52800
|
||||
X90000Y51400
|
||||
X90000Y50000
|
||||
X90000Y48600
|
||||
X90000Y47200
|
||||
X90000Y45800
|
||||
X90000Y44400
|
||||
X90000Y43000
|
||||
X90000Y41600
|
||||
X90000Y40200
|
||||
X90000Y38800
|
||||
X90000Y37400
|
||||
X90000Y36000
|
||||
|
||||
X20000Y32939
|
||||
X21400Y32939
|
||||
X22800Y32939
|
||||
X24200Y32939
|
||||
X25600Y32939
|
||||
X27000Y32939
|
||||
X28400Y32939
|
||||
X29800Y32939
|
||||
X31200Y32939
|
||||
X32583Y32922
|
||||
X32583Y31522
|
||||
X32583Y30122
|
||||
X32583Y28722
|
||||
X32583Y27322
|
||||
X32583Y25922
|
||||
X32583Y24522
|
||||
X32583Y23122
|
||||
X32583Y21722
|
||||
X32583Y20322
|
||||
X32583Y18922
|
||||
|
||||
X40000Y0
|
||||
X38600Y0
|
||||
X37200Y0
|
||||
X35800Y0
|
||||
X34400Y0
|
||||
X33000Y0
|
||||
X31600Y0
|
||||
X30200Y0
|
||||
X28800Y0
|
||||
X27400Y0
|
||||
X26000Y0
|
||||
X24600Y0
|
||||
X23200Y0
|
||||
X21800Y0
|
||||
X20400Y0
|
||||
X19000Y0
|
||||
X17600Y0
|
||||
X16200Y0
|
||||
X14800Y0
|
||||
X13400Y0
|
||||
X12000Y0
|
||||
X10600Y0
|
||||
X9201Y32
|
||||
X7818Y241
|
||||
X6477Y641
|
||||
X5206Y1224
|
||||
X4028Y1979
|
||||
X2967Y2891
|
||||
X2044Y3942
|
||||
X1276Y5111
|
||||
X680Y6376
|
||||
X265Y7712
|
||||
X41Y9093
|
||||
X0Y10492
|
||||
X0Y11892
|
||||
X0Y13292
|
||||
X0Y14692
|
||||
X0Y16092
|
||||
X0Y17492
|
||||
X0Y18892
|
||||
X0Y20292
|
||||
X0Y21692
|
||||
X0Y23092
|
||||
X0Y24492
|
||||
X0Y25892
|
||||
X0Y27292
|
||||
X0Y28692
|
||||
X0Y30092
|
||||
X0Y31492
|
||||
X0Y32892
|
||||
X0Y34292
|
||||
X0Y35692
|
||||
X0Y37092
|
||||
X0Y38492
|
||||
X0Y39892
|
||||
X83Y41288
|
||||
X360Y42660
|
||||
X826Y43979
|
||||
X1471Y45220
|
||||
X2282Y46359
|
||||
X3245Y47374
|
||||
X4340Y48244
|
||||
X5546Y48953
|
||||
X6839Y49487
|
||||
X8194Y49836
|
||||
X9584Y49991
|
||||
X10984Y50000
|
||||
X12384Y50000
|
||||
X13784Y50000
|
||||
X15184Y50000
|
||||
X16584Y50000
|
||||
X17984Y50000
|
||||
X19384Y50000
|
||||
X20784Y50000
|
||||
X22184Y50000
|
||||
X23584Y50000
|
||||
X24984Y50000
|
||||
X26384Y50000
|
||||
X27784Y50000
|
||||
X29184Y50000
|
||||
X30584Y50000
|
||||
X31984Y50000
|
||||
X33384Y50000
|
||||
X34784Y50000
|
||||
X36184Y50000
|
||||
X37584Y50000
|
||||
X38984Y50000
|
||||
X40384Y49993
|
||||
X41775Y49841
|
||||
X43131Y49497
|
||||
X44425Y48968
|
||||
X45633Y48262
|
||||
X46731Y47395
|
||||
X47697Y46384
|
||||
X48513Y45247
|
||||
X49162Y44008
|
||||
X49631Y42690
|
||||
X49912Y41320
|
||||
X50000Y39924
|
||||
X50000Y38524
|
||||
X50000Y37124
|
||||
X50000Y35724
|
||||
X50000Y34324
|
||||
X50000Y32924
|
||||
X50000Y31524
|
||||
X50000Y30124
|
||||
X50000Y28724
|
||||
X50000Y27324
|
||||
X50000Y25924
|
||||
X50000Y24524
|
||||
X50000Y23124
|
||||
X50000Y21724
|
||||
X50000Y20324
|
||||
X50000Y18924
|
||||
X50000Y17524
|
||||
X50000Y16124
|
||||
X50000Y14724
|
||||
X50000Y13324
|
||||
X50000Y11924
|
||||
X50000Y10524
|
||||
X49962Y9125
|
||||
X49742Y7743
|
||||
X49332Y6406
|
||||
X48739Y5139
|
||||
X47975Y3967
|
||||
X47055Y2913
|
||||
X45997Y1998
|
||||
X44822Y1239
|
||||
X43553Y652
|
||||
X42213Y248
|
||||
X40831Y35
|
||||
|
||||
X74270Y75039
|
||||
X74270Y73639
|
||||
X74270Y72239
|
||||
X74270Y70839
|
||||
X74270Y69439
|
||||
X74270Y68039
|
||||
X74270Y66639
|
||||
X74270Y65239
|
||||
X74270Y63839
|
||||
X74270Y62439
|
||||
X74270Y61039
|
||||
X74270Y59639
|
||||
X74270Y58239
|
||||
X74270Y56839
|
||||
X74270Y55439
|
||||
X74270Y54039
|
||||
X74270Y52639
|
||||
X74270Y51239
|
||||
X74270Y49839
|
||||
X74270Y48439
|
||||
X74270Y47039
|
||||
X74270Y45639
|
||||
X74238Y44240
|
||||
X74029Y42857
|
||||
X73629Y41517
|
||||
X73046Y40245
|
||||
X72291Y39067
|
||||
X71380Y38007
|
||||
X70329Y37083
|
||||
X69159Y36316
|
||||
X67894Y35719
|
||||
X66558Y35305
|
||||
X65177Y35081
|
||||
X63778Y35039
|
||||
X62378Y35039
|
||||
X60978Y35039
|
||||
X59578Y35039
|
||||
X58178Y35039
|
||||
X56778Y35039
|
||||
X55378Y35039
|
||||
X53978Y35039
|
||||
X52578Y35039
|
||||
X51178Y35039
|
||||
X49778Y35039
|
||||
X48378Y35039
|
||||
X46978Y35039
|
||||
X45578Y35039
|
||||
X44178Y35039
|
||||
X42778Y35039
|
||||
X41378Y35039
|
||||
X39978Y35039
|
||||
X38578Y35039
|
||||
X37178Y35039
|
||||
X35778Y35039
|
||||
X34378Y35039
|
||||
X32982Y35123
|
||||
X31611Y35400
|
||||
X30292Y35865
|
||||
X29050Y36510
|
||||
X27911Y37322
|
||||
X26896Y38285
|
||||
X26026Y39380
|
||||
X25317Y40586
|
||||
X24783Y41879
|
||||
X24435Y43233
|
||||
X24279Y44624
|
||||
X24270Y46023
|
||||
X24270Y47423
|
||||
X24270Y48823
|
||||
X24270Y50223
|
||||
X24270Y51623
|
||||
X24270Y53023
|
||||
X24270Y54423
|
||||
X24270Y55823
|
||||
X24270Y57223
|
||||
X24270Y58623
|
||||
X24270Y60023
|
||||
X24270Y61423
|
||||
X24270Y62823
|
||||
X24270Y64223
|
||||
X24270Y65623
|
||||
X24270Y67023
|
||||
X24270Y68423
|
||||
X24270Y69823
|
||||
X24270Y71223
|
||||
X24270Y72623
|
||||
X24270Y74023
|
||||
X24278Y75423
|
||||
X24429Y76814
|
||||
X24773Y78170
|
||||
X25303Y79465
|
||||
X26008Y80673
|
||||
X26875Y81771
|
||||
X27887Y82737
|
||||
X29023Y83552
|
||||
X30262Y84201
|
||||
X31580Y84671
|
||||
X32950Y84952
|
||||
X34347Y85039
|
||||
X35747Y85039
|
||||
X37147Y85039
|
||||
X38547Y85039
|
||||
X39947Y85039
|
||||
X41347Y85039
|
||||
X42747Y85039
|
||||
X44147Y85039
|
||||
X45547Y85039
|
||||
X46947Y85039
|
||||
X48347Y85039
|
||||
X49747Y85039
|
||||
X51147Y85039
|
||||
X52547Y85039
|
||||
X53947Y85039
|
||||
X55347Y85039
|
||||
X56747Y85039
|
||||
X58147Y85039
|
||||
X59547Y85039
|
||||
X60947Y85039
|
||||
X62347Y85039
|
||||
X63747Y85039
|
||||
X65145Y85001
|
||||
X66527Y84781
|
||||
X67864Y84371
|
||||
X69131Y83778
|
||||
X70303Y83015
|
||||
X71357Y82095
|
||||
X72272Y81037
|
||||
X73031Y79862
|
||||
X73618Y78592
|
||||
X74022Y77253
|
||||
X74236Y75870
|
||||
|
||||
X38204Y42206
|
||||
X36804Y42206
|
||||
X35404Y42206
|
||||
X34004Y42206
|
||||
X32604Y42206
|
||||
X31204Y42206
|
||||
X29804Y42206
|
||||
X28404Y42206
|
||||
X27004Y42206
|
||||
X25604Y42206
|
||||
X24204Y42206
|
||||
X22804Y42206
|
||||
X21404Y42206
|
||||
X20004Y42206
|
||||
X18604Y42206
|
||||
X17204Y42206
|
||||
X15804Y42206
|
||||
X14404Y42206
|
||||
X13451Y41759
|
||||
X13451Y40359
|
||||
X13451Y38959
|
||||
X13451Y37559
|
||||
X13451Y36159
|
||||
X13451Y34759
|
||||
X13451Y33359
|
||||
X13451Y31959
|
||||
X13451Y30559
|
||||
X13451Y29159
|
||||
X13451Y27759
|
||||
X13451Y26359
|
||||
X13451Y24959
|
||||
X13451Y23559
|
||||
X13451Y22159
|
||||
X13451Y20759
|
||||
X13451Y19359
|
||||
X13451Y17959
|
||||
X13451Y16559
|
||||
X13451Y15159
|
||||
X13451Y13759
|
||||
X14688Y13596
|
||||
X16088Y13596
|
||||
X17488Y13596
|
||||
X18888Y13596
|
||||
X20288Y13596
|
||||
X21688Y13596
|
||||
X23088Y13596
|
||||
X24488Y13596
|
||||
X25888Y13596
|
||||
X27288Y13596
|
||||
X28688Y13596
|
||||
X30088Y13596
|
||||
X31488Y13596
|
||||
X32888Y13596
|
||||
X34288Y13596
|
||||
X35688Y13596
|
||||
X37088Y13596
|
||||
X38204Y13881
|
||||
X38204Y15281
|
||||
X38204Y16681
|
||||
X38204Y18081
|
||||
X38204Y19481
|
||||
X38204Y20881
|
||||
X38204Y22281
|
||||
X38204Y23681
|
||||
X38204Y25081
|
||||
X38204Y26481
|
||||
X38204Y27881
|
||||
X38204Y29281
|
||||
X38204Y30681
|
||||
X38204Y32081
|
||||
X38204Y33481
|
||||
X38204Y34881
|
||||
X38204Y36281
|
||||
X38204Y37681
|
||||
X38204Y39081
|
||||
X38204Y40481
|
||||
X38204Y41881
|
||||
|
||||
X92701Y12632
|
||||
X92623Y14029
|
||||
X92390Y15408
|
||||
X92004Y16754
|
||||
X91472Y18048
|
||||
X90798Y19274
|
||||
X89992Y20418
|
||||
X89064Y21465
|
||||
X88025Y22402
|
||||
X86888Y23218
|
||||
X85667Y23902
|
||||
X84378Y24446
|
||||
X83036Y24842
|
||||
X81659Y25087
|
||||
X80262Y25177
|
||||
X78865Y25111
|
||||
X77483Y24890
|
||||
X76134Y24516
|
||||
X74836Y23995
|
||||
X73604Y23332
|
||||
X72453Y22536
|
||||
X71398Y21617
|
||||
X70452Y20586
|
||||
X69626Y19456
|
||||
X68932Y18241
|
||||
X68377Y16956
|
||||
X67969Y15618
|
||||
X67712Y14242
|
||||
X67610Y12847
|
||||
X67664Y11449
|
||||
X67874Y10065
|
||||
X68236Y8714
|
||||
X68746Y7411
|
||||
X69399Y6173
|
||||
X70185Y5015
|
||||
X71095Y3952
|
||||
X72118Y2997
|
||||
X73241Y2162
|
||||
X74449Y1458
|
||||
X75729Y892
|
||||
X77064Y472
|
||||
X78437Y203
|
||||
X79832Y90
|
||||
X81230Y132
|
||||
X82616Y329
|
||||
X83970Y680
|
||||
X85278Y1179
|
||||
X86521Y1821
|
||||
X87685Y2597
|
||||
X88756Y3498
|
||||
X89719Y4512
|
||||
X90564Y5628
|
||||
X91279Y6831
|
||||
X91856Y8106
|
||||
X92287Y9437
|
||||
X92568Y10808
|
||||
X92693Y12201
|
||||
|
||||
X60277Y65000
|
||||
X60182Y66396
|
||||
X59898Y67765
|
||||
X59431Y69084
|
||||
X58789Y70327
|
||||
X57984Y71471
|
||||
X57031Y72495
|
||||
X55948Y73381
|
||||
X54755Y74111
|
||||
X53474Y74672
|
||||
X52128Y75055
|
||||
X50743Y75250
|
||||
X49344Y75256
|
||||
X47957Y75072
|
||||
X46608Y74701
|
||||
X45322Y74151
|
||||
X44123Y73431
|
||||
X43032Y72555
|
||||
X42071Y71539
|
||||
X41256Y70401
|
||||
X40604Y69164
|
||||
X40126Y67849
|
||||
X39830Y66482
|
||||
X39723Y65087
|
||||
X39807Y63691
|
||||
X40079Y62318
|
||||
X40535Y60996
|
||||
X41166Y59748
|
||||
X41961Y58597
|
||||
X42905Y57564
|
||||
X43981Y56670
|
||||
X45168Y55929
|
||||
X46445Y55357
|
||||
X47787Y54964
|
||||
X49170Y54756
|
||||
X50569Y54739
|
||||
X51958Y54911
|
||||
X53310Y55270
|
||||
X54600Y55810
|
||||
X55806Y56520
|
||||
X56903Y57387
|
||||
X57873Y58395
|
||||
X58698Y59525
|
||||
X59360Y60757
|
||||
X59850Y62067
|
||||
X60157Y63432
|
||||
X60276Y64826
|
||||
|
||||
X50000Y65000
|
||||
X50000Y66400
|
||||
X50000Y67800
|
||||
X50000Y69200
|
||||
X50000Y70600
|
||||
X49460Y71437
|
||||
X48088Y71170
|
||||
X46806Y70614
|
||||
X45674Y69796
|
||||
X44743Y68754
|
||||
X44059Y67535
|
||||
X43653Y66198
|
||||
X43544Y64805
|
||||
X43737Y63422
|
||||
X44223Y62112
|
||||
X44979Y60937
|
||||
X45970Y59952
|
||||
X47150Y59203
|
||||
X48463Y58726
|
||||
X49848Y58543
|
||||
X51241Y58661
|
||||
X52575Y59076
|
||||
X53789Y59768
|
||||
X54825Y60706
|
||||
X55636Y61844
|
||||
X56182Y63129
|
||||
X55184Y63682
|
||||
X53828Y64027
|
||||
X52471Y64372
|
||||
X51114Y64717
|
||||
|
||||
M30
|
||||
93
tests/expects/dxf_to_inch.gtl
Normal file
93
tests/expects/dxf_to_inch.gtl
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
%MOIN*%
|
||||
%FSLAX25Y25*%
|
||||
%IPPOS*%
|
||||
%ADD10C,0*%
|
||||
G75*
|
||||
%LPD*%
|
||||
D10*
|
||||
G01*
|
||||
X314961Y334646D02*
|
||||
G75*
|
||||
G01*
|
||||
X314961Y137795D01*
|
||||
G01*
|
||||
X354331Y334646D02*
|
||||
G75*
|
||||
G01*
|
||||
X354331Y137795D01*
|
||||
G01*
|
||||
X78740Y129681D02*
|
||||
G75*
|
||||
G01*
|
||||
X128278Y129681D01*
|
||||
G01*
|
||||
X128278Y70253D01*
|
||||
G01*
|
||||
X157480Y0D02*
|
||||
G75*
|
||||
G01*
|
||||
X39370Y0D01*
|
||||
G02*
|
||||
X0Y39370I0J39370D01*
|
||||
G01*
|
||||
X0Y157480D01*
|
||||
G02*
|
||||
X39370Y196850I39370J0D01*
|
||||
G01*
|
||||
X157480Y196850D01*
|
||||
G02*
|
||||
X196850Y157480I0J-39370D01*
|
||||
G01*
|
||||
X196850Y39370D01*
|
||||
G02*
|
||||
X157480Y0I-39370J0D01*
|
||||
G01*
|
||||
X292403Y295431D02*
|
||||
G75*
|
||||
G01*
|
||||
X292403Y177320D01*
|
||||
G02*
|
||||
X253033Y137950I-39370J0D01*
|
||||
G01*
|
||||
X134923Y137950D01*
|
||||
G02*
|
||||
X95553Y177320I0J39370D01*
|
||||
G01*
|
||||
X95553Y295431D01*
|
||||
G02*
|
||||
X134923Y334801I39370J0D01*
|
||||
G01*
|
||||
X253033Y334801D01*
|
||||
G02*
|
||||
X292403Y295431I0J-39370D01*
|
||||
G01*
|
||||
X150409Y166166D02*
|
||||
G75*
|
||||
G01*
|
||||
X52957Y166166D01*
|
||||
G01*
|
||||
X52957Y53528D01*
|
||||
G01*
|
||||
X150409Y53528D01*
|
||||
G01*
|
||||
X150409Y166166D01*
|
||||
G01*
|
||||
X364964Y49731D02*
|
||||
G75*
|
||||
G03*
|
||||
X364964Y49731I-49395J0D01*
|
||||
G01*
|
||||
X237312Y255906D02*
|
||||
G75*
|
||||
G03*
|
||||
X237312Y255906I-40462J0D01*
|
||||
G01*
|
||||
X196850Y255906D02*
|
||||
G75*
|
||||
G01*
|
||||
X196850Y281336D01*
|
||||
G03*
|
||||
X221497Y249641I0J-25430D01*
|
||||
G01*
|
||||
X196850Y255906D01*
|
||||
M02*
|
||||
41
tests/expects/excellon_offset.txt
Normal file
41
tests/expects/excellon_offset.txt
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T01C0.600
|
||||
T02C0.700
|
||||
T03C0.800
|
||||
T04C1.000
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T01
|
||||
X15610Y7438
|
||||
X15610Y8413
|
||||
X14610Y11100G85X13100Y11100
|
||||
T02
|
||||
X14610Y8900
|
||||
X14610Y6950
|
||||
X13140Y6950
|
||||
X13050Y8900
|
||||
T03
|
||||
G00X14610Y7925
|
||||
M15
|
||||
G01X13140Y7925
|
||||
M16
|
||||
G05
|
||||
X14600Y12100
|
||||
T04
|
||||
G00X11600Y6700
|
||||
M15
|
||||
G02X12600Y5700I0J-1000
|
||||
G03X13600Y4700A1000
|
||||
G03X14600Y5700A1000
|
||||
G01X17600Y5700
|
||||
G01X17600Y7600
|
||||
G03X15100Y10100I-2500J0
|
||||
G01X11600Y10100
|
||||
G01X11600Y6700
|
||||
M16
|
||||
G05
|
||||
M30
|
||||
41
tests/expects/excellon_rotate.txt
Normal file
41
tests/expects/excellon_rotate.txt
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T01C0.600
|
||||
T02C0.700
|
||||
T03C0.800
|
||||
T04C1.000
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T01
|
||||
X7521Y1051
|
||||
X7188Y1967
|
||||
X5329Y4150G85X3910Y3633
|
||||
T02
|
||||
X6082Y2082
|
||||
X6749Y250
|
||||
X5367Y-253
|
||||
X4616Y1549
|
||||
T03
|
||||
G00X6415Y1166
|
||||
M15
|
||||
G01X5034Y663
|
||||
M16
|
||||
G05
|
||||
X4978Y5086
|
||||
T04
|
||||
G00X4006Y-1014
|
||||
M15
|
||||
G02X5287Y-1612I342J-940
|
||||
G03X6569Y-2210A1000
|
||||
G03X7167Y-928A1000
|
||||
G01X9986Y98
|
||||
G01X9336Y1883
|
||||
G03X6132Y3378I-2349J-855
|
||||
G01X2843Y2181
|
||||
G01X4006Y-1014
|
||||
M16
|
||||
G05
|
||||
M30
|
||||
41
tests/expects/excellon_save.txt
Normal file
41
tests/expects/excellon_save.txt
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T01C0.600
|
||||
T02C0.700
|
||||
T03C0.800
|
||||
T04C1.000
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T01
|
||||
X4610Y2438
|
||||
X4610Y3413
|
||||
X3610Y6100G85X2100Y6100
|
||||
T02
|
||||
X3610Y3900
|
||||
X3610Y1950
|
||||
X2140Y1950
|
||||
X2050Y3900
|
||||
T03
|
||||
G00X3610Y2925
|
||||
M15
|
||||
G01X2140Y2925
|
||||
M16
|
||||
G05
|
||||
X3600Y7100
|
||||
T04
|
||||
G00X600Y1700
|
||||
M15
|
||||
G02X1600Y700I0J-1000
|
||||
G03X2600Y-300A1000
|
||||
G03X3600Y700A1000
|
||||
G01X6600Y700
|
||||
G01X6600Y2600
|
||||
G03X4100Y5100I-2500J0
|
||||
G01X600Y5100
|
||||
G01X600Y1700
|
||||
M16
|
||||
G05
|
||||
M30
|
||||
41
tests/expects/excellon_to_inch.txt
Normal file
41
tests/expects/excellon_to_inch.txt
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
INCH,TZ
|
||||
T01C0.0236
|
||||
T02C0.0275
|
||||
T03C0.0314
|
||||
T04C0.0393
|
||||
%
|
||||
G90
|
||||
M72
|
||||
T01
|
||||
X1815Y960
|
||||
X1815Y1344
|
||||
X1421Y2402G85X827Y2402
|
||||
T02
|
||||
X1421Y1535
|
||||
X1421Y768
|
||||
X843Y768
|
||||
X807Y1535
|
||||
T03
|
||||
G00X1421Y1152
|
||||
M15
|
||||
G01X843Y1152
|
||||
M16
|
||||
G05
|
||||
X1417Y2795
|
||||
T04
|
||||
G00X236Y669
|
||||
M15
|
||||
G02X630Y276I0J-394
|
||||
G03X1024Y-118A394
|
||||
G03X1417Y276A394
|
||||
G01X2598Y276
|
||||
G01X2598Y1024
|
||||
G03X1614Y2008I-984J0
|
||||
G01X236Y2008
|
||||
G01X236Y669
|
||||
M16
|
||||
G05
|
||||
M30
|
||||
41
tests/expects/excellon_to_metric.txt
Normal file
41
tests/expects/excellon_to_metric.txt
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
M48
|
||||
FMAT,2
|
||||
ICI,OFF
|
||||
METRIC,TZ,000.000
|
||||
T01C0.599
|
||||
T02C0.698
|
||||
T03C0.797
|
||||
T04C0.998
|
||||
%
|
||||
G90
|
||||
M71
|
||||
T01
|
||||
X4610Y2438
|
||||
X4610Y3414
|
||||
X3609Y6101G85X2101Y6101
|
||||
T02
|
||||
X3609Y3899
|
||||
X3609Y1951
|
||||
X2141Y1951
|
||||
X2050Y3899
|
||||
T03
|
||||
G00X3609Y2926
|
||||
M15
|
||||
G01X2141Y2926
|
||||
M16
|
||||
G05
|
||||
X3599Y7099
|
||||
T04
|
||||
G00X599Y1699
|
||||
M15
|
||||
G02X1600Y701I0J-1001
|
||||
G03X2601Y-300A1001
|
||||
G03X3599Y701A1001
|
||||
G01X6599Y701
|
||||
G01X6599Y2601
|
||||
G03X4100Y5100I-2499J0
|
||||
G01X599Y5100
|
||||
G01X599Y1699
|
||||
M16
|
||||
G05
|
||||
M30
|
||||
208
tests/test_am_expression.py
Normal file
208
tests/test_am_expression.py
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
import unittest
|
||||
from gerberex.am_expression import *
|
||||
from gerberex.am_expression import AMOperatorExpression as Op
|
||||
from gerber.utils import inch, metric
|
||||
from gerber.am_read import read_macro
|
||||
|
||||
class TestAMConstantExpression(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.const_int_value = 7
|
||||
self.const_int = AMConstantExpression(self.const_int_value)
|
||||
self.const_float_value = 1.2345
|
||||
self.const_float = AMConstantExpression(self.const_float_value)
|
||||
|
||||
def test_contruct(self):
|
||||
self.assertEqual(self.const_int.value, self.const_int_value)
|
||||
self.assertEqual(self.const_float.value, self.const_float_value)
|
||||
|
||||
def test_optimize(self):
|
||||
ov = self.const_int.optimize()
|
||||
self.assertEqual(ov.value, self.const_int_value)
|
||||
ov = self.const_float.optimize()
|
||||
self.assertEqual(ov.value, self.const_float_value)
|
||||
|
||||
def test_to_gerber(self):
|
||||
self.assertEqual(self.const_int.to_gerber(), '7')
|
||||
self.assertEqual(self.const_float.to_gerber(), '1.2345')
|
||||
|
||||
def test_to_instructions(self):
|
||||
self.const_int.to_instructions()
|
||||
self.const_float.to_instructions()
|
||||
|
||||
class TestAMVariableExpression(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.var1_num = 1
|
||||
self.var1 = AMVariableExpression(self.var1_num)
|
||||
self.var2_num = 512
|
||||
self.var2 = AMVariableExpression(self.var2_num)
|
||||
|
||||
def test_construction(self):
|
||||
self.assertEqual(self.var1.number, self.var1_num)
|
||||
self.assertEqual(self.var2.number, self.var2_num)
|
||||
|
||||
def test_optimize(self):
|
||||
ov = self.var1.optimize()
|
||||
self.assertTrue(isinstance(ov, AMVariableExpression))
|
||||
self.assertEqual(ov.number, self.var1_num)
|
||||
ov = self.var2.optimize()
|
||||
self.assertTrue(isinstance(ov, AMVariableExpression))
|
||||
self.assertEqual(ov.number, self.var2_num)
|
||||
|
||||
def test_to_gerber(self):
|
||||
self.assertEqual(self.var1.to_gerber(), '$1')
|
||||
self.assertEqual(self.var2.to_gerber(), '$512')
|
||||
|
||||
def test_to_instructions(self):
|
||||
self.var1.to_instructions()
|
||||
self.var2.to_instructions()
|
||||
|
||||
class TestAMOperatorExpression(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.c1 = 10
|
||||
self.c2 = 20
|
||||
self.v1 = 5
|
||||
self.v2 = 9
|
||||
c1 = AMConstantExpression(self.c1)
|
||||
c2 = AMConstantExpression(self.c2)
|
||||
v1 = AMVariableExpression(self.v1)
|
||||
v2 = AMVariableExpression(self.v2)
|
||||
|
||||
self.cc_exps = [
|
||||
(Op.ADD, AMOperatorExpression(Op.ADD, c1, c2)),
|
||||
(Op.SUB, AMOperatorExpression(Op.SUB, c1, c2)),
|
||||
(Op.MUL, AMOperatorExpression(Op.MUL, c1, c2)),
|
||||
(Op.DIV, AMOperatorExpression(Op.DIV, c1, c2)),
|
||||
]
|
||||
|
||||
self.cv_exps = [
|
||||
(Op.ADD, AMOperatorExpression(Op.ADD, c1, v2)),
|
||||
(Op.SUB, AMOperatorExpression(Op.SUB, c1, v2)),
|
||||
(Op.MUL, AMOperatorExpression(Op.MUL, c1, v2)),
|
||||
(Op.DIV, AMOperatorExpression(Op.DIV, c1, v2)),
|
||||
]
|
||||
self.vc_exps = [
|
||||
(Op.ADD, AMOperatorExpression(Op.ADD, v1, c2)),
|
||||
(Op.SUB, AMOperatorExpression(Op.SUB, v1, c2)),
|
||||
(Op.MUL, AMOperatorExpression(Op.MUL, v1, c2)),
|
||||
(Op.DIV, AMOperatorExpression(Op.DIV, v1, c2)),
|
||||
]
|
||||
|
||||
self.composition = AMOperatorExpression(Op.ADD,
|
||||
self.cc_exps[0][1], self.cc_exps[0][1])
|
||||
|
||||
def test_optimize(self):
|
||||
self.assertEqual(self.cc_exps[0][1].optimize().value, self.c1 + self.c2)
|
||||
self.assertEqual(self.cc_exps[1][1].optimize().value, self.c1 - self.c2)
|
||||
self.assertEqual(self.cc_exps[2][1].optimize().value, self.c1 * self.c2)
|
||||
self.assertEqual(self.cc_exps[3][1].optimize().value, self.c1 / self.c2)
|
||||
|
||||
for op, expression in self.cv_exps:
|
||||
o = expression.optimize()
|
||||
self.assertTrue(isinstance(o, AMOperatorExpression))
|
||||
self.assertEqual(o.op, op)
|
||||
self.assertEqual(o.lvalue.value, self.c1)
|
||||
self.assertEqual(o.rvalue.number, self.v2)
|
||||
|
||||
for op, expression in self.vc_exps:
|
||||
o = expression.optimize()
|
||||
self.assertTrue(isinstance(o, AMOperatorExpression))
|
||||
self.assertEqual(o.op, op)
|
||||
self.assertEqual(o.lvalue.number, self.v1)
|
||||
self.assertEqual(o.rvalue.value, self.c2)
|
||||
|
||||
self.assertEqual(self.composition.optimize().value, (self.c1 + self.c2) * 2)
|
||||
|
||||
def test_to_gerber(self):
|
||||
for op, expression in self.cc_exps:
|
||||
self.assertEqual(expression.to_gerber(),
|
||||
'({0}){1}({2})'.format(self.c1, op, self.c2))
|
||||
for op, expression in self.cv_exps:
|
||||
self.assertEqual(expression.to_gerber(),
|
||||
'({0}){1}(${2})'.format(self.c1, op, self.v2))
|
||||
for op, expression in self.vc_exps:
|
||||
self.assertEqual(expression.to_gerber(),
|
||||
'(${0}){1}({2})'.format(self.v1, op, self.c2))
|
||||
self.assertEqual(self.composition.to_gerber(),
|
||||
'(({0})+({1}))+(({2})+({3}))'.format(
|
||||
self.c1, self.c2, self.c1, self.c2
|
||||
))
|
||||
|
||||
def test_to_instructions(self):
|
||||
for of, expression in self.vc_exps + self.cv_exps + self.cc_exps:
|
||||
expression.to_instructions()
|
||||
self.composition.to_instructions()
|
||||
|
||||
class TestAMExpression(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.c1 = 10
|
||||
self.c1_exp = AMConstantExpression(self.c1)
|
||||
self.v1 = 5
|
||||
self.v1_exp = AMVariableExpression(self.v1)
|
||||
self.op_exp = AMOperatorExpression(Op.ADD, self.c1_exp, self.v1_exp)
|
||||
|
||||
def test_to_inch(self):
|
||||
o = self.c1_exp.to_inch().optimize()
|
||||
self.assertEqual(o.value, inch(self.c1))
|
||||
o = self.v1_exp.to_inch().optimize()
|
||||
self.assertTrue(isinstance(o, AMOperatorExpression))
|
||||
self.assertEqual(o.op, Op.DIV)
|
||||
o = self.op_exp.to_inch().optimize()
|
||||
self.assertTrue(isinstance(o, AMOperatorExpression))
|
||||
self.assertEqual(o.op, Op.DIV)
|
||||
|
||||
def test_to_metric(self):
|
||||
o = self.c1_exp.to_metric().optimize()
|
||||
self.assertEqual(o.value, metric(self.c1))
|
||||
o = self.v1_exp.to_metric().optimize()
|
||||
self.assertTrue(isinstance(o, AMOperatorExpression))
|
||||
self.assertEqual(o.op, Op.MUL)
|
||||
o = self.op_exp.to_metric().optimize()
|
||||
self.assertTrue(isinstance(o, AMOperatorExpression))
|
||||
self.assertEqual(o.op, Op.MUL)
|
||||
|
||||
class TestEvalMacro(unittest.TestCase):
|
||||
def test_eval_macro(self):
|
||||
macros = [
|
||||
'$1=5.5*',
|
||||
'$1=0.000001*'
|
||||
'$2=$3*',
|
||||
'$3=(1.23)+(4.56)*',
|
||||
'$3=(1.23)-(4.56)*',
|
||||
'$3=(1.23)X(4.56)*',
|
||||
'$3=(1.23)/(4.56)*',
|
||||
'$3=(10.2)X($2)*',
|
||||
'1,1.2*',
|
||||
'1,$2*',
|
||||
'1,($2)+($3)*',
|
||||
#'1,(2.0)-($3)*', # This doesn't pass due to pcb-tools bug
|
||||
'1,($2)X($3)*',
|
||||
'1,($2)/($3)*',
|
||||
'1,2.1,3.2*2,(3.1)/($1),$2*'
|
||||
]
|
||||
for macro in macros:
|
||||
self._eval_macro_string(macro)
|
||||
|
||||
def _eval_macro_string(self, macro):
|
||||
expressions = eval_macro(read_macro(macro))
|
||||
gerber = self._to_gerber(expressions)
|
||||
self.assertEqual(macro, gerber)
|
||||
|
||||
def _to_gerber(self, expressions_list):
|
||||
gerber = ''
|
||||
for number, expressions in expressions_list:
|
||||
self.assertTrue(isinstance(number, int))
|
||||
if number > 0:
|
||||
egerbers = [exp.to_gerber() for exp in expressions]
|
||||
gerber += '{0},{1}*'.format(number, ','.join(egerbers))
|
||||
else:
|
||||
self.assertEqual(len(expressions), 1)
|
||||
gerber += '${0}={1}*'.format(-number, expressions[0].to_gerber())
|
||||
return gerber
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
153
tests/test_dxf.py
Normal file
153
tests/test_dxf.py
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2019 Hiroshi Murayama <opiopan@gmail.com>
|
||||
|
||||
import os
|
||||
import unittest
|
||||
import gerberex
|
||||
from gerber.utils import inch, metric
|
||||
|
||||
|
||||
class TestExcellon(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
cls.INDIR = 'data'
|
||||
cls.OUTDIR = 'outputs'
|
||||
cls.EXPECTSDIR = 'expects'
|
||||
cls.OUTPREFIX = 'dxf_'
|
||||
cls.METRIC_FILE = os.path.join(cls.INDIR, 'ref_dxf_metric.dxf')
|
||||
cls.INCH_FILE = os.path.join(cls.INDIR, 'ref_dxf_inch.dxf')
|
||||
cls.COMPLEX_FILE = os.path.join(cls.INDIR, 'ref_dxf_complex.dxf')
|
||||
try:
|
||||
os.mkdir(cls.OUTDIR)
|
||||
except FileExistsError:
|
||||
pass
|
||||
|
||||
def _checkResult(self, file):
|
||||
with open(file, 'r') as f:
|
||||
data = f.read()
|
||||
with open(os.path.join(self.EXPECTSDIR, os.path.basename(file)), 'r') as f:
|
||||
expect = f.read()
|
||||
self.assertEqual(data, expect)
|
||||
|
||||
def test_save_line(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'save_line.gtl')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.draw_mode = dxf.DM_LINE
|
||||
dxf.width = 0.2
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_save_fill(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'save_fill.gtl')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.draw_mode = dxf.DM_FILL
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_save_fill_simple(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'save_fill_simple.gtl')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.draw_mode = dxf.DM_FILL
|
||||
dxf.fill_mode = dxf.FM_SIMPLE
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_save_mousebites(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'save_mousebites.gtl')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.draw_mode = dxf.DM_MOUSE_BITES
|
||||
dxf.width = 0.5
|
||||
dxf.pitch = 1.4
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_save_excellon(self):
|
||||
outfile = os.path.join(
|
||||
self.OUTDIR, self.OUTPREFIX + 'save_line.txt')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.draw_mode = dxf.DM_LINE
|
||||
dxf.format = (3,3)
|
||||
dxf.width = 0.2
|
||||
dxf.write(outfile, filetype=dxf.FT_EXCELLON)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_save_excellon_mousebites(self):
|
||||
outfile = os.path.join(
|
||||
self.OUTDIR, self.OUTPREFIX + 'save_mousebites.txt')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.draw_mode = dxf.DM_MOUSE_BITES
|
||||
dxf.format = (3, 3)
|
||||
dxf.width = 0.5
|
||||
dxf.pitch = 1.4
|
||||
dxf.write(outfile, filetype=dxf.FT_EXCELLON)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_to_inch(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'to_inch.gtl')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.to_inch()
|
||||
dxf.format = (2, 5)
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def _test_to_metric(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'to_metric.gtl')
|
||||
dxf = gerberex.read(self.INCH_FILE)
|
||||
dxf.to_metric()
|
||||
dxf.format = (3, 5)
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_offset(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'offset.gtl')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.offset(11, 5)
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_rotate(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'rotate.gtl')
|
||||
dxf = gerberex.read(self.METRIC_FILE)
|
||||
dxf.rotate(20, (10, 10))
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_rectangle_metric(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'rectangle_metric.gtl')
|
||||
dxf = gerberex.DxfFile.rectangle(width=10, height=10, units='metric')
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_rectangle_inch(self):
|
||||
outfile = os.path.join(
|
||||
self.OUTDIR, self.OUTPREFIX + 'rectangle_inch.gtl')
|
||||
dxf = gerberex.DxfFile.rectangle(width=inch(10), height=inch(10), units='inch')
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_complex_fill(self):
|
||||
outfile = os.path.join(self.OUTDIR, self.OUTPREFIX + 'complex_fill.gtl')
|
||||
dxf = gerberex.read(self.COMPLEX_FILE)
|
||||
dxf.draw_mode = dxf.DM_FILL
|
||||
dxf.write(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
def test_complex_fill_flip(self):
|
||||
outfile = os.path.join(
|
||||
self.OUTDIR, self.OUTPREFIX + 'complex_fill_flip.gtl')
|
||||
ctx = gerberex.GerberComposition()
|
||||
base = gerberex.rectangle(width=100, height=100, left=0, bottom=0, units='metric')
|
||||
base.draw_mode = base.DM_FILL
|
||||
ctx.merge(base)
|
||||
dxf = gerberex.read(self.COMPLEX_FILE)
|
||||
dxf.negate_polarity()
|
||||
dxf.draw_mode = dxf.DM_FILL
|
||||
ctx.merge(dxf)
|
||||
ctx.dump(outfile)
|
||||
self._checkResult(outfile)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue