Aiuto con rhinoscript in VB (ID e stringhe)

Ciao a tutti! :grinning:
Si può ottenere l’id di tutti gli oggetti creati attraverso uno script senza selezionarli manualmente o attraverso layer, colore ecc?
Un numero importato da un oggetto e inserito in una stringa lo posso arrotondare/troncare ? Ad esempio 16,000003 posso trasformarlo in 16?
Grazie!!!

round(16,000003)

per la prima domanda cerca di essere più specifico per cosa “devi fare” perchè hai citato vari modi possibili

Ciao 0904 e grazie per la risposta.
utilizzo
strU = round(Rhino.Distance(arrBox(0), arrBox(1)))
o
strU2 = round(strU)
o altro?

Creo 2 cilindri e voglio unirli in un unico corpo per poter cambiare layer/ colore e rinominarlo.
Per realizzare queste azioni ho bisogno dell’ID degli oggetti.
Per adesso seleziono i due oggetti (vedi seguito)

If strR = "vite" Or strR = "tutto" Then
	If Rhino.IsLayer("vite") = 0 Then
		Rhino.AddLayer("vite")	
	End If
	
	dblDV = arrM(1) / 2
	dblTV = arrM(0)
	dblDV2 = arrM(0) / 2
	lngC = arrM(5)
	strLV = Rhino.ListBox(arrHV, "Lunghezza")
	
	Rhino.CurrentLayer("vite")

	
	Rhino.AddCylinder arrPlane, dblTV, dblDV
	Rhino.AddCylinder arrPlane, -(strLV), dblDV2
	
	**arrInput = Rhino.GetObjects("Seleziona la vite e la testa" Parte che voglio modificare)**
	Rhino.ObjectName arrInput, "M" & arrM(0) & "x" & strLV
	Rhino.ObjectColor arrInput, lngC
	Rhino.BooleanUnion arrInput	
End If

Ma ho delle difficoltà a “centrare” i 2 elementi. Non posso selezionare tramite layer o altro perchè potrei unire elementi che non centrano.

dovrebbe essere lo stesso viene arrotondato lo stesso il risultato

per identificare ID degli oggetti puoi usare questo codice:

Rhino.Command("_SelLast")

Dim arrObjects, strObject

arrObjects = Rhino.SelectedObjects

If IsArray(arrObjects) Then

	For Each strObject In arrObjects

		Rhino.Print "Object identifier: " & strObject

	Next

End If

in questo caso vengono selezionati “gli oggetti creati nel codice” e poi scritto ID di ciascuno ovviamente volendo li puoi mettere in una variabile e gestirli a tuo piacere dovrebbe fare a caso tuo.

Ciao Paola

( … Spero di non dire troppe stupidaggini. E’ un po’ che non uso VBScript … )

Attenzione che Round restituisce un numero, ma naturalmente lo puoi convertire poi in stringa con CStr.

Oppure puoi usare FormatNumber, che restituisce direttamente la stringa,
A FormatNumber. oltre al numero da formattare, puoi passare come secondo parametro il numero di decimali desiderati.

strU = FormatNumber( Rhino.Distance(arrBox(0), arrBox(1)), 0 )

Dovrebbe darti il numero senza decimali, mentre

strU = FormatNumber( Rhino.Distance(arrBox(0), arrBox(1)), 1 )

formatta con un decimale … e cosi’ via.

Rhino.AddCylinder restituisce direttamente l’ID dell’oggetto, per cui lo puoi salvare in una variabile
e poi utilizzarlo come vuoi

Ciao 0904
grazie per l’aiuto.
ho provato lo script sia come comando sia inserito nel programma:

comando

Call Main()
Sub Main()
Dim arrBase, arrHeight, dblRadius, strE
dblRadius = 5.0
arrBase = Rhino.GetPoint(“Base of cylinder”)
arrHeight = Rhino.GetPoint(“Height of cylinder”, arrBase)
Rhino.AddCylinder arrBase, arrHeight, dblRadius

Rhino.Command("_SelLast")
Dim arrObjects, strObject
arrObjects = Rhino.SelectedObjects
If IsArray(arrObjects) Then
	For Each strObject In arrObjects
		Rhino.Print "Object identifier: " & strObject
	Next
Else 
	Rhino.Print "ahia"
End If

End Sub

inserito
Call Main()
Sub Main()
Dim arrBase, arrHeight, dblRadius, strE
Dim arrObjects, strObject

dblRadius = 5.0
arrBase = Rhino.GetPoint("Base of cylinder")
arrHeight = Rhino.GetPoint("Height of cylinder", arrBase)
Rhino.AddCylinder arrBase, arrHeight, dblRadius
arrObjects = Rhino.SelectedObjects
If IsArray(arrObjects) Then
	For Each strObject In arrObjects
		Rhino.Print "Object identifier: " & strObject
	Next
