Problemino con gli Array "credo"

una buona domenica a tutti

mi serve proprio un aiuto per risolvere questo intoppo in RhinoScript:

  1. ho associato una variabile indicizzata ad un tot di oggetti curva
  2. ogni oggetto curva ovviamente ha una determinata lunghezza
  3. in pratica dovrei recuperare la variabile filtrandola dalla lunghezza

inizialmente avevo tentato con Max e Ubound ma poi mi sono reso conto che mi serviva lavorare sul secondo parametro da usare come filtro per recuperare il primo, non sò se ci sia un Metodo specifico che possa fare ciò o bisogna lavorare con i Vettori degli Array? (spero di aver usato i termini giusti) mi auguro che sia chiaro :slight_smile:

un grazie a tutti per l’aiuto

Ciao

Sarebbe possibile vedere la parte di script in questione ?
… Cosi’ ragioniamo direttamente con i nomi delle variabili,
mi sembra piu’ semplice. :confused: :wink:

ciao emilio

questo è il codice intermedio dopo aver scartato i Metodi "Max e Ubound"
funziona tranne il fatto che mi salta un confronto tra il primo è l’ultimo

Dim strObject, pippa, pippo(2), j
j = 0
For Each strObject In Rhino.SelectedObjects
	Rhino.Print Rhino.CurveLength(strObject)
	pippo(j) = strObject
	If j > 0 Then 'Questo If serve per non dare errore If successivo
		If Rhino.CurveLength(pippo(j - 1)) > Rhino.CurveLength(pippo(j)) Then
			pippa = pippo(j - 1)	
		Else
			pippa = pippo(j)
		End If
	End If
	j = j + 1
Next
Rhino.Print Rhino.CurveLength(pippa) & "          " & pippa

NB ovviamente come è scritto il codice bisogna avere già le tre curve selezionate
dopodiché ero arrivato alla conclusione che bisognasse usare gli Array bidimensionali

nel frattempo posto una tabella di esempio di ciò che
dovrebbe fare il codice se si usasse gli Array bidimensionali

pippo(0) = oggeto1
pippo(1) = oggeto2
pippo(2) = oggeto3

Vettore Indice0, Indice1
Array1(pippo(0),lunghezza(pippo(0)))
Array2(pippo(1),lunghezza(pippo(1)))
Array3(pippo(2),lunghezza(pippo(2)))

Array(Array1,Array2,Array3)

quindi a questo punto ci vorrebbe un Metodo per riuscire a lavorare sui valori di
confronto che devono essere eseguiti sull’indice1 ma il risultato da estrapolare deve essere
dell’indice0 e questo che non riesco a fare essendo che questo tipo di operazione non le ho mai fatte

spero di non aver scritto troppi errori di termini e di
impostazione codici ovviamente sono ben accette
tutte le opportune correzioni e grazie ancora . . . .

PS ovviamente tutto questo se ho compreso bene che con gli Array sia una cosa fattibile da fare

OK, abbiamo 3 curve con le relative lunghezze.
Che operazione deve fare lo script, partendo da questi valori ?

confrontare le lunghezze delle 3 curve e trovata quella più lunga mi deve dire di quale oggetto si tratta
un esempio di ciò che dovrebbe fare in modo grezzo ma giusto per dare l’idea:

Dim a, b, c, risultato
a = oggetto1
b = oggetto2
c = oggetto3

If lunghezza(a) > lunghezza(b) Then
	risultato = a
Else
	risultato = b
End If

ovviamente si dovrebbe scrivere ogni possibile combinazione nel caso di 3 curve si potrebbe anche fare ma lo reputo un modo poco ortodosso in ambito di programmazione essendo che di sicuro c’è un modo più corretto.

Ah, si’. Capito.

Diciamo che abbiamo una array “curva” con indice da 0 a N contenente le curve
e un’altra array “lunghezza” contenete le lunghezze delle curve.
Possiamo fare un ciclo utilizzando due variabili per conservare i valori di curva e lunghezza, per la curva piu’ lunga trovata durante il ciclo.
Piu’ o meno una cosa del genere:
( Scusa, sono piuttosto arrugginito con il VBScript,
per cui considera quanto segue niente piu’ che pseudo-codice )

