[OpenSCAD] Add 2 new commands: Scale and Resize, fix bug in Mirror mesh feature
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
<file>icons/OpenSCAD_ColorCodeShape.svg</file>
|
||||
<file>icons/OpenSCAD_RefineShapeFeature.svg</file>
|
||||
<file>icons/OpenSCAD_MirrorMeshFeature.svg</file>
|
||||
<file>icons/OpenSCAD_ScaleMeshFeature.svg</file>
|
||||
<file>icons/OpenSCAD_IncreaseToleranceFeature.svg</file>
|
||||
<file>icons/OpenSCAD_ReplaceObject.svg</file>
|
||||
<file>icons/OpenSCAD_RemoveSubtree.svg</file>
|
||||
|
||||
106
src/Mod/OpenSCAD/Resources/icons/OpenSCAD_ScaleMeshFeature.svg
Normal file
106
src/Mod/OpenSCAD/Resources/icons/OpenSCAD_ScaleMeshFeature.svg
Normal file
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="13.546667mm"
|
||||
height="13.546667mm"
|
||||
viewBox="0 0 13.546667 13.546667"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="OpenSCAD_ScaleMesh.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="9.9518731"
|
||||
inkscape:cy="-16.322498"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1001"
|
||||
inkscape:window-x="1791"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-42.363567,-31.690952)">
|
||||
<image
|
||||
y="31.690952"
|
||||
x="42.363567"
|
||||
id="image823"
|
||||
xlink:href="data:image/png;base64,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
|
||||
7FGz5guiMQAAAABJRU5ErkJggg==
|
||||
"
|
||||
style="image-rendering:optimizeQuality"
|
||||
preserveAspectRatio="none"
|
||||
height="13.546667"
|
||||
width="13.546667" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
Reference in New Issue
Block a user