def find_export_object(root):
# Search for an object named 'Export' in the hierarchy
if root.GetName() == 'Export':
for child in root.GetChildren():
found_object = find_export_object(child)
if found_object is not None:
def export_to_csv(csv_filename, points, num_segments, segment_end_marker, current_state_object):
with open(csv_filename, 'a', newline='') as csvfile:
csvwriter = csv.writer(csvfile)
# Iterate over each segment
for i in range(num_segments):
segment = current_state_object.GetSegment(i) # Get information about the segment
segment_start = last_point_index
segment_end = segment_start + segment['cnt']
# Loop through the points in the segment
for point_index in range(segment_start, segment_end):
point = points[point_index]
frame_data.extend([point.x, point.y, point.z])
# Append segment end marker
frame_data.append(segment_end_marker)
# Update the last point index for the next segment
last_point_index = segment_end
# Remove the last segment end marker
if frame_data[-1] == segment_end_marker:
csvwriter.writerow(frame_data)
print(f'Data for frame appended to {csv_filename}')
print(f'Error during CSV export: {e}')
def get_next_filename(base_path, base_filename):
new_filename = f"{base_filename}_{version}.csv"
full_path = os.path.join(base_path, new_filename)
if not os.path.exists(full_path):
doc = c4d.documents.GetActiveDocument()
c4d.gui.MessageDialog("No active document found.")
export_object = find_export_object(doc.GetFirstObject())
c4d.gui.MessageDialog("Object named 'Export' not found in the scene.")
base_path = r'C:\Users\Chris\OneDrive\Desktop\Test'
csv_filename = get_next_filename(base_path, base_filename)
start_frame = int(doc.GetMinTime().GetFrame(fps))
end_frame = int(doc.GetMaxTime().GetFrame(fps))
for frame in range(start_frame, end_frame + 1):
doc.SetTime(c4d.BaseTime(frame, fps))
c4d.DrawViews(c4d.DRAWFLAGS_FORCEFULLREDRAW)
current_state_object = c4d.utils.SendModelingCommand(
command=c4d.MCOMMAND_CURRENTSTATETOOBJECT,
if current_state_object is not None and current_state_object.CheckType(c4d.Ospline):
points = current_state_object.GetAllPoints()
num_segments = current_state_object.GetSegmentCount()
export_to_csv(csv_filename, points, num_segments, segment_end_marker, current_state_object)
print(f"Frame {frame}: No valid spline object found.")
# Ensure to properly clean up the temporary object to avoid memory leaks
c4d.documents.KillDocument(c4d.documents.BaseDocument(temp_doc))
print(f"Error at frame {frame}: {e}")
print("Export completed.")
if __name__ == "__main__":