diff --git a/src/Mod/Arch/ArchProfile.py b/src/Mod/Arch/ArchProfile.py index 7bf2ff24ba..8168854b5a 100644 --- a/src/Mod/Arch/ArchProfile.py +++ b/src/Mod/Arch/ArchProfile.py @@ -106,14 +106,138 @@ def makeProfile(profile=[0,'REC','REC100x100','R',100,100]): return obj +class Arch_Profile: + + """The FreeCAD Arch_Profile command definition""" + + def GetResources(self): + + return {'Pixmap' : 'Arch_Profile', + 'MenuText': QT_TRANSLATE_NOOP("Arch_Profile","Profile"), + 'Accel': "P, F", + 'ToolTip': QT_TRANSLATE_NOOP("Arch_Profile","Creates a profile object")} + + def IsActive(self): + + return not FreeCAD.ActiveDocument is None + + def Activated(self): + + self.Profile = None + self.Categories = [] + self.Presets = readPresets() + for pre in self.Presets: + if pre[1] not in self.Categories: + self.Categories.append(pre[1]) + FreeCADGui.Snapper.getPoint(callback=self.getPoint,extradlg=[self.taskbox()],title=translate("Arch","Create profile")) + + def taskbox(self): + + "sets up a taskbox widget" + + w = QtGui.QWidget() + ui = FreeCADGui.UiLoader() + w.setWindowTitle(translate("Arch","Profile settings")) + grid = QtGui.QGridLayout(w) + + # categories box + labelc = QtGui.QLabel(translate("Arch","Category")) + self.vCategory = QtGui.QComboBox() + self.vCategory.addItems([" "] + self.Categories) + grid.addWidget(labelc,1,0,1,1) + grid.addWidget(self.vCategory,1,1,1,1) + + # presets box + labelp = QtGui.QLabel(translate("Arch","Preset")) + self.vPresets = QtGui.QComboBox() + self.pSelect = [None] + fpresets = [" "] + self.vPresets.addItems(fpresets) + grid.addWidget(labelp,2,0,1,1) + grid.addWidget(self.vPresets,2,1,1,1) + + # connect slots + self.vCategory.currentIndexChanged.connect(self.setCategory) + self.vPresets.currentIndexChanged.connect(self.setPreset) + + # restore preset + stored = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetString("StructurePreset","") + if stored: + if ";" in stored: + stored = stored.split(";") + if len(stored) >= 3: + if stored[1] in self.Categories: + self.vCategory.setCurrentIndex(1+self.Categories.index(stored[1])) + self.setCategory(1+self.Categories.index(stored[1])) + ps = [p[2] for p in self.pSelect] + if stored[2] in ps: + self.vPresets.setCurrentIndex(ps.index(stored[2])) + return w + + def getPoint(self,point=None,obj=None): + + "this function is called by the snapper when it has a 3D point" + + if not point: + return + if not self.Profile: + return + pt = "FreeCAD.Vector("+str(point.x)+","+str(point.y)+","+str(point.z)+")" + FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Profile")) + FreeCADGui.addModule("Arch") + FreeCADGui.doCommand('p = Arch.makeProfile('+str(self.Profile)+')') + FreeCADGui.doCommand('p.Placement.move('+pt+')') + FreeCADGui.addModule("Draft") + FreeCADGui.doCommand("Draft.autogroup(p)") + FreeCAD.ActiveDocument.commitTransaction() + FreeCAD.ActiveDocument.recompute() + + def setCategory(self,i): + + self.vPresets.clear() + if i == 0: + self.pSelect = [None] + self.vPresets.addItems([" "]) + FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").SetString("StructurePreset","") + else: + self.pSelect = [p for p in self.Presets if p[1] == self.Categories[i-1]] + fpresets = [] + for p in self.pSelect: + f = FreeCAD.Units.Quantity(p[4],FreeCAD.Units.Length).getUserPreferred() + d = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Units").GetInt("Decimals",2) + s1 = str(round(p[4]/f[1],d)) + s2 = str(round(p[5]/f[1],d)) + s3 = str(f[2]) + fpresets.append(p[2]+" ("+s1+"x"+s2+s3+")") + self.vPresets.addItems(fpresets) + self.setPreset(0) + + def setPreset(self,i): + + self.Profile = None + elt = self.pSelect[i] + if elt: + p=elt[0]-1 # Presets indexes are 1-based + self.Profile = self.Presets[p] + FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").SetString("StructurePreset",";".join([str(i) for i in self.Profile])) + + class _Profile(Draft._DraftObject): '''Superclass for Profile classes''' def __init__(self,obj, profile): - self.Profile=profile + self.Profile = profile Draft._DraftObject.__init__(self,obj,"Profile") + def __getstate__(self): + if hasattr(self,"Profile"): + return self.Profile + + def __setstate__(self,state): + if isinstance(state,list): + self.Profile = state + class _ProfileC(_Profile): @@ -288,7 +412,9 @@ class ProfileTaskPanel: def __init__(self,obj): self.obj = obj - self.profile = None + self.Profile = None + if hasattr(obj.Proxy,"Profile"): + self.Profile = obj.Proxy.Profile if isinstance(self.obj.Proxy,_ProfileC): self.type = "C" elif isinstance(self.obj.Proxy,_ProfileH): @@ -310,8 +436,8 @@ class ProfileTaskPanel: QtCore.QObject.connect(self.comboCategory, QtCore.SIGNAL("currentIndexChanged(QString)"), self.changeCategory) QtCore.QObject.connect(self.comboProfile, QtCore.SIGNAL("currentIndexChanged(int)"), self.changeProfile) # Read preset profiles and add relevant ones - self.categories=[] - self.presets=readPresets() + self.categories = [] + self.presets = readPresets() for pre in self.presets: if pre[3] == self.type: if pre[1] not in self.categories: @@ -320,20 +446,23 @@ class ProfileTaskPanel: if self.categories: self.comboCategory.addItems(self.categories) # Find current profile by label - for pre in self.presets: - if self.obj.Label in pre[2]: - self.profile = pre - break - if not self.profile: + if not self.Profile: + for pre in self.presets: + if self.type == pre[1]: + if self.obj.Label in pre[2]: + self.Profile = pre + break + if not self.Profile: # try to find by size if hasattr(self.obj,"Width") and hasattr(self.obj,"Height"): for pre in self.presets: - if abs(self.obj.Width - self.Profile[4]) < 0.1 and \ - abs(self.obj.Height - self.Profile[5]) < 0.1: - self.profile = pre - break - if self.profile: - origprofile = list(self.profile) # the operation below will change self.profile + if self.type == pre[1]: + if abs(self.obj.Width - self.Profile[4]) < 0.1 and \ + abs(self.obj.Height - self.Profile[5]) < 0.1: + self.Profile = pre + break + if self.Profile: + origprofile = list(self.Profile) # the operation below will change self.profile self.comboCategory.setCurrentIndex(1+self.categories.index(origprofile[1])) self.changeCategory(origprofile[1]) self.comboProfile.setCurrentIndex(self.currentpresets.index(origprofile)) @@ -355,23 +484,24 @@ class ProfileTaskPanel: def changeProfile(self,idx): - self.profile = self.currentpresets[idx] + self.Profile = self.currentpresets[idx] def accept(self): - if self.profile: - self.obj.Label = self.profile[2] + if self.Profile: + self.obj.Label = self.Profile[2] if self.type in ["H","R","RH","U"]: - self.obj.Width = self.profile[4] - self.obj.Height = self.profile[5] + self.obj.Width = self.Profile[4] + self.obj.Height = self.Profile[5] if self.type in ["H","U"]: - self.obj.WebThickness = self.profile[6] - self.obj.FlangeThickness = self.profile[7] + self.obj.WebThickness = self.Profile[6] + self.obj.FlangeThickness = self.Profile[7] elif self.type == "RH": - self.obj.Thickness = self.profile[6] + self.obj.Thickness = self.Profile[6] elif self.type == "C": - self.obj.OutDiameter = self.profile[4] - self.obj.Thickness = self.profile[5] + self.obj.OutDiameter = self.Profile[4] + self.obj.Thickness = self.Profile[5] + self.obj.Proxy.Profile = self.Profile FreeCAD.ActiveDocument.recompute() FreeCADGui.ActiveDocument.resetEdit() return True @@ -380,3 +510,7 @@ class ProfileTaskPanel: self.form.setWindowTitle(self.type+" "+QtGui.QApplication.translate("Arch", "Profile", None)) + + +if FreeCAD.GuiUp: + FreeCADGui.addCommand('Arch_Profile',Arch_Profile()) diff --git a/src/Mod/Arch/InitGui.py b/src/Mod/Arch/InitGui.py index 9f18d1c509..d6317f3efd 100644 --- a/src/Mod/Arch/InitGui.py +++ b/src/Mod/Arch/InitGui.py @@ -65,7 +65,7 @@ class ArchWorkbench(FreeCADGui.Workbench): "Arch_SectionPlane", "Arch_Space", "Arch_Stairs", "Arch_PanelTools", "Arch_Equipment", "Arch_Frame", "Arch_Fence", "Arch_Truss", - "Arch_MaterialTools", + "Arch_Profile","Arch_MaterialTools", "Arch_Schedule", "Arch_PipeTools", "Arch_CutPlane", "Arch_CutLine", "Arch_Add", "Arch_Remove", "Arch_Survey"] diff --git a/src/Mod/Arch/Presets/profiles.csv b/src/Mod/Arch/Presets/profiles.csv index fa1482272a..482811ba75 100644 --- a/src/Mod/Arch/Presets/profiles.csv +++ b/src/Mod/Arch/Presets/profiles.csv @@ -1051,3 +1051,27 @@ UPE,UPE300,U,300,100,9.5,15 UPE,UPE330,U,330,105,11,16 UPE,UPE360,U,360,110,12,17 UPE,UPE400,U,400,115,13.5,18 + +# US Aluminium C channels + +Aluminium C Channel,2x1 Channel,U,50.8,25.4,3.302,3.302 +Aluminium C Channel,2x1.25 Channel,U,50.8,31.75,6.604,4.318 +Aluminium C Channel,3x1.5 Channel,U,76.2,38.1,5.08,3.302 +Aluminium C Channel,3x1.75 Channel,U,76.2,44.45,6.604,4.318 +Aluminium C Channel,4x2 Channel,U,101.6,50.8,5.842,3.81 +Aluminium C Channel,4x2.25 Channel,U,101.6,57.15,7.366,4.826 +Aluminium C Channel,5x2.25 Channel,U,127,57.15,6.604,3.81 +Aluminium C Channel,5x2.75 Channel,U,127,69.85,8.128,4.826 +Aluminium C Channel,6x2.5 Channel,U,152.4,63.5,7.366,4.318 +Aluminium C Channel,6x3.25 Channel,U,152.4,82.55,8.89,5.334 +Aluminium C Channel,7x2.75 Channel,U,177.8,69.85,7.366,4.318 +Aluminium C Channel,7x3.5 Channel,U,177.8,88.9,9.652,5.334 +Aluminium C Channel,8x3 Channel,U,203.2,76.2,8.89,4.826 +Aluminium C Channel,8x3.75 Channel,U,203.2,95.25,10.414,6.35 +Aluminium C Channel,9x3.25 Channel,U,228.6,82.55,8.89,5.842 +Aluminium C Channel,9x4 Channel,U,228.6,101.6,11.176,7.366 +Aluminium C Channel,10x3.5 Channel,U,254,88.9,10.414,6.35 +Aluminium C Channel,10x4.25 Channel,U,254,107.95,12.7,7.874 +Aluminium C Channel,12x4 Channel,U,304.8,101.6,11.938,7.366 +Aluminium C Channel,12x5 Channel,U,304.8,127,15.748,8.89 +