Revit二开--划线切板功能源码

Revit二开–划线切板功能源码

前一篇博客划线切板功能解析介绍了划线切板功能,今天把源码补充上

在Revit使用过程中,版的切割对用户来说不是很容易,Revit原生功能在板的分割上并不是十分友好。今天我在这里分享 楼板分割的方法(天花板切割原理类似)。

  • 1.鼠标点选楼板。
  • 2.调用画线命令,绘制一条直线。
  • 3.用绘制的直线切割楼板。

代码详见github:https://github.com/binbinstrong/tangsengjiewa

 /// <summary>
    /// 划线切板
    /// </summary>
    [Transaction(TransactionMode.Manual)]
    class Cmd_CutFloorWithLine : IExternalCommand
    {
        private Floor floor = null;
        ICollection<ElementId> ids_add = new List<ElementId>();
        private Application App = null;

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var uiapp = commandData.Application;
            var app = uiapp.Application;
            App = app;
            var uidoc = uiapp.ActiveUIDocument;

            var doc = uidoc.Document;
            var sel = uidoc.Selection;

            var acview = doc.ActiveView;
            app.DocumentChanged += OnDocumentChanged;
            uiapp.Idling += OnIdling;

            floor =
              sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is Floor)).GetElement(doc) as Floor;

#if Revit2019
            CommandHandlerService.invokeCommandHandler("ID_OBJECTS_PROJECT_CURVE");

#endif



#if Revit2016
              //调用postablecommand 
              var commandid = RevitCommandId.LookupPostableCommandId(PostableCommand.ModelLine);
              uiapp.PostCommand(commandid);
            
