Solidi multicolore

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?

1 Mi Piace

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()
1 Mi Piace

Porca :poop: , l’ho cercato 100 volte e non lo trovavo… Grazie 1000

1 Mi Piace

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. :smile:
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 … :wink:

EDIT

Confermo.
Anch’io lavoravo quasi sempre in wireframe e il wireframe delle estrusioni e’ … deprimente. :wink: :smile:

immagine

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. :blush: 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()
1 Mi Piace

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 … :confused:

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()
2 Mi Piace

Sembra funzionare alla grande… Grazie @emilio
Ora bisogna solo fare superfici buone da unire :sweat_smile:

1 Mi Piace

Ho presente …
:smile:

1 Mi Piace

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 … :confused: :wink:

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

immagine

1 Mi Piace

@depaoli.thomas

Ah, si’ … scusa.
la “D” va maiuscola:

Drawing

Questa tastiera ogni tanto mi frega … :disappointed:

Riesci a correggerlo tu ? :slight_smile:

Cambiata, ma si presenta un altro problema

immagine

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

:crossed_fingers:

1 Mi Piace

Funziona benissimo, ma siamo proprio dei pollastri :rofl: :joy:
La soluzione ce l’aveva fornita @lucio_zadra qualche risposta più su: RemovePerFaceColors

1 Mi Piace