Linea perpedicolare

un saluto a tutti,

dovrei ritrovarmi con una linea perpendicolare tra due rette:
le rette vengono selezionate e la retta di partenza viene divisa e da un punto
della divisione inizia la linea che deve finire perpendicolarmente alla retta finale

c’è un bel comando in Rhino “Perpendicolare 2Curve” solo che
dovrebbe già sapere da quale punto partire dalla prima linea…

riflettendo sul comando sopra citato sono giunto a questa conclusione:
dopo aver selezionato le due rette ed indicato il punto sulla prima retta
dal punto si crea un cerchio (che viene generato perpendicolarmente)
all’intersezione del cerchio con la seconda retta quello è il punto finale.

chiedo un vostro parere sapete finisce che esiste già un comando
o un modo migliore è più semplice mi risparmio di complicarmi la vita :slight_smile:

Vuoi dire che decidi tu il punto iniziale ?
( Nel caso generale c’e’ una sola linea perpendicolare a due rette
e puo’ partire da un punto solo )

esatto emilio il punto viene impostato dalla divisione della retta
esempio: sel1crv “partenza” - dividi1crv in 3 - sel2crv "destinazione"
e dal punto 1 della divisione parte la perpendicolare per la 2crv

le rette sono parallele forse non l’ho specificato sorry
in teoria dovrebbero avere una perpendicolare
per tutta la loro lunghezza

che pensi la mia soluzione è la strada giusta?

OK
Io proverei con rs.CurveClosestPoint()
Dandogli il punto iniziale e la retta, dovrebbe trovare il punto finale …

EDIT:

Vedo che c’e’ anche rs.LineMinDistanceTo() … che credo faccia la stessa cosa

Emilio visto che a volte anche parlarne soltanto ci accende la lampadina…
inizialmente le prove le avevo fatte con CurveClosestPoint e GetPointOnCurve
poi ho postato la domanda e dopo la il tuo esempio con LineMinDistanceTo
mi è venuto in mente di fare una prova con _ClosestPt e credo che è proprio lui

infatti chiede una destinazione “curva (tutta)” e un "punto (partenza)"
ti faccio sapere come è andata :slight_smile:

ok perfetto Emilio li ho provati in tutti i modi:
in Rhino il comando “_ClosestPt” e anche in VBScript e Python con “CurveClosestPoint”

EDIT: sto facendo prove
mi si era spento il PC senza salvare e mi ricordavo del comando "CurveClosestPoint"
EDIT: correzione

il comando è “PointClosestObject” quindi:
in Rhino il comando “_ClosestPt” e anche in VBScript e Python con “PointClosestObject”

PS nel frattempo cercando di nuovo il comando giusto: "PointClosestObject"
ho trovato un esempio anche un’altro comando "LineBetweenCurves"
ma se non erro in Pyton non c’è nella guida . . . .

a ecco in grasshopper il componente che stavo provato era "CurveClosestPoint"
per questo dopo che ho perso i dati ero andato a cercare quel comando
fatto sta che il coponente sopra citato funziona, solo che mi servirebbe
tramite script Python e come sempre ecco li problema del messaggio:
“Runtime error (NotImplementedException): The method or operation is not implemented.”

infatti avevo pensato in GhPython di importare il componente è gestirlo in GhPython
ho visto sul web questo esempio : “from Grasshopper import DataTree"
in teoria si potrebbe usare anche per tutti i componenti e quindi per
"CurveClosestPoint” giusto? qualche esempio in merito? grazie…

Ciao Salvio

Quindi ti serve farlo in uno script di GH.

Qual’e’ il codice che ti da’ l’errore ?

ciao Emilio
il comando è “PointClosestObject” e il codice è esattamente quello della guida F1

come spiegavo nel post il comando fa già quello che mi interessa sia in VBScript che in Python
inserisco il codice dalla guida nel componente in GhPython è mi da quel messaggio di errore

esatto Emilio sto cercando fin quanto è possibile fare, gestire tutto in un solo componente GhPython
quindi attualmente faccio prima le prove e passo il codice in GhPython cosi faccio anche un pò di pratica :slight_smile:

