用户登录
找回密码
立即注册
搜索
热搜: 视频教程
查看: 11477|回复: 8

如何引用链接文档中的Reference在主文档中创建尺寸标注?

[复制链接]

1

主题

5

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2017-3-2 12:09:45 | 显示全部楼层 |阅读模式

思路:我想通过调用Revit的API。在主文档中的平面视图下选择一面链接文件中的墙,捕获到墙边界的面的Refernce。然后完成尺寸的标注。

标注

标注


问题:通过API获取到链接文档,然后获取到墙在链接文档中的Refernce后,无法引用这些Refernce在当前文档中实现标注。提示错误如下:

错误

错误




代码如下:
  1.         [Transaction(TransactionMode.Manual)]
  2.         [Regeneration(RegenerationOption.Manual)]
  3.         public class 链接文件墙洞口标注 : IExternalCommand
  4.         {
  5.             public class WallSelectionFilter : ISelectionFilter
  6.             {
  7.                 public RevitLinkInstance instance = null;
  8.                 public bool AllowElement(Element elem)
  9.                 {
  10.                     instance = elem as RevitLinkInstance;
  11.                     if (instance != null)
  12.                     {
  13.                         return true;
  14.                     }


  15.                     return false;
  16.                 }
  17.                 public bool AllowReference(Reference reference, XYZ position)
  18.                 {
  19.                     if (instance == null)
  20.                     {
  21.                         return false;
  22.                     }
  23.                     else
  24.                     {
  25.                         Document linkdocument = instance.GetLinkDocument();
  26.                         Element ent = linkdocument.GetElement(reference.LinkedElementId);
  27.                         return ent is Wall;

  28.                         return false;
  29.                     }
  30.                 }
  31.             }

  32.             private void AddCurvesAndSolids(GeometryElement geomElem, CurveArray curves, List<Solid> solids)
  33.             {
  34.                 foreach (GeometryObject geomObject in geomElem)
  35.                 {

  36.                     Solid solid = geomObject as Solid;
  37.                     if (null != solid)
  38.                     {
  39.                         solids.Add(solid);
  40.                         continue;
  41.                     }
  42.                     //如果GeometryObject 是几何实例,则进行二次遍历  
  43.                     GeometryInstance geomInst = geomObject as GeometryInstance;
  44.                     if (null != geomInst)
  45.                     {
  46.                         AddCurvesAndSolids(geomInst.GetSymbolGeometry(geomInst.Transform), curves, solids);
  47.                     }
  48.                 }
  49.             }

  50.             public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  51.             {

  52.                 #region 建立revit连接
  53.                 UIDocument uiDoc = commandData.Application.ActiveUIDocument;
  54.                 Document doc = uiDoc.Document;
  55.                 Autodesk.Revit.ApplicationServices.Application app = doc.Application;
  56.                 #endregion

  57.                 Selection sel = uiDoc.Selection;
  58.                 sel.PickElementsByRectangle();
  59.                 Reference ref1 = uiDoc.Selection.PickObject(ObjectType.LinkedElement, new WallSelectionFilter(), "Please pick a point on Wall face.");
  60.                 RevitLinkInstance linkInstance = doc.GetElement(ref1) as RevitLinkInstance;
  61.                 Document lincdoc = linkInstance.GetLinkDocument();
  62.                 Element ent = lincdoc.GetElement(ref1.LinkedElementId);
  63.                 Wall wallent = null;
  64.                 wallent = ent as Wall;
  65.                 Transaction trans = new Transaction(doc);
  66.                 trans.Start("sta");
  67.                 LocationCurve lc = wallent.Location as LocationCurve;
  68.                 Curve curve = lc.Curve;
  69.                 Line line1 = curve as Line;
  70.                 XYZ PTXL = line1.GetEndPoint(0) - line1.GetEndPoint(1);//获取墙的方向向量
  71.                 #region 获取lines
  72.                 ReferenceArray referenceArray = new ReferenceArray();
  73.                 Options opt = doc.Application.Create.NewGeometryOptions();
  74.                 opt.ComputeReferences = true;
  75.                 opt.View = doc.ActiveView;
  76.                 GeometryElement geo = wallent.get_Geometry(opt);
  77.                 CurveArray curvearrau = new CurveArray();
  78.                 List<Solid> Solids = new List<Solid>();
  79.                 AddCurvesAndSolids(geo, curvearrau, Solids);
  80.                 jisuanlei JISUAN = new jisuanlei();
  81.                 for (int i = 0; i < Solids.Count; i++)
  82.                 {
  83.                     Solid solid = Solids[i];
  84.                     FaceArray faces = solid.Faces;
  85.                     foreach (Face fa in faces)
  86.                     {
  87.                         PlanarFace pf = fa as PlanarFace;
  88.                         if (Math.Abs(pf.Normal.AngleTo(PTXL)) < 0.1)
  89.                         {
  90.                             referenceArray.Append(fa.Reference);
  91.                         }
  92.                         if (Math.Abs(pf.Normal.AngleTo(PTXL) - Math.PI) < 0.1)
  93.                         {
  94.                             referenceArray.Append(fa.Reference);
  95.                         }
  96.                     }
  97.                 }


  98.                 XYZ pt1 = (line1.GetEndPoint(0).X < line1.GetEndPoint(1).X ? line1.GetEndPoint(0) : line1.GetEndPoint(1));
  99.                 XYZ pt2 = (line1.GetEndPoint(0).X > line1.GetEndPoint(1).X ? line1.GetEndPoint(0) : line1.GetEndPoint(1));
  100.                 Line newLine2JD = Line.CreateBound(pt1, pt2);
  101.                 Dimension newDimensionJD = doc.Create.NewDimension(doc.ActiveView, newLine2JD, referenceArray);
  102.                 #endregion
  103.                 trans.Commit();
  104.                 return Result.Succeeded;

  105.             }

  106.         }
