我如何从c#运行内置的Revit命令

本文关键字:内置 Revit 命令 运行 | 更新日期: 2023-09-27 18:10:30

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

作为另一个例子,我想选择一个元素来修剪/扩展,并让代码计算出哪些"Joist"梁要扩展到这个元素。我的程序将进行扩展过滤(如"参考水平",或"工作集",或"评论",或"标记"参数等),然后运行内置函数,提供元素扩展到我的每个光束。

我试过互联网搜索,以及Revit SDK样本,没有明显使用这个(但有很多csproj的查看)。

有没有人可以验证你不能在c#程序和Revit内置命令之间来回切换?

我如何从c#运行内置的Revit命令

你可以用UIApplication.PostCommand()方法通过编程方式调用一个内置的Revit命令。有关更多信息,请参阅文档和构建代码。但是,在API上下文结束之前,它不会执行。

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

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

也许可以从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英尺

你可以试试:

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