fix bugs that fail judgement of path's containment

This commit is contained in:
Hiroshi Murayama 2019-12-30 17:51:48 +09:00
parent 244fcaa534
commit ca23fbd953
8 changed files with 9021 additions and 14 deletions

View file

@ -107,14 +107,14 @@ outline.write('outline.gml')
```
### Drawing Mode
PCB tools extension provide three type of translation method that affects geometric finish. These method are specified a value for ```draw_mode``` attribute, ```DM_LINE```, ```DM_MOUSE_BITES```, or ```DM_FILL```.<br>
PCB tools extension provide three type of translation method that affects geometric finish. These method are specified a value for ```draw_mode``` attribute, as ```DM_LINE```, ```DM_MOUSE_BITES```, or ```DM_FILL```.<br>
```DM_LINE``` and ```DM_MOUSE_BITES``` are used to translate to both of RX-274x and Excellon, however ```DM_FILL``` is used to translate to only RX-274x.
![Drawing Mode](https://raw.githubusercontent.com/wiki/opiopan/pcb-tools-extension/images/draw_mode.jpg)
- **draw_mode = DM_LINE**<br>
All edge expressed as DXF line object, circle object, arc object and plyline objects are translated to line and arc applied a circular aperture in case of RX-274x. That circular aperture r radius is specified by ```width``` attribute. Default value of width is 0.<br>
In case of Excellon, DXF objects are translated to routing path command sequence.
All edge expressed as DXF line object, circle object, arc object and plyline objects are translated to line and arc applied a circular aperture in case of RX-274x. That circular aperture radius is specified by ```width``` attribute. Default value of width is 0.<br>
In case of Excellon, DXF objects are translated to routing path command sequence.<br>
This function is useful to generate outline data of pnanelized PCB boad.
```python
@ -149,8 +149,8 @@ PCB tools extension provide three type of translation method that affects geomet
```
- **draw_mode = DM_FILL**<br>
You can translate DXF closed shape such as circle to RX-274x polygon fill sequence.<br>
In order to fill closed shape, ```DM_FILL``` has to be set to ```draw_mode``` property. In this mode, All object except closed shapes listed below are ignored.
You can translate DXF closed shapes such as circle to RX-274x polygon fill sequence.<br>
In order to fill closed shapes, ```DM_FILL``` has to be set to ```draw_mode``` property. In this mode, All object except closed shapes listed below are ignored.
- circle
- closed polyline
@ -158,7 +158,7 @@ PCB tools extension provide three type of translation method that affects geomet
If a closed shape is completly included in other closed shape, The inner shape will be draw with reversed polality of container shape as above example image.<br>
I assume there are two typical usecase for this mode.<br>
I assume there are two typical use cases for this mode.<br>
One is to arrange logo design on silk layer. This is superior to other method generating raster image data since image data express as vector data.<br>
The other one is generating gerber data represented cropped area of panelized PCB.
By merging rectangle and PCB outline data, generate a file represented cropped area as below, and this kind of data is useful to make PCB image look good a little bit.<br>
@ -169,7 +169,7 @@ PCB tools extension provide three type of translation method that affects geomet
ctx = gerberex.GerberComposition()
rectangle = gerberex.rectangle(width=100, height=100, units='metric')
rectangle = gerberex.rectangle(width=100, height=100, left=0, bottom=0, units='metric')
rectangle.draw_mode = rectangle.DM_FILL
ctx.merge(rectangle)

View file

@ -51,12 +51,13 @@ def _intersections_of_line_and_circle(start, end, center, radius, error_range):
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
e4 = error_range * error_range * error_range * error_range * 10
if delta > - e4 and delta < e4:
if distance > radius - error_range and distance < radius + error_range:
delta = 0
if delta < 0:
return None
@ -198,7 +199,7 @@ class DxfLineStatement(DxfStatement):
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:
if denominator >= -de and denominator <= de:
return []
from_dx = point_from[0] - self.start[0]
from_dy = point_from[1] - self.start[1]
@ -356,16 +357,25 @@ class DxfArcStatement(DxfStatement):
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 p1_angle >= region[0] - aerror and p1_angle <= region[1] + aerror:
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 p2_angle >= region[0] - aerror and p2_angle <= region[1] + aerror:
if is_contained(p2_angle, region, aerror):
pts.append(p2)
break

View file

@ -301,7 +301,7 @@ class DxfPath(object):
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])
normal = (standard[1], -standard[0])
def statements():
for i in range(index, len(self.statements)):
yield self.statements[i]

View file

@ -10,7 +10,7 @@ def read(fname):
METADATA = {
'name': 'pcb-tools-extension',
'version': "0.9.2",
'version': "0.9.3",
'author': 'Hiroshi Murayama <opiopan@gmail.com>',
'author_email': "opiopan@gmail.com",
'description': ("Extension for pcb-tools package to panelize gerber files"),

File diff suppressed because it is too large Load diff

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

@ -19,6 +19,7 @@ class TestExcellon(unittest.TestCase):
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:
@ -127,5 +128,26 @@ class TestExcellon(unittest.TestCase):
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()