From c10c130f76a387c1e9b1d0324946fd20e12fa593 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 27 Jan 2012 18:55:28 -0200 Subject: [PATCH] Improvement to Arch Walls + Arch Walls are now sketch-based by default + Arch Walls now auto-connect when snapping to an existing wall --- src/Mod/Arch/ArchWall.py | 51 ++++++++++++++++++++++++++++++++++------ src/Mod/Draft/Draft.py | 2 ++ 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/Mod/Arch/ArchWall.py b/src/Mod/Arch/ArchWall.py index 248006f1f..316ea0bba 100644 --- a/src/Mod/Arch/ArchWall.py +++ b/src/Mod/Arch/ArchWall.py @@ -49,6 +49,31 @@ def makeWall(baseobj=None,width=None,height=None,align="Center",name="Wall"): obj.ViewObject.ShapeColor = (r,g,b,1.0) return obj +def joinWalls(walls): + "joins the given list of walls into one sketch-based wall" + if not walls: + return None + if not isinstance(walls,list): + walls = [walls] + base = walls.pop() + if base.Base: + if base.Base.Shape.Faces: + return None + if Draft.getType(base.Base) == "Sketch": + sk = base.Base + else: + sk = Draft.makeSketch(base.Base,autoconstraints=True) + old = base.Base.name + base.Base = sk + FreeCAD.ActiveDocument.removeObject(old) + for w in walls: + if w.Base: + if not base.Base.Shape.Faces: + for e in base.Base.Shape.Edges: + sk.addGeometry(e) + FreeCAD.ActiveDocument.recompute() + return base + class _CommandWall: "the Arch Wall command definition" def GetResources(self): @@ -60,6 +85,7 @@ class _CommandWall: def Activated(self): sel = FreeCADGui.Selection.getSelection() done = False + self.existing = [] if sel: import Draft if Draft.getType(sel[0]) != "Wall": @@ -76,6 +102,13 @@ class _CommandWall: def getPoint(self,point): "this function is called by the snapper when it has a 3D point" + pos = FreeCADGui.ActiveDocument.ActiveView.getCursorPos() + exi = FreeCADGui.ActiveDocument.ActiveView.getObjectInfo(pos) + if exi: + exi = FreeCAD.ActiveDocument.getObject(exi['Object']) + if Draft.getType(exi) == "Wall": + if not exi in self.existing: + self.existing.append(exi) if point == None: self.tracker.finalize() return @@ -84,18 +117,22 @@ class _CommandWall: self.tracker.on() FreeCADGui.Snapper.getPoint(last=self.points[0],callback=self.getPoint,movecallback=self.update) elif len(self.points) == 2: - import Draft - l = Draft.makeWire(self.points) - makeWall(l) + import Part + l = Part.Line(self.points[0],self.points[1]) + if not self.existing: + s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject","WallTrace") + s.addGeometry(l) + makeWall(s) + else: + w = joinWalls(self.existing) + w.Base.addGeometry(l) self.tracker.finalize() + FreeCAD.ActiveDocument.recompute() def update(self,point): "this function is called by the Snapper when the mouse is moved" self.tracker.update([self.points[0],point]) - - - - + class _Wall(ArchComponent.Component): "The Wall object" def __init__(self,obj): diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index a4fbcf982..8e1621663 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -151,6 +151,8 @@ def getType(obj): if "Proxy" in obj.PropertiesList: if hasattr(obj.Proxy,"Type"): return obj.Proxy.Type + if obj.isDerivedFrom("Sketcher::SketchObject"): + return "Sketch" if obj.isDerivedFrom("Part::Feature"): return "Part" if (obj.Type == "App::Annotation"):