Added additional TaskBox to Arch Wall tool
Additional parameters such as height and width can now be set during wall drawing
This commit is contained in:
@@ -32,7 +32,8 @@ __url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
def makeWall(baseobj=None,width=None,height=None,align="Center",name="Wall"):
|
||||
'''makeWall(obj,[width],[height],[align],[name]): creates a wall based on the
|
||||
given object'''
|
||||
given object, which can be a sketch, a draft object, a face or a solid. align
|
||||
can be "Center","Left" or "Right"'''
|
||||
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
|
||||
_Wall(obj)
|
||||
_ViewProviderWall(obj.ViewObject)
|
||||
@@ -55,6 +56,8 @@ def joinWalls(walls):
|
||||
return None
|
||||
if not isinstance(walls,list):
|
||||
walls = [walls]
|
||||
if not areSameWallTypes(walls):
|
||||
return None
|
||||
base = walls.pop()
|
||||
if base.Base:
|
||||
if base.Base.Shape.Faces:
|
||||
@@ -63,9 +66,8 @@ def joinWalls(walls):
|
||||
sk = base.Base
|
||||
else:
|
||||
sk = Draft.makeSketch(base.Base,autoconstraints=True)
|
||||
old = base.Base.name
|
||||
base.Base = sk
|
||||
FreeCAD.ActiveDocument.removeObject(old)
|
||||
if sk:
|
||||
base.Base = sk
|
||||
for w in walls:
|
||||
if w.Base:
|
||||
if not base.Base.Shape.Faces:
|
||||
@@ -74,6 +76,24 @@ def joinWalls(walls):
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
return base
|
||||
|
||||
def areSameWallTypes(walls):
|
||||
"returns True is all the walls in the given list have same height, width, and alignment"
|
||||
for att in ["Width","Height","Align"]:
|
||||
value = None
|
||||
for w in walls:
|
||||
if not hasattr(w,att):
|
||||
return False
|
||||
if not value:
|
||||
value = getattr(w,att)
|
||||
else:
|
||||
if type(value) == float:
|
||||
if round(value,Draft.precision()) != round(getattr(w,att),Draft.precision()):
|
||||
return False
|
||||
else:
|
||||
if value != getattr(w,att):
|
||||
return False
|
||||
return True
|
||||
|
||||
class _CommandWall:
|
||||
"the Arch Wall command definition"
|
||||
def GetResources(self):
|
||||
@@ -83,6 +103,14 @@ class _CommandWall:
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Wall","Creates a wall object from scratch or from a selected object (wire, face or solid)")}
|
||||
|
||||
def Activated(self):
|
||||
|
||||
global QtGui, QtCore
|
||||
from PyQt4 import QtGui, QtCore
|
||||
|
||||
self.Width = 0.1
|
||||
self.Height = 1
|
||||
self.Align = "Center"
|
||||
|
||||
sel = FreeCADGui.Selection.getSelection()
|
||||
done = False
|
||||
self.existing = []
|
||||
@@ -98,7 +126,7 @@ class _CommandWall:
|
||||
import DraftTrackers
|
||||
self.points = []
|
||||
self.tracker = DraftTrackers.boxTracker()
|
||||
FreeCADGui.Snapper.getPoint(callback=self.getPoint)
|
||||
FreeCADGui.Snapper.getPoint(callback=self.getPoint,extradlg=self.taskbox())
|
||||
|
||||
def getPoint(self,point=None,obj=None):
|
||||
"this function is called by the snapper when it has a 3D point"
|
||||
@@ -112,26 +140,92 @@ class _CommandWall:
|
||||
self.points.append(point)
|
||||
if len(self.points) == 1:
|
||||
self.tracker.on()
|
||||
FreeCADGui.Snapper.getPoint(last=self.points[0],callback=self.getPoint,movecallback=self.update)
|
||||
FreeCADGui.Snapper.getPoint(last=self.points[0],callback=self.getPoint,movecallback=self.update,extradlg=self.taskbox())
|
||||
elif len(self.points) == 2:
|
||||
import Part
|
||||
l = Part.Line(self.points[0],self.points[1])
|
||||
self.tracker.finalize()
|
||||
FreeCAD.ActiveDocument.openTransaction("Wall")
|
||||
if not self.existing:
|
||||
s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject","WallTrace")
|
||||
s.addGeometry(l)
|
||||
makeWall(s)
|
||||
self.addDefault(l)
|
||||
else:
|
||||
w = joinWalls(self.existing)
|
||||
w.Base.addGeometry(l)
|
||||
if w:
|
||||
if areSameWallTypes([w,self]):
|
||||
w.Base.addGeometry(l)
|
||||
else:
|
||||
self.addDefault(l)
|
||||
else:
|
||||
self.addDefault(l)
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
|
||||
def addDefault(self,l):
|
||||
s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject","WallTrace")
|
||||
s.addGeometry(l)
|
||||
makeWall(s,width=self.Width,height=self.Height,align=self.Align)
|
||||
|
||||
def update(self,point):
|
||||
"this function is called by the Snapper when the mouse is moved"
|
||||
self.tracker.update([self.points[0],point])
|
||||
|
||||
b = self.points[0]
|
||||
n = FreeCAD.DraftWorkingPlane.axis
|
||||
bv = point.sub(b)
|
||||
dv = bv.cross(n)
|
||||
dv = fcvec.scaleTo(dv,self.Width/2)
|
||||
if self.Align == "Center":
|
||||
self.tracker.update([b,point])
|
||||
elif self.Align == "Left":
|
||||
self.tracker.update([b.add(dv),point.add(dv)])
|
||||
else:
|
||||
dv = fcvec.neg(dv)
|
||||
self.tracker.update([b.add(dv),point.add(dv)])
|
||||
|
||||
def taskbox(self):
|
||||
"sets up a taskbox widget"
|
||||
w = QtGui.QWidget()
|
||||
w.setWindowTitle("Wall options")
|
||||
lay0 = QtGui.QVBoxLayout(w)
|
||||
lay1 = QtGui.QHBoxLayout()
|
||||
lay0.addLayout(lay1)
|
||||
label1 = QtGui.QLabel("Width")
|
||||
lay1.addWidget(label1)
|
||||
value1 = QtGui.QDoubleSpinBox()
|
||||
value1.setDecimals(2)
|
||||
value1.setValue(self.Width)
|
||||
lay1.addWidget(value1)
|
||||
lay2 = QtGui.QHBoxLayout()
|
||||
lay0.addLayout(lay2)
|
||||
label2 = QtGui.QLabel("Height")
|
||||
lay2.addWidget(label2)
|
||||
value2 = QtGui.QDoubleSpinBox()
|
||||
value2.setDecimals(2)
|
||||
value2.setValue(self.Height)
|
||||
lay2.addWidget(value2)
|
||||
lay3 = QtGui.QHBoxLayout()
|
||||
lay0.addLayout(lay3)
|
||||
label3 = QtGui.QLabel("Alignment")
|
||||
lay3.addWidget(label3)
|
||||
value3 = QtGui.QComboBox()
|
||||
items = ["Center","Left","Right"]
|
||||
value3.addItems(items)
|
||||
value3.setCurrentIndex(items.index(self.Align))
|
||||
lay3.addWidget(value3)
|
||||
QtCore.QObject.connect(value1,QtCore.SIGNAL("valueChanged(double)"),self.setWidth)
|
||||
QtCore.QObject.connect(value2,QtCore.SIGNAL("valueChanged(double)"),self.setHeight)
|
||||
QtCore.QObject.connect(value3,QtCore.SIGNAL("currentIndexChanged(int)"),self.setAlign)
|
||||
return w
|
||||
|
||||
def setWidth(self,d):
|
||||
self.Width = d
|
||||
self.tracker.width(d)
|
||||
|
||||
def setHeight(self,d):
|
||||
self.Height = d
|
||||
self.tracker.height(d)
|
||||
|
||||
def setAlign(self,i):
|
||||
self.Align = ["Center","Left","Right"][i]
|
||||
|
||||
class _Wall(ArchComponent.Component):
|
||||
"The Wall object"
|
||||
def __init__(self,obj):
|
||||
@@ -258,10 +352,5 @@ class _ViewProviderWall(ArchComponent.ViewProviderComponent):
|
||||
|
||||
def getIcon(self):
|
||||
return ":/icons/Arch_Wall_Tree.svg"
|
||||
|
||||
class TaskArchWall:
|
||||
def __init__(self):
|
||||
from PyQt4 import QtGui
|
||||
self.form = QtGui.QWidget()
|
||||
|
||||
FreeCADGui.addCommand('Arch_Wall',_CommandWall())
|
||||
|
||||
Reference in New Issue
Block a user