Source code for cam.utilities.orient_utils

"""Fabex 'orient_utils.py' © 2012 Vilem Novak
"""

import bpy
from mathutils import Vector

from .simple_utils import delete_object


[docs] def add_orientation_object(o): """Set up orientation for a milling object. This function creates an orientation object in the Blender scene for 4-axis and 5-axis milling operations. It checks if an orientation object with the specified name already exists, and if not, it adds a new empty object of type 'ARROWS'. The function then configures the rotation locks and initial rotation angles based on the specified machine axes and rotary axis. Args: o (object): An object containing properties such as name, """ name = o.name + " orientation" s = bpy.context.scene if s.objects.find(name) == -1: bpy.ops.object.empty_add(type="ARROWS", align="WORLD", location=(0, 0, 0)) ob = bpy.context.active_object ob.empty_draw_size = 0.05 ob.show_name = True ob.name = name ob = s.objects[name] if o.machine_axes == "4": if o.rotary_axis_1 == "X": ob.lock_rotation = [False, True, True] ob.rotation_euler[1] = 0 ob.rotation_euler[2] = 0 if o.rotary_axis_1 == "Y": ob.lock_rotation = [True, False, True] ob.rotation_euler[0] = 0 ob.rotation_euler[2] = 0 if o.rotary_axis_1 == "Z": ob.lock_rotation = [True, True, False] ob.rotation_euler[0] = 0 ob.rotation_euler[1] = 0 elif o.machine_axes == "5": ob.lock_rotation = [False, False, True] ob.rotation_euler[2] = 0 # this will be a bit hard to rotate.....
[docs] def remove_orientation_object(o): """Remove an orientation object from the current Blender scene. This function constructs the name of the orientation object based on the name of the provided object and attempts to find and delete it from the Blender scene. If the orientation object exists, it will be removed using the `delob` function. Args: o (Object): The object whose orientation object is to be removed. """ # not working name = o.name + " orientation" if bpy.context.scene.objects.find(name) > -1: ob = bpy.context.scene.objects[name] delete_object(ob)
[docs] def rotation_to_2_axes(e, axescombination): """Converts an Orientation Object Rotation to Rotation Defined by 2 Rotational Axes on the Machine. This function takes an orientation object and a specified axes combination, and computes the angles of rotation around two axes based on the provided orientation. It supports different axes combinations for indexed machining. The function utilizes vector mathematics to determine the angles of rotation and returns them as a tuple. Args: e (OrientationObject): The orientation object representing the rotation. axescombination (str): A string indicating the axes combination ('CA' or 'CB'). Returns: tuple: A tuple containing two angles (float) representing the rotation around the specified axes. """ v = Vector((0, 0, 1)) v.rotate(e) # if axes if axescombination == "CA": v2d = Vector((v.x, v.y)) # ?is this right?It should be vector defining 0 rotation a1base = Vector((0, -1)) if v2d.length > 0: cangle = a1base.angle_signed(v2d) else: return (0, 0) v2d = Vector((v2d.length, v.z)) a2base = Vector((0, 1)) aangle = a2base.angle_signed(v2d) print("Angles", cangle, aangle) return (cangle, aangle) elif axescombination == "CB": v2d = Vector((v.x, v.y)) # ?is this right?It should be vector defining 0 rotation a1base = Vector((1, 0)) if v2d.length > 0: cangle = a1base.angle_signed(v2d) else: return (0, 0) v2d = Vector((v2d.length, v.z)) a2base = Vector((0, 1)) bangle = a2base.angle_signed(v2d) print("Angles", cangle, bangle) return (cangle, bangle)