Compare commits
7 Commits
fix/angled
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| b234d042eb | |||
|
|
08e439b9ca | ||
| 4e01fdf68b | |||
| 55be41e697 | |||
| 29ca89e533 | |||
|
|
ef16ecbaa2 | ||
|
|
2bf969c62a |
@@ -1,109 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
|
||||||
<FCParameters>
|
|
||||||
<FCParamGroup Name="Root">
|
|
||||||
<FCParamGroup Name="BaseApp">
|
|
||||||
<FCParamGroup Name="Preferences">
|
|
||||||
<FCParamGroup Name="Editor">
|
|
||||||
<FCUInt Name="Text" Value="3453416703"/>
|
|
||||||
<FCUInt Name="Bookmark" Value="3032415999"/>
|
|
||||||
<FCUInt Name="Breakpoint" Value="4086016255"/>
|
|
||||||
<FCUInt Name="Keyword" Value="3416717311"/>
|
|
||||||
<FCUInt Name="Comment" Value="2139095295"/>
|
|
||||||
<FCUInt Name="Block comment" Value="2139095295"/>
|
|
||||||
<FCUInt Name="Number" Value="4206069759"/>
|
|
||||||
<FCUInt Name="String" Value="2799935999"/>
|
|
||||||
<FCUInt Name="Character" Value="4073902335"/>
|
|
||||||
<FCUInt Name="Class name" Value="2310339327"/>
|
|
||||||
<FCUInt Name="Define name" Value="2310339327"/>
|
|
||||||
<FCUInt Name="Operator" Value="2312199935"/>
|
|
||||||
<FCUInt Name="Python output" Value="2796290303"/>
|
|
||||||
<FCUInt Name="Python error" Value="4086016255"/>
|
|
||||||
<FCUInt Name="Current line highlight" Value="1162304255"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="OutputWindow">
|
|
||||||
<FCUInt Name="colorText" Value="3453416703"/>
|
|
||||||
<FCUInt Name="colorLogging" Value="2497893887"/>
|
|
||||||
<FCUInt Name="colorWarning" Value="4192382975"/>
|
|
||||||
<FCUInt Name="colorError" Value="4086016255"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="View">
|
|
||||||
<FCUInt Name="BackgroundColor" Value="505294591"/>
|
|
||||||
<FCUInt Name="BackgroundColor2" Value="286333951"/>
|
|
||||||
<FCUInt Name="BackgroundColor3" Value="404235775"/>
|
|
||||||
<FCUInt Name="BackgroundColor4" Value="825378047"/>
|
|
||||||
<FCBool Name="Simple" Value="0"/>
|
|
||||||
<FCBool Name="Gradient" Value="1"/>
|
|
||||||
<FCBool Name="UseBackgroundColorMid" Value="0"/>
|
|
||||||
<FCUInt Name="HighlightColor" Value="3416717311"/>
|
|
||||||
<FCUInt Name="SelectionColor" Value="3032415999"/>
|
|
||||||
<FCUInt Name="PreselectColor" Value="2497893887"/>
|
|
||||||
<FCUInt Name="DefaultShapeColor" Value="1482387711"/>
|
|
||||||
<FCBool Name="RandomColor" Value="0"/>
|
|
||||||
<FCUInt Name="DefaultShapeLineColor" Value="2470768383"/>
|
|
||||||
<FCUInt Name="DefaultShapeVertexColor" Value="2470768383"/>
|
|
||||||
<FCUInt Name="BoundingBoxColor" Value="1819509759"/>
|
|
||||||
<FCUInt Name="AnnotationTextColor" Value="3453416703"/>
|
|
||||||
<FCUInt Name="SketchEdgeColor" Value="3453416703"/>
|
|
||||||
<FCUInt Name="SketchVertexColor" Value="3453416703"/>
|
|
||||||
<FCUInt Name="EditedEdgeColor" Value="3416717311"/>
|
|
||||||
<FCUInt Name="EditedVertexColor" Value="4123402495"/>
|
|
||||||
<FCUInt Name="ConstructionColor" Value="4206069759"/>
|
|
||||||
<FCUInt Name="ExternalColor" Value="4192382975"/>
|
|
||||||
<FCUInt Name="FullyConstrainedColor" Value="2799935999"/>
|
|
||||||
<FCUInt Name="InternalAlignedGeoColor" Value="1959907071"/>
|
|
||||||
<FCUInt Name="FullyConstraintElementColor" Value="2799935999"/>
|
|
||||||
<FCUInt Name="FullyConstraintConstructionElementColor" Value="2497893887"/>
|
|
||||||
<FCUInt Name="FullyConstraintInternalAlignmentColor" Value="2312199935"/>
|
|
||||||
<FCUInt Name="FullyConstraintConstructionPointColor" Value="2799935999"/>
|
|
||||||
<FCUInt Name="ConstrainedIcoColor" Value="2310339327"/>
|
|
||||||
<FCUInt Name="NonDrivingConstrDimColor" Value="2139095295"/>
|
|
||||||
<FCUInt Name="ConstrainedDimColor" Value="3416717311"/>
|
|
||||||
<FCUInt Name="ExprBasedConstrDimColor" Value="4206069759"/>
|
|
||||||
<FCUInt Name="DeactivatedConstrDimColor" Value="1819509759"/>
|
|
||||||
<FCUInt Name="CursorTextColor" Value="3453416703"/>
|
|
||||||
<FCUInt Name="CursorCrosshairColor" Value="3416717311"/>
|
|
||||||
<FCUInt Name="CreateLineColor" Value="2799935999"/>
|
|
||||||
<FCUInt Name="ShadowLightColor" Value="2470768128"/>
|
|
||||||
<FCUInt Name="ShadowGroundColor" Value="286333952"/>
|
|
||||||
<FCUInt Name="HiddenLineColor" Value="825378047"/>
|
|
||||||
<FCUInt Name="HiddenLineFaceColor" Value="505294591"/>
|
|
||||||
<FCUInt Name="HiddenLineBackground" Value="505294591"/>
|
|
||||||
<FCBool Name="EnableBacklight" Value="1"/>
|
|
||||||
<FCUInt Name="BacklightColor" Value="1162304255"/>
|
|
||||||
<FCFloat Name="BacklightIntensity" Value="0.30"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="TreeView">
|
|
||||||
<FCUInt Name="TreeEditColor" Value="3416717311"/>
|
|
||||||
<FCUInt Name="TreeActiveColor" Value="2799935999"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="MainWindow">
|
|
||||||
<FCText Name="StyleSheet">CatppuccinMocha.qss</FCText>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="Mod">
|
|
||||||
<FCParamGroup Name="Start">
|
|
||||||
<FCUInt Name="BackgroundColor1" Value="404235775"/>
|
|
||||||
<FCUInt Name="BackgroundTextColor" Value="3453416703"/>
|
|
||||||
<FCUInt Name="PageColor" Value="505294591"/>
|
|
||||||
<FCUInt Name="PageTextColor" Value="3453416703"/>
|
|
||||||
<FCUInt Name="BoxColor" Value="825378047"/>
|
|
||||||
<FCUInt Name="LinkColor" Value="2310339327"/>
|
|
||||||
<FCUInt Name="BackgroundColor2" Value="286333951"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="Part">
|
|
||||||
<FCUInt Name="VertexColor" Value="3032415999"/>
|
|
||||||
<FCUInt Name="EdgeColor" Value="2310339327"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="PartDesign">
|
|
||||||
<FCUInt Name="DefaultDatumColor" Value="3416717311"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="Draft">
|
|
||||||
<FCUInt Name="snapcolor" Value="2799935999"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
<FCParamGroup Name="Sketcher">
|
|
||||||
<FCUInt Name="GridLineColor" Value="1162304255"/>
|
|
||||||
</FCParamGroup>
|
|
||||||
</FCParamGroup>
|
|
||||||
</FCParamGroup>
|
|
||||||
</FCParamGroup>
|
|
||||||
</FCParamGroup>
|
|
||||||
</FCParameters>
|
|
||||||
File diff suppressed because it is too large
Load Diff
26
package.xml
26
package.xml
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<name>ZTools</name>
|
<name>ZTools</name>
|
||||||
|
|
||||||
<description>Extended PartDesign workbench with velocity-focused tools, advanced datum creation, and Catppuccin Mocha theme.</description>
|
<description>Extended PartDesign workbench with velocity-focused tools and advanced datum creation.</description>
|
||||||
|
|
||||||
<version>0.1.0</version>
|
<version>0.1.0</version>
|
||||||
|
|
||||||
@@ -17,16 +17,20 @@
|
|||||||
<classname>ZToolsWorkbench</classname>
|
<classname>ZToolsWorkbench</classname>
|
||||||
<subdirectory>./ztools</subdirectory>
|
<subdirectory>./ztools</subdirectory>
|
||||||
</workbench>
|
</workbench>
|
||||||
<preferencepack>
|
|
||||||
<name>CatppuccinMocha</name>
|
|
||||||
<description>Catppuccin Mocha dark theme - soothing pastel colors for the high-spirited</description>
|
|
||||||
<subdirectory>./CatppuccinMocha</subdirectory>
|
|
||||||
<tag>color</tag>
|
|
||||||
<tag>dark</tag>
|
|
||||||
<tag>catppuccin</tag>
|
|
||||||
<tag>mocha</tag>
|
|
||||||
<tag>theme</tag>
|
|
||||||
</preferencepack>
|
|
||||||
</content>
|
</content>
|
||||||
|
|
||||||
|
<!-- Kindred Create extensions -->
|
||||||
|
<kindred>
|
||||||
|
<min_create_version>0.1.0</min_create_version>
|
||||||
|
<load_priority>50</load_priority>
|
||||||
|
<pure_python>true</pure_python>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>sdk</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<contexts>
|
||||||
|
<context id="partdesign.body" action="inject"/>
|
||||||
|
<context id="partdesign.feature" action="inject"/>
|
||||||
|
</contexts>
|
||||||
|
</kindred>
|
||||||
|
|
||||||
</package>
|
</package>
|
||||||
|
|||||||
@@ -305,14 +305,6 @@ class ZToolsWorkbench(Gui.Workbench):
|
|||||||
|
|
||||||
def Activated(self):
|
def Activated(self):
|
||||||
"""Called when workbench is activated."""
|
"""Called when workbench is activated."""
|
||||||
# Apply Catppuccin Mocha colors to Spreadsheet preferences
|
|
||||||
try:
|
|
||||||
from ztools.resources.theme import apply_spreadsheet_colors
|
|
||||||
|
|
||||||
apply_spreadsheet_colors()
|
|
||||||
except Exception as e:
|
|
||||||
App.Console.PrintWarning(f"Could not apply spreadsheet colors: {e}\n")
|
|
||||||
|
|
||||||
App.Console.PrintMessage("ztools workbench activated\n")
|
App.Console.PrintMessage("ztools workbench activated\n")
|
||||||
|
|
||||||
def Deactivated(self):
|
def Deactivated(self):
|
||||||
|
|||||||
Binary file not shown.
@@ -402,24 +402,36 @@ class DatumEditTaskPanel:
|
|||||||
|
|
||||||
elif ztools_type == "tangent_cylinder":
|
elif ztools_type == "tangent_cylinder":
|
||||||
angle = self.angle_spin.value()
|
angle = self.angle_spin.value()
|
||||||
refs = _resolve_source_refs(self.datum_obj)
|
if self._has_attachment():
|
||||||
if refs and refs[0][2]:
|
params_json = getattr(self.datum_obj, "ZTools_Params", "{}")
|
||||||
face = refs[0][2]
|
try:
|
||||||
if isinstance(face.Surface, Part.Cylinder):
|
params = json.loads(params_json)
|
||||||
cyl = face.Surface
|
except json.JSONDecodeError:
|
||||||
axis = cyl.Axis
|
params = {}
|
||||||
center = cyl.Center
|
vertex_angle = params.get("vertex_angle", 0.0)
|
||||||
radius = cyl.Radius
|
offset_rot = App.Rotation(App.Vector(0, 0, 1), angle - vertex_angle)
|
||||||
rad = math.radians(angle)
|
self.datum_obj.AttachmentOffset = App.Placement(
|
||||||
if abs(axis.dot(App.Vector(1, 0, 0))) < 0.99:
|
App.Vector(0, 0, 0), offset_rot
|
||||||
local_x = axis.cross(App.Vector(1, 0, 0)).normalize()
|
)
|
||||||
else:
|
else:
|
||||||
local_x = axis.cross(App.Vector(0, 1, 0)).normalize()
|
refs = _resolve_source_refs(self.datum_obj)
|
||||||
local_y = axis.cross(local_x)
|
if refs and refs[0][2]:
|
||||||
radial = local_x * math.cos(rad) + local_y * math.sin(rad)
|
face = refs[0][2]
|
||||||
tangent_point = center + radial * radius
|
if isinstance(face.Surface, Part.Cylinder):
|
||||||
rot = App.Rotation(App.Vector(0, 0, 1), radial)
|
cyl = face.Surface
|
||||||
self.datum_obj.Placement = App.Placement(tangent_point, rot)
|
axis = cyl.Axis
|
||||||
|
center = cyl.Center
|
||||||
|
radius = cyl.Radius
|
||||||
|
rad = math.radians(angle)
|
||||||
|
if abs(axis.dot(App.Vector(1, 0, 0))) < 0.99:
|
||||||
|
local_x = axis.cross(App.Vector(1, 0, 0)).normalize()
|
||||||
|
else:
|
||||||
|
local_x = axis.cross(App.Vector(0, 1, 0)).normalize()
|
||||||
|
local_y = axis.cross(local_x)
|
||||||
|
radial = local_x * math.cos(rad) + local_y * math.sin(rad)
|
||||||
|
tangent_point = center + radial * radius
|
||||||
|
rot = App.Rotation(App.Vector(0, 0, 1), radial)
|
||||||
|
self.datum_obj.Placement = App.Placement(tangent_point, rot)
|
||||||
self._update_params({"angle": angle})
|
self._update_params({"angle": angle})
|
||||||
|
|
||||||
elif ztools_type in ("normal_to_edge", "on_edge"):
|
elif ztools_type in ("normal_to_edge", "on_edge"):
|
||||||
|
|||||||
@@ -903,6 +903,41 @@ def plane_angled(
|
|||||||
return plane
|
return plane
|
||||||
|
|
||||||
|
|
||||||
|
def _find_cylinder_vertex(obj, face_subname):
|
||||||
|
"""Find a vertex subname from a cylindrical face's edges."""
|
||||||
|
face = obj.getSubObject(face_subname)
|
||||||
|
if not face or not face.Edges:
|
||||||
|
return None
|
||||||
|
edge = face.Edges[0]
|
||||||
|
if not edge.Vertexes:
|
||||||
|
return None
|
||||||
|
vertex_point = edge.Vertexes[0].Point
|
||||||
|
for i, v in enumerate(obj.Shape.Vertexes, 1):
|
||||||
|
if v.Point.isEqual(vertex_point, 1e-6):
|
||||||
|
return f"Vertex{i}"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _vertex_angle_on_cylinder(obj, vertex_sub, cylinder):
|
||||||
|
"""Compute the angular position of a vertex on a cylinder surface."""
|
||||||
|
vertex = obj.getSubObject(vertex_sub)
|
||||||
|
if not vertex:
|
||||||
|
return 0.0
|
||||||
|
point = vertex.Point
|
||||||
|
relative = point - cylinder.Center
|
||||||
|
axis = cylinder.Axis
|
||||||
|
radial = relative - axis * relative.dot(axis)
|
||||||
|
if radial.Length < 1e-10:
|
||||||
|
return 0.0
|
||||||
|
radial.normalize()
|
||||||
|
if abs(axis.dot(App.Vector(1, 0, 0))) < 0.99:
|
||||||
|
local_x = axis.cross(App.Vector(1, 0, 0)).normalize()
|
||||||
|
else:
|
||||||
|
local_x = axis.cross(App.Vector(0, 1, 0)).normalize()
|
||||||
|
local_y = axis.cross(local_x)
|
||||||
|
return math.degrees(math.atan2(radial.dot(local_y), radial.dot(local_x)))
|
||||||
|
|
||||||
|
|
||||||
def plane_tangent_to_cylinder(
|
def plane_tangent_to_cylinder(
|
||||||
face: Part.Face,
|
face: Part.Face,
|
||||||
angle: float = 0,
|
angle: float = 0,
|
||||||
@@ -966,16 +1001,41 @@ def plane_tangent_to_cylinder(
|
|||||||
|
|
||||||
if body:
|
if body:
|
||||||
plane = body.newObject("PartDesign::Plane", name)
|
plane = body.newObject("PartDesign::Plane", name)
|
||||||
# TangentPlane mode needs (face, vertex). Without a vertex reference,
|
# TangentPlane MapMode needs (face, vertex). Derive a vertex from
|
||||||
# fall back to manual placement.
|
# the cylinder face's edges and encode the angular offset.
|
||||||
_setup_ztools_datum(
|
vertex_sub = (
|
||||||
plane,
|
_find_cylinder_vertex(source_object, source_subname)
|
||||||
placement,
|
if source_object and source_subname
|
||||||
"tangent_cylinder",
|
else None
|
||||||
{"angle": angle, "radius": radius},
|
|
||||||
source_refs,
|
|
||||||
is_plane=True,
|
|
||||||
)
|
)
|
||||||
|
if vertex_sub:
|
||||||
|
vertex_angle = _vertex_angle_on_cylinder(source_object, vertex_sub, cyl)
|
||||||
|
offset_angle = angle - vertex_angle
|
||||||
|
offset_rot = App.Rotation(App.Vector(0, 0, 1), offset_angle)
|
||||||
|
att_offset = App.Placement(App.Vector(0, 0, 0), offset_rot)
|
||||||
|
_setup_ztools_datum(
|
||||||
|
plane,
|
||||||
|
placement,
|
||||||
|
"tangent_cylinder",
|
||||||
|
{"angle": angle, "radius": radius, "vertex_angle": vertex_angle},
|
||||||
|
source_refs,
|
||||||
|
is_plane=True,
|
||||||
|
map_mode="TangentPlane",
|
||||||
|
support=[
|
||||||
|
(source_object, source_subname),
|
||||||
|
(source_object, vertex_sub),
|
||||||
|
],
|
||||||
|
offset=att_offset,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
_setup_ztools_datum(
|
||||||
|
plane,
|
||||||
|
placement,
|
||||||
|
"tangent_cylinder",
|
||||||
|
{"angle": angle, "radius": radius},
|
||||||
|
source_refs,
|
||||||
|
is_plane=True,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
plane = doc.addObject("Part::Plane", name)
|
plane = doc.addObject("Part::Plane", name)
|
||||||
plane.Length = 50
|
plane.Length = 50
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
# ztools/resources - Icons and assets
|
# ztools/resources - Icons and assets
|
||||||
from .icons import MOCHA, get_icon, save_icons_to_disk
|
from .icons import MOCHA, get_icon, save_icons_to_disk
|
||||||
from .theme import get_stylesheet
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"get_icon",
|
"get_icon",
|
||||||
"save_icons_to_disk",
|
"save_icons_to_disk",
|
||||||
"MOCHA",
|
"MOCHA",
|
||||||
"get_stylesheet",
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,35 +1,10 @@
|
|||||||
# ztools/resources/icons.py
|
# ztools/resources/icons.py
|
||||||
# Catppuccin Mocha themed icons for ztools
|
# Catppuccin Mocha themed icons for ztools
|
||||||
|
|
||||||
# Catppuccin Mocha Palette
|
# Catppuccin Mocha Palette — sourced from kindred-addon-sdk
|
||||||
MOCHA = {
|
from kindred_sdk.theme import get_theme_tokens
|
||||||
"rosewater": "#f5e0dc",
|
|
||||||
"flamingo": "#f2cdcd",
|
MOCHA = get_theme_tokens()
|
||||||
"pink": "#f5c2e7",
|
|
||||||
"mauve": "#cba6f7",
|
|
||||||
"red": "#f38ba8",
|
|
||||||
"maroon": "#eba0ac",
|
|
||||||
"peach": "#fab387",
|
|
||||||
"yellow": "#f9e2af",
|
|
||||||
"green": "#a6e3a1",
|
|
||||||
"teal": "#94e2d5",
|
|
||||||
"sky": "#89dceb",
|
|
||||||
"sapphire": "#74c7ec",
|
|
||||||
"blue": "#89b4fa",
|
|
||||||
"lavender": "#b4befe",
|
|
||||||
"text": "#cdd6f4",
|
|
||||||
"subtext1": "#bac2de",
|
|
||||||
"subtext0": "#a6adc8",
|
|
||||||
"overlay2": "#9399b2",
|
|
||||||
"overlay1": "#7f849c",
|
|
||||||
"overlay0": "#6c7086",
|
|
||||||
"surface2": "#585b70",
|
|
||||||
"surface1": "#45475a",
|
|
||||||
"surface0": "#313244",
|
|
||||||
"base": "#1e1e2e",
|
|
||||||
"mantle": "#181825",
|
|
||||||
"crust": "#11111b",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def _svg_to_base64(svg_content: str) -> str:
|
def _svg_to_base64(svg_content: str) -> str:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user