- fixed importing DXF file as Gerber method such that now the resulting Gerber object is correctly created having the geometry attributes like self.apertures and self.follow_geometry

This commit is contained in:
Marius Stanciu
2020-07-02 17:15:13 +03:00
parent 34c545ced5
commit e1dab238a7
5 changed files with 81 additions and 26 deletions

View File

@@ -2,20 +2,22 @@ from PyQt5 import QtWidgets
from camlib import Geometry, arc, arc_angle, ApertureMacro, grace
import numpy as np
import re
import logging
# import re
# import logging
import traceback
from copy import deepcopy
import sys
# import sys
from shapely.ops import cascaded_union
from shapely.affinity import scale, translate
from shapely.ops import unary_union, linemerge
# from shapely.affinity import scale, translate
import shapely.affinity as affinity
from shapely.geometry import box as shply_box, Polygon, LineString, Point, MultiPolygon
from shapely.geometry import box as shply_box
from lxml import etree as ET
import ezdxf
from appParsers.ParseDXF import *
from appParsers.ParseSVG import svgparselength, getsvggeo
import appTranslation as fcTranslate
import gettext
import builtins
@@ -502,10 +504,10 @@ class Gerber(Geometry):
if buff_length > 0:
if current_polarity == 'D':
self.solid_geometry = self.solid_geometry.union(cascaded_union(poly_buffer))
self.solid_geometry = self.solid_geometry.union(unary_union(poly_buffer))
else:
self.solid_geometry = self.solid_geometry.difference(cascaded_union(poly_buffer))
self.solid_geometry = self.solid_geometry.difference(unary_union(poly_buffer))
# follow_buffer = []
poly_buffer = []
@@ -1497,7 +1499,7 @@ class Gerber(Geometry):
else:
log.debug("Union by union()...")
new_poly = cascaded_union(poly_buffer)
new_poly = unary_union(poly_buffer)
new_poly = new_poly.buffer(0, int(self.steps_per_circle / 4))
log.warning("Union done.")
@@ -1601,7 +1603,7 @@ class Gerber(Geometry):
p2 = Point(loc[0], loc[1] - 0.5 * (height - width))
c1 = p1.buffer(width * 0.5, int(steps_per_circle / 4))
c2 = p2.buffer(width * 0.5, int(steps_per_circle / 4))
return cascaded_union([c1, c2]).convex_hull
return unary_union([c1, c2]).convex_hull
if aperture['type'] == 'P': # Regular polygon
loc = location.coords[0]
@@ -1836,6 +1838,56 @@ class Gerber(Geometry):
new_el['follow'] = pol.exterior
self.apertures['0']['geometry'].append(new_el)
def import_dxf_as_gerber(self, filename, units='MM'):
"""
Imports shapes from an DXF file into the Gerberobject geometry.
:param filename: Path to the DXF file.
:type filename: str
:param units: Application units
:return: None
"""
log.debug("Parsing DXF file geometry into a Gerber object geometry.")
# Parse into list of shapely objects
dxf = ezdxf.readfile(filename)
geos = getdxfgeo(dxf)
# trying to optimize the resulting geometry by merging contiguous lines
geos = linemerge(geos)
# Add to object
if self.solid_geometry is None:
self.solid_geometry = []
if type(self.solid_geometry) is list:
if type(geos) is list:
self.solid_geometry += geos
else:
self.solid_geometry.append(geos)
else: # It's shapely geometry
self.solid_geometry = [self.solid_geometry, geos]
# flatten the self.solid_geometry list for import_dxf() to import DXF as Gerber
flat_geo = list(self.flatten_list(self.solid_geometry))
if flat_geo:
self.solid_geometry = unary_union(flat_geo)
self.follow_geometry = self.solid_geometry
else:
return "fail"
# create the self.apertures data structure
if '0' not in self.apertures:
self.apertures['0'] = {}
self.apertures['0']['type'] = 'REG'
self.apertures['0']['size'] = 0.0
self.apertures['0']['geometry'] = []
for pol in flat_geo:
new_el = {}
new_el['solid'] = pol
new_el['follow'] = pol
self.apertures['0']['geometry'].append(deepcopy(new_el))
def scale(self, xfactor, yfactor=None, point=None):
"""
Scales the objects' geometry on the XY plane by a given factor.