Fix svg orientation and improve OrCAD rendering

This commit is contained in:
jaseg 2024-11-08 11:41:11 +01:00
parent be8371c7bc
commit 8ffa7c1b76
15 changed files with 49947 additions and 25 deletions

View file

@ -39,6 +39,7 @@ from .cam import FileSettings, LazyCamFile
from .layer_rules import MATCH_RULES
from .utils import sum_bounds, setup_svg, MM, Tag, convex_hull
from . import graphic_objects as go
from . import apertures as ap
from . import graphic_primitives as gp
@ -273,7 +274,7 @@ def _layername_autoguesser(fn):
elif re.search('film', fn):
use = 'copper'
elif re.search('out(line)?|board.?geometry', fn):
elif re.search('out(line)?|board.?geom(etry)?', fn):
use = 'outline'
side = 'mechanical'
@ -303,6 +304,9 @@ def _sort_layername(val):
assert side.startswith('inner_')
return int(side[len('inner_'):])
def convex_hull_to_lines(points, unit=MM):
for (x1, y1), (x2, y2) in zip(points, points[1:] + points):
yield go.Line(x1, y1, x2, y2, aperture=ap.CircleAperture(unit(0.1, MM), unit=unit), unit=unit)
class LayerStack:
""" :py:class:`LayerStack` represents a set of Gerber files that describe different layers of the same board.
@ -949,7 +953,7 @@ class LayerStack:
id=f'l-mechanical-outline', **stroke_attrs, **inkscape_attrs(f'outline'),
transform=layer_transform))
sc_y, tl_y = -1, (bounds[0][1] + bounds[1][1])
sc_y, tl_y = 1, 0
if side == 'bottom':
sc_x, tl_x = -1, (bounds[0][0] + bounds[1][0])
else:
@ -1184,22 +1188,6 @@ class LayerStack:
polys.append(' '.join(poly.path_d()) + ' Z')
return ' '.join(polys)
def outline_convex_hull(self, tol=0.01, unit=MM):
points = []
for obj in self.outline.instance.objects:
if isinstance(obj, go.Line):
line = obj.as_primitive(unit)
points.append((line.x1, line.y1))
points.append((line.x2, line.y2))
elif isinstance(obj, go.Arc):
for obj in obj.approximate(tol, unit):
line = obj.as_primitive(unit)
points.append((line.x1, line.y1))
points.append((line.x2, line.y2))
return convex_hull(points)
def outline_polygons(self, tol=0.01, unit=MM):
""" Iterator yielding this boards outline as a list of ordered :py:class:`~.graphic_objects.Arc` and
:py:class:`~.graphic_objects.Line` objects. This method first sorts all lines and arcs on the outline layer into
@ -1214,6 +1202,14 @@ class LayerStack:
:param tol: :py:obj:`float` setting the tolerance below which two points are considered equal
:param unit: :py:class:`.LengthUnit` or str (``'mm'`` or ``'inch'``). SVG document unit. Default: mm
"""
if not self.outline:
warnings.warn("Board has no outline layer, or the outline layer could not be identified by file name. Using the copper layers' convex hull instead.")
points = sum((layer.instance.convex_hull(tol, unit) for (_side, _use), layer in self.copper_layers), start=[])
yield list(convex_hull_to_lines(convex_hull(points), unit))
return
maybe_allegro_hint = '' if self.generator != 'allegro' else ' This file looks like it was generated by Allegro/OrCAD. These tools produce quite mal-formed gerbers, and often export text on the outline layer. If you generated this file yourself, maybe try twiddling with the export settings.'
polygons = []
lines = [ obj.as_primitive(unit) for obj in self.outline.instance.objects if isinstance(obj, (go.Line, go.Arc)) ]
@ -1242,13 +1238,14 @@ class LayerStack:
j = 0 if d1 < d2 else 1
if (nearest, j) in joins and joins[(nearest, j)] != (cur, i):
warnings.warn(f'Three-way intersection on outline layer at: {(nearest, j)}; {(cur, i)}; and {joins[(nearest, j)]}. Falling back to returning the convex hull of the outline layer.')
return self.outline_convex_hull(tol, unit)
warnings.warn(f'Three-way intersection on outline layer at: {(nearest, j)}; {(cur, i)}; and {joins[(nearest, j)]}. Falling back to returning the convex hull of the outline layer.{maybe_allegro_hint}')
yield list(convex_hull_to_lines(self.outline.instance.convex_hull(tol, unit), unit))
return
if (cur, i) in joins and joins[(cur, i)] != (nearest, j):
warnings.warn(f'three-way intersection on outline layer at: {(nearest, j)}; {(cur, i)}; and {joins[(nearest, j)]}. Falling back to returning the convex hull of the outline layer.')
return self.outline_convex_hull(tol, unit)
warnings.warn(f'Three-way intersection on outline layer at: {(nearest, j)}; {(cur, i)}; and {joins[(nearest, j)]}. Falling back to returning the convex hull of the outline layer.{maybe_allegro_hint}')
yield list(convex_hull_to_lines(self.outline.instance.convex_hull(tol, unit), unit))
return
joins[(cur, i)] = (nearest, j)
joins[(nearest, j)] = (cur, i)

View file

@ -28,7 +28,7 @@ import dataclasses
import functools
from .cam import CamFile, FileSettings
from .utils import MM, Inch, units, InterpMode, UnknownStatementWarning
from .utils import MM, Inch, units, InterpMode, UnknownStatementWarning, convex_hull
from .aperture_macros.parse import ApertureMacro, GenericMacros
from . import graphic_primitives as gp
from . import graphic_objects as go
@ -376,7 +376,25 @@ class GerberFile(CamFile):
""" Invert the polarity (color) of each object in this file. """
for obj in self.objects:
obj.polarity_dark = not p.polarity_dark
def convex_hull(self, tol=0.01, unit=None):
unit = unit or self.unit
points = []
for obj in self.objects:
if isinstance(obj, go.Line):
line = obj.as_primitive(unit)
points.append((line.x1, line.y1))
points.append((line.x2, line.y2))
elif isinstance(obj, go.Arc):
for obj in obj.approximate(tol, unit):
line = obj.as_primitive(unit)
points.append((line.x1, line.y1))
points.append((line.x2, line.y2))
return convex_hull(points)
class GraphicsState:
""" Internal class used to track Gerber processing state during import and export.

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

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 @@
Files from https://github.com/floesche/LED-Display_G4_Hardware_Arena

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,884 @@
M48
METRIC
T01C.3302
T02C1.016
T03C4.3053
T04C139.7
T05C1.19126
;LEADER: 12
;HEADER:
;CODE : ASCII
;FILE : arena_12-12_v2-1-6.1 for ... layers TOP and BOTTOM
;DESIGN: arena_12-12_v2.1.brd
;T01 Holesize 1. = 0.330200 Tolerance = +0.000000/-0.000000 PLATED MM Quantity = 668
;T02 Holesize 2. = 1.016000 Tolerance = +0.000000/-0.000000 PLATED MM Quantity = 180
;T03 Holesize 3. = 4.305300 Tolerance = +0.000000/-0.000000 PLATED MM Quantity = 8
;T04 Holesize 4. = 139.700000 Tolerance = +0.000000/-0.000000 PLATED MM Quantity = 1
;T05 Holesize 5. = 1.191260 Tolerance = +0.000000/-0.000000 NON_PLATED MM Quantity = 2
%
G90
T01
X-108128Y-012014
X-102514Y-012090
X-112370Y007048
X-102921Y007048
X-101359Y-006477
X-101356Y-005827
X-109388Y-001278
X-109388Y-000627
X-103563Y-005177
X-109388Y000023
X-109388Y000673
X-106957Y-005827
X-106959Y-006477
X-110541Y042926
X-102870Y042926
X-083617Y069520
X-070439Y043602
X-072502Y057328
X-069230Y056914
X-069713Y062154
X-075842Y050744
X-070609Y040767
X-071631Y023759
X-071460Y026594
X-071290Y029428
X-071120Y032263
X-070950Y035098
X-070780Y037932
X-087528Y025464
X-086093Y041059
X-088773Y018875
X-091478Y018928
X-091250Y-000673
X-090297Y-000023
X-081534Y000000
X-090297Y-001323
X-091250Y-001974
X-090297Y-002624
X-091250Y-003274
X-090297Y-003924
X-091250Y-004575
X-077724Y-007620
X-078994Y-005080
X-080264Y-002540
X-082804Y002540
X-091478Y013355
X-088773Y014602
X-092113Y006213
X-073914Y-015240
X-075184Y-012700
X-076454Y-010160
X-087528Y-015811
X-083909Y-031732
X-088704Y-029731
X-086042Y-028034
X-070609Y-040767
X-068240Y-042332
X-072979Y-039202
X-085921Y-034557
X-081852Y-040086
X-068237Y-107145
X-069190Y-106495
X-068237Y-105844
X-069190Y-105194
X-068237Y-104544
X-069190Y-107795
X-069190Y-109096
X-068237Y-108445
X-046647Y-103896
X-046647Y-107798
X-047600Y-107147
X-046647Y-106497
X-047600Y-105847
X-046647Y-105197
X-052862Y-107127
X-053691Y-106477
X-052862Y-105829
X-053691Y-105179
X-052862Y-104529
X-053691Y-103878
X-052862Y-108428
X-053691Y-107777
X-053061Y-103228
X-053061Y-102578
X-049926Y-093203
X-047409Y-095926
X-047600Y-108448
X-047600Y-104546
X-048758Y-089408
X-053061Y-109728
X-049911Y-109078
X-055512Y-109728
X-055512Y-103878
X-057086Y-097650
X-051486Y-097866
X-045108Y-092291
X-045108Y-087122
X-051928Y-091074
X-053276Y-094551
X-058661Y-102578
X-058661Y-103228
X-055410Y-076949
X-055410Y-072911
X-043602Y-070439
X-047409Y-081750
X-057556Y-073022
X-057079Y-069713
X-047109Y-077447
X-060777Y-067574
X-062382Y-070234
X-056391Y-050155
X-058760Y-048590
X-061130Y-047026
X-063500Y-045461
X-065870Y-043896
X-050155Y056391
X-048590Y058760
X-047026Y061130
X-045461Y063500
X-043896Y065870
X-067092Y060612
X-042332Y068240
X-060338Y086804
X-040767Y070609
X-039202Y072979
X-016561Y087582
X-034353Y085730
X-031656Y083795
X-027958Y085928
X-029528Y088514
X-040137Y081534
X-040767Y-070609
X-023759Y-071631
X-026594Y-071460
X-029428Y-071290
X-032263Y-071120
X-035098Y-070950
X-037932Y-070780
X-021758Y-084671
X-022730Y-083800
X-022880Y-084872
X-028562Y-103868
X-018834Y-104521
X-025324Y-110274
X-019939Y-110274
X-019939Y-105435
X-026746Y-109563
X-020726Y-109563
X-016815Y-103657
X-027389Y-107767
X-028562Y-101918
X-028562Y-102568
X-012903Y-113767
X-010858Y-113779
X-008801Y-113779
X-006731Y-113779
X-004674Y-113792
X-002629Y-113792
X-000584Y-113805
X001473Y-113817
X007658Y-113868
X005588Y-113843
X003518Y-113830
X-026162Y-108471
X-014961Y-113754
X-030772Y-108417
X-030772Y-109068
X-036373Y-109068
X-034163Y-103218
X-039688Y-094602
X-039738Y-089383
X-018953Y-091427
X-018913Y-088481
X-036373Y-101918
X-036373Y-102568
X-041692Y-099223
X-026901Y-099223
X003518Y-109817
X006744Y-097622
X001664Y-107582
X004204Y-107582
X004204Y-097622
X-014976Y-104912
X-027000Y-111252
X-019444Y-111252
X007658Y-109855
X005588Y-109830
X-014961Y-109741
X001473Y-109804
X-000584Y-109792
X-002629Y-109779
X-004674Y-109779
X-006731Y-109766
X-008801Y-109766
X-010858Y-109766
X005474Y-097622
X-012903Y-109753
X008014Y-097622
X007607Y-091491
X005486Y-091491
X-011036Y-097622
X-009766Y-097622
X-008496Y-097622
X-007226Y-097622
X-005956Y-097622
X-004686Y-097622
X-003416Y-097622
X-002146Y-097622
X-000876Y-097622
X000394Y-097622
X001664Y-097622
X002934Y-097622
X-012090Y-092240
X-014641Y-088481
X-013381Y-091427
X-006251Y-091630
X-016284Y-099223
X-012306Y-097622
X000000Y-081534
X007620Y-077724
X005080Y-078994
X002540Y-080264
X-002540Y-082804
X000000Y081534
X-015240Y073914
X-012700Y075184
X-010160Y076454
X-007620Y077724
X-005080Y078994
X-002540Y080264
X002540Y082804
X006175Y091034
X023759Y071631
X026594Y071460
X029428Y071290
X032263Y071120
X014602Y088862
X013355Y091681
X018928Y091681
X018875Y088862
X015240Y-073914
X012700Y-075184
X010160Y-076454
X031694Y-084074
X026159Y-104503
X025603Y-103853
X025603Y-102552
X026159Y-103203
X026159Y-101902
X010554Y-097622
X011824Y-097622
X015977Y-109830
X013881Y-109842
X011811Y-109817
X009741Y-109842
X021374Y-110185
X009284Y-097622
X013805Y-091491
X011722Y-091478
X009665Y-091478
X015900Y-091491
X025603Y-105153
X025603Y-106454
X026159Y-105804
X029489Y-089035
X027996Y-086208
X044712Y-101326
X044120Y-103924
X043980Y-086169
X043386Y-088118
X043980Y-088768
X019583Y-110909
X044714Y-105875
X044120Y-105225
X044714Y-104574
X043386Y-085519
X043386Y-086817
X043980Y-087467
X013881Y-113856
X011811Y-113830
X009741Y-113856
X015977Y-113843
X044003Y-100675
X041885Y-100025
X043980Y-090068
X043386Y-089418
X037109Y-088824
X036284Y-107175
X041885Y-107175
X036284Y-101326
X041885Y-106525
X037414Y-095479
X045110Y-095466
X042990Y-095479
X050711Y-095504
X034315Y-086251
X049337Y-089418
X051943Y-090068
X038519Y-100025
X038519Y-100675
X043386Y-084219
X043980Y-084869
X040767Y-070609
X047026Y-061130
X045461Y-063500
X043896Y-065870
X042332Y-068240
X039202Y-072979
X043386Y-082918
X043980Y-083569
X040124Y-081686
X050155Y-056391
X048590Y-058760
X056391Y050155
X058760Y048590
X040767Y070609
X035098Y070950
X037932Y070780
X043602Y070439
X040297Y080797
X057366Y072984
X056914Y069472
X048811Y076660
X062192Y070195
X060612Y067333
X080056Y042903
X061130Y047026
X063500Y045461
X065870Y043896
X068240Y042332
X070609Y040767
X072979Y039202
X083668Y031821
X081623Y040188
X081534Y000000
X073914Y015240
X075184Y012700
X076454Y010160
X077724Y007620
X078994Y005080
X080264Y002540
X082804Y-002540
X071631Y-023759
X071460Y-026594
X071290Y-029428
X071120Y-032263
X082702Y-032080
X070609Y-040767
X070950Y-035098
X070780Y-037932
X070439Y-043602
X069319Y-057028
X072578Y-057353
X075689Y-050909
X062141Y-084864
X074994Y-081966
X074358Y-081966
X073724Y-081966
X073088Y-081966
X072453Y-081966
X071818Y-081966
X074994Y-082601
X074358Y-082601
X073724Y-082601
X073088Y-082601
X072453Y-082601
X071818Y-082601
X074994Y-083236
X074358Y-083236
X073724Y-083236
X073088Y-083236
X072453Y-083236
X071818Y-083236
X073952Y-066451
X074905Y-065801
X073952Y-065151
X074905Y-064501
X078562Y-067704
X078676Y-066383
X062141Y-083563
X062735Y-084214
X066535Y-066980
X083109Y-081102
X083109Y-080467
X083109Y-079832
X082118Y-081077
X081483Y-081077
X080848Y-081077
X082118Y-080442
X082118Y-079807
X081483Y-080442
X081483Y-079807
X080848Y-080442
X080848Y-079807
X083109Y-078562
X083109Y-079197
X082118Y-079172
X082118Y-078537
X081483Y-079172
X081483Y-078537
X080848Y-079172
X080848Y-078537
X084379Y-081102
X083744Y-081102
X084379Y-080467
X084379Y-079832
X083744Y-080467
X083744Y-079832
X084379Y-078562
X083744Y-078562
X084379Y-079197
X083744Y-079197
X083109Y-081737
X082118Y-081712
X081483Y-081712
X080848Y-081712
X084379Y-081737
X083744Y-081737
X079223Y-084582
X078588Y-084582
X077953Y-084582
X079223Y-083947
X079223Y-083312
X078588Y-083947
X078588Y-083312
X077953Y-083947
X077953Y-083312
X068379Y-079743
X069789Y-062179
X067180Y-060726
X062735Y-085514
X062141Y-086164
X062735Y-086815
X062141Y-087465
X062735Y-088115
X083998Y-100457
X084633Y-100457
X083998Y-099822
X084633Y-099822
X083998Y-099187
X084633Y-099187
X083985Y-102679
X084620Y-102679
X083985Y-102044
X084620Y-102044
X083985Y-101409
X084620Y-101409
X084023Y-096063
X084658Y-096063
X084023Y-095428
X084658Y-095428
X084023Y-098196
X084658Y-098196
X084023Y-097561
X084658Y-097561
X084023Y-096926
X084658Y-096926
X084023Y-094793
X084658Y-094793
X079223Y-085217
X078588Y-085217
X077953Y-085217
X079223Y-086487
X079223Y-085852
X078588Y-086487
X078588Y-085852
X077953Y-086487
X077953Y-085852
X068885Y-101841
X068250Y-101841
X067615Y-101841
X066980Y-101841
X066345Y-101841
X065710Y-101841
X068885Y-102476
X068250Y-102476
X067615Y-102476
X066980Y-102476
X066345Y-102476
X065710Y-102476
X068885Y-103111
X068250Y-103111
X067615Y-103111
X066980Y-103111
X066345Y-103111
X065710Y-103111
X065748Y-100774
X066383Y-100774
X067018Y-100774
X067653Y-100774
X068288Y-100774
X068923Y-100774
X065748Y-100140
X066383Y-100140
X067018Y-100140
X067653Y-100140
X068288Y-100140
X068923Y-100140
X065748Y-099504
X066383Y-099504
X067018Y-099504
X067653Y-099504
X068288Y-099504
X068923Y-099504
X065786Y-098514
X066421Y-098514
X067056Y-098514
X067691Y-098514
X068326Y-098514
X068961Y-098514
X065786Y-097879
X066421Y-097879
X067056Y-097879
X067691Y-097879
X068326Y-097879
X068961Y-097879
X065786Y-097244
X066421Y-097244
X067056Y-097244
X067691Y-097244
X068326Y-097244
X068961Y-097244
X071933Y-104902
X072568Y-104902
X073203Y-104902
X073838Y-104902
X074473Y-104902
X075108Y-104902
X071933Y-104267
X072568Y-104267
X073203Y-104267
X073838Y-104267
X074473Y-104267
X075108Y-104267
X071933Y-103632
X072568Y-103632
X073203Y-103632
X073838Y-103632
X074473Y-103632
X075108Y-103632
X071984Y-107048
X072619Y-107048
X073254Y-107048
X073889Y-107048
X074524Y-107048
X075159Y-107048
X071984Y-106413
X072619Y-106413
X073254Y-106413
X073889Y-106413
X074524Y-106413
X075159Y-106413
X071984Y-105778
X072619Y-105778
X073254Y-105778
X073889Y-105778
X074524Y-105778
X075159Y-105778
X068872Y-107518
X068237Y-107518
X067602Y-107518
X068872Y-106883
X068872Y-106248
X068872Y-105613
X068872Y-104978
X068872Y-104343
X068237Y-106883
X068237Y-106248
X068237Y-105613
X068237Y-104978
X068237Y-104343
X067602Y-106883
X067602Y-106248
X067602Y-105613
X067602Y-104978
X067602Y-104343
X085268Y-100457
X085903Y-100457
X085268Y-099822
X085903Y-099822
X085268Y-099187
X085903Y-099187
X085255Y-102679
X085890Y-102679
X085255Y-102044
X085890Y-102044
X085255Y-101409
X085890Y-101409
X085293Y-096063
X085928Y-096063
X085293Y-095428
X085928Y-095428
X085293Y-098196
X085928Y-098196
X085293Y-097561
X085928Y-097561
X085293Y-096926
X085928Y-096926
X085293Y-094793
X085928Y-094793
X087173Y-100457
X087173Y-099822
X087173Y-099187
X087160Y-102679
X087160Y-102044
X087160Y-101409
X086538Y-100457
X086538Y-099822
X086538Y-099187
X086525Y-102679
X086525Y-102044
X086525Y-101409
X086563Y-096063
X087198Y-096063
X086563Y-095428
X087198Y-095428
X086563Y-098196
X087198Y-098196
X086563Y-097561
X087198Y-097561
X086563Y-096926
X087198Y-096926
X086563Y-094793
X087198Y-094793
X089967Y-081242
X085992Y-063210
X085992Y-062560
X086601Y-081115
X085966Y-081115
X085331Y-081115
X086601Y-080480
X086601Y-079845
X085966Y-080480
X085966Y-079845
X085331Y-080480
X085331Y-079845
X086601Y-078575
X085966Y-078575
X085331Y-078575
X086601Y-079210
X085966Y-079210
X085331Y-079210
X086601Y-081750
X085966Y-081750
X085331Y-081750
X094386Y-069710
X094386Y-069060
X088786Y-063861
X094386Y-068410
X094386Y-067760
X094386Y-062560
X094386Y-063210
X088903Y-058994
X092977Y-057658
X109258Y-010020
X100546Y-010020
X088252Y-014641
X091199Y-013381
X088252Y-018913
X091199Y-018953
X087325Y015850
X091542Y-006200
X101054Y036347
X085641Y034760
X085801Y028123
X088425Y029934
X087325Y057226
X110985Y036347
T02
X-067528Y053652
X-068798Y051453
X-070068Y049253
X-071338Y047053
X-072608Y044854
X-073878Y042654
X-075148Y040455
X-076418Y038255
X-077688Y036055
X-078958Y033856
X-080228Y031656
X-081498Y029456
X-082768Y027257
X-085308Y017780
X-085308Y015240
X-085308Y012700
X-085308Y010160
X-085308Y007620
X-085308Y005080
X-085308Y002540
X-085308Y000000
X-085308Y-002540
X-085308Y-005080
X-085308Y-007620
X-082768Y-027257
X-081498Y-029456
X-080228Y-031656
X-078958Y-033856
X-085308Y-010160
X-085308Y-012700
X-085308Y-015240
X-085308Y-017780
X-077688Y-036055
X-076418Y-038255
X-075148Y-040455
X-073878Y-042654
X-072608Y-044854
X-071338Y-047053
X-070068Y-049253
X-068798Y-051453
X-067528Y-053652
X-058052Y-064988
X-055852Y-066258
X-053652Y-067528
X-051453Y-068798
X-049253Y-070068
X-047053Y-071338
X-044854Y-072608
X-042654Y-073878
X-066258Y-055852
X-064988Y-058052
X-064988Y058052
X-066258Y055852
X-055852Y066258
X-058052Y064988
X-042654Y073878
X-044854Y072608
X-047053Y071338
X-049253Y070068
X-051453Y068798
X-053652Y067528
X-017780Y085308
X-027257Y082768
X-029456Y081498
X-031656Y080228
X-033856Y078958
X-036055Y077688
X-038255Y076418
X-040455Y075148
X-040455Y-075148
X-038255Y-076418
X-036055Y-077688
X-033856Y-078958
X-031656Y-080228
X-029456Y-081498
X-027257Y-082768
X-017780Y-085308
X-015240Y-085308
X-012700Y-085308
X-010160Y-085308
X-007620Y-085308
X-005080Y-085308
X-002540Y-085308
X000000Y-085308
X002540Y-085308
X005080Y-085308
X007620Y-085308
X007620Y085308
X005080Y085308
X002540Y085308
X000000Y085308
X-002540Y085308
X-005080Y085308
X-007620Y085308
X-010160Y085308
X-012700Y085308
X-015240Y085308
X017780Y085308
X015240Y085308
X012700Y085308
X010160Y085308
X033856Y078958
X031656Y080228
X029456Y081498
X027257Y082768
X027257Y-082768
X029456Y-081498
X031656Y-080228
X033856Y-078958
X010160Y-085308
X012700Y-085308
X015240Y-085308
X017780Y-085308
X036055Y-077688
X038255Y-076418
X040455Y-075148
X042654Y-073878
X044854Y-072608
X047053Y-071338
X049253Y-070068
X051453Y-068798
X053652Y-067528
X055852Y-066258
X058052Y-064988
X058052Y064988
X055852Y066258
X053652Y067528
X051453Y068798
X049253Y070068
X047053Y071338
X044854Y072608
X042654Y073878
X040455Y075148
X038255Y076418
X036055Y077688
X073878Y042654
X072608Y044854
X071338Y047053
X070068Y049253
X068798Y051453
X067528Y053652
X066258Y055852
X064988Y058052
X082768Y027257
X081498Y029456
X080228Y031656
X078958Y033856
X077688Y036055
X076418Y038255
X075148Y040455
X078958Y-033856
X080228Y-031656
X081498Y-029456
X082768Y-027257
X064988Y-058052
X066258Y-055852
X067528Y-053652
X068798Y-051453
X070068Y-049253
X071338Y-047053
X072608Y-044854
X073878Y-042654
X075148Y-040455
X076418Y-038255
X077688Y-036055
X085308Y-017780
X085308Y-015240
X085308Y-012700
X085308Y-010160
X085308Y-007620
X085308Y-005080
X085308Y-002540
X085308Y000000
X085308Y002540
X085308Y005080
X085308Y007620
X085308Y010160
X085308Y012700
X085308Y015240
X085308Y017780
T03
X-110490Y-110490
X-101600Y-101600
X-110490Y110490
X-101600Y101600
X101600Y-101600
X101600Y101600
X110490Y110490
X110490Y-110490
T04
X000000Y000000
T05
X-013846Y-102601
X013383Y-102601
M30

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff