From e0d93910a62004490d95bd67a5b3425a7974965f Mon Sep 17 00:00:00 2001 From: Juan Pablo Caram Date: Sun, 5 Jan 2014 21:45:08 -0500 Subject: [PATCH] Clear area and mouse coordinates --- camlib.py | 29 ++ camlib.pyc | Bin 53244 -> 54173 bytes cirkuix.py | 13 +- cirkuix.ui | 31 ++ tests/KiCad_Squarer-F_Cu.gtl | 783 +++++++++++++++++++++++++++++++++++ tests/KiCad_Squarer.drl | 77 ++++ tests/test_excellon_1.py | 48 +++ 7 files changed, 979 insertions(+), 2 deletions(-) create mode 100644 tests/KiCad_Squarer-F_Cu.gtl create mode 100644 tests/KiCad_Squarer.drl create mode 100644 tests/test_excellon_1.py diff --git a/camlib.py b/camlib.py index c18b4913..f231ffbc 100644 --- a/camlib.py +++ b/camlib.py @@ -52,6 +52,31 @@ class Geometry: return 0 bounds = self.bounds() return (bounds[2]-bounds[0], bounds[3]-bounds[1]) + + def get_empty_area(self, boundary=None): + ''' + Returns the complement of self.solid_geometry within + the given boundary polygon. If not specified, it defaults to + the rectangular bounding box of self.solid_geometry. + ''' + if boundary == None: + boundary = self.solid_geometry.envelope + return boundary.difference(g.solid_geometry) + + def clear_polygon(self, polygon, tooldia, overlap = 0.15): + ''' + Creates geometry inside a polygon for a tool to cover + the whole area. + ''' + poly_cuts = [polygon.buffer(-tooldia/2.0)] + while(1): + polygon = poly_cuts[-1].buffer(-tooldia*(1-overlap)) + if polygon.area > 0: + poly_cuts.append(polygon) + else: + break + return poly_cuts + class Gerber (Geometry): def __init__(self): @@ -131,6 +156,10 @@ class Gerber (Geometry): return None def parse_file(self, filename): + ''' + Calls Gerber.parse_lines() with array of lines + read from the given file. + ''' gfile = open(filename, 'r') gstr = gfile.readlines() gfile.close() diff --git a/camlib.pyc b/camlib.pyc index 3970c11bf89155d279916ffe4f78cc52228d92ad..0697d73bd13cbac29d7d316af90a5f1478179ba7 100644 GIT binary patch delta 6875 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 O+v4t8Vyl;4Yx_TL#D4k! delta 6138 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 + + + + + + + + + + + + + + + @@ -369,6 +384,22 @@ 1 + + + 200 + True + False + 5 + 5 + 0 + X: 0.0 Y: 0.0 + + + False + True + 2 + + False diff --git a/tests/KiCad_Squarer-F_Cu.gtl b/tests/KiCad_Squarer-F_Cu.gtl new file mode 100644 index 00000000..8f105fd7 --- /dev/null +++ b/tests/KiCad_Squarer-F_Cu.gtl @@ -0,0 +1,783 @@ +G04 (created by PCBNEW (2013-07-07 BZR 4022)-stable) date 11/20/2013 5:37:08 PM* +%MOIN*% +G04 Gerber Fmt 3.4, Leading zero omitted, Abs format* +%FSLAX34Y34*% +G01* +G70* +G90* +G04 APERTURE LIST* +%ADD10C,0.00590551*% +%ADD11C,0.015*% +%ADD12R,0.0393X0.0629*% +%ADD13R,0.2125X0.244*% +%ADD14R,0.02X0.03*% +%ADD15R,0.144X0.08*% +%ADD16R,0.04X0.08*% +%ADD17R,0.0394X0.0354*% +%ADD18R,0.0354X0.0394*% +%ADD19R,0.063X0.071*% +%ADD20R,0.071X0.063*% +%ADD21C,0.1*% +%ADD22R,0.08X0.08*% +%ADD23C,0.08*% +%ADD24C,0.04*% +%ADD25C,0.02*% +G04 APERTURE END LIST* +G54D10* +G54D11* +X27233Y12376D02* +X27728Y12376D01* +X27461Y12071D01* +X27576Y12071D01* +X27652Y12033D01* +X27690Y11995D01* +X27728Y11919D01* +X27728Y11728D01* +X27690Y11652D01* +X27652Y11614D01* +X27576Y11576D01* +X27347Y11576D01* +X27271Y11614D01* +X27233Y11652D01* +X24021Y12300D02* +X24059Y12338D01* +X24135Y12376D01* +X24326Y12376D01* +X24402Y12338D01* +X24440Y12300D01* +X24478Y12223D01* +X24478Y12147D01* +X24440Y12033D01* +X23983Y11576D01* +X24478Y11576D01* +X4578Y11701D02* +X4121Y11701D01* +X4350Y11701D02* +X4350Y12501D01* +X4273Y12386D01* +X4197Y12310D01* +X4121Y12272D01* +X569Y1526D02* +X1064Y1526D01* +X797Y1221D01* +X911Y1221D01* +X988Y1183D01* +X1026Y1145D01* +X1064Y1069D01* +X1064Y878D01* +X1026Y802D01* +X988Y764D01* +X911Y726D01* +X683Y726D01* +X607Y764D01* +X569Y802D01* +X1407Y802D02* +X1445Y764D01* +X1407Y726D01* +X1369Y764D01* +X1407Y802D01* +X1407Y726D01* +X1711Y1526D02* +X2207Y1526D01* +X1940Y1221D01* +X2054Y1221D01* +X2130Y1183D01* +X2169Y1145D01* +X2207Y1069D01* +X2207Y878D01* +X2169Y802D01* +X2130Y764D01* +X2054Y726D01* +X1826Y726D01* +X1750Y764D01* +X1711Y802D01* +X2435Y1526D02* +X2702Y726D01* +X2969Y1526D01* +X1672Y14551D02* +X1291Y14551D01* +X1253Y14170D01* +X1291Y14208D01* +X1367Y14246D01* +X1558Y14246D01* +X1634Y14208D01* +X1672Y14170D01* +X1710Y14094D01* +X1710Y13903D01* +X1672Y13827D01* +X1634Y13789D01* +X1558Y13751D01* +X1367Y13751D01* +X1291Y13789D01* +X1253Y13827D01* +X1939Y14551D02* +X2205Y13751D01* +X2472Y14551D01* +X26525Y14651D02* +X26677Y14651D01* +X26753Y14613D01* +X26829Y14536D01* +X26867Y14384D01* +X26867Y14117D01* +X26829Y13965D01* +X26753Y13889D01* +X26677Y13851D01* +X26525Y13851D01* +X26448Y13889D01* +X26372Y13965D01* +X26334Y14117D01* +X26334Y14384D01* +X26372Y14536D01* +X26448Y14613D01* +X26525Y14651D01* +X27210Y14651D02* +X27210Y14003D01* +X27248Y13927D01* +X27286Y13889D01* +X27363Y13851D01* +X27515Y13851D01* +X27591Y13889D01* +X27629Y13927D01* +X27667Y14003D01* +X27667Y14651D01* +X27934Y14651D02* +X28391Y14651D01* +X28163Y13851D02* +X28163Y14651D01* +X17800Y13451D02* +X17952Y13451D01* +X18028Y13413D01* +X18104Y13336D01* +X18142Y13184D01* +X18142Y12917D01* +X18104Y12765D01* +X18028Y12689D01* +X17952Y12651D01* +X17800Y12651D01* +X17723Y12689D01* +X17647Y12765D01* +X17609Y12917D01* +X17609Y13184D01* +X17647Y13336D01* +X17723Y13413D01* +X17800Y13451D01* +X18485Y13451D02* +X18485Y12803D01* +X18523Y12727D01* +X18561Y12689D01* +X18638Y12651D01* +X18790Y12651D01* +X18866Y12689D01* +X18904Y12727D01* +X18942Y12803D01* +X18942Y13451D01* +X19209Y13451D02* +X19666Y13451D01* +X19438Y12651D02* +X19438Y13451D01* +X8900Y13326D02* +X9052Y13326D01* +X9128Y13288D01* +X9204Y13211D01* +X9242Y13059D01* +X9242Y12792D01* +X9204Y12640D01* +X9128Y12564D01* +X9052Y12526D01* +X8900Y12526D01* +X8823Y12564D01* +X8747Y12640D01* +X8709Y12792D01* +X8709Y13059D01* +X8747Y13211D01* +X8823Y13288D01* +X8900Y13326D01* +X9585Y13326D02* +X9585Y12678D01* +X9623Y12602D01* +X9661Y12564D01* +X9738Y12526D01* +X9890Y12526D01* +X9966Y12564D01* +X10004Y12602D01* +X10042Y12678D01* +X10042Y13326D01* +X10309Y13326D02* +X10766Y13326D01* +X10538Y12526D02* +X10538Y13326D01* +X28880Y726D02* +X28880Y1526D01* +X29261Y726D02* +X29261Y1526D01* +X29719Y726D01* +X29719Y1526D01* +X23705Y2126D02* +X23705Y2926D01* +X24086Y2126D02* +X24086Y2926D01* +X24544Y2126D01* +X24544Y2926D01* +X3355Y3126D02* +X3355Y3926D01* +X3736Y3126D02* +X3736Y3926D01* +X4194Y3126D01* +X4194Y3926D01* +G54D12* +X12278Y8961D03* +X14072Y8961D03* +G54D13* +X13175Y11834D03* +G54D14* +X5850Y7450D03* +X6600Y7450D03* +X5850Y8450D03* +X6225Y7450D03* +X6600Y8450D03* +X21075Y7400D03* +X21825Y7400D03* +X21075Y8400D03* +X21450Y7400D03* +X21825Y8400D03* +G54D15* +X15962Y2837D03* +G54D16* +X15962Y5437D03* +X15062Y5437D03* +X16862Y5437D03* +G54D17* +X23150Y6429D03* +X23150Y7021D03* +G54D18* +X20546Y5800D03* +X19954Y5800D03* +G54D17* +X22825Y7829D03* +X22825Y8421D03* +X21825Y9404D03* +X21825Y9996D03* +G54D18* +X19579Y9325D03* +X20171Y9325D03* +X4454Y9325D03* +X5046Y9325D03* +G54D17* +X6600Y9629D03* +X6600Y10221D03* +X7600Y8004D03* +X7600Y8596D03* +X8000Y6429D03* +X8000Y7021D03* +G54D18* +X5171Y5850D03* +X4579Y5850D03* +G54D19* +X12650Y7900D03* +X13750Y7900D03* +G54D20* +X11025Y9750D03* +X11025Y10850D03* +X13737Y4387D03* +X13737Y5487D03* +G54D19* +X16962Y6787D03* +X15862Y6787D03* +G54D17* +X20175Y7804D03* +X20175Y8396D03* +X6225Y5854D03* +X6225Y6446D03* +G54D18* +X16608Y7712D03* +X16016Y7712D03* +X23421Y9375D03* +X22829Y9375D03* +X24296Y7850D03* +X23704Y7850D03* +G54D17* +X21450Y5804D03* +X21450Y6396D03* +G54D18* +X9146Y8000D03* +X8554Y8000D03* +X8196Y9625D03* +X7604Y9625D03* +G54D17* +X10100Y10104D03* +X10100Y10696D03* +X5050Y7854D03* +X5050Y8446D03* +G54D14* +X28950Y6850D03* +X29700Y6850D03* +X28950Y7850D03* +X29325Y6850D03* +X29700Y7850D03* +G54D21* +X21825Y11925D03* +X22825Y12925D03* +X20825Y12925D03* +X20825Y10925D03* +X22825Y10925D03* +X21450Y3475D03* +X22450Y4475D03* +X20450Y4475D03* +X20450Y2475D03* +X22450Y2475D03* +X29325Y3475D03* +X30325Y4475D03* +X28325Y4475D03* +X28325Y2475D03* +X30325Y2475D03* +X29700Y11925D03* +X30700Y12925D03* +X28700Y12925D03* +X28700Y10925D03* +X30700Y10925D03* +G54D17* +X27425Y8571D03* +X27425Y7979D03* +G54D22* +X1375Y8325D03* +G54D23* +X1375Y9325D03* +X1375Y10325D03* +G54D22* +X16375Y9625D03* +G54D23* +X16375Y10625D03* +X16375Y11625D03* +G54D22* +X26375Y8425D03* +G54D23* +X26375Y9425D03* +X26375Y10425D03* +G54D22* +X10225Y2475D03* +G54D23* +X11225Y2475D03* +G54D22* +X28375Y8850D03* +G54D21* +X10400Y6275D03* +X25125Y5450D03* +X6600Y11925D03* +X7600Y12925D03* +X5600Y12925D03* +X5600Y10925D03* +X7600Y10925D03* +X6225Y3475D03* +X7225Y4475D03* +X5225Y4475D03* +X5225Y2475D03* +X7225Y2475D03* +G54D17* +X28225Y7254D03* +X28225Y7846D03* +G54D23* +X12375Y2475D03* +X30075Y6475D03* +X28225Y6775D03* +X20350Y7075D03* +X22300Y6950D03* +X7100Y6900D03* +X19475Y5175D03* +X24325Y9375D03* +X25175Y7850D03* +X17525Y7600D03* +X13625Y3325D03* +X11025Y8900D03* +X10000Y8000D03* +X8875Y9625D03* +X4950Y7275D03* +X3825Y5850D03* +G54D24* +X15962Y2837D02* +X15962Y1162D01* +X15962Y1162D02* +X15975Y1150D01* +X16375Y9625D02* +X17450Y9625D01* +X18650Y8425D02* +X18650Y1150D01* +X17450Y9625D02* +X18650Y8425D01* +X26375Y8425D02* +X26375Y7775D01* +X26350Y7800D02* +X26375Y7775D01* +X26375Y7775D02* +X26975Y7175D01* +X25700Y1150D02* +X18650Y1150D01* +X18650Y1150D02* +X16925Y1150D01* +X15975Y1150D02* +X16925Y1150D01* +X26975Y2425D02* +X25700Y1150D01* +X26975Y7175D02* +X26975Y2425D01* +X15962Y2837D02* +X15962Y5437D01* +X13175Y1150D02* +X13550Y1150D01* +X1375Y8325D02* +X1375Y3774D01* +X4000Y1150D02* +X13175Y1150D01* +X1375Y3774D02* +X4000Y1150D01* +X13550Y1150D02* +X15975Y1150D01* +G54D25* +X16016Y7712D02* +X15862Y7558D01* +X15862Y7558D02* +X15862Y6787D01* +G54D24* +X15962Y5437D02* +X15962Y6112D01* +X15862Y6212D02* +X15862Y6787D01* +X15962Y6112D02* +X15862Y6212D01* +X13175Y11834D02* +X13175Y14200D01* +X13150Y14225D02* +X13150Y14200D01* +X13175Y14200D02* +X13150Y14225D01* +X16375Y11625D02* +X16400Y11650D01* +X16400Y14175D02* +X16400Y14200D01* +X16400Y11650D02* +X16400Y14175D01* +X26375Y10425D02* +X26375Y12750D01* +X9775Y14200D02* +X13150Y14200D01* +X1375Y11475D02* +X4100Y14200D01* +X4100Y14200D02* +X9775Y14200D01* +X1375Y10325D02* +X1375Y11475D01* +X13150Y14200D02* +X15025Y14200D01* +X26375Y12750D02* +X24925Y14200D01* +X24925Y14200D02* +X16400Y14200D01* +X16400Y14200D02* +X14825Y14200D01* +X11025Y10850D02* +X12191Y10850D01* +X12191Y10850D02* +X13175Y11834D01* +G54D25* +X10100Y10696D02* +X10871Y10696D01* +X10871Y10696D02* +X11025Y10850D01* +X6225Y3399D02* +X6225Y5854D01* +X6225Y5854D02* +X5175Y5854D01* +X5175Y5854D02* +X5171Y5850D01* +X21450Y3799D02* +X21450Y5804D01* +X20546Y5800D02* +X21446Y5800D01* +X21446Y5800D02* +X21450Y5804D01* +X6600Y10221D02* +X6600Y11575D01* +X21825Y11525D02* +X21825Y9996D01* +X8000Y7021D02* +X8000Y7200D01* +X7600Y7600D02* +X7600Y8004D01* +X8000Y7200D02* +X7600Y7600D01* +X7600Y8004D02* +X8550Y8004D01* +X8550Y8004D02* +X8554Y8000D01* +X10400Y6275D02* +X9875Y6275D01* +X9721Y6429D02* +X9875Y6275D01* +X9721Y6429D02* +X8000Y6429D01* +X6225Y6446D02* +X6554Y6446D01* +X7579Y6429D02* +X8000Y6429D01* +X7375Y6225D02* +X7579Y6429D01* +X6775Y6225D02* +X7375Y6225D01* +X6554Y6446D02* +X6775Y6225D01* +X8000Y6429D02* +X8000Y6275D01* +X8000Y6275D02* +X8000Y6429D01* +X6225Y6446D02* +X6225Y7450D01* +X6600Y9629D02* +X6600Y8450D01* +X7604Y9625D02* +X6604Y9625D01* +X6604Y9625D02* +X6600Y9629D01* +X7600Y8596D02* +X7600Y9621D01* +X7600Y9621D02* +X7604Y9625D01* +X23150Y7021D02* +X23150Y7275D01* +X22825Y7600D02* +X22825Y7829D01* +X23150Y7275D02* +X22825Y7600D01* +X22825Y7829D02* +X23683Y7829D01* +X23683Y7829D02* +X23704Y7850D01* +X24725Y6050D02* +X25125Y5650D01* +X24346Y6429D02* +X24725Y6050D01* +X23150Y6429D02* +X24346Y6429D01* +X25125Y5650D02* +X25125Y5450D01* +X21450Y6396D02* +X21679Y6396D01* +X23150Y6425D02* +X23150Y6429D01* +X22775Y6425D02* +X23150Y6425D01* +X22600Y6250D02* +X22775Y6425D01* +X21825Y6250D02* +X22600Y6250D01* +X21679Y6396D02* +X21825Y6250D01* +X21450Y7400D02* +X21450Y6396D01* +X21825Y8400D02* +X21825Y9404D01* +X21825Y9404D02* +X21854Y9375D01* +X21854Y9375D02* +X22829Y9375D01* +X22829Y9375D02* +X22825Y9371D01* +X22825Y9371D02* +X22825Y8421D01* +G54D24* +X1375Y9325D02* +X4454Y9325D01* +X5050Y8725D02* +X5050Y9321D01* +X5050Y9321D02* +X5046Y9325D01* +X5050Y8446D02* +X5050Y8725D01* +X5850Y8725D02* +X5850Y8450D01* +X5050Y8725D02* +X5850Y8725D01* +X19579Y9325D02* +X19400Y9325D01* +X18100Y10625D02* +X19400Y9325D01* +X18100Y10625D02* +X16375Y10625D01* +X20171Y9325D02* +X20171Y8400D01* +X20171Y8400D02* +X21075Y8400D01* +X26375Y9425D02* +X27050Y9425D01* +X27425Y8625D02* +X27425Y8571D01* +X27425Y9050D02* +X27425Y8625D01* +X27050Y9425D02* +X27425Y9050D01* +G54D25* +X28375Y8850D02* +X28375Y7925D01* +X28375Y7925D02* +X28225Y7846D01* +G54D24* +X28225Y7846D02* +X28921Y7846D01* +X28925Y7850D02* +X28950Y7850D01* +X28921Y7846D02* +X28925Y7850D01* +X28225Y7846D02* +X27454Y7846D01* +X27425Y7875D02* +X27425Y7979D01* +X27454Y7846D02* +X27425Y7875D01* +X10225Y2475D02* +X10225Y2950D01* +X12175Y5550D02* +X12162Y5550D01* +X12175Y4900D02* +X12175Y5550D01* +X10225Y2950D02* +X12175Y4900D01* +X13750Y7900D02* +X14072Y8222D01* +X12162Y5487D02* +X12162Y5550D01* +X12162Y5550D02* +X12162Y6362D01* +X14072Y7147D02* +X14072Y8961D01* +X13650Y6725D02* +X14072Y7147D01* +X12525Y6725D02* +X13650Y6725D01* +X12162Y6362D02* +X12525Y6725D01* +X12162Y5487D02* +X13737Y5487D01* +X15062Y5437D02* +X13787Y5437D01* +X13787Y5437D02* +X13737Y5487D01* +X14072Y8222D02* +X14072Y8961D01* +X11225Y2475D02* +X12375Y2475D01* +G54D25* +X29700Y6850D02* +X29800Y6750D01* +X29800Y6750D02* +X29700Y6850D01* +G54D24* +X29825Y6725D02* +X30100Y6450D01* +X28225Y6800D02* +X28800Y6800D01* +X28850Y6800D02* +X28825Y6775D01* +X28800Y6800D02* +X28850Y6800D01* +X28225Y7254D02* +X28225Y6800D01* +X28225Y6800D02* +X28225Y6800D01* +X28225Y6800D02* +X28225Y6775D01* +G54D25* +X21075Y7400D02* +X20900Y7400D01* +G54D24* +X20900Y7400D02* +X20625Y7400D01* +G54D25* +X5850Y7450D02* +X5725Y7450D01* +G54D24* +X5050Y7475D02* +X5075Y7450D01* +X5075Y7450D02* +X5725Y7450D01* +X5050Y7475D02* +X5050Y7854D01* +X20625Y7400D02* +X20350Y7125D01* +X20350Y7125D02* +X20350Y7075D01* +G54D25* +X21825Y7400D02* +X21850Y7400D01* +X21850Y7400D02* +X22300Y6950D01* +X6600Y7450D02* +X6625Y7450D01* +X7125Y6925D02* +X7100Y6900D01* +X7150Y6925D02* +X7125Y6925D01* +X6625Y7450D02* +X7150Y6925D01* +G54D24* +X19954Y5800D02* +X19479Y5179D01* +X19479Y5179D02* +X19475Y5175D01* +X23421Y9375D02* +X24325Y9375D01* +X24296Y7850D02* +X25175Y7850D01* +X16962Y6787D02* +X16962Y7037D01* +X16962Y7037D02* +X17525Y7600D01* +X13737Y4387D02* +X13737Y3437D01* +X13737Y3437D02* +X13625Y3325D01* +X11025Y9750D02* +X11025Y8900D01* +X9146Y8000D02* +X10000Y8000D01* +X8196Y9625D02* +X8875Y9625D01* +X5050Y7854D02* +X5050Y7375D01* +X5050Y7375D02* +X4950Y7275D01* +X4579Y5850D02* +X3825Y5850D01* +G54D25* +X16608Y7712D02* +X16962Y7358D01* +X16962Y7358D02* +X16962Y6787D01* +G54D24* +X16862Y5437D02* +X16962Y5537D01* +X16962Y5537D02* +X16962Y6787D01* +X12278Y8961D02* +X12278Y8272D01* +X12278Y8272D02* +X12650Y7900D01* +X11025Y9750D02* +X11489Y9750D01* +X11489Y9750D02* +X12278Y8961D01* +G54D25* +X10100Y10104D02* +X10454Y9750D01* +X10454Y9750D02* +X11025Y9750D01* +G54D24* +X20175Y7804D02* +X20175Y7750D01* +X20525Y7400D02* +X20625Y7400D01* +X20175Y7750D02* +X20525Y7400D01* +G54D25* +X29325Y6850D02* +X29325Y3475D01* +X29700Y11925D02* +X29700Y7850D01* +M02* diff --git a/tests/KiCad_Squarer.drl b/tests/KiCad_Squarer.drl new file mode 100644 index 00000000..096d6413 --- /dev/null +++ b/tests/KiCad_Squarer.drl @@ -0,0 +1,77 @@ +M48 +;DRILL file {Pcbnew (2013-07-07 BZR 4022)-stable} date 11/20/2013 1:52:19 PM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.030 +T2C0.040 +T3C0.060 +% +G90 +G05 +M72 +T1 +X010400Y006275 +X025125Y005450 +T2 +X001375Y010325 +X001375Y009325 +X001375Y008325 +X003825Y005850 +X004950Y007275 +X007100Y006900 +X008875Y009625 +X010000Y008000 +X010225Y002475 +X011025Y008900 +X011225Y002475 +X012375Y002475 +X013625Y003325 +X016375Y011625 +X016375Y010625 +X016375Y009625 +X017525Y007600 +X019475Y005175 +X020350Y007075 +X022300Y006950 +X024325Y009375 +X025175Y007850 +X026375Y010425 +X026375Y009425 +X026375Y008425 +X028225Y006775 +X028375Y008850 +X030075Y006475 +T3 +X005225Y004475 +X005225Y002475 +X005600Y012925 +X005600Y010925 +X006225Y003475 +X006600Y011925 +X007225Y004475 +X007225Y002475 +X007600Y012925 +X007600Y010925 +X020450Y004475 +X020450Y002475 +X020825Y012925 +X020825Y010925 +X021450Y003475 +X021825Y011925 +X022450Y004475 +X022450Y002475 +X022825Y012925 +X022825Y010925 +X028325Y004475 +X028325Y002475 +X028700Y012925 +X028700Y010925 +X029325Y003475 +X029700Y011925 +X030325Y004475 +X030325Y002475 +X030700Y012925 +X030700Y010925 +T0 +M30 diff --git a/tests/test_excellon_1.py b/tests/test_excellon_1.py new file mode 100644 index 00000000..5bf065f9 --- /dev/null +++ b/tests/test_excellon_1.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Jan 05 13:30:47 2014 + +@author: jpcaram +""" + +import os +os.chdir('../') + +from camlib import * +#from matplotlib.figure import Figure +from matplotlib import pyplot + +# Gerber. To see if the Excellon is correct +project_dir = "tests/" +gerber_filename = project_dir + "KiCad_Squarer-F_Cu.gtl" +g = Gerber() +g.parse_file(gerber_filename) +g.create_geometry() + +excellon_filename = project_dir + "KiCad_Squarer.drl" +ex = Excellon() +ex.parse_file(excellon_filename) +ex.create_geometry() + +#fig = Figure() +fig = pyplot.figure() +ax = fig.add_subplot(111) +ax.set_aspect(1) + +# Plot gerber +for geo in g.solid_geometry: + x, y = geo.exterior.coords.xy + plot(x, y, 'k-') + for ints in geo.interiors: + x, y = ints.coords.xy + ax.plot(x, y, 'k-') + +# Plot excellon +for geo in ex.solid_geometry: + x, y = geo.exterior.coords.xy + plot(x, y, 'r-') + for ints in geo.interiors: + x, y = ints.coords.xy + ax.plot(x, y, 'g-') + +fig.show() \ No newline at end of file