Revit二次开发——3D视图获取与创建

一、创建标准三维视图

1.获取当前文档的3D视图

/// <summary>
/// 获取当前文档的3D视图
/// </summary>
/// <param name="document"></param>
/// <returns></returns>
public View3D GetView3D(Document document)
{
    FilteredElementCollector filter = new FilteredElementCollector(document);
    //view为3DView且不为视图模版
    return (View3D)filter.OfClass(typeof(View3D)).FirstOrDefault(x => (x as View).ViewType == ViewType.ThreeD && !(x as View).IsTemplate);
}

2. 创建3D视图

public void Create3DView(Document doc, ref View3D view3D) //【创建3D视图】
        {

            //如果没有找到3D视图,创建一个
            if (view3D == null)
            {
                // 获取三维视图类型
                ViewFamilyType viewType = new FilteredElementCollector(doc)
                    .OfClass(typeof(ViewFamilyType))
                    .Cast<ViewFamilyType>()
                    .FirstOrDefault(x => x.ViewFamily == ViewFamily.ThreeDimensional);

                using (Transaction trans = new Transaction(doc, "3Dview"))
                {
                    trans.Start();
                    // 创建正交视图
                    view3D = View3D.CreateIsometric(doc, viewType.Id);
                    view3D.Name = "Custom_3D_View"; // 命名视图

                    // 创建透视视图
                    //view3D = View3D.CreatePerspective(doc, viewType.Id);

                    trans.Commit();
                }
            }

        }

二、自定义视角与方向控制

1. 通过向量定义视角
XYZ eye = new XYZ(0, -50, 10);  // 观察点位置(相机坐标)
XYZ up = new XYZ(0, 0, 1);      // 视图向上方向(Z轴)
XYZ forward = new XYZ(0, 1, 0); // 视图前方方向(Y轴)

// 设置视角方向
perspectiveView.SetOrientation(new ViewOrientation3D(eye, up, forward));
  • 参数说明
    • eye:相机在模型空间中的位置。
    • up:定义视图的垂直方向(通常为 XYZ.BasisZ)。
    • forward:定义视线朝向(从相机指向目标的方向向量)。
2. 基于模型面自动生成视角
Reference faceRef = uidoc.Selection.PickObject(ObjectType.Face);
Element faceElem = doc.GetElement(faceRef);
PlanarFace face = faceElem.GetGeometryObjectFromReference(faceRef) as PlanarFace;

// 获取面的法线方向作为视角方向
XYZ normal = face.ComputeNormal(face.GetBoundingBoxUV().Max);
view3D.OrientTo(normal); // 使视图垂直于选定面
  • 应用场景:快速生成构件(如设备、墙面)的正面视图。

三、高级功能与视图优化

1. 创建局部三维视图(剖面框)
view3D.GetSectionBox().Enabled = true; // 启用剖面框
BoundingBoxXYZ box = view3D.GetSectionBox();
box.Min = new XYZ(-10, -10, 0); // 设置剖面框范围
box.Max = new XYZ(10, 10, 5);
  • 作用:仅显示特定区域内的模型(如楼层局部、设备细节)。
  • UI 对应操作:属性面板中勾选“剖面框”并调整范围。
2. 部件视图(Assembly View)
// 创建部件(假设已选构件ID列表 assemblyIds)
AssemblyInstance assembly = AssemblyInstance.Create(doc, assemblyIds, categoryId);

// 生成部件专属三维视图
View3D assemblyView = AssemblyViewUtils.Create3DOrthographic(doc, assembly.Id);
  • 用途:为预制构件(如楼梯、管道组)生成独立视图。

四、视图属性与交互控制

1. 视图属性配置
# Python示例(同C#逻辑)
view3D.DetailLevel = ViewDetailLevel.Fine    # 设置详细程度为“精细”
view3D.DisplayStyle = DisplayStyle.Shading    # 显示模式设为“着色”
view3D.SunPathVisibility = SunPathVisibility.Visible  # 显示日照路径
  • 常用属性DetailLevel(精细/中等/粗略)、DisplayStyle(线框/着色/真实)。
