Revit API提供根据射线来寻找经过的元素。方法是固定模式,没什么好说。
关键代码:
doc.FindReferencesWithContextByDirection(ptStart, (ptEnd - ptStart), view3d)//射线法寻找穿过的对象
[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class FindSupporting : IExternalCommand
{
public Result Execute(ExternalCommandData
commandData,
ref string messages, ElementSet elements)
{
UIApplication app = commandData.Application;
Document doc = app.ActiveUIDocument.Document;
Transaction trans =
new Transaction(doc,
"ExComm");
trans.Start();
Selection sel = app.ActiveUIDocument.Selection;
//Reference ref1 = sel.PickObject(ObjectType.Element, "Please pick a beam");
//FamilyInstance beam = doc.GetElement(ref1) as FamilyInstance;
Reference ref1 = sel.PickObject(ObjectType.Element,
"Please pick a duct");
Duct duct = doc.GetElement(ref1)
as Duct;
//Read the beam's location line
//LocationCurve lc = beam.Location as LocationCurve;
LocationCurve lc = duct.Location
as LocationCurve;
Curve curve = lc.Curve;
//取得线端点的方法
XYZ ptStart = curve.get_EndPoint(
0);
XYZ ptEnd = curve.get_EndPoint(
1);
//move the two point a little bit lower, so the ray can go through the wall
XYZ offset =
new XYZ(
0,
0,
0.01);
//向量偏移的方法,这里向下偏移。
ptStart = ptStart - offset;
ptEnd = ptEnd - offset;
View3D view3d =
null;
view3d = doc.ActiveView
as View3D;
if (view3d ==
null)
{
TaskDialog.Show(
"3D view",
"current view should be 3D view");
return Result.Failed;
}
double beamLen = curve.Length;
//终点-起点就是线的方向。这里是射线法的关键代码。必须在三维视图下。
IList<ReferenceWithContext> references = doc.FindReferencesWithContextByDirection(ptStart, (ptEnd - ptStart), view3d);
//ElementSet wallSet = app.Application.Create.NewElementSet();
sel.Elements.Clear();
double tolerate =
0.00001;
foreach (ReferenceWithContext reference
in references)
{
Reference ref2 = reference.GetReference();
//取得引用
ElementId id = ref2.ElementId;
Element elem = doc.get_Element(id);
if (elem
is Wall)
{
if (reference.Proximity < (beamLen + tolerate))
//Proximity接近,即与射线原点的距离。
{
sel.Elements.Add(elem);
}
}
}
trans.Commit();
return Result.Succeeded;
}
}url:http://greatverve.cnb
logs.com/p/FindReferencesWithContextByDirection.html