Example #1
0
        def process(self):
            vertices_s = self.inputs['Vertices'].sv_get()
            u_size_s = self.inputs['USize'].sv_get()
            degree_u_s = self.inputs['DegreeU'].sv_get()
            degree_v_s = self.inputs['DegreeV'].sv_get()

            if self.input_mode == '1D':
                vertices_s = ensure_nesting_level(vertices_s, 3)
            else:
                vertices_s = ensure_nesting_level(vertices_s, 4)

            surfaces_out = []
            points_out = []
            knots_u_out = []
            knots_v_out = []
            for vertices, degree_u, degree_v, u_size in zip_long_repeat(
                    vertices_s, degree_u_s, degree_v_s, u_size_s):
                if isinstance(degree_u, (tuple, list)):
                    degree_u = degree_u[0]
                if isinstance(degree_v, (tuple, list)):
                    degree_v = degree_v[0]
                if isinstance(u_size, (tuple, list)):
                    u_size = u_size[0]

                if self.input_mode == '1D':
                    n_u = u_size
                    n_v = len(vertices) // n_u
                else:
                    n_u = len(vertices[0])
                    for i, verts_i in enumerate(vertices):
                        if len(verts_i) != n_u:
                            raise Exception(
                                "Number of vertices in row #{} is not the same as in the first ({} != {})!"
                                .format(i, n_u, len(verts_i)))
                    vertices = sum(vertices, [])
                    n_v = len(vertices) // n_u

                surf = fitting.interpolate_surface(
                    vertices,
                    n_u,
                    n_v,
                    degree_u,
                    degree_v,
                    centripetal=self.centripetal)

                points_out.append(surf.ctrlpts2d)
                knots_u_out.append(surf.knotvector_u)
                knots_v_out.append(surf.knotvector_v)
                surf = SvGeomdlSurface(surf)
                surfaces_out.append(surf)

            self.outputs['Surface'].sv_set(surfaces_out)
            self.outputs['ControlPoints'].sv_set(points_out)
            self.outputs['KnotsU'].sv_set(knots_u_out)
            self.outputs['KnotsV'].sv_set(knots_v_out)
Example #2
0
def fit_Standard_RV(N, M, sampled_data):

    # set up the fitting parameters
    p_ctrlpts = sampled_data
    size_u = M + 1
    size_v = N + 1
    degree_u = 3
    degree_v = 3

    # Do global surface approximation
    standard_RV_NURBS_surf = fitting.interpolate_surface(
        p_ctrlpts, size_u, size_v, degree_u, degree_v)

    standard_RV_NURBS_surf = convert.bspline_to_nurbs(standard_RV_NURBS_surf)

    return standard_RV_NURBS_surf
