Revit二次开发之俯视图缩放匹配

时隔多日偶有所得,来写自己的第二篇博客,和大家共同进步。
应用场景是在Revit二次开发中需要将当前视图切换成三维视图,并且切换成俯视图,从而可以在平面上选点布置族实例。步骤如下:

  • 第一步:找到Revit项目文档中的三维视图,并将其设为活动视图(ActiveView)
  • 第二步:判断活动视图是否为俯视图
  • 第三步:将视图切换为俯视图
  • 第四步:切换成功的视图往往位置不对,需要进行缩放匹配(Zoom To Fit)
  • 第五步:激活族类型,并布置族实例
    示例代码如下:
public void LayOutPointInstance(UIApplication app)
{
    UIDocument uidoc = app.ActiveUIDocument; //取得文档
    Document doc = uidoc.Document;
    Selection selection = uidoc.Selection;
    Transaction transaction = new Transaction(doc);
            
    try
    {
        // 第一步,找到Revit项目文档中的三维视图,并将其设为活动视图
        View3D view = Get3dView(doc);

        if (null == view)
        {
            MessageBox.Show("没有找到合适的三维视图", "提示信息");
        }
        else
        {
            //Attention: 必须在开启事务之前设置视图,否则会报错
            uidoc.ActiveView = view;

            //第二步:先判断是不是俯视图,如果不是再调整视图
            if (!view.UpDirection.IsAlmostEqualTo(new XYZ(0, 1, 0)))
            {
                //要在事件响应中修改文档,必须显式地启动一个事务,在该事务中修改文档。
                transaction.Start("切换成三维视图");
                //用0-6的整数值代表不同的视觉样式
                //6代表真实、4代表着色、2代表隐藏线线框、1代表线框
                view.get_Parameter(BuiltInParameter.VIEW_DETAIL_LEVEL).Set(3);
                view.get_Parameter(BuiltInParameter.MODEL_GRAPHICS_STYLE).Set(6);
                view.SetOrientation(new ViewOrientation3D(new XYZ(), new XYZ(0, 1, 0), new XYZ(0, 0, -1)));
                                
                //进行缩放匹配操作
                IList<UIView> uIViews = uidoc.GetOpenUIViews();
                foreach (UIView uIView in uIViews)
                {
                    if(uIView.ViewId==doc.ActiveView.Id)
                       uIView.ZoomToFit();
                }
                transaction.Commit();
                                
             }
        }         
                 
        //第二步,选择点进行测点布设
        var reference = selection.PickObject(ObjectType.PointOnElement, "请选择面上的点");
        XYZ point = reference.GlobalPoint;//选中的点
        transaction.Start("激活族类型并放置族实例");
        FamilySymbol pointFamilySymbol = null;
        FilteredElementCollector colletion = new FilteredElementCollector(doc);
        colletion.OfClass(typeof(FamilySymbol));
        foreach (FamilySymbol item in colletion)
        {
            if (item.Name == "竖向位移")
            {
                pointFamilySymbol = item;
                if (!item.IsActive)
                    item.Activate();
            }
        }
        FamilyInstance familyInstance = doc.Create.NewFamilyInstance(point, pointFamilySymbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);
        transaction.Commit();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
            
}
/// <summary>
/// Retrieve a suitable 3D view from document.
/// </summary>
View3D Get3dView(Document doc)
{
    FilteredElementCollector collector = new FilteredElementCollector(doc).OfClass(typeof(View3D));

    foreach (View3D v in collector)
    {
        Debug.Assert(null != v,"never expected a null view to be returned"
                    + " from filtered element collector");

        // Skip view template here because view 
        // templates are invisible in project 
        // browser

        if (!v.IsTemplate)
         {
            return v;
         }
    }
    return null;
}

示例代码到此为止,下面分享一下学习心得。这也是一个Revit二次开发的小技巧,相信不少人已经掌握了。我们因为语言和使用习惯,往往Revit使用的都是中文版,并且开发人员或多或少对Revit软件的应用都比较熟悉,但是对Revit API往往不会那么熟悉,这个就显示出了RevitAPI.chm(开发人员帮助文档)的重要作用。而RevitAPI.chm是英文的,因此我们需要知道我们采用的API的英文名。下面举例说明,用的就是上面的缩放匹配功能。
在Revit面板中右键即可找到“缩放匹配(F)”这个功能,然后记住相应位置,关闭Revit,将其切换到英文版重新打开,同样操作后发现该操作名称为“Zoom To Fit”,依据该英文名称去帮助文档RevitAPI.chm检索,找到ZoomToFit Method,依据文档操作方法即可。
在这里插入图片描述在这里插入图片描述备注:Revit快捷方式右键->属性->快捷方式->目标,将后缀CHS改成ENU,注意其他不要更改;
浅薄之谈,有错误或者改进之处欢迎大家指正,当然有不懂的地方大家也可以一起交流,努力!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值