【问题标题】:How can I run built-in Revit commands from C#如何从 C# 运行内置 Revit 命令
【发布时间】:2020-12-03 00:42:36
【问题描述】:

我想知道是否有一种方法可以将计算值从 C# 程序内部提供给内置 Revit 命令,然后可能(基于结果,例如这是否会使元素太短或太长对于特定光束的已知“最大跨度”)继续使用我的 C# 程序并更改光束大小)。我听说你可以在执行你的 c# 外部命令后调用 Revit 内置命令,但是你不能返回到 c# 程序

作为另一个例子,我想选择一个要修剪/延伸到的元素,并让代码确定哪些“托梁”梁要延伸到这个元素。我的程序会进行扩展过滤(例如“参考级别”、“工作集”、“评论”或“标记”参数(等)),然后运行内置函数,提供要扩展的元素,然后我的每一根光束。

我已经尝试过互联网搜索以及 Revit SDK 示例,但没有任何明显使用过的东西(但有很多 csproj 可供查看)。

谁能验证你不能在 C# 程序和 Revit 内置命令之间来回切换?

【问题讨论】:

  • 你做了“我的第一个插件”的例子吗? usa.autodesk.com/adsk/servlet/… 这将是在 C# 中使用 Revit 的典型方法。不太确定除此之外还有什么问题。
  • 我之前看过那个例子,但是因为它没有告诉我如何将参数输入到 Revit 函数中,所以它没有多大帮助。我创建了许多“外部命令”和相关的插件,所以这个问题与创建用户可访问的命令无关——我想从我的插件内部运行“修剪/扩展单个元素”(然后可能继续基于在产生的光束长度等)。他们的“我的第一个插件”运行代码,然后“doc.Create.....”我不确定你的回复是如何应用的。
  • 哦,我没明白你的意思,请看下面我的回答。
  • 请接受答案。看起来您在下面投了赞成票。谢谢!

标签: c# revit-api


【解决方案1】:

您可以使用 UIApplication.PostCommand() 方法以编程方式调用内置 Revit 命令。有关详细信息,请参阅 documentationbuilding coder。但是,它要等到 API 上下文结束后才会执行。

我不认为你将能够将参数输入到命令中,但是缺少某种 Win32 hack。也许您需要在 Revit API 中重新创建内置命令的功能。

不幸的是,我认为我们不能在这里做 (command "_line" pnt1 pnt2) 类型的事情。

【讨论】:

  • 谢谢....这就是我想要弄清楚的......ACAD 在这方面允许更多的功能(正如您在 LISP 示例中所建议的那样)。
  • 不是说我会失眠,但是为什么这个问题让我损失了 5 点声望?这是一个完全合理的问题......我是否因为被告知你不能做我想做的事而受到惩罚?
  • 哦,正如您所建议的,我创建了代码来计算定义每个光束的 .Curve 的线的新端点,将 3D 交点附近的端点移动到该点。我仍然无法访问可用作参考平面或网格坐标的点。对于线,这是 .Location.Curve.GetEndPoint(0,1)。对于另一个梁,这是 .GetAnalyticalModel --> .GetCurve.GetEndPoint(0,1)。但是这些对于参考平面和网格都失败了。
【解决方案2】:

也许从 SDK 示例“MoveLinear”开始。它展示了如何修改线性元素(包括梁)的端点。

示例代码的主要部分是

                Autodesk.Revit.DB.Line line;
                //get start point via "get_EndPoint(0)"
                Autodesk.Revit.DB.XYZ newStart = new XYZ(
                    lineLoc.Curve.GetEndPoint(0).X + 100,
                    lineLoc.Curve.GetEndPoint(0).Y,
                    lineLoc.Curve.GetEndPoint(0).Z);
                //get end point via "get_EndPoint(1)"
                Autodesk.Revit.DB.XYZ newEnd = new XYZ(
                    lineLoc.Curve.GetEndPoint(1).X,
                    lineLoc.Curve.GetEndPoint(1).Y + 100,
                    lineLoc.Curve.GetEndPoint(1).Z);
                //get a new line and use it to move current element 
                //with property "Autodesk.Revit.DB.LocationCurve.Curve"
                line = Line.CreateBound(newStart, newEnd);
                lineLoc.Curve = line;

它将第一个点的 X 和第二个点的 Y 移动 100 英尺。

【讨论】:

    【解决方案3】:

    你可以试试:

     RevitCommandId commandId = RevitCommandId.LookupPostableCommandId(PostableCommand.PlaceAComponent);
     commandData.Application.PostCommand(commandId);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      相关资源
      最近更新 更多