Initial implementation of bounding box tool
This commit is contained in:
parent
38fcb5fc32
commit
164057a827
11
InitGui.py
11
InitGui.py
|
@ -1,8 +1,15 @@
|
|||
class LatticeWorkbench (Workbench):
|
||||
MenuText = 'Lattice'
|
||||
def Initialize(self):
|
||||
import FuseCompound, CompoundFilter
|
||||
commandslist = FuseCompound.exportedCommands + CompoundFilter.exportedCommands
|
||||
commandslist=[]
|
||||
|
||||
import FuseCompound
|
||||
commandslist = commandslist + FuseCompound.exportedCommands
|
||||
import CompoundFilter
|
||||
commandslist = commandslist + CompoundFilter.exportedCommands
|
||||
import latticeBoundBox
|
||||
commandslist = commandslist + latticeBoundBox.exportedCommands
|
||||
|
||||
self.appendToolbar('Lattice', commandslist)
|
||||
self.treecmdList = ['importPart', 'updateImportedPartsCommand']
|
||||
#FreeCADGui.addIconPath( '' )
|
||||
|
|
129
latticeBoundBox.py
Normal file
129
latticeBoundBox.py
Normal file
|
@ -0,0 +1,129 @@
|
|||
from latticeCommon import *
|
||||
|
||||
|
||||
__title__="BoundingBox module for FreeCAD"
|
||||
__author__ = "DeepSOIC"
|
||||
__url__ = ""
|
||||
|
||||
|
||||
|
||||
# -------------------------- common stuff --------------------------------------------------
|
||||
|
||||
def boundBox2RealBox(bb):
|
||||
return Part.makeBox(bb.XLength,bb.YLength,bb.ZLength,FreeCAD.Vector(bb.XMin, bb.YMin, bb.ZMin),FreeCAD.Vector(0,0,1))
|
||||
|
||||
def getPrecisionBoundBox(shape):
|
||||
# First, get imprecise bound box. Since the imprecise one
|
||||
# is typically smaller than the shape, we should enlarge
|
||||
# it to ensure it does not touch the shape.
|
||||
bb = shape.BoundBox
|
||||
bb.enlarge(2)
|
||||
|
||||
# Make a boundingbox shape and compute distances from faces
|
||||
# of this enlarged bounding box to the actual shape. Shrink
|
||||
# the boundbox by the distances.
|
||||
bbshape = boundBox2RealBox(bb)
|
||||
#FIXME: it may be a good idea to not use hard-coded face indexes
|
||||
bb.XMin = bb.XMin + shape.distToShape(bbshape.Faces[0])[0]
|
||||
bb.YMin = bb.YMin + shape.distToShape(bbshape.Faces[2])[0]
|
||||
bb.ZMin = bb.ZMin + shape.distToShape(bbshape.Faces[4])[0]
|
||||
bb.XMax = bb.XMax - shape.distToShape(bbshape.Faces[1])[0]
|
||||
bb.YMax = bb.YMax - shape.distToShape(bbshape.Faces[3])[0]
|
||||
bb.ZMax = bb.ZMax - shape.distToShape(bbshape.Faces[5])[0]
|
||||
return bb
|
||||
|
||||
|
||||
def makeBoundBox(name):
|
||||
'''makeBoundBox(name): makes a BoundBox object.'''
|
||||
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
|
||||
_BoundBox(obj)
|
||||
_ViewProviderBoundBox(obj.ViewObject)
|
||||
return obj
|
||||
|
||||
class _BoundBox:
|
||||
"The BoundBox object"
|
||||
def __init__(self,obj):
|
||||
self.Type = "BoundBox"
|
||||
obj.addProperty("App::PropertyLink","Base","BoundBox","Object to make boundingbox")
|
||||
obj.addProperty("App::PropertyBool","Precision","BoundBox","Use precise alorithm (slower).")
|
||||
obj.Precision = True
|
||||
obj.Proxy = self
|
||||
|
||||
|
||||
def execute(self,obj):
|
||||
rst = None
|
||||
obj.Shape = boundBox2RealBox(getPrecisionBoundBox(obj.Base.Shape))
|
||||
return
|
||||
|
||||
|
||||
class _ViewProviderBoundBox:
|
||||
"A View Provider for the BoundBox object"
|
||||
|
||||
def __init__(self,vobj):
|
||||
vobj.Proxy = self
|
||||
vobj.DisplayMode = "Wireframe"
|
||||
|
||||
def getIcon(self):
|
||||
return getIconPath("Lattice_BoundBox.svg")
|
||||
|
||||
def attach(self, vobj):
|
||||
self.ViewObject = vobj
|
||||
self.Object = vobj.Object
|
||||
|
||||
|
||||
def setEdit(self,vobj,mode):
|
||||
return False
|
||||
|
||||
def unsetEdit(self,vobj,mode):
|
||||
return
|
||||
|
||||
def __getstate__(self):
|
||||
return None
|
||||
|
||||
def __setstate__(self,state):
|
||||
return None
|
||||
|
||||
def CreateBoundBox(name):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create BoundBox")
|
||||
FreeCADGui.addModule("latticeBoundBox")
|
||||
FreeCADGui.doCommand("f = latticeBoundBox.makeBoundBox(name='"+name+"')")
|
||||
FreeCADGui.doCommand("f.Base = FreeCADGui.Selection.getSelection()[0]")
|
||||
FreeCADGui.doCommand("f.Proxy.execute(f)")
|
||||
FreeCADGui.doCommand("f.purgeTouched()")
|
||||
FreeCADGui.doCommand("f = None")
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
|
||||
|
||||
# -------------------------- /common stuff --------------------------------------------------
|
||||
|
||||
# -------------------------- Gui command --------------------------------------------------
|
||||
|
||||
class _CommandBoundBox:
|
||||
"Command to create BoundBox feature"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : getIconPath("Lattice_BoundBox.svg"),
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Lattice_BoundBox","Parametric bounding box"),
|
||||
'Accel': "",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Lattice_BoundBox","Make a box that precisely fits the object")}
|
||||
|
||||
def Activated(self):
|
||||
if len(FreeCADGui.Selection.getSelection()) == 1 :
|
||||
CreateBoundBox(name = "BoundBox")
|
||||
else:
|
||||
mb = QtGui.QMessageBox()
|
||||
mb.setIcon(mb.Icon.Warning)
|
||||
mb.setText(_translate("Lattice_BoundBox", "Select a shape to make a bounding box for, first!", None))
|
||||
mb.setWindowTitle(_translate("Lattice_BoundBox","Bad selection", None))
|
||||
mb.exec_()
|
||||
|
||||
def IsActive(self):
|
||||
if FreeCAD.ActiveDocument:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
FreeCADGui.addCommand('Lattice_BoundBox', _CommandBoundBox())
|
||||
|
||||
exportedCommands = ['Lattice_BoundBox']
|
||||
|
||||
# -------------------------- /Gui command --------------------------------------------------
|
Loading…
Reference in New Issue
Block a user