捕捉家庭符号以引用平面

时间:2015-10-09 14:15:30

标签: revit revit-api revit-2015

我有一个窗帘面板玻璃(如下图所示),有一堆垂直和水平线作为参考平面,应该用于将专业设备固定到十字路口,以便正确放置。

现在,我们正在通过调用Document.Create.NewFamilyInstance开发的插件来放置专业设备,它的位置来自用户使用UIDocument.Selection.PickObject选择的墙面。但是,我需要在代码中获取这些参考线,这样我就可以将专业设备准确放置在用户选择的最近交叉点。

enter image description here

我知道这些参考平面只会出现在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;
}

1 个答案:

答案 0 :(得分:0)

根据这个,没有办法到达实际的ReferecePlane对象:

http://thebuildingcoder.typepad.com/blog/2015/05/how-to-retrieve-dimensioning-references.html

&#34;一旦您传入合适的视图并获得这些额外的引用,就没有什么可以识别它们。您必须分析几何图形以确定哪一个是您需要的几何图形。例如,对于2D视图,参考平面可以作为线(曲线实例)而不是平面返回。&#34;