我知道如何在 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
目前让用户选择两个元素的类吗?
指导表示赞赏。
更新
我按照上面的逻辑让它工作。那篇文章真的很有帮助。我现在唯一的问题是我需要画一条橡皮筋。但这是一个单独的问题。