Credo sia perche’ le estrusioni non sono Brep, e quella opzione e’ salvata nella geometria Brep.
Ma se poi fai un Join, viene tutto convertito in Brep comunque, quindi tanto vale farlo prima per poter settare il colore.
OK, provo a imbastire qualcosa e lo posto per i test.
sempre odiate le estrusione non Brep… per me che lavoro al 90% in wireframe sono una rottura di palle…
Sai che c’è il comando “useextrusion” che dice a rhino di non fare estrusioni ma solo polisuperfici, vero?
Qui c’e’ lo script.
Lo ho provato, meno la parte che setta il colore.
import Rhino
import scriptcontext
def main():
res, obrefs = Rhino.Input.RhinoGet.GetMultipleObjects(
'Oggetti per Join conservando il colore ?', True,
Rhino.DocObjects.ObjectType.Surface |
Rhino.DocObjects.ObjectType.Brep |
Rhino.DocObjects.ObjectType.Extrusion )
if res != Rhino.Commands.Result.Success:
return
gids = [ obref.ObjectId for obref in obrefs ]
for obref in obrefs:
geo = obref.Geometry()
if isinstance( geo, Rhino.Geometry.Extrusion ):
rep = geo.ToBrep()
scriptcontext.doc.Objects.Replace( obref, rep )
rep = obref.Brep()
colr = obref.Object().Attributes.ObjectColor
faces = list( rep.Faces )
for face in faces:
face.PerObjectColor = colr
scriptcontext.doc.Objects.Replace( obref, rep )
scriptcontext.doc.Objects.UnselectAll()
scriptcontext.doc.Objects.Select( obrefs )
Rhino.RhinoApp.RunScript( '_Join', True )
main()
Porca
, l’ho cercato 100 volte e non lo trovavo… Grazie 1000
Ma lo stai rifacendo da zero? pensavo sfruttassi lo script esistente…
Un poco va cambiato, dato che deve accettare anche le estrusioni e c’e’ il Join alla fine, per il resto e’ questione di abitudini.
Conosco meglio quello che uso di solito.
Anzi, dovrei dire “che usavo” perche’ in effetti sono un po’ arrugginito … diverse cose ho dovuto andarle a vedere/cercare. ![]()
Ma la sostanza dello script non cambia, si tratta sempre di settare quella proprieta’ ( PerFaceColor ) nelle facce delle Brep.
Se funziona, lo script e’ finito cosi’.
… Se non funziona, ci ragioniamo e cerchiamo di farlo funzionare … ![]()
EDIT
Confermo.
Anch’io lavoravo quasi sempre in wireframe e il wireframe delle estrusioni e’ … deprimente.
![]()

Credo il problema sia sempre l’estrusione
Anzi, no… Provato poche superfici senza estrusioni ed il problema rimane
Eh … il problema e’ che sono rincoglionito.
Sorry.
e’ PerFaceColor, non PerObjectColor, come e’ scritto nello script che hai linkato.
Prova cosi’
import Rhino
import scriptcontext
def main():
res, obrefs = Rhino.Input.RhinoGet.GetMultipleObjects(
'Oggetti per Join conservando il colore ?', True,
Rhino.DocObjects.ObjectType.Surface |
Rhino.DocObjects.ObjectType.Brep |
Rhino.DocObjects.ObjectType.Extrusion )
if res != Rhino.Commands.Result.Success:
return
gids = [ obref.ObjectId for obref in obrefs ]
for obref in obrefs:
geo = obref.Geometry()
if isinstance( geo, Rhino.Geometry.Extrusion ):
rep = geo.ToBrep()
scriptcontext.doc.Objects.Replace( obref, rep )
rep = obref.Brep()
colr = obref.Object().Attributes.ObjectColor
faces = list( rep.Faces )
for face in faces:
face.PerFaceColor = colr
scriptcontext.doc.Objects.Replace( obref, rep )
scriptcontext.doc.Objects.UnselectAll()
scriptcontext.doc.Objects.Select( obrefs )
Rhino.RhinoApp.RunScript( '_Join', True )
main()
Funziona in parte… cioè se la superfice ha un colore diverso da quello del suo livello, lo script funziona…
mentre se le supefici sono su livelli diversi e colorate “By Layer”, prendono il colore del livello di arrivo del Join
Avevo sbagliato un altro metodo: invece di ObjectColor di vuole DrawColor.
Me lo ero dimenticato …
Poco per volta ci avviciniamo … spero … ![]()
Vediamo cosi’ …
import Rhino
import scriptcontext
def main():
res, obrefs = Rhino.Input.RhinoGet.GetMultipleObjects(
'Oggetti per Join conservando il colore ?', True,
Rhino.DocObjects.ObjectType.Surface |
Rhino.DocObjects.ObjectType.Brep |
Rhino.DocObjects.ObjectType.Extrusion )
if res != Rhino.Commands.Result.Success:
return
gids = [ obref.ObjectId for obref in obrefs ]
for obref in obrefs:
geo = obref.Geometry()
if isinstance( geo, Rhino.Geometry.Extrusion ):
rep = geo.ToBrep()
scriptcontext.doc.Objects.Replace( obref, rep )
rep = obref.Brep()
colr = obref.Object().Attributes.DrawColor( scriptcontext.doc )
faces = list( rep.Faces )
for face in faces:
face.PerFaceColor = colr
scriptcontext.doc.Objects.Replace( obref, rep )
scriptcontext.doc.Objects.UnselectAll()
scriptcontext.doc.Objects.Select( obrefs )
Rhino.RhinoApp.RunScript( '_Join', True )
main()
Sembra funzionare alla grande… Grazie @emilio
Ora bisogna solo fare superfici buone da unire ![]()
Ho presente …
![]()
C’è un piccolo problema:
Lo script funziona benissimo, ma se esplodo il solido poi non riesco più cambiare il colore degli oggetti.
In wireframe cambia il colore dei bordi, ma non delle parametriche.
Prova se questo funziona …
![]()
import Rhino
import System
import scriptcontext
def main():
res, obrefs = Rhino.Input.RhinoGet.GetMultipleObjects(
'Oggetti per resettare il colore ?', True,
Rhino.DocObjects.ObjectType.Surface |
Rhino.DocObjects.ObjectType.Brep )
if res != Rhino.Commands.Result.Success:
return
for obref in obrefs:
rep = obref.Brep()
faces = list( rep.Faces )
for face in faces:
face.PerFaceColor = System.drawing.Color()
scriptcontext.doc.Objects.Replace( obref, rep )
main()

Ah, si’ … scusa.
la “D” va maiuscola:
Drawing
Questa tastiera ogni tanto mi frega … ![]()
Riesci a correggerlo tu ? ![]()
Cambiata, ma si presenta un altro problema

Allora proverei cosi’:
import Rhino
import System
import scriptcontext
def main():
res, obrefs = Rhino.Input.RhinoGet.GetMultipleObjects(
'Oggetti per resettare il colore ?', True,
Rhino.DocObjects.ObjectType.Surface |
Rhino.DocObjects.ObjectType.Brep )
if res != Rhino.Commands.Result.Success:
return
for obref in obrefs:
rep = obref.Brep()
faces = list( rep.Faces )
for face in faces:
face.PerFaceColor = System.Drawing.Color.Empty
scriptcontext.doc.Objects.Replace( obref, rep )
main()
![]()
Funziona benissimo, ma siamo proprio dei pollastri
![]()
La soluzione ce l’aveva fornita @lucio_zadra qualche risposta più su: RemovePerFaceColors