1
#***************************************************************************
2
#* Copyright (c) 2015 Yorik van Havre <yorik@uncreated.net> *
4
#* This program is free software; you can redistribute it and/or modify *
5
#* it under the terms of the GNU Lesser General Public License (LGPL) *
6
#* as published by the Free Software Foundation; either version 2 of *
7
#* the License, or (at your option) any later version. *
8
#* for detail see the LICENCE text file. *
10
#* This program is distributed in the hope that it will be useful, *
11
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13
#* GNU Library General Public License for more details. *
15
#* You should have received a copy of the GNU Library General Public *
16
#* License along with this program; if not, write to the Free Software *
17
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
20
#***************************************************************************
23
from draftutils import params
27
import Arch_rc # Needed for access to icons # lgtm [py/unused_import]
28
from PySide import QtCore, QtGui
29
from draftutils.translate import translate
30
from PySide.QtCore import QT_TRANSLATE_NOOP
33
def translate(ctxt,txt):
35
def QT_TRANSLATE_NOOP(ctxt,txt):
39
__title__ = "Arch Material Management"
40
__author__ = "Yorik van Havre"
41
__url__ = "https://www.freecad.org"
43
## @package ArchMaterial
45
# \brief The Material object and tools
47
# This module provides tools to add materials to
51
class _ArchMaterialContainer:
54
"The Material Container"
56
def __init__(self,obj):
57
self.Type = "MaterialContainer"
60
def execute(self,obj):
64
if hasattr(self,"Type"):
67
def loads(self,state):
72
class _ViewProviderArchMaterialContainer:
75
"A View Provider for the Material Container"
77
def __init__(self,vobj):
81
return ":/icons/Arch_Material_Group.svg"
83
def attach(self,vobj):
84
self.Object = vobj.Object
86
def setupContextMenu(self, vobj, menu):
87
actionMergeByName = QtGui.QAction(QtGui.QIcon(":/icons/Arch_Material_Group.svg"),
88
translate("Arch", "Merge duplicates"),
90
actionMergeByName.triggered.connect(self.mergeByName)
91
menu.addAction(actionMergeByName)
93
actionReorder = QtGui.QAction(translate("Arch", "Reorder children alphabetically"),
95
actionReorder.triggered.connect(self.reorder)
96
menu.addAction(actionReorder)
98
def mergeByName(self):
99
if hasattr(self,"Object"):
100
mats = [o for o in self.Object.Group if o.isDerivedFrom("App::MaterialObject")]
105
if om.Label == mat.Label:
109
if mat.Label[-1].isdigit() and mat.Label[-2].isdigit() and mat.Label[-3].isdigit():
111
if om.Label == mat.Label[:-3].strip():
115
for par in mat.InList:
116
for prop in par.PropertiesList:
117
if getattr(par,prop) == mat:
118
FreeCAD.Console.PrintMessage("Changed property '"+prop+"' of object "+par.Label+" from "+mat.Label+" to "+orig.Label+"\n")
119
setattr(par,prop,orig)
123
FreeCAD.Console.PrintMessage("Merging duplicate material "+tod.Label+"\n")
124
FreeCAD.ActiveDocument.removeObject(tod.Name)
125
elif (len(tod.InList) == 1) and (tod.InList[0].isDerivedFrom("App::DocumentObjectGroup")):
126
FreeCAD.Console.PrintMessage("Merging duplicate material "+tod.Label+"\n")
127
FreeCAD.ActiveDocument.removeObject(tod.Name)
129
FreeCAD.Console.PrintMessage("Unable to delete material "+tod.Label+": InList not empty\n")
132
if hasattr(self,"Object"):
133
if hasattr(self.Object,"Group") and self.Object.Group:
134
g = self.Object.Group
135
g.sort(key=lambda obj: obj.Label)
136
self.Object.Group = g
137
FreeCAD.ActiveDocument.recompute()
142
def loads(self,state):
149
"The Material object"
151
def __init__(self,obj):
153
self.Type = "Material"
155
self.setProperties(obj)
157
def onDocumentRestored(self,obj):
159
self.setProperties(obj)
161
def setProperties(self,obj):
163
if not "Description" in obj.PropertiesList:
164
obj.addProperty("App::PropertyString","Description","Material",QT_TRANSLATE_NOOP("App::Property","A description for this material"))
165
if not "StandardCode" in obj.PropertiesList:
166
obj.addProperty("App::PropertyString","StandardCode","Material",QT_TRANSLATE_NOOP("App::Property","A standard code (MasterFormat, OmniClass,...)"))
167
if not "ProductURL" in obj.PropertiesList:
168
obj.addProperty("App::PropertyString","ProductURL","Material",QT_TRANSLATE_NOOP("App::Property","A URL where to find information about this material"))
169
if not "Transparency" in obj.PropertiesList:
170
obj.addProperty("App::PropertyPercent","Transparency","Material",QT_TRANSLATE_NOOP("App::Property","The transparency value of this material"))
171
if not "Color" in obj.PropertiesList:
172
obj.addProperty("App::PropertyColor","Color","Material",QT_TRANSLATE_NOOP("App::Property","The color of this material"))
173
if not "SectionColor" in obj.PropertiesList:
174
obj.addProperty("App::PropertyColor","SectionColor","Material",QT_TRANSLATE_NOOP("App::Property","The color of this material when cut"))
176
def isSameColor(self,c1,c2):
179
if round(c1[0],r) == round(c2[0],r):
180
if round(c1[1],r) == round(c2[1],r):
181
if round(c1[2],r) == round(c2[2],r):
185
def onChanged(self,obj,prop):
188
if prop == "Material":
189
if "SectionColor" in obj.Material:
190
c = tuple([float(f) for f in obj.Material['SectionColor'].strip("()").strip("[]").split(",")])
191
if hasattr(obj,"SectionColor"):
192
if not self.isSameColor(obj.SectionColor,c):
194
if "DiffuseColor" in obj.Material:
195
c = tuple([float(f) for f in obj.Material['DiffuseColor'].strip("()").strip("[]").split(",")])
196
if hasattr(obj,"Color"):
197
if not self.isSameColor(obj.Color,c):
199
if "Transparency" in obj.Material:
200
t = int(obj.Material['Transparency'])
201
if hasattr(obj,"Transparency"):
202
if obj.Transparency != t:
204
if "ProductURL" in obj.Material:
205
if hasattr(obj,"ProductURL"):
206
if obj.ProductURL != obj.Material["ProductURL"]:
207
obj.ProductURL = obj.Material["ProductURL"]
208
if "StandardCode" in obj.Material:
209
if hasattr(obj,"StandardCode"):
210
if obj.StandardCode != obj.Material["StandardCode"]:
211
obj.StandardCode = obj.Material["StandardCode"]
212
if "Description" in obj.Material:
213
if hasattr(obj,"Description"):
214
if obj.Description != obj.Material["Description"]:
215
obj.Description = obj.Material["Description"]
216
if "Name" in obj.Material:
217
if hasattr(obj,"Label"):
218
if obj.Label != obj.Material["Name"]:
219
obj.Label = obj.Material["Name"]
220
elif prop == "Label":
222
if d["Name"] == obj.Label:
224
d["Name"] = obj.Label
225
elif prop == "SectionColor":
226
if hasattr(obj,"SectionColor"):
227
if "SectionColor" in d:
228
if self.isSameColor(tuple([float(f) for f in d['SectionColor'].strip("()").strip("[]").split(",")]),obj.SectionColor[:3]):
230
d["SectionColor"] = str(obj.SectionColor[:3])
231
elif prop == "Color":
232
if hasattr(obj,"Color"):
233
if "DiffuseColor" in d:
234
if self.isSameColor(tuple([float(f) for f in d['DiffuseColor'].strip("()").strip("[]").split(",")]),obj.Color[:3]):
236
d["DiffuseColor"] = str(obj.Color[:3])
237
elif prop == "Transparency":
238
if hasattr(obj,"Transparency"):
239
val = str(obj.Transparency)
240
if "Transparency" in d:
241
if d["Transparency"] == val:
243
d["Transparency"] = val
244
elif prop == "ProductURL":
245
if hasattr(obj,"ProductURL"):
247
if "ProductURL" in d:
248
if d["ProductURL"] == val:
250
obj.Material["ProductURL"] = val
251
elif prop == "StandardCode":
252
if hasattr(obj,"StandardCode"):
253
val = obj.StandardCode
254
if "StandardCode" in d:
255
if d["StandardCode"] == val:
257
d["StandardCode"] = val
258
elif prop == "Description":
259
if hasattr(obj,"Description"):
260
val = obj.Description
261
if "Description" in d:
262
if d["Description"] == val:
264
d["Description"] = val
265
if d and (d != obj.Material):
269
# not sure why this is needed, but it is...
270
#FreeCADGui.ActiveDocument.resetEdit()
272
def execute(self,obj):
275
if "DiffuseColor" in obj.Material:
276
c = tuple([float(f) for f in obj.Material['DiffuseColor'].strip("()").strip("[]").split(",")])
278
if hasattr(p,"Material") and ( (not hasattr(p.ViewObject,"UseMaterialColor")) or p.ViewObject.UseMaterialColor):
279
if p.Material.Name == obj.Name:
280
p.ViewObject.ShapeColor = c
284
if hasattr(self,"Type"):
287
def loads(self,state):
292
class _ViewProviderArchMaterial:
294
"A View Provider for the Material object"
296
def __init__(self,vobj):
300
if hasattr(self,"icondata"):
302
return ":/icons/Arch_Material.svg"
304
def attach(self, vobj):
305
self.Object = vobj.Object
307
def updateData(self, obj, prop):
309
from PySide import QtCore,QtGui
312
if hasattr(obj,"Color"):
314
matcolor = QtGui.QColor(int(c[0]*255),int(c[1]*255),int(c[2]*255))
315
darkcolor = QtGui.QColor(int(c[0]*125),int(c[1]*125),int(c[2]*125))
316
im = QtGui.QImage(48,48,QtGui.QImage.Format_ARGB32)
317
im.fill(QtCore.Qt.transparent)
318
pt = QtGui.QPainter(im)
319
pt.setPen(QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap))
320
#pt.setBrush(QtGui.QBrush(matcolor, QtCore.Qt.SolidPattern))
321
gradient = QtGui.QLinearGradient(0,0,48,48)
322
gradient.setColorAt(0,matcolor)
323
gradient.setColorAt(1,darkcolor)
324
pt.setBrush(QtGui.QBrush(gradient))
325
pt.drawEllipse(6,6,36,36)
326
pt.setPen(QtGui.QPen(QtCore.Qt.white, 1, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap))
327
pt.setBrush(QtGui.QBrush(QtCore.Qt.white, QtCore.Qt.SolidPattern))
328
pt.drawEllipse(12,12,12,12)
331
ba = QtCore.QByteArray()
332
b = QtCore.QBuffer(ba)
333
b.open(QtCore.QIODevice.WriteOnly)
335
self.icondata = ba.data().decode("latin1")
337
def onChanged(self, vobj, prop):
338
if prop == "Material":
339
if "Father" in vobj.Object.Material:
340
for o in FreeCAD.ActiveDocument.Objects:
341
if o.isDerivedFrom("App::MaterialObject"):
342
if o.Label == vobj.Object.Material["Father"]:
345
def setEdit(self, vobj, mode):
349
self.taskd = _ArchMaterialTaskPanel(vobj.Object)
350
FreeCADGui.Control.showDialog(self.taskd)
351
self.taskd.form.FieldName.setFocus()
352
self.taskd.form.FieldName.selectAll()
355
def unsetEdit(self, vobj, mode):
359
FreeCADGui.Control.closeDialog()
362
def setupContextMenu(self, vobj, menu):
363
actionEdit = QtGui.QAction(translate("Arch", "Edit"),
365
actionEdit.triggered.connect(self.edit)
366
menu.addAction(actionEdit)
369
FreeCADGui.ActiveDocument.setEdit(self.Object, 0)
371
def setTaskValue(self,widgetname,value):
372
if hasattr(self,"taskd"):
373
if hasattr(self.taskd,"form"):
374
if hasattr(self.taskd.form,widgetname):
375
widget = getattr(self.taskd.form,widgetname)
376
if hasattr(widget,"setText"):
377
widget.setText(value)
378
elif hasattr(widget,"setValue"):
379
widget.setText(value)
384
def loads(self,state):
387
def claimChildren(self):
389
if hasattr(self,"Object"):
390
for o in self.Object.Document.Objects:
391
if o.isDerivedFrom("App::MaterialObject"):
393
if "Father" in o.Material:
394
if o.Material["Father"] == self.Object.Label:
399
class _ArchMaterialTaskPanel:
401
'''The editmode TaskPanel for Arch Material objects'''
403
def __init__(self,obj=None):
405
self.existingmaterials = []
407
self.form = FreeCADGui.PySideUic.loadUi(":/ui/ArchMaterial.ui")
408
colorPix = QtGui.QPixmap(16,16)
409
colorPix.fill(QtGui.QColor(204,204,204))
410
self.form.ButtonColor.setIcon(QtGui.QIcon(colorPix))
411
self.form.ButtonSectionColor.setIcon(QtGui.QIcon(colorPix))
412
self.form.ButtonUrl.setIcon(QtGui.QIcon(":/icons/internet-web-browser.svg"))
413
self.form.comboBox_MaterialsInDir.currentIndexChanged.connect(self.chooseMat)
414
self.form.comboBox_FromExisting.currentIndexChanged.connect(self.fromExisting)
415
self.form.comboFather.currentTextChanged.connect(self.setFather)
416
self.form.ButtonColor.pressed.connect(self.getColor)
417
self.form.ButtonSectionColor.pressed.connect(self.getSectionColor)
418
self.form.ButtonUrl.pressed.connect(self.openUrl)
419
self.form.ButtonEditor.pressed.connect(self.openEditor)
420
self.form.ButtonCode.pressed.connect(self.getCode)
421
self.fillMaterialCombo()
422
self.fillExistingCombo()
424
from bimcommands import BimClassification
426
self.form.ButtonCode.hide()
428
self.form.ButtonCode.setIcon(QtGui.QIcon(":/icons/BIM_Classification.svg"))
430
if hasattr(self.obj,"Material"):
431
self.material = self.obj.Material
435
"sets the task box contents from self.material"
436
if 'Name' in self.material:
437
self.form.FieldName.setText(self.material['Name'])
439
self.form.FieldName.setText(self.obj.Label)
440
if 'Description' in self.material:
441
self.form.FieldDescription.setText(self.material['Description'])
442
if 'DiffuseColor' in self.material:
443
self.form.ButtonColor.setIcon(self.getColorIcon(self.material["DiffuseColor"]))
444
elif 'ViewColor' in self.material:
445
self.form.ButtonColor.setIcon(self.getColorIcon(self.material["ViewColor"]))
446
elif 'Color' in self.material:
447
self.form.ButtonColor.setIcon(self.getColorIcon(self.material["Color"]))
448
if 'SectionColor' in self.material:
449
self.form.ButtonSectionColor.setIcon(self.getColorIcon(self.material["SectionColor"]))
450
if 'StandardCode' in self.material:
451
self.form.FieldCode.setText(self.material['StandardCode'])
452
if 'ProductURL' in self.material:
453
self.form.FieldUrl.setText(self.material['ProductURL'])
454
if 'Transparency' in self.material:
455
self.form.SpinBox_Transparency.setValue(int(self.material["Transparency"]))
456
if "Father" in self.material:
457
father = self.material["Father"]
461
self.form.comboFather.addItem("None")
462
for o in FreeCAD.ActiveDocument.Objects:
463
if o.isDerivedFrom("App::MaterialObject"):
465
self.form.comboFather.addItem(o.Label)
466
if o.Label == father:
467
self.form.comboFather.setCurrentIndex(self.form.comboFather.count()-1)
469
if father and not found:
470
self.form.comboFather.addItem(father)
471
self.form.comboFather.setCurrentIndex(self.form.comboFather.count()-1)
473
def getColorIcon(self,color):
476
c = tuple([float(f) for f in color.strip("()").split(",")])
477
qcolor = QtGui.QColor()
478
qcolor.setRgbF(c[0],c[1],c[2])
479
colorPix = QtGui.QPixmap(16,16)
480
colorPix.fill(qcolor)
481
icon = QtGui.QIcon(colorPix)
486
"sets self.material from the contents of the task box"
487
self.material['Name'] = self.form.FieldName.text()
488
self.material['Description'] = self.form.FieldDescription.text()
489
self.material['DiffuseColor'] = self.getColorFromIcon(self.form.ButtonColor.icon())
490
self.material['ViewColor'] = self.material['DiffuseColor']
491
self.material['Color'] = self.material['DiffuseColor']
492
self.material['SectionColor'] = self.getColorFromIcon(self.form.ButtonSectionColor.icon())
493
self.material['StandardCode'] = self.form.FieldCode.text()
494
self.material['ProductURL'] = self.form.FieldUrl.text()
495
self.material['Transparency'] = str(self.form.SpinBox_Transparency.value())
497
def getColorFromIcon(self,icon):
498
"gets pixel color from the given icon"
499
pixel = icon.pixmap(16,16).toImage().pixel(0,0)
500
return str(QtGui.QColor(pixel).getRgbF())
505
if hasattr(self.obj,"Material"):
506
self.obj.Material = self.material
507
self.obj.Label = self.material['Name']
508
FreeCAD.ActiveDocument.recompute()
509
FreeCADGui.ActiveDocument.resetEdit()
513
FreeCADGui.ActiveDocument.resetEdit()
516
def chooseMat(self, card):
517
"sets self.material from a card"
518
card = self.form.comboBox_MaterialsInDir.currentText()
519
if card in self.cards:
521
self.material = importFCMat.read(self.cards[card])
524
def fromExisting(self,index):
525
"sets the contents from an existing material"
527
if index <= len(self.existingmaterials):
528
m = self.existingmaterials[index-1]
530
self.material = m.Material
533
def setFather(self, text):
537
if "Father" in self.material:
538
# for some have Father at first and change to none
539
self.material.pop("Father")
541
self.material["Father"] = text
544
self.getColorForButton(self.form.ButtonColor)
546
def getSectionColor(self):
547
self.getColorForButton(self.form.ButtonSectionColor)
549
def getColorForButton(self,button):
550
"opens a color picker dialog"
552
pixel = icon.pixmap(16,16).toImage().pixel(0,0)
553
color = QtGui.QColorDialog.getColor(QtGui.QColor(pixel))
555
colorPix = QtGui.QPixmap(16,16)
557
button.setIcon(QtGui.QIcon(colorPix))
559
def fillMaterialCombo(self):
560
"fills the combo with the existing FCMat cards"
561
# look for cards in both resources dir and a Materials sub-folder in the user folder.
562
# User cards with same name will override system cards
563
resources_mat_path = os.path.join(FreeCAD.getResourceDir(), "Mod", "Material", "Resources", "Materials")
564
resources_mat_path_std = os.path.join(resources_mat_path, "Standard")
565
user_mat_path = os.path.join(FreeCAD.ConfigGet("UserAppData"), "Material")
567
paths = [resources_mat_path_std]
568
if os.path.exists(user_mat_path):
569
paths.append(user_mat_path)
572
for root, _, f_names in os.walk(p):
574
b,e = os.path.splitext(f)
575
if e.upper() == ".FCMAT":
576
self.cards[b] = os.path.join(root, f)
578
for k in sorted(self.cards):
579
self.form.comboBox_MaterialsInDir.addItem(k)
581
def fillExistingCombo(self):
582
"fills the existing materials combo"
583
self.existingmaterials = []
584
for obj in FreeCAD.ActiveDocument.Objects:
585
if obj.isDerivedFrom("App::MaterialObject"):
587
self.existingmaterials.append(obj)
588
for m in self.existingmaterials:
589
self.form.comboBox_FromExisting.addItem(m.Label)
592
def openEditor(self):
593
"opens the full material editor from the material module"
596
import MaterialEditor
597
self.material = MaterialEditor.editMaterial(self.material)
603
if 'ProductURL' in self.material:
604
QtGui.QDesktopServices.openUrl(self.material['ProductURL'])
607
FreeCADGui.Selection.addSelection(self.obj)
608
FreeCADGui.runCommand("BIM_Classification")
611
class _ArchMultiMaterial:
613
"The MultiMaterial object"
615
def __init__(self,obj):
616
self.Type = "MultiMaterial"
618
obj.addProperty("App::PropertyString","Description","Arch",QT_TRANSLATE_NOOP("App::Property","A description for this material"))
619
obj.addProperty("App::PropertyStringList","Names","Arch",QT_TRANSLATE_NOOP("App::Property","The list of layer names"))
620
obj.addProperty("App::PropertyLinkList","Materials","Arch",QT_TRANSLATE_NOOP("App::Property","The list of layer materials"))
621
obj.addProperty("App::PropertyFloatList","Thicknesses","Arch",QT_TRANSLATE_NOOP("App::Property","The list of layer thicknesses"))
624
if hasattr(self,"Type"):
627
def loads(self,state):
631
class _ViewProviderArchMultiMaterial:
633
"A View Provider for the MultiMaterial object"
635
def __init__(self,vobj):
639
return ":/icons/Arch_Material_Multi.svg"
641
def attach(self, vobj):
642
self.Object = vobj.Object
644
def setEdit(self, vobj, mode):
648
taskd = _ArchMultiMaterialTaskPanel(vobj.Object)
649
FreeCADGui.Control.showDialog(taskd)
652
def unsetEdit(self, vobj, mode):
656
FreeCADGui.Control.closeDialog()
659
def doubleClicked(self,vobj):
662
def setupContextMenu(self, vobj, menu):
663
actionEdit = QtGui.QAction(translate("Arch", "Edit"),
665
actionEdit.triggered.connect(self.edit)
666
menu.addAction(actionEdit)
669
FreeCADGui.ActiveDocument.setEdit(self.Object, 0)
674
def loads(self,state):
682
class MultiMaterialDelegate(QtGui.QStyledItemDelegate):
684
def __init__(self, parent=None, *args):
686
for obj in FreeCAD.ActiveDocument.Objects:
687
if obj.isDerivedFrom("App::MaterialObject"):
688
self.mats.append(obj)
689
QtGui.QStyledItemDelegate.__init__(self, parent, *args)
691
def createEditor(self,parent,option,index):
692
if index.column() == 0:
693
editor = QtGui.QComboBox(parent)
694
editor.setEditable(True)
695
elif index.column() == 1:
696
editor = QtGui.QComboBox(parent)
697
elif index.column() == 2:
698
ui = FreeCADGui.UiLoader()
699
editor = ui.createWidget("Gui::InputField")
700
editor.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Minimum)
701
editor.setParent(parent)
703
editor = QtGui.QLineEdit(parent)
706
def setEditorData(self, editor, index):
707
if index.column() == 0:
709
editor.addItems([index.data()]+ArchWindow.WindowPartTypes)
710
elif index.column() == 1:
712
for i,m in enumerate(self.mats):
713
editor.addItem(m.Label)
714
if m.Label == index.data():
716
editor.setCurrentIndex(idx)
718
QtGui.QStyledItemDelegate.setEditorData(self, editor, index)
720
def setModelData(self, editor, model, index):
721
if index.column() == 0:
722
if editor.currentIndex() == -1:
723
model.setData(index, "")
725
model.setData(index, editor.currentText())
726
elif index.column() == 1:
727
if editor.currentIndex() == -1:
728
model.setData(index, "")
730
model.setData(index, self.mats[editor.currentIndex()].Label)
732
QtGui.QStyledItemDelegate.setModelData(self, editor, model, index)
735
class _ArchMultiMaterialTaskPanel:
737
'''The editmode TaskPanel for MultiMaterial objects'''
739
def __init__(self,obj=None):
741
self.form = FreeCADGui.PySideUic.loadUi(":/ui/ArchMultiMaterial.ui")
742
self.model = QtGui.QStandardItemModel()
743
self.model.setHorizontalHeaderLabels([translate("Arch","Name"),translate("Arch","Material"),translate("Arch","Thickness")])
744
self.form.tree.setModel(self.model)
745
self.form.tree.setUniformRowHeights(True)
746
self.form.tree.setItemDelegate(MultiMaterialDelegate())
747
self.form.chooseCombo.currentIndexChanged.connect(self.fromExisting)
748
self.form.addButton.pressed.connect(self.addLayer)
749
self.form.upButton.pressed.connect(self.upLayer)
750
self.form.downButton.pressed.connect(self.downLayer)
751
self.form.delButton.pressed.connect(self.delLayer)
752
self.form.invertButton.pressed.connect(self.invertLayer)
753
self.model.itemChanged.connect(self.recalcThickness)
754
self.fillExistingCombo()
757
def fillData(self,obj=None):
762
self.model.setHorizontalHeaderLabels([translate("Arch","Name"),translate("Arch","Material"),translate("Arch","Thickness")])
764
self.form.tree.setColumnWidth(0,params.get_param_arch("MultiMaterialColumnWidth0"))
765
self.form.tree.setColumnWidth(1,params.get_param_arch("MultiMaterialColumnWidth1"))
766
for i in range(len(obj.Names)):
767
item1 = QtGui.QStandardItem(obj.Names[i])
768
item2 = QtGui.QStandardItem(obj.Materials[i].Label)
769
item3 = QtGui.QStandardItem(FreeCAD.Units.Quantity(obj.Thicknesses[i],FreeCAD.Units.Length).getUserPreferred()[0])
770
self.model.appendRow([item1,item2,item3])
771
self.form.nameField.setText(obj.Label)
773
def fillExistingCombo(self):
774
"fills the existing multimaterials combo"
776
self.existingmaterials = []
777
for obj in FreeCAD.ActiveDocument.Objects:
778
if Draft.getType(obj) == "MultiMaterial":
780
self.existingmaterials.append(obj)
781
for m in self.existingmaterials:
782
self.form.chooseCombo.addItem(m.Label)
784
def fromExisting(self,index):
785
"sets the contents from an existing material"
787
if index <= len(self.existingmaterials):
788
m = self.existingmaterials[index-1]
793
item1 = QtGui.QStandardItem(translate("Arch","New layer"))
794
item2 = QtGui.QStandardItem()
795
item3 = QtGui.QStandardItem()
796
self.model.appendRow([item1,item2,item3])
799
sel = self.form.tree.selectedIndexes()
803
self.model.takeRow(row)
804
self.recalcThickness()
806
def moveLayer(self,mvt=0):
807
sel = self.form.tree.selectedIndexes()
812
data = self.model.takeRow(row)
813
self.model.insertRow(row+mvt,data)
814
ind = self.model.index(row+mvt,0)
815
self.form.tree.setCurrentIndex(ind)
818
self.moveLayer(mvt=-1)
821
self.moveLayer(mvt=1)
823
def invertLayer(self):
824
items = [self.model.takeRow(row) for row in range(self.model.rowCount()-1,-1,-1)]
827
self.model.insertRow(0,item)
829
def recalcThickness(self,item=None):
830
prefix = translate("Arch","Total thickness")+": "
833
for row in range(self.model.rowCount()):
835
d = self.model.item(row,2).text()
839
thick = FreeCAD.Units.Quantity(d).Value
841
thick = FreeCAD.Units.Quantity(d,FreeCAD.Units.Length).Value
844
suffix = " ("+translate("Arch","depends on the object")+")"
845
val = FreeCAD.Units.Quantity(th,FreeCAD.Units.Length).UserString
846
self.form.labelTotalThickness.setText(prefix + val + suffix)
850
params.set_param_arch("MultiMaterialColumnWidth0",self.form.tree.columnWidth(0))
851
params.set_param_arch("MultiMaterialColumnWidth1",self.form.tree.columnWidth(1))
854
for m in FreeCAD.ActiveDocument.Objects:
855
if m.isDerivedFrom("App::MaterialObject"):
860
for row in range(self.model.rowCount()):
861
name = self.model.item(row,0).text()
863
ml = self.model.item(row,1).text()
867
d = self.model.item(row,2).text()
871
thick = FreeCAD.Units.Quantity(d).Value
873
thick = FreeCAD.Units.Quantity(d,FreeCAD.Units.Length).Value
874
if round(thick,32) == 0:
878
materials.append(mat)
879
thicknesses.append(thick)
880
self.obj.Names = names
881
self.obj.Materials = materials
882
self.obj.Thicknesses = thicknesses
883
if self.form.nameField.text():
884
self.obj.Label = self.form.nameField.text()
885
FreeCAD.ActiveDocument.recompute()
886
FreeCADGui.ActiveDocument.resetEdit()
890
FreeCADGui.ActiveDocument.resetEdit()