From 1efd9a4b4f1bdac2752c0a3543892486c668e4cc Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Thu, 15 Sep 2016 12:38:48 -0300 Subject: [PATCH] Arch: Added new Footprint display mode to walls --- src/Mod/Arch/ArchWall.py | 57 +++++++++++++++++ src/Mod/Arch/Resources/ui/preferences-arch.ui | 64 ++++++++++++++++++- 2 files changed, 120 insertions(+), 1 deletion(-) diff --git a/src/Mod/Arch/ArchWall.py b/src/Mod/Arch/ArchWall.py index 3e51b1c95052..2a3d1d439839 100644 --- a/src/Mod/Arch/ArchWall.py +++ b/src/Mod/Arch/ArchWall.py @@ -505,6 +505,15 @@ def execute(self,obj): def onChanged(self,obj,prop): self.hideSubobjects(obj,prop) ArchComponent.Component.onChanged(self,obj,prop) + + def getFootprint(self,obj): + faces = [] + if obj.Shape: + for f in obj.Shape.Faces: + if f.normalAt(0,0).getAngle(FreeCAD.Vector(0,0,-1)) < 0.01: + if abs(abs(f.CenterOfMass.z) - abs(obj.Shape.BoundBox.ZMin)) < 0.001: + faces.append(f) + return faces class _ViewProviderWall(ArchComponent.ViewProviderComponent): @@ -524,8 +533,56 @@ def getIcon(self): def attach(self,vobj): self.Object = vobj.Object + from pivy import coin + tex = coin.SoTexture2() + tex.image = Draft.loadTexture(Draft.svgpatterns()['simple'][1], 128) + texcoords = coin.SoTextureCoordinatePlane() + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetFloat("PatternScale",0.01) + texcoords.directionS.setValue(s,0,0) + texcoords.directionT.setValue(0,s,0) + self.fcoords = coin.SoCoordinate3() + self.fset = coin.SoIndexedFaceSet() + sep = coin.SoSeparator() + sep.addChild(tex) + sep.addChild(texcoords) + sep.addChild(self.fcoords) + sep.addChild(self.fset) + vobj.RootNode.addChild(sep) return + def updateData(self,obj,prop): + if prop in ["Placement","Shape"]: + if obj.ViewObject.DisplayMode == "Footprint": + obj.ViewObject.Proxy.setDisplayMode("Footprint") + + def getDisplayModes(self,vobj): + modes=["Footprint"] + return modes + + def setDisplayMode(self,mode): + if mode == "Footprint": + if hasattr(self,"Object"): + faces = self.Object.Proxy.getFootprint(self.Object) + if faces: + verts = [] + fdata = [] + idx = 0 + for face in faces: + tri = face.tessellate(1) + for v in tri[0]: + verts.append([v.x,v.y,v.z]) + for f in tri[1]: + fdata.extend([f[0]+idx,f[1]+idx,f[2]+idx,-1]) + idx += len(tri[0]) + self.fcoords.point.setValues(verts) + self.fset.coordIndex.setValues(0,len(fdata),fdata) + return "Wireframe" + else: + self.fset.coordIndex.deleteValues(0) + self.fcoords.point.deleteValues(0) + return mode + + if FreeCAD.GuiUp: FreeCADGui.addCommand('Arch_Wall',_CommandWall()) FreeCADGui.addCommand('Arch_MergeWalls',_CommandMergeWalls()) diff --git a/src/Mod/Arch/Resources/ui/preferences-arch.ui b/src/Mod/Arch/Resources/ui/preferences-arch.ui index b171a4109d61..263a43a3e923 100644 --- a/src/Mod/Arch/Resources/ui/preferences-arch.ui +++ b/src/Mod/Arch/Resources/ui/preferences-arch.ui @@ -7,7 +7,7 @@ 0 0 396 - 638 + 694 @@ -425,6 +425,68 @@ + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Pattern scale + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Scaling factor for patterns used by object that have a Footprint display mode + + + 4 + + + 9999.989999999999782 + + + 0.010000000000000 + + + patternScale + + + Mod/Arch + + + + +