Problemino con gli Array "credo"

buon dì a tutti

grazie lucio sei gentilissimo

lo avevo immaginato :slight_smile:

emilio non vorrei darti una brutta notizia il fatto e che questo codice è il seguito del post precedente “offset” non te lo volevo dire ma offset è ritornato per la vendetta ahahahah. il codice è il continuo di quello che già che mi hai aiutato a fare creando i due segmenti per chiudere offset senza l’ausilio del cap.
ti dico che per me già “siamo venuti a capo di tante cose” (la chiusura offset - ricavare la curva più lunga) che mi hai corretto postando la tua soluzione. certo sarei più contento se non ci fossero queste differenze tra i Comandi di Rhino e i Metodi dello Script che mi spiazzano ogni volta come selezionare con _SelLast o selezionare con FirstObject per questo attendiamo quale soluzione ci posta lucio.

PS grazie ragazzi senza di voi sarebbe molto più dura.

Allora, anche se un pò in ritardo, eccomi qua.
Ti giro un paio di script che ho fatto per eseguire l’offset (esterno o interno) di profili chiusi.
Il codice è vecchiotto però potrebbe avere degli spunti utili al tuo lavoro.
Offset_Curve_Chiuse_Esterno.txt (859 Byte)
Offset_Curve_Chiuse_Interno.txt (860 Byte)
La differenza tra i due sta solo nell’inversione della direzione di offset.
Penso tu conosca già la guida a Rhinoscript raggiungibile dal menù Help->Plug-ins->Rhinoscript…
Se guardi la definizione dei comandi, noterai che esistono tre sezioni:
-Syntax
-Parameters
-Returns
Credo che sia semplice intuire a cosa si riferiscano.

Quindi, se dichiari una variabile “pippo” e vuoi che riceva l’ID di un arco appena creato, è sufficiente scrivere

pippo = Rhino.AddArc (arrPlane, 5.0, 45.0)

Se poi questo ID lo vuoi aggiungere ad un array “pluto” di lunghezza “i” (per poter avere l’elenco di tutte le curve create) sarà sufficiente ridimensionare l’array con Redim Preserve (il preserve serve per mantenere i dati già salvati altrimenti l’array ti viene ridimensionato e svuotato):

Redim Preserve pluto(i+1)
pluto(i+1) = pippo

Altri metodi, invece, ti restitiuiscono già un array di oggetti tipo il Rhino.ExplodeCurves; in questo caso

pippo = Rhino.ExplodeCurves (strObject)

diventa un array e quindi devi fare sempre attenzione a cosa ottieni da un comando per poter gestire il risultato in maniera corretta.

Buon di’

Dunque … cerco di non essere rompiballe (anche se lo sono di mio) … hehehe

Voglio solo ri-dire che (in generale, per ogni problema di script)
se non c’e’ lo script su cui ragionare, io non ci capisco niente (altri piu’ intellligenti certo non avranno questo problema, ma io purtroppo si’ … :slightly_frowning_face:)

Capisco che e’ una questione di approccio agli script, se cosi’ vogliamo dire.
Io ho una mentalita’ (parola grossa …) molto ‘quadrata’ e terra terra.
Se non parto da;

  1. ho questi oggetti / valori
  2. voglio ottenere questa cosa
  3. lo script attualmente e’ questo, ma …
  4. mi da’ questi problemi

… Dicevo … se non parto, piu’ o meno, da queste cose, sono perso.
Questo per quanto riguarda uno script che deve fare una ben precisa operazione.

Poi, se vogliamo parlare di un metodo RhinoScript o di un altro, benissimo,
Se vogliamo discutere di meriti e demeriti dello scripting di Rhino, OK.
Niente in contrario, anzi sono discorsi che mi rilassano e che mi piace fare :slight_smile:

Ma non so quanto tutto cio’ sia utile al completamento del tuo script, se questo e’ lo scopo …

Il fatto di faticare a capirsi temo sia anche una questione generazionale.
Ho gia’ notato sui forum McNeel che molti nuovi utilizzatori si esprimono in modo diverso rispetto a quanto accadeva (per esempio) sul newsgroup anche solo 15 anni fa. Penso sia la naturale evoluzione della societa’ umana … va beh, lasciamo perdere, di sociologia certo non capisco un tubo. :smile:

