Estrai loop da Brep

Ciao a tutti, avrei bisogno di un aiutino per uno script, con rhinocommon faccio veramente a pugni e vince sempre lui :sob:
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:

import Rhino
import scriptcontext as sc

def GetBrepEdgeLoop():
msg=“Select Brep Edge”
go = Rhino.Input.Custom.GetObject()
go.SetCommandPrompt(msg)
go.GeometryFilter = Rhino.DocObjects.ObjectType.BrepLoop
#go.GeometryAttributeFilter=Rhino.Input.Custom.GeometryAttributeFilter.EdgeCurve
#go.SubObjectSelect = True
go.AcceptNothing(False)

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 :man_facepalming:

Ciao Federico

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

Mah … non vorrei che fosse proprio questo il comportamento di quell’ ObjectType.
Voluto o meno …

Forse conviene cercare un modo per ricavare tutte le curve del loop da una …

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

HTH … :confused: :wink:

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? :thinking:
Certo è che per me RhinoCommon per me è arabo, forse dovrei dedicargli un po’ più di tempo…che non ho.

Ciao Feder^ !!! Buon Anno.
Ma perché una roba facile come questa non va bene?

import rhinoscriptsyntax as rs

brep=rs.GetObject("seleziona superfi/polisuperf", rs.filter.surface | rs.filter.polysurface)
if brep: border=rs.DuplicateSurfaceBorder( brep )
print border

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.

Ciao

non è una banalità … non lo è nemmeno la struttura di una brep.

Mi spiace … non ho idea … :confused:

Eh, si’ … difficile ‘imparare’ RhinoCommon se non riesci a smanettarci un po’.

Comunque ho provato a metter giu’ quanto avevo accennato sopra.
La prima prova sembra che funzioni … poi non so … :smile:

import Rhino
import scriptcontext as sc

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()
  index = edge.EdgeIndex
  brep = edge.Brep
  for loop in brep.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 ) )
          print segments
        return
  sc.doc.Views.Redraw()
  print segments

GetBrepEdgeLoop()
1 Mi Piace

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.

ovviamente con l’autorizzazione di Emilio :wink:

Certo. :slight_smile:
E’ solo un tentativo.

Tra l’altro credo sia da controllare se al Trim corrisponde un Edge, perche’ credo ci siano anche i Trim singolari (senza nessun Edge). :confused:

Per il problema della scelta della faccia … mah, forse si potrebbe scegliere prima la faccia … e poi cercare un modo per utilizzare questa informazione … :confused:

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

Giusto !
Cosi’ eviti di ottenere un loop di un’altra faccia.

Bella soluzione ! :grinning: