This commit is contained in:
adam-urbanczyk
2020-06-01 16:21:20 +02:00
parent bce468d72d
commit 4dacf41629
3 changed files with 60 additions and 49 deletions

View File

@ -68,43 +68,50 @@ def importStep(fileName):
def _dxf_line(el): def _dxf_line(el):
try: try:
return (Edge.makeLine(Vector(el.dxf.start.xyz), return (Edge.makeLine(Vector(el.dxf.start.xyz), Vector(el.dxf.end.xyz)),)
Vector(el.dxf.end.xyz)),)
except Exception: except Exception:
return () return ()
def _dxf_circle(el): def _dxf_circle(el):
try: try:
return (Edge.makeCircle(el.dxf.radius, return (Edge.makeCircle(el.dxf.radius, Vector(el.dxf.center.xyz)),)
Vector(el.dxf.center.xyz)),)
except Exception: except Exception:
return () return ()
def _dxf_arc(el): def _dxf_arc(el):
try: try:
return (Edge.makeCircle(el.dxf.radius, return (
Edge.makeCircle(
el.dxf.radius,
Vector(el.dxf.center.xyz), Vector(el.dxf.center.xyz),
angle1=el.dxf.start_angle, angle1=el.dxf.start_angle,
angle2=el.dxf.end_angle),) angle2=el.dxf.end_angle,
),
)
except Exception: except Exception:
return () return ()
def _dxf_polyline(el): def _dxf_polyline(el):
rv = (DXF_CONVERTERS[e.dxf.dxftype](e) for e in el.virtual_entities()) rv = (DXF_CONVERTERS[e.dxf.dxftype](e) for e in el.virtual_entities())
return (e[0] for e in rv if e) return (e[0] for e in rv if e)
DXF_CONVERTERS = { DXF_CONVERTERS = {
'LINE' : _dxf_line, "LINE": _dxf_line,
'CIRCLE' : _dxf_circle, "CIRCLE": _dxf_circle,
'ARC' : _dxf_arc, "ARC": _dxf_arc,
'POLYLINE' : _dxf_polyline, "POLYLINE": _dxf_polyline,
'LWPOLYLINE' : _dxf_polyline "LWPOLYLINE": _dxf_polyline,
} }
def _dxf_convert(elements, tol): def _dxf_convert(elements, tol):
rv = [] rv = []
@ -124,23 +131,25 @@ def _dxf_convert(elements, tol):
edges_in = TopTools_HSequenceOfShape() edges_in = TopTools_HSequenceOfShape()
wires_out = TopTools_HSequenceOfShape() wires_out = TopTools_HSequenceOfShape()
for e in edges: edges_in.Append(e.wrapped) for e in edges:
edges_in.Append(e.wrapped)
ShapeAnalysis_FreeBounds.ConnectEdgesToWires_s(edges_in, tol, False, wires_out) ShapeAnalysis_FreeBounds.ConnectEdgesToWires_s(edges_in, tol, False, wires_out)
rv = [Shape.cast(el) for el in wires_out] rv = [Shape.cast(el) for el in wires_out]
return rv return rv
def importDXF(filename, tol=1e-6): def importDXF(filename, tol=1e-6):
dxf = ezdxf.readfile(filename) dxf = ezdxf.readfile(filename)
faces = [] faces = []
for name,layer in dxf.modelspace().groupby(dxfattrib='layer').items(): for name, layer in dxf.modelspace().groupby(dxfattrib="layer").items():
res = _dxf_convert(layer, tol) res = _dxf_convert(layer, tol)
if res: if res:
wire_sets = sortWiresByBuildOrder(res) wire_sets = sortWiresByBuildOrder(res)
for wire_set in wire_sets: for wire_set in wire_sets:
faces.append(Face.makeFromWires(wire_set[0], wire_set[1:])) faces.append(Face.makeFromWires(wire_set[0], wire_set[1:]))
return cq.Workplane('XY').newObject(faces) return cq.Workplane("XY").newObject(faces)

View File

@ -15,6 +15,7 @@ OUTDIR = tempfile.gettempdir()
# test data directory # test data directory
testdataDir = os.path.join(os.path.dirname(__file__), "testdata") testdataDir = os.path.join(os.path.dirname(__file__), "testdata")
class TestImporters(BaseTest): class TestImporters(BaseTest):
def importBox(self, importType, fileName): def importBox(self, importType, fileName):
""" """
@ -97,7 +98,8 @@ class TestImporters(BaseTest):
self.assertEqual(obj.solids().size(), 1) self.assertEqual(obj.solids().size(), 1)
obj = importers.importShape(importers.ImportTypes.DXF, filename, tol=1e-3) obj = importers.importShape(importers.ImportTypes.DXF, filename, tol=1e-3)
assert( obj.val().isValid() == True ) assert obj.val().isValid() == True
if __name__ == "__main__": if __name__ == "__main__":
import unittest import unittest