如何要求用户捕捉 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
到 select 一个元素的实例。
- 然后运行一个实例
IPrimitiveCommandEvents
得到第一个捕捉点。
- 然后运行另一个
IPrimitiveCommandEvents
的实例来获取第二个捕捉点。
- 然后 运行
ILocateCommandEvents
的另一个实例来获取第二个元素。
- 最后,接受第二个元素后,执行我的处理。
这就是我的理解,我需要这样做。或者,我可以使用目前让用户选择两个元素的 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。
我知道如何在 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
到 select 一个元素的实例。 - 然后运行一个实例
IPrimitiveCommandEvents
得到第一个捕捉点。 - 然后运行另一个
IPrimitiveCommandEvents
的实例来获取第二个捕捉点。 - 然后 运行
ILocateCommandEvents
的另一个实例来获取第二个元素。 - 最后,接受第二个元素后,执行我的处理。
这就是我的理解,我需要这样做。或者,我可以使用目前让用户选择两个元素的 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。