资源描述
Revit2016 二次开发笔记
1.选中图元
1.1事先选择某类图元(Wall)
Autodesk.Revit.UI.UIApplication revit = commandData.Application;
ElementSet collection = new ElementSet();
ElementSet selWall = new ElementSet();
foreach (ElementId elementId in revit.ActiveUIDocument.Selection.GetElementIds())
{
collection.Insert(revit.ActiveUIDocument.Document.GetElement(elementId)); //选中的原件
}
foreach (Element ele in sel)
{
Wall wall = ele as Wall; //如果为墙
if (wall !=null)
{
SelWal.Insert(ele);
}
}
1.2.通过交互方式
1.2.1用矩形框选择图元
所用方法:PickElementsByRectangle()
using System.Collections.Generic; //声明引用命名空间,Ilist
UIDocument uidoc = commandData.Application.ActiveUIDocument;
ElementSet collector = new ElementSet();
IList<Element> elemList = uidoc.Selection.PickElementsByRectangle();//矩形框的应用
string info = "所选图元:";
foreach (Element elem in elemList)
{
collector.Insert(elem);
info += "\n\t" + elem.ToString();
}
TaskDialog.Show("Choose Items", info);
return Result.Succeeded;
1.2.2用点击选择图元
所用方法:PickObject(ObjectType.Element)
using Autodesk.Revit.UI.Selection; //声明引用命名空间,ObjectType
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Reference hasPickOne = uidoc.Selection.PickObject(ObjectType.Element);
Element elem = uidoc.Document.GetElement(hasPickOne.ElementId);
string info = "所选图元:";
info += "\n\t" + elem.GetType().ToString();
TaskDialog.Show("Revit", info);
还存在其它用法:Selection.PickObject (ObjectType, String) //string 为提示
PickObjects (ObjectType) //允许选择多个元素
1.2.3选择及过滤
UIDocument uidoc = commandData.Application.ActiveUIDocument;
ISelectionFilter selFilter = new MassSelectionFilter();
IList<Element> eList = uidoc.Selection.PickElementsByRectangle(selFilter) as IList<Element>;
string info = "选择了以下的墙:";
foreach(Element elem in eList)
{
info += "\n\t" + elem.Name;
}
TaskDialog.Show("Revit", info);
return Result.Succeeded;
public class MassSelectionFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
return elem is Wall; //选择了墙
}
public bool AllowReference(Reference reference, XYZ position)
{
throw new NotImplementedException();// 第二个条件
}
}
2.加载族并创建实例
UIApplication m_application;
UIDocument m_document;
m_application = commandData.Application;
m_document = m_application.ActiveUIDocument;
2.1.加载族
1) m_document .Document.LoadFamilySymbol (
FullPath, symbolName, out loadedfamilySymbol);
2) m_document .Document.LoadFamily (
FullPath, out loadedfamily);
第一种用来加载族类型,第二种用来加载族,返回的loadfamily和loadfamilysymbol 可以随后用来创建族实例
2.2创建族实例
创建族实例将经过:
1)选择一个平面,建立一个工作平面
2)选择一个点放置族实例
2.1选择平面
Reference faceRef = m_document.Selection.PickObject(ObjectType.Face, new PlanarFaceFilter(m_document.Document), "Please pick a planar face to set the work plane. ESC for cancel.");
GeometryObject geoObject = m_document.Document.GetElement(faceRef).GetGeometryObjectFromReference(faceRef);
PlanarFace planarFace = geoObject as PlanarFace;
//判断选择为平面的类
public class PlanarFaceFilter : ISelectionFilter
{
// Revit document.
Document m_doc = null;
/// Constructor the filter and initialize the document.
public PlanarFaceFilter(Document doc)
{
m_doc = doc;
}
/// Allow all the element to be selected
public bool AllowElement(Element element)
{
return true;
}
/// Allow planar face reference to be selected
public bool AllowReference(Reference refer, XYZ point)
{
GeometryObject geoObject = m_doc.GetElement(refer).GetGeometryObjectFromReference(refer);
return geoObject != null && geoObject is PlanarFace;
}
}
2.2创建工作平面
SketchPlane faceSketchPlane = CreateSketchPlane(planarFace.FaceNormal, planarFace.Origin);
if (faceSketchPlane != null)
{
// 对模型进行操作必须新建 Transaction 事件
Transaction changeSketchPlane = new Transaction(m_document.Document, "Change Sketch Plane.");
changeSketchPlane.Start();
m_document.Document.ActiveView.SketchPlane = faceSketchPlane;
m_document.Document.ActiveView.ShowActiveWorkPlane();
changeSketchPlane.Commit();
}
//创建工作平面的子方法
internal SketchPlane CreateSketchPlane(Autodesk.Revit.DB.XYZ normal, Autodesk.Revit.DB.XYZ origin)
{
// First create a Geometry.Plane which need in NewSketchPlane() method
Plane geometryPlane = m_application.Application.Create.NewPlane(normal, origin);
// Then create a sketch plane using the Geometry Plane
Transaction createSketchPlane = new Transaction(m_document.Document, "Create a sketch plane.");
createSketchPlane.Start();
SketchPlane plane = SketchPlane.Create(m_document.Document, geometryPlane);
createSketchPlane.Commit();
return plane;
}
2.3 选择一个点并创建实例
// Pick point from current work plane with snaps.
ObjectSnapTypes snapType = ObjectSnapTypes.Centers | ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections| ObjectSnapTypes.Midpoints | ObjectSnapTypes.Nearest | ObjectSnapTypes.WorkPlaneGrid;
XYZ point = m_document.Selection.PickPoint(snapType, "Please pick a point to place component.");
Transaction LoadAndCreat = new Transaction(m_document.Document, "Load a Family.");
LoadAndCreat.Start(); // 对模型进行操作必须新建 Transaction 事件
//加载族并创建实例
FamilySymbol loadedfamilySymbol = null;
string directory = @"C:\Users\Administrator\Desktop\RevitProgram\Family";
string symbolName = "测斜管";
try
{
m_document.Document.LoadFamilySymbol(
string.Format(@"{0}\{1}.rfa",directory,symbolName )
, symbolName
, out loadedfamilySymbol);
}
catch (Exception e)
{
message = e.Message;
return Result.Failed;
}
if (null == loadedfamilySymbol)
{
TaskDialog.Show("Revit", "Can't load the prepared rfa.");
return Result.Failed;
}
//创建族实例
CreatePointFamilyInstance(point, loadedfamilySymbol, StructuralType.NonStructural);
LoadAndCreat.Commit(); //子事件结束
//创建族实例的方法
public bool CreatePointFamilyInstance(XYZ location,FamilySymbol symbol,StructuralType structuralType)
{
if (!symbol.IsActive)
symbol.Activate();
FamilyInstance instance = m_document.Document.Create.NewFamilyInstance(location, symbol, structuralType);
List<ElementId> instanceId = new List<ElementId>();
instanceId.Add(instance.Id);
m_document.Selection.SetElementIds(instanceId); //已经在选择集里
return true;
}
3.用过滤器统计传感器
3.1通过族类型名称查找族实例
//用到了慢过滤器:FamilyInstanceFilter
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector = collector.OfClass(typeof(FamilySymbol));
var query = from element in collector
where element.Name =="测斜管" //查找名为“测斜管”的族实例
select element; //linq 查询
List<Element> famSyms = query.ToList<Element>();
ElementId symbolId = famSyms[0].Id;//创建过滤器并找到该族类型对应的所有族实例
collector = new FilteredElementCollector(doc);
FamilyInstanceFilter filter = new FamilyInstanceFilter(doc, symbolId);
IList<Element> founds = collector.WherePasses(filter).ToElements();
foreach(FamilyInstance inst in founds)
{
TaskDialog.Show("Revit", string.Format("FamilyInstance:\t{0}\nFamilySybmol Id:\t{1}\nName:\t{2}", inst.Id.IntegerValue,inst.Symbol.Id.IntegerValue,inst.Symbol.Name));
}
//新建对话框,选择是否删除查找到的族实例
TaskDialog mainDialog = new TaskDialog("删除");
mainDialog.MainContent = "单击\"Ok\"删除传感器!";
mainDialog.CommonButtons = TaskDialogCommonButtons.Ok | TaskDialogCommonButtons.Cancel;
if (TaskDialogResult.Ok == mainDialog.Show())
//对元件进行编辑都必须新建事件来解决
using (Transaction delTrans = new Transaction(doc, "delete the element!"))
{
delTrans.Start();
doc.Delete(founds[0].Id);
delTrans.Commit();
}
3.2 通过族名查找族类型
//用到了快过滤器:FamilySymbolFilter
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector = collector.OfClass(typeof(Family));
var query = from element in collector
where element.Name == "测斜管"
select element; //Linq查询
List<Element> fam= query.ToList<Element>();
ElementId famId = fam[0].Id;
//创建过滤器并找到该族对应的所有族类型
collector = new FilteredElementCollector(doc);
FamilySymbolFilter filter = new FamilySymbolFilter(famId);
//收集族类型名称
IList<Element> founds = collector.WherePasses(filter).ToElements();
foreach (FamilySymbol syms in founds)
{
TaskDialog.Show("Revit", string.Format("FamilySymbol:\t{0}\nFamily Id:\t{1}\nName:\t{2}",
syms.Id.IntegerValue, syms.Family.Id.IntegerValue, syms.Family.Name));
}
//收集族类型ID
ICollection<ElementId> found= collector.WherePasses(filter).ToElementIds();
foreach (ElementId symsId in found)
{
TaskDialog.Show("Revit", string.Format("FamilySymbol Id:\t{0}\nName:\t{1}",
symsId.IntegerValue, symsId.ToString()));
}
4.实例的隔离与颜色改变
4.1 实例的颜色改变
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
//过滤填充图案
FilteredElementCollector fillPatternFilter = new FilteredElementCollector(doc);
fillPatternFilter.OfClass(typeof(FillPatternElement));
//获取实体填充
FillPatternElement fp = fillPatternFilter.First(m => (m as FillPatternElement).GetFillPattern().IsSolidFill) as FillPatternElement;
Reference hasPickOne = uidoc.Selection.PickObject(ObjectType.Element);
if (hasPickOne != null)
{
Transaction trans = new Transaction(doc, "trans");
trans.Start();
View v = doc.ActiveView;
OverrideGraphicSettings ogs = v.GetElementOverrides(hasPickOne.ElementId);
Color oldColor = ogs.ProjectionFillColor; //实例的现在颜色
ElementId oldEleId = ogs.ProjectionFillPatternId; //现在的fillPatternid
//设置 投影/表面 ->填充图案->填充图案
ogs.SetProjectionFillPatternId(fp.Id);
//设置 投影/表面 ->填充图案->颜色
ogs.SetProjectionFillColor(new Color(255, 0, 0));
//应用到视图
v.SetElementOverrides(hasPickOne.ElementId, ogs);
trans.Commit();
}
return Result.Succeeded;
4.2 实例的隔离与恢复显示
单独构建:
1. var ui = commandData.Application.ActiveUIDocument;
2. var doc = ui.Document;
3.
4. var select = ui.Selection;
5. var refe = select.PickObject(ObjectType.Element);
6.
7. using (Transaction trans = new Transaction(doc))
8. {
9. trans.Start("isloate");
10. ui.ActiveView.IsolateElementTemporary(refe.ElementId);
11. trans.Commit();
12. }
构建组:
1. var ui = commandData.Application.ActiveUIDocument;
2. var doc = ui.Document;
3. var select = ui.Selection;
4. var refe = select.PickObject(ObjectType.Element);
5. //using (Transaction trans = new Transaction(doc))
6. //{
7. // trans.Start("isloate");
8. // ui.ActiveView.IsolateElementTemporary(refe.ElementId);
9. // trans.Commit();
10. //}
11. var ele = doc.GetElement(refe);
12. if (ele is Group)
13. {
14. var g = ele as Group;
15. var ids = g.GetMemberIds();
16. using (Transaction trans = new Transaction(doc))
17. {
18. trans.Start("isloate");
19. ui.ActiveView.IsolateElementsTemporary(ids);
20. trans.Commit();
21. //输出图片
22. ImageExportOptions ieop = new ImageExportOptions()
23. {
24. ExportRange = ExportRange.CurrentView,
25. FilePath = @"g:\tt.bmp",
26. FitDirection = FitDirectionType.Horizontal,
27. HLRandWFViewsFileType = ImageFileType.BMP,
28. ImageResolution = ImageResolution.DPI_600,
29. ShadowViewsFileType = ImageFileType.BMP,
30. };
31. doc.ExportImage(ieop);
32.
33. }
34. // 取消隔离
35. using (Transaction trans = new Transaction(doc))
36. {
37. trans.Start("roallback");
38. ui.ActiveView.DisableTemporaryViewMode(TemporaryViewMode.TemporaryHideIsolate);
39. trans.Commit();
40. }
41.
42. }
43. return Result.Succeeded;
展开阅读全文