使用View.IsolateElementTemporary方法可以轻松实现隔离构件功能,个人认为比SDK中VisibilityCtrl更加高效。
代码如下:
var ui = commandData.Application.ActiveUIDocument;
var doc = ui.Document;
var select = ui.Selection;
var refe = select.PickObject(ObjectType.Element);
using (Transaction trans = new Transaction(doc))
{
trans.Start("isloate");
ui.ActiveView.IsolateElementTemporary(refe.ElementId);
trans.Commit();
}
但是当选择的构件是构件组的时候,用这个方法隔离会出现异常现象:选中的组构建并没有显示出来。
虽然构建组也有一个ElementId,和IsolateElementTemporary方法参数完全匹配,但是并不能用这个。
API中还提供了另外一个方法:IsolateElementsTemporary,这个方法的参数时ICollection<ElementId> .
所以实现隔离构建组的思路是:选取构建组然后获取组成员的ElementId列表。
下面代码实现隔离构件组,并导出构建组的图片,然后恢复隔离,代码如下:
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var ui = commandData.Application.ActiveUIDocument;
var doc = ui.Document;
var select = ui.Selection;
var refe = select.PickObject(ObjectType.Element);
//using (Transaction trans = new Transaction(doc))
//{
// trans.Start("isloate");
// ui.ActiveView.IsolateElementTemporary(refe.ElementId);
// trans.Commit();
//}
var ele = doc.GetElement(refe);
if (ele is Group)
{
var g = ele as Group;
var ids = g.GetMemberIds();
using (Transaction trans = new Transaction(doc))
{
trans.Start("isloate");
ui.ActiveView.IsolateElementsTemporary(ids);
trans.Commit();
ImageExportOptions ieop = new ImageExportOptions()
{
ExportRange = ExportRange.CurrentView,
FilePath = @"g:\tt.bmp",
FitDirection = FitDirectionType.Horizontal,
HLRandWFViewsFileType = ImageFileType.BMP,
ImageResolution = ImageResolution.DPI_600,
ShadowViewsFileType = ImageFileType.BMP,
};
doc.ExportImage(ieop);
}
using (Transaction trans = new Transaction(doc))
{
trans.Start("roallback");
ui.ActiveView.DisableTemporaryViewMode(TemporaryViewMode.TemporaryHideIsolate);
trans.Commit();
}
}
return Result.Succeeded;
}