我知道如何在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 SubclsSelectBanksLCE使用ILocateCommandEvents来管理逻辑的这一部分。例如,用户可以选择一个LineElement,当触发Accept事件时,它运行一个操作:
Private Sub ILocateCommandEvents_Accept(ByVal Element As Element, _
Point As Point3d, _
ByVal View As View)在我的特殊情况下,我们跟踪选择元素1,然后跟踪元素2,一旦这两个元素都被选中,它就会继续进行。这一切都很好。
我的问题是:在我接受了第一个元素之后,在继续选择next (即:在Accept处理程序中)之前,我希望让用户能够捕捉到line元素的两个顶点。
我需要知道他们想要处理的行元素的哪一部分。我想不出怎么做。在AutoCAD中,您可以使用GetPoint。
所以我想让他们抓住这个线元素的第一个顶点,然后在末端点上。之后,我们可以继续选择第二个元素。
更新
我刚刚被这个文章绊倒了。我注意到上面写着:
一旦用户接受了一个元素,我们应该启动另一个实现IPrimitiveCommandEvents的类,以获得一个目标数据池。最后,计算从提供的到目标datapoint的偏移量,并移动元素。
这似乎是我想要的,但我只是不清楚什么是正确的订单。现在我有:
ILocateCommandEvents_Start --这开始了定位过程。
ILocateCommandEvents_LocateFilter。如果元素是LineElement,那么它将分配m_Element1,而第二个事件触发则分配m_Element2。
ILocateCommandEvents_Accept如果这两个变量都不是nothing,则运行主进程。
看到我的困境了吗?听起来我需要:
ILocateCommandEvents实例,只选择一个元素。IPrimitiveCommandEvents的一个实例以获得第一个快照点。IPrimitiveCommandEvents实例以获得第二个快照点。ILocateCommandEvents的另一个实例以获得第二个元素。所以我才明白我需要这么做。或者,我是否可以使用当前让用户选择两个元素的一个ILocateCommandEvents类?
感谢你的指导。
更新
我按照上面的逻辑让它工作起来。文章真是帮了大忙。我现在唯一的问题是我需要画一个橡皮筋。但这是另一个问题。
发布于 2017-11-03 11:06:57
正如本文章中所提到的
一旦用户接受了一个元素,我们应该启动另一个实现IPrimitiveCommandEvents的类来获得一个目标数据池。最后,计算从提供的locate datapoint 到目标数据池的偏移量,并移动元素。
该链接还提供了关于如何使用IPrimitiveCommandEvents事件类的示例代码。
https://stackoverflow.com/questions/47085241
复制相似问题