Revit二次开发根据一条线创建对应剖面视图及相机视图

Revit二次开发根据一条线创建对应剖面视图及相机视图

  一、生成剖面视图

 

  /// <summary>
        /// 生成剖面视图
        /// </summary>
        /// <param name="crv">线</param>
        /// <param name="doc">当前文档</param>
        /// <param name="num">视图范围</param>
        /// <param name="viewname">视图名称</param>
        /// <param name="lowZ">最低点</param>
        /// <param name="topZ">最高点</param>      
        /// <returns></returns>
        private string LoadBoxView(Curve crv, Document doc, double num, string viewname, double lowZ, double topZ)
        {
            XYZ p1 = crv.GetEndPoint(1);
            XYZ p2 = crv.GetEndPoint(0);
            XYZ midpoint = (p1 + p2) / 2;
            ViewFamilyType viewFamilyType = new FilteredElementCollector(doc).OfClass(typeof(ViewFamilyType)).Cast<ViewFamilyType>().FirstOrDefault<ViewFamilyType>(x => ViewFamily.Section == x.ViewFamily);
            XYZ vecPoint = p1 - p2;
            double len = p2.DistanceTo(p1) / 2;
            double offset = 0 * len;
            XYZ min = new XYZ(-len, 0 - 200 / 304.8, 0);//底部高度
            XYZ max = new XYZ(len, topZ - lowZ + 300 / 304.8, num);//顶部位置  
            XYZ eldir = -1 * (crv as Line).Direction;
            XYZ up = XYZ.BasisZ;
            XYZ viewdir = eldir.CrossProduct(up);
            Transform transform = Transform.Identity;
            transform.Origin = midpoint;
            transform.BasisX = eldir;
            transform.BasisY = up;
            transform.BasisZ = viewdir;
            BoundingBoxXYZ sectionBox = new BoundingBoxXYZ();
            sectionBox.Transform = transform;
            sectionBox.Min = min;
            sectionBox.Max = max;
            // Create section view
            View temp = null;
            using (Transaction tx = new Transaction(doc))
            {
                tx.Start("创建剖面视图");
                temp = ViewSection.CreateSection(doc, viewFamilyType.Id, sectionBox);
                temp.Name = "IBIM剖面" + " -" + viewname;
                temp.get_Parameter(BuiltInParameter.VIEW_DETAIL_LEVEL).Set((int)ViewDetailLevel.Fine);//精细
                temp.get_Parameter(BuiltInParameter.MODEL_GRAPHICS_STYLE).Set((int)DisplayStyle.ShadingWithEdges);//着色
                tx.Commit();
            }      
            return temp.Id.ToString();
        }

二、生成相机视图

 

  /// <summary>
        /// 创建相机视图
        /// </summary>
        /// <param name="crv">参照线</param>
        /// <param name="doc">当前项目</param>
        /// <param name="num">视图范围</param>  
        /// <param name="lowZ">当前相机所在高度</param>
        /// <param name="topZ">当前上方高度</param>
        private string LoadCamera(Curve crv, Document doc, double num, string viewname, double lowZ, double topZ)
        {
            XYZ dir = (crv as Line).Direction.CrossProduct(XYZ.BasisZ).Normalize();
            dir = -1 * dir;
            XYZ p11 = crv.GetEndPoint(1);
            XYZ p21 = crv.GetEndPoint(0);
            XYZ mid = (p11 + p21) / 2;
            IEnumerable<ViewFamilyType> viewFamilyTypes = from elem in new FilteredElementCollector(doc).OfClass(typeof(ViewFamilyType)) let type = elem as ViewFamilyType where type.ViewFamily == ViewFamily.ThreeDimensional select type;
            Transaction tran = new Transaction(doc, "创建相机视图");
            tran.Start();
            View3D view3D = View3D.CreatePerspective(doc, viewFamilyTypes.First().Id);
            if (null != view3D)
            {
                view3D.Name = "IBIM相机" + " -" + viewname;
                var eye = mid;   //相机坐标
                var up = XYZ.BasisZ;      //上方向                                        
                view3D.SetOrientation(new ViewOrientation3D(eye, up, dir));
                view3D.get_Parameter(BuiltInParameter.VIEW_DETAIL_LEVEL).Set((int)ViewDetailLevel.Fine);//精细
                view3D.get_Parameter(BuiltInParameter.MODEL_GRAPHICS_STYLE).Set((int)DisplayStyle.ShadingWithEdges);//着色
                view3D.LookupParameter("远剪裁偏移").Set(num * 10);
                view3D.LookupParameter("视点高度").Set(p11.Z + (topZ - lowZ) / 2);
                view3D.LookupParameter("目标高度").Set(p11.Z + (topZ - lowZ) / 2);
            }
            tran.Commit();
            return view3D.Id.ToString();
        }

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值