blendercam/scripts/addons/fabex/ui/panels/movement_panel.py

161 wiersze
6.7 KiB
Python

2024-10-25 02:47:11 +00:00
"""Fabex 'movement.py'
2024-10-22 20:19:27 +00:00
'CAM Movement' properties and panel in Properties > Render
"""
from math import pi
import bpy
from bpy.types import Panel
2024-10-22 20:19:27 +00:00
from .parent_panel import CAMParentPanel
2024-12-19 19:10:10 +00:00
2024-10-22 20:19:27 +00:00
class CAM_MOVEMENT_Panel(CAMParentPanel, Panel):
2024-10-22 20:19:27 +00:00
"""CAM Movement Panel"""
2024-10-22 21:13:36 +00:00
2024-10-29 20:58:51 +00:00
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "CNC"
2024-11-06 10:48:10 +00:00
bl_label = "[ Movement ]"
2024-12-18 20:37:25 +00:00
bl_idname = "FABEX_PT_CAM_MOVEMENT"
2024-10-24 13:36:37 +00:00
panel_interface_level = 0
2024-10-22 20:19:27 +00:00
def __init__(self, *args, **kwargs):
Panel.__init__(self, *args, **kwargs)
CAMParentPanel.__init__(self, *args, **kwargs)
super().__init__(*args, **kwargs)
2024-10-22 20:19:27 +00:00
def draw(self, context):
2024-10-23 21:37:33 +00:00
layout = self.layout
2024-10-26 01:17:12 +00:00
layout.use_property_split = True
layout.use_property_decorate = False
2024-11-05 16:14:13 +00:00
# Milling Type
2024-10-24 13:36:37 +00:00
if self.level >= 1:
2024-11-05 16:14:13 +00:00
col = layout.column()
2024-10-29 20:58:51 +00:00
col.scale_y = 1.2
2024-10-27 17:54:48 +00:00
movement = self.op.movement.type
if movement == "MEANDER":
icon = "ANIM"
elif movement == "CLIMB":
icon = "SORT_ASC"
else:
icon = "SORT_DESC"
2024-11-05 16:14:13 +00:00
col.prop(self.op.movement, "type", text="Milling Type", icon=icon)
2024-10-24 13:36:37 +00:00
if self.op.movement.type in ["BLOCK", "SPIRAL", "CIRCLES"]:
2024-10-27 17:54:48 +00:00
col.prop(self.op.movement, "insideout")
2024-10-24 13:36:37 +00:00
# Spindle Rotation
if self.level >= 2:
2024-10-27 17:54:48 +00:00
rotation = self.op.movement.spindle_rotation
icon = "LOOP_FORWARDS" if rotation == "CW" else "LOOP_BACK"
2024-11-05 16:14:13 +00:00
col.prop(self.op.movement, "spindle_rotation", text="Cutter Spin", icon=icon)
2024-10-24 13:36:37 +00:00
# Free Height
2024-11-05 16:14:13 +00:00
box = layout.box()
boxcol = box.column(align=True)
boxcol.label(text="Z Clearance", icon="CON_FLOOR")
boxcol.prop(self.op.movement, "free_height")
if self.op.max_z > self.op.movement.free_height:
2024-11-05 16:14:13 +00:00
box = boxcol.box()
subcol = box.column(align=True)
subcol.alert = True
subcol.label(text="! POSSIBLE COLLISION !", icon="ERROR")
subcol.label(text="Depth Start > Free Movement")
2024-10-24 13:36:37 +00:00
2024-11-05 16:14:13 +00:00
# Stay Low
row = layout.row()
row.use_property_split = False
row.prop(self.op.movement, "stay_low", text="Stay Low (if possible)")
row.prop(self.op.movement, "merge_distance")
2024-10-24 13:36:37 +00:00
2024-10-27 17:54:48 +00:00
# Parallel Stepback
2024-10-24 13:36:37 +00:00
if self.level >= 1:
2024-10-27 17:54:48 +00:00
if self.op.strategy in ["PARALLEL", "CROSS"]:
if not self.op.movement.ramp:
2024-11-05 16:14:13 +00:00
row = layout.row()
row.use_property_split = False
row.prop(self.op.movement, "parallel_step_back")
2024-10-27 17:54:48 +00:00
if self.level >= 2:
# Use G64
2024-12-21 19:04:32 +00:00
# Currently checking against a hard-coded value here,
# Consider moving this to a scene property
if context.scene.cam_machine.post_processor not in ["GRBL"]:
layout.use_property_split = False
header, panel = layout.panel("g64", default_closed=True)
header.prop(self.op.movement, "useG64", text="G64 Trajectory")
if panel:
panel.enabled = self.op.movement.useG64
col = panel.column(align=True)
col.use_property_split = True
col.prop(self.op.movement, "G64", text="Tolerance")
2024-10-24 13:36:37 +00:00
2024-11-05 16:14:13 +00:00
# Retract Tangential
2024-10-24 13:36:37 +00:00
if self.op.strategy in ["POCKET"]:
2024-11-05 16:14:13 +00:00
layout.use_property_split = False
header, panel = layout.panel("tengential", default_closed=True)
header.prop(self.op.movement, "retract_tangential", text="Retract Tangential")
2024-10-26 01:17:12 +00:00
if panel:
2024-11-05 16:14:13 +00:00
panel.enabled = self.op.movement.retract_tangential
2024-10-26 01:17:12 +00:00
col = panel.column(align=True)
2024-11-05 16:14:13 +00:00
col.use_property_split = True
col.prop(self.op.movement, "retract_radius", text="Arc Radius")
col.prop(self.op.movement, "retract_height", text="Arc Height")
2024-10-24 13:36:37 +00:00
# Protect Vertical
if self.level >= 1:
if self.op.cutter_type not in ["BALLCONE"]:
2024-11-05 16:14:13 +00:00
layout.use_property_split = False
header, panel = layout.panel("vertical", default_closed=False)
header.prop(self.op.movement, "protect_vertical", text="Protect Vertical")
2024-10-26 01:17:12 +00:00
if panel:
2024-11-05 16:14:13 +00:00
panel.enabled = self.op.movement.protect_vertical
2024-10-26 01:17:12 +00:00
col = panel.column(align=True)
2024-11-05 16:14:13 +00:00
col.use_property_split = True
2024-10-27 17:54:48 +00:00
col.prop(self.op.movement, "protect_vertical_limit", text="Angle Limit")
2024-11-05 16:14:13 +00:00
if self.level >= 3:
header, parent_panel = layout.panel("experiment", default_closed=True)
2024-10-27 17:54:48 +00:00
header.label(text="╼ EXPERIMENTAL ╾", icon="EXPERIMENTAL")
if parent_panel:
2024-11-05 16:14:13 +00:00
col = parent_panel.column(align=True)
# Merge Distance
if self.op.movement.stay_low:
row = col.row()
row.use_property_split = True
row.prop(self.op.movement, "merge_distance", text="Merge Distance")
2024-11-05 16:14:13 +00:00
# Helix Enter
if self.op.strategy in ["POCKET"]:
header, panel = col.panel("helix", default_closed=True)
header.prop(self.op.movement, "helix_enter", text="Helix Enter")
if panel:
subcol = panel.column(align=True)
subcol.use_property_split = True
subcol.enabled = self.op.movement.helix_enter
subcol.prop(self.op.movement, "ramp_in_angle")
subcol.prop(self.op.movement, "helix_diameter")
2024-10-27 17:54:48 +00:00
# Ramp
2024-11-05 16:14:13 +00:00
header, panel = col.panel("ramps", default_closed=True)
header.prop(self.op.movement, "ramp", text="Ramp")
2024-10-27 17:54:48 +00:00
if panel:
2024-11-05 16:14:13 +00:00
subcol = panel.column(align=True)
subcol.enabled = self.op.movement.ramp
row = subcol.row()
2024-12-28 16:32:28 +00:00
row.prop(self.op.movement, "zig_zag_ramp", text="Zigzag Ramp")
row = subcol.row()
2024-11-05 16:14:13 +00:00
row.use_property_split = True
row.prop(self.op.movement, "ramp_in_angle", text="In Angle")
subheader, subpanel = subcol.panel("ramps_o", default_closed=True)
subheader.prop(self.op.movement, "ramp_out", text="Ramp Out")
if subpanel:
row = subcol.row()
row.use_property_split = True
row.enabled = self.op.movement.ramp_out
row.prop(self.op.movement, "ramp_out_angle", text="Out Angle")