Code: Select all
class BoolTool():
def mfuse_obj(self, nome, objs):
obj = App.ActiveDocument.addObject("Part::MultiFuse", nome)
shapes = []
for name in objs:
shape = App.ActiveDocument.getObject(name)
shapes.append(shape)
obj.Shapes = shapes
obj.Refine = True
App.ActiveDocument.recompute()
self.obj = obj
return obj
doc = Document("Unnamed")
doc.create()
box1 = box("box1")
box1.create(10,20,60)
box1.placement(FreeCAD.Placement(App.Vector(10,10,10), App.Rotation(45,0,0)))
cylinder1 = cylinder("cylinder1")
cylinder1.create(20,10,360)
cylinder1.placement(FreeCAD.Placement(App.Vector(10,10,10), App.Rotation(45,0,0)))
print(box)
bool1 = BoolTool()
objs = ("box1", "cylinder1")
bool1.mfuse_obj('fuse1', objs)
Allora, devi passare degli oggetti documento alla funzione
obj = App.ActiveDocument.addObject("Part::MultiFuse", nome) nella sua proprietà Shapes.
Per fare questo la via più breve è quella di ricavare l'oggetto documento a partire dal nome, le tue classi non "espongono" l'oggetto documento, per cui lo devi trovare in qualche modo.
Questa implementazione funziona, almeno sulla versione 0.19.
Però implementare delle classi per questo uso mi sembra molto "complicato"
Non mi è chiaro lo scopo di tutto questo.
Se lo scopo finale è quello di creare oggetti, l'approccio che ho illustrato è più maneggevole, se vuoi oggetti complessi da manipolare in modo semplice, ad esempio forme composte, puoi usare semplicemente la creazione di "oggetti shape" che poi accorpi in un oggetto documento come risultante delle operazioni boleane, l'oggetto è quello e bon.
Occupa meno memoria in quanto le "forme originali" sono perse una volta create, rimane in memoria solo "l'oggetto documento" come un oggetto
"Part::Feature" che è molto semplice e
Code: Select all
compound = DOC.addObject("Part::Feature", "unione colonne")
compound.Shape = Part.makeCompound(objs)
ha come uniche proprietà Label e Placement, il suo Placement di default è (0,0,0) per cui se lo costruisci accuratamente poi lo manipoli come vuoi.
Accuratamente in teoria sarebbe con il "baricentro" in (0,0,0) che è il modo più "comodo" per poi manipolare gli oggetti.
Altrimenti se hai "oggetti documento" cioè aggiunti al documento con
addObjects, questi hanno le proprie caratteristiche e se sono ad esempio un compound puoi ricavare gli "oggetti documento" originali e manipolarle come vuoi.
La differenza sta nell'occupazione di memoria perché il motore di FreeCAD mantiene in memoria gli oggetti solo se sono creati come "oggetto documento".
Un oggetto documento ha la sua proprietà "Shape" che è salvata, se questa è oggetto di operazioni booleane, solo il risultato di queste operazioni è salvato in shape, le "forme originali", una volta usate non sono più disponibili.
O meglio, una volta che crei le "forme" queste sono mantenute in memoria fino a che non le distruggi, ma se le metti all'interno di un metodo (funzione), una volta terminato il metodo tutte le forme create all'interno del metodo e che non passi come oggetto con return vengono dimenticate, le puoi recuperare o come riferimento passato ad esempio con
return, oppure se le "consolidi" in un "oggetto documento".
A volte è utile mantenere i componenti di un oggetto complesso altre volte lo è di meno e ti crea solo problemi di intasamento della memoria e di conseguenza di lentezza nell'elaborazione del documento, di ingombro in termini di dimensioni del file.
Altre volte ad esempio se stai sperimentando risulta utile averli a disposizione ad esempio per visualizzarli e capire come vengono creati in origine.
sta a te trovare la strada che ti è più utile.
potresti pensare di costruire la classe di creazione con un metodo debug che crei gli "oggetti documento", quando setti deug=True e non li crei se setti debug=False.
in questo modo hai la possibilità di scegliere al momento dell'esecuzione se avere le "forme originali" visualizzate ad esempio con
Code: Select all
if debug is True:
ox = lung * 0.5
oy = larg * 0.5
V0 = Vector(ox * -1, oy * -1, 0)
V1 = Vector(ox, oy * -1, 0)
V2 = Vector(ox, oy, 0)
V3 = Vector(ox * -1, oy, 0)
ref_box = Part.makePolygon((V0, V1, V2, V3, V0))
Part.show(ref_box)
ma questa è una tua scelta.
Spero di non essere stato troppo contorto nella spiegazione.
Saluti
Carlo D.