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 …
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
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 …
Secondo me con la geometria non vai lontano senza vettori.
L’ho detto prima:
Sempre parlando di un cerchio con asse verticale