Rhino Fillet e RCommon Fillet

E’ vero, sembra che l’arco restituito non sia valido, ma non sia nemmeno Arc.Unset
Strano.
Allora conviene usare IsValid.
Almeno, a me risulta cosi’ …

import Rhino
import scriptcontext
import System

def Def():
    go = Rhino.Input.Custom.GetObject()
    go.SetCommandPrompt("Select Curve 1")
    go.Get()
    if go.CommandResult() != Rhino.Commands.Result.Success: return go.CommandResult()
    crv0 = go.Object(0).Curve()
    if not crv0: return
    print crv0
    scriptcontext.doc.Objects.UnselectAll()
    go = Rhino.Input.Custom.GetObject()
    go.SetCommandPrompt("Select Curve 2")
    go.Get()
    if go.CommandResult() != Rhino.Commands.Result.Success: return go.CommandResult()
    crv1 = go.Object(0).Curve()
    if not crv1: return
    print crv1
    rcc = Rhino.Geometry.Curve.CreateFillet(crv0, crv1, 12, 0, 0)
    print rcc
    print rcc.IsValid
    print ( rcc == Rhino.Geometry.Arc.Unset )
    gid = scriptcontext.doc.Objects.AddArc(rcc)
    print gid
    print ( gid == System.Guid.Empty )
    return

Def()

Prova a postare lo script

Il risultato di createfillet dipende dai punti in cui si eseguono i click sulle
due curve.

rcc = Rhino.Geometry.Curve.CreateFillet(crv0, crv1, 12, 0, 0)

I due valori “0” hanno un significato preciso.

1 Mi Piace

ottima osservazione, comunque ho cambiato i valori dei parametri, ma i risultato sembra uguale

ho trovato soltanto questa risposta contenente la parola Arc.Unset
a quanto sembra, è una prerogativa delle geometrie di base
come spiega sono geometrie con valori non impostati
non ho idea a cosa si riferisca e come ottenere ciò.

    print crv1
    
    #rcc = rh.Geometry.Curve.CreateFillet(crv0, crv1, 12, 0, 0)
    #sc.doc.Objects.AddArc(rcc)
    
    rc = rh.Geometry.Intersect.Intersection.LineLine(crv0, crv1, 0.001, False)
    
    return

Def()

invece di utilizzare CreateFillet ho utilizzato Intersection.LineLine
sia con il parametro True che False, e anche solo le due curve come parametri
ma in tutti i casi mi torna errore: Message: expected Line, got PolylineCurve

da questo post:

dovrebbe essere questa la sintassi:

    
    ln0 = rh.Geometry.Line(rh.Geometry.Point3d(0, 0, 0), rh.Geometry.Point3d(20, 20, 0))
    
    ln1 = rh.Geometry.Line(rh.Geometry.Point3d(0, 100, 0), rh.Geometry.Point3d(20, 80, 0))
    
    rc = rh.Geometry.Intersect.Intersection.LineLine(ln0, ln1)
    
    print rc
    
    print ln0.PointAt(rc[1])
    
    return

Def()

e se capito bene, bisogna avere come input oggetti prettamente linea

Sergio ci ha detto dove. :grinning: Grazie !

… Non li avevo proprio guardati i parametri. :blush: :smile:

Certo, il tipo dei parametri e’ definito.
Non e’ rhinoscriptsyntax questo … :wink: :smile:

Funziona ? :grinning:

in questo modo si:

    ln0 = rh.Geometry.Line(crv0.PointAtStart, crv0.PointAtEnd)
    
    ln1 = rh.Geometry.Line(crv1.PointAtStart, crv1.PointAtEnd)
    
    rc = rh.Geometry.Intersect.Intersection.LineLine(ln0, ln1)
    
    print rc
    
    print ln0.PointAt(rc[1])
    
    return

eeee me ne sto accorgento, RCommon è pignoletto

infatti volevo convertire le polilinee in linee rette ma (per adesso) ho trovato solo il modo indicato sopra,
mi sembrava di ricordate un toconvert o qualcosa di simile, ma forse serviva a tutt’altra situazione.

