如何要求用户捕捉 Microstation VBA 的线元素的顶点(在 ILocateCommandEvents_Accept 处理程序中)

How to ask user to snap on a vertex of a line element (in the ILocateCommandEvents_Accept handler) of Microstation VBA

我知道如何在 Microstation 中编写一个 VBA 宏,它会要求用户 select 一个元素:

Sub Create2DCrossLines()
    ' Set error handler
    On Error GoTo ErrorHandler

    ' Let the user select the bank elements himself
    Call CommandState.StartLocate(New clsSelectBanksLCE)

    Exit Sub

ErrorHandler:
    Call ReportError("Create2dCrossLines")
End Sub

clsSelectBanksLCE 使用 ILocateCommandEvents 来管理这部分逻辑。因此,用户可以 select 一个 LineElement 例如,当 Accept 事件被触发时,它 运行 是一个动作:

Private Sub ILocateCommandEvents_Accept(ByVal Element As Element, _
                                        Point As Point3d, _
                                        ByVal View As View)

在我的特定情况下,我们跟踪 selecting 元素 1,然后跟踪元素 2,一旦两个元素都被 selected,它就会继续。这一切都很好。

我的问题是:在我接受第一个元素之后,在继续 select 下一个元素之前(即:在 Accept 处理程序中),我想让用户捕捉到线元素的两个顶点。

我需要知道他们想要处理线元素的哪一部分。我不知道该怎么做。在 AutoCAD 中,您可以使用 GetPoint.

所以我想请他们捕捉到该线元素上的第一个顶点,然后捕捉到结束顶点。在此之后我们可以继续 select 第二个元素。

更新

我刚刚偶然发现了这个 article。我注意到它说:

Once the user has accepted an element, we should start another class that implements IPrimitiveCommandEvents to obtain a target datapoint. Finally, compute the offset from the supplied locate datapoint to the target datapoint and move the element.

这似乎是我想要的,但我不清楚正确的顺序。目前我有:

ILocateCommandEvents_Start定位过程开始。

ILocateCommandEvents_LocateFilter。如果元素是 LineElement,那么它 分配 m_Element1 并且触发的第二个事件分配 m_Element2.

ILocateCommandEvents_Accept 如果两个变量都不是 nothing 它 运行 是主要过程。

看到我的困境了吗?听起来我需要:

这就是我的理解,我需要这样做。或者,我可以使用目前让用户选择两个元素的 ILocateCommandEvents class 吗?

感谢指导。

更新

我按照上面的逻辑让它工作了。 article 真的很有帮助。我现在唯一的问题是我需要画一条橡皮筋。但这是一个单独的问题。

如本文所述article

Once the user has accepted an element, we should start another class that implements IPrimitiveCommandEvents to obtain a target datapoint. Finally, compute the offset from the supplied locate datapoint to the target datapoint and move the element.

link 还提供了有关如何使用 IPrimitiveCommandEvents 事件的示例代码 class。