From d6530a06286aed1eba2add7296933136a45237fe Mon Sep 17 00:00:00 2001 From: mwganson Date: Tue, 4 Aug 2020 14:04:06 -0500 Subject: [PATCH] [OpenSCAD] Add 2 new commands: Scale and Resize, fix bug in Mirror mesh feature --- src/Mod/OpenSCAD/InitGui.py | 3 +- src/Mod/OpenSCAD/OpenSCADCommands.py | 75 +++++++++++-- src/Mod/OpenSCAD/OpenSCADUtils.py | 21 +++- src/Mod/OpenSCAD/Resources/OpenSCAD.qrc | 1 + .../icons/OpenSCAD_ScaleMeshFeature.svg | 106 ++++++++++++++++++ 5 files changed, 195 insertions(+), 11 deletions(-) create mode 100644 src/Mod/OpenSCAD/Resources/icons/OpenSCAD_ScaleMeshFeature.svg diff --git a/src/Mod/OpenSCAD/InitGui.py b/src/Mod/OpenSCAD/InitGui.py index 1323ddf4e4..0883071d19 100644 --- a/src/Mod/OpenSCAD/InitGui.py +++ b/src/Mod/OpenSCAD/InitGui.py @@ -49,7 +49,8 @@ class OpenSCADWorkbench ( Workbench ): return text import OpenSCAD_rc,OpenSCADCommands commands = ['OpenSCAD_ReplaceObject','OpenSCAD_RemoveSubtree', - 'OpenSCAD_RefineShapeFeature','OpenSCAD_MirrorMeshFeature','OpenSCAD_IncreaseToleranceFeature', + 'OpenSCAD_RefineShapeFeature','OpenSCAD_MirrorMeshFeature', + 'OpenSCAD_ScaleMeshFeature','OpenSCAD_ResizeMeshFeature','OpenSCAD_IncreaseToleranceFeature', 'OpenSCAD_Edgestofaces', 'OpenSCAD_ExpandPlacements','OpenSCAD_ExplodeGroup'] toolbarcommands = ['OpenSCAD_ReplaceObject','OpenSCAD_RemoveSubtree', 'OpenSCAD_ExplodeGroup','OpenSCAD_RefineShapeFeature', diff --git a/src/Mod/OpenSCAD/OpenSCADCommands.py b/src/Mod/OpenSCAD/OpenSCADCommands.py index 1b858e39d5..39f711de88 100644 --- a/src/Mod/OpenSCAD/OpenSCADCommands.py +++ b/src/Mod/OpenSCAD/OpenSCADCommands.py @@ -30,6 +30,7 @@ This Script includes the GUI Commands of the OpenSCAD module import FreeCAD,FreeCADGui from PySide import QtCore, QtGui +import OpenSCADUtils try: _encoding = QtGui.QApplication.UnicodeUTF8 @@ -162,19 +163,18 @@ class MirrorMeshFeature: return FreeCADGui.Selection.countObjectsOfType('Mesh::Feature') > 0 def Activated(self): - import Part,OpenSCADFeatures,OpenSCADUtils selection=FreeCADGui.Selection.getSelectionEx() for selobj in selection: newobj=selobj.Document.addObject("Mesh::Feature",'mirror') newobj.Label='mirror_%s' % selobj.Object.Label msh=selobj.Object.Mesh - items=["[1,0,0]","[0,1,0]","[0,0,1]","[1,1,0]","[0,1,1]","[1,0,1]","[1,1,1]"] - item, ok = QtGui.QInputDialog.getItem(QtGui.QApplication.activeWindow(),u'Mirror about which Axis?',u'Select Axis (or enter custom value)?',items,editable=True) + items=["[1;0;0]","[0;1;0]","[0;0;1]","[1;1;0]","[0;1;1]","[1;0;1]","[1;1;1]"] + item, ok = QtGui.QInputDialog.getItem(QtGui.QApplication.activeWindow(),'Mirror about which Axis?','Select Axis (or enter custom value):',items,editable=True) if ok: - splits = list(item) - x = float(splits[1]) - y = float(splits[3]) - z = float(splits[5]) + splits = list(item.replace('[','').replace(']','').split(';')) + x = float(splits[0]) + y = float(splits[1]) + z = float(splits[2]) vec = FreeCAD.Base.Vector(x,y,z) newmesh=OpenSCADUtils.mirrormesh(msh, vec) newobj.Mesh=newmesh @@ -188,6 +188,65 @@ class MirrorMeshFeature: 'MenuText': QtCore.QT_TRANSLATE_NOOP('OpenSCAD_MirrorMeshFeature', 'Mirror Mesh Feature...'), 'ToolTip' : QtCore.QT_TRANSLATE_NOOP('OpenSCAD_MirrorMeshFeature', 'Create Mirror Mesh Feature')} +class ScaleMeshFeature: + def IsActive(self): + return FreeCADGui.Selection.countObjectsOfType('Mesh::Feature') > 0 + + def Activated(self): + selection=FreeCADGui.Selection.getSelectionEx() + for selobj in selection: + newobj=selobj.Document.addObject("Mesh::Feature",'scale') + newobj.Label='scale_%s' % selobj.Object.Label + msh=selobj.Object.Mesh + items=["[1;1;1]"] + item, ok = QtGui.QInputDialog.getItem(QtGui.QApplication.activeWindow(),'Scale about which Axis?','Enter scaling value:',items,editable=True) + if ok: + splits = list(item.replace('[','').replace(']','').split(';')) + x = float(splits[0]) + y = float(splits[1]) + z = float(splits[2]) + vec = FreeCAD.Base.Vector(x,y,z) + newmesh=OpenSCADUtils.scalemesh(msh, vec) + newobj.Mesh=newmesh + selobj.Object.ViewObject.hide() + else: + selobj.Document.removeObject(newobj.Name) + FreeCAD.ActiveDocument.recompute() + def GetResources(self): + return {'Pixmap' : 'OpenSCAD_ScaleMeshFeature', + 'MenuText': QtCore.QT_TRANSLATE_NOOP('OpenSCAD_ScaleMeshFeature', 'Scale Mesh Feature...'), + 'ToolTip' : QtCore.QT_TRANSLATE_NOOP('OpenSCAD_ScaleMeshFeature', 'Create Scale Mesh Feature')} + + +class ResizeMeshFeature: + def IsActive(self): + return FreeCADGui.Selection.countObjectsOfType('Mesh::Feature') > 0 + + def Activated(self): + selection=FreeCADGui.Selection.getSelectionEx() + for selobj in selection: + newobj=selobj.Document.addObject("Mesh::Feature",'resize') + newobj.Label='resize_%s' % selobj.Object.Label + msh=selobj.Object.Mesh + items=["[1;1;1]"] + item, ok = QtGui.QInputDialog.getItem(QtGui.QApplication.activeWindow(),'Resize about which Axis?','Enter resizing value:',items,editable=True) + if ok: + splits = list(item.replace('[','').replace(']','').split(';')) + x = float(splits[0]) + y = float(splits[1]) + z = float(splits[2]) + vec = FreeCAD.Base.Vector(x,y,z) + newmesh=OpenSCADUtils.resizemesh(msh, vec) + newobj.Mesh=newmesh + selobj.Object.ViewObject.hide() + else: + selobj.Document.removeObject(newobj.Name) + FreeCAD.ActiveDocument.recompute() + def GetResources(self): + return {#'Pixmap' : 'OpenSCAD_ResizeMeshFeature', + 'MenuText': QtCore.QT_TRANSLATE_NOOP('OpenSCAD_ResizeMeshFeature', 'Resize Mesh Feature...'), + 'ToolTip' : QtCore.QT_TRANSLATE_NOOP('OpenSCAD_ResizeMeshFeature', 'Create Resize Mesh Feature')} + class IncreaseToleranceFeature: def IsActive(self): @@ -455,6 +514,8 @@ FreeCADGui.addCommand('OpenSCAD_ExplodeGroup',ExplodeGroup()) FreeCADGui.addCommand('OpenSCAD_Edgestofaces',Edgestofaces()) FreeCADGui.addCommand('OpenSCAD_RefineShapeFeature',RefineShapeFeature()) FreeCADGui.addCommand('OpenSCAD_MirrorMeshFeature',MirrorMeshFeature()) +FreeCADGui.addCommand('OpenSCAD_ScaleMeshFeature',ScaleMeshFeature()) +FreeCADGui.addCommand('OpenSCAD_ResizeMeshFeature',ResizeMeshFeature()) FreeCADGui.addCommand('OpenSCAD_IncreaseToleranceFeature',IncreaseToleranceFeature()) FreeCADGui.addCommand('OpenSCAD_ExpandPlacements',ExpandPlacements()) FreeCADGui.addCommand('OpenSCAD_ReplaceObject',ReplaceObject()) diff --git a/src/Mod/OpenSCAD/OpenSCADUtils.py b/src/Mod/OpenSCAD/OpenSCADUtils.py index f881c7efd3..644df882f4 100644 --- a/src/Mod/OpenSCAD/OpenSCADUtils.py +++ b/src/Mod/OpenSCAD/OpenSCADUtils.py @@ -28,7 +28,7 @@ __url__ = ["https://www.freecadweb.org"] This Script includes various python helper functions that are shared across the module ''' - +from exportCSG import mesh2polyhedron try: from PySide import QtGui _encoding = QtGui.QApplication.UnicodeUTF8 @@ -300,8 +300,6 @@ def vec2householder(nv): def mirrormesh(msh,vec): """mirrormesh(mesh,vector) where mesh is a mesh object and vector is a Base.Vector""" - from exportCSG import mesh2polyhedron - from PySide import QtGui poly = mesh2polyhedron(msh) vec_string = '['+str(vec.x)+','+str(vec.y)+','+str(vec.z)+']' param = 'mirror('+vec_string+')' @@ -309,6 +307,23 @@ def mirrormesh(msh,vec): mi.flipNormals() return mi +def scalemesh(msh,vec): + """scalemesh(mesh,vector) where mesh is a mesh object and vector is a Base.Vector""" + poly = mesh2polyhedron(msh) + vec_string = '['+str(vec.x)+','+str(vec.y)+','+str(vec.z)+']' + param = 'scale('+vec_string+')' + mi = callopenscadmeshstring('%s{%s}' % (param,''.join(poly))) + mi.flipNormals() + return mi + +def resizemesh(msh,vec): + """resizemesh(mesh,vector) where mesh is a mesh object and vector is a Base.Vector""" + poly = mesh2polyhedron(msh) + vec_string = '['+str(vec.x)+','+str(vec.y)+','+str(vec.z)+']' + param = 'resize('+vec_string+')' + mi = callopenscadmeshstring('%s{%s}' % (param,''.join(poly))) + mi.flipNormals() + return mi def angneg(d): return d if (d <= 180.0) else (d-360) diff --git a/src/Mod/OpenSCAD/Resources/OpenSCAD.qrc b/src/Mod/OpenSCAD/Resources/OpenSCAD.qrc index b8a7c7fe84..6e31ef9fcb 100644 --- a/src/Mod/OpenSCAD/Resources/OpenSCAD.qrc +++ b/src/Mod/OpenSCAD/Resources/OpenSCAD.qrc @@ -5,6 +5,7 @@ icons/OpenSCAD_ColorCodeShape.svg icons/OpenSCAD_RefineShapeFeature.svg icons/OpenSCAD_MirrorMeshFeature.svg + icons/OpenSCAD_ScaleMeshFeature.svg icons/OpenSCAD_IncreaseToleranceFeature.svg icons/OpenSCAD_ReplaceObject.svg icons/OpenSCAD_RemoveSubtree.svg diff --git a/src/Mod/OpenSCAD/Resources/icons/OpenSCAD_ScaleMeshFeature.svg b/src/Mod/OpenSCAD/Resources/icons/OpenSCAD_ScaleMeshFeature.svg new file mode 100644 index 0000000000..7f2f535826 --- /dev/null +++ b/src/Mod/OpenSCAD/Resources/icons/OpenSCAD_ScaleMeshFeature.svg @@ -0,0 +1,106 @@ + + + + + + + + + + image/svg+xml + + + + + + + + +