Probabilmente Lucio, che e’ piu’ giovane, non ha i miei problemi e riuscira’ a darti le dritte che ti servono.
Per ora io resto in stand-by … hehehe … e mi godo lo spettacolo.:smiley:

P.S.

l’estate e’ stagione propizia per queste belle discussioni …
sto seguendo sul forum USA il batti e ribatti di Jim e Pascal:


Proprio niente male … :smiley:

Gran cosa i forum (… fora ?) McNeel !

E c’hai ragione pure te… :smiley:
Infatti, leggendo il post, ho impiegato parecchio prima di capire se c’era bisogno di una mano o se le cose erano già risolte…
Comunque ci provo buttando qua e la degli esempi sugli argomenti che potrebbero tornare utili (sai mai che ci azzecco :wink: )
Ciao Emi!

PS: allego anche il seguente script che seleziona tutti gli archi aventi raggio maggiore rispetto ad un valore dato.
Seleziona_Archi_con_Raggio_Maggiore_di.txt (1,0 KB)
Dovrebbe avere anche questo degli spunti utili…

scusate ma mi sono dovuto allontanare dal PC e prima di rispondere ho dato un occhiata ai codici postati da lucio che ringrazio e con calma guarderò anche le sezioni della guida che mi ha consigliato.

ad emilio mi spiace per questo disagio prossimamente cercherò di essere più chiaro nello spiegare il problema in modo da facilitare tutti coloro che rispondono per la risoluzione del problema.

forse sbaglierò approccio ma tendenzialmente cerco di postare il problema in modo che gli altri mi diano degli spunti o delle guide su cosa debbo fare e poi se trovo qualche problema come in questo caso con un Metodo chiedo come risolverlo. lo so che può sembrare, anzi è più contorta la cosa ma credo che sia il modo migliore “almeno per me” per imparare veramente anche sbagliando ad assemblare un codice di programmazione. lo so che postare un probema con quattro righe dicendo “ho questo problema con questo codice che dovrebbe fare questo” per poi fare il copia e incolla del codice giusto sarebbe più semplice anche per me è più veloce ma non credo che imparerei le stesse cose per lo meno io se non ci sbatto la testa non sono contento infatti dopo il tuo “Redim” adesso dovrò testare il “Redim Preserve” di lucio per capire come funziona dalla teoria alla pratica.
ps confido nella pazienza tua di lucio e in quella di tutti anche nei prossimi miei post :slight_smile:
e ti faccio i complimenti anche per l’inglese che vorrei conoscere anch’io per seguire il link che hai postato.
ragazzi un saluto a presto grazie emilio grazie lucio.

questa è la guida di RhinoScript io uso F1 una volta richiamato EditScript

per quanto riguarda le tre sezioni non sono riuscito a trovarle in compenso ho trovato questo Metodo Rhino.PlugIns non so se sia utile o non centra nulla . . . .

Completamente d’accordo.
Anche secondo me il modo giusto e’ chiedere qualche dritta e poi usarla per risolvere il problema.

Infatti di solito a chi chiede spudoratamente uno script (ce ne sono diversi soprattutto sul forum USA) non rispondo.
A me piace scambiare informazioni con altri scriptomani, Non lavorare gratis (non me lo posso neanche permettere)
Hehehe

Le poche righe di (quasi) VBS che avevo postato avevano solo l’intento di spiegare come fare …
e mi e’ sembrato piu’ semplice scrivere un esempio piuttosto che raccontare l’algoritmo.
Chiamala pigrizia, se vuoi :wink:
Ma non c’e’ nessun problema, possiamo benissimo proseguire descrivendo le operazioni anziche’ scrivendo esempi.
Per me va benissimo cosi’. :slight_smile:

Ho invece qualche dubbio sul fatto di fare domande molto specifiche su questo o quel metodo anziche’ sul problema da ricolvere.
A mio parere cosi’ ‘blocchi’ l’impostazione dello script.
Cioe’ non dai modo di proporre strade diverse per far la stessa operazione ( e secondo me di solito ce ne sono diverse )
A me sembra limitativo, pero’ … se a te va bene cosi’ … :slight_smile:

Ognuno ha il suo modo di imparare e di scriptare, questo lo ho verificato da tempo, innanzitutto su di me. :smiley:
Resta qualche problema di incomprensione, dato che parlare in astratto mi sembra piu’ complesso che discutere su di un esempio concreto … ma spero che si riesca a migliorare la comprensione reciproca … almeno ci proviamo. :slight_smile:

A questo punto provo a rispondere al problema del SelLast.

Tu dici che devi usare SelLast perche’ non c’e’ altro modo di individuare gli oggetti.
Oppure LastCreatedObjects()

In effetti non sono tra le cose piu’ affidabili di Rhino …
FirstObject() mi da’ un po’ piu’ fiducia, ma in caso di oggetti multipli bisogna riuscire a richiamarlo per ogni oggetto, salvando gli ID in una array

Di solito si cerca di evitare di dover fare cose simili, se c’e’ modo, ma a volte il modo non si trova.

Ti racconto cosa avevo fatto, diversi anni fa, in una situazione del genere.
Non ricordo cosa facesse lo script, ma ricordo che non c’era modo di ottenere gli ID di certi oggetti, probabilmente costruiti via Rhino.Command(). Rhino non collaborava ( capita … )
A mali estremi … :wink: … ho fatto creare allo script un layer temporaneo in modo che gli oggetti costruiti da Rhino.Command() finissero (e solo loro) su quel layer.
Dopodiche’ … un bel ObjectsByLayer() ma ha dato i loro ID.
Poi dopo il povero script ha dovuto naturalmente spostare gli oggetti sul layer giusto e cancellare il layer temporaneo.
Tutt’altro che una soluzione elegante … ma funzionava. :smiley:

Ciao

P.S.
Grazie per i complimenti, ma sono immeritati, il mio inglese fa schifo, capisco qualcosina solo se si parla di CAD :frowning_face:.

Intendo che all’interno della guida ogni comando viene spiegato attraverso le tre sezioni che ti ho elencato.
Nella terza sezione trovi quello che il comando restituisce (numero, stringa, array, bolean ecc ecc).
La tua variabile messa prima della funzione riceverà uno di questi valori.

scusa lucio non avevo capito cosa intendevi. beh si certo che leggo la guida e la prima cosa che faccio ovviamente con tutti i limiti che ci possono essere nell’imparare da solo leggendo help per quanto una guida può essere fatta bene, infatti ci hai azzeccato sul fatto della variabile pippo non con ExplodeCurves ma:

Dim arrCurve, t0, t1, j, strObject, pippo(2)
arrCurve = Rhino.SelectedObjects
If IsArray(arrCurve) Then
	t0 = Rhino.CurveClosestPoint(arrCurve(0), Rhino.GetPointOnCurve(arrCurve(0)))
	t1 = Rhino.CurveClosestPoint(arrCurve(0), Rhino.GetPointOnCurve(arrCurve(0)))
	Rhino.SplitCurve arrCurve(0), Array(Rhino.Min(Array(t0, t1)), Rhino.Max(Array(t0, t1)))
End If

arrCurve = Rhino.FirstObject
For j = 0 To 2
	Rhino.SelectObject arrCurve
	arrCurve = Rhino.NextObject(arrCurve)
Next

questa era la soluzione trovata per selezionare le curve splittate non intuendo di andare ad aggiungere una variabile allo split per poi selezionare le curve tramite variabile. che dire mi complico la vita.
in effetti non so se valutare il ragionamento che c’è stato per selezionare il risultato dello split o il fatto che mi sono perso in un bicchiere d’acqua a non pensare di aggiungere una variabile . . . . :expressionless:
ps adesso provo con il “Redim Preserve” e ti faccio sapere grazie delle diritte :slight_smile:

Occhio che, quando aggiungi la variabile per collezionare l’output di un comando, devi racchiudere tutto l’argomento del comando stesso tra parentesi altrimenti ti restituisce errore.

si si me ne sono accorto infatti questa è un’altra cosa che mi sto abituando a differenza di vb/vba li se ricordo bene posso mettere sempre le parentesi mentre in RhinoScript se metto la variabile ci vogliono le parentesi se non metto la variabile mi da errore se le metto. man mano anche se simili imparo le differenze :slight_smile:

mi fa piacere trovarti d’accordo con me anche perchè le cose a me piacciono sudarle un pochino :slight_smile:
e poi con questo caldo non è difficile anzi si suda anche troppo ahahahah

riguardo al fatto delle ultime cose postate hai ragione ma più che postare un problema voleva essere uno sfogo su come mai si comporta in un determinato modo RhinoScript per esempio, a lucio ho postato il codice dove dicevo che utilizzavo i Metodi FirstObject e NextObject in un ciclo For Next per selezionare gli oggetti (poi lui mi ha illuminato facendomi notare che bastava aggiungere una variabile) ma questo è venuto dopo che io avessi pensato di utilizzare il Comando _SelLast (cosa che non ero felice di fare)

Dim arrCurve, t0, t1, j, strObject, pippo(2)
arrCurve = Rhino.SelectedObjects
If IsArray(arrCurve) Then
	t0 = Rhino.CurveClosestPoint(arrCurve(0), Rhino.GetPointOnCurve(arrCurve(0)))
	t1 = Rhino.CurveClosestPoint(arrCurve(0), Rhino.GetPointOnCurve(arrCurve(0)))
	Rhino.SplitCurve arrCurve(0), Array(Rhino.Min(Array(t0, t1)), Rhino.Max(Array(t0, t1)))
End If

Rhino.Command("! _SelLast")
Rhino.Command("! _SelLast")

la mia intenzione era quella di far notare alcune cose che mi sembrano strane ad esempio come mai in questo caso sono obbligato a ripetere il comando SelLast.
altra cosa che ho scritto come mai non posso dichiarare il tipo di una variante che mi torna un errore?
tengo a precisare che non vogliono essere lamentere su come funziona RhinoScript ma solo domande nel caso qualcuno si sia trovato nella stessa situazione e dare una spiegazione per capire come funziona Rhino in effetti bisogna imparare come ragiona questo linguaggio giusto . . . .

PS intendevo non bloccare ma condividere l’esperienze delle fasi del codice creato.alla prossima un saluto:)

per me notte insonne ma con risultati :slight_smile:

Dim pippo, pluto(), i
For i = 0 To 2
	pippo = Rhino.AddCircle(Rhino.WorldXYPlane, i + 5.0)
	ReDim Preserve pluto(i)
	pluto(i) = pippo
Next
Rhino.SelectObject pluto(0)
Rhino.SelectObject pluto(1)
Rhino.SelectObject pluto(2)

questo è una prova fatta sul suggerimento di lucio
grazie lucio ottimo metodo per memorizzare gli oggetti :slight_smile:

Dim i
For i = 1 To 3
	Rhino.Command "_-Circle " & i + 10 & ",0,0 10", False
	Rhino.LastCreatedObjects(i)
Next
Rhino.SelectObjects Rhino.LastCreatedObjects(1)
Rhino.SelectObjects Rhino.LastCreatedObjects(2)
Rhino.SelectObjects Rhino.LastCreatedObjects(3)

e questo invece è l’alternativa ma per gli oggetti creati con il Metodo Command
infatti se si invertono i metodi la selezione non funziona.

e finalmente ho capito anche come funzionasse Rhino.LastCreatedObjects

Hehe … permettimi … credo che questa sia la canonica prima fase dello scriptomane … hahaha.

  1. Cerchi di fare se cose come sei abituato a fare
  2. Ti incavoli perche’ Rhino non la pensa come te
  3. Alla fine ti abitui a ragionare secondo l’impostazione di Rhino ( beh, fino a un certo punto almeno … )
    … E cominci a pensare a come scrivere lo script che ti serve, senza farti distrarre da altre considerazioni …

Una cosa che ho notato sbirciando sul forum USA, dove ci sono diversi programmatori professionisti (qui se ne vedono raramente) e’ questa:
Il professionista di solito non si fa problemi di linguaggio, libreria, compilatore o altro strumento.
( Salvo i rari casi in cui e’ proprio bloccato perche’ una certa cosa manca o non funziona )
generalmente va dritto allo scopo: si studia gli strumenti a disposizione e poi li spreme piu’ che puo’ per scrivere il suo bel codice.