复制代码
求大神告诉我,我该怎样去引用墙的Refernce。才能完成这个标注呢?

回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-3-9 08:45:42 | 显示全部楼层
你好,请问这个问题现在解决了吗?
回复

使用道具 举报

1

主题

5

帖子

28

积分

新手上路

Rank: 1

积分
28
 楼主| 发表于 2017-3-29 17:10:55 | 显示全部楼层
本帖最后由 开发小白 于 2017-4-5 14:56 编辑

哪位大神能解答,麻烦帮忙解决下呢,亟待解决!!!
回复

使用道具 举报

1

主题

5

帖子

28

积分

新手上路

Rank: 1

积分
28
 楼主| 发表于 2017-3-29 20:02:44 | 显示全部楼层
书痴 发表于 2017-3-9 08:45
你好,请问这个问题现在解决了吗?

您好,这个问题我还没解决到,亟待解决。请问您能帮忙解答一下吗?
回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-3-30 10:16:23 | 显示全部楼层
开发小白 发表于 2017-3-29 20:02
您好,这个问题我还没解决到,亟待解决。请问您能帮忙解答一下吗?

嗯,这两天比较忙,找时间帮您看一下
回复

使用道具 举报

1

主题

5

帖子

28

积分

新手上路

Rank: 1

积分
28
 楼主| 发表于 2017-4-5 14:55:51 | 显示全部楼层
书痴 发表于 2017-3-30 10:16
嗯,这两天比较忙,找时间帮您看一下

您好,请问最近有空帮我解决一下这个问题吗?
回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-4-6 08:54:27 | 显示全部楼层
开发小白 发表于 2017-4-5 14:55
您好,请问最近有空帮我解决一下这个问题吗?

这个周末我看一下,这个可能有点复杂
回复

使用道具 举报

1

主题

5

帖子

28

积分

新手上路

Rank: 1

积分
28
 楼主| 发表于 2017-4-6 10:58:37 | 显示全部楼层
书痴 发表于 2017-4-6 08:54
这个周末我看一下,这个可能有点复杂

好的,谢谢您
回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-4-12 09:03:56 | 显示全部楼层

看了下,好像没有办法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

京ICP备17008402号-1  |  Archiver  |  手机版  |  小黑屋  |  橄榄山BIM论坛    

点击立刻咨询
快速回复 返回顶部 返回列表