C# 在拾取线时绘制线';Revit 2014中的s点

C# 在拾取线时绘制线';Revit 2014中的s点,c#,.net,revit-api,C#,.net,Revit Api,我试图找出是否有一种方法可以通过编程方式允许用户在Revit 2014中绘制线或调用模型线命令(使用“线”选项,而不是矩形、圆形等)。我需要用户调用我的命令,该命令显示一个表单,该表单有一个选项是“绘制路径”,如果用户单击该选项,表单应该隐藏/关闭,并且用户应该能够直接在项目内部绘制模型线。当用户结束绘制线条时,表单应重新显示,并且应具有对绘制线条的引用 我整天都在搜索解决方案,但什么也没找到,我也在搜索如何使用标准Revit命令(如模型线),但唯一的方法似乎是调用PostCommand,它将命

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

我整天都在搜索解决方案,但什么也没找到,我也在搜索如何使用标准Revit命令(如模型线),但唯一的方法似乎是调用
PostCommand
,它将命令添加到队列中,因此命令终止后将使用该命令。我还搜索了如何在鼠标下绘制一条只有起点和终点的线,但似乎Revit文档中没有
MouseMove
事件


真的没有办法要求用户划一条线吗?

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

我在过去所做的就是利用Revit应用程序空闲回调来完成这项工作。您可以以无模式方式打开对话框,但要使用空闲回调。当该画线时,您可以在空闲回调中打开一个事务,并提示用户按顺序拾取点(并在执行时绘制线段)

它仍然不如常规的行命令(没有橡皮筋等)好,但它可以工作


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

我现在正在处理同样的问题。我使用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);
    }
}

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

我应该在空闲事件中使用后命令吗?
m_pt1 = Cursor.Position;
var cts = new System.Threading.CancellationTokenSource();
Task.Run(() => DrawTask(cts.Token))