Graft pcb-tools-extension master onto gerbonara main

This commit is contained in:
jaseg 2021-06-06 13:28:42 +02:00
commit 889ea37d9b
103 changed files with 107700 additions and 2 deletions

View file

@ -49,5 +49,3 @@ nc_drill.render(ctx, 'composite.svg')
---
Made with ❤️ and 🐍.
=======
pcb-tools

74
examples/genimage.py Executable file
View 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')

View 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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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*

View 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*

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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*

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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*

View 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*

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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*

View 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*

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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*

View 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*

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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)

View 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
View 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
View 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
View file

View 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

View 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

File diff suppressed because it is too large Load diff

View 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

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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*

View 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

View 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*

View 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

View 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*

View 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

View 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

View 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

View 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

View 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
View 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
View 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