edit:
e pure, un giorno riuscirò ad avere come ritorno Arc.Unset :smiley:

Hehe … se scrivi raggio 13 (ad esempio), vedi che restituisce Arc.Unset.
Cioe’ se il raccordo e’ impossibile, lui restituisce giustamente Arc.Unset

La cosa strana e’ quello che fa con raggio 12
Ho provato a stampare alcuni valori dell’arco

    print rcc
    print rcc.IsValid
    print rcc.Plane
    print rcc.Radius
    print rcc.StartAngle
    print rcc.Angle
    print ( rcc == Rhino.Geometry.Arc.Unset )

e a me risulta che trova l’arco giusto.
Solo che non lo considera valido, ma non so perche’ …

Arc.Unset come valori nel piano e come raggio ha il valore convenzionale ‘meno infinito’, almeno cosi’ mi sembra.
Mentre per gli angoli ha zero:

Origin=-1.23432101234321E+308,-1.23432101234321E+308,-1.23432101234321E+308 XAxis=-1.23432101234321E+308,-1.23432101234321E+308,-1.23432101234321E+308, YAxis=-1.23432101234321E+308,-1.23432101234321E+308,-1.23432101234321E+308, ZAxis=-1.23432101234321E+308,-1.23432101234321E+308,-1.23432101234321E+308
-1.23432101234e+308
0.0
0.0

No, aspetta.
Per qualche motivo il piano dell’arco ha i vettori Y e Z nulli.
E’ quello che impedisce di costruire/disegnare l’arco.
EDIT :
Forse usa il CrossProduct delle tangenti …
( semplice ipotesi, eh )

mi fa piacere che sei riuscito ad approfondire la questione,
però stavola sono io che senza esempi non riesco a seguire. . .

:thinking:

:thinking: :thinking:

ci penserò sopra.

edit:

ma parli utlizzando le due linee rette parallele? perché a me torna sempre Rhino.Geometry.Arc
ho cambiato vari valori ma non sono mai riuscito ad ottenere Arc.Unset

ps forse ho capito quello che intendi è tornare True da print ( rcc == Rhino.Geometry.Arc.Unset )
in questo caso si, ma adesso mi spiazzi, perché come mi tornava Rhino.Geometry.Arc
sul print di rcc io mi aspettavo Rhino.Geometry.Arc.Unset sempre sul print di rcc
e vabbè che dire se la verifica è sul True/False allora hai trovato la sintassi corretta :+1:

mi sembra di capire, che i 3 assi del piano cambia da dove si clicca sulle due linee rette

Returns:
The fillet arc on success, or Arc.Unset on failure.

comunque sia con Arc.Unset mi aspetterei che il comando fallisca come appunto viene indicato
e quindi in questo caso richiamare except del try mentre invece ciò non accade.

Non pretendere troppo da print.
Lui si limita a stampare la classe dell’oggetto, non va a esaminare se per caso e’ un valore particolare. Ci vorrebbe una funzione apposita per una cosa del genere.
Arc.Unset e’ un oggetto della classe Rhino.Geometry.Arc e lui quello ti dice.

Lo avevamo detto anche prima, ma non ci hai fatto caso. :slight_smile:

Quello che viene indicato e’ che quando l’operazione geometrica fallisce, il metodo restituisce Arc.Unset.
Non dice nient’altro.
Perche’ dovrebbe anche attivare una eccezione ?
A cosa servirebbe ? :slight_smile:
C’e’ gia’ il valore resituito che ci dice se funziona o se fallisce.

Se stampi il piano (con raggio 12), ottieni una cosa del genere:

Origin=-50,38,0 XAxis=0,1,0, YAxis=0,0,0, ZAxis=0,0,0

Ovviamente l’origine dipende da dove sono disegnate le due linee, ma l’origine e’ al posto giusto.

Emiliooooo. . .

    rcc = rh.Geometry.Curve.CreateFillet(crv0, crv1, 10, 0.2, 1)
    sc.doc.Objects.AddArc(rcc)

con questi parametri mi ha creato l’arco da due rette parallele ahahahah

assurdo :exploding_head: :exploding_head:

