Пример #1
0
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
Пример #2
0
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