Example #3
0
def fit_Remapped_RV(N, M, points, flag=False):

    slice(N, points)
    slices = []
    cyl_coord_pts = []
    layers = []
    bins = slice.bins

    for j in range(0, len(slice.slices)):
        cyl_coord_pts.append(
            cart2cylinder(
                slice.slices[j][:, 0],
                slice.slices[j][:, 1],
                bins[j] * np.ones(len(slice.slices[j][:, 2])),
            ))

    cyl_coord_pts = np.array(cyl_coord_pts)

    # store all slices into layers array
    for i in range(0, len(cyl_coord_pts)):
        for j in range(0, len(cyl_coord_pts[i][0])):
            layers.append([
                cyl_coord_pts[:, 0][i][j],
                cyl_coord_pts[:, 1][i][j],
                cyl_coord_pts[:, 2][i][j],
            ])

    # segment the layers into angled segments
    layers = np.array(layers)

    segments = split_into_angles(M, layers)

    # find average points at each segment and slice

    chunks = []
    segment = []

    for i in range(0, len(segments)):
        segment.append(
            np.array([segments[i][0], segments[i][1], segments[i][2]]).T)
        for j in range(0, len(bins)):
            chunks.append(segment[i][segment[i][:, 2] == bins[j]])

    chunks = np.array(chunks)

    xbar = []
    ybar = []
    zbar = []

    cylData = []
    cartData = []

    if flag == True:
        for j in range(0, len(chunks)):
            if chunks[j].size == 0:
                print('')
            else:
                cylData.append(
                    cart2cylinder(chunks[j][:, 0], chunks[j][:, 1],
                                  chunks[j][:, 2]))

        for i in range(0, len(cylData)):

            cartData.append(
                cylinder2cart(cylData[i][0].max(), cylData[i][1].max(),
                              cylData[i][2].max()))

        for i in range(0, (N + 1)):
            cartData.append(
                cylinder2cart(cylData[i][0].max(), cylData[i][1].max(),
                              cylData[i][2].max()))
        X = np.array(cartData)
        # print(X)
        # ax.scatter(X[:,0],X[:,1],X[:,2])
    else:
        fig = plt.figure()
        ax = plt.axes(projection='3d')
        for j in range(0, len(chunks)):
            print(j)
            xbar.append(chunks[j][:, 0].mean())
            ybar.append(chunks[j][:, 1].mean())
            zbar.append(chunks[j][:, 2].max())
            print(len(chunks[j]))
            ax.scatter(chunks[j][:, 0], chunks[j][:, 1], chunks[j][:, 2])
            plt.show()
        for i in range(0, (N + 1)):
            xbar.append(chunks[i][:, 0].mean())
            ybar.append(chunks[i][:, 1].mean())
            zbar.append(chunks[i][:, 2].max())

        X = np.array([xbar, ybar, zbar]).T
    # test = []

    # # this orders the points from least to greatest height (z values)
    # for i in range(0, len(bins)):
    #     test.append(X[X[:, 2] == bins[i]])
    # for j in range(0, len(test)):
    #     for ii in range(0, len(test[i])):
    #         data.append([test[j][ii][0], test[j][ii][1], test[j][ii][2]])

    # data = np.array(data)

    # set up the fitting parameters
    p_ctrlpts = X
    size_u = M + 1
    size_v = N + 1
    degree_u = 3
    degree_v = 3

    # fit a surface by applying global interpolation
    remapped_NURBS_RV_surf = fitting.interpolate_surface(
        p_ctrlpts, size_u, size_v, degree_u, degree_v)

    return remapped_NURBS_RV_surf, X
