Rhino Fillet e RCommon Fillet

in Rhino usando il comando Fillet su due curve lineari disposte parallelamente a 20 di distanza
con il suddetto comando impostato a 10, il comando mi ritorna questo messaggio:

Impossibile raccordare le curve tramite fillet. L’angolo di raccordo è troppo piccolo.

oppure viceversa se imposto il comando con un numero maggiore di 10, torna questo messaggio:

Impossibile raccordare le curve tramite fillet. È probabile che il raggio del raccordo sia troppo lungo o che le curve non si trovino sullo stesso piano in prossimità del raccordo.

in entrambi i casi il raccordo non viene creato.

sto facendo alcune prove usando in RCommon con Rhino.Geometry.Curve.CreateFillet
ma non riesco ad intercettare il ritorno di errore, sembra che comunque il risultato sia corretto
anche se in effetti la curva non venga creata

mi chiedo che logica usa Rhino per il suo comando,
che ritorna le differenze tra una curva riuscita e i due casi sopra?

Puoi raccordare con _ArcBlend.

ciao Leopoldo,

il problema che vorrei risolvere, non’é il raccordo in se per se,
ma essendo che, nell’eseguire un codice script mi servirebbe,
scindere quando il comando ritorna la curva e quando no.

ps
ho dimenticato una precisazione:
in pratica il codice l’ho già inserito in un try / except,
ma come dicevo l’eccezione non viene mai richiamata.

Con RhinoCommon potresti usare questo:

Arc Constructor (Point3d, Vector3d, Point3d) (mcneel.github.io)

Stai parlando di costruire la curva con RhinoCommon, ad esempio col metodo linkato sopra ?

O usi RhinoCommon solo per lanciare un comando interattivo di Rhino con questo metodo ?
RhinoApp.RunScript Method (String, Boolean) (mcneel.github.io)

Il modo per controllare il risultato cambia.

ciao Emilio,

come detto nel primo post sto usando il metodo CreateFillet che dovrebbe essere quello di questo link:

essendo che come input ho due curve che in questo caso sono lineare.

usando invece il metodo da te linkato, non utilizza le curve, quindi un approccio totalmente differente.

Ah, si’ … scusa, non avevo memorizzato …:blush:

La documentazione dice:

Return Value

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

Quindi quando fallisce restituisce Arc.Unset.
Tu verifica quello e sei a posto. :grinning:

eeee il problema e che non riesco a far restituire Arc.Unset
però comunque il Fillet non viene creato questa cosa mi sfugge

Guarda la cosa dal punto di vista geometrico.
Per ottenere il fillet basta trovare il punto di intersezione e la bisettrice tra le due linee per poi risolvere il triangolo rettangolo.
Se le linee sono parallele evidentemente questo non si può fare.
Forse un errore del genere non è previsto per cui non c’è la risposta che vorresti.
Salvo errori ed omissioni.

Cosa restituisce ?

errore nessuno, se faccio un print mi torna Rhino.Geometry.Arc
quindi presumo che secondo lo script l’arco sia stato creato
io ho messo un print di verifica sia nel try che nel except
ma mi parte sempre è solo il print all’interno del try.

ok anche se fosse come dici, ritornando al mio esempio iniziale,
in Rhino il comando però oltre alla buona riuscita del comando
quando crea una curva, ritorna anche due messaggi
nel caso i raggi del Fillet siano maggiori o minori. . .

quindi per questo dicevo, quale sia il ragionamento che sta dietro a questi due messaggi?

detto questo, però ragionando su quanto hai detto forse ci sarebbe una possibilità,
e cioè quella prima di eseguire il Fillet, verificare prima la possibile intersezione
delle due curve lineari, in modo che, se questo non avviene il comando fallisce.

mah. . . credo che non sia una cattiva soluzione come verifica, vedo se è fattibile :+1:

Non capisco, se crea l’arco, qual e’ il problema ? :slight_smile:

Restituisce l’oggetto arc ma si deve verificare se impostato "unset.

1 Mi Piace

no l’arco non lo crea

ciao Sergio,

in che senso, verificare se impostato unset?

Prova con la proprietà isvalid

funziona :+1:

Sergio ti ha gia’ detto il modo piu’ semplice.

Ma anche un normale controllo di uguaglianza funziona

crv = Curve.CreateFillet( ... ... ...
print( crv == Rhino.Geometry.Arc.Unset )

Credevo che avessi controllato, in un modo o nell’altro, visto che dicevi di non ottenere Arc.Unset come risultato …

Comunque in qualche modo abbiamo risolto, anche senza riuscire a vedere lo script …

1 Mi Piace
import Rhino as rh
import scriptcontext as sc

def Def():
    go = rh.Input.Custom.GetObject()
    go.DisablePreSelect()
    go.AcceptNothing(False)
    go.EnablePreSelect(False, True)
    go.DeselectAllBeforePostSelect = True
    
    go.SetCommandPrompt("Select Curve")
    
    go.Get()
    if go.CommandResult() != rh.Commands.Result.Success: return go.CommandResult()
    
    crv0 = go.Object(0).Curve()
    if not crv0: return
    print crv0
    
    go.Get()
    if go.CommandResult() != rh.Commands.Result.Success: return go.CommandResult()
    
    crv1 = go.Object(0).Curve()
    if not crv1: return
    print crv1
    
    rcc = rh.Geometry.Curve.CreateFillet(crv0, crv1, 12, 0, 0)
    print rcc
    sc.doc.Objects.AddArc(rcc)
    
    return

Def()

non mi era stato chiesto prima, anche perché inizialmente credevo che bisognava andare a capire il funzionamento del comando di Rhino (che credo, sarebbe comunque una buona cosa conoscere)
il codice seleziona semplicemente due curve in questo caso le sto testando su curve lineari,
per poi eseguire il metodo Fillet sempre in RCommon. ora anche se le curve sono parallele
e quindi l’arco non viene creato, lo script non ritorna nessun errore anzi riporta come dicevo
la scritta Rhino.Geometry.Arc eseguendo un print come quando l’arco viene creato.

questa cosa la trovo strana, ripeto, comunque ancora non comprendo come fa il comando in Rhino
a differenziare i risultati, Emilio, magari col codice riesci a capirci qualcosa sul suo funzionamento.

ps
oltre alla soluzione di Sergio (che come detto funziona)
stavo provando anche come ottenere il punto di intersezione tra due rette
ma esisteva un metodo specifico per ottenere un’intersezione appartente?

Il comando non e’ pubblico.
Per noi c’e’ RhinoCommon e ci sono gli esempi.

Possiamo solo ragionarci per conto nostro.
Se dice:

Ci sara’ un controllo sull’angolo formato dalle curve … non so dove. :wink:

E se dice:

Ci sara’ un controllo sulle tangenti alle curve … non so dove. :wink:

… Per qualche motivo particolare ? :slight_smile:

Dipende cosa intendi per errore.
Il metodo CreateFillet resituisce il valore Arc.Unset
Potresti anche verificare cosa restituisce AddArc
Per questo la documentazione non aiuta.
Potrebbe essere Guid.Empty … o forse no, bisogna vedere in pratica.

Per forza.
L’oggetto restituito e’ sempre un Arc
Ma puo’ essere un arco vero e proprio, valido.
Oppure un oggetto con valore convenzionale per indicare che non c’e’ nessun arco, cioe’ Arc.Unset

Come abbiamo visto dalla documentazione, quel metodo funziona cosi’.
Poi ognuno ha le sue idee. A te puo’ benissimo sembrare strano.
Pero’ e’ fatto cosi’.
Se vuoi usarlo, tienine conto.

Come dicevo, potrebbe fare dei controlli preventivi.
Poi, come ti abbiamo detto, basta verificare il risultato del metodo.
Se e’ uguale a Rhino.Geometry.Arc.Unset, vuol dire che il comando non e’ riuscito a costruire l’arco.

Se hai due rette parallele, hai voglia a provare … :wink:
Per gli altri casi potresti usare questo:
Intersection.LineLine Method (Line, Line, Double, Double, Double, Boolean) (mcneel.github.io)

Vuoi dire guardando da una certa direzione ?
Io proietterei le rette sul piano normale …
( Non so se c’e’ qualcosa di gia’ fatto )

è quello che ho provato ieri ma nn capisco perché mi dava errore, comunque adesso ci riprovo. . .

appunto dico, sto provando con due rette parallele, non dovrebbe ritornare l’errore?
(cioè Rhino.Geometry.Arc.Unset)

comunque ho provato anche con altre situazioni ma Rhino.Geometry.Arc.Unset non mi è mai ritornato.

come verificare AddArc?

edit:
oltre alla proprietà IsValid consigliata da Sergio,
ho provato anche Length e Angle in entrambi i casi ritorna 0.0 se l’arco non viene creato