Skip to main content

Global Helpers

Paracore injects several global variables and functions into your script's execution context. These helpers eliminate the need for common Revit API setup code.

Revit Context

  • Doc: The active Revit Document (Autodesk.Revit.DB.Document).
  • UIDoc: The active UI Document (Autodesk.Revit.UI.UIDocument).
  • UIApp: The Revit Application instance (Autodesk.Revit.UI.UIApplication).

Logging & Console

  • Println(string message): Prints a message followed by a newline to the Paracore Console.
  • Print(string message): Prints a message without a newline.

Why use Println? We strongly recommend using Println() instead of the standard TaskDialog.Show().

  • Non-Blocking: Println() streams messages to the Paracore Dashboard instantly without pausing your script.
  • Clean Workflow: Avoid distracting popups that interrupt your focus.

Transactions (Transact)

The Transact helper automatically handles the Revit Transaction lifecycle (Start, Commit, and Rollback on error).

Document modifications MUST be wrapped in a Transact block.

Transact("Update Wall", () => {
wall.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set("Updated");
});

🛑 Best Practices for Transactions

  1. Avoid Transactions inside Loops: Never put a Transact call inside a foreach or for loop. Opening and closing hundreds of transactions is slow and clutters the Revit Undo stack.
  2. Put Loops inside Transactions: Instead, wrap your entire loop inside a single Transact block. This ensures all changes are processed as one "undoable" operation.
  3. Undo Support: Every script execution that uses Transact can be completely reversed using the standard Revit Undo (Ctrl+Z) command.

Script Lifecycle

SetExecutionTimeout(seconds)

Extends the script execution timeout beyond the default of 10 seconds. Call at the start of long-running scripts.

SetExecutionTimeout(120); // Allow up to 2 minutes

Watchdog(callback, intervalSeconds)

Registers a background sentinel that runs on Revit idle. When run manually (not deployed), it executes the logic once for testing.

Watchdog(doc => {
var untagged = GetElements("Doors").Where(d => d.GetStr("Mark") == "");
WatchdogReport($"{untagged.Count()} untagged doors", untagged.Any() ? "warning" : "success");
}, 30);

WatchdogReport(summary, status, data?)

Sends a status report from within a sentinel callback. Status can be "success", "warning", or "error".

WatchdogReport("All clear", "success");
WatchdogReport("5 issues found", "warning", issueList);

Visual Helpers

These helpers automatically format and send data to the Analytics Tab for analysis and visualization.

MethodTypeDescription
Table(data)Global / ExtensionSends element data to the Analytics Tab.
BarChart()Global / ExtensionRenders data as a Bar Chart. Alias: BarGraph()
PieChart()Global / ExtensionRenders data as a Pie Chart. Alias: PieGraph()
LineChart()Global / ExtensionRenders data as a Line Chart. Alias: LineGraph()

Example: Quick Table

var walls = new FilteredElementCollector(Doc).OfCategory(BuiltInCategory.OST_Walls).ToElements();
Table(walls.Select(w => new { w.Name, w.Id }));

Advanced: Show(type, data)

The underlying engine uses the Show method. While you can use it directly, the specialized helpers above (which call Show internally) are recommended.

Show("table", myData);