Ciao a tutti, avrei bisogno di un aiutino per uno script, con rhinocommon faccio veramente a pugni e vince sempre lui
Vorrei fare uno script che semplicemente mi estrae un loop da una polisuperficie e mi restituisca l’ID della curva creata per operazioni future possibilmente.
Il massimo che ho fatto scopiazzando e smanettando è questo:
if go.Get()!=Rhino.Input.GetResult.Object: return
objref = go.Objects()
print len(objref)
segments=[]
for i in objref:
seg=i.Curve()
segments.append(sc.doc.Objects.AddCurve(seg))
sc.doc.Views.Redraw()
print segments
GetBrepEdgeLoop()
Vabbè, manco so come copiare e incollare un po’ di codice sul forum che si capisca
Per formattare devi inserire prima dello script una linea contenente:
3 backticks poi uno spazio, poi la parola python
e dopo lo script una linea con i soli 3 backticks
``` python
# qui c’e’ lo script
```
… Per il resto, sto cercando di capire perche’ disegna solo una curva …
Comunque non credo che il metodo Get() consenta di ricavare una lista di oggetti.
Ma ho provato anche con GetMultiple() e non cambia niente.
In effetti, pensandoci, credo che ci vorrebbe una logica apposta per poter ricavare una lista di oggetti da una singola selezione con GetObject …
A meno che ci sia da settare qualcosa da qualche parte …
EDIT
Aggiungo qui quello che volevo dire in un nuovo messaggio, ma il dio discourse mi proibisce 4 risposte consecutive … lui tutto sa e tutto puo’ … meno che farsi furbo …
Ecco il messaggio:
Ho dato un’occhiata in fretta, forse faccio confusione …
Dalla Brep ricavi i Loop
Da un Loop ricavi i Trim e dal Trim ricavi l’Edge,
quindi puoi vedere se un Loop contiene un certo Edge
Dall’ObjRef ricavato da GetObject, chiama Edge() invece di Curve(),
cosi’ hai l’Edge e puoi vedere il suo EdgeIndex
Grazie Emilio, come sempre gentilissimo e disponibile.
Il fatto che all’inizio lanciando lo script ti mostrasse come selezionato l’intero loop mi faceva ben sperare.
Ma che senso ha un comportamento del genere, che differenza fa con l’edge a questo punto?
Certo è che per me RhinoCommon per me è arabo, forse dovrei dedicargli un po’ più di tempo…che non ho.
Ciao Giuseppe, buon anno anche a te!
Non capisco, il codice che hai messo lo devo inserire in qualche punto del “mio” script?
Perchè a me così com’è non restituisce niente.
Ah ok, ora ho capito un po’ meglio, però a me funziona solo per le superfici, per un parallelepipedo non funziona. Però estrae tutti i bordi, a me interessa solo un loop, se una superficie ha uno o più fori ad esempio mi duplicherebbe sia i bordi esterni che i bordi del foro.
No non funziona per un parallelepipedo perchè non ha bordi aperti. Funziona su superfici e polisuperfici per le quali vuoi duplicare i bordi (aperti). Se vuoi tutti i bordi di una polisrf il procedimento da usare poi nello script è di selezionare, esplodere, duplicare tutti i bordi di tutto, esplodere le curve, selezionare i duplicati (immagina che a ogni spigolo del parallelepipedo di esempio ci sono due linee sovrapposte) e buttare i duplicati.
Fantastico Emilio, lo script sembra molto promettente solo deve essere un po’ perfezionato, credo. Ho fatto una prova: disegnato un semplice parallelepipedo e poi ho lanciato lo script, ho cercato di estrarre il loop della faccia superiore, ma mi estrae sempre il loop della faccia verticale che ha l’edge in comune a quello che ho cliccato per estrarre il loop voluto.
strano a me pare funzioni bene, se l’intendo, da quello che ho capito sarebbe di estrarre i bordi da una superficie e restituire ID per ognuno di quest’ultimi.
quando selezioni il bordo, devi poi scegliere quale faccia della superficie estrarre le curve
ps
for treem in loop.Trims:
segments.append( sc.doc.Objects.AddCurve( treem.Edge ) )
print segments
prova a sostituire “print segments” con:
for treem in loop.Trims:
segments.append( sc.doc.Objects.AddCurve( treem.Edge ) )
for id in segments:
print id
così facendo id delle curve, vengono elencati uno per riga. quindi meno difficile sbagliarsi.
Tra l’altro credo sia da controllare se al Trim corrisponde un Edge, perche’ credo ci siano anche i Trim singolari (senza nessun Edge).
Per il problema della scelta della faccia … mah, forse si potrebbe scegliere prima la faccia … e poi cercare un modo per utilizzare questa informazione …
Ci sono riuscito!!!
E’ bastato mettere un riferimento alla faccia (non so di preciso come ho fatto ma smanettando a volte si imbrocca).
Grazie mille a tutti, senza di voi sarei ancora distante anni luce!
import Rhino
import scriptcontext as sc
import rhinoscriptsyntax as rs
def GetBrepEdgeLoop():
msg="Select Brep Edge"
go = Rhino.Input.Custom.GetObject()
go.SetCommandPrompt( msg )
go.GeometryFilter = Rhino.DocObjects.ObjectType.BrepLoop
go.AcceptNothing( False )
if go.Get() != Rhino.Input.GetResult.Object: return
objref = go.Object( 0 )
edge = objref.Edge()
face = objref.Face()
index = edge.EdgeIndex
brep = edge.Brep
for loop in face.Loops:
for trim in loop.Trims:
if trim.Edge.EdgeIndex == index:
segments = []
for treem in loop.Trims:
segments.append( sc.doc.Objects.AddCurve( treem.Edge ) )
curve=rs.JoinCurves(segments,True)
return curve
sc.doc.Views.Redraw()
a=GetBrepEdgeLoop()
print a