Noi scriptomani ( naturalmente ) abbiamo molto da imparare da loro. :smiley:

Comunque, tornando al nostro livello ( :wink: ), e’ vero che ci sono differenze tra i metodi RhinoScript e i comandi Rhino,
ma ci si abitua in fretta, e a volte che ci siano differenze non e’ neanche male: i comandi Rhino sono fatti per un uso interattivo e cercano (non sempre) di velocizzare le operazioni sfruttando posizione e movimento del cursore del mouse, cosa impossibile per RhinoScript (che al massimo ti salva il punto di selezione).
I comandi Rhino a volte, per velocizzare, presumono alcune cose … che possono non essere quello che vuoi
Secondo me e’ megilo che i metodi RhinoScript rimangano semplici e ben definiti, anche se meno potenti dei comandi Rhino, penso che programmando sia sempre meglio avere il pieno controllo di quello che accade, anche quando questo richiede una procedura piu lunga e dettagliata.

Comunque … hehehe … se trovi che cio’ che fa RhinoScript sia troppo limitato … Rhino ti mette a disposizione un’alternativa piu’ potente: il gia’ citato Python.
Con Python puoi usare RhinoCommon:

http://developer.rhino3d.com/api/RhinoCommonWin/html/N_Rhino.htm

… E qui puoi sbizzarrirti … :smiley:

Per SelLast non so … bisognerebbe fare qualche prova con altri comandi per cercare di capirci qualcosa …
( Altro piccolo consigilo tra scriptomani, se permetti: quando non capisci come funziona (o non funziona) una cosa, non stare li’ a rimuginare (molti principianti fanno cosi’ e serve solo a passare il tempo), fai delle prove finche’ trovi l’inghippo … o almeno provaci :wink: )

Per il tipo della variabile … a quanto ricordo io, in VBScript tutte le variabili sono di tipo Variant, quindi direi che l’operazione non ha senso, e credo sia un errore di sintassi.

Ti allego quello che usavo io di solito per la sintassi VBS:

script56.7z (2,7 MB)

( E’ compattato non perche’ sia piu’ piccolo … e’ uguale … ma per le paturnie del nostro caro Discourse … quello si’ e’ una cosa che non riesco a digerire, anche dopo anni …)

… Anche se adesso sul Web credo si trovi molto altro …

Se vuoi c’e’ anche SelectObjects(), comodo se hai gia’ una array di ID

Non capisco come stai usando LastCreatedObjects …
Che scopo hanno queste istruzioni ?

Me lo stavo domandando anche io… non vorrei stesse utilizzando le funzioni come se fossero comandi di selezione da area di lavoro…

Eh … io in piu’ ho un dubbio sul significato delle parentesi, per esempio qui

Vuol dire che il metodo e’ richiamato con il primo parametro ( opzionale ) ?
O vuol essere un accesso a un elemento della array restituita ?

Il primo caso non mi pare perche’ il valore restituito non e’ usato in nessun modo … quindi niente parentesi
Il secondo non mi pare perche’ in questo caso il valore restituito e’ referenziato dall’indice … pero’ come fa a restituire una array se non lo chiamo con le parentesi ? …
Appunto … ci capisco un’ostia. :confused:

Mi sa che ho fatto bene ad abbandonare VBS … non fa per me … :blush:

in effetti l’ho anche scritto in questo post che dovrò imparare come ragiona RhinoScript (esperienza)

la butto lì può darsi che si tratti di una questione di aggiornamento, una specie di “Refresh”?

se non erro ho letto che con Python si potrebbe anche usufruire della parametrizzazione degli oggetti che sarebbe una cosa che mi interesserebbe imparare a fare. nel caso ti offriresti come mentore ? :slight_smile:

mi sà che non bisogna scrivere codici a notte fonda chiedo pardon ahahahah

Rhino.LastCreatedObjects(True)
Rhino.SelectObjects Rhino.LastCreatedObjects(True)

se questa volta non sbaglio la sintassi giusta dovrebbe essere questa. “True” serve per selezionare tutti gli oggetti. Su internet ho trovato questo modo Rhino.LastCreatedObjects()(0) solo che a me da errore.

