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,42 +68,49 @@ def importStep(fileName):
def _dxf_line(el):
try:
return (Edge.makeLine(Vector(el.dxf.start.xyz),
Vector(el.dxf.end.xyz)),)
return (Edge.makeLine(Vector(el.dxf.start.xyz), Vector(el.dxf.end.xyz)),)
except Exception:
return ()
def _dxf_circle(el):
try:
return (Edge.makeCircle(el.dxf.radius,
Vector(el.dxf.center.xyz)),)
return (Edge.makeCircle(el.dxf.radius, Vector(el.dxf.center.xyz)),)
except Exception:
return ()
def _dxf_arc(el):
try:
return (Edge.makeCircle(el.dxf.radius,
return (
Edge.makeCircle(
el.dxf.radius,
Vector(el.dxf.center.xyz),
angle1=el.dxf.start_angle,
angle2=el.dxf.end_angle),)
angle2=el.dxf.end_angle,
),
)
except Exception:
return ()
def _dxf_polyline(el):
rv = (DXF_CONVERTERS[e.dxf.dxftype](e) for e in el.virtual_entities())
return (e[0] for e in rv if e)
DXF_CONVERTERS = {
'LINE' : _dxf_line,
'CIRCLE' : _dxf_circle,
'ARC' : _dxf_arc,
'POLYLINE' : _dxf_polyline,
'LWPOLYLINE' : _dxf_polyline
}
"LINE": _dxf_line,
"CIRCLE": _dxf_circle,
"ARC": _dxf_arc,
"POLYLINE": _dxf_polyline,
"LWPOLYLINE": _dxf_polyline,
}
def _dxf_convert(elements, tol):
@ -124,23 +131,25 @@ def _dxf_convert(elements, tol):
edges_in = TopTools_HSequenceOfShape()
wires_out = TopTools_HSequenceOfShape()
for e in edges: edges_in.Append(e.wrapped)
ShapeAnalysis_FreeBounds.ConnectEdgesToWires_s(edges_in,tol,False,wires_out)
for e in edges:
edges_in.Append(e.wrapped)
ShapeAnalysis_FreeBounds.ConnectEdgesToWires_s(edges_in, tol, False, wires_out)
rv = [Shape.cast(el) for el in wires_out]
return rv
def importDXF(filename, tol=1e-6):
dxf = ezdxf.readfile(filename)
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)
if res:
wire_sets = sortWiresByBuildOrder(res)
for wire_set in wire_sets:
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
testdataDir = os.path.join(os.path.dirname(__file__), "testdata")
class TestImporters(BaseTest):
def importBox(self, importType, fileName):
"""
@ -85,19 +86,20 @@ class TestImporters(BaseTest):
filename = os.path.join(testdataDir, "gear.dxf")
obj = importers.importDXF(filename)
self.assertFalse( obj.val().isValid() )
self.assertFalse(obj.val().isValid())
obj = importers.importDXF(filename, tol=1e-3)
self.assertTrue( obj.val().isValid() )
self.assertEqual( obj.faces().size(), 1)
self.assertEqual( obj.wires().size(), 2)
self.assertTrue(obj.val().isValid())
self.assertEqual(obj.faces().size(), 1)
self.assertEqual(obj.wires().size(), 2)
obj = obj.wires().toPending().extrude(1)
self.assertTrue( obj.val().isValid() )
self.assertEqual( obj.solids().size(), 1)
self.assertTrue(obj.val().isValid())
self.assertEqual(obj.solids().size(), 1)
obj = importers.importShape(importers.ImportTypes.DXF, filename, tol=1e-3)
assert( obj.val().isValid() == True )
assert obj.val().isValid() == True
if __name__ == "__main__":
import unittest