Пример #1
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        curve1_s = self.inputs['Curve1'].sv_get()
        curve2_s = self.inputs['Curve2'].sv_get()

        curve1_s = ensure_nesting_level(curve1_s, 2, data_types=(SvCurve, ))
        curve2_s = ensure_nesting_level(curve2_s, 2, data_types=(SvCurve, ))

        points_out = []
        t1_out = []
        t2_out = []

        for curve1s, curve2s in zip_long_repeat(curve1_s, curve2_s):
            new_points = []
            new_t1 = []
            new_t2 = []
            for curve1, curve2 in self.match(curve1s, curve2s):
                curve1 = SvNurbsCurve.to_nurbs(curve1)
                if curve1 is None:
                    raise Exception("Curve1 is not a NURBS")
                curve2 = SvNurbsCurve.to_nurbs(curve2)
                if curve2 is None:
                    raise Exception("Curve2 is not a NURBS")

                if self.implementation == 'SCIPY':
                    t1s, t2s, ps = self.process_native(curve1, curve2)
                else:
                    t1s, t2s, ps = self.process_freecad(curve1, curve2)

                if self.check_intersection:
                    if not ps:
                        raise Exception("Some curves do not intersect!")

                if self.single:
                    if len(ps) >= 1:
                        ps = ps[0]
                        t1s = t1s[0]
                        t2s = t2s[0]

                new_points.append(ps)
                new_t1.append(t1s)
                new_t2.append(t2s)

            if self.split:
                n = len(curve1s)
                new_points = split_by_count(new_points, n)
                new_t1 = split_by_count(new_t1, n)
                new_t1 = transpose_list(new_t1)
                new_t2 = split_by_count(new_t2, n)

            points_out.append(new_points)
            t1_out.append(new_t1)
            t2_out.append(new_t2)

        self.outputs['Intersections'].sv_set(points_out)
        self.outputs['T1'].sv_set(t1_out)
        self.outputs['T2'].sv_set(t2_out)
Пример #2
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        vertices_s = self.inputs['Vertices'].sv_get()
        edges_s = self.inputs['Edges'].sv_get(default=[[]])
        faces_s = self.inputs['Faces'].sv_get(default=[[]])

        verts_out = []
        idxs_out = []

        for vertices, edges, faces in zip_long_repeat(vertices_s, edges_s,
                                                      faces_s):
            bm = bmesh_from_pydata(vertices, edges, faces)
            bm.faces.index_update()

            parser = SvQuadGridParser(bm)
            new_idxs = parser.get_verts_sequence()
            new_verts = parser.get_ordered_verts()

            if self.reverse_rows:
                new_idxs = list(reversed(new_idxs))
                new_verts = list(reversed(new_verts))

            if self.reverse_cols:
                new_idxs = [list(reversed(row)) for row in new_idxs]
                new_verts = [list(reversed(row)) for row in new_verts]

            if self.transpose:
                new_idxs = transpose_list(new_idxs)
                new_verts = transpose_list(new_verts)

            if self.join_rows:
                new_idxs = sum(new_idxs, [])
                new_verts = sum(new_verts, [])

            bm.free()

            verts_out.append(new_verts)
            idxs_out.append(new_idxs)

        self.outputs['Vertices'].sv_set(verts_out)
        self.outputs['Indexes'].sv_set(idxs_out)
