revit 二次开发创建轴网及标注

一个简单的创建轴网及标注

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值