一个简单的创建轴网及标注
public Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
{
Document revitDoc = commandData.Application.ActiveUIDocument.Document;
#region 获取文件中所有的轴网
//FilteredElementCollector grids = new FilteredElementCollector(revitDoc).OfCategory(BuiltInCategory.OST_Grids).WhereElementIsNotElementType();
//grids.ToList();
//foreach (var grid in grids)
//{
// TaskDialog.Show("提示", $"{grid.Name}");
//}
#endregion
double d = 2000 / 304.8;
List<double> distanceA = new List<double> { 3000, 6000, 6000, 3000, 6000 };
List<double> distanceB = new List<double> { 2000, 3000, 5000 };
distanceA = distanceA.ConvertAll(item => item / 304.8);
distanceB = distanceB.ConvertAll(item => item / 304.8);
double totalB = 0, totalA = 0;
foreach (double item in distanceA)
{
totalA += item;
}
foreach (int item in distanceB)
{
totalB += item;
}
List<Grid> xGrid = new List<Grid>();
List<Grid> yGrid = new List<Grid>();
using (Transaction tr = new Transaction(revitDoc, "创建轴网"))
{
tr.Start();
Grid gridx = Grid.Create(revitDoc, Line.CreateBound(new XYZ(0, -d, 0), new XYZ(0, totalB + d, 0)));
xGrid.Add(gridx);
//设置轴网属性
gridx.Pinned = true;
gridx.Name = "1";
GridType gridType = revitDoc.GetElement(gridx.GetTypeId()) as GridType;
Parameter gridParameter1 = gridType.LookupParameter("轴线中段");
gridParameter1.Set(0);
Parameter gridParameter2 = gridType.get_Parameter(BuiltInParameter.GRID_BUBBLE_END_1);//使用lookupparameter会报错
gridParameter2.Set(1);
Parameter gridParameter3 = gridType.get_Parameter(BuiltInParameter.GRID_BUBBLE_END_2);
gridParameter3.Set(1);
double deltx = 0;
for (int i = 0; i < distanceA.Count; i++)
{
deltx += distanceA[i];
Line line = Line.CreateBound(new XYZ(deltx, -d, 0), new XYZ(deltx, totalB + d, 0));
Grid grid = Grid.Create(revitDoc, line);
xGrid.Add(grid);
grid.Pinned = true;
}
Grid gridY = Grid.Create(revitDoc, Line.CreateBound(new XYZ(-d, 0, 0), new XYZ(d + totalA, 0, 0)));
yGrid.Add(gridY);
gridY.Name = "A";
gridY.Pinned = true;
double deltY = 0;
for (int i = 0; i < distanceB.Count; i++)
{
deltY += distanceB[i];
Grid grid = Grid.Create(revitDoc, Line.CreateBound(new XYZ(-d, deltY, 0), new XYZ(totalA + d, deltY, 0)));
yGrid.Add(grid);
grid.Pinned = true;
}
tr.Commit();
}
ReferenceArray refArray1 = new ReferenceArray();
ReferenceArray refArray2 = new ReferenceArray();
ReferenceArray refArray3 = new ReferenceArray();
ReferenceArray refArray4 = new ReferenceArray();
DimensionType dimensionType = null;
FilteredElementCollector cl = new FilteredElementCollector(revitDoc).OfClass(typeof(DimensionType));
foreach (var item in cl.ToList())//使用where表达式竟然不行,只能用foreach语句
{
if (item.Name == "对角线 - 3mm RomanD")
dimensionType = item as DimensionType;
}
foreach (var item in yGrid)
{
refArray1.Append(new Reference(item));
}
refArray2.Append(new Reference(yGrid.First()));
refArray2.Append(new Reference(yGrid.Last()));
foreach (var item in xGrid)
{
refArray3.Append(new Reference(item));
}
refArray4.Append(new Reference(xGrid.First()));
refArray4.Append(new Reference(xGrid.Last()));
using (Transaction tr = new Transaction(revitDoc, "轴网标注"))
{
tr.Start();
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(-d / 2, 0, 0), new XYZ(-d / 2, totalB, 0)), refArray1, dimensionType);
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(-d / 2 - 60 / 30.48, 0, 0), new XYZ(-d / 2 - 60 / 30.48, totalB, 0)), refArray2, dimensionType);
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(totalA + d / 2, 0, 0), new XYZ(totalA + d / 2, totalB, 0)), refArray1, dimensionType);
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(totalA + d / 2 + 60 / 30.48, 0, 0), new XYZ(totalA + d / 2 + 60 / 30.48, totalB, 0)), refArray2, dimensionType);
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(0, -d / 2, 0), new XYZ(totalA, -d / 2, 0)), refArray3, dimensionType);
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(0, -d / 2 - 60 / 30.48, 0), new XYZ(totalA, -d / 2 - 60 / 30.48, 0)), refArray4, dimensionType);
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(0, totalB + d / 2, 0), new XYZ(totalA, totalB + d / 2, 0)), refArray3, dimensionType);
revitDoc.Create.NewDimension(revitDoc.ActiveView, Line.CreateBound(new XYZ(0, totalB + d / 2 + 60 / 30.48, 0), new XYZ(totalA, totalB + d / 2 + 60 / 30.48, 0)), refArray4, dimensionType);
tr.Commit();
}
return Result.Succeeded;
}