diff Rotate.py @ 17:27af4a7b1e1d draft

Uploaded
author mb2013
date Tue, 20 May 2014 03:29:26 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Rotate.py	Tue May 20 03:29:26 2014 -0400
@@ -0,0 +1,273 @@
+# Rotate ply file to normalized position
+# based at points on symmetry axis
+# MB
+
+import math
+from math import *
+import sys
+import numpy
+
+# Main function
+def main():
+    # input user .ply file
+    name_file_ply = sys.argv[1]
+    # input user symmetry points file
+    sym_points_file  = sys.argv[2]
+
+    # to function 'extracting header', return header features
+    var_header,var_vertex_nm,var_face_nm, var_col = extracting_header(name_file_ply)
+
+    # to function 'extracting symmetry points', return symmetry points and list with new vertex
+    listsym,listtotal_vertex = extracting_symmetry_points(sym_points_file)
+
+    # to function 'extracting coordiantes', return list vertex and colors
+    listtotal_vertex, listtotal_colors = extracting_coordinates(name_file_ply,
+                                                                var_header,var_vertex_nm,var_face_nm,
+                                                                listtotal_vertex, var_col)
+    # to function 'shift to zero'
+    shift_to_zero(listsym,listtotal_vertex)
+
+    # to function 'write ply file'
+    write_ply_file(name_file_ply, var_header,var_vertex_nm,var_face_nm,
+                   listtotal_colors, listtotal_vertex)
+
+    
+# Function to extract all the values of the header of the ply file
+def extracting_header(name_file_ply):
+    file_ply = open(name_file_ply) # open ply file
+    var_col = 0 # color variable
+    count = 0 # counter 
+
+    # for the first lines of the ply file
+    for line in range(0, 40):
+        readheader = file_ply.readline().strip().split()
+        if len(readheader) != 0:
+            if readheader[0] == 'end_header':
+                var_header = count
+                
+            # If there are colors in the ply file    
+            if 'red' in readheader:
+                var_col += 1
+            if 'blue' in readheader:
+                var_col += 1
+            if 'green' in readheader:
+                var_col += 1
+                
+            # extracting number of vertexen    
+            if readheader[0] == "element" and readheader[1] == "vertex":
+                var_vertex_nm = readheader[2]
+                
+            # extracting number of faces    
+            if readheader[0] == "element" and readheader[1] == "face":
+                var_face_nm = readheader[2]
+            count += 1
+        else:
+            continue
+    
+    file_ply.close() # closing ply file
+    return var_header, var_vertex_nm,var_face_nm, var_col    # return values to main
+
+# Function for extracting the values of the symmetry points file
+def extracting_symmetry_points(sym_points_file):
+    sympoints = open(sym_points_file) # open symmetry file
+    symlines = sympoints.readlines() # read all the lines of file
+    listsym = [] # symmetry points
+    listtotal_vertex = [] # vertexen
+    # every line in the sym file
+    for sym in range(0,len(symlines)):
+        symline_1 = symlines[sym].strip().split()
+        listsym.append(symlines[sym].strip().split()) #add symmetry points  
+        listtotal_vertex.append(symlines[sym].strip().split()) # add symmetry points
+
+    sympoints.close() # close symmetry file
+    return listsym,listtotal_vertex # return symmetry points list and vertex list 
+    
+                           
+# Function to extract the coordinates of the ply file
+def extracting_coordinates(name_file_ply, var_header,var_vertex_nm,var_face_nm, listtotal_vertex, var_col):
+    file1 = open(name_file_ply) # open ply file
+
+    sub_list = [] #sublist coordinates
+    listtotal_colors = [] # color list
+    sub_colors = [] # sublist color
+
+    # coordinates of ply file to list
+    for coordinates_ln in range(0, (int(var_header) + int(var_vertex_nm) + int(var_face_nm) + 1)):
+        line = file1.readline().strip().split()
+        if (int(var_header) < coordinates_ln < (int(var_vertex_nm)+ int(var_header)+1)):
+            rayx = sub_list.append(line[0])
+            rayy = sub_list.append(line[1])
+            rayz = sub_list.append(line[2])
+            listtotal_vertex.append(sub_list) #x y z coordinates to list
+            sub_list = []
+            if var_col != 0: #if color code is not 0
+                color_x = sub_colors.append(line[3])
+                color_y = sub_colors.append(line[4])
+                color_z = sub_colors.append(line[5])
+                listtotal_colors.append(sub_colors) #colors to list
+                sub_colors = []
+        
+    return listtotal_vertex, listtotal_colors # return coordinates (vertexen) and color lists
+
+
+# Function to calculate the values in the Z rotation matrix
+def Rz_matrix(z_angle): # Rz rotation matrix
+    return [[cos(math.radians(z_angle)), -sin(math.radians(z_angle)), 0.0],[sin(math.radians(z_angle)),cos(math.radians(z_angle)),0.0],[0.0, 0.0, 1.0]]
+
+# Function to calculate the new coordinates rotated with Z rotation matrix
+def Z_rotation(point2, z_angle): # multiplication rotation matrix and coordinates 
+    r_z = Rz_matrix(z_angle)
+    rotated_z = []               
+    for i in range(3):
+        rotated_z.append((sum([r_z[i][j] * point2[j] for j in range(3)])))
+    return rotated_z
+
+# Function to calculate the values in the X rotation matrix
+def Rx_matrix(x_angle): #rotation matrix x-axis
+    return [[1, 0, 0],[0,cos(math.radians(x_angle)),-sin(math.radians(x_angle))],[0,sin(math.radians(x_angle)),cos(math.radians(x_angle))]]
+
+# Function to calculate the new coordinates rotated with X rotation matrix
+def X_rotation(point3, x_angle): #multiplication rotation matrix and coordinates 
+    r_x = Rx_matrix(x_angle)
+    rotated_x = []  
+    for i in range(3):
+        rotated_x.append((sum([r_x[i][j] * point3[j] for j in range(3)])))
+    return rotated_x
+
+# Function to calculate the values in the Y rotation matrix
+def Ry_matrix(y_angle): # Ry rotation matrix
+    return [[cos(math.radians(y_angle)), 0.0, sin(math.radians(y_angle))],[0.0, 1.0, 0.0],[-sin(math.radians(y_angle)),0.0, cos(math.radians(y_angle))]]
+
+# Function to calculate the new coordinates rotated with Y rotation matrix
+def Y_rotation(point4, y_angle): #multiplication rotation matrix and coordinates 
+    r_y = Ry_matrix(y_angle)
+    rotated_y = []
+    for i in range(3):
+        rotated_y.append((sum([r_y[i][j] * point4[j] for j in range(3)])))
+    return rotated_y
+
+#Function to shift the object to the zeropoint
+def shift_to_zero(listsym, listtotal_vertex):
+    sym3 = listsym[2]
+    zeropoint = sym3
+    list2 = [] # sublist coordinates
+    listdata3 = [] # new coordinates
+    # every coordinate minus the sym3 coordinates 
+    for vertex in range(0,len(listtotal_vertex)):
+        list2.append(float(listtotal_vertex[vertex][0]) - float(zeropoint[0]))
+        list2.append(float(listtotal_vertex[vertex][1]) - float(zeropoint[1]))
+        list2.append(float(listtotal_vertex[vertex][2]) - float(zeropoint[2]))
+        listdata3.append(list2) # add new coordinates to list
+        list2 = []
+
+    # to function 'rotate z axis'
+    rotate_z_axis(listdata3)
+
+# Function for rotating the object around z axis
+def rotate_z_axis(listdata3):
+    # If object is upside down, 180 degrees rotation around the Z axis is needed.
+    listdatatemp = []
+    # check if object is upside down
+    if listdata3[0][1] < listdata3[2][1]:
+        angle = 180
+        # rotate 180 degrees. 
+        for coordinates in range(0,len(listdata3)):
+            listdatatemp.append(Z_rotation(listdata3[coordinates], angle))
+        listdata3 = listdatatemp # new coordinates
+
+
+    # calculate angle rotation z
+    len_z_a = listdata3[0][0] - listdata3[2][0]
+    len_z_b = listdata3[0][1] - listdata3[2][1]
+    z_angle = (math.degrees(math.atan(len_z_a/len_z_b)))
+
+    # calculate new coordinates with rotation matrix of Z
+    listdata4 = []
+    for coordinates in range(0, len(listdata3)):
+        listdata4.append(Z_rotation(listdata3[coordinates], z_angle)) # add new coordinates to list
+    listdata3 = []
+    
+    # to function 'rotate x axis'
+    rotate_x_axis(listdata4)
+
+# Function for rotating the object around x axis
+def rotate_x_axis(listdata4):
+    #calculate angle rotation x
+    len_x_a = listdata4[0][2] - listdata4[2][0]
+    len_x_b = listdata4[0][1] - listdata4[2][0]
+    x_angle = -(math.degrees(math.atan(len_x_a/len_x_b)))
+
+    # calculate new coordinates with rotation matrix of X
+    listdata5 = []
+    for coordinates in range(0, len(listdata4)):
+        listdata5.append(X_rotation(listdata4[coordinates], x_angle)) # add new coordinates to list
+    listdata4 = []
+
+    # to function 'rotate y axis'
+    rotate_y_axis(listdata5)
+
+# Function for rotating the object around y axis
+def rotate_y_axis(listdata5):
+    #calculate angle rotation y
+    len_y_a = (listdata5[1][0] - listdata5[2][0])
+    len_y_b = (listdata5[1][2] - listdata5[2][2])
+    y_angle = -(math.degrees(math.atan(len_y_a/len_y_b)))
+
+    # calculate new coordinates with rotation matrix of Y
+    listdata6 = []
+    for coordinates in range(0, len(listdata5)):
+        listdata6.append(Y_rotation(listdata5[coordinates], y_angle))
+
+    listdata5 = []
+    #Rotate 180 degrees around y axis when object is backwards.#
+    listdatatemp = []
+    if listdata6[1][0] < listdata6[3][0]: #point sym2_x < point sym 3
+        angle = 180
+        for coordinates in range(0,len(listdata6)):
+            listdatatemp.append(Y_rotation(listdata6[coordinates], angle)) # add new coordinates to list
+        listdata6 = listdatatemp
+
+    # to function 'write new coordinates'
+    write_new_coordinates(listdata6)
+
+# Function write the new coordinates to outputfile. 
+def write_new_coordinates(listdata6):
+    file_outputname4 = 'outputrotate_points.ply' # sub outputfile
+    output4 = open(file_outputname4, 'w')
+
+    # write every coordinate to output file
+    for line in range(0,len(listdata6)):
+        output4.write("%.7f %.7f %.7f\n"%(listdata6[line][0], listdata6[line][1], listdata6[line][2]))
+
+# Function to write the new ply file with 
+def write_ply_file(name_file_ply, var_header,var_vertex_nm,var_face_nm, listtotal_colors, listtotal_vertex):
+    outfile_rotating2 = open(sys.argv[3], 'w') #create new file
+    pointsfile = open('outputrotate_points.ply', 'r') #new points
+    file2= open(name_file_ply) #original ply file
+    counter = 0 # counter for color
+
+    # writing all the parts of the new ply file
+    for line in range(0,(int(var_header) + int(var_vertex_nm) + int(var_face_nm) + 1)):
+        line2 = file2.readline()
+        readline2 = line2.strip().split()
+        if line <= (int(var_header)): #header writing
+            outfile_rotating2.write('%s'%(line2))
+        if line == int(var_header): #new coordinates writing
+            line2 = file2.readline()
+            readline2 = line2.strip().split()
+            for vertex in range(0,len(listtotal_vertex)):
+                line3 = pointsfile.readline().strip()
+                if vertex >= 4: #from point 4, because they were extra edit to the list in the beginning
+                    outfile_rotating2.write('%s %s %s %s\n'%
+                                            (line3, listtotal_colors[counter][0],
+                                             listtotal_colors[counter][1], listtotal_colors[counter][2]))
+                    counter += 1
+        if line == (int(var_vertex_nm) + int(var_header)-1): #write the faces 
+            for face in range(0, int(var_face_nm)):  
+                line2 = file2.readline()
+                outfile_rotating2.write('%s'%(line2))
+    counter = 0        
+
+    outfile_rotating2.close() # outputfile close
+
+main()