Esempio n. 1
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        face1_surfaces_s = self.inputs['SolidFace1'].sv_get()
        face1_surfaces_s = ensure_nesting_level(face1_surfaces_s,
                                                2,
                                                data_types=(SvSurface, ))
        face2_surfaces_s = self.inputs['SolidFace2'].sv_get()
        face2_surfaces_s = ensure_nesting_level(face2_surfaces_s,
                                                2,
                                                data_types=(SvSurface, ))

        solids_out = []
        for face1_surfaces, face2_surfaces in zip_long_repeat(
                face1_surfaces_s, face2_surfaces_s):
            for face1_surface, face2_surface in zip_long_repeat(
                    face1_surfaces, face2_surfaces):
                if not is_solid_face_surface(face1_surface):
                    face1_surface = surface_to_freecad(
                        face1_surface, make_face=True)  # SvFreeCadNurbsSurface
                if not is_solid_face_surface(face2_surface):
                    face2_surface = surface_to_freecad(
                        face2_surface, make_face=True)  # SvFreeCadNurbsSurface

                solid = self.make_solid(face1_surface, face2_surface)
                solids_out.append(solid)

        self.outputs['Solid'].sv_set(solids_out)
Esempio n. 2
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        face_surface_s = self.inputs['Profile'].sv_get()
        face_surface_s = ensure_nesting_level(face_surface_s,
                                              2,
                                              data_types=(SvSurface, ))
        curve_s = self.inputs['Path'].sv_get()
        curve_s = ensure_nesting_level(curve_s, 2, data_types=(SvCurve, ))

        solid_out = []
        for face_surfaces, curves in zip_long_repeat(face_surface_s, curve_s):
            for face_surface, curve in zip_long_repeat(face_surfaces, curves):
                if not is_solid_face_surface(face_surface):
                    face_surface = surface_to_freecad(face_surface,
                                                      make_face=True)
                curve = curve_to_freecad_nurbs(curve)
                if curve is None:
                    raise Exception("Path curve is not a NURBS!")

                solid = self.make_solid(face_surface.face, curve.curve)
                solid_out.append(solid)

        self.outputs['Solid'].sv_set(solid_out)
Esempio n. 3
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        face_surfaces_s = self.inputs['SolidFace'].sv_get()
        face_surfaces_s = ensure_nesting_level(face_surfaces_s, 2, data_types=(SvSurface,))
        offset_s = self.inputs['Offset'].sv_get()
        offset_s = ensure_nesting_level(offset_s, 2)
        tolerance_s = self.inputs['Tolerance'].sv_get()
        tolerance_s = ensure_nesting_level(tolerance_s, 2)

        solids_out = []
        for face_surfaces, offsets, tolerances in zip_long_repeat(face_surfaces_s, offset_s, tolerance_s):
            #new_solids = []
            for face_surface, offset, tolerance in zip_long_repeat(face_surfaces, offsets, tolerances):
                if not is_solid_face_surface(face_surface):
                    # face_surface is an instance of SvSurface,
                    # but not a instance of SvFreeCadNurbsSurface
                    self.debug("Surface %s is not a face of a solid, will convert automatically", face_surface)
                    face_surface = surface_to_freecad(face_surface, make_face=True) # SvFreeCadNurbsSurface

                continuity = face_surface.get_min_continuity()
                if continuity >= 0 and continuity < 1:
                    raise Exception("This node requires at least C1 continuity of the surface; only C0 is guaranteed by surface's knotvector")
                fc_face = face_surface.face
                shape = fc_face.makeOffsetShape(offset, tolerance, fill=True)
                solids_out.append(shape)
            #solids_out.append(new_solids)

        self.outputs['Solid'].sv_set(solids_out)
Esempio n. 4
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        face_surfaces_s = self.inputs['SolidFace'].sv_get()
        face_surfaces_s = ensure_nesting_level(face_surfaces_s,
                                               2,
                                               data_types=(SvSurface, ))
        offset_s = self.inputs['Vector'].sv_get()
        offset_s = ensure_nesting_level(offset_s, 3)

        solids_out = []
        for face_surfaces, offsets in zip_long_repeat(face_surfaces_s,
                                                      offset_s):
            #new_solids = []
            for face_surface, offset in zip_long_repeat(
                    face_surfaces, offsets):
                if not is_solid_face_surface(face_surface):
                    # face_surface is an instance of SvSurface,
                    # but not a instance of SvFreeCadNurbsSurface
                    self.debug(
                        "Surface %s is not a face of a solid, will convert automatically",
                        face_surface)
                    face_surface = surface_to_freecad(
                        face_surface, make_face=True)  # SvFreeCadNurbsSurface

                fc_face = face_surface.face
                fc_offset = Base.Vector(*offset)
                shape = fc_face.extrude(fc_offset)
                solids_out.append(shape)
            #solids_out.append(new_solids)

        self.outputs['Solid'].sv_set(solids_out)
