#r "C:\Program Files\Autodesk\Revit 2023\RevitAPI.dll"
#r "C:\Program Files\Autodesk\Revit 2023\RevitAPIUI.dll"
using System;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class CreateReferenceLines : IExternalCommand
{
// Input: Branched list of reference points (provided via Rhino Inside Revit)
public List<List<ReferencePoint>> ReferencePointBranches { get; set; }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
Document doc = uiApp.ActiveUIDocument.Document;
// Validate input
if (ReferencePointBranches == null || ReferencePointBranches.Count == 0)
{
message = "No reference points provided.";
return Result.Failed;
}
foreach (var branch in ReferencePointBranches)
{
if (branch.Count != 2)
{
message = "Each branch must contain exactly 2 ReferencePoints.";
return Result.Failed;
}
}
using (Transaction t = new Transaction(doc, "Create Reference Lines"))
{
t.Start();
try
{
// Iterate over branches and create reference lines
foreach (var branch in ReferencePointBranches)
{
ReferencePoint point1 = branch[0];
ReferencePoint point2 = branch[1];
CreateReferenceLine(doc, point1, point2);
}
t.Commit();
TaskDialog.Show("Success", "Reference lines created successfully.");
}
catch (Exception ex)
{
t.RollBack();
TaskDialog.Show("Error", $"An error occurred: {ex.Message}");
return Result.Failed;
}
}
return Result.Succeeded;
}
/// <summary>
/// Creates a reference line between two reference points.
/// </summary>
private void CreateReferenceLine(Document doc, ReferencePoint point1, ReferencePoint point2)
{
// Create a ReferencePointArray
ReferencePointArray referencePointArray = new ReferencePointArray();
referencePointArray.Append(point1);
referencePointArray.Append(point2);
// Create the reference line
CurveByPoints curve = doc.FamilyCreate.NewCurveByPoints(referencePointArray);
curve.IsReferenceLine = true; // Mark the curve as a reference line
}
}