Else 
	Rhino.Print "ahia"
End If

End Sub

L’unico che funziona è quello con il rhino.command ma … con il successivo rilancio. Con il primo lancio creo il cilindro1 ma non carico il suo ID. Con il secondo lancio creo il cilindro2 e carico ID del cilindro1. Ho inserito il tuo commando in modo corretto?

ciao Paola
hai bisogno di sapere l’id di questi 2 oggetti
Rhino.AddCylinder arrPlane, dblTV, dblDV
Rhino.AddCylinder arrPlane, -(strLV), dblDV2 ?

Ciao Riccardo! Si ho bisogno di sapere l’ID dei due add cilindri perché così li posso unire, cambiare nome ecc.

Ciao ok
allora devi creare delle variabili che identificano gli oggetti e le devi dichiarare

es dim str_cyl1.
poi vai a dirgli che quella variabile sarà…
str_cyl1=Rhino.AddCylinder (arrPlane, dblTV, dblDV)
il comando Rhino.AddCylinder come valore restituisce una stringa ( non tutti i comandi restituiscono stringhe).
in questo caso str_cyl1 =id oggetto in stringa.
Ogni volta che richiami str_cyl1 richiami quell’oggetto fino a quando non gli assegni un valore diverso.

If strR = “vite” Or strR = “tutto” Then
If Rhino.IsLayer(“vite”) = 0 Then
Rhino.AddLayer(“vite”)
End If

dblDV = arrM(1) / 2
dblTV = arrM(0)
dblDV2 = arrM(0) / 2
lngC = arrM(5)
strLV = Rhino.ListBox(arrHV, "Lunghezza")

Rhino.CurrentLayer("vite")


   ' ##########################
dim str_cyl1, str_cyl2   'dichiaro le 2 variabili

‘assegno alle variabili il valore
str_cyl1=Rhino.AddCylinder (arrPlane, dblTV, dblDV)
str_cyl2=Rhino.AddCylinder (arrPlane, -(strLV), dblDV2)
’###############################

**arrInput = Rhino.GetObjects("Seleziona la vite e la testa" Parte che voglio modificare)**
Rhino.ObjectName arrInput, "M" & arrM(0) & "x" & strLV
Rhino.ObjectColor arrInput, lngC
Rhino.BooleanUnion arrInput	

End If
Prova

dimenticavo
poi richiami gli oggetti con
es
rhino.selectobject str_cyl1

Grazie per il consiglio ma purtroppo è la prima cosa che ho fatto. Essendo alle prime armi potrei avere scritto “cavolate” e riproverò ancora con le tue impostazioni!

l’ideale sarebbe avere lo script completo e capire cosa vuoi ottenere

Ciao Riccardo scusa ieri ho visto metà delle tue risposte ho riprovato e stavolta FUNZIONAAAAA!. (mi resta da capire perchè non mi funzionava prima)
La parte dello script lo ho modificato così:

dblDV = arrM(1) / 2
dblTV = arrM(0)
dblDV2 = arrM(0) / 2
lngC = arrM(5)
strLV = Rhino.ListBox(arrHV, “Lunghezza”)

	Rhino.CurrentLayer("vite")
	
	str_cyl1 = Rhino.AddCylinder(arrPlane, dblTV, dblDV)
	str_cyl2 = Rhino.AddCylinder(arrPlane, -(strLV), dblDV2)
	
	Rhino.ObjectName str_cyl1, "M" & arrM(0) & "x" & strLV
	Rhino.ObjectName str_cyl2, "M" & arrM(0) & "x" & strLV

	Rhino.ObjectColor str_cyl1, lngC
	Rhino.ObjectColor str_cyl2, lngC

	rhino.selectobject str_cyl1
	rhino.selectobject str_cyl2
	
	Rhino.Command "_BooleanUnion "

ciao
ottimo
giusto per capire cosa ti serve dare il nome ai cilindri se poi fai la booleana?
la booleana puoi farlo anche in questo modo:
call Rhino.BooleanUnion (array( str_cyl1,str_cyl2))

e togli

rhino.selectobject str_cyl1
rhino.selectobject str_cyl2
Rhino.Command "_BooleanUnion "
1 Mi Piace

Era per conservare il nome una volta unito l’oggetto. Posso impostarlo dopo?

Certo che si
dichiari la geomoetria risultante e poi assegni il nome
din arr_boolean
arr_boolean=Rhino.BooleanUnion (array( str_cyl1,str_cyl2))
Rhino.ObjectName arr_boolean, “M” & arrM(0) & “x” & strLV
Per velocizzare il lavoro usa Rhino.EnableRedraw (guarda la guida in linea come funziona)