一、创建标准三维视图
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())
- 注意:锁定后用户无法通过界面旋转视图。
五、错误处理与最佳实践
-
事务封装:
所有创建操作需在事务中完成:using (Transaction tr = new Transaction(doc, "Create 3D View")) { tr.Start(); // 创建视图代码 tr.Commit(); }
-
重复视图检查:
避免创建同名视图导致冲突:var existingView = new FilteredElementCollector(doc) .OfClass(typeof(View)) .FirstOrDefault(v => v.Name == "MyView") as View; if (existingView != null) return; // 终止创建
-
空引用处理:
检查ViewFamilyType
是否有效:if (viewType == null) throw new Exception("No 3D view family type found.");
六、应用场景与扩展技巧
- 动态漫游:结合
Camera
类创建路径动画(需循环设置视角)。 - 批量生成:遍历楼层或构件,自动创建多个局部视图。
- 与剖面框联动:根据选择构件自动计算剖面框范围(
Element.BoundingBox
)。 - 视图样板继承:通过
ViewTemplateId
应用预设显示规则(如隐藏管道)。
提示:透视视图适合展示设计效果,正交视图更适用于施工协调;局部视图建议配合
ViewTemplate
控制显示规则。
通过上述方法,可灵活实现从基础视图创建到复杂交互控制的完整工作流,满足BIM协同、设计展示、施工深化等场景需求。