Come noiosamente ho gia’ avuto modo di ripetere …
Io sono stupido, se discutiamo in astratto ho dei seri problemi …
( E comunque credo sia una regola generele del forum:
quando posti un problema, lo devi mostrare chiaramente.
In caso di script, perlomeno postare il codice … POSTARE …
non raccontarlo … :wink: )
Tra l’altro in non trovo il comando PointClosestObject
ne’ come funzione rhinoscriptsyntax, ne’ come comando Rhino …
forse mi e’ sfuggito, comunque non ho ancora capito di cosa stiamo parlando …
Stando cosi’ le cose … sara’ meglio che aspetti risposte su questo
problema da qualcuno piu’ sveglio del sottoscritto.
E in effetti sarebbe meglio anche per te avere una risposta piu’ veloce … cosi’ non facciamo la solita
sequenza di una dozzina di domande e risposte prima di individuare il problema. :wink:
Mi ricordi una professoressa, forse alle medie …mah, che diceva piu’ o meno:
"Le cose le sai, ma bisogna tirartele fuori con le pinze ! "
:rofl:

CIao :slight_smile:

questo è il codice del comando “PointClosestObject” in Python

import rhinoscriptsyntax as rs

objs = rs.GetObjects(“Select target objects for closest point”, 63)

if objs:

point = rs.GetPoint("Test point")

if point:

    results = rs.PointClosestObject(point, objs)

    if results:

          print "Object id:", results[0]

          rs.AddPoint( results[1] )

non l’ho avevo postato perchè è già disponibile nell’help e non era farina del mio sacco

py2

in python il codice funziona mentre nel componente GhPython da l’errore:

PS la prossima volta cercherò di dare ulteriori dettagli, grazie anche per la pazienza Emilio

Hehe … anche tu non scherzi come pazienza visto che non mi hai ancora mandato … a usare Autocad …
:smile:

Hai ragione a dire che la funzione rhinoscriptsyntax c’e’ … io purtroppo qui non la vedo …
mi tocca usare una vecchia SR di Rhino 5 …

Suppongo che tu stia usando il 6, con una versione di rhinoscriptsyntax aggiornata
Forse il problema e’ sempre li’ … probabilmente GHPython usa una versione di rhinoscriptsyntax diversa,
che non e’ ancora stata aggiornata …

Sono solo supposizioni … ma per ora non ho altre idee …

P.S.

Dall’esempio che hai postato, mi sembra che PointClosestObject() serva a trovare l’oggetto piu’ vicino ad un punto dato.

Se non sbaglio per il tuo problema basterebbe usare LineClosestPoint()

( Invece LineMinDistanceTo(), a cui avevo accennato in precedenza … non serve … ho finalmente capito cosa fa … e cosa non fa … sorry )

Oppure hai un motivo particolare per usare PointClosestObject() ?

la versione di Rhino è la V5 mentre per Grasshopper è 0.9.0076

ritornando ai codici adesso sei tu che dovrai esere più dettagliato
essendo che sia LineMinDistanceTo() che LineClosestPoint()
io li ho provati e nessuno dei due fanno ciò che mi serve

non so se lo hai provato il codice che ti ho postato prima ma se lo fai
vedrai come funziona e la differenza con quelli che mi hai suggerito
PS comunque non ho nessuna preferenza se funziona in GhPython per me va bene

Tu hai due rette, vero ?
Ma sono rette ‘teoriche’, cioe’ hai un punto e una direzione (o due punti) ?
O hai degli oggetti Rhino, con i suoi bravi Guid ?

Perche’ LineClosestPoint() serve nel primo caso
Nel secondo invece CurveClosestPoint()

A seconda dei dati di partenza, vediamo come procedere … (almeno spero … :smile: )

Sai già come farlo manualmente? Se sei in grado di farlo manualmente il problema è già risolto . Nello script devi ripetere le operazioni che hai fatto manualmente.
Vittorio

ok ci sono riuscito anche in GhPython

import rhinoscriptsyntax as rs

CrvD=rs.GetObject()

CrvP=rs.GetObject()

Div=rs.DivideCurve(CrvP,3)[2]

Vic=rs.CurveClosestPoint(CrvD, Div)

rs.AddPoint(rs.EvaluateCurve(CrvD, Vic))

