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();
}