Tutorial 2: Hello Wall
Create your first Revit element! Learn about Automatic Lists (Paracore's superpower), transactions, and how to create a wall.
Finished Script: 03_Tutorials/Paracore_Fundamentals/02_HelloWall.cs
🎯 What You'll Learn
- Automatic Element Discovery: Getting Revit elements (Levels, Types) automatically via inputs
- The
Transact()wrapper for model modifications - Creating geometry with
XYZpoints andLine.CreateBound() - Using
Wall.Create()to generate walls
Step 1: Create the Script
- Create a new script called
HelloWall - Open it in VS Code
Step 2: The Old Way vs. The Paracore Way
The "Old" Way (Manual API)
In standard Revit API coding, to get a Level or a Wall Type, you have to write complex "Collector" code:
// 🚫 Complex and tedious
var level = new FilteredElementCollector(Doc)
.OfClass(typeof(Level))
.FirstElement() as Level;
The Paracore Way (Automatic Discovery)
Paracore uses a "Magic" system of Automatic Discovery. You simply define what you need in your Params class, and Paracore finds it for you and presents it as a list in the UI.
Let's define our inputs first. Add this to the bottom of your script:
public class Params {
/// <summary>Select the base level</summary>
public Level TargetLevel { get; set; }
/// <summary>Select the wall type</summary>
public WallType WallType { get; set; }
/// <summary>Length in meters</summary>
[Unit("m")]
public double WallLength { get; set; } = 5.0;
/// <summary>Height in meters</summary>
[Unit("m")]
public double WallHeight { get; set; } = 3.0;
}
That's it! By simply declaring public Level TargetLevel, Paracore knows to:
- Scan your project for all Levels.
- Show them in a dropdown list.
- Pass the real
Levelobject to your script when you run it.
Step 3: Define the Wall Geometry
Now, scroll to the top of your script. We can use the variables from p immediately.
var p = new Params();
// 1. Validation (Good practice!)
if (p.TargetLevel == null || p.WallType == null)
{
Println("🚫 Please ensure both a Level and a Wall Type are selected in the UI.");
return;
}
// 2. Setup Geometry
// Create a line from (0,0,0) along the X-axis
XYZ pt1 = new XYZ(0, 0, 0);
XYZ pt2 = new XYZ(p.WallLength, 0, 0);
Line wallLine = Line.CreateBound(pt1, pt2);
Step 4: Create the Wall
Now we modify the model. Notice how we use p.TargetLevel.Id and p.WallType directly. We didn't have to search for them!
// 3. Execution
Transact("Create Tutorial Wall", () =>
{
// Create the wall on the selected level
Wall wall = Wall.Create(Doc, wallLine, p.TargetLevel.Id, false);
// Apply the selected Wall Type
wall.WallType = p.WallType;
// Set the height parameter
// Note: BuiltInParameters are the internal IDs for parameters
wall.get_Parameter(BuiltInParameter.WALL_USER_HEIGHT_PARAM)?.Set(p.WallHeight);
Println($"✅ Wall created: {wall.Id} on {p.TargetLevel.Name}");
});
Step 5: Run and Verify
- Save and switch to Paracore.
- You will see Dropdowns for "TargetLevel" and "WallType". This is the automatic discovery in action!
- Pick a Level (e.g., "Level 1") and a Wall Type (e.g., "Generic - 200mm").
- Click Run Script.
- Check Revit - your wall is there, using the exact type and level you chose.
💡 Key Takeaway
Automatic Lists save you from writing boring "boilerplate" code. If you need a Level, just ask for a Level. If you need a Door, just ask for a FamilyInstance.