Buckets:
Benchmark: revit-coder-14b vs Claude Opus 4.6
All 40 questions and all responses, unedited.
Methodology
40 Revit C# code generation questions, evaluated zero-shot. No system prompt, no few-shot examples, no domain context. Just the raw question to each model.
- revit-coder-14b: Run locally via Ollama (F16 weights, no quantization)
- Claude Opus 4.6: Called via Anthropic API, prompted only with "Answer with code only. No explanation."
Both models received identical questions. Every question and every response is included here in full.
Scoring
Each response is scored automatically on three axes (no human grading, no reference answers):
| Component | Weight | What it measures |
|---|---|---|
| Signal Presence | 40% | Fraction of expected domain keywords found (e.g., FilteredElementCollector, Transaction) |
| Code Quality | 30% | Domain-specific structural checks (namespaces, class structure, API patterns) |
| Completeness | 30% | Response length, code block formatting, error-free output |
Composite = 0.4 x signal + 0.3 x quality + 0.3 x completeness
Overall Results
| Model | Avg Score | Wins | Win Rate |
|---|---|---|---|
| revit-coder-14b | 0.799 | 25 | 62.5% |
| Claude Opus 4.6 | 0.793 | 15 | 37.5% |
By Difficulty
| Difficulty | Count | 14B Avg | Claude Avg | 14B Wins | Claude Wins |
|---|---|---|---|---|---|
| Easy | 9 | 0.800 | 0.796 | 5 | 4 |
| Medium | 19 | 0.839 | 0.801 | 14 | 5 |
| Hard | 12 | 0.736 | 0.779 | 6 | 6 |
All 40 Questions & Responses
RC01 | Easy | Winner: Claude Opus 4.6 (-0.124)
Question: Write C# code for a FilteredElementCollector that retrieves all wall instances in the active document and returns them as a List
Expected signals: FilteredElementCollector, BuiltInCategory, OST_Walls, WhereElementIsNotElementType, ToElements, List
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.500 | 0.667 |
| Quality | 0.300 | 0.417 |
| Completeness | 0.625 | 0.700 |
| Composite | 0.477 | 0.602 |
revit-coder-14b response
var collector = new FilteredElementCollector(doc);
var walls = collector.OfClass(typeof(Wall)).ToElements().Cast<Element>().ToList();
Claude Opus 4.6 response
FilteredElementCollector collector = new FilteredElementCollector(doc);
List<Element> walls = collector
.OfClass(typeof(Wall))
.WhereElementIsNotElementType()
.ToElements()
.ToList();
RC02 | Medium | Winner: revit-coder-14b (+0.165)
Question: Write C# code to read the area of every room in the model using BuiltInParameter.ROOM_AREA, convert from internal units (square feet) to square meters, and return a Dictionary<string, double> mapping room name to area in m². Write code only. No explanation.
Expected signals: FilteredElementCollector, BuiltInParameter, ROOM_AREA, AsDouble, UnitUtils, ConvertFromInternalUnits, Dictionary, BuiltInCategory.OST_Rooms
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 1.000 | 1.000 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.922 | 0.757 |
revit-coder-14b response
using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class RoomAreaExtractor
{
public static Dictionary<string, double> GetRoomAreas(Document doc)
{
var roomAreas = new Dictionary<string, double>();
var collector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms);
foreach (var room in collector)
{
var roomElement = room as Room;
if (roomElement != null)
{
var areaParam = roomElement.get_Parameter(BuiltInParameter.ROOM_AREA);
if (areaParam != null && !areaParam.IsReadOnly)
{
var areaInFeet = areaParam.AsDouble();
var areaInMeters = UnitUtils.ConvertFromInternalUnits(areaInFeet, DisplayUnitType.DUT_SQUARE_METERS);
roomAreas.Add(roomElement.Name, areaInMeters);
}
}
}
return roomAreas;
}
}
Claude Opus 4.6 response
public Dictionary<string, double> GetRoomAreas(Document doc)
{
var result = new Dictionary<string, double>();
var rooms = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Rooms)
.WhereElementIsNotElementType()
.ToElements();
foreach (var elem in rooms)
{
Room room = elem as Room;
if (room == null || room.Area <= 0) continue;
Parameter areaParam = room.get_Parameter(BuiltInParameter.ROOM_AREA);
double sqFt = areaParam.AsDouble();
double sqM = UnitUtils.ConvertFromInternalUnits(sqFt, UnitTypeId.SquareMeters);
string name = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString() ?? "Unnamed";
if (result.ContainsKey(name))
name = name + " (" + room.Id.IntegerValue + ")";
result[name] = sqM;
}
return result;
}
RC03 | Medium | Winner: revit-coder-14b (+0.050)
Question: Write a complete IExternalCommand implementation that creates a new wall along a line from (0,0,0) to (20,0,0) on Level 1. Include the Transaction, level lookup, and error handling with TaskDialog. Write code only. No explanation.
Expected signals: IExternalCommand, Execute, Transaction, Wall.Create, Line.CreateBound, XYZ, Level, FilteredElementCollector, t.Start, t.Commit, TaskDialog, Result.Succeeded
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.833 | 0.833 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.881 | 0.831 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Linq;
public class CreateWallCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
UIApplication uiApp = commandData.Application;
UIDocument uidoc = uiApp.ActiveUIDocument;
Document doc = uidoc.Document;
// Find Level 1
Level level1 = null;
using (var collector = new FilteredElementCollector(doc))
{
level1 = collector.OfClass(typeof(Level))
.Cast<Level>()
.FirstOrDefault(l => l.Name == "Level 1");
}
if (level1 == null)
{
TaskDialog.Show("Error", "Could not find Level 1.");
return Result.Failed;
}
// Define wall line
XYZ startPoint = new XYZ(0, 0, level1.Elevation);
XYZ endPoint = new XYZ(20, 0, level1.Elevation);
Line wallLine = Line.CreateBound(startPoint, endPoint);
// Create wall
using (Transaction trans = new Transaction(doc, "Create Wall"))
{
trans.Start();
Wall wall = Wall.Create(doc, wallLine, level1.Id, true);
trans.Commit();
}
return Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
}
}
Claude Opus 4.6 response
[Transaction(TransactionMode.Manual)]
public class CreateWallCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
try
{
Level level1 = new FilteredElementCollector(doc)
.OfClass(typeof(Level))
.Cast<Level>()
.FirstOrDefault(l => l.Name == "Level 1");
if (level1 == null)
{
TaskDialog.Show("Error", "Level 1 not found.");
return Result.Failed;
}
Line line = Line.CreateBound(new XYZ(0, 0, 0), new XYZ(20, 0, 0));
using (Transaction tx = new Transaction(doc, "Create Wall"))
{
tx.Start();
Wall wall = Wall.Create(doc, line, level1.Id, false);
tx.Commit();
}
TaskDialog.Show("Success", "Wall created successfully.");
return Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message;
TaskDialog.Show("Error", ex.Message);
return Result.Failed;
}
}
}
RC04 | Hard | Winner: Claude Opus 4.6 (-0.148)
Question: Validate this Revit API code and list every bug in code comments, then show the corrected version:
public void RenameRooms(Document doc)
{
var rooms = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Rooms)
.ToElements();
foreach (var room in rooms)
{
room.get_Parameter(BuiltInParameter.ROOM_NAME).Set("Updated");
}
}
Write code only. No explanation.
Expected signals: Transaction, null, WhereElementIsNotElementType, IsReadOnly, t.Start, t.Commit
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.333 | 0.667 |
| Quality | 0.833 | 0.833 |
| Completeness | 0.775 | 0.825 |
| Composite | 0.616 | 0.764 |
revit-coder-14b response
public void RenameRooms(Document doc)
{
using (var trans = new Transaction(doc, "Rename Rooms"))
{
trans.Start();
var rooms = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Rooms)
.ToElements();
foreach (var room in rooms)
{
var param = room.get_Parameter(BuiltInParameter.ROOM_NAME);
if (param != null)
{
param.Set("Updated");
}
}
trans.Commit();
}
}
Claude Opus 4.6 response
// BUGS:
// 1. No Transaction wrapping the parameter Set() calls - modifying parameters requires a Transaction
// 2. No null check on the parameter returned by get_Parameter - it could be null
// 3. No check if the parameter is read-only
// 4. Should use WhereElementIsNotElementType() to get room instances only
// 5. Should filter out unplaced rooms (Area <= 0)
public void RenameRooms(Document doc)
{
var rooms = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Rooms)
.WhereElementIsNotElementType()
.ToElements();
using (Transaction tx = new Transaction(doc, "Rename Rooms"))
{
tx.Start();
foreach (var room in rooms)
{
if ((room as Room)?.Area <= 0) continue;
Parameter nameParam = room.get_Parameter(BuiltInParameter.ROOM_NAME);
if (nameParam != null && !nameParam.IsReadOnly)
{
nameParam.Set("Updated");
}
}
tx.Commit();
}
}
RC05 | Medium | Winner: revit-coder-14b (+0.200)
Question: Write C# code to collect all floor instances in the model, group them by floor type name, and return a Dictionary<string, int> with the count of each type. Write code only. No explanation.
Expected signals: FilteredElementCollector, BuiltInCategory.OST_Floors, WhereElementIsNotElementType, GetTypeId, doc.GetElement, Name, Dictionary, GroupBy
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.625 | 0.500 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.757 | 0.557 |
revit-coder-14b response
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class FloorCollector
{
public static Dictionary<string, int> CollectFloorTypes(Document doc)
{
var floorTypes = new Dictionary<string, int>();
var floors = new FilteredElementCollector(doc)
.OfClass(typeof(Floor))
.ToElements();
foreach (var floor in floors)
{
var floorType = floor.GetTypeId();
if (floorType != ElementId.InvalidElementId)
{
var floorTypeName = doc.GetElement(floorType).Name;
if (floorTypes.ContainsKey(floorTypeName))
{
floorTypes[floorTypeName]++;
}
else
{
floorTypes.Add(floorTypeName, 1);
}
}
}
return floorTypes;
}
}
Claude Opus 4.6 response
public Dictionary<string, int> GetFloorCountsByType(Document doc)
{
var floors = new FilteredElementCollector(doc)
.OfClass(typeof(Floor))
.WhereElementIsNotElementType()
.Cast<Floor>();
var result = new Dictionary<string, int>();
foreach (var floor in floors)
{
string typeName = floor.FloorType.Name;
if (result.ContainsKey(typeName))
result[typeName]++;
else
result[typeName] = 1;
}
return result;
}
RC06 | Medium | Winner: revit-coder-14b (+0.050)
Question: Write C# code to place a family instance at a given XYZ point. Load the family from a .rfa file path if not already loaded, find the first available FamilySymbol, activate it, and place it on Level 1 inside a Transaction. Write code only. No explanation.
Expected signals: FamilySymbol, Activate, NewFamilyInstance, doc.LoadFamily, Transaction, Level, FilteredElementCollector, t.Start, t.Commit, StructuralType
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.800 | 0.800 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.868 | 0.818 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Linq;
public class PlaceFamilyInstanceCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document doc = uiDoc.Document;
if (doc.IsReadOnly)
{
message = "Document is read-only.";
return Result.Failed;
}
// Get the family path from the user
string familyPath = GetFamilyPathFromUser();
if (string.IsNullOrEmpty(familyPath))
{
message = "Family path is required.";
return Result.Failed;
}
// Load the family if not already loaded
FamilySymbol familySymbol = GetFamilySymbol(doc, familyPath);
if (familySymbol == null)
{
message = "Failed to load family symbol.";
return Result.Failed;
}
// Get the point from the user
XYZ point = GetPointFromUser();
if (point == null)
{
message = "Point is required.";
return Result.Failed;
}
// Get Level 1
Level level1 = GetLevel1(doc);
if (level1 == null)
{
message = "Level 1 not found.";
return Result.Failed;
}
// Place the family instance
using (Transaction transaction = new Transaction(doc, "Place Family Instance"))
{
transaction.Start();
// Place the family instance
FamilyInstance familyInstance = doc.Create.NewFamilyInstance(point, familySymbol, level1, StructuralType.NonStructural);
transaction.Commit();
}
return Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
}
private string GetFamilyPathFromUser()
{
// Implement your logic to get the family path from the user
return @"C:\path\to\your\family.rfa";
}
private XYZ GetPointFromUser()
{
// Implement your logic to get the point from the user
return new XYZ(0, 0, 0);
}
private Level GetLevel1(Document doc)
{
// Get Level 1
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(Level));
Level level1 = collector.Cast<Level>().FirstOrDefault(l => l.Name == "Level 1");
return level1;
}
private FamilySymbol GetFamilySymbol(Document doc, string familyPath)
{
// Check if the family is already loaded
FamilySymbol familySymbol = GetLoadedFamilySymbol(doc, familyPath);
if (familySymbol != null)
{
return familySymbol;
}
// Load the family
Family family = LoadFamily(doc, familyPath);
if (family == null)
{
return null;
}
// Get the first available family symbol
familySymbol = GetFirstAvailableFamilySymbol(family);
if (familySymbol == null)
{
return null;
}
// Activate the family symbol
familySymbol.Activate();
return familySymbol;
}
private FamilySymbol GetLoadedFamilySymbol(Document doc, string familyPath)
{
// Check if the family is already loaded
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(Family));
Family loadedFamily = collector.Cast<Family>().FirstOrDefault(f => f.GetFamilyName() == System.IO.Path.GetFileNameWithoutExtension(familyPath));
if (loadedFamily != null)
{
// Get the first available family symbol
FamilySymbol familySymbol = GetFirstAvailableFamilySymbol(loadedFamily);
if (familySymbol != null)
{
return familySymbol;
}
}
return null;
}
private Family LoadFamily(Document doc, string familyPath)
{
// Load the family
Family family = doc.LoadFamily(familyPath, new FamilyLoadOptions());
if (family == null)
{
return null;
}
return family;
}
private FamilySymbol GetFirstAvailableFamilySymbol(Family family)
{
// Get the first available family symbol
FamilySymbol familySymbol = family.GetFamilySymbolIds().FirstOrDefault();
if (familySymbol == null)
{
return null;
}
return familySymbol;
}
}
Claude Opus 4.6 response
public void PlaceFamilyInstance(Document doc, string rfaPath, XYZ point)
{
Family family = null;
FamilySymbol symbol = null;
// Check if already loaded
var families = new FilteredElementCollector(doc)
.OfClass(typeof(Family))
.Cast<Family>();
string familyName = Path.GetFileNameWithoutExtension(rfaPath);
family = families.FirstOrDefault(f => f.Name == familyName);
using (Transaction tx = new Transaction(doc, "Place Family Instance"))
{
tx.Start();
if (family == null)
{
if (!doc.LoadFamily(rfaPath, out family))
throw new Exception("Failed to load family.");
}
ISet<ElementId> symbolIds = family.GetFamilySymbolIds();
if (symbolIds.Count == 0)
throw new Exception("No symbols found in family.");
symbol = doc.GetElement(symbolIds.First()) as FamilySymbol;
if (!symbol.IsActive)
symbol.Activate();
Level level1 = new FilteredElementCollector(doc)
.OfClass(typeof(Level))
.Cast<Level>()
.FirstOrDefault(l => l.Name == "Level 1");
if (level1 == null)
throw new Exception("Level 1 not found.");
doc.Create.NewFamilyInstance(point, symbol, level1, StructuralType.NonStructural);
tx.Commit();
}
}
RC07 | Hard | Winner: revit-coder-14b (+0.125)
Question: Write C# code to extract the solid geometry from a wall element using the GeometryElement API. Get the geometry with ComputeReferences, iterate through GeometryObject instances, handle GeometryInstance by getting instance geometry, and return the first Solid with non-zero volume. Write code only. No explanation.
Expected signals: GeometryElement, Options, ComputeReferences, GetGeometryObjectFromReference, GeometryInstance, GetInstanceGeometry, Solid, Volume, OfType, DetailLevel
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.700 | 0.800 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.802 | 0.677 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
public static class GeometryExtractor
{
public static Solid GetSolidGeometry(Wall wall)
{
Options options = new Options();
options.ComputeReferences = true;
options.DetailLevel = ViewDetailLevel.Undefined;
options.IncludeNonVisibleObjects = true;
options.SetDetailLevel(ViewDetailLevel.Undefined);
GeometryElement geometryElement = wall.get_Geometry(options);
if (geometryElement == null) return null;
foreach (GeometryObject geometryObject in geometryElement)
{
if (geometryObject is Solid solid)
{
if (solid.Volume > 0) return solid;
}
else if (geometryObject is GeometryInstance geometryInstance)
{
GeometryElement instanceGeometry = geometryInstance.GetSymbolGeometry();
if (instanceGeometry != null)
{
foreach (GeometryObject instanceObject in instanceGeometry)
{
if (instanceObject is Solid instanceSolid)
{
if (instanceSolid.Volume > 0) return instanceSolid;
}
}
}
}
}
return null;
}
}
Claude Opus 4.6 response
public Solid GetWallSolid(Wall wall)
{
Options options = new Options();
options.ComputeReferences = true;
options.DetailLevel = ViewDetailLevel.Fine;
GeometryElement geomElem = wall.get_Geometry(options);
foreach (GeometryObject geomObj in geomElem)
{
Solid solid = geomObj as Solid;
if (solid != null && solid.Volume > 0)
return solid;
GeometryInstance geomInst = geomObj as GeometryInstance;
if (geomInst != null)
{
GeometryElement instGeom = geomInst.GetInstanceGeometry();
foreach (GeometryObject instObj in instGeom)
{
solid = instObj as Solid;
if (solid != null && solid.Volume > 0)
return solid;
}
}
}
return null;
}
RC08 | Medium | Winner: revit-coder-14b (+0.050)
Question: Write C# code to create a new ViewPlan for Level 1 using a ViewFamilyType, then create a new ViewSheet with a titleblock, and place the view on the sheet using Viewport.Create. All inside a Transaction. Write code only. No explanation.
Expected signals: ViewPlan, ViewFamilyType, ViewSheet, Viewport, Create, Transaction, FilteredElementCollector, Level, TitleBlock, OfClass
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 1.000 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.948 | 0.897 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class ViewCreationCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
UIApplication uiApp = commandData.Application;
UIDocument uidoc = uiApp.ActiveUIDocument;
Document doc = uidoc.Document;
using (Transaction trans = new Transaction(doc, "Create ViewPlan and ViewSheet"))
{
trans.Start();
// Get Level 1
FilteredElementCollector levelCollector = new FilteredElementCollector(doc)
.OfClass(typeof(Level))
.WhereElementIsNotElementType();
Level level1 = levelCollector.FirstElement() as Level;
// Get ViewFamilyType for Plan
FilteredElementCollector viewFamilyTypeCollector = new FilteredElementCollector(doc)
.OfClass(typeof(ViewFamilyType))
.WhereElementIsElementType();
ViewFamilyType planViewType = viewFamilyTypeCollector
.First(e => (e as ViewFamilyType).ViewFamily == ViewFamily.Plan) as ViewFamilyType;
// Create ViewPlan
ViewPlan viewPlan = ViewPlan.Create(doc, planViewType.Id, level1.Id);
// Get ViewSheet and TitleBlock
FilteredElementCollector sheetCollector = new FilteredElementCollector(doc)
.OfClass(typeof(ViewSheet))
.WhereElementIsNotElementType();
ViewSheet viewSheet = sheetCollector.FirstElement() as ViewSheet;
FilteredElementCollector titleBlockCollector = new FilteredElementCollector(doc)
.OfClass(typeof(FamilySymbol))
.WhereElementIsElementType();
FamilySymbol titleBlock = titleBlockCollector
.First(e => (e as FamilySymbol).FamilyName.Contains("TitleBlock")) as FamilySymbol;
// Place TitleBlock on ViewSheet
XYZ titleBlockLocation = new XYZ(0.5, 0.5, 0);
ElementId titleBlockId = doc.Create.NewFamilyInstance(titleBlockLocation, titleBlock, viewSheet, StructuralType.NonStructural);
// Place ViewPlan on ViewSheet
XYZ viewportLocation = new XYZ(0.5, 0.5, 0);
Viewport viewport = Viewport.Create(doc, viewSheet.Id, viewPlan.Id, viewportLocation);
trans.Commit();
}
return Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
}
}
Claude Opus 4.6 response
public void CreateViewAndSheet(Document doc)
{
using (Transaction tx = new Transaction(doc, "Create View and Sheet"))
{
tx.Start();
// Find Level 1
Level level = new FilteredElementCollector(doc)
.OfClass(typeof(Level))
.Cast<Level>()
.FirstOrDefault(l => l.Name == "Level 1");
// Find ViewFamilyType for FloorPlan
ViewFamilyType vft = new FilteredElementCollector(doc)
.OfClass(typeof(ViewFamilyType))
.Cast<ViewFamilyType>()
.FirstOrDefault(v => v.ViewFamily == ViewFamily.FloorPlan);
ViewPlan viewPlan = ViewPlan.Create(doc, vft.Id, level.Id);
viewPlan.Name = "New Floor Plan";
// Find titleblock
FamilySymbol titleblock = new FilteredElementCollector(doc)
.OfClass(typeof(FamilySymbol))
.OfCategory(BuiltInCategory.OST_TitleBlocks)
.Cast<FamilySymbol>()
.FirstOrDefault();
if (!titleblock.IsActive)
titleblock.Activate();
ViewSheet sheet = ViewSheet.Create(doc, titleblock.Id);
sheet.Name = "New Sheet";
sheet.SheetNumber = "A-101";
XYZ center = new XYZ(1.5, 1.0, 0);
Viewport.Create(doc, sheet.Id, viewPlan.Id, center);
tx.Commit();
}
}
RC09 | Easy | Winner: Claude Opus 4.6 (-0.032)
Question: Write C# code to get all doors in the model, then for each door read its width and height parameters using BuiltInParameter, and return a list of strings formatted as "DoorMark: W x H mm". Write code only. No explanation.
Expected signals: FilteredElementCollector, BuiltInCategory.OST_Doors, WhereElementIsNotElementType, BuiltInParameter, DOOR_WIDTH, DOOR_HEIGHT, AsDouble, UnitUtils, List
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.444 | 1.000 |
| Quality | 1.000 | 0.417 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.725 | 0.757 |
revit-coder-14b response
using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class DoorInfoExtractor
{
public static List<string> GetDoorDimensions(Document doc)
{
var doorDimensions = new List<string>();
using (var transactionGroup = new TransactionGroup(doc))
{
transactionGroup.Start("Get Door Dimensions");
try
{
var doors = new FilteredElementCollector(doc)
.OfClass(typeof(FamilyInstance))
.OfCategory(BuiltInCategory.OST_Doors)
.ToElements();
foreach (var door in doors)
{
var doorMark = door.Parameter(BuiltInParameter.ALL_MODEL_MARK)?.AsString();
var width = door.Parameter(BuiltInParameter.INSTANCE_WIDTH_PARAM)?.AsValueString();
var height = door.Parameter(BuiltInParameter.INSTANCE_HEIGHT_PARAM)?.AsValueString();
if (!string.IsNullOrEmpty(doorMark) && !string.IsNullOrEmpty(width) && !string.IsNullOrEmpty(height))
{
doorDimensions.Add($"{doorMark}: {width} x {height} mm");
}
}
transactionGroup.Assimilate();
}
catch (Exception ex)
{
transactionGroup.RollBack();
throw ex;
}
}
return doorDimensions;
}
}
Claude Opus 4.6 response
public List<string> GetDoorDimensions(Document doc)
{
var result = new List<string>();
var doors = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Doors)
.WhereElementIsNotElementType()
.ToElements();
foreach (var door in doors)
{
string mark = door.get_Parameter(BuiltInParameter.ALL_MODEL_MARK)?.AsString() ?? "No Mark";
double widthFt = door.get_Parameter(BuiltInParameter.DOOR_WIDTH)?.AsDouble() ?? 0;
double heightFt = door.get_Parameter(BuiltInParameter.DOOR_HEIGHT)?.AsDouble() ?? 0;
double widthMm = UnitUtils.ConvertFromInternalUnits(widthFt, UnitTypeId.Millimeters);
double heightMm = UnitUtils.ConvertFromInternalUnits(heightFt, UnitTypeId.Millimeters);
result.Add($"{mark}: {widthMm:F0} x {heightMm:F0} mm");
}
return result;
}
RC10 | Hard | Winner: Claude Opus 4.6 (-0.299)
Question: Write C# code implementing an IUpdater that monitors when any wall's Location property changes, and automatically logs the wall's ElementId and new location curve endpoints to a text file. Include the registration in IExternalApplication.OnStartup. Write code only. No explanation.
Expected signals: IUpdater, GetUpdaterId, Execute, GetAddedElementIds, GetModifiedElementIds, UpdaterRegistry, RegisterUpdater, AddTrigger, ChangeType, LocationCurve, IExternalApplication
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.000 | 0.909 |
| Quality | 0.750 | 0.583 |
| Completeness | 0.875 | 0.825 |
| Composite | 0.487 | 0.786 |
revit-coder-14b response
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Analysis;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.MEPModel;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using
</details>
<details>
<summary>Claude Opus 4.6 response</summary>
```csharp
public class WallLocationUpdater : IUpdater
{
static AddInId _appId;
static UpdaterId _updaterId;
public WallLocationUpdater(AddInId id)
{
_appId = id;
_updaterId = new UpdaterId(_appId, new Guid("D4B3C5A1-2E6F-4A8B-9C0D-1E2F3A4B5C6D"));
}
public void Execute(UpdaterData data)
{
Document doc = data.GetDocument();
string logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "WallLocationLog.txt");
foreach (ElementId id in data.GetModifiedElementIds())
{
Wall wall = doc.GetElement(id) as Wall;
if (wall == null) continue;
LocationCurve locCurve = wall.Location as LocationCurve;
if (locCurve == null) continue;
Curve curve = locCurve.Curve;
XYZ start = curve.GetEndPoint(0);
XYZ end = curve.GetEndPoint(1);
string entry = $"{DateTime.Now}: Wall {id.IntegerValue} moved to ({start.X:F2},{start.Y:F2},{start.Z:F2}) - ({end.X:F2},{end.Y:F2},{end.Z:F2})";
File.AppendAllText(logPath, entry + Environment.NewLine);
}
}
public string GetAdditionalInformation() => "Monitors wall location changes";
public ChangePriority GetChangePriority() => ChangePriority.FloorsRoofsStructuralWalls;
public UpdaterId GetUpdaterId() => _updaterId;
public string GetUpdaterName() => "WallLocationUpdater";
}
public class WallLocationApp : IExternalApplication
{
public Result OnStartup(UIControlledApplication application)
{
WallLocationUpdater updater = new WallLocationUpdater(application.ActiveAddInId);
UpdaterRegistry.RegisterUpdater(updater);
ElementClassFilter wallFilter = new ElementClassFilter(typeof(Wall));
UpdaterRegistry.AddTrigger(
updater.GetUpdaterId(),
wallFilter,
Element.GetChangeTypeGeometry());
return Result.Succeeded;
}
public Result OnShutdown(UIControlledApplication application)
{
WallLocationUpdater updater = new WallLocationUpdater(application.ActiveAddInId);
UpdaterRegistry.UnregisterUpdater(updater.GetUpdaterId());
return Result.Succeeded;
}
}
RC11 | Medium | Winner: revit-coder-14b (+0.100)
Question: Write C# code to collect all Revit links (RevitLinkInstance) in the current document, get each linked document, then count the total number of walls across all linked models. Return a Dictionary<string, int> mapping link name to wall count. Write code only. No explanation.
Expected signals: RevitLinkInstance, FilteredElementCollector, GetLinkDocument, BuiltInCategory.OST_Walls, WhereElementIsNotElementType, Dictionary, Name, Count
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.750 | 0.875 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.807 | 0.708 |
revit-coder-14b response
using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class LinkWallCounter
{
public static Dictionary<string, int> CountWallsInLinks(Document doc)
{
var linkWallCounts = new Dictionary<string, int>();
var linkInstances = new FilteredElementCollector(doc)
.OfClass(typeof(RevitLinkInstance))
.ToElements();
foreach (var linkInstance in linkInstances)
{
var linkDoc = ((RevitLinkInstance)linkInstance).GetLinkDocument();
if (linkDoc == null) continue;
var wallCount = new FilteredElementCollector(linkDoc)
.OfClass(typeof(Wall))
.ToElementIds()
.Count();
linkWallCounts.Add(linkInstance.Name, wallCount);
}
return linkWallCounts;
}
}
Claude Opus 4.6 response
public Dictionary<string, int> GetLinkedWallCounts(Document doc)
{
var result = new Dictionary<string, int>();
var links = new FilteredElementCollector(doc)
.OfClass(typeof(RevitLinkInstance))
.Cast<RevitLinkInstance>();
foreach (var link in links)
{
Document linkedDoc = link.GetLinkDocument();
if (linkedDoc == null) continue;
int wallCount = new FilteredElementCollector(linkedDoc)
.OfClass(typeof(Wall))
.WhereElementIsNotElementType()
.GetElementCount();
string linkName = link.Name;
result[linkName] = wallCount;
}
return result;
}
RC12 | Medium | Winner: revit-coder-14b (+0.050)
Question: Write C# code to move a selected element by a vector (10, 5, 0) feet using ElementTransformUtils.MoveElement. Get the currently selected element from UIDocument.Selection, validate it exists, and perform the move inside a Transaction. Write code only. No explanation.
Expected signals: ElementTransformUtils, MoveElement, Selection, GetElementIds, XYZ, Transaction, t.Start, t.Commit, UIDocument, ElementId
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.800 | 0.800 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.853 | 0.802 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void MoveSelectedElementByVector()
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
if (uidoc == null || doc == null)
{
return;
}
ElementId selectedElementId = uidoc.Selection.GetElementIds().FirstOrDefault();
if (selectedElementId == null)
{
return;
}
Element selectedElement = doc.GetElement(selectedElementId);
if (selectedElement == null)
{
return;
}
using (Transaction transaction = new Transaction(doc, "Move Element"))
{
transaction.Start();
try
{
XYZ translationVector = new XYZ(10, 5, 0);
ElementTransformUtils.MoveElement(doc, selectedElementId, translationVector);
transaction.Commit();
}
catch
{
transaction.RollBack();
throw;
}
}
}
Claude Opus 4.6 response
[Transaction(TransactionMode.Manual)]
public class MoveElementCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
ICollection<ElementId> selectedIds = uidoc.Selection.GetElementIds();
if (selectedIds.Count == 0)
{
TaskDialog.Show("Error", "No element selected.");
return Result.Failed;
}
ElementId elemId = selectedIds.First();
XYZ translation = new XYZ(10, 5, 0);
using (Transaction tx = new Transaction(doc, "Move Element"))
{
tx.Start();
ElementTransformUtils.MoveElement(doc, elemId, translation);
tx.Commit();
}
return Result.Succeeded;
}
}
RC13 | Hard | Winner: Claude Opus 4.6 (-0.215)
Question: Write C# code to create a shared parameter from an external definition file, add it to the Walls category as an instance parameter under the Data group, and bind it to the project using BindingMap. Include creating the DefinitionFile and DefinitionGroup. Write code only. No explanation.
Expected signals: DefinitionFile, ExternalDefinitionCreationOptions, DefinitionGroup, ExternalDefinition, CategorySet, InstanceBinding, BindingMap, Transaction, ParameterBindings, OpenSharedParameterFile
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.400 | 1.000 |
| Quality | 0.917 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.682 | 0.897 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.UI;
public class SharedParameterCreator
{
public static void CreateSharedParameter(Document doc)
{
try
{
// Create a new DefinitionFile
DefinitionFile definitionFile = DefinitionFile.Create("C:\\SharedParameters.txt");
// Create a new DefinitionGroup
DefinitionGroup definitionGroup = definitionFile.Groups.Create("Data");
// Create a new Definition
Definition definition = definitionGroup.Definitions.Create("MyParameter", StorageType.String);
// Create a new ParameterBinding
ParameterBinding parameterBinding = new ParameterBinding(new ElementId(BuiltInCategory.OST_Walls), definition);
// Create a new BindingMap
BindingMap bindingMap = new BindingMap();
// Add the parameter binding to the BindingMap
bindingMap.Insert(definition, parameterBinding);
// Set the binding map to the document
doc.ParameterBindings = bindingMap;
}
catch (Exception ex)
{
TaskDialog.Show("Error", ex.Message);
}
}
}
Claude Opus 4.6 response
public void CreateSharedParameter(Document doc, UIApplication uiApp)
{
string sharedParamFile = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"SharedParams.txt");
if (!File.Exists(sharedParamFile))
File.Create(sharedParamFile).Close();
uiApp.Application.SharedParametersFilename = sharedParamFile;
DefinitionFile defFile = uiApp.Application.OpenSharedParameterFile();
DefinitionGroup group = defFile.Groups.get_Item("Custom Parameters")
?? defFile.Groups.Create("Custom Parameters");
ExternalDefinitionCreationOptions options =
new ExternalDefinitionCreationOptions("WallData", SpecTypeId.String.Text);
options.Visible = true;
Definition definition = group.Definitions.get_Item("WallData")
?? group.Definitions.Create(options);
CategorySet catSet = uiApp.Application.Create.NewCategorySet();
catSet.Insert(doc.Settings.Categories.get_Item(BuiltInCategory.OST_Walls));
InstanceBinding binding = uiApp.Application.Create.NewInstanceBinding(catSet);
using (Transaction tx = new Transaction(doc, "Add Shared Parameter"))
{
tx.Start();
BindingMap bindingMap = doc.ParameterBindings;
bindingMap.Insert(definition, binding, BuiltInParameterGroup.PG_DATA);
tx.Commit();
}
}
RC14 | Medium | Winner: revit-coder-14b (+0.150)
Question: Write C# code to get all rooms in the model, extract each room's boundary segments using GetBoundarySegments with SpatialElementBoundaryOptions, and return a Dictionary<string, List> mapping room name to its boundary curves. Write code only. No explanation.
Expected signals: Room, GetBoundarySegments, SpatialElementBoundaryOptions, BoundarySegment, GetCurve, Curve, Dictionary, FilteredElementCollector, BuiltInCategory.OST_Rooms
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 1.000 | 1.000 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.922 | 0.772 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using System.Collections.Generic;
public class RoomBoundaryExtractor
{
public static Dictionary<string, List<Curve>> GetRoomBoundaries(Document doc)
{
var roomBoundaries = new Dictionary<string, List<Curve>>();
var options = new SpatialElementBoundaryOptions();
options.StoreFreeBoundaryFaces = true;
var rooms = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Rooms)
.WhereElementIsNotElementType()
.ToElements();
foreach (var room in rooms)
{
var roomElement = room as Room;
if (roomElement == null) continue;
var boundarySegments = roomElement.GetBoundarySegments(options);
var curves = new List<Curve>();
foreach (var segment in boundarySegments)
{
foreach (var curve in segment.GetCurves())
{
curves.Add(curve);
}
}
roomBoundaries.Add(roomElement.Name, curves);
}
return roomBoundaries;
}
}
Claude Opus 4.6 response
public Dictionary<string, List<Curve>> GetRoomBoundaries(Document doc)
{
var result = new Dictionary<string, List<Curve>>();
var rooms = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Rooms)
.WhereElementIsNotElementType()
.Cast<Room>();
SpatialElementBoundaryOptions options = new SpatialElementBoundaryOptions();
options.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Finish;
foreach (Room room in rooms)
{
if (room.Area <= 0) continue;
string name = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString() ?? "Unnamed";
var curves = new List<Curve>();
IList<IList<BoundarySegment>> boundaries = room.GetBoundarySegments(options);
if (boundaries == null) continue;
foreach (IList<BoundarySegment> loop in boundaries)
{
foreach (BoundarySegment seg in loop)
{
curves.Add(seg.GetCurve());
}
}
if (result.ContainsKey(name))
name = name + " (" + room.Id.IntegerValue + ")";
result[name] = curves;
}
return result;
}
RC15 | Medium | Winner: revit-coder-14b (+0.057)
Question: Write C# code to find all curtain walls in the model, access their CurtainGrid, iterate through panel and mullion ElementIds, and return a summary of panel count and mullion count per curtain wall. Write code only. No explanation.
Expected signals: CurtainGrid, GetPanelIds, GetMullionIds, Wall, FilteredElementCollector, BuiltInCategory.OST_Walls, WallType, CurtainWallType, Dictionary
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.444 | 0.778 |
| Quality | 1.000 | 0.417 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.725 | 0.669 |
revit-coder-14b response
using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
public class CurtainWallAnalyzer
{
public static Dictionary<ElementId, CurtainWallSummary> AnalyzeCurtainWalls(Document doc)
{
var curtainWalls = new FilteredElementCollector(doc)
.OfClass(typeof(FamilyInstance))
.OfCategory(BuiltInCategory.OST_CurtainWalls)
.ToElementIds();
var summary = new Dictionary<ElementId, CurtainWallSummary>();
using (var transGroup = new TransactionGroup(doc))
{
transGroup.Start("Curtain Wall Analysis");
foreach (var wallId in curtainWalls)
{
var wall = doc.GetElement(wallId) as FamilyInstance;
if (wall == null) continue;
var curtainGrid = wall.GetCurtainGrid();
if (curtainGrid == null) continue;
var panels = curtainGrid.GetPanels();
var mullions = curtainGrid.GetMullions();
var panelCount = panels.Count;
var mullionCount = mullions.Count;
summary.Add(wallId, new CurtainWallSummary(panelCount, mullionCount));
}
transGroup.Assimilate();
}
return summary;
}
public class CurtainWallSummary
{
public int PanelCount { get; }
public int MullionCount { get; }
public CurtainWallSummary(int panelCount, int mullionCount)
{
PanelCount = panelCount;
MullionCount = mullionCount;
}
}
}
Claude Opus 4.6 response
public Dictionary<string, (int panelCount, int mullionCount)> GetCurtainWallSummary(Document doc)
{
var result = new Dictionary<string, (int, int)>();
var curtainWalls = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.WhereElementIsNotElementType()
.Cast<Wall>()
.Where(w => w.WallType.Kind == WallKind.Curtain);
foreach (Wall cw in curtainWalls)
{
CurtainGrid grid = cw.CurtainGrid;
if (grid == null) continue;
int panelCount = grid.GetPanelIds().Count;
int mullionCount = grid.GetMullionIds().Count;
string name = cw.Name + " (" + cw.Id.IntegerValue + ")";
result[name] = (panelCount, mullionCount);
}
return result;
}
RC16 | Hard | Winner: revit-coder-14b (+0.020)
Question: Write C# code to find all duct instances in the model, get each duct's ConnectorManager, iterate through its Connectors, find connected elements via AllRefs, and build an adjacency list of connected duct ElementIds. Write code only. No explanation.
Expected signals: ConnectorManager, Connector, ConnectorSet, AllRefs, Duct, FilteredElementCollector, BuiltInCategory.OST_DuctCurves, ElementId, Domain, MEPCurve
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.600 | 0.800 |
| Quality | 0.917 | 0.583 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.762 | 0.743 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using System.Collections.Generic;
public class DuctConnectionFinder
{
public static Dictionary<ElementId, List<ElementId>> FindDuctConnections(Document doc)
{
var ductConnections = new Dictionary<ElementId, List<ElementId>>();
var ductCollector = new FilteredElementCollector(doc).OfClass(typeof(Duct));
foreach (var duct in ductCollector)
{
var ductId = duct.Id;
var connectorManager = duct as Duct;
if (connectorManager == null) continue;
var connectors = connectorManager.ConnectorManager.Connectors;
foreach (var connector in connectors)
{
var allRefs = connector.AllRefs;
foreach (var refConnector in allRefs)
{
var connectedElementId = refConnector.Owner.Id;
if (!ductConnections.ContainsKey(ductId))
{
ductConnections[ductId] = new List<ElementId>();
}
ductConnections[ductId].Add(connectedElementId);
}
}
}
return ductConnections;
}
}
Claude Opus 4.6 response
public Dictionary<ElementId, List<ElementId>> BuildDuctAdjacencyList(Document doc)
{
var adjacency = new Dictionary<ElementId, List<ElementId>>();
var ducts = new FilteredElementCollector(doc)
.OfClass(typeof(Autodesk.Revit.DB.Mechanical.Duct))
.WhereElementIsNotElementType()
.ToElements();
foreach (var elem in ducts)
{
MEPCurve duct = elem as MEPCurve;
if (duct == null) continue;
if (!adjacency.ContainsKey(duct.Id))
adjacency[duct.Id] = new List<ElementId>();
ConnectorSet connectors = duct.ConnectorManager.Connectors;
foreach (Connector conn in connectors)
{
ConnectorSet allRefs = conn.AllRefs;
if (allRefs == null) continue;
foreach (Connector refConn in allRefs)
{
ElementId connectedId = refConn.Owner.Id;
if (connectedId == duct.Id) continue;
if (!adjacency[duct.Id].Contains(connectedId))
adjacency[duct.Id].Add(connectedId);
}
}
}
return adjacency;
}
RC17 | Medium | Winner: Claude Opus 4.6 (-0.285)
Question: Write C# code to find a ViewSchedule by name, read its TableData including header and body sections, and return a List<Dictionary<string, string>> where each dictionary maps column header to cell value for that row. Write code only. No explanation.
Expected signals: ViewSchedule, TableData, GetTableData, SectionData, GetSectionData, SectionType, GetCellText, NumberOfRows, NumberOfColumns, FilteredElementCollector
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.000 | 1.000 |
| Quality | 0.750 | 0.417 |
| Completeness | 0.875 | 0.825 |
| Composite | 0.487 | 0.772 |
revit-coder-14b response
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExternalData;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Piping;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Visual;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.UI.ExternalData;
using Autodesk.Revit.UI.IFC;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.TaskDialogs;
using Autodesk.Revit.UI.UISupport;
using Autodesk.Revit.UI.ViewSupport;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Piping;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Visual;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.UI.ExternalData;
using Autodesk.Revit.UI.IFC;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.TaskDialogs;
using Autodesk.Revit.UI.UISupport;
using Autodesk.Revit.UI.ViewSupport;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Piping;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Visual;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.UI.ExternalData;
using Autodesk.Revit.UI.IFC;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.TaskDialogs;
using Autodesk.Revit.UI.UISupport;
using Autodesk.Revit.UI.ViewSupport;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Piping;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Visual;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.UI.ExternalData;
using Autodesk.Revit.UI.IFC;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.TaskDialogs;
using Autodesk.Revit.UI.UISupport;
using Autodesk.Revit.UI.ViewSupport;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Piping;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Visual;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.UI.ExternalData;
using Autodesk.Revit.UI.IFC;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.TaskDialogs;
using Autodesk.Revit.UI.UISupport;
using Autodesk.Revit.UI.ViewSupport;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Fabrication;
using Autodesk.Revit.DB.IFC;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Piping;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Visual;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.UI.ExternalData;
using Autodesk.Revit.UI.IFC;
using Autodesk.Revit
</details>
<details>
<summary>Claude Opus 4.6 response</summary>
```csharp
public List<Dictionary<string, string>> ReadScheduleData(Document doc, string scheduleName)
{
var result = new List<Dictionary<string, string>>();
ViewSchedule schedule = new FilteredElementCollector(doc)
.OfClass(typeof(ViewSchedule))
.Cast<ViewSchedule>()
.FirstOrDefault(vs => vs.Name == scheduleName);
if (schedule == null) return result;
TableData tableData = schedule.GetTableData();
TableSectionData headerSection = tableData.GetSectionData(SectionType.Header);
TableSectionData bodySection = tableData.GetSectionData(SectionType.Body);
// Get column headers from the first row of the body (or header section)
int colCount = bodySection.NumberOfColumns;
int rowCount = bodySection.NumberOfRows;
// First row is typically the header in the body section
var headers = new List<string>();
for (int c = 0; c < colCount; c++)
{
headers.Add(bodySection.GetCellText(0, c));
}
// Data rows start at index 1
for (int r = 1; r < rowCount; r++)
{
var row = new Dictionary<string, string>();
for (int c = 0; c < colCount; c++)
{
row[headers[c]] = bodySection.GetCellText(r, c);
}
result.Add(row);
}
return result;
}
RC18 | Easy | Winner: revit-coder-14b (+0.065)
Question: Write C# code to collect all wall instances that were created in a specific phase by filtering on the PHASE_CREATED built-in parameter. Get the phase from the active view. Write code only. No explanation.
Expected signals: FilteredElementCollector, Phase, BuiltInParameter, PHASE_CREATED, View, WhereElementIsNotElementType, BuiltInCategory.OST_Walls, AsElementId
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.625 | 0.875 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.772 | 0.708 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class WallCollector
{
public static ICollection<ElementId> CollectWallsInPhase(UIApplication uiApp)
{
Document doc = uiApp.ActiveUIDocument.Document;
View activeView = doc.ActiveView;
Phase phase = null;
if (activeView != null)
{
phase = activeView.GetPhase();
}
if (phase == null)
{
throw new Exception("No phase found in the active view.");
}
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(Wall));
ParameterFilterRuleFactory factory = new ParameterFilterRuleFactory();
FilterRule rule = factory.CreateEqualsRule(BuiltInParameter.PHASE_CREATED, phase.Name);
ElementParameterFilter filter = new ElementParameterFilter(rule);
ICollection<ElementId> wallIds = collector.WherePasses(filter).ToElementIds();
return wallIds;
}
}
Claude Opus 4.6 response
public List<Wall> GetWallsByPhase(Document doc, View activeView)
{
Phase phase = doc.GetElement(activeView.get_Parameter(BuiltInParameter.VIEW_PHASE).AsElementId()) as Phase;
if (phase == null) return new List<Wall>();
var walls = new FilteredElementCollector(doc, activeView.Id)
.OfClass(typeof(Wall))
.WhereElementIsNotElementType()
.Cast<Wall>()
.Where(w =>
{
Parameter phaseParam = w.get_Parameter(BuiltInParameter.PHASE_CREATED);
return phaseParam != null && phaseParam.AsElementId() == phase.Id;
})
.ToList();
return walls;
}
RC19 | Easy | Winner: revit-coder-14b (+0.006)
Question: Write C# code to check if the document is workshared, get all worksets using FilteredWorksetCollector, and assign all walls to a workset named 'Structural' by setting the ELEM_PARTITION_PARAM inside a Transaction. Write code only. No explanation.
Expected signals: FilteredWorksetCollector, WorksetKind, Workset, IsWorkshared, ELEM_PARTITION_PARAM, WorksetId, FilteredElementCollector, Transaction, BuiltInCategory.OST_Walls
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.667 | 0.778 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.814 | 0.809 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
public class WorksetAssignment
{
public static void AssignWallsToWorkset(Document doc)
{
try
{
// Check if the document is workshared
if (!doc.IsWorkshared)
{
TaskDialog.Show("Error", "The document is not workshared.");
return;
}
// Get all worksets
FilteredWorksetCollector worksetCollector = new FilteredWorksetCollector(doc);
IList<Workset> worksets = worksetCollector.ToWorksets();
// Find the 'Structural' workset
Workset structuralWorkset = worksets.FirstOrDefault(ws => ws.Name == "Structural");
if (structuralWorkset == null)
{
TaskDialog.Show("Error", "The 'Structural' workset does not exist.");
return;
}
// Get all walls
FilteredElementCollector wallCollector = new FilteredElementCollector(doc);
wallCollector.OfClass(typeof(Wall));
IList<Element> walls = wallCollector.ToElements();
// Start a transaction
using (Transaction transaction = new Transaction(doc, "Assign Walls to Structural Workset"))
{
transaction.Start();
// Assign each wall to the 'Structural' workset
foreach (Wall wall in walls)
{
Parameter partitionParam = wall.get_Parameter(BuiltInParameter.ELEM_PARTITION_PARAM);
if (partitionParam != null)
{
partitionParam.Set(structuralWorkset.Id.IntegerValue);
}
}
// Commit the transaction
transaction.Commit();
}
}
catch (Exception ex)
{
TaskDialog.Show("Error", "An error occurred: " + ex.Message);
}
}
}
Claude Opus 4.6 response
public void AssignWallsToWorkset(Document doc)
{
if (!doc.IsWorkshared)
throw new InvalidOperationException("Document is not workshared.");
FilteredWorksetCollector worksetCollector = new FilteredWorksetCollector(doc)
.OfKind(WorksetKind.UserWorkset);
Workset structuralWorkset = worksetCollector
.FirstOrDefault(ws => ws.Name == "Structural");
if (structuralWorkset == null)
throw new Exception("Workset 'Structural' not found.");
var walls = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.WhereElementIsNotElementType()
.ToElements();
using (Transaction tx = new Transaction(doc, "Assign Walls to Workset"))
{
tx.Start();
foreach (var wall in walls)
{
Parameter worksetParam = wall.get_Parameter(BuiltInParameter.ELEM_PARTITION_PARAM);
if (worksetParam != null && !worksetParam.IsReadOnly)
{
worksetParam.Set(structuralWorkset.Id.IntegerValue);
}
}
tx.Commit();
}
}
RC20 | Medium | Winner: Claude Opus 4.6 (-0.019)
Question: Write C# code to create a linear dimension along a wall in the active view. Get the wall's LocationCurve, create a ReferenceArray from the wall's end references, and use doc.Create.NewDimension to place the dimension. Write code only. No explanation.
Expected signals: Dimension, NewDimension, ReferenceArray, LocationCurve, Line, Reference, View, Transaction, Curve
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.889 | 1.000 |
| Quality | 0.917 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.878 | 0.897 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void CreateLinearDimensionAlongWall()
{
UIDocument uidoc = this.ActiveUIDocument;
Document doc = uidoc.Document;
View view = doc.ActiveView;
// Get the selected wall
Reference wallRef = uidoc.Selection.PickObject(ObjectType.Edge, "Select a wall");
Element wall = doc.GetElement(wallRef);
// Get the wall's location curve
LocationCurve locationCurve = wall.Location as LocationCurve;
Curve wallCurve = locationCurve.Curve;
// Create a reference array from the wall's end references
ReferenceArray references = new ReferenceArray();
references.Append(wallRef);
// Create a dimension along the wall
Dimension dimension = doc.Create.NewDimension(view, wallCurve, references);
// Set the dimension type
DimensionType dimensionType = new FilteredElementCollector(doc)
.OfClass(typeof(DimensionType))
.FirstElement() as DimensionType;
dimension.ChangeTypeId(dimensionType.Id);
}
Claude Opus 4.6 response
public void CreateWallDimension(Document doc, Wall wall, View view)
{
LocationCurve locCurve = wall.Location as LocationCurve;
if (locCurve == null) return;
Curve curve = locCurve.Curve;
Options geomOptions = new Options();
geomOptions.ComputeReferences = true;
geomOptions.View = view;
GeometryElement geomElem = wall.get_Geometry(geomOptions);
ReferenceArray refArray = new ReferenceArray();
// Get references from the wall's end faces
foreach (GeometryObject geomObj in geomElem)
{
Solid solid = geomObj as Solid;
if (solid == null || solid.Volume <= 0) continue;
foreach (Face face in solid.Faces)
{
PlanarFace pf = face as PlanarFace;
if (pf != null)
{
XYZ normal = pf.FaceNormal;
XYZ wallDir = (curve.GetEndPoint(1) - curve.GetEndPoint(0)).Normalize();
if (Math.Abs(normal.DotProduct(wallDir)) > 0.9)
{
refArray.Append(face.Reference);
}
}
if (refArray.Size >= 2) break;
}
if (refArray.Size >= 2) break;
}
if (refArray.Size < 2) return;
using (Transaction tx = new Transaction(doc, "Create Dimension"))
{
tx.Start();
XYZ offset = curve.GetEndPoint(0) + new XYZ(0, 3, 0);
Line dimLine = Line.CreateBound(offset, offset + (curve.GetEndPoint(1) - curve.GetEndPoint(0)));
doc.Create.NewDimension(view, dimLine, refArray);
tx.Commit();
}
}
RC21 | Medium | Winner: Claude Opus 4.6 (-0.039)
Question: Write C# code to create a new Material in the document, set its color to red (255,0,0), assign a solid fill pattern to its surface foreground, and apply it as the structural material of an existing wall via parameter. Write code only. No explanation.
Expected signals: Material, Create, Color, FillPatternElement, GetSolidFillPatternId, SurfaceForegroundPatternId, SurfaceForegroundPatternColor, Transaction, FilteredElementCollector
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.667 | 0.889 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.814 | 0.853 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
public void CreateAndApplyMaterial(Document doc, ElementId wallId)
{
using (Transaction transaction = new Transaction(doc, "Create and Apply Material"))
{
transaction.Start();
// Create a new material
Material material = Material.Create(doc, "Red Material");
// Set the material color to red
Color redColor = new Color(255, 0, 0);
material.SetColor(redColor);
// Get the solid fill pattern
FillPattern solidFillPattern = FillPattern.GetSolidFillPattern(doc);
FillPatternElement fillPatternElement = FillPatternElement.Create(doc, solidFillPattern);
// Set the fill pattern to the material's surface foreground
material.SurfaceForegroundPatternId = fillPatternElement.Id;
// Apply the material to the wall
Parameter wallMaterialParam = doc.GetElement(wallId).get_Parameter(BuiltInParameter.MATERIAL_PARAM);
wallMaterialParam.Set(material.Id);
transaction.Commit();
}
}
Claude Opus 4.6 response
public void CreateAndApplyRedMaterial(Document doc, Wall wall)
{
using (Transaction tx = new Transaction(doc, "Create Material"))
{
tx.Start();
ElementId materialId = Material.Create(doc, "Red Material");
Material mat = doc.GetElement(materialId) as Material;
mat.Color = new Color(255, 0, 0);
// Find solid fill pattern
FillPatternElement solidFill = new FilteredElementCollector(doc)
.OfClass(typeof(FillPatternElement))
.Cast<FillPatternElement>()
.FirstOrDefault(fp => fp.GetFillPattern().IsSolidFill);
if (solidFill != null)
{
mat.SurfaceForegroundPatternId = solidFill.Id;
mat.SurfaceForegroundPatternColor = new Color(255, 0, 0);
}
// Apply as structural material
Parameter structMatParam = wall.get_Parameter(BuiltInParameter.STRUCTURAL_MATERIAL_PARAM);
if (structMatParam != null && !structMatParam.IsReadOnly)
{
structMatParam.Set(materialId);
}
tx.Commit();
}
}
RC22 | Easy | Winner: revit-coder-14b (+0.073)
Question: Write C# code to copy a set of elements from their current position to a new location offset by (10, 0, 0) using ElementTransformUtils.CopyElements with a translation transform inside a Transaction. Write code only. No explanation.
Expected signals: ElementTransformUtils, CopyElements, Transform, Translation, XYZ, Transaction, ElementId, ICollection
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 1.000 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.775 | 0.700 |
| Composite | 0.932 | 0.860 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void CopyElementsWithTransform(Document doc, ICollection<ElementId> elementIds)
{
using (Transaction transaction = new Transaction(doc, "Copy Elements"))
{
transaction.Start();
try
{
// Define the translation transform
Transform translation = Transform.CreateTranslation(new XYZ(10, 0, 0));
// Copy the elements
ElementTransformUtils.CopyElements(doc, elementIds, translation);
}
catch (Exception ex)
{
transaction.RollBack();
throw ex;
}
finally
{
transaction.Commit();
}
}
}
Claude Opus 4.6 response
public void CopyElementsWithOffset(Document doc, ICollection<ElementId> elementIds)
{
using (Transaction tx = new Transaction(doc, "Copy Elements"))
{
tx.Start();
XYZ translation = new XYZ(10, 0, 0);
ElementTransformUtils.CopyElements(doc, elementIds, translation);
tx.Commit();
}
}
RC23 | Hard | Winner: Claude Opus 4.6 (-0.190)
Question: Write C# code to create rebar in a concrete beam element using Rebar.CreateFromCurves. Define a rectangular stirrup shape with four line segments, specify the RebarBarType and RebarHookType, set RebarStyle to Stirrup, and place it inside a Transaction. Write code only. No explanation.
Expected signals: Rebar, CreateFromCurves, RebarBarType, RebarHookType, RebarHookOrientation, RebarStyle, FilteredElementCollector, Line, Transaction, XYZ
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.500 | 1.000 |
| Quality | 0.917 | 0.833 |
| Completeness | 0.775 | 0.825 |
| Composite | 0.708 | 0.897 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using System.Collections.Generic;
public class RebarCreator
{
public static Rebar CreateStirrup(Document doc, ElementId hostId, ElementId barTypeId, ElementId hookTypeId, XYZ origin, XYZ xVec, XYZ yVec)
{
// Define the stirrup shape
List<Curve> curves = new List<Curve>();
curves.Add(Line.CreateBound(origin, origin.Add(xVec)));
curves.Add(Line.CreateBound(origin.Add(xVec), origin.Add(xVec).Add(yVec)));
curves.Add(Line.CreateBound(origin.Add(xVec).Add(yVec), origin.Add(yVec)));
curves.Add(Line.CreateBound(origin.Add(yVec), origin));
// Create the stirrup
Rebar rebar = Rebar.CreateFromCurves(doc, RebarStyle.Stirrup, barTypeId, hookTypeId, hostId, curves, origin, xVec, yVec);
return rebar;
}
}
Claude Opus 4.6 response
public void CreateStirrup(Document doc, Element beam)
{
using (Transaction tx = new Transaction(doc, "Create Rebar"))
{
tx.Start();
RebarBarType barType = new FilteredElementCollector(doc)
.OfClass(typeof(RebarBarType))
.Cast<RebarBarType>()
.FirstOrDefault();
RebarHookType hookType = new FilteredElementCollector(doc)
.OfClass(typeof(RebarHookType))
.Cast<RebarHookType>()
.FirstOrDefault();
// Define stirrup corners (assuming beam cross-section)
double width = 0.3; // ~300mm
double height = 0.5; // ~500mm
double cover = 0.025; // 25mm cover
double w = width / 2 - cover;
double h = height / 2 - cover;
XYZ p0 = new XYZ(-w, 0, -h);
XYZ p1 = new XYZ(w, 0, -h);
XYZ p2 = new XYZ(w, 0, h);
XYZ p3 = new XYZ(-w, 0, h);
List<Curve> curves = new List<Curve>
{
Line.CreateBound(p0, p1),
Line.CreateBound(p1, p2),
Line.CreateBound(p2, p3),
Line.CreateBound(p3, p0)
};
XYZ normal = XYZ.BasisY;
Rebar rebar = Rebar.CreateFromCurves(
doc,
RebarStyle.StirrupTie,
barType,
hookType,
hookType,
beam,
normal,
curves,
RebarHookOrientation.Left,
RebarHookOrientation.Left,
true,
true);
tx.Commit();
}
}
RC24 | Medium | Winner: revit-coder-14b (+0.010)
Question: Write C# code to place room tags on all untagged rooms in the active view using IndependentTag.Create. Get each room's location point, use TagMode.TM_ADDBY_CATEGORY, and set horizontal orientation. Write code only. No explanation.
Expected signals: IndependentTag, Create, TagMode, TagOrientation, Reference, LocationPoint, Point, FilteredElementCollector, Transaction, View
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.900 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.907 | 0.897 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
public class PlaceRoomTags : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uidoc = uiApp.ActiveUIDocument;
Document doc = uidoc.Document;
if (doc.IsReadOnly)
{
message = "Document is read-only.";
return Result.Failed;
}
try
{
using (TransactionGroup tg = new TransactionGroup(doc))
{
tg.Start("Place Room Tags");
using (Transaction t = new Transaction(doc, "Place Room Tags"))
{
t.Start();
FilteredElementCollector collector = new FilteredElementCollector(doc, uidoc.ActiveView.Id)
.OfClass(typeof(SpatialElement))
.OfCategory(BuiltInCategory.OST_Rooms);
List<ElementId> untaggedRoomIds = new List<ElementId>();
foreach (Room room in collector.Cast<Room>())
{
if (room.GetTagCount() == 0)
{
untaggedRoomIds.Add(room.Id);
}
}
if (untaggedRoomIds.Count > 0)
{
IndependentTagOptions options = new IndependentTagOptions();
options.TagMode = TagMode.TM_ADDBY_CATEGORY;
options.TagOrientation = TagOrientation.Horizontal;
foreach (ElementId roomId in untaggedRoomIds)
{
Room room = doc.GetElement(roomId) as Room;
XYZ locationPoint = room.Location.Point;
IndependentTag tag = IndependentTag.Create(doc, uidoc.ActiveView.Id, locationPoint, options);
tag.IsLeaderVisible = true;
tag.LeaderEnd = locationPoint.Add(new XYZ(0, 0, 1));
}
}
t.Commit();
}
tg.Assimilate();
}
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
return Result.Succeeded;
}
}
Claude Opus 4.6 response
public void TagUntaggedRooms(Document doc, View activeView)
{
var rooms = new FilteredElementCollector(doc, activeView.Id)
.OfCategory(BuiltInCategory.OST_Rooms)
.WhereElementIsNotElementType()
.Cast<Room>()
.Where(r => r.Area > 0);
// Get already tagged room ids
var existingTags = new FilteredElementCollector(doc, activeView.Id)
.OfCategory(BuiltInCategory.OST_RoomTags)
.WhereElementIsNotElementType()
.Cast<RoomTag>()
.Select(t => t.Room?.Id)
.Where(id => id != null)
.ToHashSet();
using (Transaction tx = new Transaction(doc, "Tag Rooms"))
{
tx.Start();
foreach (Room room in rooms)
{
if (existingTags.Contains(room.Id)) continue;
LocationPoint locPt = room.Location as LocationPoint;
if (locPt == null) continue;
UV uv = new UV(locPt.Point.X, locPt.Point.Y);
Reference roomRef = new Reference(room);
IndependentTag.Create(
doc,
activeView.Id,
roomRef,
false,
TagMode.TM_ADDBY_CATEGORY,
TagOrientation.Horizontal,
locPt.Point);
}
tx.Commit();
}
}
RC25 | Easy | Winner: Claude Opus 4.6 (-0.024)
Question: Write C# code to get the user's current selection from UIDocument, create a Group from the selected elements using doc.Create.NewGroup, and show the group name in a TaskDialog. Include a Transaction. Write code only. No explanation.
Expected signals: Group, NewGroup, Selection, GetElementIds, ICollection, ElementId, Transaction, TaskDialog, UIDocument
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.778 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.859 | 0.882 |
revit-coder-14b response
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
public class GroupCreator : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
try
{
using (Transaction transaction = new Transaction(doc, "Create Group"))
{
transaction.Start();
Reference ref1 = uidoc.Selection.PickObject(ObjectType.Element, "Select first element");
Reference ref2 = uidoc.Selection.PickObject(ObjectType.Element, "Select second element");
ElementId id1 = ref1.ElementId;
ElementId id2 = ref2.ElementId;
List<ElementId> selectedIds = new List<ElementId> { id1, id2 };
Group group = doc.Create.NewGroup(selectedIds);
transaction.Commit();
TaskDialog.Show("Group Name", group.Name);
}
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
return Result.Succeeded;
}
}
Claude Opus 4.6 response
[Transaction(TransactionMode.Manual)]
public class GroupSelectedCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
ICollection<ElementId> selectedIds = uidoc.Selection.GetElementIds();
if (selectedIds.Count == 0)
{
TaskDialog.Show("Error", "No elements selected.");
return Result.Failed;
}
using (Transaction tx = new Transaction(doc, "Create Group"))
{
tx.Start();
Group group = doc.Create.NewGroup(selectedIds);
tx.Commit();
TaskDialog.Show("Group Created", "Group name: " + group.GroupType.Name);
}
return Result.Succeeded;
}
}
RC26 | Easy | Winner: revit-coder-14b (+0.075)
Question: Write C# code to access the ProjectInfo object from the document and read the BuildingName, Address, and Number properties. Display them in a TaskDialog. Write code only. No explanation.
Expected signals: ProjectInfo, doc.ProjectInformation, BuildingName, Address, Number, TaskDialog
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 1.000 | 1.000 |
| Quality | 0.917 | 0.667 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.907 | 0.833 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void GetProjectInfoData()
{
Document doc = CommandData.Application.ActiveUIDocument.Document;
ProjectInfo projectInfo = doc.ProjectInformation;
if (projectInfo != null)
{
string buildingName = projectInfo.BuildingName;
string address = projectInfo.Address;
string number = projectInfo.Number;
TaskDialog.Show("Project Information", $"Building Name: {buildingName}\nAddress: {address}\nNumber: {number}");
}
}
Claude Opus 4.6 response
[Transaction(TransactionMode.Manual)]
public class ProjectInfoCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Document doc = commandData.Application.ActiveUIDocument.Document;
ProjectInfo info = doc.ProjectInformation;
string buildingName = info.BuildingName ?? "N/A";
string address = info.Address ?? "N/A";
string number = info.Number ?? "N/A";
TaskDialog.Show("Project Info",
$"Building Name: {buildingName}\n" +
$"Address: {address}\n" +
$"Number: {number}");
return Result.Succeeded;
}
}
RC27 | Easy | Winner: revit-coder-14b (+0.050)
Question: Write C# code to create a ModelLine in the active document. Create a SketchPlane from a Plane at the origin, then use doc.Create.NewModelCurve to draw a line from (0,0,0) to (10,0,0). Include a Transaction. Write code only. No explanation.
Expected signals: SketchPlane, Plane, NewModelCurve, Line.CreateBound, XYZ, Transaction, doc.Create, ModelCurve
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 1.000 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.932 | 0.882 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void CreateModelLine()
{
Document doc = Command.thisDoc;
UIDocument uidoc = Command.thisUIDoc;
try
{
using (Transaction trans = new Transaction(doc, "Create ModelLine"))
{
trans.Start();
// Define plane at origin
Plane plane = Plane.CreateByOriginAndBasis(XYZ.Zero, XYZ.BasisX, XYZ.BasisY);
SketchPlane sketchPlane = SketchPlane.Create(doc, plane);
// Define line
Line line = Line.CreateBound(XYZ.Zero, new XYZ(10, 0, 0));
// Create model line
ModelCurve modelCurve = doc.Create.NewModelCurve(line, sketchPlane);
trans.Commit();
}
}
catch (Exception ex)
{
TaskDialog.Show("Error", ex.Message);
}
}
Claude Opus 4.6 response
public void CreateModelLine(Document doc)
{
using (Transaction tx = new Transaction(doc, "Create Model Line"))
{
tx.Start();
XYZ origin = XYZ.Zero;
XYZ normal = XYZ.BasisZ;
Plane plane = Plane.CreateByNormalAndOrigin(normal, origin);
SketchPlane sketchPlane = SketchPlane.Create(doc, plane);
XYZ start = new XYZ(0, 0, 0);
XYZ end = new XYZ(10, 0, 0);
Line line = Line.CreateBound(start, end);
doc.Create.NewModelCurve(line, sketchPlane);
tx.Commit();
}
}
RC28 | Easy | Winner: Claude Opus 4.6 (-0.050)
Question: Write C# code to duplicate an existing ViewPlan using View.Duplicate with ViewDuplicateOption.Duplicate, then rename the duplicated view by setting its ViewName property. Include a Transaction. Write code only. No explanation.
Expected signals: Duplicate, ViewDuplicateOption, ViewPlan, ViewName, Transaction, FilteredElementCollector, ElementId, doc.GetElement
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.625 | 0.875 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.782 | 0.833 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void DuplicateAndRenameViewPlan(ViewPlan originalView)
{
try
{
using (Transaction transaction = new Transaction(originalView.Document, "Duplicate and Rename ViewPlan"))
{
transaction.Start();
// Duplicate the view
ViewPlan duplicatedView = originalView.Duplicate(ViewDuplicateOption.Duplicate) as ViewPlan;
// Rename the duplicated view
duplicatedView.ViewName = "Renamed ViewPlan";
transaction.Commit();
}
}
catch (Exception ex)
{
// Handle any exceptions
TaskDialog.Show("Error", ex.Message);
}
}
Claude Opus 4.6 response
public void DuplicateView(Document doc)
{
ViewPlan viewPlan = new FilteredElementCollector(doc)
.OfClass(typeof(ViewPlan))
.Cast<ViewPlan>()
.FirstOrDefault(v => !v.IsTemplate && v.CanViewBeDuplicated(ViewDuplicateOption.Duplicate));
if (viewPlan == null) return;
using (Transaction tx = new Transaction(doc, "Duplicate View"))
{
tx.Start();
ElementId newViewId = viewPlan.Duplicate(ViewDuplicateOption.Duplicate);
View newView = doc.GetElement(newViewId) as View;
newView.Name = viewPlan.Name + " - Copy";
tx.Commit();
}
}
RC29 | Medium | Winner: Claude Opus 4.6 (-0.039)
Question: Write C# code implementing an IExternalEventHandler for executing Revit API calls from a modeless dialog. Show the handler class with Execute method, ExternalEvent.Create registration, and how to call Raise() from a button click. Include a Transaction inside the handler. Write code only. No explanation.
Expected signals: IExternalEventHandler, Execute, ExternalEvent, Create, Raise, UIApplication, Transaction, GetName, modeless
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.778 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.859 | 0.897 |
revit-coder-14b response
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Events;
using System.Windows.Forms;
namespace RevitExternalEventHandler
{
public class ExternalEventHandler : IExternalEventHandler
{
public void Execute(UIApplication uiapp)
{
try
{
var doc = uiapp.ActiveUIDocument?.Document;
if (doc == null) return;
using (var trans = new Transaction(doc, "External Event Transaction"))
{
if (trans.Start() != TransactionStatus.Started) return;
// Example: Create a wall
var wallType = new FilteredElementCollector(doc)
.OfClass(typeof(FamilySymbol))
.Where(e => e.Category?.Name == "Walls")
.First();
var line = Line.CreateBound(XYZ.Zero, XYZ.BasisX.Multiply(10));
var wall = Wall.Create(doc, wallType, line, doc.ActiveView, true, 10, 10);
trans.Commit();
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
}
public string GetName()
{
return "ExternalEventHandler";
}
}
public class ExternalEventHandlerManager
{
public static ExternalEvent CreateEvent()
{
var handler = new ExternalEventHandler();
return ExternalEvent.Create(handler);
}
}
}
Claude Opus 4.6 response
public class MyEventHandler : IExternalEventHandler
{
private Action<UIApplication> _action;
public void SetAction(Action<UIApplication> action)
{
_action = action;
}
public void Execute(UIApplication app)
{
if (_action == null) return;
Document doc = app.ActiveUIDocument.Document;
using (Transaction tx = new Transaction(doc, "External Event Action"))
{
tx.Start();
_action.Invoke(app);
tx.Commit();
}
}
public string GetName() => "MyEventHandler";
}
// Registration and usage in a modeless WPF dialog
public partial class MyModelessDialog : Window
{
private static MyEventHandler _handler;
private static ExternalEvent _externalEvent;
public MyModelessDialog()
{
InitializeComponent();
_handler = new MyEventHandler();
_externalEvent = ExternalEvent.Create(_handler);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
_handler.SetAction((uiApp) =>
{
Document doc = uiApp.ActiveUIDocument.Document;
// Perform Revit API calls here
TaskDialog.Show("Info", "Executed from modeless dialog.");
});
_externalEvent.Raise();
}
}
RC30 | Medium | Winner: revit-coder-14b (+0.165)
Question: Write C# code using ParameterFilterRuleFactory to create a FilterRule that finds walls where the Mark parameter equals a specific string value. Use it with a ParameterValueProvider and ElementParameterFilter in a FilteredElementCollector. Write code only. No explanation.
Expected signals: ParameterFilterRuleFactory, FilterRule, ParameterValueProvider, ElementParameterFilter, FilteredElementCollector, BuiltInParameter, ALL_MODEL_MARK, BuiltInCategory.OST_Walls
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.750 | 0.750 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.823 | 0.657 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Structure;
public class WallFilter
{
public static FilterRule CreateWallMarkFilter(string markValue)
{
// Create a parameter value provider for the "Mark" parameter
ParameterValueProvider provider = new ParameterValueProvider(new ElementId(BuiltInParameter.ALL_MODEL_MARK));
// Create a string filter for the specific mark value
FilterStringRule rule = new FilterStringRule(provider, new FilterStringContains(), markValue, true);
return rule;
}
public static FilteredElementCollector ApplyWallMarkFilter(Document doc, string markValue)
{
// Create the filter rule
FilterRule filterRule = CreateWallMarkFilter(markValue);
// Create the parameter value provider and filter
ElementParameterFilter filter = new ElementParameterFilter(filterRule);
// Apply the filter to the wall collection
FilteredElementCollector collector = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.WherePasses(filter);
return collector;
}
}
Claude Opus 4.6 response
public List<Wall> GetWallsByMark(Document doc, string markValue)
{
ElementId markParamId = new ElementId(BuiltInParameter.ALL_MODEL_MARK);
FilterRule rule = ParameterFilterRuleFactory.CreateEqualsRule(
markParamId, markValue, false);
ElementParameterFilter paramFilter = new ElementParameterFilter(rule);
List<Wall> walls = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.WhereElementIsNotElementType()
.WherePasses(paramFilter)
.Cast<Wall>()
.ToList();
return walls;
}
RC31 | Medium | Winner: revit-coder-14b (+0.006)
Question: Write C# code to set a section box on a 3D view. Create a BoundingBoxXYZ with specific Min and Max points, find a View3D in the document, enable and assign the section box using View3D.SetSectionBox inside a Transaction. Write code only. No explanation.
Expected signals: View3D, BoundingBoxXYZ, SetSectionBox, IsSectionBoxActive, Min, Max, XYZ, Transaction, FilteredElementCollector
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.889 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.888 | 0.882 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void SetSectionBoxOn3DView(Document doc)
{
// Create a BoundingBoxXYZ with specific Min and Max points
BoundingBoxXYZ sectionBox = new BoundingBoxXYZ();
sectionBox.Min = new XYZ(0, 0, 0);
sectionBox.Max = new XYZ(100, 100, 100);
// Find a View3D in the document
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(View3D));
View3D view3D = collector.FirstElement() as View3D;
if (view3D != null)
{
// Start a transaction
using (Transaction transaction = new Transaction(doc, "Set Section Box"))
{
transaction.Start();
// Enable and assign the section box
view3D.EnableSectionBox(true);
view3D.SetSectionBox(sectionBox);
// Commit the transaction
transaction.Commit();
}
}
}
Claude Opus 4.6 response
public void SetSectionBox(Document doc)
{
View3D view3d = new FilteredElementCollector(doc)
.OfClass(typeof(View3D))
.Cast<View3D>()
.FirstOrDefault(v => !v.IsTemplate);
if (view3d == null) return;
BoundingBoxXYZ bbox = new BoundingBoxXYZ();
bbox.Min = new XYZ(-50, -50, -10);
bbox.Max = new XYZ(50, 50, 30);
using (Transaction tx = new Transaction(doc, "Set Section Box"))
{
tx.Start();
view3d.IsSectionBoxActive = true;
view3d.SetSectionBox(bbox);
tx.Commit();
}
}
RC32 | Medium | Winner: revit-coder-14b (+0.065)
Question: Write C# code to create a new Level at a specified elevation using Level.Create, then create multiple Grid lines along the X axis using Grid.Create with Line geometry. Both operations inside a Transaction. Write code only. No explanation.
Expected signals: Level.Create, Grid.Create, Line.CreateBound, XYZ, Transaction, Elevation, FilteredElementCollector
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.857 | 0.857 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.890 | 0.825 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public class CreateLevelAndGrids : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document doc = uiDoc.Document;
try
{
using (Transaction trans = new Transaction(doc, "Create Level and Grids"))
{
trans.Start();
// Create a new Level at a specified elevation
Level newLevel = Level.Create(doc, 100.0);
if (newLevel == null)
{
message = "Failed to create Level.";
trans.RollBack();
return Result.Failed;
}
// Create multiple Grid lines along the X axis
for (int i = 0; i < 5; i++)
{
XYZ startPoint = new XYZ(i * 10, 0, newLevel.Elevation);
XYZ endPoint = new XYZ(i * 10, 10, newLevel.Elevation);
Line line = Line.CreateBound(startPoint, endPoint);
Grid grid = Grid.Create(doc, line);
if (grid == null)
{
message = "Failed to create Grid.";
trans.RollBack();
return Result.Failed;
}
}
trans.Commit();
}
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
return Result.Succeeded;
}
}
Claude Opus 4.6 response
public void CreateLevelAndGrids(Document doc)
{
using (Transaction tx = new Transaction(doc, "Create Level and Grids"))
{
tx.Start();
// Create a new level at 15 feet elevation
Level newLevel = Level.Create(doc, 15.0);
newLevel.Name = "Level 4";
// Create grid lines along X axis
double gridLength = 100.0;
for (int i = 0; i < 5; i++)
{
double offset = i * 20.0;
XYZ start = new XYZ(offset, -gridLength / 2, 0);
XYZ end = new XYZ(offset, gridLength / 2, 0);
Line line = Line.CreateBound(start, end);
Grid grid = Grid.Create(doc, line);
grid.Name = ((char)('A' + i)).ToString();
}
tx.Commit();
}
}
RC33 | Medium | Winner: revit-coder-14b (+0.025)
Question: Write C# code using Extensible Storage to create a Schema with SchemaBuilder, add a string field and a double field, then store data on a wall element using Entity and retrieve it back. Include GUID, schema name, and a Transaction. Write code only. No explanation.
Expected signals: SchemaBuilder, Schema, Entity, FieldBuilder, SetEntity, GetEntity, Guid, Transaction, Element, Get, Set
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.818 | 0.818 |
| Quality | 0.917 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.850 | 0.825 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.UI;
public class ExtensibleStorageExample
{
public static void CreateSchemaAndStoreData(Document doc, Wall wall)
{
// Define schema GUID and name
Guid schemaGuid = new Guid("B7A9E62D-518B-422C-9141-1234567890AB");
string schemaName = "WallDataSchema";
// Create schema using SchemaBuilder
SchemaBuilder builder = new SchemaBuilder(schemaGuid);
builder.SetSchemaName(schemaName);
builder.AddSimpleField("Description", typeof(string));
builder.AddSimpleField("Measurement", typeof(double));
Schema schema = builder.Finish();
// Create entity and set field values
Entity entity = new Entity(schema);
entity.Set("Description", "Wall information");
entity.Set("Measurement", 3.5);
// Store entity on wall element
wall.SetEntity(schema.GUID, entity);
}
public static void RetrieveData(Document doc, Wall wall)
{
// Retrieve entity from wall element
Entity entity = wall.GetEntity(new Guid("B7A9E62D-518B-422C-9141-1234567890AB"));
// Get field values
string description = entity.Get<string>("Description");
double measurement = entity.Get<double>("Measurement");
// Output field values
TaskDialog.Show("Wall Data", $"Description: {description}\nMeasurement: {measurement}");
}
}
Claude Opus 4.6 response
public class ExtensibleStorageExample
{
private static readonly Guid SchemaGuid = new Guid("A1B2C3D4-E5F6-7890-ABCD-EF1234567890");
public void StoreData(Document doc, Wall wall)
{
SchemaBuilder builder = new SchemaBuilder(SchemaGuid);
builder.SetSchemaName("CustomData");
builder.SetReadAccessLevel(AccessLevel.Public);
builder.SetWriteAccessLevel(AccessLevel.Public);
builder.AddSimpleField("Description", typeof(string));
builder.AddSimpleField("Length", typeof(double));
Schema schema = builder.Finish();
using (Transaction tx = new Transaction(doc, "Store Data"))
{
tx.Start();
Entity entity = new Entity(schema);
entity.Set<string>("Description", "Exterior Wall");
entity.Set<double>("Length", 25.5);
wall.SetEntity(entity);
tx.Commit();
}
}
public (string description, double length) RetrieveData(Wall wall)
{
Schema schema = Schema.Lookup(SchemaGuid);
if (schema == null) return (null, 0);
Entity entity = wall.GetEntity(schema);
if (!entity.IsValid()) return (null, 0);
string description = entity.Get<string>("Description");
double length = entity.Get<double>("Length");
return (description, length);
}
}
RC34 | Medium | Winner: Claude Opus 4.6 (-0.030)
Question: Write C# code to create a ParameterFilterElement with filter rules, apply it to the active view using View.AddFilter, and set color overrides for matching elements using OverrideGraphicSettings with SetProjectionLineColor. Include a Transaction. Write code only. No explanation.
Expected signals: ParameterFilterElement, FilterRule, ParameterFilterRuleFactory, OverrideGraphicSettings, SetProjectionLineColor, Color, AddFilter, SetFilterOverrides, View, Transaction
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.800 | 1.000 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.868 | 0.897 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
public class FilterAndColorOverride
{
public static void CreateParameterFilterAndApply(Document doc, View view)
{
try
{
using (Transaction transaction = new Transaction(doc, "Create Filter and Apply"))
{
transaction.Start();
// Create filter rules
FilterRule rule1 = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_MARK), "FILTER1");
FilterRule rule2 = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME), "FILTER2");
// Create filter
FilterElement filter = FilterElement.Create(doc, "My Filter", new List<FilterRule> { rule1, rule2 });
// Apply filter to view
view.AddFilter(filter.Id);
// Set color overrides
OverrideGraphicSettings ogs = new OverrideGraphicSettings();
ogs.SetProjectionLineColor(new Color(255, 0, 0)); // Red color
view.SetElementOverrides(filter.Id, ogs);
transaction.Commit();
}
}
catch (Exception ex)
{
TaskDialog.Show("Error", ex.Message);
}
}
}
Claude Opus 4.6 response
public void CreateAndApplyViewFilter(Document doc)
{
View activeView = doc.ActiveView;
using (Transaction tx = new Transaction(doc, "Create View Filter"))
{
tx.Start();
IList<ElementId> categories = new List<ElementId>
{
new ElementId(BuiltInCategory.OST_Walls)
};
ElementId commentsId = new ElementId(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS);
FilterRule rule = ParameterFilterRuleFactory.CreateContainsRule(
commentsId, "Temporary", false);
ElementParameterFilter elemFilter = new ElementParameterFilter(rule);
ParameterFilterElement filterElem = ParameterFilterElement.Create(
doc, "Temporary Walls Filter", categories, elemFilter);
activeView.AddFilter(filterElem.Id);
activeView.SetFilterVisibility(filterElem.Id, true);
OverrideGraphicSettings ogs = new OverrideGraphicSettings();
ogs.SetProjectionLineColor(new Color(255, 0, 0));
activeView.SetFilterOverrides(filterElem.Id, ogs);
tx.Commit();
}
}
RC35 | Hard | Winner: revit-coder-14b (+0.165)
Question: Write C# code using ElementIntersectsElementFilter to find all elements that physically intersect a selected element. Get the selected element's solid geometry, create the intersection filter, and return a list of intersecting ElementIds with their category names. Write code only. No explanation.
Expected signals: ElementIntersectsElementFilter, FilteredElementCollector, Solid, GeometryElement, Options, ExclusionFilter, ElementId, Category, Name
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.556 | 0.556 |
| Quality | 0.917 | 0.417 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.745 | 0.580 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
public class ElementIntersectFinder : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document doc = uiDoc.Document;
Reference refSelected = uiDoc.Selection.PickObject(ObjectType.Element, "Select an element to find intersecting elements");
Element selectedElement = doc.GetElement(refSelected);
Solid selectedSolid = selectedElement.GetGeometryObjectFromReference(refSelected) as Solid;
if (selectedSolid == null)
{
message = "Selected element does not have solid geometry.";
return Result.Failed;
}
ElementIntersectsElementFilter intersectFilter = new ElementIntersectsElementFilter(selectedSolid);
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.WherePasses(intersectFilter);
List<string> intersectingElements = new List<string>();
foreach (Element intersectingElement in collector)
{
intersectingElements.Add($"{intersectingElement.Id} - {intersectingElement.Category.Name}");
}
TaskDialog.Show("Intersecting Elements", string.Join("\n", intersectingElements));
return Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
}
}
Claude Opus 4.6 response
public List<(ElementId Id, string CategoryName)> FindIntersectingElements(Document doc, Element selectedElement)
{
var result = new List<(ElementId, string)>();
ElementIntersectsElementFilter intersectFilter =
new ElementIntersectsElementFilter(selectedElement);
var intersecting = new FilteredElementCollector(doc)
.WherePasses(intersectFilter)
.ToElements();
foreach (var elem in intersecting)
{
if (elem.Id == selectedElement.Id) continue;
string catName = elem.Category?.Name ?? "No Category";
result.Add((elem.Id, catName));
}
return result;
}
RC36 | Hard | Winner: revit-coder-14b (+0.090)
Question: Write C# code to open a family document for editing using doc.EditFamily, use FamilyManager to add a new type parameter of type Length, set the parameter value, then close the family document and reload it into the project using LoadFamily. Write code only. No explanation.
Expected signals: EditFamily, FamilyManager, AddParameter, FamilyDocument, LoadFamily, FamilyParameter, Set, Transaction, BuiltInParameterGroup, ParameterType
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.800 | 0.700 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.868 | 0.777 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Family;
using Autodesk.Revit.UI;
public void OpenAndEditFamily(Document doc, string familyPath)
{
try
{
// Open family document for editing
FamilySymbol familySymbol = null;
using (Transaction transaction = new Transaction(doc, "Open Family"))
{
transaction.Start();
familySymbol = doc.LoadFamily(familyPath, new FamilyLoadOptions());
transaction.Commit();
}
// Get family document
Document familyDoc = familySymbol.Family.Document;
// Get family manager
FamilyManager familyManager = familyDoc.FamilyManager;
// Add a new type parameter of type Length
familyManager.AddParameter("Length Parameter", BuiltInParameterGroup.PG_LENGTH, ParameterType.Length);
// Set the parameter value
familyManager.CurrentType.Set(familyManager.get_Parameter("Length Parameter"), UnitUtils.ConvertToInternalUnits(10, DisplayUnitType.DUT_FEET));
// Close the family document
familyDoc.Close(false);
// Reload the family into the project
using (Transaction transaction = new Transaction(doc, "Reload Family"))
{
transaction.Start();
familySymbol = doc.LoadFamily(familyPath, new FamilyLoadOptions());
transaction.Commit();
}
}
catch (Exception ex)
{
// Handle any exceptions
TaskDialog.Show("Error", ex.Message);
}
}
Claude Opus 4.6 response
public void EditFamilyAndReload(Document doc, FamilyInstance instance)
{
Family family = instance.Symbol.Family;
Document familyDoc = doc.EditFamily(family);
if (familyDoc == null) return;
using (Transaction ftx = new Transaction(familyDoc, "Add Parameter"))
{
ftx.Start();
FamilyManager fm = familyDoc.FamilyManager;
FamilyParameter param = fm.AddParameter(
"CustomLength",
GroupTypeId.Dimensions,
SpecTypeId.Length,
true);
if (fm.CurrentType == null)
fm.NewType("Default");
fm.Set(param, UnitUtils.ConvertToInternalUnits(500, UnitTypeId.Millimeters));
ftx.Commit();
}
// Reload into project
familyDoc.LoadFamily(doc, new FamilyLoadOptions());
familyDoc.Close(false);
}
public class FamilyLoadOptions : IFamilyLoadOptions
{
public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = true;
return true;
}
public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse,
out FamilySource source, out bool overwriteParameterValues)
{
source = FamilySource.Family;
overwriteParameterValues = true;
return true;
}
}
RC37 | Hard | Winner: revit-coder-14b (+0.050)
Question: Write C# code using a TransactionGroup to wrap multiple sub-transactions. Perform two separate modifications (e.g., move a wall then change its type), and demonstrate rolling back the entire group if the second sub-transaction fails. Include TransactionGroup.Assimilate on success. Write code only. No explanation.
Expected signals: TransactionGroup, Transaction, Start, Commit, RollBack, Assimilate, TransactionStatus, t.Start, t.Commit
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.667 | 0.667 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.825 | 0.825 |
| Composite | 0.814 | 0.764 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
public class WallTypeChanger : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uidoc = uiApp.ActiveUIDocument;
Document doc = uidoc.Document;
try
{
// Start a transaction group
using (TransactionGroup tg = new TransactionGroup(doc))
{
tg.Start("Wall Type Change");
// First sub-transaction: Move wall
using (Transaction t1 = new Transaction(doc, "Move Wall"))
{
t1.Start();
// Select wall
Reference ref1 = uidoc.Selection.PickObject(ObjectType.Element, "Select a wall to move");
ElementId wallId = ref1.ElementId;
Element wall = doc.GetElement(wallId);
// Move wall
LocationCurve location = wall.Location as LocationCurve;
if (location != null)
{
XYZ newPoint = location.Curve.GetEndPoint(0) + new XYZ(10, 0, 0);
location.Move(newPoint);
}
t1.Commit();
}
// Second sub-transaction: Change wall type
using (Transaction t2 = new Transaction(doc, "Change Wall Type"))
{
t2.Start();
// Select new wall type
Reference ref2 = uidoc.Selection.PickObject(ObjectType.Element, "Select a new wall type");
ElementId typeId = ref2.ElementId;
ElementType newType = doc.GetElement(typeId) as ElementType;
// Change wall type
Element wall = doc.GetElement(wallId);
wall.ChangeTypeId(newType.Id);
// Intentionally fail to demonstrate rollback
throw new Exception("Failed to change wall type");
t2.Commit();
}
// If we reach here, both sub-transactions succeeded
tg.Assimilate();
}
}
catch (Exception ex)
{
// If any sub-transaction fails, rollback the entire group
message = ex.Message;
return Result.Failed;
}
return Result.Succeeded;
}
}
Claude Opus 4.6 response
public void TransactionGroupExample(Document doc, Wall wall, WallType newType)
{
using (TransactionGroup txGroup = new TransactionGroup(doc, "Grouped Operations"))
{
txGroup.Start();
bool success = true;
// Sub-transaction 1: Move the wall
using (Transaction tx1 = new Transaction(doc, "Move Wall"))
{
tx1.Start();
try
{
ElementTransformUtils.MoveElement(doc, wall.Id, new XYZ(5, 0, 0));
tx1.Commit();
}
catch
{
tx1.RollBack();
success = false;
}
}
// Sub-transaction 2: Change wall type
if (success)
{
using (Transaction tx2 = new Transaction(doc, "Change Wall Type"))
{
tx2.Start();
try
{
wall.WallType = newType;
tx2.Commit();
}
catch
{
tx2.RollBack();
success = false;
}
}
}
if (success)
{
txGroup.Assimilate();
}
else
{
txGroup.RollBack();
TaskDialog.Show("Error", "Operation rolled back.");
}
}
}
RC38 | Hard | Winner: Claude Opus 4.6 (-0.049)
Question: Write C# code to export the active 3D view to DWG format using doc.Export. Configure DWGExportOptions with specific settings for layers, colors, and file version. Specify the output folder path and filename. Write code only. No explanation.
Expected signals: Export, DWGExportOptions, ExportColorMode, PropOverrides, LayerMapping, FileVersion, View3D, Transaction, ViewSet
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.556 | 0.778 |
| Quality | 0.917 | 0.833 |
| Completeness | 0.825 | 0.775 |
| Composite | 0.745 | 0.794 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Export;
using Autodesk.Revit.UI;
public class ExportToDwgCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
// Get the active 3D view
View3D active3DView = null;
foreach (View3D view in new FilteredElementCollector(doc).OfClass(typeof(View3D)).ToElementList())
{
if (view.IsWorksetVisible)
{
active3DView = view;
break;
}
}
if (active3DView == null)
{
message = "No active 3D view found.";
return Result.Failed;
}
// Define output path and filename
string outputFolder = @"C:\ExportOutput";
string filename = "ExportedView.dwg";
string fullPath = System.IO.Path.Combine(outputFolder, filename);
// Create DWG export options
DWGExportOptions options = new DWGExportOptions();
options.ExportObjectData = true;
options.ExportLayerInformation = true;
options.LayerMapping = LayerMappingType.ByView;
options.ColorMapping = ColorMappingType.ByView;
options.FileVersion = DWGVersion.AutoDetect;
options.ExportLinetypeInformation = true;
options.ExportLinetypeAsByLayer = true;
options.ExportUTF8Encoding = true;
// Export the view
bool exportSuccess = doc.Export(outputFolder, filename, active3DView, options);
if (exportSuccess)
{
return Result.Succeeded;
}
else
{
message = "Export to DWG failed.";
return Result.Failed;
}
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
}
}
Claude Opus 4.6 response
public void ExportToDwg(Document doc)
{
View3D view3d = new FilteredElementCollector(doc)
.OfClass(typeof(View3D))
.Cast<View3D>()
.FirstOrDefault(v => !v.IsTemplate);
if (view3d == null) return;
DWGExportOptions options = new DWGExportOptions();
options.FileVersion = ACADVersion.R2018;
options.ExportOfSolids = SolidGeometry.ACIS;
options.LayerMapping = "AIA";
options.Colors = ExportColorMode.IndexColors;
options.MergedViews = true;
options.HideUnreferenceViewTags = true;
string outputFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string fileName = "Export_" + view3d.Name;
ICollection<ElementId> viewIds = new List<ElementId> { view3d.Id };
using (Transaction tx = new Transaction(doc, "Export DWG"))
{
tx.Start();
doc.Export(outputFolder, fileName, viewIds, options);
tx.Commit();
}
}
RC39 | Hard | Winner: revit-coder-14b (+0.050)
Question: Write C# code to find wall endpoints using LocationCurve, then use WallUtils.DisallowWallJoinAtEnd and WallUtils.AllowWallJoinAtEnd to control wall join behavior at each end. Iterate through all walls in the model and disallow joins at both ends inside a Transaction. Write code only. No explanation.
Expected signals: WallUtils, DisallowWallJoinAtEnd, AllowWallJoinAtEnd, LocationCurve, Wall, FilteredElementCollector, Transaction, Curve, GetEndPoint
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.889 | 0.889 |
| Quality | 1.000 | 0.833 |
| Completeness | 0.775 | 0.775 |
| Composite | 0.888 | 0.838 |
revit-coder-14b response
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using System.Collections.Generic;
public class WallJoinControl
{
public static void Execute(Document doc)
{
using (Transaction transaction = new Transaction(doc, "Control Wall Joins"))
{
transaction.Start();
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(Wall));
foreach (Wall wall in collector)
{
LocationCurve locationCurve = wall.Location as LocationCurve;
if (locationCurve != null)
{
// Disallow joins at both ends
WallUtils.DisallowWallJoinAtEnd(wall, 0);
WallUtils.DisallowWallJoinAtEnd(wall, 1);
}
}
transaction.Commit();
}
}
}
Claude Opus 4.6 response
public void DisableAllWallJoins(Document doc)
{
var walls = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.WhereElementIsNotElementType()
.Cast<Wall>()
.ToList();
using (Transaction tx = new Transaction(doc, "Disable Wall Joins"))
{
tx.Start();
foreach (Wall wall in walls)
{
LocationCurve locCurve = wall.Location as LocationCurve;
if (locCurve == null) continue;
WallUtils.DisallowWallJoinAtEnd(wall, 0);
WallUtils.DisallowWallJoinAtEnd(wall, 1);
}
tx.Commit();
}
}
RC40 | Hard | Winner: Claude Opus 4.6 (-0.112)
Question: Write C# code to build a chained logical filter combining an ElementCategoryFilter for walls, an ElementParameterFilter on the Comments parameter, and a BoundingBoxIntersectsFilter with a specified Outline. Combine them using LogicalAndFilter and apply to a FilteredElementCollector. Write code only. No explanation.
Expected signals: LogicalAndFilter, ElementCategoryFilter, ElementParameterFilter, BoundingBoxIntersectsFilter, Outline, FilteredElementCollector, BuiltInCategory.OST_Walls, ParameterFilterRuleFactory, XYZ
| Component | revit-coder-14b | Claude Opus 4.6 |
|---|---|---|
| Signal | 0.889 | 1.000 |
| Quality | 0.417 | 0.417 |
| Completeness | 0.775 | 1.000 |
| Composite | 0.713 | 0.825 |
revit-coder-14b response
var wallFilter = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
var commentFilter = new ElementParameterFilter(new FilterStringContains(new ElementId(BuiltInParameter.ALL_MODEL_COMMENTS), "important"));
var outline = new Outline(new XYZ(0, 0, 0), new XYZ(10, 10, 10));
var boundingBoxFilter = new BoundingBoxIntersectsFilter(outline);
var combinedFilter = new LogicalAndFilter(wallFilter, commentFilter, boundingBoxFilter);
var collector = new FilteredElementCollector(doc).WherePasses(combinedFilter);
Claude Opus 4.6 response
public List<Element> GetFilteredWalls(Document doc)
{
// Filter 1: Category filter for walls
ElementCategoryFilter categoryFilter =
new ElementCategoryFilter(BuiltInCategory.OST_Walls);
// Filter 2: Parameter filter on Comments
ElementId commentsId = new ElementId(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS);
FilterRule rule = ParameterFilterRuleFactory.CreateContainsRule(
commentsId, "Structural", false);
ElementParameterFilter paramFilter = new ElementParameterFilter(rule);
// Filter 3: Bounding box intersects filter
XYZ min = new XYZ(-100, -100, -10);
XYZ max = new XYZ(100, 100, 50);
Outline outline = new Outline(min, max);
BoundingBoxIntersectsFilter bboxFilter = new BoundingBoxIntersectsFilter(outline);
// Chain with LogicalAndFilter
LogicalAndFilter combinedFilter1 = new LogicalAndFilter(categoryFilter, paramFilter);
LogicalAndFilter combinedFilter2 = new LogicalAndFilter(combinedFilter1, bboxFilter);
List<Element> result = new FilteredElementCollector(doc)
.WhereElementIsNotElementType()
.WherePasses(combinedFilter2)
.ToElements()
.ToList();
return result;
}
Confidence is high on these. The only one I'd sanity-check is rc36, specifically the GroupTypeId.Dimensions and SpecTypeId.Length parameter for FamilyManager.AddParameter since that signature changed between Revit 2022 and 2025 with the ForgeTypeId migration.
Xet Storage Details
- Size:
- 138 kB
- Xet hash:
- 4a2de9f0d40b332afd7c16d6e785036703035136b077cc030f8c0c719e9a2447
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.