Revit二次开发之填充区域创建标注

Revit二次开发之填充区域创建标注

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;
namespace AutoDimention
{
    [TransactionAttribute(TransactionMode.Manual)]
    public class AutoDimentionGrid_Cmd : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            View view = uidoc.ActiveView;
            UIApplication uiapp = commandData.Application;
            IEnumerable<FilledRegion> filledRegions = FindFilledRegions(doc, view.Id);
            //var filledRegions = FindFilledRegions(doc, view.Id);

            //开启事务
            using (Transaction ts = new Transaction(doc))
            {
                ts.Start("dimention");
                foreach(FilledRegion region in  filledRegions)
                {
                    CreateDimentions(region, -1 * view.RightDirection);
                    CreateDimentions(region, view.UpDirection);
                }

                ts.Commit();
            }

                return Result.Succeeded;
        }
        /// <summary>
        /// 找到填充区域
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="viewId"></param>
        /// <returns></returns>
        public static IEnumerable<FilledRegion> FindFilledRegions(Document doc,ElementId viewId)
        {
            FilteredElementCollector collector = new FilteredElementCollector(doc, viewId);
            return collector.OfClass(typeof(FilledRegion)).Cast<FilledRegion>();
        }
        
        /// <summary>
        /// 创建标注
        /// </summary>
        /// <param name="fillRegion"></param>
        /// <param name="dimensionDirection"></param>
        private static void CreateDimentions(FilledRegion fillRegion,XYZ dimensionDirection)
        {
            Document doc = fillRegion.Document;
            View view = doc.GetElement(fillRegion.OwnerViewId) as View;
            XYZ edgesDirection = dimensionDirection.CrossProduct(view.ViewDirection);
            List<Edge> edges = FindingRegionEdges(fillRegion).Where(m => IsEdgeDirectionSatisfied(m, edgesDirection)).ToList<Edge>();
            if(edges.Count<2)
            {
                return;
            }
            var shift = UnitUtils.ConvertToInternalUnits(-10 * view.Scale, DisplayUnitType.DUT_MILLIMETERS) * edgesDirection;
            var dimensionLine = Line.CreateBound(fillRegion.get_BoundingBox(view).Min + shift, dimensionDirection);
            ReferenceArray referenceArray = new ReferenceArray();
            foreach(Edge edge in edges)
            {
                referenceArray.Append(edge.Reference);
            }
            doc.Create.NewDimension(view, dimensionLine, referenceArray);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="edge"></param>
        /// <param name="edgeDirection"></param>
        /// <returns></returns>
        private static bool IsEdgeDirectionSatisfied(Edge edge,XYZ edgeDirection)
        {
            Line edgeCurve = edge.AsCurve() as Line;
            if (edgeCurve == null) return false;
            return edgeCurve.Direction.CrossProduct(edgeDirection).IsAlmostEqualTo(XYZ.Zero);
        }
        /// <summary>
        /// 找出填充区域的边界
        /// </summary>
        /// <param name="filledRegion"></param>
        /// <returns></returns>
        private static IEnumerable<Edge> FindingRegionEdges(FilledRegion filledRegion)
        {
            View view = filledRegion.Document.GetElement(filledRegion.OwnerViewId) as View;
            Options opt = new Options
            {
                View = view,
                ComputeReferences = true
            };
            return filledRegion.get_Geometry(opt).OfType<Solid>().SelectMany(m => m.Edges.Cast<Edge>());
        }

    }
}

点击我查看效果
参考文章

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值