inizialmente avevo provato con “CurveClosestPoint” ma mi dava un risultato parametrico, essendo
che l’ho usato sempre insieme ad “GetPointOnCurve” non mi era mai capitato questa cosa e non
sapevo come trasformarlo in un Array punto ma avevo subito rimediato con “PointClosestObject”
nel frattempo Emilio mi aveva anche lui consigliato “CurveClosestPoint” ma io ormai optavo per la
seconda scelta rivelatasi non idonea per GhPython. dopo le mie numerose spiegazioni per ciò che
mi serviva fare notando che Emilio insisteva sempre con “CurveClosestPoint” e quindi poco fa sono
andato ad approfondire il discorso ed è bastato abbinarlo con “EvaluateCurve” è funziona anche in GH

PS in pratica “PointClosestObject” sarebbe la combinazione di “CurveClosestPoint” e "EvaluateCurve"
grazie a Vittorio per il suo intervento e grazie ad Emilio per la pazienza e per avermi anche spronato :slight_smile:

… non ho fatto in tempo … hai gia’ fatto da solo …
Ottimo ! :slight_smile:

Gia’ che ci sono, se ti interessasse una via alternativa … ,
proviamo anche con LineClosestPoint(),
che vuole la linea come lista di due punti:

Eeeh … non solo ! :wink:

CrvD=rs.GetObject()

CrvP=rs.GetObject()
Div=rs.DivideCurve(CrvP,3)[2]

pnt = rs.LineClosestPoint( 
    [ rs.CurveStartPoint( CrvD ), rs.CurveEndPoint( CrvD ) ],
    Div )

rs.AddPoint( pnt )

Qui non serve EvaluateCurve(), ma bisogna ricavare la linea dalla curva … :slight_smile:

eeee Emilio sta volta ti ho preceduto ahahahah infatti questo prima avevo pensato:
ma se alla fine Emilio aveva capito quello che mi serviva fare e sapeva quale istruzione utilizzare
come mai non ha postato uno script come esempio? anche dopo anni bisogna tirartele con le pinze :slight_smile:
ahahahah

PS interessante l’esempio che hai posto, in pratica la linea che ti crei è equiparabile alla direzione di un vettore
e anche se il punto non capita sulla linea viene prolungata la direzione e quindi aggiunto il punto

mi credi sto riscontrando una cosa da non sottovalutare:
si impara più sbagliando che facendo la cosa giusta
di sicuro mi potrà servire questo metodo in futuro :slight_smile:
Thanks Big Emilio

Circa vent’anni fa in un manuale di una ditta giapponese SMC si diceva che un metodo efficacie per imparare era : PROVA SBAGLIA E IMPARA e lo ho trasmesso a miei studenti.
Vittorio

1 Mi Piace

Giusto.
… Comunque la parte difficile resta la terza … :grinning:

Per quanto riguarda il problema delle linee:

… Mi sembra di ricordare, dai tuoi primi post sul forum, che non amavi gli esempi gia’ pronti, ma volevi solo indicazioni sulla via da prendere … ma forse la mia povera memoria e’ peggiorata oltre quanto supponevo …
:rofl:
Hehe … inoltre a volte sto facendo un lavoro e mi riesce difficile imbastire uno scriptino di esempio … molto piu’ veloce sparare i nomi di due o tre metodi rs … e poi se la vede Salvio. :smile:

Credo che pochi siano in grado di imparare senza sbaglire (o sbagliando raramente).
Ma anche imparare dagli sbagli puo’ non essere semplicissimo.

Sul forum vedi a volte cose come:
“lo script non funziona, sono ore che lo guardo ma non trovo la soluzione”
… E cosa credi di ottenere guardando ?
Controlla i valori delle variabili, prima e dopo le istruzioni, cerca cosa c’e’ di diverso da quello che ti aspetti … muoviti ! :wink:

Analogamente abbiamo "Il metodo non mi restituisce questo valore… come mai ?"
Magari … basta leggere la documentazione per capire che il metodo non restituisce quel valore semplicemente perche’ non e’ cosi’ che funziona … deve restituire un’altra cosa ed e’ quello che fa …
:smile:

A volte il forum e’ piuttosto divertente … :wink:
( Parlo soprattutto del forum USA … qui c’e’ poco movimento … :wink: )

concordo con tutto quello che è stato detto da Vittorio ed Emilio

beh poi se vogliamo addolcire un pò la pillolada alcune citazione:

non ho fallito. ho solamente provato 10.000 metodi che non hanno funzionato
Edison

oppure

non perdo mai o vinco o imparo
Mandela

:slight_smile::slight_smile::slight_smile:

2 Mi Piace