Esempio n. 5
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        face_surfaces_s = self.inputs['SolidFaces'].sv_get()
        input_level = get_data_nesting_level(face_surfaces_s,
                                             data_types=(SvSurface, ))
        face_surfaces_s = ensure_nesting_level(face_surfaces_s,
                                               3,
                                               data_types=(SvSurface, ))

        solids_out = []
        for surfaces_i in face_surfaces_s:
            new_solids = []
            for surfaces in surfaces_i:
                for i in range(len(surfaces)):
                    if not is_solid_face_surface(surfaces[i]):
                        surfaces[i] = surface_to_freecad(surfaces[i],
                                                         make_face=True)
                solid = self.make_solid(surfaces)
                new_solids.append(solid)
            if input_level > 2:
                solids_out.append(new_solids)
            else:
                solids_out.extend(new_solids)

        self.outputs['Solid'].sv_set(solids_out)
Esempio n. 6
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        face_surfaces_s = self.inputs['SolidFace'].sv_get()
        face_surfaces_s = ensure_nesting_level(face_surfaces_s,
                                               3,
                                               data_types=(SvSurface, ))
        solids_s = self.inputs['Solid'].sv_get()
        solids_s = ensure_nesting_level(solids_s, 2, data_types=(Part.Shape, ))

        solids_out = []
        cut_faces_out = []
        for solids, face_surfaces_i in zip_long_repeat(solids_s,
                                                       face_surfaces_s):
            for solid, face_surfaces in zip_long_repeat(
                    solids, face_surfaces_i):
                for i in range(len(face_surfaces)):
                    if not is_solid_face_surface(face_surfaces[i]):
                        face_surfaces[i] = surface_to_freecad(
                            face_surfaces[i],
                            make_face=True)  # SvFreeCadNurbsSurface

                new_solids, cut_faces = make_solids(solid, face_surfaces)
                solids_out.append(new_solids)
                cut_faces_out.append(cut_faces)

        self.outputs['Solids'].sv_set(solids_out)
        if 'CutFaces' in self.outputs:
            self.outputs['CutFaces'].sv_set(cut_faces_out)
Esempio n. 7
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        curve_s = self.inputs['Curve'].sv_get()
        in_level = get_data_nesting_level(curve_s, data_types=(SvCurve,))
        curve_s = ensure_nesting_level(curve_s, 2, data_types=(SvCurve,))
        surface_s = self.inputs['Surface'].sv_get()
        surface_s = ensure_nesting_level(surface_s, 2, data_types=(SvSurface,))
        point_s = self.inputs['Point'].sv_get()
        point_s = ensure_nesting_level(point_s, 3)
        vector_s = self.inputs['Vector'].sv_get()
        vector_s = ensure_nesting_level(vector_s, 3)

        edges_out = []
        trims_out = []
        for curves, face_surfaces, points, vectors in zip_long_repeat(curve_s, surface_s, point_s, vector_s):
            new_edges = []
            new_trims = []
            for curve, face_surface, point, vector in zip_long_repeat(curves, face_surfaces, points, vectors):
                if not is_solid_face_surface(face_surface):
                    face_surface = surface_to_freecad(face_surface, make_face=True) # SvFreeCadNurbsSurface
                projection, trims = self.project(face_surface, curve, point, vector)
                new_edges.append(projection)
                new_trims.append(trims)

            if in_level == 1:
                edges_out.extend(new_edges)
                trims_out.extend(new_trims)
            else: # 2
                edges_out.append(new_edges)
                trims_out.append(new_trims)

        self.outputs['Curves'].sv_set(edges_out)
        self.outputs['TrimCurves'].sv_set(trims_out)
Esempio n. 8
0
    def process(self):

        if not any(socket.is_linked for socket in self.outputs):
            return

        surface_in = self.inputs['SolidFace'].sv_get()
        sites_in = self.inputs['Sites'].sv_get()
        iterations_in = self.inputs['Iterations'].sv_get()
        thickness_in = self.inputs['Thickness'].sv_get()
        weights_in = self.inputs['Weights'].sv_get(default=[[None]])

        surface_in = ensure_nesting_level(surface_in,
                                          2,
                                          data_types=(SvSurface, ))
        input_level = get_data_nesting_level(sites_in)
        sites_in = ensure_nesting_level(sites_in, 4)
        iterations_in = ensure_nesting_level(iterations_in, 2)
        thickness_in = ensure_nesting_level(thickness_in, 2)
        if self.inputs['Weights'].is_linked:
            weights_in = ensure_nesting_level(weights_in,
                                              2,
                                              data_types=(SvScalarField, ))

        nested_output = input_level > 3

        verts_out = []
        uvpoints_out = []
        for params in zip_long_repeat(surface_in, sites_in, iterations_in,
                                      thickness_in, weights_in):
            new_verts = []
            new_uvpoints = []
            for surface, sites, iterations, thickness, weights in zip_long_repeat(
                    *params):
                if is_solid_face_surface(surface):
                    fc_face = surface.face
                else:
                    fc_face = surface_to_freecad(surface, make_face=True).face

                uvpoints, sites = lloyd_on_fc_face(fc_face,
                                                   sites,
                                                   thickness,
                                                   iterations,
                                                   weight_field=weights)

                new_verts.append(sites)
                new_uvpoints.append(uvpoints)
            if nested_output:
                verts_out.append(new_verts)
                uvpoints_out.append(new_uvpoints)
            else:
                verts_out.extend(new_verts)
                uvpoints_out.extend(new_uvpoints)

        self.outputs['Sites'].sv_set(verts_out)
        self.outputs['UVPoints'].sv_set(uvpoints_out)