#endif


            return Result.Succeeded;
        }

        private void OnIdling(object sender, IdlingEventArgs e)
        {
            //var App = sender as Application;
            var docsInApp = App.Documents.Cast<Document>();
            var doc = docsInApp.FirstOrDefault();
            var uidoc = new UIDocument(doc);
            var uiapp = uidoc.Application;

            try
            {

                var ActiveDoc = docsInApp.FirstOrDefault();

                if (ids_add.Count != 1)
                {
                    return;
                }

                var modelline = ids_add.First().GetElement(ActiveDoc) as ModelLine;
                var line = modelline.GeometryCurve as Line;

                //MessageBox.Show(line.Length.ToString());

                var linedir = line.Direction;
                var startpo = line.StartPoint();
                var endpo = line.EndPoint();

                var updir = XYZ.BasisZ;

                var leftNorm = updir.CrossProduct(linedir).Normalize();
                var rightNorm = updir.CrossProduct(-linedir).Normalize();

                var leftspacePlane = default(Plane);// Plane.CreateByNormalAndOrigin(leftNorm, startpo);
                var rightspacePlane = default(Plane);//Plane.CreateByNormalAndOrigin(rightNorm, startpo);

#if Revit2016
                leftspacePlane = new Plane(leftNorm, startpo);
                rightspacePlane = new Plane(rightNorm, startpo);

#endif
#if Revit2019

                leftspacePlane = Plane.CreateByNormalAndOrigin(leftNorm, startpo);
                rightspacePlane = Plane.CreateByNormalAndOrigin(rightNorm, startpo);
#endif



                //var slapshapeEditor = floor.SlabShapeEditor;
                //剪切楼板

                //var verticals = slapshapeEditor.SlabShapeVertices.Cast<XYZ>();
                //var upfaceRef = HostObjectUtils.GetTopFaces(floor);
                //var upface = floor.GetGeometryObjectFromReference(upfaceRef.FirstOrDefault());

                var geoele = floor.get_Geometry(new Options()
                { ComputeReferences = true, DetailLevel = ViewDetailLevel.Fine });

                var solid = geoele.Getsolids().FirstOrDefault();


                var newsolid1 = BooleanOperationsUtils.CutWithHalfSpace(solid, leftspacePlane);
                var newsolid2 = BooleanOperationsUtils.CutWithHalfSpace(solid, rightspacePlane);

                var upface1 = newsolid1.GetFacesOfGeometryObject().Where(m => m.ComputeNormal(new UV()).IsSameDirection(XYZ.BasisZ))
                    .FirstOrDefault();

                var upface2 = newsolid2.GetFacesOfGeometryObject().Where(m => m.ComputeNormal(new UV()).IsSameDirection(XYZ.BasisZ))
                    .FirstOrDefault();


                var curveloop1 = upface1.GetEdgesAsCurveLoops().FirstOrDefault();
                var curvearray1 = curveloop1.ToCurveArray();

                var curveloop2 = upface2.GetEdgesAsCurveLoops().FirstOrDefault();
                var curvearray2 = curveloop2.ToCurveArray();


                ActiveDoc.Invoke(m =>
                {
                    var newfloor1 = ActiveDoc.Create.NewFloor(curvearray1, floor.FloorType, floor.LevelId.GetElement(ActiveDoc) as Level, false);
                    var newfloor2 = ActiveDoc.Create.NewFloor(curvearray2, floor.FloorType,
                        floor.LevelId.GetElement(ActiveDoc) as Level, false);
                    doc.Delete(floor.Id);
                }, "newfloor");

                //var newfloor2 =
                //    ActiveDoc.Create.NewFloor(, floor.FloorType, floor.LevelId.GetElement(ActiveDoc) as Level, false);


                //slapshapeEditor.DrawSplitLine()
                if (this != null)
                    uiapp.Idling -= OnIdling;

            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.ToString());
                uiapp.Idling -= OnIdling;
            }

        }

        private void OnDocumentChanged(object sender, DocumentChangedEventArgs e)
        {
            var App = sender as Application;
            try
            {
                var docsInApp = App.Documents.Cast<Document>();

                var ActiveDoc = e.GetDocument();
                ids_add = e.GetAddedElementIds();

                if (ids_add.Count != 1)
                {
                    return;
                }

                var modelline = ids_add.First().GetElement(ActiveDoc) as ModelLine;
                var line = modelline.GeometryCurve as Line;

                //MessageBox.Show(line.Length.ToString());

                var linedir = line.Direction;
                var startpo = line.StartPoint();
                var endpo = line.EndPoint();

                var updir = XYZ.BasisZ;

                var leftNorm = updir.CrossProduct(linedir).Normalize();
                var rightNorm = updir.CrossProduct(-linedir).Normalize();

                var leftspacePlane = default(Plane);//Plane.CreateByNormalAndOrigin(leftNorm, startpo);
                var rightspacePlane = default(Plane);//PPlane.CreateByNormalAndOrigin(rightNorm, startpo);



#if Revit2016
                leftspacePlane = new Plane(leftNorm, startpo);
                rightspacePlane = new Plane(rightNorm, startpo);

#endif
#if Revit2019

                leftspacePlane = Plane.CreateByNormalAndOrigin(leftNorm, startpo);
                rightspacePlane = Plane.CreateByNormalAndOrigin(rightNorm, startpo);
#endif



                var slapshapeEditor = floor.SlabShapeEditor;
                //剪切楼板

                //var verticals = slapshapeEditor.SlabShapeVertices.Cast<XYZ>();
                //var upfaceRef = HostObjectUtils.GetTopFaces(floor);
                //var upface = floor.GetGeometryObjectFromReference(upfaceRef.FirstOrDefault());

                var geoele = floor.get_Geometry(new Options()
                { ComputeReferences = true, DetailLevel = ViewDetailLevel.Fine });

                var solid = geoele.Getsolids().FirstOrDefault();


                var newsolid1 = BooleanOperationsUtils.CutWithHalfSpace(solid, leftspacePlane);
                var newsolid2 = BooleanOperationsUtils.CutWithHalfSpace(solid, rightspacePlane);

                var upface1 = newsolid1.GetFacesOfGeometryObject().Where(m => m.ComputeNormal(new UV()).IsSameDirection(XYZ.BasisZ))
                    .FirstOrDefault();

                var upface2 = newsolid2.GetFacesOfGeometryObject().Where(m => m.ComputeNormal(new UV()) == XYZ.BasisZ)
                    .FirstOrDefault();


                var curveloop1 = upface1.GetEdgesAsCurveLoops().FirstOrDefault();

                var curvearray = curveloop1.ToCurveArray();

                ActiveDoc.Invoke(m =>
                {
                    var newfloor1 = ActiveDoc.Create.NewFloor(curvearray, floor.FloorType, floor.LevelId.GetElement(ActiveDoc) as Level, false);
                }, "newfloor");


                //var newfloor2 =
                //    ActiveDoc.Create.NewFloor(, floor.FloorType, floor.LevelId.GetElement(ActiveDoc) as Level, false);
                 
                //slapshapeEditor.DrawSplitLine()
                if (this != null)
                    App.DocumentChanged -= OnDocumentChanged;


            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.ToString());
                App.DocumentChanged -= OnDocumentChanged;
            }
        }
    }

在这里插入图片描述

更多Revit二开知识尽在唐僧课堂!

唐僧课堂BIM开发

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值