diff --git a/ADDON_AFX_2d_Track_Exporter.py b/ADDON_AFX_2d_Track_Exporter.py index 2a611a9..c1070dc 100644 --- a/ADDON_AFX_2d_Track_Exporter.py +++ b/ADDON_AFX_2d_Track_Exporter.py @@ -38,124 +38,150 @@ class AFX_Track_Exporter: name_start = file_path.find(file_name) path = file_path[0:name_start] return path + + def write_afx_keyframe_header(self, data, type_index): + #print("WRITE_AFX_KEYFRAME_HEADER Data: ",data) + t = AFXtx.strings["header_types"][type_index] + clip = bpy.context.space_data.clip + scene = bpy.context.scene + fps = scene.render.fps + source_aspect = clip.display_aspect[0]/clip.display_aspect[1] + comp_aspect = scene.render.pixel_aspect_x/scene.render.pixel_aspect_y + + if t == "main": + header = AFXtx.strings["main"]+"\n\n\t"+AFXtx.strings["units"]+"\t"+str(fps)+"\n" + header = header + "\t"+AFXtx.strings["width"]+"\t"+str(clip.size[0])+"\n" + header = header + "\t"+AFXtx.strings["height"]+"\t"+str(clip.size[1])+"\n" + header = header + "\t"+AFXtx.strings["source_aspect"]+"\t"+str(source_aspect)+"\n" + header = header + "\t"+AFXtx.strings["comp_aspect"]+"\t"+str(comp_aspect)+"\n\n" + elif t == "pos": + header = AFXtx.strings["position"]+"\n\t"+AFXtx.strings["position_units"]+"\n" + elif t == "rot": + header = AFXtx.strings["rotation"]+"\n\t"+AFXtx.strings["rotation_units"]+"\n" + elif t == "sca": + header = AFXtx.strings["scale"]+"\n\t"+AFXtx.strings["scale_units"]+"\n" + elif t == "end": + header = "\n"+AFXtx.strings["end"] + + #print("HEADER: ", data) + data = str(data) + header + + return data + + #file.write(header) -AFXtx = AFX_Track_Exporter() - - -def write_afx_keyframe_header(file, type_index): - - t = AFXtx.strings["header_types"][type_index] - clip = bpy.context.space_data.clip - scene = bpy.context.scene - fps = scene.render.fps - source_aspect = clip.display_aspect[0]/clip.display_aspect[1] - comp_aspect = scene.render.pixel_aspect_x/scene.render.pixel_aspect_y - - if t == "main": - header = AFXtx.strings["main"]+"\n\n\t"+AFXtx.strings["units"]+"\t"+str(fps)+"\n" - header = header + "\t"+AFXtx.strings["width"]+"\t"+str(clip.size[0])+"\n" - header = header + "\t"+AFXtx.strings["height"]+"\t"+str(clip.size[1])+"\n" - header = header + "\t"+AFXtx.strings["source_aspect"]+"\t"+str(source_aspect)+"\n" - header = header + "\t"+AFXtx.strings["comp_aspect"]+"\t"+str(comp_aspect)+"\n\n" - elif t == "pos": - header = AFXtx.strings["position"]+"\n\t"+AFXtx.strings["position_units"]+"\n" - elif t == "rot": - header = AFXtx.strings["rotation"]+"\n\t"+AFXtx.strings["rotation_units"]+"\n" - elif t == "sca": - header = AFXtx.strings["scale"]+"\n\t"+AFXtx.strings["scale_units"]+"\n" - elif t == "end": - header = "\n"+AFXtx.strings["end"] - - file.write(header) + def write_afx_cp_keyframe_header(self, data, type_index, corner): + #print("WRITE_AFX_CP_KEYFRAME_HEADER Data: ",data) + + t = AFXtx.strings["header_types"][type_index] + if t == "c_pin": + header = AFXtx.strings["corner_pin"]+"\t"+corner+"\n\t"+AFXtx.strings["corner_pin_units"]+"\n" + + data = data + header + + return data + + #file.write(header) + + def calc_pos_from_corners(self, corners): + sumX = 0.0 + sumY = 0.0 + for i in range(4): + sumX += corners[i][0] + sumY += corners[i][1] + x = sumX/4 + y = 1-(sumY/4) ## Y down + return [x,y] -def write_afx_cp_keyframe_header(file, type_index, corner): - - t = AFXtx.strings["header_types"][type_index] - if t == "c_pin": - header = AFXtx.strings["corner_pin"]+"\t"+corner+"\n\t"+AFXtx.strings["corner_pin_units"]+"\n" - - file.write(header) + def write_afx_pos_keyframe_header(self, data): + #print("WRITE_AFX_POS_KEYFRAME_HEADER Data: ",data) + pass -def calc_pos_from_corners(corners): - sumX = 0.0 - sumY = 0.0 - for i in range(4): - sumX += corners[i][0] - sumY += corners[i][1] - x = sumX/4 - y = 1-(sumY/4) ## Y down - return [x,y] + def writeRawMarkers(self, data): + #print("WRITERAWMARKERS Data: ",data) + for frame in plane_track.markers: + #print(dir(frame)) + for current_corner in range(4): ## the corners are stored ina float4 0 = Lower Left, 1 = Lower Right, 2 = Upper Right, 3 = Upper Left) + for current_component in range(2): ## the location of the corner are stored in a float2 x,y + + current_point = frame.corners[current_corner][current_component] -def write_afx_pos_keyframe_header(file): - pass - -def writeRawMarkers(file): - for frame in plane_track.markers: - print(dir(frame)) - for current_corner in range(4): ## the corners are stored ina float4 0 = Lower Left, 1 = Lower Right, 2 = Upper Right, 3 = Upper Left) - for current_component in range(2): ## the location of the corner are stored in a float2 x,y - - current_point = frame.corners[current_corner][current_component] + data = data + " " + data = data + "\n" + + return data + + def write_pos_data(self, data): + #print("WRITE_POS Data: ",data) + for marker in range(len(plane_track.markers)): + n_format = "{0:.3f}" + size = clip.size + frame = plane_track.markers[marker].frame + pos = calc_pos_from_corners(plane_track.markers[marker].corners) + x = str(n_format.format(pos[0]*clip.size[0])) + y = str(n_format.format(pos[1]*clip.size[1])) + z = "0" + line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n" + + data = data + line + data = data + "\n" + + return data - file.write(" ") - file.write("\n") - file.close() - -def write_pos_data(file): - for marker in range(len(plane_track.markers)): + def write_cp_data(self, data, plane_track): + + clip = bpy.context.space_data.clip n_format = "{0:.3f}" - size = clip.size - frame = plane_track.markers[marker].frame - pos = calc_pos_from_corners(plane_track.markers[marker].corners) - x = str(n_format.format(pos[0]*clip.size[0])) - y = str(n_format.format(pos[1]*clip.size[1])) - z = "0" - line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n" - file.write(line) - file.write("\n") + for corner in range(4): -def write_cp_data(file, plane_track): - clip = bpy.context.space_data.clip - n_format = "{0:.3f}" - for corner in range(4): + data = data + AFXtx.write_afx_cp_keyframe_header(data,4,AFXtx.strings["corner_names"][corner]) - write_afx_cp_keyframe_header(file,4,AFXtx.strings["corner_names"][corner]) + for marker in range(len(plane_track.markers)): + frame = plane_track.markers[marker].frame + x = str(n_format.format(plane_track.markers[marker].corners[corner][0]*clip.size[0])) + y = str(n_format.format((1-plane_track.markers[marker].corners[corner][1])*clip.size[1])) + line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n" + + data = data +line + data = data + "\n" + + return data + + def write_pos_from_single_track(self, data,track): + #print("WRITE_POS_FROM_SINGLE_TRACK Data: ",data) + for marker in range(len(track.markers)): + n_format = "{0:.3f}" + clip = bpy.context.space_data.clip + size = clip.size + frame = track.markers[marker].frame + pos = track.markers[marker].co + x = str(n_format.format(pos[0]*clip.size[0])) + y = str(n_format.format((1-pos[1])*clip.size[1])) + z = "0" + line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n" + + data = data +line + data = data + "\n" + return data - for marker in range(len(plane_track.markers)): - frame = plane_track.markers[marker].frame - x = str(n_format.format(plane_track.markers[marker].corners[corner][0]*clip.size[0])) - y = str(n_format.format((1-plane_track.markers[marker].corners[corner][1])*clip.size[1])) - line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n" - file.write(line) - file.write("\n") - -def write_pos_from_single_track(file,track): - for marker in range(len(track.markers)): + def write_cp_data_from_track(self,data): + #print("WRITE_CP_DATA_FROM_TRACK Data: ",data) n_format = "{0:.3f}" - clip = bpy.context.space_data.clip - size = clip.size - frame = track.markers[marker].frame - pos = track.markers[marker].co - x = str(n_format.format(pos[0]*clip.size[0])) - y = str(n_format.format((1-pos[1])*clip.size[1])) - z = "0" - line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n" - file.write(line) - file.write("\n") + for corner in range(4): + + AFXtx.write_afx_cp_keyframe_header(data,4,AFXtx.strings["corner_names"][corner]) + + for marker in range(len(track.markers)): + frame = track.markers[marker].frame + x = str(n_format.format((track.markers[marker].co[0]+track.markers[marker].pattern_corners[corner][0])*clip.size[0])) + y = str(n_format.format((1-(track.markers[marker].co[1]+track.markers[marker].pattern_corners[corner][1]))*clip.size[1])) + line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n" + + data = data +line + data = data + "\n" + return data -def write_cp_data_from_track(file): - n_format = "{0:.3f}" - for corner in range(4): - - write_afx_cp_keyframe_header(file,4,AFXtx.strings["corner_names"][corner]) - - for marker in range(len(track.markers)): - frame = track.markers[marker].frame - x = str(n_format.format((track.markers[marker].co[0]+track.markers[marker].pattern_corners[corner][0])*clip.size[0])) - y = str(n_format.format((1-(track.markers[marker].co[1]+track.markers[marker].pattern_corners[corner][1]))*clip.size[1])) - line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n" - file.write(line) - file.write("\n") +AFXtx = AFX_Track_Exporter() class TrackerExportPanel(bpy.types.Panel): """Creates a Panel in the Object properties window""" @@ -187,34 +213,45 @@ class TrackerExportPanel(bpy.types.Panel): layout.label(text="Select a track or a plane Track to export") def init_file(): - path = AFXtx.getFilePath() - file=open(path+"plane_tracks2.txt","w") - write_afx_keyframe_header(file,0) - return file + data = "" + #path = AFXtx.getFilePath() + #file=open(path+"plane_tracks2.txt","w") + data = data + AFXtx.write_afx_keyframe_header(data,0) + #return file + return data -def finalize_file(file): - write_afx_keyframe_header(file,6) - file.close() +def finalize_file(data): + #print("FINALIZE DATA: ", data) + data = data + AFXtx.write_afx_keyframe_header(data,6) + return data + #file.close() def export_track(context): clip = bpy.context.space_data.clip active_track = clip.tracking.tracks.active - txt_data = "" - fp = init_file() + data = init_file() - write_afx_keyframe_header(fp,1) - write_pos_from_single_track(fp,active_track) - finalize_file(fp) + data = data + AFXtx.write_afx_keyframe_header(data,1) + + data = data + AFXtx.write_pos_from_single_track(data,active_track) + + data = finalize_file(data) + + bpy.context.window_manager.clipboard = data + #print("FINAL DATA: \n\n", data) def export_plane_track(context): clip = bpy.context.space_data.clip active_plane_track = clip.tracking.plane_tracks.active - fp = init_file() - write_afx_keyframe_header(fp,1) - write_cp_data(fp,active_plane_track) - finalize_file(fp) + data = init_file() + #data = AFXtx.write_afx_keyframe_header(data,1) + data = AFXtx.write_cp_data(data,active_plane_track) + data = finalize_file(data) + + bpy.context.window_manager.clipboard = data + #print("FINAL DATA: \n\n", data) class ExportTrack(bpy.types.Operator): """Tooltip""" @@ -254,4 +291,4 @@ def unregister(): bpy.utils.unregister_class(ExportPlaneTrack) if __name__ == "__main__": - register() + register() \ No newline at end of file