Пример #3
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return
        if not self.inputs['Vertices'].is_linked:
            return

        vertices_s = self.inputs['Vertices'].sv_get()
        vertices_s = ensure_nesting_level(vertices_s, 4)
        surfaces = self.inputs['Surface'].sv_get()
        surfaces = ensure_nesting_level(surfaces, 4)

        objects = match_long_repeat([vertices_s, surfaces])

        result_vertices = []

        for vertices, surface in zip(*objects):
            if self.transpose:
                surface = transpose_list(surface)
            #print("Surface: {} of {} of {}".format(type(surface), type(surface[0]), type(surface[0][0])))
            spline = self.build_spline(surface)
            # uv_coords will be list[m] of lists[n] of 2-tuples of floats
            # number of "rows" and "columns" in uv_coords will match so of vertices.
            src_size_u, src_size_v, uv_coords = self.get_uv(vertices)
            if self.autoscale:
                u_index, v_index = self.get_other_axes()
                surface_flattened = [v for col in surface for v in col]
                scale_u = diameter(surface_flattened, u_index) / src_size_u
                scale_v = diameter(surface_flattened, v_index) / src_size_v
                scale_z = sqrt(scale_u * scale_v)
            else:
                scale_z = 1.0
            if self.flip:
                scale_z = -scale_z
            new_vertices = []
            for uv_row, vertices_row in zip(uv_coords, vertices):
                new_row = []
                for ((u, v), src_vertex) in zip(uv_row, vertices_row):
                    #print("UV: ({}, {}), SRC: {}".format(u, v, src_vertex))
                    spline_vertex = np.array(spline.eval(u, v))
                    spline_normal = np.array(
                        spline.normal(u, v, h=self.normal_precision))
                    #print("Spline: M {}, N {}".format(spline_vertex, spline_normal))
                    # Coordinate of source vertex corresponding to orientation axis
                    z = src_vertex[self.orient_axis]
                    new_vertex = tuple(spline_vertex +
                                       scale_z * z * spline_normal)
                    new_row.append(new_vertex)
                new_vertices.append(new_row)
            result_vertices.append(new_vertices)

        if not self.grouped:
            result_vertices = result_vertices[0]
        self.outputs['Vertices'].sv_set(result_vertices)
Пример #4
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return
        if not self.inputs['Vertices'].is_linked:
            return

        vertices_s = self.inputs['Vertices'].sv_get()
        vertices_s = ensure_nesting_level(vertices_s, 4)
        surfaces = self.inputs['Surface'].sv_get()
        surfaces = ensure_nesting_level(surfaces, 4)

        objects = match_long_repeat([vertices_s, surfaces])

        result_vertices = []

        for vertices, surface in zip(*objects):
            if self.transpose:
                surface = transpose_list(surface)
            #print("Surface: {} of {} of {}".format(type(surface), type(surface[0]), type(surface[0][0])))
            spline = self.build_spline(surface)
            # uv_coords will be list[m] of lists[n] of 2-tuples of floats
            # number of "rows" and "columns" in uv_coords will match so of vertices.
            src_size_u, src_size_v, uv_coords = self.get_uv(vertices)
            if self.autoscale:
                u_index, v_index = self.get_other_axes()
                surface_flattened = [v for col in surface for v in col]
                scale_u = diameter(surface_flattened, u_index) / src_size_u
                scale_v = diameter(surface_flattened, v_index) / src_size_v
                scale_z = sqrt(scale_u * scale_v)
            else:
                scale_z = 1.0
            if self.flip:
                scale_z = - scale_z
            new_vertices = []
            for uv_row, vertices_row in zip(uv_coords,vertices):
                new_row = []
                for ((u, v), src_vertex) in zip(uv_row, vertices_row):
                    #print("UV: ({}, {}), SRC: {}".format(u, v, src_vertex))
                    spline_vertex = np.array(spline.eval(u, v))
                    spline_normal = np.array(spline.normal(u, v, h=self.normal_precision))
                    #print("Spline: M {}, N {}".format(spline_vertex, spline_normal))
                    # Coordinate of source vertex corresponding to orientation axis
                    z = src_vertex[self.orient_axis]
                    new_vertex = tuple(spline_vertex + scale_z * z * spline_normal)
                    new_row.append(new_vertex)
                new_vertices.append(new_row)
            result_vertices.append(new_vertices)

        if not self.grouped:
            result_vertices = result_vertices[0]
        self.outputs['Vertices'].sv_set(result_vertices)