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

@ -3440,7 +3440,7 @@ class Workplane(CQ):
r = solidRef.intersect(plane) r = solidRef.intersect(plane)
return self.newObject([r]) return self.newObject([r])
def toPending(self): def toPending(self):
""" """
Adds wires/edges to pendingWires/pendingEdges. Adds wires/edges to pendingWires/pendingEdges.

View File

@ -66,81 +66,90 @@ 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 (
Vector(el.dxf.center.xyz), Edge.makeCircle(
angle1=el.dxf.start_angle, el.dxf.radius,
angle2=el.dxf.end_angle),) Vector(el.dxf.center.xyz),
angle1=el.dxf.start_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 = []
edges = [] edges = []
for el in elements: for el in elements:
conv = DXF_CONVERTERS.get(el.dxf.dxftype) conv = DXF_CONVERTERS.get(el.dxf.dxftype)
if conv: if conv:
edges.extend(conv(el)) edges.extend(conv(el))
if edges: if edges:
comp = Compound.makeCompound(edges) comp = Compound.makeCompound(edges)
shape_out = OCP.TopoDS.TopoDS_Shape() shape_out = OCP.TopoDS.TopoDS_Shape()
BOPAlgo_Tools.EdgesToWires_s(comp.wrapped, shape_out) BOPAlgo_Tools.EdgesToWires_s(comp.wrapped, shape_out)
rv = Shape.cast(shape_out) rv = Shape.cast(shape_out)
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:
ShapeAnalysis_FreeBounds.ConnectEdgesToWires_s(edges_in,tol,False,wires_out) edges_in.Append(e.wrapped)
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):
""" """
@ -76,28 +77,29 @@ class TestImporters(BaseTest):
filename = os.path.join(testdataDir, "red_cube_blue_cylinder.step") filename = os.path.join(testdataDir, "red_cube_blue_cylinder.step")
objs = importers.importShape(importers.ImportTypes.STEP, filename) objs = importers.importShape(importers.ImportTypes.STEP, filename)
self.assertEqual(2, len(objs.all())) self.assertEqual(2, len(objs.all()))
def testImportDXF(self): def testImportDXF(self):
""" """
Test DXF import with various tolerances. Test DXF import with various tolerances.
""" """
filename = os.path.join(testdataDir, "gear.dxf") filename = os.path.join(testdataDir, "gear.dxf")
obj = importers.importDXF(filename) obj = importers.importDXF(filename)
self.assertFalse( obj.val().isValid() ) self.assertFalse(obj.val().isValid())
obj = importers.importDXF(filename, tol=1e-3) obj = importers.importDXF(filename, tol=1e-3)
self.assertTrue( obj.val().isValid() ) self.assertTrue(obj.val().isValid())
self.assertEqual( obj.faces().size(), 1) self.assertEqual(obj.faces().size(), 1)
self.assertEqual( obj.wires().size(), 2) self.assertEqual(obj.wires().size(), 2)
obj = obj.wires().toPending().extrude(1) obj = obj.wires().toPending().extrude(1)
self.assertTrue( obj.val().isValid() ) self.assertTrue(obj.val().isValid())
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