Ciao a tutti!
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 "
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)