Sample #8 of the new Vasari SDK samples is PlaceFamilesByXyzFromFile. The SDK sample contains code in both VB.NET and C#.
This sample places a family instance at the location specified in an external file. The file is a tab delimited text file with containing a row for each family instance to be placed in the model. A chess board setup is the topic of this one.
Before
After
Wednesday, March 28, 2012
Monday, March 26, 2012
Vasari SDK Sample 7 - ExportElementXYZtoTextFile
Sample #7 of the new Vasari SDK samples is ExportElementXYZtoTextFile. The SDK sample contains code in both VB.NET and C#.
This is a simple sample that can export XYZ coordinates for a selected category. Another sweet feature within this sample is the ability to also filter by Design Option. Filtering by Design Option can be tricky of you've never had to do it before. This sample can be run on any ol file you want.
The codes used to filter b category and design option is quite simple. An option in the API exists for you to filter by ContainedInDesignOption as shown below in a short snippet.
' Filter by the Category Selected - by Category Name Dim m_col As New FilteredElementCollector(_doc) m_col.OfCategory(_doc.Settings.Categories.Item(Me.ComboBoxCategory.SelectedItem.ToString).Id.IntegerValue) m_col.WhereElementIsNotElementType() ' Get the selected item as an object Dim m_desOpt As clsDesignOption = Me.ComboBoxDesignOption.SelectedItem ' Do we have a Design Option Filter? If Not m_desOpt.DesignOption Is Nothing Then ' Apply the Option Set ID to the Filter m_col.ContainedInDesignOption(m_desOpt.DesignOption.Id) End If
The element processing to get the element XYZ is fairly simple as well. This is a very basic implementation that doesn't take into account any corrections for offsets or hosting.
' Process the Elements For Each x As Element In m_col.ToElements Try ' Get the XYZ Location Dim m_location As Location = x.Location ' Continue if we have a location If Not m_location Is Nothing Then ' Get the XYZ object Dim m_xyz As XYZ = DirectCast(m_location, LocationPoint).Point ' Design Option Data Dim m_dopt As String = "" Dim m_set As String = "" If Not x.DesignOption Is Nothing Then m_dopt = x.DesignOption.Name ' Cast the Object to a Design Option Object Dim mm_DesignOption = TryCast(x.DesignOption, DesignOption) ' Get the Set Name m_set = _doc.Element(New ElementId(mm_DesignOption.Parameter(BuiltInParameter.OPTION_SET_ID).AsElementId.IntegerValue)).Name End If ' Write out the Element Data Dim m_line As New List(Of String) With m_line .Add(x.Id.ToString) .Add(x.Name) .Add(x.Category.Name) .Add(m_set) .Add(m_dopt) .Add(m_xyz.X.ToString) .Add(m_xyz.Y.ToString) .Add(m_xyz.Z.ToString) End With m_fs.WriteLine(m_line) End If Catch ex As Exception End Try Next
Friday, March 23, 2012
Vasari SDK Sample 6 - ExtrudeRoomsToMass
Sample #6 of the new Vasari SDK samples is ExtrudeRoomsToMass. The SDK sample contains code in both VB.NET and C#.
This is a sample that demonstrates how to read the boundaries of a room element and extrude a form using these coordinates. Each room results in a new family creation that gets loaded into the model with a material generated for the department name. The material color is completely randomized.
A sample model containing a few room contained only by a series of room separation lines named "ExtrudeRoomsToMass.rvt" is provided along with the sample.
If you want to see the code samples for this one, you'll just have to get the Vasari SDK from
matt dot jezyk at autodesk dot com!
Wednesday, March 21, 2012
Vasari SDK Sample 5 - FormulaDrivenCurves
Sample #5 of the new Vasari SDK samples is FormulaDrivenCurves. The SDK sample contains code in both VB.NET and C#.
This might be my favorite sample out of the Vasari SDK. This sample needs to be run from inside a fresh conceptual mass family. It takes a while to run, but it basically reads through a set of formulas describing a somewhat complex shape and lofts a series of surfaces to generate what looks a lot like a piece of pasta!
The formula steps through a series of i (cnTi) and j (cnTj) ranges to generate the reference points that are then used to generate a series of curves. The curves then get lofted around the object. The equation is shown here.
' Equation
m_x = 10 * ((0.7 + 0.2 * Math.Sin((21 * cnTj / 250) * Math.PI)) * Math.Cos((cnTi / 20) * Math.PI))
m_y = 10 * ((0.7 + 0.2 * Math.Sin((21 * cnTj / 250) * Math.PI)) * Math.Sin((-cnTi / 20) * Math.PI))
m_z = 10 * (39 * cnTi / 1000 + 1.5 * Math.Sin((cnTj / 50) * Math.PI))
The complete Vasari SDK can be shared from our buddy Matt dot Jezyk at Autodesk dot com
Tuesday, March 20, 2012
Vasari SDK Sample 4 - MassColorGrossFloorArea
Sample #4 of the new Vasari SDK samples is MassColorGrossFloorArea. The SDK sample contains code in both VB.NET and C#.
This is a rather interesting sample that implements IUpdater. This sample requires no command execution to update the materialism on a set of masses based on their relative closeness to a target Gross Floor Area (GFA). As the mass dimensions or applied mass floors are adjusting resulting in an updated GFA, the colors aromatically adjust to yellow if their GFA is under the allowable value for "Max Underage Gross Floor Area", red if over the "Max Overage Gross Floor Area", and green if within the allowable tolerance of the "Target Gross Floor Area" parameter. each of these parameters are type parameters within the mass family.
Here is a snapshot of the masses before they have been adjusted to be all within the GFA target.
Here is the masses all green after their dimensions have been adjusted to target their "Target Gross Floor Area" values.
This is a rather interesting sample that implements IUpdater. This sample requires no command execution to update the materialism on a set of masses based on their relative closeness to a target Gross Floor Area (GFA). As the mass dimensions or applied mass floors are adjusting resulting in an updated GFA, the colors aromatically adjust to yellow if their GFA is under the allowable value for "Max Underage Gross Floor Area", red if over the "Max Overage Gross Floor Area", and green if within the allowable tolerance of the "Target Gross Floor Area" parameter. each of these parameters are type parameters within the mass family.
Here is a snapshot of the masses before they have been adjusted to be all within the GFA target.
Here is the masses all green after their dimensions have been adjusted to target their "Target Gross Floor Area" values.
Monday, March 19, 2012
Vasari SDK Sample 3 - Incrementer
Sample #3 of the new Vasari SDK samples is Incrementer. The SDK sample contains code in both VB.NET and C#.
Have you ever checked out some of the awesome "incremental" formula based families that Zach Kron has built and blogged about on http://buildz.blogspot.com/?
This sample helps construct a series of copied families all while incrementally filling in a numerical value within a specified integer parameter in the family. So basically you can take a series of families with formulas using this incremental value from this:
To this:
Have you ever checked out some of the awesome "incremental" formula based families that Zach Kron has built and blogged about on http://buildz.blogspot.com/?
- http://buildz.blogspot.com/2011/01/parametric-patterns-vi-increment.html
- http://buildz.blogspot.com/2011/06/placing-and-numbering-lots-of-stuff.html
This sample helps construct a series of copied families all while incrementally filling in a numerical value within a specified integer parameter in the family. So basically you can take a series of families with formulas using this incremental value from this:
To this:
Friday, March 16, 2012
Vasari SDK Sample 2 - DividedSurfacePanelRandomizer
Sample #2 of the new Vasari SDK samples is DividedSurfacePanelRandomizer. The SDK sample contains code in both VB.NET and C#.
This is another short and sweet sample demonstrating how to randomize panels instantiated within a Divided Surface pattern. This sample needs to be run from within a family (rfa) file for an element who's face(s) have a Divided Surface and are populated with a panel based pattern family. A family file named "DividedSurfacePanelRandomizer.rfa" has been provided with the SDK to use for this sample.
This sample is provided with a modeless user form that prompts you to select a panel element from within a Divided Surface. Once you've selected a panel, the form loads all pattern families within the family that are of the same form pattern shape. These types are what will be randomized across the Divided Surface.
The code that handles the randomization is fairly straightforward. The .NET class "Random" used to generate a random number between 1 and the total qualifying panel families based on your original selection and uses that integer to identify the corresponding panel family symbol to apply in that instance.
' New Transaction Dim m_t As New Transaction(_doc, "Vasari SDK - Panel Randomization") m_t.Start() Try ' Get all Panels of Matching Type Dim m_filter As New FilteredElementCollector(_doc) m_filter.WhereElementIsNotElementType() m_filter.OfCategory(BuiltInCategory.OST_CurtainWallPanels) Dim m_panels As New List(Of Element) m_panels = m_filter.ToElements ' Random Object Dim m_r As New Random ' Prime Progressbar With Me.ProgressBar1 .Minimum = 0 .Maximum = m_panels.Count .Value = 0 End With ' Randomize their types For Each x As Element In m_panels ' Step the progressbar Me.ProgressBar1.Increment(1) ' Ignore non Panel Elements If Not TypeOf x Is Panel Then Continue For Try ' Only Work with Panes of Qualifying Type If _Panels.ContainsValue(x.GetTypeId) Then ' Randomize Instance Try ' Random Number between 1 and Quantity of Qualifying Panel Types Dim m_i As Integer = m_r.Next(1, _Panels.Count) ' Change the Type to the Matching Dictionary Entry for the Random Number Key Dim m_eid As ElementId = Nothing _Panels.TryGetValue(m_i, m_eid) ' Was the Type Value Found? If Not m_eid Is Nothing Then ' Change the Type ID x.ChangeTypeId(m_eid) End If Catch ex2 As Exception End Try End If Catch ex1 As Exception End Try Next ' Finalize the Transaction m_t.Commit() Catch ex As Exception ' Rollback on failure m_t.RollBack() End Try
You can click randomize as many times as you want until you get the desired randomization.
Thursday, March 15, 2012
Vasari SDK Sample 1 - DividedSurfacePanelNumbering
Sample #1 of the new Vasari SDK samples is DividedSurfacePanelNumbering. The SDK sample contains code in both VB.NET and C#.
This is a short and sweet sample demonstrating how to read the column and row numbers for panels instantiated within a Divided Surface pattern. This sample needs to be run from within a family (rfa) file for an element who's face(s) have a Divided Surface and are populated with a panel based pattern family. A family file named "DividedSurfacePanelNumbering.rfa" has been provided with the SDK to use for this sample.
The first task at hand is to get the document object and attain the list of Divided Surface elements in the family. This is also a good place to initiate the required transaction.
After we have the list of divided surface elements, we can iterate them and iterate through each of their U and V sets to get all the way down to the panel instance family. Once we have the family instance, we'll set the parameters to their grid values.
The result will populate each panel instance within the Divided Surface pattern grid to their respective column and row values.
This is a short and sweet sample demonstrating how to read the column and row numbers for panels instantiated within a Divided Surface pattern. This sample needs to be run from within a family (rfa) file for an element who's face(s) have a Divided Surface and are populated with a panel based pattern family. A family file named "DividedSurfacePanelNumbering.rfa" has been provided with the SDK to use for this sample.
The first task at hand is to get the document object and attain the list of Divided Surface elements in the family. This is also a good place to initiate the required transaction.
' The Document Dim m_doc As Document = commandData.Application.ActiveUIDocument.Document ' Get the Divided Surfaces by Category Dim m_col As New FilteredElementCollector(m_doc) m_col.OfCategory(BuiltInCategory.OST_DividedSurface)
' Transaction Dim m_t As New Transaction(m_doc, "Vasari SDK - Panel Numbering") m_t.Start()
After we have the list of divided surface elements, we can iterate them and iterate through each of their U and V sets to get all the way down to the panel instance family. Once we have the family instance, we'll set the parameters to their grid values.
' Succesful Panel Renumbering Count Dim m_reportInt As Integer = 0 Try ' Iterate the DS For Each x In m_col.ToElements If TypeOf x Is DividedSurface Then ' Cast to DS Dim m_ds As DividedSurface = TryCast(x, DividedSurface) ' Iterate Columns For u = 1 To m_ds.NumberOfUGridlines - 1 ' GridNode Element Dim m_gn As New GridNode ' Set the U Grid m_gn.UIndex = u ' Iterate Rows For v = 1 To m_ds.NumberOfVGridlines - 1 ' Set the V Grid m_gn.VIndex = v ' Get the Family Instance Dim m_fi As FamilyInstance = m_ds.GetTileFamilyInstance(m_gn, 0) If m_fi Is Nothing Then Continue For ' Set the Panels's Row and Column Parameters Respectively m_fi.Parameter("Panel Column").Set(u.ToString) m_fi.Parameter("Panel Row").Set(v.ToString) ' Step the Succes Counter m_reportInt += 1 Next Next End If Next ' Commit the Transaction m_t.Commit() ' Inform the User Dim m_td As New TaskDialog("Panel Renumbering Stats") m_td.MainInstruction = m_reportInt.ToString & " Panels were succesfully renumbered!" & vbCr & "Check each panel's parameters 'Panel Column' and 'Panel Row'" m_td.MainContent = "These are shared parameters and can be scheduled from the 'Curtain Panel' category when loaded into a project." m_td.Show() Catch uvnumbering As Exception ' Rollback the transaction m_t.RollBack() End Try ' Success Return Result.Succeeded
The result will populate each panel instance within the Divided Surface pattern grid to their respective column and row values.
Vasari 2.5 SDK
Some people don't know this, but Vasari 2.5 (just released today) has an SDK and it was put together by your friends at Case. The SDK has not been posted for download just yet, but Matt Jezyk said it was OK to have you guys contact him directly if you want to get an early copy of it.
Matt can be reached at: matt dot jezyk at autodesk dot com
Once you've managed to get a copy of the SDK and look inside, you may notice a lot of similarities between this Vasari SDK and the one that ships with Revit. The main difference between the Revit SDK and this new Vasari SDK is the 8 new Vasari oriented samples found in the "Vasari (NEW)" folder.
All 8 of the new Vasari samples are available in both VB.NET and C# for your programming pleasures.
- DividedSurfacePanelNumbering
- DividedSurfacePanelRandomizer
- ExportElementXYZtoTextFile
- ExtrudeRoomsToMass
- FormulaDrivenCurves
- Incrementer
- MassColorGrossFloorArea
- PlaceFamilesByXyzFromFile
Stay tuned for a daily post outlining each one of these samples and how to use them!
Subscribe to:
Posts (Atom)