From 8a1d8f2a92778314b05e5056126260afa2abb1b4 Mon Sep 17 00:00:00 2001 From: vectronic Date: Wed, 26 Jan 2022 11:20:29 +0000 Subject: [PATCH 1/7] fix: tweak dimension --- Legify/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Legify/Common.py b/Legify/Common.py index b56b4e3..eec885e 100644 --- a/Legify/Common.py +++ b/Legify/Common.py @@ -67,7 +67,7 @@ def _enum(*args): DIMS_PIN_INNER_RADIUS = 1.7 DIMS_PIN_LENGTH = 8 DIMS_PIN_FLANGE_HEIGHT = 0.25 -DIMS_PIN_FLANGE_DEPTH = 0.7 +DIMS_PIN_FLANGE_DEPTH = 0.75 DIMS_PIN_NOTCH_WIDTH = 0.9 DIMS_PIN_NOTCH_DEPTH = 2.8 DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS = 0.35 From 16fb96d5f0d71cb0d5d7cb6f38576e2d6ce8cdd0 Mon Sep 17 00:00:00 2001 From: vectronic Date: Wed, 26 Jan 2022 11:21:07 +0000 Subject: [PATCH 2/7] fix: support dynamic addition of macro sub-folder to python path --- legify-brick.FCMacro | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/legify-brick.FCMacro b/legify-brick.FCMacro index 9fabc4f..5ae0492 100644 --- a/legify-brick.FCMacro +++ b/legify-brick.FCMacro @@ -1,5 +1,15 @@ # coding: UTF-8 +import sys +import os.path + +# get the path of the current python script +current_path = os.path.dirname(os.path.realpath(__file__)) + +# check if this path belongs to the PYTHONPATH variable and if not add it +if not sys.path.__contains__(str(current_path)): + sys.path.append(str(current_path)) + from FreeCAD import Console, Gui from PySide2.QtWidgets import QMessageBox from PySide2.QtCore import Qt From 2f7bbd40b6918cc88551818073a3fa2eb9dd7ef7 Mon Sep 17 00:00:00 2001 From: vectronic Date: Wed, 26 Jan 2022 11:21:30 +0000 Subject: [PATCH 3/7] chore: update year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index f0d44a1..f493cf8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Vectronic +Copyright (c) 2022 Vectronic Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From bb6334bb8ee1818df9942c90bf7401ae39421c24 Mon Sep 17 00:00:00 2001 From: vectronic Date: Wed, 26 Jan 2022 12:07:43 +0000 Subject: [PATCH 4/7] refactor: simplify pin construction removing unneeded datum plane --- Legify/Pins.py | 81 +++++++++++++------------------------------------- 1 file changed, 20 insertions(+), 61 deletions(-) diff --git a/Legify/Pins.py b/Legify/Pins.py index b5b2a4d..1829ff9 100644 --- a/Legify/Pins.py +++ b/Legify/Pins.py @@ -143,14 +143,19 @@ def _render_pin_revolution(self, label, datum_point, revolution_sketch_plane, ba return pin_revolution - def _render_pin_flange(self, label, flange_path_sketch_plane, backwards): + def _render_pin_flange(self, label, base_plane, backwards): Console.PrintMessage("_render_pin_flange({},{})\n".format(label, backwards)) # path for additive pipe pin_pipe_path_sketch = self.brick.newObject("Sketcher::SketchObject", label + "_pin_pipe_path_sketch") - pin_pipe_path_sketch.Support = (flange_path_sketch_plane, '') + pin_pipe_path_sketch.Support = (base_plane, '') pin_pipe_path_sketch.MapMode = 'FlatFace' + pin_pipe_path_sketch.MapReversed = backwards + # note 0.005 adjustment to prevent seemingly a bug in freecad rendering + pin_pipe_path_sketch.AttachmentOffset = Placement(Vector(0, 0, + DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), + Rotation(0, 0, 0)) geometries = [] constraints = [] @@ -169,8 +174,6 @@ def _render_pin_flange(self, label, flange_path_sketch_plane, backwards): distance_x += DIMS_STUD_SPACING / 2 if backwards: distance_x = -1 * distance_x - if label == 'left' or label == 'right': - distance_x = -1 * distance_x constraints.append(Sketcher.Constraint('DistanceX', SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, @@ -395,13 +398,13 @@ def _render_linear_pattern(self, label, features, count): self.doc.recompute() - def _render_pins(self, label, datum_point, revolution_sketch_plane, flange_path_sketch_plane, backwards, rotation, - count): - Console.PrintMessage("_render_pins({},{},{})\n".format(label, backwards, count)) + def _render_pins(self, label, datum_point, revolution_sketch_plane, base_plane, revolution_backwards, + flange_backwards, rotation, count): + Console.PrintMessage("_render_pins({},{},{},{})\n".format(label, revolution_backwards, flange_backwards, count)) - pin_revolution = self._render_pin_revolution(label, datum_point, revolution_sketch_plane, backwards) + pin_revolution = self._render_pin_revolution(label, datum_point, revolution_sketch_plane, revolution_backwards) - pin_flange = self._render_pin_flange(label, flange_path_sketch_plane, backwards) + pin_flange = self._render_pin_flange(label, base_plane, flange_backwards) pin_notch_pocket = self._render_pin_notch(label, datum_point, rotation) @@ -455,49 +458,27 @@ def render(self, context): if self.front: if self.style == PinStyle.PIN: - flange_path_sketch_plane = context.brick.newObject("PartDesign::Plane", - "pin_flange_path_front_sketch_plane") - flange_path_sketch_plane.MapReversed = False - flange_path_sketch_plane.Support = [(self.front_datum_plane, '')] - - # note 0.005 adjustment to prevent seemingly a bug in freecad rendering - flange_path_sketch_plane.MapMode = 'FlatFace' - flange_path_sketch_plane.AttachmentOffset = Placement( - Vector(0, 0, DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), Rotation(0, 0, 0)) - flange_path_sketch_plane.ViewObject.Visibility = False - notch_datum_point = context.brick.newObject('PartDesign::Point', 'pin_notch_front_datum_point') notch_datum_point.Support = [(self.front_datum_plane, '')] notch_datum_point.MapMode = 'ObjectOrigin' notch_datum_point.ViewObject.Visibility = False - self._render_pins("front", notch_datum_point, revolution_sketch_plane, flange_path_sketch_plane, - False, 0, count) + self._render_pins("front", notch_datum_point, revolution_sketch_plane, self.front_datum_plane, + False, False, 0, count) else: self._render_axles("front", revolution_sketch_plane, False, count) if self.back: if self.style == PinStyle.PIN: - flange_path_sketch_plane = context.brick.newObject("PartDesign::Plane", - "pin_flange_back_front_sketch_plane") - flange_path_sketch_plane.MapReversed = True - flange_path_sketch_plane.Support = [(self.back_datum_plane, '')] - - # note 0.005 adjustment to prevent seemingly a bug in freecad rendering - flange_path_sketch_plane.MapMode = 'FlatFace' - flange_path_sketch_plane.AttachmentOffset = Placement( - Vector(0, 0, DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), Rotation(0, 0, 0)) - flange_path_sketch_plane.ViewObject.Visibility = False - notch_datum_point = context.brick.newObject('PartDesign::Point', 'pin_notch_back_datum_point') notch_datum_point.Support = [(self.back_datum_plane, '')] notch_datum_point.MapMode = 'ObjectOrigin' notch_datum_point.ViewObject.Visibility = False - self._render_pins("back", notch_datum_point, revolution_sketch_plane, flange_path_sketch_plane, - True, 180, count) + self._render_pins("back", notch_datum_point, revolution_sketch_plane, self.back_datum_plane, + True, True, 180, count) else: self._render_axles("back", revolution_sketch_plane, True, count) @@ -520,48 +501,26 @@ def render(self, context): if self.left: if self.style == PinStyle.PIN: - flange_path_sketch_plane = context.brick.newObject("PartDesign::Plane", - "pin_flange_path_left_sketch_plane") - flange_path_sketch_plane.MapReversed = True - flange_path_sketch_plane.Support = [(self.left_datum_plane, '')] - flange_path_sketch_plane.MapMode = 'FlatFace' - - # note 0.005 adjustment to prevent seemingly a bug in freecad rendering - flange_path_sketch_plane.AttachmentOffset = Placement( - Vector(0, 0, DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), Rotation(0, 0, 0)) - flange_path_sketch_plane.ViewObject.Visibility = False - notch_datum_point = context.brick.newObject('PartDesign::Point', 'pin_notch_left_datum_point') notch_datum_point.Support = [(self.left_datum_plane, '')] notch_datum_point.MapMode = 'ObjectOrigin' notch_datum_point.ViewObject.Visibility = False - self._render_pins("left", notch_datum_point, revolution_sketch_plane, flange_path_sketch_plane, - False, 270, count) + self._render_pins("left", notch_datum_point, revolution_sketch_plane, self.left_datum_plane, + False, True, 270, count) else: self._render_axles("left", revolution_sketch_plane, False, count) if self.right: if self.style == PinStyle.PIN: - flange_path_sketch_plane = context.brick.newObject("PartDesign::Plane", - "pin_flange_path_right_sketch_plane") - flange_path_sketch_plane.MapReversed = False - flange_path_sketch_plane.Support = [(self.right_datum_plane, '')] - flange_path_sketch_plane.MapMode = 'FlatFace' - - # note 0.005 adjustment to prevent seemingly a bug in freecad rendering - flange_path_sketch_plane.AttachmentOffset = Placement( - Vector(0, 0, DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), Rotation(0, 0, 0)) - flange_path_sketch_plane.ViewObject.Visibility = False - notch_datum_point = context.brick.newObject('PartDesign::Point', 'pin_notch_right_datum_point') notch_datum_point.Support = [(self.right_datum_plane, '')] notch_datum_point.MapMode = 'ObjectOrigin' notch_datum_point.ViewObject.Visibility = False - self._render_pins("right", notch_datum_point, revolution_sketch_plane, flange_path_sketch_plane, - True, 90, count) + self._render_pins("right", notch_datum_point, revolution_sketch_plane, self.right_datum_plane, + True, False, 90, count) else: self._render_axles("right", revolution_sketch_plane, True, count) From 4c8e569dc83ccea54c8610d6c28aa8e33eae5899 Mon Sep 17 00:00:00 2001 From: vectronic Date: Tue, 1 Feb 2022 14:19:28 +0000 Subject: [PATCH 5/7] refactor: simplify pin construction by placing datum point in center --- Legify/Pins.py | 172 ++++++++++++++++--------------------------------- 1 file changed, 55 insertions(+), 117 deletions(-) diff --git a/Legify/Pins.py b/Legify/Pins.py index 1829ff9..ef82261 100644 --- a/Legify/Pins.py +++ b/Legify/Pins.py @@ -32,14 +32,14 @@ def __init__(self): self.left_datum_plane = None self.right_datum_plane = None - def _render_pin_revolution(self, label, datum_point, revolution_sketch_plane, backwards): + def _render_pin_revolution(self, label, datum_point, base_plane, backwards): Console.PrintMessage("_render_pin_revolution({},{})\n".format(label, backwards)) pin_revolution_sketch = self.brick.newObject("Sketcher::SketchObject", label + "_pin_revolution_sketch") - pin_revolution_sketch.Support = (revolution_sketch_plane, '') - pin_revolution_sketch.MapMode = 'FlatFace' + pin_revolution_sketch.Support = [(base_plane, ''), (datum_point, '')] + pin_revolution_sketch.MapMode = 'TangentPlane' + pin_revolution_sketch.AttachmentOffset = Placement(Vector(0, 0, 0), Rotation(0, 90, 0)) pin_revolution_sketch.MapReversed = backwards - pin_revolution_sketch.addExternal(datum_point.Label, '') geometries = [] constraints = [] @@ -90,8 +90,7 @@ def _render_pin_revolution(self, label, datum_point, revolution_sketch_plane, ba DIMS_PIN_LENGTH)) constraints.append(Sketcher.Constraint('DistanceY', SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_TECHNIC_HOLE_CENTRE_HEIGHT)) + 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) # constraints for profile and construction line @@ -111,19 +110,16 @@ def _render_pin_revolution(self, label, datum_point, revolution_sketch_plane, ba DIMS_PIN_COLLAR_RADIUS - DIMS_PIN_INNER_RADIUS)) constraints.append(Sketcher.Constraint('DistanceY', SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, - DIMS_TECHNIC_HOLE_CENTRE_HEIGHT + DIMS_PIN_INNER_RADIUS)) + 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, DIMS_PIN_INNER_RADIUS)) # constrain profile and construction line to datum point constraints.append(Sketcher.Constraint('DistanceX', 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, - SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, - SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) constraints.append(Sketcher.Constraint('DistanceX', 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, - SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, - SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) pin_revolution_sketch.addGeometry(geometries, False) pin_revolution_sketch.addConstraint(constraints) @@ -154,7 +150,7 @@ def _render_pin_flange(self, label, base_plane, backwards): pin_pipe_path_sketch.MapReversed = backwards # note 0.005 adjustment to prevent seemingly a bug in freecad rendering pin_pipe_path_sketch.AttachmentOffset = Placement(Vector(0, 0, - DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), + DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), Rotation(0, 0, 0)) geometries = [] @@ -254,6 +250,8 @@ def _render_pin_notch(self, label, datum_point, rotation): pin_notch_sketch = self.brick.newObject("Sketcher::SketchObject", label + "_pin_notch_sketch") pin_notch_sketch.Support = [(datum_point, '')] pin_notch_sketch.MapMode = 'Translate' + pin_notch_sketch.AttachmentOffset = Placement(Vector(0, 0, -1 * DIMS_TECHNIC_HOLE_CENTRE_HEIGHT), + Rotation(Vector(0, 0, 0), 0)) pin_notch_sketch.Placement = Placement(Vector(0, 0, 0), Rotation(Vector(0, 0, 1), rotation)) pin_notch_sketch.addExternal(datum_point.Label, '') @@ -291,8 +289,6 @@ def _render_pin_notch(self, label, datum_point, rotation): DIMS_PIN_NOTCH_WIDTH + (2 * DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS))) distance_x = (DIMS_PIN_NOTCH_WIDTH / 2) + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS - if self.pins_offset: - distance_x += DIMS_STUD_SPACING / 2 if rotation < 180: constraints.append(Sketcher.Constraint('DistanceX', @@ -308,22 +304,10 @@ def _render_pin_notch(self, label, datum_point, rotation): 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, DIMS_PIN_LENGTH)) - if self.pins_offset: - if rotation < 180: - constraints.append(Sketcher.Constraint('DistanceX', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - DIMS_STUD_SPACING / 2)) - else: - constraints.append(Sketcher.Constraint('DistanceX', - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_STUD_SPACING / 2)) - else: - constraints.append(Sketcher.Constraint('DistanceX', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - 0)) + constraints.append(Sketcher.Constraint('DistanceX', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + 0)) constraints.append(Sketcher.Constraint('DistanceY', 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, @@ -398,20 +382,33 @@ def _render_linear_pattern(self, label, features, count): self.doc.recompute() - def _render_pins(self, label, datum_point, revolution_sketch_plane, base_plane, revolution_backwards, - flange_backwards, rotation, count): - Console.PrintMessage("_render_pins({},{},{},{})\n".format(label, revolution_backwards, flange_backwards, count)) + def _render_pins(self, label, base_plane, backwards, rotation, count): + Console.PrintMessage("_render_pins({},{},{})\n".format(label, backwards, count)) - pin_revolution = self._render_pin_revolution(label, datum_point, revolution_sketch_plane, revolution_backwards) + pin_centre_datum_point = self.brick.newObject('PartDesign::Point', + 'pin_centre_{}_datum_point'.format(label)) + pin_centre_datum_point.Support = [(base_plane, '')] + pin_centre_datum_point.MapMode = 'ObjectOrigin' + pin_centre_datum_point.ViewObject.Visibility = False + if self.pins_offset: + pin_centre_datum_point.AttachmentOffset = Placement(Vector(DIMS_STUD_SPACING / 2, + DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, 0), + Rotation(0, 0, 0)) + else: + pin_centre_datum_point.AttachmentOffset = Placement(Vector(0, DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, + 0), + Rotation(0, 0, 0)) + + pin_revolution = self._render_pin_revolution(label, pin_centre_datum_point, base_plane, backwards) - pin_flange = self._render_pin_flange(label, base_plane, flange_backwards) + pin_flange = self._render_pin_flange(label, base_plane, backwards) - pin_notch_pocket = self._render_pin_notch(label, datum_point, rotation) + pin_notch_pocket = self._render_pin_notch(label, pin_centre_datum_point, rotation) if count > 1: self._render_linear_pattern(label, [pin_revolution, pin_flange, pin_notch_pocket], count) - def _render_axles(self, label, revolution_sketch_plane, backwards, count): + def _render_axles(self, label, backwards, count): Console.PrintMessage("_render_axles({},{},{})\n".format(label, backwards, count)) # TODO: implement axle pin @@ -440,87 +437,28 @@ def render(self, context): self.right_datum_plane = context.right_datum_plane if self.front or self.back: - if self.pins_offset: - revolution_sketch_plane = context.brick.newObject("PartDesign::Plane", - "pin_profile_front_sketch_plane") - revolution_sketch_plane.MapReversed = False - revolution_sketch_plane.Support = [(context.brick.Origin.OriginFeatures[ORIGIN_YZ_PLANE_INDEX], '')] - revolution_sketch_plane.MapMode = 'FlatFace' - revolution_sketch_plane.AttachmentOffset = Placement(Vector(0, 0, DIMS_STUD_SPACING / 2), - Rotation(0, 0, 0)) - revolution_sketch_plane.ViewObject.Visibility = False - - count = self.width - 1 - else: - revolution_sketch_plane = self.yz_plane - - count = self.width + count = self.width + else: + count = self.depth - if self.front: - if self.style == PinStyle.PIN: - notch_datum_point = context.brick.newObject('PartDesign::Point', - 'pin_notch_front_datum_point') - notch_datum_point.Support = [(self.front_datum_plane, '')] - notch_datum_point.MapMode = 'ObjectOrigin' - notch_datum_point.ViewObject.Visibility = False - - self._render_pins("front", notch_datum_point, revolution_sketch_plane, self.front_datum_plane, - False, False, 0, count) - else: - self._render_axles("front", revolution_sketch_plane, False, count) + if self.pins_offset: + count = count - 1 + if self.style == PinStyle.PIN: + if self.front: + self._render_pins("front", self.front_datum_plane, False, 0, count) if self.back: - if self.style == PinStyle.PIN: - notch_datum_point = context.brick.newObject('PartDesign::Point', - 'pin_notch_back_datum_point') - notch_datum_point.Support = [(self.back_datum_plane, '')] - notch_datum_point.MapMode = 'ObjectOrigin' - notch_datum_point.ViewObject.Visibility = False - - self._render_pins("back", notch_datum_point, revolution_sketch_plane, self.back_datum_plane, - True, True, 180, count) - else: - self._render_axles("back", revolution_sketch_plane, True, count) - - if self.left or self.right: - if self.pins_offset: - revolution_sketch_plane = context.brick.newObject("PartDesign::Plane", - "pin_profile_left_sketch_plane") - revolution_sketch_plane.MapReversed = False - revolution_sketch_plane.Support = [(context.brick.Origin.OriginFeatures[ORIGIN_XZ_PLANE_INDEX], '')] - revolution_sketch_plane.MapMode = 'FlatFace' - revolution_sketch_plane.AttachmentOffset = Placement( - Vector(0, 0, -1 * (DIMS_STUD_SPACING / 2)), Rotation(0, 0, 0)) - revolution_sketch_plane.ViewObject.Visibility = False - - count = self.depth - 1 - else: - revolution_sketch_plane = self.xz_plane - - count = self.depth - + self._render_pins("back", self.back_datum_plane, True, 180, count) if self.left: - if self.style == PinStyle.PIN: - notch_datum_point = context.brick.newObject('PartDesign::Point', - 'pin_notch_left_datum_point') - notch_datum_point.Support = [(self.left_datum_plane, '')] - notch_datum_point.MapMode = 'ObjectOrigin' - notch_datum_point.ViewObject.Visibility = False - - self._render_pins("left", notch_datum_point, revolution_sketch_plane, self.left_datum_plane, - False, True, 270, count) - else: - self._render_axles("left", revolution_sketch_plane, False, count) - + self._render_pins("left", self.left_datum_plane, True, 270, count) + if self.right: + self._render_pins("right", self.right_datum_plane, False, 90, count) + else: + if self.front: + self._render_axles("front", False, count) + if self.back: + self._render_axles("back", True, count) + if self.left: + self._render_axles("left", False, count) if self.right: - if self.style == PinStyle.PIN: - notch_datum_point = context.brick.newObject('PartDesign::Point', - 'pin_notch_right_datum_point') - notch_datum_point.Support = [(self.right_datum_plane, '')] - notch_datum_point.MapMode = 'ObjectOrigin' - notch_datum_point.ViewObject.Visibility = False - - self._render_pins("right", notch_datum_point, revolution_sketch_plane, self.right_datum_plane, - True, False, 90, count) - else: - self._render_axles("right", revolution_sketch_plane, True, count) + self._render_axles("right", True, count) From e9eb9190ac80941fb5d1de0eaff1fa42302d53cb Mon Sep 17 00:00:00 2001 From: vectronic Date: Wed, 9 Feb 2022 14:48:38 +0000 Subject: [PATCH 6/7] refactor: simplify pin construction by using datum line refactor: move pin construction to common code docs: tweak docs --- Legify/Common.py | 356 +++++++++++++++++++++++++++++++++++++++++- Legify/Pins.py | 398 +++++------------------------------------------ README.md | 9 +- 3 files changed, 396 insertions(+), 367 deletions(-) diff --git a/Legify/Common.py b/Legify/Common.py index eec885e..8f046a4 100644 --- a/Legify/Common.py +++ b/Legify/Common.py @@ -1,6 +1,6 @@ # coding: UTF-8 -from FreeCAD import Console, Vector +from FreeCAD import Console, Placement, Rotation, Vector import math import Part import Sketcher @@ -418,7 +418,7 @@ def get_arc_edge_names(plane, inverted, offset, feature, radius): edge = face.Edges[j] # arcs have two vertices and arc needs to have a curve with desired radius - if len(edge.Vertexes) == 2 and hasattr(edge, 'Curve') and hasattr(edge.Curve, 'Radius')\ + if len(edge.Vertexes) == 2 and hasattr(edge, 'Curve') and hasattr(edge.Curve, 'Radius') \ and abs(edge.Curve.Radius - radius) < 1e-4: # face with negative offset along normal lies in plane @@ -431,7 +431,7 @@ def get_arc_edge_names(plane, inverted, offset, feature, radius): edge = feature.Shape.Edges[i] # arcs have two vertices and arc needs to have a curve with desired radius - if len(edge.Vertexes) == 2 and hasattr(edge, 'Curve') and hasattr(edge.Curve, 'Radius')\ + if len(edge.Vertexes) == 2 and hasattr(edge, 'Curve') and hasattr(edge.Curve, 'Radius') \ and abs(edge.Curve.Radius - radius) < 1e-4: # arc needs to be in potential edges @@ -443,3 +443,353 @@ def get_arc_edge_names(plane, inverted, offset, feature, radius): edge_names.append("Edge" + repr(i + 1)) break return edge_names + + +def _render_pin_revolution(label, datum_line, body, doc): + Console.PrintMessage("_render_pin_revolution({})\n".format(label)) + + pin_revolution_sketch = body.newObject("Sketcher::SketchObject", label + "_pin_revolution_sketch") + pin_revolution_sketch.Support = [(datum_line, '')] + pin_revolution_sketch.MapMode = 'ObjectXY' + pin_revolution_sketch.AttachmentOffset = Placement(Vector(0, 0, 0), Rotation(0, 90, 0)) + + geometries = [] + constraints = [] + + # construction line for rotation + + geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) + constraints.append(Sketcher.Constraint("Horizontal", 0)) + + # lines for profile + + geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) + constraints.append(Sketcher.Constraint('Horizontal', 1)) + + geometries.append(Part.LineSegment(xy_plane_top_left_vector(), xy_plane_bottom_left_vector())) + constraints.append(Sketcher.Constraint('Vertical', 2)) + + geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) + constraints.append(Sketcher.Constraint('Horizontal', 3)) + + geometries.append(Part.LineSegment(xy_plane_top_left_vector(), xy_plane_bottom_left_vector())) + constraints.append(Sketcher.Constraint('Vertical', 4)) + + geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) + constraints.append(Sketcher.Constraint('Horizontal', 5)) + + geometries.append(Part.LineSegment(xy_plane_top_left_vector(), xy_plane_bottom_left_vector())) + constraints.append(Sketcher.Constraint('Vertical', 6)) + + # constraints for profile + + constraints.append(Sketcher.Constraint("Coincident", 1, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 2, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", 2, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 3, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", 3, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 4, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", 4, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 5, SKETCH_GEOMETRY_VERTEX_END_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", 5, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 6, SKETCH_GEOMETRY_VERTEX_END_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", 6, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 1, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + + constraints.append(Sketcher.Constraint('DistanceX', + 0, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_LENGTH)) + constraints.append(Sketcher.Constraint('DistanceY', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) + + # constraints for profile and construction line + + constraints.append(Sketcher.Constraint('DistanceX', + 1, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, DIMS_PIN_COLLAR_DEPTH)) + constraints.append(Sketcher.Constraint('DistanceY', + 4, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 4, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_OUTER_RADIUS - DIMS_PIN_INNER_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceX', + 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 5, SKETCH_GEOMETRY_VERTEX_START_INDEX, DIMS_PIN_LENGTH)) + constraints.append(Sketcher.Constraint('DistanceY', + 6, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 6, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_COLLAR_RADIUS - DIMS_PIN_INNER_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceY', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, DIMS_PIN_INNER_RADIUS)) + + # constrain profile and construction line to datum point + + constraints.append(Sketcher.Constraint('DistanceX', + 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) + constraints.append(Sketcher.Constraint('DistanceX', + 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) + + pin_revolution_sketch.addGeometry(geometries, False) + pin_revolution_sketch.addConstraint(constraints) + + # Set construction lines + pin_revolution_sketch.toggleConstruction(0) + + doc.recompute() + + pin_revolution = body.newObject("PartDesign::Revolution", label + "_pin_revolution") + pin_revolution.Angle = 360 + pin_revolution.Profile = pin_revolution_sketch + pin_revolution.ReferenceAxis = (pin_revolution_sketch, ['Axis0']) + + doc.recompute() + pin_revolution_sketch.ViewObject.Visibility = False + + return pin_revolution + + +def _render_pin_flange(label, datum_line, body, doc): + Console.PrintMessage("_render_pin_flange({})\n".format(label)) + + # path for additive pipe + + pin_pipe_path_sketch = body.newObject("Sketcher::SketchObject", label + "_pin_pipe_path_sketch") + pin_pipe_path_sketch.Support = [(datum_line.Support[1][0]), (datum_line, '')] + pin_pipe_path_sketch.MapMode = 'OZX' + # note 0.005 adjustment to prevent seemingly a bug in freecad rendering + pin_pipe_path_sketch.AttachmentOffset = Placement(Vector(0, 0, ((-1 * DIMS_PIN_FLANGE_DEPTH) / 2) - 0.005), + Rotation(0, 0, 0)) + + geometries = [] + constraints = [] + + geometries.append(Part.Ellipse(Vector(DIMS_PIN_OUTER_RADIUS, 0, 0), + Vector(0, -1 * (DIMS_PIN_OUTER_RADIUS - DIMS_PIN_FLANGE_HEIGHT), 0), + Vector(0, 0, 0))) + + pin_pipe_path_sketch.addGeometry(geometries, False) + pin_pipe_path_sketch.exposeInternalGeometry(0) + + # constrain ellipse position + + constraints.append(Sketcher.Constraint('Coincident', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX)) + + # constrain ellipse shape + + constraints.append(Sketcher.Constraint('Horizontal', 1)) + constraints.append(Sketcher.Constraint('Distance', 1, 2 * DIMS_PIN_OUTER_RADIUS)) + constraints.append(Sketcher.Constraint('Distance', 2, 2 * (DIMS_PIN_OUTER_RADIUS - DIMS_PIN_FLANGE_HEIGHT))) + + pin_pipe_path_sketch.addConstraint(constraints) + + doc.recompute() + + # profile for additive pipe + + pin_pipe_profile_sketch = body.newObject("Sketcher::SketchObject", label + "_pin_pipe_profile_sketch") + pin_pipe_profile_sketch.Support = [(pin_pipe_path_sketch, 'Edge1')] + pin_pipe_profile_sketch.MapMode = 'ObjectXZ' + + geometries = [] + constraints = [] + + geometries.append(Part.Ellipse(Vector(0, DIMS_PIN_FLANGE_DEPTH / 2, 0), + Vector(-1 * DIMS_PIN_FLANGE_HEIGHT, 0, 0), + Vector(0, 0, 0))) + + pin_pipe_profile_sketch.addGeometry(geometries, False) + pin_pipe_profile_sketch.exposeInternalGeometry(0) + + # constrain ellipse position + + constraints.append(Sketcher.Constraint('DistanceX', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + DIMS_PIN_OUTER_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceY', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + 0)) + + # constrain ellipse shape + + constraints.append(Sketcher.Constraint('Horizontal', 2)) + constraints.append(Sketcher.Constraint('Distance', 1, DIMS_PIN_FLANGE_DEPTH)) + constraints.append(Sketcher.Constraint('Distance', 2, DIMS_PIN_FLANGE_HEIGHT * 2)) + + pin_pipe_profile_sketch.addConstraint(constraints) + + doc.recompute() + + # additive pipe for pin flange + + pin_pipe = body.newObject("PartDesign::AdditivePipe", label + "_pin_pipe") + pin_pipe.Profile = pin_pipe_profile_sketch + pin_pipe.Spine = pin_pipe_path_sketch + + doc.recompute() + + pin_pipe_path_sketch.ViewObject.Visibility = False + pin_pipe_profile_sketch.ViewObject.Visibility = False + + return pin_pipe + + +def _render_pin_notch(label, datum_line, body, doc): + Console.PrintMessage("_render_pin_notch({})\n".format(label)) + + # sketch for notch + + pin_notch_sketch = body.newObject("Sketcher::SketchObject", label + "_pin_notch_sketch") + pin_notch_sketch.Support = [(datum_line.Support[1][0]), (datum_line, '')] + pin_notch_sketch.MapMode = 'OYZ' + pin_notch_sketch.AttachmentOffset = Placement(Vector(0, 0, DIMS_PIN_OUTER_RADIUS), Rotation(0, 0, 0)) + + geometries = [] + constraints = [] + + geometries.append(Part.ArcOfCircle(Part.Circle(Vector(0, -1 * DIMS_PIN_NOTCH_DEPTH, 0), + Vector(0, 0, 1), + DIMS_PIN_NOTCH_WIDTH / 2), + math.pi, 0)) + geometries.append(Part.ArcOfCircle(Part.Circle(Vector(1, -1 * DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS, 0), + Vector(0, 0, 1), + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS), + math.pi / 2, math.pi)) + geometries.append(Part.ArcOfCircle(Part.Circle(Vector(-1, -1 * DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS, 0), + Vector(0, 0, 1), + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS), + 0, math.pi / 2)) + + geometries.append(Part.LineSegment(Vector(-1, 0, 0), Vector(-1, + -1 * (DIMS_PIN_NOTCH_DEPTH - + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS - + (DIMS_PIN_NOTCH_WIDTH / 2)), 0))) + geometries.append(Part.LineSegment(Vector(1, 0, 0), Vector(1, + -1 * (DIMS_PIN_NOTCH_DEPTH - + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS - + (DIMS_PIN_NOTCH_WIDTH / 2)), 0))) + geometries.append(Part.LineSegment(Vector(-1, 0, 0), Vector(1, 0, 0))) + + # connect and position notch shape + + constraints.append(Sketcher.Constraint("Vertical", 3)) + constraints.append(Sketcher.Constraint("Vertical", 4)) + constraints.append(Sketcher.Constraint("Horizontal", 5)) + + # opening horizontal line + + constraints.append(Sketcher.Constraint('DistanceY', + 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0)) + + # internal notch end + + constraints.append(Sketcher.Constraint('DistanceY', + 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_NOTCH_DEPTH)) + constraints.append(Sketcher.Constraint('DistanceY', + 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 0)) + constraints.append(Sketcher.Constraint('DistanceY', + 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + 0)) + + # right opening arc + + constraints.append(Sketcher.Constraint('DistanceX', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 1, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + (DIMS_PIN_NOTCH_WIDTH / 2) + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceX', + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, + (DIMS_PIN_NOTCH_WIDTH / 2) + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceY', + 1, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceY', + 1, SKETCH_GEOMETRY_VERTEX_END_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + + # left opening arc + + constraints.append(Sketcher.Constraint('DistanceX', + 2, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + (DIMS_PIN_NOTCH_WIDTH / 2) + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceX', + 2, SKETCH_GEOMETRY_VERTEX_END_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + (DIMS_PIN_NOTCH_WIDTH / 2) + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceY', + 2, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + constraints.append(Sketcher.Constraint('DistanceY', + 2, SKETCH_GEOMETRY_VERTEX_START_INDEX, + SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) + + # join geometries + + constraints.append(Sketcher.Constraint("Coincident", + 5, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 2, SKETCH_GEOMETRY_VERTEX_END_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", + 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 1, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", + 1, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 4, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", + 2, SKETCH_GEOMETRY_VERTEX_START_INDEX, + 3, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", + 4, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_END_INDEX)) + constraints.append(Sketcher.Constraint("Coincident", + 3, SKETCH_GEOMETRY_VERTEX_END_INDEX, + 0, SKETCH_GEOMETRY_VERTEX_START_INDEX)) + + pin_notch_sketch.addGeometry(geometries, False) + pin_notch_sketch.addConstraint(constraints) + + doc.recompute() + + # pocket for notch + + pin_notch_pocket = body.newObject("PartDesign::Pocket", label + "_pin_notch_pocket") + pin_notch_pocket.Type = PAD_TYPE_DIMENSION + pin_notch_pocket.Profile = pin_notch_sketch + pin_notch_pocket.Length = DIMS_PIN_OUTER_RADIUS * 2 + + doc.recompute() + + pin_notch_sketch.ViewObject.Visibility = False + + return pin_notch_pocket + + +def render_pin(label, datum_line, body, doc): + Console.PrintMessage("render_pin()\n") + + pin_revolution = _render_pin_revolution(label, datum_line, body, doc) + + pin_flange = _render_pin_flange(label, datum_line, body, doc) + + pin_notch_pocket = _render_pin_notch(label, datum_line, body, doc) + + return [pin_revolution, pin_flange, pin_notch_pocket] diff --git a/Legify/Pins.py b/Legify/Pins.py index ef82261..f6f475d 100644 --- a/Legify/Pins.py +++ b/Legify/Pins.py @@ -21,350 +21,13 @@ def __init__(self): self.back = None self.left = None self.right = None - self.right = None self.pins_offset = None - self.xy_plane = None - self.yz_plane = None - self.xz_plane = None self.front_datum_plane = None self.back_datum_plane = None self.left_datum_plane = None self.right_datum_plane = None - def _render_pin_revolution(self, label, datum_point, base_plane, backwards): - Console.PrintMessage("_render_pin_revolution({},{})\n".format(label, backwards)) - - pin_revolution_sketch = self.brick.newObject("Sketcher::SketchObject", label + "_pin_revolution_sketch") - pin_revolution_sketch.Support = [(base_plane, ''), (datum_point, '')] - pin_revolution_sketch.MapMode = 'TangentPlane' - pin_revolution_sketch.AttachmentOffset = Placement(Vector(0, 0, 0), Rotation(0, 90, 0)) - pin_revolution_sketch.MapReversed = backwards - - geometries = [] - constraints = [] - - # construction line for rotation - - geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) - constraints.append(Sketcher.Constraint("Horizontal", 0)) - - # lines for profile - - geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) - constraints.append(Sketcher.Constraint('Horizontal', 1)) - - geometries.append(Part.LineSegment(xy_plane_top_left_vector(), xy_plane_bottom_left_vector())) - constraints.append(Sketcher.Constraint('Vertical', 2)) - - geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) - constraints.append(Sketcher.Constraint('Horizontal', 3)) - - geometries.append(Part.LineSegment(xy_plane_top_left_vector(), xy_plane_bottom_left_vector())) - constraints.append(Sketcher.Constraint('Vertical', 4)) - - geometries.append(Part.LineSegment(xy_plane_top_right_vector(), xy_plane_top_left_vector())) - constraints.append(Sketcher.Constraint('Horizontal', 5)) - - geometries.append(Part.LineSegment(xy_plane_top_left_vector(), xy_plane_bottom_left_vector())) - constraints.append(Sketcher.Constraint('Vertical', 6)) - - # constraints for profile - - constraints.append(Sketcher.Constraint("Coincident", 1, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 2, SKETCH_GEOMETRY_VERTEX_START_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", 2, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 3, SKETCH_GEOMETRY_VERTEX_START_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", 3, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 4, SKETCH_GEOMETRY_VERTEX_START_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", 4, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 5, SKETCH_GEOMETRY_VERTEX_END_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", 5, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 6, SKETCH_GEOMETRY_VERTEX_END_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", 6, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 1, SKETCH_GEOMETRY_VERTEX_START_INDEX)) - - constraints.append(Sketcher.Constraint('DistanceX', - 0, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_LENGTH)) - constraints.append(Sketcher.Constraint('DistanceY', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) - - # constraints for profile and construction line - - constraints.append(Sketcher.Constraint('DistanceX', - 1, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, DIMS_PIN_COLLAR_DEPTH)) - constraints.append(Sketcher.Constraint('DistanceY', - 4, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 4, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_OUTER_RADIUS - DIMS_PIN_INNER_RADIUS)) - constraints.append(Sketcher.Constraint('DistanceX', - 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 5, SKETCH_GEOMETRY_VERTEX_START_INDEX, DIMS_PIN_LENGTH)) - constraints.append(Sketcher.Constraint('DistanceY', - 6, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 6, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_COLLAR_RADIUS - DIMS_PIN_INNER_RADIUS)) - constraints.append(Sketcher.Constraint('DistanceY', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, DIMS_PIN_INNER_RADIUS)) - - # constrain profile and construction line to datum point - - constraints.append(Sketcher.Constraint('DistanceX', - 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) - constraints.append(Sketcher.Constraint('DistanceX', - 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, 0)) - - pin_revolution_sketch.addGeometry(geometries, False) - pin_revolution_sketch.addConstraint(constraints) - - # Set construction lines - pin_revolution_sketch.toggleConstruction(0) - - self.doc.recompute() - - pin_revolution = self.brick.newObject("PartDesign::Revolution", label + "_pin_revolution") - pin_revolution.Angle = 360 - pin_revolution.Profile = pin_revolution_sketch - pin_revolution.ReferenceAxis = (pin_revolution_sketch, ['Axis0']) - - self.doc.recompute() - pin_revolution_sketch.ViewObject.Visibility = False - - return pin_revolution - - def _render_pin_flange(self, label, base_plane, backwards): - Console.PrintMessage("_render_pin_flange({},{})\n".format(label, backwards)) - - # path for additive pipe - - pin_pipe_path_sketch = self.brick.newObject("Sketcher::SketchObject", label + "_pin_pipe_path_sketch") - pin_pipe_path_sketch.Support = (base_plane, '') - pin_pipe_path_sketch.MapMode = 'FlatFace' - pin_pipe_path_sketch.MapReversed = backwards - # note 0.005 adjustment to prevent seemingly a bug in freecad rendering - pin_pipe_path_sketch.AttachmentOffset = Placement(Vector(0, 0, - DIMS_PIN_LENGTH - (DIMS_PIN_FLANGE_DEPTH / 2) - 0.005), - Rotation(0, 0, 0)) - - geometries = [] - constraints = [] - - geometries.append(Part.Ellipse(Vector(DIMS_PIN_OUTER_RADIUS, 0, 0), - Vector(0, -1 * (DIMS_PIN_OUTER_RADIUS - DIMS_PIN_FLANGE_HEIGHT), 0), - Vector(0, 0, 0))) - - pin_pipe_path_sketch.addGeometry(geometries, False) - pin_pipe_path_sketch.exposeInternalGeometry(0) - - # constrain ellipse position - - distance_x = 0 - if self.pins_offset: - distance_x += DIMS_STUD_SPACING / 2 - if backwards: - distance_x = -1 * distance_x - - constraints.append(Sketcher.Constraint('DistanceX', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - distance_x)) - constraints.append(Sketcher.Constraint('DistanceY', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - DIMS_TECHNIC_HOLE_CENTRE_HEIGHT)) - - # constrain ellipse shape - - constraints.append(Sketcher.Constraint('Horizontal', 1)) - constraints.append(Sketcher.Constraint('Distance', 1, 2 * DIMS_PIN_OUTER_RADIUS)) - constraints.append(Sketcher.Constraint('Distance', 2, 2 * (DIMS_PIN_OUTER_RADIUS - DIMS_PIN_FLANGE_HEIGHT))) - - pin_pipe_path_sketch.addConstraint(constraints) - - self.doc.recompute() - - # profile for additive pipe - - pin_pipe_profile_sketch = self.brick.newObject("Sketcher::SketchObject", - label + "_pin_pipe_profile_sketch") - pin_pipe_profile_sketch.Support = [(pin_pipe_path_sketch, 'Edge1')] - pin_pipe_profile_sketch.MapMode = 'ObjectXZ' - pin_pipe_profile_sketch.MapReversed = backwards - - geometries = [] - constraints = [] - - geometries.append(Part.Ellipse(Vector(0, DIMS_PIN_FLANGE_DEPTH / 2, 0), - Vector(-1 * DIMS_PIN_FLANGE_HEIGHT, 0, 0), - Vector(0, 0, 0))) - - pin_pipe_profile_sketch.addGeometry(geometries, False) - pin_pipe_profile_sketch.exposeInternalGeometry(0) - - # constrain ellipse position - - constraints.append(Sketcher.Constraint('DistanceX', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - DIMS_PIN_OUTER_RADIUS)) - constraints.append(Sketcher.Constraint('DistanceY', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - 0)) - - # constrain ellipse shape - - constraints.append(Sketcher.Constraint('Horizontal', 2)) - constraints.append(Sketcher.Constraint('Distance', 1, DIMS_PIN_FLANGE_DEPTH)) - constraints.append(Sketcher.Constraint('Distance', 2, DIMS_PIN_FLANGE_HEIGHT * 2)) - - pin_pipe_profile_sketch.addConstraint(constraints) - - self.doc.recompute() - - # additive pipe for pin flange - - pin_pipe = self.brick.newObject("PartDesign::AdditivePipe", label + "_pin_pipe") - pin_pipe.Profile = pin_pipe_profile_sketch - pin_pipe.Spine = pin_pipe_path_sketch - - self.doc.recompute() - - pin_pipe_path_sketch.ViewObject.Visibility = False - pin_pipe_profile_sketch.ViewObject.Visibility = False - - return pin_pipe - - def _render_pin_notch(self, label, datum_point, rotation): - Console.PrintMessage("_render_pin_notch({},{})\n".format(label, rotation)) - - # sketch for notch - - pin_notch_sketch = self.brick.newObject("Sketcher::SketchObject", label + "_pin_notch_sketch") - pin_notch_sketch.Support = [(datum_point, '')] - pin_notch_sketch.MapMode = 'Translate' - pin_notch_sketch.AttachmentOffset = Placement(Vector(0, 0, -1 * DIMS_TECHNIC_HOLE_CENTRE_HEIGHT), - Rotation(Vector(0, 0, 0), 0)) - pin_notch_sketch.Placement = Placement(Vector(0, 0, 0), Rotation(Vector(0, 0, 1), rotation)) - pin_notch_sketch.addExternal(datum_point.Label, '') - - geometries = [] - constraints = [] - - # need to position primitives roughly to ensure constraints can be solved - y_datum = datum_point.Placement.Base.y - - geometries.append(Part.ArcOfCircle(Part.Circle(Vector(0, y_datum, 0), Vector(0, 0, 1), - DIMS_PIN_NOTCH_WIDTH / 2), 0, math.pi)) - geometries.append(Part.ArcOfCircle(Part.Circle(Vector(1, y_datum - DIMS_PIN_LENGTH, 0), - Vector(0, 0, 1), DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS), - -1 * math.pi, -1 * (math.pi / 2))) - geometries.append(Part.ArcOfCircle(Part.Circle(Vector(-1, y_datum - DIMS_PIN_LENGTH, 0), - Vector(0, 0, 1), DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS), - -1 * (math.pi / 2), 0)) - - geometries.append(Part.LineSegment(Vector(-1, y_datum, 0), Vector(-1, y_datum - DIMS_PIN_LENGTH, 0))) - geometries.append(Part.LineSegment(Vector(1, y_datum, 0), Vector(1, y_datum - DIMS_PIN_LENGTH, 0))) - geometries.append(Part.LineSegment(Vector(-1, y_datum - DIMS_PIN_LENGTH - 1, 0), - Vector(1, y_datum - DIMS_PIN_LENGTH - 1, 0))) - - # connect and position notch shape - - constraints.append(Sketcher.Constraint('Radius', 0, DIMS_PIN_NOTCH_WIDTH / 2)) - constraints.append(Sketcher.Constraint('Radius', 1, DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) - constraints.append(Sketcher.Constraint('Radius', 2, DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) - - constraints.append(Sketcher.Constraint("Horizontal", 5)) - constraints.append(Sketcher.Constraint("Vertical", 3)) - constraints.append(Sketcher.Constraint("Vertical", 4)) - - constraints.append(Sketcher.Constraint('Distance', 5, - DIMS_PIN_NOTCH_WIDTH + (2 * DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS))) - - distance_x = (DIMS_PIN_NOTCH_WIDTH / 2) + DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS - - if rotation < 180: - constraints.append(Sketcher.Constraint('DistanceX', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, - distance_x)) - else: - constraints.append(Sketcher.Constraint('DistanceX', - 5, SKETCH_GEOMETRY_VERTEX_START_INDEX, - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - distance_x)) - constraints.append(Sketcher.Constraint('DistanceY', - 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, - SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_LENGTH)) - constraints.append(Sketcher.Constraint('DistanceX', - SKETCH_GEOMETRY_ORIGIN_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - 0)) - constraints.append(Sketcher.Constraint('DistanceY', - 0, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, - SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_LENGTH - DIMS_PIN_NOTCH_DEPTH)) - constraints.append(Sketcher.Constraint('DistanceY', - 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, - SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_LENGTH - DIMS_PIN_NOTCH_DEPTH)) - constraints.append(Sketcher.Constraint('DistanceY', - 0, SKETCH_GEOMETRY_VERTEX_END_INDEX, - SKETCH_GEOMETRY_FIRST_EXTERNAL_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_LENGTH - DIMS_PIN_NOTCH_DEPTH)) - constraints.append(Sketcher.Constraint("Coincident", - 5, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 2, SKETCH_GEOMETRY_VERTEX_START_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", - 5, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 1, SKETCH_GEOMETRY_VERTEX_END_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", - 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 4, SKETCH_GEOMETRY_VERTEX_END_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", - 2, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 3, SKETCH_GEOMETRY_VERTEX_END_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", - 0, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 3, SKETCH_GEOMETRY_VERTEX_START_INDEX)) - constraints.append(Sketcher.Constraint("Coincident", - 0, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 4, SKETCH_GEOMETRY_VERTEX_START_INDEX)) - constraints.append(Sketcher.Constraint('DistanceY', - 2, SKETCH_GEOMETRY_VERTEX_START_INDEX, - 2, SKETCH_GEOMETRY_VERTEX_END_INDEX, - DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) - constraints.append(Sketcher.Constraint('DistanceY', - 1, SKETCH_GEOMETRY_VERTEX_END_INDEX, - 1, SKETCH_GEOMETRY_VERTEX_START_INDEX, - DIMS_PIN_NOTCH_OPENING_FILLET_RADIUS)) - - pin_notch_sketch.addGeometry(geometries, False) - pin_notch_sketch.addConstraint(constraints) - - self.doc.recompute() - - # pocket for notch - - pin_notch_pocket = self.brick.newObject("PartDesign::Pocket", label + "_pin_notch_pocket") - pin_notch_pocket.Type = PAD_TYPE_THROUGH_ALL - pin_notch_pocket.Profile = pin_notch_sketch - pin_notch_pocket.Reversed = True - - self.doc.recompute() - - pin_notch_sketch.ViewObject.Visibility = False - - return pin_notch_pocket - def _render_linear_pattern(self, label, features, count): Console.PrintMessage("_render_linear_pattern({}, {})\n".format(label, count)) @@ -382,31 +45,48 @@ def _render_linear_pattern(self, label, features, count): self.doc.recompute() - def _render_pins(self, label, base_plane, backwards, rotation, count): + def _render_pins(self, label, base_plane, backwards, count): Console.PrintMessage("_render_pins({},{},{})\n".format(label, backwards, count)) - pin_centre_datum_point = self.brick.newObject('PartDesign::Point', - 'pin_centre_{}_datum_point'.format(label)) - pin_centre_datum_point.Support = [(base_plane, '')] - pin_centre_datum_point.MapMode = 'ObjectOrigin' - pin_centre_datum_point.ViewObject.Visibility = False + pin_base_datum_point = self.brick.newObject('PartDesign::Point', + 'pin_base_{}_datum_point'.format(label)) + pin_base_datum_point.Support = [(base_plane, '')] + pin_base_datum_point.MapMode = 'ObjectOrigin' + pin_base_datum_point.ViewObject.Visibility = False if self.pins_offset: - pin_centre_datum_point.AttachmentOffset = Placement(Vector(DIMS_STUD_SPACING / 2, - DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, 0), - Rotation(0, 0, 0)) + pin_base_datum_point.AttachmentOffset = Placement(Vector(DIMS_STUD_SPACING / 2, + DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, 0), + Rotation(0, 0, 0)) else: - pin_centre_datum_point.AttachmentOffset = Placement(Vector(0, DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, - 0), - Rotation(0, 0, 0)) + pin_base_datum_point.AttachmentOffset = Placement(Vector(0, DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, 0), + Rotation(0, 0, 0)) - pin_revolution = self._render_pin_revolution(label, pin_centre_datum_point, base_plane, backwards) + pin_tip_offset = DIMS_PIN_LENGTH + if backwards: + pin_tip_offset *= -1 - pin_flange = self._render_pin_flange(label, base_plane, backwards) + pin_tip_datum_point = self.brick.newObject('PartDesign::Point', + 'pin_tip_{}_datum_point'.format(label)) + pin_tip_datum_point.Support = [(base_plane, '')] + pin_tip_datum_point.MapMode = 'ObjectOrigin' + pin_tip_datum_point.ViewObject.Visibility = False + if self.pins_offset: + pin_tip_datum_point.AttachmentOffset = Placement(Vector(DIMS_STUD_SPACING / 2, + DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, pin_tip_offset), + Rotation(0, 0, 0)) + else: + pin_tip_datum_point.AttachmentOffset = Placement(Vector(0, DIMS_TECHNIC_HOLE_CENTRE_HEIGHT, pin_tip_offset), + Rotation(0, 0, 0)) - pin_notch_pocket = self._render_pin_notch(label, pin_centre_datum_point, rotation) + pin_datum_line = self.brick.newObject('PartDesign::Line', 'pin_{}_datum_line'.format(label)) + pin_datum_line.Support = [(pin_base_datum_point, ''), (pin_tip_datum_point, '')] + pin_datum_line.MapMode = 'TwoPointLine' + pin_datum_line.ViewObject.Visibility = False + + pin_features = render_pin(label, pin_datum_line, self.brick, self.doc) if count > 1: - self._render_linear_pattern(label, [pin_revolution, pin_flange, pin_notch_pocket], count) + self._render_linear_pattern(label, pin_features, count) def _render_axles(self, label, backwards, count): Console.PrintMessage("_render_axles({},{},{})\n".format(label, backwards, count)) @@ -425,12 +105,8 @@ def render(self, context): self.back = context.pins_back self.left = context.pins_left self.right = context.pins_right - self.right = context.pins_right self.pins_offset = context.pins_offset - self.xy_plane = context.xy_plane - self.yz_plane = context.yz_plane - self.xz_plane = context.xz_plane self.front_datum_plane = context.front_datum_plane self.back_datum_plane = context.back_datum_plane self.left_datum_plane = context.left_datum_plane @@ -446,13 +122,13 @@ def render(self, context): if self.style == PinStyle.PIN: if self.front: - self._render_pins("front", self.front_datum_plane, False, 0, count) + self._render_pins("front", self.front_datum_plane, False, count) if self.back: - self._render_pins("back", self.back_datum_plane, True, 180, count) + self._render_pins("back", self.back_datum_plane, True, count) if self.left: - self._render_pins("left", self.left_datum_plane, True, 270, count) + self._render_pins("left", self.left_datum_plane, True, count) if self.right: - self._render_pins("right", self.right_datum_plane, False, 90, count) + self._render_pins("right", self.right_datum_plane, False, count) else: if self.front: self._render_axles("front", False, count) diff --git a/README.md b/README.md index d65dea8..d313d03 100644 --- a/README.md +++ b/README.md @@ -25,10 +25,13 @@ to create parametric models in FreeCAD is quite possibly insane! `git clone https://github.com/vectronic/freecad-legify-macros.git` -1. Link the cloned folder and macro file into the FreeCAD macros directory: +1. Link the cloned folder and macro files into the FreeCAD macros directory: - ln -s /legify-brick.FCMacro /FreeCAD/Macro/ ln -s /Legify /FreeCAD/Macro/ + ln -s /legify-brick.FCMacro /FreeCAD/Macro/ + ln -s /legify-technic-pin.FCMacro /FreeCAD/Macro/ + +**NOTE**: On MacOS the typical location for the user preferences folder is `/Users//Library/Application\ Support`. ## Usage @@ -36,7 +39,7 @@ to create parametric models in FreeCAD is quite possibly insane! 1. Run the `legify-brick.FCMacro` 1. Modify parameters as desired in the popup dialog 1. Click OK -1. Wait for for a lot of sketches, constraints, pads, pockets and fillets to be rendered... +1. Wait for a lot of sketches, constraints, pads, pockets and fillets to be rendered... 1. Admire the resulting beauty! ## TODO From 915eb39051e07259f7dcf9824e7d32e8bed02d63 Mon Sep 17 00:00:00 2001 From: vectronic Date: Mon, 21 Feb 2022 11:00:14 +0000 Subject: [PATCH 7/7] feature: added macro to add technic pin to existing body --- README.md | 9 +++++++ legify-technic-pin.FCMacro | 49 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 legify-technic-pin.FCMacro diff --git a/README.md b/README.md index d313d03..7bf0cf4 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ to create parametric models in FreeCAD is quite possibly insane! ## Usage +### Create a new brick model 1. Create a new document 1. Run the `legify-brick.FCMacro` 1. Modify parameters as desired in the popup dialog @@ -42,6 +43,14 @@ to create parametric models in FreeCAD is quite possibly insane! 1. Wait for a lot of sketches, constraints, pads, pockets and fillets to be rendered... 1. Admire the resulting beauty! +### Add a technic pin to the face of a body +1. Within the Part Design workbench, create a body. +2. Create a datum point on an existing face representing the centre point of the base of the pin. +3. Create a datum point extended 8mm from the normal to the face representing the centre point of the tip of the pin. +4. Create a datum line supported by the base datum point and the tip datum point in that order. +5. Select the body and select the datum line. +6. Run the `legify-technic-pin.FCMacro` + ## TODO - [ ] Wait for [Linear Pattern bug fix](https://tracker.freecad.org/view.php?id=4781) needed when rendering more than one technic pin diff --git a/legify-technic-pin.FCMacro b/legify-technic-pin.FCMacro new file mode 100644 index 0000000..2ddcfd3 --- /dev/null +++ b/legify-technic-pin.FCMacro @@ -0,0 +1,49 @@ +# coding: UTF-8 + +import sys +import os.path + +# get the path of the current python script +current_path = os.path.dirname(os.path.realpath(__file__)) + +# check if this path belongs to the PYTHONPATH variable and if not add it +if not sys.path.__contains__(str(current_path)): + sys.path.append(str(current_path)) + +from FreeCAD import Console, Gui, activeDocument +from PySide2.QtWidgets import QMessageBox +from PySide2.QtCore import Qt +from Legify.Common import * + +if not Gui.activeDocument(): + + Console.PrintMessage("No active document!\n") + dialog = QMessageBox(QMessageBox.Warning, 'No active document!', "There is no active document!") + dialog.setWindowModality(Qt.ApplicationModal) + dialog.exec_() + + exit(1) + +selection = Gui.Selection.getSelection() + +if not selection[0]: + + Console.PrintMessage("No selected body!\n") + dialog = QMessageBox(QMessageBox.Warning, 'No selected body!', "There is no selected body!") + dialog.setWindowModality(Qt.ApplicationModal) + dialog.exec_() + + exit(1) + +if not selection[1]: + Console.PrintMessage("No selected datum line!\n") + dialog = QMessageBox(QMessageBox.Warning, 'No selected datum line!', "There is no selected datum line!") + dialog.setWindowModality(Qt.ApplicationModal) + dialog.exec_() + + exit(1) + +render_pin('Pin', selection[1], selection[0], activeDocument()) + +Gui.activeDocument().activeView().viewAxonometric() +Gui.SendMsgToActiveView("ViewFit")