Example #4
0
def fit_StandardRV():
    # load data
    rm_file = "N2_RV_P4_rm"
    points = np.loadtxt(rm_file + ".csv", delimiter=',')

    # split data into slices
    N = 15
    slice(N, points)
    slices = []
    temp = []
    layers = []
    bins = slice.bins

    for j in range(0, len(slice.slices)):
        temp.append(
            cylinder(slice.slices[j][:, 0], slice.slices[j][:, 1],
                     bins[j] * np.ones(len(slice.slices[j][:, 2]))))
    temp = np.array(temp)

    # store all slices into layers array
    for i in range(0, len(temp)):
        for j in range(0, len(temp[i][0])):
            layers.append(
                [temp[:, 0][i][j], temp[:, 1][i][j], temp[:, 2][i][j]])

    # segment the layers into angled segments
    layers = np.array(layers)
    M = N
    segments = split_into_angles(M, layers)

    # find average points at each segment and slice

    temp1 = []
    data = []
    # fig = plt.figure()
    # ax = plt.axes(projection= "3d")
    segment = []

    for i in range(0, len(segments)):
        segment.append(
            np.array([segments[i][0], segments[i][1], segments[i][2]]).T)
        for j in range(0, len(bins)):
            temp1.append(segment[i][segment[i][:, 2] == bins[j]])

    chunks = np.array(temp1)

    # ax.scatter(chunks[0][:,0],chunks[0][:,1],chunks[0][:,2])
    # fig = plt.figure()
    # ax = plt.axes(projection= "3d")
    # xbar = []
    # ybar = []
    # zbar = []

    # for j in range(0,len(chunks)):
    # 	xbar.append(chunks[j][:,0].mean())
    # 	ybar.append(chunks[j][:,1].mean())
    # 	zbar.append(chunks[j][:,2].max())
    # for i in range(0,(N+1)):
    # 	xbar.append(chunks[i][:,0].mean())
    # 	ybar.append(chunks[i][:,1].mean())
    # 	zbar.append(chunks[i][:,2].max())
    # X = np.array([xbar,ybar,zbar]).T

    cylData = []
    for j in range(0, len(chunks)):
        cylData.append(
            cylinder(chunks[j][:, 0], chunks[j][:, 1], chunks[j][:, 2]))

    cartData = []
    for i in range(0, len(cylData)):
        cartData.append(
            cart(cylData[i][0].max(), cylData[i][1].max(),
                 cylData[i][2].max()))
    for i in range(0, (N + 1)):
        cartData.append(
            cart(cylData[i][0].max(), cylData[i][1].max(),
                 cylData[i][2].max()))

    X = np.array(cartData)

    test = []

    # np.savetxt("sampled_"+ rm_file + ".csv",X,delimiter = ',')

    reg_file = "N2_RV_P0"
    xyz = np.loadtxt(reg_file + ".dat")
    xyz = preProcess(xyz)

    # X = np.loadtxt('sampled_' + reg_file + ".csv",delimiter = ',')
    # X = preProcess(X)

    # this orders the points from least to greatest height (z values)
    for i in range(0, len(bins)):
        test.append(X[X[:, 2] == bins[i]])
    for j in range(0, len(test)):
        for ii in range(0, len(test[i])):
            data.append([test[j][ii][0], test[j][ii][1], test[j][ii][2]])

    data = np.array(data)
    # ax.scatter(xbar,ybar,zbar)
    print(len(X))

    # set up the fitting parameters
    p_ctrlpts = X
    size_u = N + 1
    size_v = M + 1
    degree_u = 3
    degree_v = 3

    # Do global surface approximation
    surf = fitting.interpolate_surface(p_ctrlpts, size_u, size_v, degree_u,
                                       degree_v)

    surf = convert.bspline_to_nurbs(surf)
    print("surf", type(surf))

    # Extract curves from the approximated surface
    surf_curves = construct.extract_curves(surf)
    plot_extras = [
        dict(points=surf_curves['u'][0].evalpts,
             name="u",
             color="red",
             size=10),
        dict(points=surf_curves['v'][0].evalpts,
             name="v",
             color="black",
             size=10)
    ]
    surf.delta = 0.025
    # surf.vis = vis.VisSurface()
    # surf.render(extras=plot_extras)
    # exchange.export_obj(surf, rm_file + "_fit.obj")
    # exchange.export_obj(surf, reg_file + "_fit.obj")
    # visualize data samples, original RV data, and fitted surface
    eval_surf = np.array(surf.evalpts)
    # eval_surf = preProcess(eval_surf)

    # fig = plt.figure()
    # ax = plt.axes(projection="3d")
    # ax.scatter(eval_surf[:,0],eval_surf[:,1],eval_surf[:,2], color = 'r')
    # # ax.scatter3D(points[:, 0],points[:, 1],points[:, 2])
    # ax.scatter3D(xyz[:, 0],xyz[:, 1],xyz[:, 2])
    # ax.scatter(X[:,0],X[:,1],X[:,2])

    # ax.scatter(X[:,0],X[:,1],X[:,2])
    cpts = np.array(surf.ctrlpts)
    # np.savetxt('cpts_'+rm_file,cpts, delimiter = '	')
    # np.savetxt('cpts_'+ reg_file + ".csv",cpts, delimiter = ',')

    # fig = plt.figure()
    # ax = plt.axes(projection = "3d")
    # ax.scatter(X[:,0],X[:,1],X[:,2])
    # ax.scatter(cpts[:,0],cpts[:,1],cpts[:,2])
    # plt.show()
    return surf
    def process(self):
        vertices_s = self.inputs['Vertices'].sv_get()
        u_size_s = self.inputs['USize'].sv_get()
        degree_u_s = self.inputs['DegreeU'].sv_get()
        degree_v_s = self.inputs['DegreeV'].sv_get()

        if self.input_mode == '1D':
            vertices_s = ensure_nesting_level(vertices_s, 3)
        else:
            vertices_s = ensure_nesting_level(vertices_s, 4)

        surfaces_out = []
        points_out = []
        knots_u_out = []
        knots_v_out = []
        for vertices, degree_u, degree_v, u_size in zip_long_repeat(
                vertices_s, degree_u_s, degree_v_s, u_size_s):
            if isinstance(degree_u, (tuple, list)):
                degree_u = degree_u[0]
            if isinstance(degree_v, (tuple, list)):
                degree_v = degree_v[0]
            if isinstance(u_size, (tuple, list)):
                u_size = u_size[0]

            if self.input_mode == '1D':
                n_u = u_size
                n_v = len(vertices) // n_u
            else:
                n_u = len(vertices[0])
                for i, verts_i in enumerate(vertices):
                    if len(verts_i) != n_u:
                        raise Exception(
                            "Number of vertices in row #{} is not the same as in the first ({} != {})!"
                            .format(i, n_u, len(verts_i)))
                vertices = sum(vertices, [])
                n_v = len(vertices) // n_u

            if geomdl is not None and self.nurbs_implementation == SvNurbsMaths.GEOMDL:
                surf = fitting.interpolate_surface(
                    vertices,
                    n_u,
                    n_v,
                    degree_u,
                    degree_v,
                    centripetal=self.centripetal)
                surf = SvGeomdlSurface(surf)
            else:
                vertices_np = np.array(split_by_count(vertices, n_v))
                vertices_np = np.transpose(vertices_np, axes=(1, 0, 2))
                surf = interpolate_nurbs_surface(degree_u,
                                                 degree_v,
                                                 vertices_np,
                                                 metric=self.metric)

            points_out.append(surf.get_control_points().tolist())
            knots_u_out.append(surf.get_knotvector_u().tolist())
            knots_v_out.append(surf.get_knotvector_v().tolist())
            surfaces_out.append(surf)

        self.outputs['Surface'].sv_set(surfaces_out)
        self.outputs['ControlPoints'].sv_set(points_out)
        self.outputs['KnotsU'].sv_set(knots_u_out)
        self.outputs['KnotsV'].sv_set(knots_v_out)
