Macro merge duplicate materials: Difference between revisions
m (Description +) |
(MacroCode) |
||
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
<languages/> |
||
<translate> |
<translate> |
||
<!--T:7--> |
<!--T:7--> |
||
{{Macro |
{{Macro |
||
|Name=Macro merge duplicate materials |
|Name=Macro merge duplicate materials |
||
|Icon=Macro_merge_duplicate_materials.png |
|||
|Description=Merges materials that have the same base name (with different numeral endings like 001, 002,...) into one. Only the first one will be kept, and all the objects that link to the duplicates will be linking to the first one instead. So before using this macro, make sure your first material (either the one without numerical ending or the lowest number found) is the right one. |
|Description=Merges materials that have the same base name (with different numeral endings like 001, 002,...) into one. Only the first one will be kept, and all the objects that link to the duplicates will be linking to the first one instead. So before using this macro, make sure your first material (either the one without numerical ending or the lowest number found) is the right one. |
||
|Author=yorik |
|Author=yorik |
||
|Version= |
|Version=2.0 |
||
|Date= |
|Date=20197-07-12 |
||
|FCVersion=All |
|||
|Download=[https://www.freecadweb.org/wiki/images/e/ed/Macro_merge_duplicate_materials.png ToolBar Icon] |
|||
}} |
}} |
||
Line 16: | Line 20: | ||
==Script== <!--T:6--> |
==Script== <!--T:6--> |
||
<!--T:10--> |
|||
ToolBar Icon |
|||
</translate> |
</translate> |
||
[[Image:Macro_merge_duplicate_materials.png]] |
|||
'''Merge duplicate materials.FCMacro''' |
'''Merge duplicate materials.FCMacro''' |
||
{{ |
{{MacroCode|code= |
||
import FreeCAD,FreeCADGui |
import FreeCAD,FreeCADGui |
||
mats = [o for o in FreeCAD.ActiveDocument.Objects if o.isDerivedFrom("App::MaterialObject")] |
mats = [o for o in FreeCAD.ActiveDocument.Objects if o.isDerivedFrom("App::MaterialObject")] |
||
Line 35: | Line 43: | ||
for prop in par.PropertiesList: |
for prop in par.PropertiesList: |
||
if getattr(par,prop) == mat: |
if getattr(par,prop) == mat: |
||
print "Changed property '"+prop+"' of object "+par.Label+" from "+mat.Label+" to "+orig.Label |
print( "Changed property '"+prop+"' of object "+par.Label+" from "+mat.Label+" to "+orig.Label) |
||
setattr(par,prop,orig) |
setattr(par,prop,orig) |
||
todelete.append(mat) |
todelete.append(mat) |
||
for tod in todelete: |
for tod in todelete: |
||
if not tod.InList: |
if not tod.InList: |
||
print "Deleting material "+tod.Label |
print( "Deleting material "+tod.Label) |
||
FreeCAD.ActiveDocument.removeObject(tod.Name) |
FreeCAD.ActiveDocument.removeObject(tod.Name) |
||
elif (len(tod.InList) == 1) and (tod.InList[0].isDerivedFrom("App::DocumentObjectGroup")): |
elif (len(tod.InList) == 1) and (tod.InList[0].isDerivedFrom("App::DocumentObjectGroup")): |
||
print "Deleting material "+tod.Label |
print( "Deleting material "+tod.Label) |
||
FreeCAD.ActiveDocument.removeObject(tod.Name) |
FreeCAD.ActiveDocument.removeObject(tod.Name) |
||
else: |
else: |
||
print "Unable to delete material "+tod.Label+": InList not empty" |
print( "Unable to delete material "+tod.Label+": InList not empty") |
||
}} |
}} |
||
{{clear}} |
{{clear}} |
Latest revision as of 10:30, 21 December 2021
Description |
---|
Merges materials that have the same base name (with different numeral endings like 001, 002,...) into one. Only the first one will be kept, and all the objects that link to the duplicates will be linking to the first one instead. So before using this macro, make sure your first material (either the one without numerical ending or the lowest number found) is the right one. Macro version: 2.0 Last modified: 20197-07-12 FreeCAD version: All Download: ToolBar Icon Author: yorik |
Author |
yorik |
Download |
ToolBar Icon |
Links |
Macros recipes How to install macros How to customize toolbars |
Macro Version |
2.0 |
Date last modified |
20197-07-12 |
FreeCAD Version(s) |
All |
Default shortcut |
None |
See also |
None |
Description
Merges materials that have the same base name (with different numeral endings like 001, 002,...) into one. Only the first one will be kept, and all the objects that link to the duplicates will be linking to the first one instead. So before using this macro, make sure your first material (either the one without numerical ending or the lowest number found) is the right one.
Script
Merge duplicate materials.FCMacro
import FreeCAD,FreeCADGui mats = [o for o in FreeCAD.ActiveDocument.Objects if o.isDerivedFrom("App::MaterialObject")] todelete = [] for mat in mats: if mat.Label[-1].isdigit() and mat.Label[-2].isdigit() and mat.Label[-3].isdigit(): orig = None for om in mats: if om.Label == mat.Label[:-3].strip(): orig = om break if orig: for par in mat.InList: for prop in par.PropertiesList: if getattr(par,prop) == mat: print( "Changed property '"+prop+"' of object "+par.Label+" from "+mat.Label+" to "+orig.Label) setattr(par,prop,orig) todelete.append(mat) for tod in todelete: if not tod.InList: print( "Deleting material "+tod.Label) FreeCAD.ActiveDocument.removeObject(tod.Name) elif (len(tod.InList) == 1) and (tod.InList[0].isDerivedFrom("App::DocumentObjectGroup")): print( "Deleting material "+tod.Label) FreeCAD.ActiveDocument.removeObject(tod.Name) else: print( "Unable to delete material "+tod.Label+": InList not empty")