Nel link postato porta l’esempio Rhino.LastCreatedObjects()(0) e ci sono commenti anche di pascal

Non so esattamente a cosa ti riferisci … bisognerebbe vedere il testo originale …
Rhino NON e’ un CAD parametrico, anche se ci sono alcuni meccanismi di ricostruzione automatica.
Per quanto ne so io, c’e’ la History.
Inoltre nella WIP c’e’ la possibilita’ di variare raggio ai fillet, con pesanti limitazioni che adesso non ricordo bene.
E poi naturalmente c’e’ Grasshopper.
C’e’ anche la possibilita’ di usare gli eventi con gli script, ma mi sembra una cosa abbastanza difficile, anche perche’ non sembrano esserci ‘infrastrutture’ di supporto, per cui, a parte gli eventi in se’ (e gia’ li’ pare un bel casino … ) bisogna farsi tutto da soli … almeno questa e’ l’impressione leggendo alcune discussioni sull’argomento (forum scripting o developers).

Se cerchi mentori per Python … mi spiace, ma non sono all’altezza.
Non sono un esperto di Python, spesso anch’io vado sul Web a cercare informazioni a riguardo …
E se lo fossi … finite le ferie avro’ molto meno tempo ed energie da dedicare al forum,.

Comunque tu chiedi pure qui.
Anche Vittorio usa Python, e anche diversi altri.
E anch’io, compatibilmente con il maledetto impegno lavorativo, posso ‘disquisire’ (con piacere) sull’argomento :wink:
(sempre a livello: io do una dritta a te, tu ne dai una a me … come stiamo facendo qui io, te e Lucio con VBS).
Argomento che, come abbiamo gia’ visto, con Python (volendo) si espande ulteriormente rispetto a RhinoScript.

In effetti, per chi usa il Basic, gli script di Rhino sono un po’ sfigati … :smiley: … nel senso: o ti accontenti di RhinoScript oppure devi passare a Python.
I plug-in per Rhino invece li puoi scrivere con VB.NET
E su GH gli script il puoi fare con 3 linguaggi, compreso VB.NET
Anche per gli add-on di GH VB.NET va bene.

Se questo ti da’ l’impressione che in RMA vadano avanti in ordine sparso … siamo in due. :laughing:
( sempre meglio avanti sparsi piuttosto che fermi … :wink: )

… Mi sembra ridondante.

Rhino.LastCreatedObjects( True )

dovrebbe gia’ selezionare gli oggetti, appunto per via del “True” … oppure non funziona ?

Non saprei … ad occhio dovrebbe funzionare, SE LastCreatedObjects() trova degli oggetti.
Bisognerebbe anche sapere quale errore ti da’.

a guarda per adesso su LastCreatedObjects() lo lascio stare 1 a 0 per lui ahahahah

riguardo Gh mi allaccio alla mia domanda dell’altro thread dove hai mensionato GhPython

l’idea sarebbe in Gh seleziono curve ed eseguo alcune azioni tipo offset split trim ecc tutto parametrizzato
a questo punto sarebbe possibile con GhPython trasformarlo in codice Python dove mi chiederebbe
di selezionare le curve per eseguire le azioni fatte con Gh e mantenere la parametrizzazione?

Non vedo come potrebbe funzionare… :face_with_raised_eyebrow:

Cioè, la funzione restituisce un array degli ultimi oggetti creati; le due opzioni che si possono passare sono:

  • Seleziona gli oggetti (valore boolean)
  • Filtro di selezione per escludere i blocchi

In ogni caso, se vuoi collezionare gli ultimi oggetti e al contempo selezionarli, andrebbe scritto

pippo = Rhino.LastCreatedObjects (VbTrue)

ma non ne vedo l’utilità.
C’è inoltre da dire che, con tutte queste selezioni, il casino abbonda dal momento che l’ultima selezione si somma a quella già effettuata…
Quindi, se io seleziono l’ultimo oggetto in presenza di altri oggetti già selezionati, mi ritroverò con “n” oggetti selezionati che non sarò in grado di gestire… il che mi pare assai rischioso…
Bisognerebbe almeno richiamare Rhino.UnselectAllObjects prima di fare qualsiasi passo.