Esempio n. 9
0
def to_solid(ob):
    if isinstance(ob, Part.Shape):
        return ob
    elif isinstance(ob, SvCurve):
        return [c.curve.toShape() for c in curve_to_freecad(ob)]
    elif isinstance(ob, SvSurface):
        if is_solid_face_surface(ob):
            return ob.face
        else:
            return surface_to_freecad(ob, make_face=True).face
    else:
        raise TypeError(f"Unknown data type in input: {ob}")
Esempio n. 10
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        face_surfaces_s = self.inputs['SolidFace'].sv_get()
        face_surfaces_s = ensure_nesting_level(face_surfaces_s,
                                               2,
                                               data_types=(SvSurface, ))
        angle_s = self.inputs['Angle'].sv_get()
        angle_s = ensure_nesting_level(angle_s, 2)
        point_s = self.inputs['Point'].sv_get()
        point_s = ensure_nesting_level(point_s, 3)
        direction_s = self.inputs['Direction'].sv_get()
        direction_s = ensure_nesting_level(direction_s, 3)

        solids_out = []
        for face_surfaces, angles, points, directions in zip_long_repeat(
                face_surfaces_s, angle_s, point_s, direction_s):
            #new_solids = []
            for face_surface, angle, point, direction in zip_long_repeat(
                    face_surfaces, angles, points, directions):
                if not is_solid_face_surface(face_surface):
                    # face_surface is an instance of SvSurface,
                    # but not a instance of SvFreeCadNurbsSurface
                    self.debug(
                        "Surface %s is not a face of a solid, will convert automatically",
                        face_surface)
                    face_surface = surface_to_freecad(
                        face_surface, make_face=True)  # SvFreeCadNurbsSurface

                fc_face = face_surface.face
                fc_point = Base.Vector(*point)
                fc_direction = Base.Vector(*direction)
                shape = fc_face.revolve(fc_point, fc_direction, angle)
                solids_out.append(shape)
            #solids_out.append(new_solids)

        self.outputs['Solid'].sv_set(solids_out)
Esempio n. 11
0
 def calc(face_surface):
     if not is_solid_face_surface(face_surface):
         face_surface = surface_to_freecad(face_surface, make_face=True)
     a = face_surface.face.Area
     return [a]
Esempio n. 12
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        surface_s = self.inputs['Surface'].sv_get()
        surface_s = ensure_nesting_level(surface_s, 2, data_types=(SvSurface,))
        if self.inputs['Cut'].is_linked:
            curve_s = self.inputs['Cut'].sv_get()
            # List of curves per surface
            curve_s = ensure_nesting_level(curve_s, 3, data_types=(SvCurve,))
        else:
            curve_s = [[[]]]
        point_s = self.inputs['Point'].sv_get()
        point_s = ensure_nesting_level(point_s, 3)
        vector_s = self.inputs['Vector'].sv_get()
        vector_s = ensure_nesting_level(vector_s, 3)

        tolerance = 10 ** (-self.accuracy)

        faces_out = []
        trim_out = []
        edges_out = []
        for surfaces, curves_i, points, vectors in zip_long_repeat(surface_s, curve_s, point_s, vector_s):
            new_faces = []
            new_trim = []
            new_edges = []
            for surface, curves, point, vector in zip_long_repeat(surfaces, curves_i, points, vectors):
                if is_solid_face_surface(surface):
                    face_surface = surface
                else:
                    face_surface = surface_to_freecad(surface) # SvFreeCadNurbsSurface
                self.info(f"Surface: {face_surface}, n curves: {len(curves)}")
                if curves:
                    if self.close_wire:
                        t1 = curves[0].get_u_bounds()[0]
                        t2 = curves[-1].get_u_bounds()[-1]
                        p1 = curves[0].evaluate(t1)
                        p2 = curves[-1].evaluate(t2)
                        if np.linalg.norm(p1 - p2) > tolerance:
#                             if self.projection_type == 'UV':
#                                 fc_line = line2d(Base.Vector2d(p2), Base.Vector2d(p1))
#                                 line = SvFreeCadCurve(fc_line, (0,1), ndim=2)
#                                 curves = curves + [line]
#                             else:
                            line = SvLine.from_two_points(p2, p1)
                            curves = curves + [line]
                    trims, edges, face = self.cut(face_surface, curves, point, vector)
                else:
                    face = face_surface
                    trims = []
                    edges = []
                new_faces.append(face)
                new_trim.append(trims)
                new_edges.append(edges)

            faces_out.append(new_faces)
            trim_out.append(new_trim)
            edges_out.append(new_edges)

        self.outputs['SolidFace'].sv_set(faces_out)
        if 'UVCurves' in self.outputs:
            self.outputs['UVCurves'].sv_set(trim_out)
        if 'Edges' in self.outputs:
            self.outputs['Edges'].sv_set(edges_out)