dim curva( N ), lunghezza( N )
` ...
lungmax = lunghezza( 0 )
curlunga = curva( 0 )
for i=1 to N
  if lunghezza( i ) > lungmax then
    curlunga = curva( i )
    lungmax = lunghezza( i )
  end if
next

alla fine del ciclio avrai la curva piu’ lunga in “curlunga”
( e la relativa lunghezza in “lungmax” )

… sempre se non ho fatto pasticci …

EDIT: aggiunti “end if” e “next” … credo ci vogliano …

ciao emilio grazie del codice funziona benissimo non c’e stato nemmeno bisogno dell’aggiunta :slight_smile:

sei stato grande :hugs:

PS come mai questa soluzione non funziona?

Dim n
n = UBound(Rhino.SelectedObjects)
Msgbox n
Dim curva(n), lunghezza(n), i

la Msgbox mi dà il totale delle curve selezionate ma poi mi dà l’errore quando si inserisce “n” come indice

Come ho gia’ detto, e’ un po’ che non uso VBScript …
Ma mi sembra di ricordare che Dim vuole un numero come lunghezza della array
Per usare una variabile credo si debba usare ReDim, cioe’ prima usi Dim con un valore fisso e dopo con ReDim puoi variare la lunghezza usando anche variabili …
Ma e’ meglio se controlli la sitassi VBScript sulla documentazione … :wink:

P.S. … E’ per cose come questa che non uso piu’ VBS … :sunglasses:

ho provato e funziona ottima soluzione

ho visto un pochino la guida di RhinoScript e ho letto che ha delle differenze nel dichiarare i tipi di variabili del tipo che bisogna scriverli in MAIUSCOLO e legati con il simbolo “_” anche se poi nell’indice della guida cercando “External Access” porta un esempio che a me mi da errore proprio alla prima riga “Dim objRhino as Object”. ho anche cercato altri esempi in rete tipo “Dim i as Integer” e anche questo mi da errore mah . . . .

adesso mi viene un dubbio, forse è una questione di librerie da richiamare in Rhino?

nel frattempo uso il metodo che mi hai consigliato con ReDim grazie ancora

e adesso cosa usi?

Python

Per essere precisi IronPython, cosa che e’ possibile solo a partire da Rhino 5 ( grazie RMA ! :smiley: )
Fino a Rhino 4 c’era solo il VBScript

Per i vari problemi specifici del VBScript … mi spiace, ma ormai sono fuori dal giro :wink:
Nessun problema invece per i metodi RhinoScript, che sono disponibili in forma molto simile anche con Python … :slight_smile:

Ma certo sono molti coloro che continuano ad usare VBScript ( tra cui il mio amico Lucio ) … anche se adesso qui non si vede nessuno ( a parte l’intervento dell’altro amico Vittorio, certo ) … mah … saranno tutti in spiagga … :smile:

fanno bene in questi giorni sarebbe l’unica cosa da fare per tutti :slight_smile:

mi sa che debbo mandare in spiaggia il mio PC essendo che adesso mi sta facendo proprio :face_with_symbols_over_mouth:

il codice che mi hai corretto viene dopo altri codici e per avere le ultime curve create selezionate avevo in mente di usare Rhino.Command("! _SelLast") per selezionare le tre curve generate beh non ci crederai ma non mi seleziona nulla e quindi il codice appena fatto mi da errore :rage:
la cosa che mi fa inbufalire se inserisco Rhino.Command("! _SelLast") in una nuova pagina di RhinoScript funziona e funziona anche se richiamo il comando _SelLast dalla riga di comando

c’è una spiegazione per tutto questo o sono i capricci del momento del mio PC . . . .
PS in altri codici ho usato combinazioni tra Metodi e comandi inseriti in Rhino.Command

Risolto

non so se sia normale o per quale motivo cmq ho dovuto scrivere il Metodo Rhino.Command("! _SelLast") due volte

Mah … hai provato a togliere il punto esclamativo ?
Credo che qui non serva comunque …

Scusa, le curve vengono selezionate nello script ?
Se e’ cosi puoi recuperare i guid ( objectid ) e usare Rhino.SelectObjects(), no ?
( … dopo un bel Rhino.UnselectAllObjects() )

eeeee purtroppo non erano selezionate, anzi erano selezionate poi viene eseguito un’altro Metodo e perdo la selezione se no avrei usato il Metodo che hai suggerito anzi mi costa usare i Comandi nello Script.

il fatto e che sono più oggetti se no usavo FirstObject. in un codice per selezionare più oggetti creati nello Script ho usato FirstObject in un ciclo con NextObject per il tot di numero di oggetti creati da selezionare.

infatti proprio per questo mi sono chiesto il Metodo “LastCreatedObjects” che io traduto “Ultimi Oggetti Creati” ma nella selezione ha lo stesso effetto del Metodo “FirstObject” mi seleziona solo ultimo “chi ci capisce nulla”

ps cmq avevo provato anche senza punto esclamativo

Ciao,
se devo essere sincero, non riesco a capire perchè ti stai complicando la vita con metodi di selezione “pericolosi” quando potresti salvarti semplicemente in un array le curve create in precedenza.
Il modus operandi classico dovrebbe essere:

  • dichiaro le variabili
  • chiedo i dati o la selezione degli oggetti all’utente (o uso la selezione già attiva)
  • genero i nuovi oggetti
    Ogni volta che generi un oggetto, il comando ti restituisce il suo ID.
    Basta collezionare in un array gli ID degli oggetti che ti serviranno successivamente e il resto risulterà più semplice.

grazie lucio per la risposta

ciò che hai detto mi risolverebbe un bel problema solo che non so come fare a ricavare ID degli oggetti creati
come ho scritto prima riesco a farlo solo con l’ultimo oggetto creato con FirstObject
se mi potresti dare qualche indicazione ti sarei veramente grato.

Ok, appena arrivo davanti al computer ti giro un paio di esempi (ieri sera ero capottato dal sonno…).

Bene, vediamo se ora che c’e’ anche Lucio (fresco di VBScript :slight_smile: ) riusciamo a venire a capo di qualcosa … :wink:

( Ciao Lucio ! )

Ma questi oggetti che devi selezionare (per fare cosa ?), da dove vengono ?

  1. Sono gia’ selezionati quando lanci lo script ?
  2. Sono creati dallo script via Rhino.Command() ?
  3. Sono creati dallo script con un altro metodo RhinoScript ?

Meglio ancora …
… se lo script non e’ riservato, puoi postarlo ? :slight_smile: