我有一个窗帘面板玻璃(如下图所示),有一堆垂直和水平线作为参考平面,应该用于将专业设备固定到十字路口,以便正确放置。
现在,我们正在通过调用Document.Create.NewFamilyInstance
开发的插件来放置专业设备,它的位置来自用户使用UIDocument.Selection.PickObject
选择的墙面。但是,我需要在代码中获取这些参考线,这样我就可以将专业设备准确放置在用户选择的最近交叉点。
我知道这些参考平面只会出现在Elevation视图中,这是我在代码中查找这些对象时使用的方法,通过在Elevation视图中分配options.View = _document.Document.ActiveView;
并调用API,但是我能找到最接近工作解决方案的是下面的代码。问题是我只能得到线(我知道是由于它们的位置而构成参考平面的线),但我找不到一种方法来施放/将它们转换为实际的ReferencePlane实例,以便在调用NewFamilyInstance时使用。
这可能吗?如果没有,我如何确保专业设备捕捉到它找到的关闭参考?
void FindReferencePlances(ElementId elementId)
{
var fi = _docMan.Document.GetElement(elementId) as FamilyInstance;
var transforms = fi.GetTransform();
string data = string.Empty;
Options options = new Options();
options.IncludeNonVisibleObjects = true;
options.ComputeReferences = true;
options.View = _docMan.Document.ActiveView;
var r = fi.GetFamilyPointPlacementReferences();
foreach (GeometryObject go in
fi.get_Geometry(options))
{
data += " - " +go.GetType().ToString()
+ Environment.NewLine;
if (go is GeometryInstance)
{
GeometryInstance gi = go as GeometryInstance;
foreach (GeometryObject goSymbol in
gi.GetSymbolGeometry())
{
data += " -- " + goSymbol.GetType().ToString()
+ Environment.NewLine;
if (goSymbol is Line)
{
Line line = goSymbol as Line;
data += " --- " + line.GetType().ToString() + " (" + line.Origin.ToString() + ")";
}
}
}
}
TaskDialog.Show("data", data);
}
更新:不确定这是正确的方法,但我找到了一种方法来从参考平面线获取所有交叉点,以便我可以将我的对象放在最近点附近。下面的代码不会删除重复项。
public static List<XYZ> FindInstersectionsInReferencePlane(Document doc, ElementId elementId)
{
var fi = doc.GetElement(elementId) as FamilyInstance;
var transforms = fi.GetTransform();
string data = string.Empty;
Options options = new Options();
options.IncludeNonVisibleObjects = true;
options.ComputeReferences = true;
options.View = doc.Document.ActiveView;
var lines = fi.get_Geometry(options)
.Select(x => x as GeometryInstance)
.SelectMany(x => x.GetSymbolGeometry().ToList())
.OfType<Line>()
.ToList();
var results = new List<Tuple<Line, Line, IntersectionResultArray>>();
foreach (var l1 in lines)
{
foreach (var l2 in lines)
{
IntersectionResultArray r = null;
if (l1.Intersect(l2, out r) == SetComparisonResult.Overlap)
results.Add(Tuple.Create(l1, l2, r));
}
}
var points = new List<XYZ>();
foreach (var result in results)
{
foreach (IntersectionResult res in result.Item3)
{
points.Add(res.XYZPoint);
}
}
return points;
}
答案 0 :(得分:0)
根据这个,没有办法到达实际的ReferecePlane对象:
http://thebuildingcoder.typepad.com/blog/2015/05/how-to-retrieve-dimensioning-references.html
&#34;一旦您传入合适的视图并获得这些额外的引用,就没有什么可以识别它们。您必须分析几何图形以确定哪一个是您需要的几何图形。例如,对于2D视图,参考平面可以作为线(曲线实例)而不是平面返回。&#34;