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 @@
+
+
+
+