a me questo risultato lo da con raggio 10 mah. . .

1 Mi Piace

I parametri, come li chiami tu, sono le coordinate parametriche “corrispondenti” ai punti delle
rispettive curve dove sono state “virtualmente” selezionate. Questo consente al programma di
restituire tra tutti i raccordi possibili il raccordo più prossimo alla tua “selezione”.

E’ una convenzione interna: se la variabile riporta quel preciso valore si considera
non inizializzata. Il metodo Unset restituisce un arco non inizializzato.

Utilizza il metodo IsValid per verificare se CreateFillet è andato a buon fine.

if not rcc.IsValid: return

Il metodo restituisce errore perché richiede Line e non PolyLineCurve.

1 Mi Piace

Avevo visto che nel tuo script il raggio era 12 …

… quindi ho usato due linee a distanza 24.
Se usi linee distanti 20, il raggio sara’ 10.

:+1:

esatto, ma col termine parametro mi riferivo a ciò che richiedono i metodi
che poi in questo caso specifico come dici sono le coordinare parametriche.

infatti usavo il pulsante polyline però credevo che cliccando solo due punti mi tornava una line
e invece se uso il comando polyline, anche con un solo segmento mi specifica che si tratta di polyline
(mea culpa)
però adesso ho provato col comando line, e comunque il metodo non va a buon fine
<Rhino.Geometry.LineCurve object at 0x000000000000003E [Rhino.Geometry.LineCurve]>
anche se come appena indicato sopra riporta proprio Rhino.Geometry.LineCurve
preciso che questa differenza la fa Python/RCommon perché in Rhino
anche se uso il comando polyline creando un solo segmento
nei dettagli delle proprietà la vede in entrambi i casi come line

in pratica RCommon differenzia tra Geometry.LineCurve e Geometry.Line
mmmm coi comandi Rhino bisognerebbe ottenere una Geometry.Line e non Geometry.LineCurve

eeee Emilio ma non credo sia una cosa buona per quanto si è detto fin’ora, da quello che ho capito. . .

:confused: :confused:

a quanto pare creando una linea, un segmento o qualsiasi altra retta in Rhino
in Python/RCommon comunque mi ritorna una LineCurve
in pratica per RCommon una Geometry.Line
viene dato soltando indicado i due punti

(per lo meno con le prove da me fatte)

1 Mi Piace

Sono due classi diverse, anzi in C# Line non e’ nemmeno una classe ma una Struct.

Cosi’ poi devi avere due serie di comandi separati, una per le linee e una per le curve.
No, no … Meglio cosi’. :smile:

Semplicememnte, se vuoi una Line, te la costruisci in RhinoCommon.
Se vuoi la ricavi da una linea (LineCurve) disegnata con i comandi Rhino.
Puoi usare le proprieta’ PointAtStart e PointAtEnd derivate da Curve.

Purtroppo non condivido la tua passione per indagare i casi limite. :blush:

C’e’ il metodo CreateFillet, c’e’ la proprieta’ IsValid per controllare il risultato.
A me basta. :slight_smile:

io fino a poche ore fa, non sapevo nemmeno che si facesse questa differenza
io credevo che una linea o segmento fosse una semplice linea e non una lineacurva

Emilio, in verità non sono io che li cerco, ma sono loro che mi trovano sempre ahahahah
io ne farei proprio a meno, anzi mi piacerebbe tanto che non ci fossero tutti questi dettagli.

giusto per completezza a proposito del metodo CreateFillet, che come dici ha la proprietà IsValid,
ieri ho detto che con quelle impostazioni di parametri crea una curva su due linee rette parallele,
questo è vero (adesso ho riprovato) però solo se le due rette hanno una certa lunghezza
altrimenti l’arco non viene creato, e IsValid riporta True anche con due rette parallele.
(io rimango del parare che con due rette parallele il raccordo non dovrebbe avvenire)

ps Emilio, per caso hai anche provato ad eseguire il print ( rcc == rh.Geometry.Arc ) ?
a me qui mi ritorna False in entrambi i casi, insieme al print ( rcc == rh.Geometry.Arc.Unset )