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):
|
class LatticeWorkbench (Workbench):
|
||||||
MenuText = 'Lattice'
|
MenuText = 'Lattice'
|
||||||
def Initialize(self):
|
def Initialize(self):
|
||||||
import FuseCompound, CompoundFilter
|
commandslist=[]
|
||||||
commandslist = FuseCompound.exportedCommands + CompoundFilter.exportedCommands
|
|
||||||
|
import FuseCompound
|
||||||
|
commandslist = commandslist + FuseCompound.exportedCommands
|
||||||
|
import CompoundFilter
|
||||||
|
commandslist = commandslist + CompoundFilter.exportedCommands
|
||||||
|
import latticeBoundBox
|
||||||
|
commandslist = commandslist + latticeBoundBox.exportedCommands
|
||||||
|
|
||||||
self.appendToolbar('Lattice', commandslist)
|
self.appendToolbar('Lattice', commandslist)
|
||||||
self.treecmdList = ['importPart', 'updateImportedPartsCommand']
|
self.treecmdList = ['importPart', 'updateImportedPartsCommand']
|
||||||
#FreeCADGui.addIconPath( '' )
|
#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