def calc_rho(edges1, edges2): s = 0 for edge1, edge2 in zip(edges1, edges2): s1, e1 = get_edge_endpoints(edge1) s2, e2 = get_edge_endpoints(edge2) s += s1.distanceToPoint(s2) + e1.distanceToPoint(e2) return s
def curves_to_face(sv_curves, planar=True, force_nurbs=True, tolerance=None): """ Make a Part.Face from a list of SvCurve. Curves must have NURBS representation, must form a closed loop, and it must be planar, otherwise an exception will be raised. input: * list of SvCurve. * planar: True to make a flat face; in this case, all curves must lie exactly in one plane * force_nurbs: True if you want NURBS surface as output even when curves are not NURBS output: * SvSolidFaceSurface for face's surface; SvFreeCadNurbsSurface if force_nurbs == True. """ # Check sv_curves = sum([curve_to_freecad(curve) for curve in sv_curves], []) all_nurbs = all( isinstance(curve, SvFreeCadNurbsCurve) for curve in sv_curves) edges = [curve.curve.toShape() for curve in sv_curves] fc_curves = [edge.Curve for edge in edges] if tolerance is not None: for edge in edges: edge.fixTolerance(tolerance) try: wire = Part.Wire(edges[0]) for edge in edges[1:]: wire.add(edge) #wire = Part.Wire(edges) #for edge in edges: # wire.add(edge) except Exception as e: for edge in edges: print(f"Curve {edge.Curve}, endpoints: {get_edge_endpoints(edge)}") raise Exception(f"Can't build a Wire out of edges: {fc_curves}: {e}") if len(edges) != len(wire.Edges): raise Exception( f"Can't build a Wire out of edges: {fc_curves}: was able to add only {len(wire.Edges)} edges of {len(edges)}" ) #wire.fix(0, 0, 0) #wire.fixTolerance(1e-5) if not wire.isClosed(): last_point = None distance = None for i, edge in enumerate(wire.Edges): print( f"Edge #{i}, Curve {edge.Curve}, endpoints: {get_edge_endpoints(edge)}" ) p1, p2 = get_edge_endpoints(edge) if last_point is not None: distance = last_point.distanceToPoint(p1) print( f"#{i-1}-{i}: distance={distance}: ({last_point.x}, {last_point.y}, {last_point.z}) - ({p1.x}, {p1.y}, {p1.z})" ) last_point = p2 p1 = get_edge_endpoints(wire.Edges[-1])[1] p2 = get_edge_endpoints(wire.Edges[0])[0] distance = p1.distanceToPoint(p2) print(f"Last - first distance = {distance}") raise Exception(f"The wire is not closed: {sv_curves}") if planar: try: fc_face = Part.Face(wire) except Exception as e: raise Exception( f"Can't create a Face from {sv_curves}: {e}\nProbably these curves are not all lying in the same plane?" ) surface = SvSolidFaceSurface(fc_face) else: fc_face = Part.makeFilledFace(edges) surface = SvSolidFaceSurface(fc_face) if all_nurbs or force_nurbs: surface = surface.to_nurbs() return surface