2. 激活视图与锁定视角
uidoc.ActiveView = view3D; // 切换到新创建的视图
view3D.Lock();  // 锁定视图防止误操作旋转(需解锁时调用Unlock())
  • 注意:锁定后用户无法通过界面旋转视图。

五、错误处理与最佳实践

  1. 事务封装
    所有创建操作需在事务中完成:

    using (Transaction tr = new Transaction(doc, "Create 3D View")) {
        tr.Start();
        // 创建视图代码
        tr.Commit();
    }
    
  2. 重复视图检查
    避免创建同名视图导致冲突:

    var existingView = new FilteredElementCollector(doc)
        .OfClass(typeof(View))
        .FirstOrDefault(v => v.Name == "MyView") as View;
    if (existingView != null) return; // 终止创建
    
  3. 空引用处理
    检查 ViewFamilyType 是否有效:

    if (viewType == null) 
        throw new Exception("No 3D view family type found.");

六、应用场景与扩展技巧

  • 动态漫游:结合 Camera 类创建路径动画(需循环设置视角)。
  • 批量生成:遍历楼层或构件,自动创建多个局部视图。
  • 与剖面框联动:根据选择构件自动计算剖面框范围(Element.BoundingBox)。
  • 视图样板继承:通过 ViewTemplateId 应用预设显示规则(如隐藏管道)。

提示:透视视图适合展示设计效果,正交视图更适用于施工协调;局部视图建议配合 ViewTemplate 控制显示规则。

通过上述方法,可灵活实现从基础视图创建到复杂交互控制的完整工作流,满足BIM协同、设计展示、施工深化等场景需求。

### 使用Revit API 进行视图过滤器的创建 在Autodesk Revit中,通过使用Revit API可以实现对视图内图元的高度定制化管理。为了创建一个视图过滤器,开发者可以通过编写C#脚本调用相应的API方法来完成这一目标[^1]。 下面展示一段用于创建并应用视图过滤器到指定视图上的代码: ```csharp using Autodesk.Revit.DB; using System.Linq; public void CreateViewFilter(Document doc, ElementId viewId) { using (Transaction trans = new Transaction(doc)) { trans.Start("Create View Filter"); // 定义要筛选的类别 BuiltInCategory categoryToFilter = BuiltInCategory.OST_Walls; // 创建参数过滤规则 ParameterValueProvider provider = new ParameterValueProvider(new ElementId(BuiltInParameter.ELEM_TYPE_PARAM)); FilterNumericEquals filterRule = new FilterNumericEquals(provider, new ElementId(207)); // 假设207为某种类型的ID // 构建ElementParameterFilter对象 ElementParameterFilter parameterFilter = new ElementParameterFilter(filterRule); // 将新创建的过滤条件应用于选定视图 View view = doc.GetElement(viewId) as View; if (view != null && !view.IsTemplate) { OverrideGraphicSettings ogs = new OverrideGraphicSettings(); // 设置图形覆盖样式(这里仅作为示例) ogs.SetProjectionLineWeight(8); view.SetVisibility(hiddenCategories: new CategorySet(), visibleCategories: new[] {categoryToFilter}.Select(x => new CategoryOverride(x, ogs))); // 添加过滤器至视图 view.AddFilter(parameterFilter.Id); } trans.Commit(); } } ``` 这段代码实现了如下功能: - 开启事务以修改文档状态; - 设定需要被过滤出来的特定类别的构件——在此处选择了墙体(`BuiltInCategory.OST_Walls`); - 利用了`ParameterValueProvider` 和 `FilterNumericEquals` 来构建具体的数值比较逻辑,从而形成最终的过滤规则; - 应用了所定义好的过滤器,并设置了该视图下此类别构件显示效果的一些基本属性;最后提交更改结束事务处理过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值