Revit Macros: Repeat object and rule for the variation of a parameter

I am publishing a new simple Macro, very similar to the previous one, also developed by Gian Marco Todesco during our work session. It uses the same base family of the previous one. This time the object is copied on the Z axis and the parameter driving the angle is variated through a sin-based rule.

 

As usual, you need the family "PilastroFascia" in the same folder of the RVT file. Following is the copied script, the Visual Basic (vb) file is attached.

Imports System
Imports Autodesk
Imports Autodesk.Revit
Imports Autodesk.Revit.Elements
 
<CLSCompliant(False)> _
Partial Class ThisDocument
 
    Private Sub ThisDocument_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
 
 
 
    End Sub
 
    Private Sub ThisDocument_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
 
    End Sub
  
 
    ' inizio della funzione
    Public Sub SenoCopia()
 
        'Rendiamo localizzabile il file della famiglia (stessa cartella del modello)
        Dim fullPath As String = "pilastroFascia.rfa"
 
        If (Not LoadFamily(fullPath)) Then
            MsgBox("Loaded a family nono")
            Return
        End If
 
        'non specifichiamo un tipo (symbol) - funziona ma va un pò chiarito 
 
        Dim fs As Symbols.FamilySymbol = Nothing
 
        'Vogliamo caricare una famiglia e un tipo, se non lo carica ce lo dice, 
        'altrimenti carica il tipo pilastroFascia della famiglia PilastroFascia
 
        If (Not LoadFamilySymbol("pilastroFascia.rfa", "pilastroFascia", fs)) Then
            MsgBox("Non riesco a caricare il family symbol, cioè il tipo. ciao ciao")
            Return
        End If
 
        'definiamo n e i 
        Dim n As Integer = 50
        Dim i As Integer
 
        'il ciclo si ripete da 1 a 50 - numeri interi 
        For i = 0 To n
 
            'imposto che scrivo "fi" invece che "FamilyInstance" 
            Dim fi As FamilyInstance
 
            'la posizione è un valore che varia la z (altezza) di un valore pari a i moltiplicato per 10
            Dim pos As Geometry.XYZ = Application.Create.NewXYZ(0.0, 0.0, i * 10)
 
            'facciamo una istanza nella posizione "pos"
            'senza specificare un tipo ("fs" è pari a nothing, cioè zero, perché è solo un tipo)
            'la famiglia è non strutturale
 
            fi = Create.NewFamilyInstance(pos, fs, Structural.Enums.StructuralType.NonStuctural)
 
 
            ' questa è la funzione mediante la quale sono legati i valori
            ' "i" (variabile da 1 a 50, interi), 
            ' "n" (fisso pari a 50)
 
            'definizamo un "t" pari a 1 diviso n
            Dim t As Double = i / n
 
            'definiamo un angolo pari a pigreco per quattro per "t"
            Dim theta As Double = t * 4 * Math.PI
 
            'definiamo un "s" che è pari alla metà di 1 + seno di teta
            Dim s As Double = 0.5 * (1 + Math.Sin(theta))
 
            'per ogni "i", infine, settiamo il parametro "pippo" della famiglia 
            'al valore pari a metà di pigreco moltiplicato per "s"
 
            fi.ParametersMap("pippo").Set(Math.PI * 0.5 * s)
 
            'la variazione del parametro (larghezza dell'angolo)
            'è ora legata a una funzione seno
 
            'passiamo al prossimo "i"
        Next i
 
    End Sub
 
 
End Class
 
AllegatoDimensione
Binary Data copySin.vb4.3 KB
Binary Data pilastroFascia.rfa196 KB

commenti

un sito statunitense ha postato un interessante post sull'uso dello scripting all'interno delle nuove funzionalità di pannellizzazione di Revit 2010:

http://buildz.blogspot.com/

Questo è il post:

http://buildz.blogspot.com/2009/05/api-yi-yi.html

Stefano

 

Stylianos Dritsas developed in 2005 this nice
online tool:

It's called jeneratiff and if formats a given script with colors. 
It saves a lot of time, and make your work more readable!
Use it before posting!


I'm trying to use scripting in R2010. This complex topic will be studied with the aid of Prof. Todesco, whom i would like to thank.

At first, i've tried to use this post script (enhanced for R2009) in the new release. 

It works pretty well, there are just a few notes to underline. For the most, nothing changed in the format.

 

 

 

'R2010 does not include following strings automatically...

'without them, it is not possible to import families

Imports System

Imports Autodesk

Imports Autodesk.Revit

Imports Autodesk.Revit.Elements

<System.AddIn.AddIn("AppAddIn", Version:="1.0", Publisher:="", Description:="")> _

Partial Class ThisDocument

 

 

    Private Sub Module_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

 

    End Sub

 

    Private Sub Module_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown

 

    End Sub

 

 

    Public Sub insert()

 

        ' the same

 

        Dim fullPath As String = "cubo.rfa"

 

        If (Not LoadFamily(fullPath)) Then

            MsgBox("Loaded a family nono")

            Return

        End If

 

        'the same

 

        Dim fs As Symbols.FamilySymbol = Nothing

 

        'the same

 

        If (Not LoadFamilySymbol("cubo.rfa", "cubo.rfa", fs)) Then

            MsgBox("Non riesco a caricare il family symbol, cioè il tipo. ciao ciao")

            Return

        End If

 

        'the same 

        Dim n As Integer = 50

        Dim i As Integer

 

        For i = 0 To n

 

            Dim fi As FamilyInstance

            Dim pos As Geometry.XYZ = Application.Create.NewXYZ(0.0, 0.0, i * 10)

 

            ' it exits several way of creating an instance. we're usign the same one

            fi = Create.NewFamilyInstance(pos, fs, Structural.Enums.StructuralType.NonStructural)

            Dim t As Double = i / n

 

            Dim theta As Double = t * 4 * Math.PI

 

            Dim s As Double = 0.5 * (1 + Math.Sin(theta))

            fi.ParametersMap("l").Set(Math.PI * 0.5 * s)

 

        Next i

 

    End Sub

 

End Class

 

 

marco.mondello@gmail.com