Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import vtk
- import os
- import re
- from PIL import Image, ImageEnhance, ImageDraw, ImageFont
- from vtkmodules.vtkCommonTransforms import vtkTransform
- import numpy as np
- import math
- def calculate_direction_vector(p1, p2):
- """Calculate direction vector from p1 to p2."""
- return [p2[i] - p1[i] for i in range(3)]
- def normalize_vector(vector):
- """Normalize the given vector."""
- norm = np.linalg.norm(vector)
- return [v / norm for v in vector]
- def configure_camera(renderer, centroid, left, right, anterior, posterior):
- """Configure the camera to look from the posterior towards the anterior with up defined by left and right."""
- # Calculate the forward vector pointing from posterior to anterior
- forward_vector = calculate_direction_vector(posterior, anterior)
- forward_vector = normalize_vector(forward_vector)
- # Up vector should be perpendicular to the plane formed by left, right, and the forward vector
- side_vector = calculate_direction_vector(left, right)
- side_vector = normalize_vector(side_vector)
- up_vector = np.cross(side_vector, forward_vector) # Ensure correct order for right-hand rule
- up_vector = normalize_vector(up_vector)
- # Position the camera at the anterior, looking towards the posterior
- camera_position = [anterior[i] - forward_vector[i] * 50 for i in range(3)] # Adjust the distance as needed (- front, + back)
- # Create the camera and set its position and orientation
- camera = vtk.vtkCamera()
- camera.SetPosition(*camera_position)
- camera.SetFocalPoint(*anterior)
- camera.SetViewUp(*up_vector)
- # Calculate rotation around the up vector
- transform = vtk.vtkTransform()
- transform.Identity() # Reset any previous transformations
- transform.Translate(*anterior) # Move the rotation axis to the focal point (anterior)
- transform.RotateWXYZ(35, *up_vector) # Rotate 30 degrees around the up vector
- transform.Translate(*[-x for x in anterior]) # Move back to the original position
- camera.ApplyTransform(transform)
- renderer.SetActiveCamera(camera)
- renderer.ResetCamera()
- def take_screenshot(renderer, filename):
- """Take a screenshot."""
- render_window = vtk.vtkRenderWindow()
- render_window.AddRenderer(renderer)
- render_window.SetSize(1000, 1000)
- render_window.SetOffScreenRendering(1)
- render_window.Render()
- window_to_image_filter = vtk.vtkWindowToImageFilter()
- window_to_image_filter.SetInput(render_window)
- window_to_image_filter.Update()
- writer = vtk.vtkPNGWriter()
- writer.SetFileName(filename)
- writer.SetInputConnection(window_to_image_filter.GetOutputPort())
- writer.Write()
- def rotate_image(image_path, rotation_angle):
- """Rotate an image by the specified angle."""
- image = Image.open(image_path)
- rotated_image = image.rotate(rotation_angle, expand=True)
- rotated_image.save(image_path)
- def generate_image(renderer, output_dir, centroid, left, right, anterior, posterior, rotation_angle=180):
- """Generate the image."""
- # Updated to pass all necessary arguments to configure_camera
- configure_camera(renderer, centroid, left, right, anterior, posterior)
- filename = os.path.join(output_dir, "isometric_view_measurement.png")
- take_screenshot(renderer, filename)
- rotate_image(filename, rotation_angle)
- return filename
- def main(stl_filename_main, output_dir, centroid, left, right, anterior, posterior):
- reader_main = vtk.vtkSTLReader()
- reader_main.SetFileName(stl_filename_main)
- reader_main.Update()
- mapper_main = vtk.vtkPolyDataMapper()
- mapper_main.SetInputConnection(reader_main.GetOutputPort())
- actor_main = vtk.vtkActor()
- actor_main.SetMapper(mapper_main)
- actor_main.GetProperty().SetColor(0.67, 0.67, 0.67)
- renderer = vtk.vtkRenderer()
- renderer.AddActor(actor_main)
- renderer.SetBackground(1, 1, 1)
- os.makedirs(output_dir, exist_ok=True)
- # Ensure all parameters are passed to generate_image
- image_file = generate_image(renderer, output_dir, centroid, left, right, anterior, posterior)
- return image_file
- if __name__ == "__main__":
- stl_filename_main = r"C:\\Users\\…\\3DObject.stl"
- output_dir = r"C:\\Users\\…\\screenshots3"
- centroid = [-12.372, 26.476, -210.97]
- posterior = [-12.29, 6.5007, -209.98]
- anterior = [-12.454, 46.451, -211.97]
- left = [7.6066, 26.603, -210.05]
- right = [-32.35, 26.348, -211.89]
- main(stl_filename_main, output_dir, centroid, left, right, anterior, posterior)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement