Addpipe con osnap quad

un saluto a tutti,
ho un semplice script che mi crea un Pipe e con osnap Quad mi seleziono la isocurva da estrarre
mi chiedevo se fosse possibile (selezionando ovviamente il lato dove si desidera l’isocurva)
indicare il punto preciso del Quad senza andare a cliccare l’estremità della curva?

Ciao Salvio

Se ho capito, vuoi ricavare un punto Quad su un cerchio automaticamente.

Se non sbaglio il calcolo dei punti dipende dall’orientamento del cerchio.
Nel piano XY Rhino cerca le tangenti parallele agli assi X e Y.
Se invece il cerchio non appartiene al piano XY, cerca le tangenti orizzontale e verticale …
Ma posso sbagliare …

Sai gia’ come sara’ orientato il cerchio in questione ?

ciao Emilio

in pratica il tutto viene svolto nella vista “Superiore” quindi dovrebbe essere il piano XY
detto ciò non so quali comandi usare per ottenere in automatico isocurva desiderata
io fino adesso clicco sul comando si avvia il pipe poi extisocrv e clicco sul quad voluto

avevo pensato una cosa tipo come offset cliccando su un lato il comando segue quella direzione

come faccio a fare ciò?

rs.ExtractIsoCurve() ?

I parametri li ottieni da rs.GetSurfaceObject()

Cosi’ ricavi il cerchio.

Ammettendo che il cerchio sia parallelo al piano XY …
Parti dal centro del cerchio e aggiungi (o togli) il vettore asseX moltiplicato il raggio
Stessa cosa per la Y

Se vuoi puoi usare rs.VectorAdd() e rs.VectorScale()

Una volta ottenuto il punto Quad, usi di nuovo rs.ExtractIsoCurve()

Con i parametri da rs.SurfaceClosestPoint()

Credo sia piu’ semplice lavorare direttamente con le coordinate.
A quelle del centro aggiungi o togli il raggio sulla X o sulla Y

grazie per le risposte Emilio

si fino a rs.ExtractIsoCurve() ci ero arrivato

Dim objCrv
objCrv = Rhino.GetObject("Selezionare Curva", 4)
If IsNull(objCrv) Then Exit Sub

Dim pntStr, pntEnd
pntStr = Rhino.CurveStartPoint(objCrv)
pntEnd = Rhino.CurveEndPoint(objCrv)
	
Dim t(1)
t(0) = Rhino.CurveClosestPoint(objCrv, pntEnd)
t(1) = Rhino.CurveClosestPoint(objCrv, pntStr)

Dim l(1)
l(0) = 10
l(1) = 30

Dim pntFnl
pntFnl = pntStr
pntFnl = pntEnd
Rhino.AddPoint pntFnl

Rhino.AddPipe objCrv, t, l
Dim trash: trash = Rhino.FirstObject
Rhino.ExtractIsoCurve trash, Rhino.SurfaceClosestPoint(trash, pntFnl), 0
Rhino.DeleteObject trash

stavo facendo delle prove e vorrei capire come mai e per quale “misterioso motivo” nella curva piccola usando come punto “inizio curva” o “fine curva” il risultato cambia, mentre in quella grande viene estrapolata sempre la stessa isocurva?
ps anche se funzionasse in entrambi i casi, credo che non sia un metodo giusto.
la vedo strana sta cosa o sbaglio?
pipe.3dm (21,3 KB)

A me sembra che chiedi il closest point per una mesh di un punto sul suo asse.
Non capisco che senso ha …

Oppure non capisco cosa fa lo script … :confused:

beh adesso mi sta dando i problemi che immaginavo che doveva dare
ho cambiato la distanza che avevo impostato ed in effetti la curva piccola dove prima veniva estratta la isocurva in entrambe le direzioni adesso cambia la direzione ma non nella direzione opposta

e vabbè cmq meglio guardare avanti chissà all’epoca cosa intendevo fare :smile:
ho rivisto il comando dopo le tue osservazioni ho apportato delle correzioni:

Dim objCrv
objCrv = Rhino.GetObject("Selezionare Curva", 4)
If IsNull(objCrv) Then Exit Sub

Dim arrPar
arrPar = Rhino.CurveDomain(objCrv)

Rhino.AddPipe objCrv, arrPar, Array(5, 10)

Dim trash
trash = Rhino.FirstObject

Call Rhino.ExtractIsoCurve(trash, Rhino.SurfaceClosestPoint(trash, arrPar), 0)
Rhino.DeleteObject trash

ora dovrebbe andare bene, partendo da qui: (volendo evitare i vettori)
iniziando dal centro come faccio a trovare le tangenze degli assi XY?

ps ora che ci ripenso i ClosestPoint se invece di indicare inizio e fine della curva aggiungi GetPointOnCurve ha la funzione di creare un pipe con le distanze inserite nei due punti in cui si clicca sulla curva
in pratrica ti trovi con un offset variabile della curva avendo già la curva spezzata e con le misure volute.
(credo che sia una cosa da tenere presente per lo meno io la vedo una funzione utile)

ed:
ma con AddPipe sono obbligato ad usare il comando FirstObject o c’è un’altro modo?

Questo mi sembra strano:

e poi

Setti arrPar col dominio della curva
e poi lo usi come un punto … :confused:

Secondo me con la geometria non vai lontano senza vettori.

L’ho detto prima:

Sempre parlando di un cerchio con asse verticale