Example #6
0
points = ((-5, -5, 0), (-2.5, -5, 0), (0, -5, 0), (2.5, -5, 0), (5, -5, 0),
          (7.5, -5, 0), (10, -5, 0), (-5, 0, 3), (-2.5, 0, 3), (0, 0, 3),
          (2.5, 0, 3), (5, 0, 3), (7.5, 0, 3), (10, 0, 3), (-5, 5, 0),
          (-2.5, 5, 0), (0, 5, 0), (2.5, 5, 0), (5, 5, 0), (7.5, 5, 0),
          (10, 5, 0), (-5, 7.5, -3), (-2.5, 7.5, -3), (0, 7.5, -3), (2.5, 7.5,
                                                                     -3),
          (5, 7.5, -3), (7.5, 7.5, -3), (10, 7.5, -3), (-5, 10, 0), (-2.5, 10,
                                                                     0),
          (0, 10, 0), (2.5, 10, 0), (5, 10, 0), (7.5, 10, 0), (10, 10, 0))
size_u = 5
size_v = 7
degree_u = 2
degree_v = 3

# Do global surface interpolation
surf = fitting.interpolate_surface(points, size_u, size_v, degree_u, degree_v)

# Plot the interpolated surface
surf.delta = 0.05
surf.vis = vis.VisSurface()
surf.render()

# # Visualize data and evaluated points together
# import numpy as np
# import matplotlib.pyplot as plt
# evalpts = np.array(surf.evalpts)
# pts = np.array(points)
# fig = plt.figure()
# ax = plt.axes(projection='3d')
# ax.scatter(evalpts[:, 0], evalpts[:, 1], evalpts[:, 2])
# ax.scatter(pts[:, 0], pts[:, 1], pts[:, 2], color="red")