From 5130c15b46e75ee5b8da1905a019adbf72d1f4f1 Mon Sep 17 00:00:00 2001 From: satabol Date: Mon, 21 Aug 2023 01:00:02 +0300 Subject: [PATCH 1/8] fix 4988 Unexpected behaviors for Ellipse (Curve) sockets. Now sockets switch on in them positions. Docs also fixed --- .../{ellipse.rst => ellipse_curve_mk2.rst} | 0 index.yaml | 2 +- menus/full_by_data_type.yaml | 2 +- menus/full_nortikin.yaml | 2 +- nodes/curve/ellipse_curve_mk2.py | 169 ++++++++++++++++++ .../ellipse.py => old_nodes/ellipse_curve.py | 0 6 files changed, 172 insertions(+), 3 deletions(-) rename docs/nodes/curve/{ellipse.rst => ellipse_curve_mk2.rst} (100%) create mode 100644 nodes/curve/ellipse_curve_mk2.py rename nodes/curve/ellipse.py => old_nodes/ellipse_curve.py (100%) diff --git a/docs/nodes/curve/ellipse.rst b/docs/nodes/curve/ellipse_curve_mk2.rst similarity index 100% rename from docs/nodes/curve/ellipse.rst rename to docs/nodes/curve/ellipse_curve_mk2.rst diff --git a/index.yaml b/index.yaml index dd92bc025e..0ce3e675e2 100644 --- a/index.yaml +++ b/index.yaml @@ -62,7 +62,7 @@ - Curve Primitives: - SvExLineCurveNode - SvCircleCurveMk2Node - - SvEllipseCurveNode + - SvEllipseCurveNodeMK2 - SvRoundedRectangleNode - SvArc3ptCurveNode - SvArcSedCurveNode diff --git a/menus/full_by_data_type.yaml b/menus/full_by_data_type.yaml index 03861ed9f8..64416013aa 100644 --- a/menus/full_by_data_type.yaml +++ b/menus/full_by_data_type.yaml @@ -228,7 +228,7 @@ - icon_name: OUTLINER_OB_CURVE - SvExLineCurveNode - SvCircleCurveMk2Node - - SvEllipseCurveNode + - SvEllipseCurveNodeMK2 - SvRoundedRectangleNode - SvArc3ptCurveNode - SvArcSedCurveNode diff --git a/menus/full_nortikin.yaml b/menus/full_nortikin.yaml index 402f4400ac..febf8dc8d6 100644 --- a/menus/full_nortikin.yaml +++ b/menus/full_nortikin.yaml @@ -68,7 +68,7 @@ - icon_name: MESH_CUBE - SvExLineCurveNode - SvCircleCurveMk2Node - - SvEllipseCurveNode + - SvEllipseCurveNodeMK2 - SvRoundedRectangleNode - SvArc3ptCurveNode - SvArcSedCurveNode diff --git a/nodes/curve/ellipse_curve_mk2.py b/nodes/curve/ellipse_curve_mk2.py new file mode 100644 index 0000000000..ff02e21a69 --- /dev/null +++ b/nodes/curve/ellipse_curve_mk2.py @@ -0,0 +1,169 @@ + +from math import sqrt + +from mathutils import Matrix +import bpy +from bpy.props import FloatProperty, EnumProperty, BoolProperty + +from sverchok.node_tree import SverchCustomTreeNode +from sverchok.data_structure import updateNode, zip_long_repeat, ensure_nesting_level + +from sverchok.utils.curve import SvEllipse + +class SvEllipseCurveNodeMK2(SverchCustomTreeNode, bpy.types.Node): + """ + Triggers: Ellipse Curve + Tooltip: Generate ellipse curve + """ + bl_idname = 'SvEllipseCurveNodeMK2' + bl_label = 'Ellipse (Curve)' + sv_icon = 'SV_ELLIPSE' + + mode_items = [("AB", "a b", "Major Radius / Minor Radius", 1), + ("AE", "a e", "Major Radius / Eccentricity", 2), + ("AC", "a c", "Major Radius / Focal Length", 3)] + + centering_items = [(SvEllipse.F1, "F1", "Ellipse focal point 1", 1), + (SvEllipse.CENTER, "C", "Ellipse center point", 2), + (SvEllipse.F2, "F2", "Ellipse focal point 2", 3)] + + def update_sockets(self, context): + all_sockets_name = ["Minor Radius", "Eccentricity", "Focal Length", ] + #self.inputs["Minor Radius"].hide = True + #self.inputs["Eccentricity"].hide = True + #self.inputs["Focal Length"].hide = True + + list_links_remove = None + if self.mode == "AB": + list_links_remove = ["Eccentricity", "Focal Length",] + #self.inputs["Minor Radius"].hide = False + #socket2 = self.inputs[1] + #socket2.replace_socket("SvStringsSocket", "Minor Radius").prop_name = "minor_radius" + elif self.mode == "AE": + list_links_remove = ["Minor Radius", "Focal Length",] + #self.inputs["Eccentricity"].hide = False + #socket2 = self.inputs[1] + #socket2.replace_socket("SvStringsSocket", "Eccentricity").prop_name = "eccentricity" + else: # AC + list_links_remove = ["Minor Radius", "Eccentricity",] + #self.inputs["Focal Length"].hide = False + #socket2 = self.inputs[1] + #socket2.replace_socket("SvStringsSocket", "Focal Length").prop_name = "focal_length" + + for socket_name in list_links_remove: + all_sockets_name.remove(socket_name) + for l in self.inputs[socket_name].links: + self.id_data.links.remove(l) + self.inputs[socket_name].hide = True + self.inputs[ all_sockets_name[0] ].hide = False + + updateNode(self, context) + + mode: EnumProperty( + name="Mode", items=mode_items, + description="Ellipse definition mode", + default="AB", update=update_sockets) + + centering: EnumProperty( + name="Centering", items=centering_items, + description="Center the ellipse around F1, C or F2", + default=SvEllipse.CENTER, + update=update_sockets) + + major_radius: FloatProperty( + name='Major Radius', description='Ellipse major radius (semiaxis)', + default=1.0, min=0.0, update=update_sockets) + + minor_radius: FloatProperty( + name='Minor Radius', description='Ellipse minor radius (semiaxis)', + default=0.8, min=0.0, update=update_sockets) + + eccentricity: FloatProperty( + name='Eccentricity', description='Ellipse eccentricity', + default=0.6, min=0.0, max=1.0, update=update_sockets) + + focal_length: FloatProperty( + name='Focal Length', description='Ellipse focal length. Distance from ellipse’s center to it’s focal points', + default=0.6, min=0.0, update=update_sockets) + + def draw_buttons(self, context, layout): + col = layout.column(align=True) + row = col.row(align=True) + row.prop(self, "mode", expand=True) + row = col.row(align=True) + row.prop(self, "centering", expand=True) + + def sv_init(self, context): + self.width = 160 + self.inputs.new('SvStringsSocket', "Major Radius").prop_name = "major_radius" # 0 + self.inputs.new('SvStringsSocket', "Minor Radius").prop_name = "minor_radius" # 1 + self.inputs.new("SvStringsSocket", "Eccentricity").prop_name = "eccentricity" + self.inputs.new("SvStringsSocket", "Focal Length").prop_name = "focal_length" + self.inputs.new('SvMatrixSocket', "Matrix") # 2 + + self.outputs.new('SvCurveSocket', "Ellipse") + self.outputs.new('SvVerticesSocket', "F1") + self.outputs.new('SvVerticesSocket', "F2") + + self.update_sockets(context) + + def process(self): + outputs = self.outputs + # return if no outputs are connected + if not any(s.is_linked for s in outputs): + return + + major_radius_s = self.inputs['Major Radius'].sv_get() + if self.mode == 'AB': + input2_s = self.inputs["Minor Radius"].sv_get() + elif self.mode == 'AE': + input2_s = self.inputs["Eccentricity"].sv_get() + else: + input2_s = self.inputs["Focal Length"].sv_get() + + matrices_s = self.inputs['Matrix'].sv_get(default = [[Matrix()]]) + + major_radius_s = ensure_nesting_level(major_radius_s, 2) + input2_s = ensure_nesting_level(input2_s, 2) + matrices_s = ensure_nesting_level(matrices_s, 2, data_types=(Matrix,)) + + curves_out = [] + f1_out = [] + f2_out = [] + for major_radius_i, input2_i, matrices_i in zip_long_repeat(major_radius_s, input2_s, matrices_s): + new_curves = [] + new_f1 = [] + new_f2 = [] + for major_radius, input2, matrix in zip_long_repeat(major_radius_i, input2_i, matrices_i): + if self.mode == 'AB': + minor_radius = input2 + elif self.mode == 'AE': + e = input2 + # if e<0 or 1 Date: Mon, 21 Aug 2023 01:12:07 +0300 Subject: [PATCH 2/8] - --- docs/nodes/curve/{ellipse_curve_mk2.rst => ellipse_curve.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/nodes/curve/{ellipse_curve_mk2.rst => ellipse_curve.rst} (100%) diff --git a/docs/nodes/curve/ellipse_curve_mk2.rst b/docs/nodes/curve/ellipse_curve.rst similarity index 100% rename from docs/nodes/curve/ellipse_curve_mk2.rst rename to docs/nodes/curve/ellipse_curve.rst From 497dc7bb595a1f4efe8e8398fb76d15886e12ecb Mon Sep 17 00:00:00 2001 From: satabol Date: Mon, 21 Aug 2023 01:25:59 +0300 Subject: [PATCH 3/8] - fix docs refs --- docs/nodes/surface/implicit_surface_raycast.rst | 2 +- docs/nodes/surface/raycast.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/nodes/surface/implicit_surface_raycast.rst b/docs/nodes/surface/implicit_surface_raycast.rst index 5aa99b1b3c..fcb103a087 100644 --- a/docs/nodes/surface/implicit_surface_raycast.rst +++ b/docs/nodes/surface/implicit_surface_raycast.rst @@ -74,7 +74,7 @@ Example of usage :target: https://user-images.githubusercontent.com/284644/87581701-d075fc80-c6f2-11ea-9eb6-ab02ba69ef2a.png * Generator-> :doc:`Box ` -* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` +* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` * Curves-> :doc:`Evaluate Curve ` * Surfaces-> :doc:`Marching Cubes ` * Modifiers->Modifier Make-> :doc:`UV Connection ` diff --git a/docs/nodes/surface/raycast.rst b/docs/nodes/surface/raycast.rst index ce12e63bac..8d0b304572 100644 --- a/docs/nodes/surface/raycast.rst +++ b/docs/nodes/surface/raycast.rst @@ -149,7 +149,7 @@ From Source (Conic): :target: https://user-images.githubusercontent.com/284644/87579479-69a31400-c6ef-11ea-9996-2675af3f6106.png * Curves-> :doc:`Rounded Rectangle ` -* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` +* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` * Curves-> :doc:`Evaluate Curve ` * Surfaces-> :doc:`Extrude Curve Along Vector ` * Surfaces-> :doc:`Evaluate Surface ` From 51fb03bf8ade8b5147b0a5afb1dff1b883737465 Mon Sep 17 00:00:00 2001 From: satabol Date: Mon, 21 Aug 2023 01:29:42 +0300 Subject: [PATCH 4/8] fix example --- json_examples/Architecture/Fasade_from_surfaces.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json_examples/Architecture/Fasade_from_surfaces.json b/json_examples/Architecture/Fasade_from_surfaces.json index c32a2d26e2..3864e4d7d3 100644 --- a/json_examples/Architecture/Fasade_from_surfaces.json +++ b/json_examples/Architecture/Fasade_from_surfaces.json @@ -1576,7 +1576,7 @@ "name": "F2" } }, - "bl_idname": "SvEllipseCurveNode" + "bl_idname": "SvEllipseCurveNodeMK2" }, "Viewer Draw Curve.002": { "attributes": { From 7b1ad51abd289846c61b284f651a3691c72684e4 Mon Sep 17 00:00:00 2001 From: satabol Date: Mon, 21 Aug 2023 01:34:59 +0300 Subject: [PATCH 5/8] fix docs --- docs/nodes/curve/{ellipse_curve.rst => ellipse_curve_mk2.rst} | 0 docs/nodes/surface/implicit_surface_raycast.rst | 2 +- docs/nodes/surface/raycast.rst | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/nodes/curve/{ellipse_curve.rst => ellipse_curve_mk2.rst} (100%) diff --git a/docs/nodes/curve/ellipse_curve.rst b/docs/nodes/curve/ellipse_curve_mk2.rst similarity index 100% rename from docs/nodes/curve/ellipse_curve.rst rename to docs/nodes/curve/ellipse_curve_mk2.rst diff --git a/docs/nodes/surface/implicit_surface_raycast.rst b/docs/nodes/surface/implicit_surface_raycast.rst index fcb103a087..65a12eefd8 100644 --- a/docs/nodes/surface/implicit_surface_raycast.rst +++ b/docs/nodes/surface/implicit_surface_raycast.rst @@ -74,7 +74,7 @@ Example of usage :target: https://user-images.githubusercontent.com/284644/87581701-d075fc80-c6f2-11ea-9eb6-ab02ba69ef2a.png * Generator-> :doc:`Box ` -* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` +* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` * Curves-> :doc:`Evaluate Curve ` * Surfaces-> :doc:`Marching Cubes ` * Modifiers->Modifier Make-> :doc:`UV Connection ` diff --git a/docs/nodes/surface/raycast.rst b/docs/nodes/surface/raycast.rst index 8d0b304572..823be67f7c 100644 --- a/docs/nodes/surface/raycast.rst +++ b/docs/nodes/surface/raycast.rst @@ -149,7 +149,7 @@ From Source (Conic): :target: https://user-images.githubusercontent.com/284644/87579479-69a31400-c6ef-11ea-9996-2675af3f6106.png * Curves-> :doc:`Rounded Rectangle ` -* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` +* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` * Curves-> :doc:`Evaluate Curve ` * Surfaces-> :doc:`Extrude Curve Along Vector ` * Surfaces-> :doc:`Evaluate Surface ` From 23b8093536f9be204d8d0eeb3c1cbd4c53a5fcb2 Mon Sep 17 00:00:00 2001 From: satabol Date: Mon, 21 Aug 2023 01:41:52 +0300 Subject: [PATCH 6/8] remove commented code --- nodes/curve/ellipse_curve_mk2.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/nodes/curve/ellipse_curve_mk2.py b/nodes/curve/ellipse_curve_mk2.py index ff02e21a69..5988ef52cd 100644 --- a/nodes/curve/ellipse_curve_mk2.py +++ b/nodes/curve/ellipse_curve_mk2.py @@ -29,27 +29,16 @@ class SvEllipseCurveNodeMK2(SverchCustomTreeNode, bpy.types.Node): def update_sockets(self, context): all_sockets_name = ["Minor Radius", "Eccentricity", "Focal Length", ] - #self.inputs["Minor Radius"].hide = True - #self.inputs["Eccentricity"].hide = True - #self.inputs["Focal Length"].hide = True list_links_remove = None if self.mode == "AB": list_links_remove = ["Eccentricity", "Focal Length",] - #self.inputs["Minor Radius"].hide = False - #socket2 = self.inputs[1] - #socket2.replace_socket("SvStringsSocket", "Minor Radius").prop_name = "minor_radius" elif self.mode == "AE": list_links_remove = ["Minor Radius", "Focal Length",] - #self.inputs["Eccentricity"].hide = False - #socket2 = self.inputs[1] - #socket2.replace_socket("SvStringsSocket", "Eccentricity").prop_name = "eccentricity" else: # AC list_links_remove = ["Minor Radius", "Eccentricity",] - #self.inputs["Focal Length"].hide = False - #socket2 = self.inputs[1] - #socket2.replace_socket("SvStringsSocket", "Focal Length").prop_name = "focal_length" + # remove existing link if sockets are switched: for socket_name in list_links_remove: all_sockets_name.remove(socket_name) for l in self.inputs[socket_name].links: @@ -139,8 +128,6 @@ def process(self): minor_radius = input2 elif self.mode == 'AE': e = input2 - # if e<0 or 1 Date: Wed, 23 Aug 2023 14:35:46 +0300 Subject: [PATCH 7/8] - simplify a logic for mode - performance for sv_get() --- nodes/curve/ellipse_curve_mk2.py | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/nodes/curve/ellipse_curve_mk2.py b/nodes/curve/ellipse_curve_mk2.py index 5988ef52cd..740023ec74 100644 --- a/nodes/curve/ellipse_curve_mk2.py +++ b/nodes/curve/ellipse_curve_mk2.py @@ -28,24 +28,10 @@ class SvEllipseCurveNodeMK2(SverchCustomTreeNode, bpy.types.Node): (SvEllipse.F2, "F2", "Ellipse focal point 2", 3)] def update_sockets(self, context): - all_sockets_name = ["Minor Radius", "Eccentricity", "Focal Length", ] - - list_links_remove = None - if self.mode == "AB": - list_links_remove = ["Eccentricity", "Focal Length",] - elif self.mode == "AE": - list_links_remove = ["Minor Radius", "Focal Length",] - else: # AC - list_links_remove = ["Minor Radius", "Eccentricity",] - - # remove existing link if sockets are switched: - for socket_name in list_links_remove: - all_sockets_name.remove(socket_name) - for l in self.inputs[socket_name].links: - self.id_data.links.remove(l) - self.inputs[socket_name].hide = True - self.inputs[ all_sockets_name[0] ].hide = False - + self.inputs['Minor Radius'].enabled = (self.mode == "AB") + self.inputs['Eccentricity'].enabled = (self.mode == "AE") + self.inputs['Focal Length'].enabled = (self.mode == "AC") + updateNode(self, context) mode: EnumProperty( @@ -102,13 +88,13 @@ def process(self): if not any(s.is_linked for s in outputs): return - major_radius_s = self.inputs['Major Radius'].sv_get() + major_radius_s = self.inputs['Major Radius'].sv_get(deepcopy=False) if self.mode == 'AB': - input2_s = self.inputs["Minor Radius"].sv_get() + input2_s = self.inputs["Minor Radius"].sv_get(deepcopy=False) elif self.mode == 'AE': - input2_s = self.inputs["Eccentricity"].sv_get() + input2_s = self.inputs["Eccentricity"].sv_get(deepcopy=False) else: - input2_s = self.inputs["Focal Length"].sv_get() + input2_s = self.inputs["Focal Length"].sv_get(deepcopy=False) matrices_s = self.inputs['Matrix'].sv_get(default = [[Matrix()]]) From 2d467e5bc6a3973a8ba0958e36d686ad749fa8bc Mon Sep 17 00:00:00 2001 From: satabol Date: Wed, 23 Aug 2023 14:47:51 +0300 Subject: [PATCH 8/8] rename back without mk2 --- docs/nodes/curve/{ellipse_curve_mk2.rst => ellipse_curve.rst} | 0 docs/nodes/surface/implicit_surface_raycast.rst | 2 +- docs/nodes/surface/raycast.rst | 2 +- nodes/curve/{ellipse_curve_mk2.py => ellipse_curve.py} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename docs/nodes/curve/{ellipse_curve_mk2.rst => ellipse_curve.rst} (100%) rename nodes/curve/{ellipse_curve_mk2.py => ellipse_curve.py} (100%) diff --git a/docs/nodes/curve/ellipse_curve_mk2.rst b/docs/nodes/curve/ellipse_curve.rst similarity index 100% rename from docs/nodes/curve/ellipse_curve_mk2.rst rename to docs/nodes/curve/ellipse_curve.rst diff --git a/docs/nodes/surface/implicit_surface_raycast.rst b/docs/nodes/surface/implicit_surface_raycast.rst index 65a12eefd8..fcb103a087 100644 --- a/docs/nodes/surface/implicit_surface_raycast.rst +++ b/docs/nodes/surface/implicit_surface_raycast.rst @@ -74,7 +74,7 @@ Example of usage :target: https://user-images.githubusercontent.com/284644/87581701-d075fc80-c6f2-11ea-9eb6-ab02ba69ef2a.png * Generator-> :doc:`Box ` -* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` +* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` * Curves-> :doc:`Evaluate Curve ` * Surfaces-> :doc:`Marching Cubes ` * Modifiers->Modifier Make-> :doc:`UV Connection ` diff --git a/docs/nodes/surface/raycast.rst b/docs/nodes/surface/raycast.rst index 823be67f7c..8d0b304572 100644 --- a/docs/nodes/surface/raycast.rst +++ b/docs/nodes/surface/raycast.rst @@ -149,7 +149,7 @@ From Source (Conic): :target: https://user-images.githubusercontent.com/284644/87579479-69a31400-c6ef-11ea-9996-2675af3f6106.png * Curves-> :doc:`Rounded Rectangle ` -* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` +* Curves->Curve Primitives-> :doc:`Ellipse (Curve) ` * Curves-> :doc:`Evaluate Curve ` * Surfaces-> :doc:`Extrude Curve Along Vector ` * Surfaces-> :doc:`Evaluate Surface ` diff --git a/nodes/curve/ellipse_curve_mk2.py b/nodes/curve/ellipse_curve.py similarity index 100% rename from nodes/curve/ellipse_curve_mk2.py rename to nodes/curve/ellipse_curve.py