在Revit 2014中选择线条点时绘制线条

时间:2014-07-16 10:25:51

标签: c# .net revit-api

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

我一整天都在搜索解决方案,但什么都没找到,我还搜索了如何在标准的Revit命令(例如模型行)中吃午餐,但唯一的方法似乎就是调用PostCommand将命令添加到队列中,因此命令将在命令终止后被启动。我还搜索了如何绘制仅具有起点并将终点定位在鼠标下的行,但似乎MouseMove事件在Revit文档上不可用。

真的没有办法让用户画一条线吗?

2 个答案:

答案 0 :(得分: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焦点,它会变得很奇怪。

答案 1 :(得分:0)

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

我过去为完成此操作所做的是使用Revit Application Idling回调。您可以将对话框打开为无模式,但使用空闲回调。在绘制线的时候,你可以在空闲回调中打开一个事务,并提示用户按顺序选择点(并在你去的时候绘制段)。

它仍然没有常规线命令那么好(没有橡皮筋等) - 但是它有效。

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