Forgot password?

Create an account!

Forum

« back

RhinoScript – Help!!

Messages

Please log in to write a message.

  • 1. andry19899 (Aug 22, 2014 18.13):

    Hi everybody. i need your help...again.
    I'm trying to write a code that allows me to find the vertices coordinates of many solid at the same time, but I have some troubles on my way:
    I'm using Rhino.Command ("_ExtractPt") in the rhinoscript and here is the first problem: it will create three points for each vertex of the selected solid and , once I'll export the coordinates in a .txt file, there'll be triple points needed...and it isn't so good! I thought also to the point cloud, maybe this will be the solution.
    the next trouble is how I can collect the vertices coordinates of each solid (which is identified with a textdot); the third problem is to write in the .txt file, thedimensions such as height, length, thickness for each solid with all the informations about the volume, Inertia, etc....
    I post the codes separately cause another thing I have to do is to join them to automate the process in one single step.

    the first code is what I've done to extract the solid vertices:

    Option Explicit
    'Script written by <Andrea Celiento>
    'Script version mercoledì 20 agosto 2014 16:44:13

    Call VerticiDeiSolidi()
    Sub VerticiDeiSolidi()
            Dim arrObjects, strObject, arrPoints, arrPoint, strPoint
            Dim strFileName, strEstFile, objFSO, objFILE, selezione, punti
           
            strEstFile = "Text File (*.txt)|*.txt|All Files (*.*)|*.*||"
                   
            'selezione = rhino.GetObjects("Selezionare i solidi da processare", 16) 
           
            punti = Rhino.Command("_ExtractPt")
            rhino.PointCloudPoints(punti)
           
           
            ' dovrei trovare il modo di far eseguire questo comando sugli oggetti selezionati
            'tramite la variabile "selezione".     
            'l' unico problema è che il comando "_ExtractPt" aggiunge un punto per ogni bordo
            'coincidente nel vertice(quindi #3 punti per vertice) mentre ne serve uno solo per
            'vertice per calcolarne poi le coordinate.
           

            arrObjects = rhino.LastCreatedObjects
           
            If IsNull(arrObjects) Then Exit Sub
           
            ' inserisci il nome del file
            strFileName = Rhino.SaveFileName("Salva le coordinate dei punti come:", strEstFile)
           
            If IsNull(strFileName) Then Exit Sub
           
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            Set objFILE = objFSO.CreateTextFile(strFileName, True)
            objFILE.WriteLine("coordinate dei punti X,Y,Z")
           
            ' Interroga le nuvole di punti
            For Each strObject In arrObjects
                   
                    If Rhino.IsPointCloud(strObject) Then
                           
                            arrPoints = Rhino.PointCloudPoints(strObject)
                           
                            If IsArray(arrPoints) Then
                                   
                                    For Each arrPoint In ArrPoints
                                           
                                            strPoint = "" & CStr(arrPoint(0)) & "" & " - " & "" & CStr(arrPoint(1)) & "" & " - " & "" & CStr(arrPoint(2)) & ""
                                            ' scrive le coordinate sul file di testo                                       
                                            objFILE.WriteLine(strPoint)
                                    Next
                            End If
                           
                    ElseIf Rhino.IsPoint(strObject) Then
                           
                            arrPoint = Rhino.PointCoordinates(strObject)
                           
                            If IsArray(arrPoint) Then
                                    strPoint = "" & CStr(arrPoint(0)) & "" & " , " & "" & CStr(arrPoint(1)) & "" & " , " & "" & CStr(arrPoint(2)) & ""
                                   
                                    objFILE.WriteLine(strPoint)
                            End If
                    End If
            Next
           
            rhino.DeleteObjects arrObjects
           
            'chiude il file 
            objFILE.Close
    End Sub

    And this is the rhinoscript for the volume informations in which I have to insert the previous script.

    Option Explicit
    'Script written by <Andrea Celiento>
    ' Consente l' esportazione dei dati relativi a volume, posizione del baricentro, momenti d' inerzia, etc
    ' ad una selezione di solidi appartenenti ad uno stesso layer.

    Call main()
    Sub  main()
           
            Dim arrObjects, strObject, strLayer,strObjects
            Dim objStream, objFile
            Dim filename
            Dim arrBSol, arrLayer
            Dim strdotsol,strPtsol,strPoint
            Dim i,j
            Dim arrMP,arrSVM,arrVol
            Dim strName,strText
           
            'crea il file
            filename = "C:\Users\andreamonica\Desktop\ " & Rhino.EditBox("Inserisci il nome del file")
           
            ' accedi al file
            Set objStream = CreateObject("Scripting.filesystemobject")
            Set objFile = objStream.CreateTextFile(filename, True) ' apre il file
           
            ' seleziona ed elimina tutti i dot text già presenti nel file
            strText = Rhino.ObjectsByType(8192) ' seleziona tutti i dot text presenti nel file
            If IsArray(strText) Then
                    Rhino.DeleteObjects strText   ' elimina i dot text
            End If
           
            strPoint = Rhino.ObjectsByType(1)'seleziona tutti i punti presenti nel file
            If IsArray(strPoint) Then
                    Rhino.DeleteObjects strPoint   ' elimina i punti
            End If 


            strObject = Rhino.GetObject("Seleziona un oggetto", 16)
            If (strObject <> vbNull) Then
                    strLayer = Rhino.ObjectLayer(strObject)
                    arrObjects = Rhino.ObjectsByLayer(strLayer, vbTrue)
                    i = 0
                    For Each strObject In arrObjects
                            i = i + 1
                            arrBSol = Rhino.SurfaceVolumeCentroid(strObject) 'baricentro solido
                            If IsArray(arrBSol) Then
                                    strdotsol = "solido" & CStr(i) 'assegna una casella di testo con "solido+numero"
                                    strName = Rhino.DocumentName
                                    arrLayer = Rhino.LayerName(strLayer)
                                    Rhino.AddTextDot strdotsol, arrBSol(0)
                            End If
                           
                            If Rhino.IsPolysurfaceClosed(strObject) Then
                                    arrMP = Rhino.SurfaceVolumeCentroid(strObject)
                                    If isarray(arrMP)Then
                                            Rhino.AddPoint arrMP(0)
                                    End If
                                   
                                    If IsArray(arrObjects)Then 'mette il colore da layer per evidenziare i solidi già processati
                                            For Each strObjects In arrObjects
                                                    Rhino.ObjectColorSource strObject, 0
                                            Next
                                    End If                         
                           
                                    arrSVM = Rhino.SurfaceVolumeMoments(strObject) ' leggi le proprietà (area, baricentro, inerzia...)
                                    arrVol = Rhino.SurfaceVolume(strObject)
                                           
                                           
                                    If IsArray(arrSVM) Then ' scrive sul file tutte le informazioni sul volume
                                            objFile.WriteLine("****** " & strName & " ******") ' nome del file così d poterlo riconoscere in seguito
                                            objFile.WriteLine("****** " & strdotsol & "***" & arrLayer & "******") 'identificativo del solido e del layer di appartenenza.
                                            objFile.WriteLine("Volume:")
                                            objFile.WriteLine(CStr(arrVol(0)))
                                            objFile.WriteLine("Centroide del Volume:")
                                            objFile.WriteLine(CStr(arrBsol(0)(0)) & "; " & CStr(arrBSol(0)(1)) & "; " & CStr(arrBSol(0)(2)))
                                            objFile.WriteLine("Momenti Statici:")
                                            objFile.WriteLine(CStr(arrSVM(0)(0)) & "; " & CStr(arrSVM(0)(1)) & "; " & CStr(arrSVM(0)(2)))
                                            objFile.WriteLine("Momenti d' Inerzia:")
                                            objFile.WriteLine(CStr(arrSVM(2)(0)) & "; " & CStr(arrSVM(2)(1)) & "; " & CStr(arrSVM(2)(2)))
                                            objFile.WriteLine("Prodotto dei Momenti:")
                                            objFile.WriteLine(CStr(arrSVM(4)(0)) & "; " & CStr(arrSVM(4)(1)) & "; " & CStr(arrSVM(4)(2)))
                                            objFile.WriteLine("Momenti d' Inerzia del volume rispetto al WCA:")
                                            objFile.WriteLine(CStr(arrSVM(6)(0)) & "; " & CStr(arrSVM(6)(1)) & "; " & CStr(arrSVM(6)(2)))
                                            objFile.WriteLine("Volume Radii of Gyration about the WCA:")
                                            objFile.WriteLine(CStr(arrSVM(8)(0)) & "; " & CStr(arrSVM(8)(1)) & "; " & CStr(arrSVM(8)(2)))
                                            objFile.WriteLine("Momenti d' Inerzia rispetto al Centroide:")
                                            objFile.WriteLine(CStr(arrSVM(10)(0)) & "; " & CStr(arrSVM(10)(1)) & "; " & CStr(arrSVM(10)(2)))
                                   
                                            'pezzo aggiunto in data 23 Luglio
                                            objFile.WriteLine("Momento principale di inerzia del volume rispetto al Centroide:")
                                            objFile.WriteLine(CStr(arrSVM(14)(0)) & "; " & CStr(arrSVM(14)(1)) & "; " & CStr(arrSVM(14)(2)))
                                           
                                            'pezzo aggiunto in data 23 Luglio
                                            objFile.WriteLine("Coseno direttore X:")
                                            objFile.WriteLine(CStr(arrSVM(15)(0)) & "; " & CStr(arrSVM(15)(1)) & "; " & CStr(arrSVM(15)(2)))
                                            objFile.WriteLine("Coseno direttore Y:")
                                            objFile.WriteLine(CStr(arrSVM(16)(0)) & "; " & CStr(arrSVM(16)(1)) & "; " & CStr(arrSVM(16)(2)))
                                            objFile.WriteLine("Coseno direttore Z:")
                                            objFile.WriteLine(CStr(arrSVM(17)(0)) & "; " & CStr(arrSVM(17)(1)) & "; " & CStr(arrSVM(17)(2)))
                                           
                                           
                                            'Pezzo aggiunto in data 23 Luglio
                                            objFile.WriteLine("Raggi di rotazione del volume calcolato rispetto al Centroide:")
                                            objFile.WriteLine(CStr(arrSVM(12)(0)) & "; " & CStr(arrSVM(12)(1)) & "; " & CStr(arrSVM(12)(2)))
                                   
                   
                                    End If
       
                            End If
                    Next           
                   
                    objFile.close ' chiude il file
                    'script funzionante
            End If
    End Sub

    I hope that someone can Help me cause I'm in a reaal dead point.
    thanks to everybody who can help me!
    ps. i post also an image of the .txt file that codes gives to me.

Recommend

Why are these buttons gray?