Macro merge duplicate materials/pl

Macro merge duplicate materials

Opis
Łączy materiały o tej samej podstawowej nazwie (z różnymi końcówkami numerycznymi, np. 001, 002, ...) w jeden. Zachowany zostanie tylko pierwszy materiał, a wszystkie obiekty powiązane z duplikatami zostaną przypisane do tego pierwszego. Przed użyciem tego makra upewnij się więc, że pierwszy materiał (ten bez końcówki numerycznej lub o najniższym numerze) jest właściwy.

Macro version: 2.0
Last modified: 2019-07-12
FreeCAD version: All
Download: Ikona paska narzędzi
Autor: yorik
Autor
yorik
Do pobrania
Ikona paska narzędzi
Odnośniki
Wersja Makrodefinicji
2.0
Data zmian
2019-07-12
Wersja FreeCAD
All
Domyślny skrót
Brak
Zobacz również
-

Opis

Łączy materiały o tej samej podstawowej nazwie (z różnymi końcówkami numerycznymi, np. 001, 002, ...) w jeden. Zachowany zostanie tylko pierwszy materiał, a wszystkie obiekty powiązane z duplikatami zostaną przypisane do tego pierwszego. Przed użyciem tego makra upewnij się więc, że pierwszy materiał (ten bez końcówki numerycznej lub o najniższym numerze) jest właściwy.

Skrypt

Ikona paska narzędzi

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")