0

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

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管理这部分逻辑。所以用户可以选择一个LineElement例子,当Accept事件被触发时,它会运行一个动作:

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

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

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

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

所以我想让他们捕捉到这个线元素的第一个顶点,然后捕捉到结束顶点。在此之后,我们可以继续选择第二个元素。

更新

我刚刚偶然发现了这篇文章。我注意到它说:

一旦用户接受了一个元素,我们应该启动另一个实现IPrimitiveCommandEvents的类来获取目标数据点。最后,计算从提供的定位数据点到目标数据点的偏移量并移动元素。

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

ILocateCommandEvents_Start这开始了定位过程。

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

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

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

  • 运行一个实例ILocateCommandEvents以仅选择一个元素。
  • 然后运行一个实例IPrimitiveCommandEvents以获取第一个捕捉点。
  • 然后运行另一个实例IPrimitiveCommandEvents以获得第二个捕捉点。
  • 然后运行另一个实例ILocateCommandEvents来获取第二个元素。
  • 最后,一旦第二个元素被接受,执行我的处理。

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

指导表示赞赏。

更新

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

4

1 回答 1

0

本文所述

一旦用户接受了一个元素,我们应该启动另一个实现IPrimitiveCommandEvents的类来获取目标数据点。最后,计算从提供的定位数据点到目标数据点的偏移量并移动元素。

该链接还提供了有关如何使用IPrimitiveCommandEvents事件类的示例代码。

于 2017-11-03T11:06:57.283 回答