0

我试图弄清楚是否有办法以编程方式允许用户在 Revit 2014 中绘制一条线或调用模型线命令(使用 line 选项,而不是矩形、圆形等)。我需要用户调用我的命令,此命令显示一个具有“绘制路径”选项的表单,如果用户单击该选项,则表单应该隐藏/关闭并且用户应该能够直接绘制模型线项目内部。当用户结束画线时,表单应该重新显示,并且应该有对画线的引用。

我整天都在寻找解决方案但一无所获,我还搜索了如何使用标准 Revit 命令(例如模型线),但唯一的方法似乎是调用PostCommand将命令添加到队列中的方法,因此我的命令终止后,该命令将被午餐。我还搜索了如何绘制一条只有起点的线并将终点定位在鼠标下方,但似乎该MouseMove事件在 Revit 文档中不可用。

真的没有办法要求用户画线吗??

4

2 回答 2

1

我现在正在处理同样的问题。我使用 System.Drawing 在 Revit 窗口上绘图。

UIApplication m_pUIApp;
System.Drawing.Point m_pt1, m_pt2 = System.Drawing.Point.Empty
void DrawTask(System.Threading.CancellationToken ct)
{
    while (!ct.IsCancellationRequested)
    {
        m_pt2 = Cursor.Position;
        if (m_pt2.X < m_pUIApp.DrawingAreaExtents.Left + 2 ||
            m_pt2.X > m_pUIApp.DrawingAreaExtents.Right - 20 ||
            m_pt2.Y > m_pUIApp.DrawingAreaExtents.Bottom - 20 ||
            m_pt2.Y < m_pUIApp.DrawingAreaExtents.Top + 2)
        {
            System.Threading.Thread.Sleep(20);
            continue;
        }
        if (m_pt1 != System.Drawing.Point.Empty)
            using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
            {
                g.DrawLine(Pens.Black, m_pt1, m_pt2);
            }
        System.Threading.Thread.Sleep(20);
    }
}

然后我打电话

m_pt1 = Cursor.Position;
var cts = new System.Threading.CancellationTokenSource();
Task.Run(() => DrawTask(cts.Token))

当我开始点选择以及cts.Cancel();完成或捕获异常时。它有一些缺点:如果您平移、缩放或失去 Revit 焦点,它会变得很奇怪。

于 2016-04-25T15:46:17.333 回答
0

我没有尝试过 PostCommand 方法,但它似乎具有挑战性,因为正如你所说,你的命令必须结束。

我过去为实现这一目标所做的是利用 Revit 应用程序空闲回调。您可以将对话框打开为无模式,但带有空闲回调。当需要画线时,您可以在 idling 回调中打开一个事务,并提示用户按顺序选择点(并在您进行时绘制线段)。

它仍然不如常规行命令(没有橡皮筋等)好 - 但它有效。

您可以在The Building Coder博客上找到大量关于 Idling 回调(或外部事件回调,另一种可能性)的文章。

于 2014-07-16T13:01:01.107 回答