时隔多日偶有所得,来写自己的第二篇博客,和大家共同进步。 应用场景是在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 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());
}
}
///
/// Retrieve a suitable 3D view from document.
///
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,依据文档操作方法即可。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200224225109794.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYwNTg3Mg==,size_16,color_FFFFFF,t_70) 备注:Revit快捷方式右键->属性->快捷方式->目标,将后缀CHS改成ENU,注意其他不要更改; 浅薄之谈,有错误或者改进之处欢迎大家指正,当然有不懂的地方大家也可以一起交流,努力!
|