详解:https://blog.csdn.net/alzzw/article/details/113615198
提示:可在浏览器下按下Ctrl+F进行搜索你想搜索的函数
m_agenda:ElementAgenda的私有成员变量m_agenda,无论是围栅、选择集还是点选的元素,使用DgnElementSetTool提供的拾取元素的接口最终获取到的元素都会放到这个变量里,由于是私有成员变量,所以DgnElementSetTool的派生类里边只能通过GetElementAgenda函数访问这个成员变量
_AllowFence围栅:返回的是USES_FENCE_Required,表明必须通过围栅获取元素,USES_FENCE_Check,表明可以但不是必须要通过围栅选择元素
_AllowSelection选择集:返回值判断是否支持选择集获取元素,流程跟围栅的判断流程类似
UsesDragSelect:返回值判断是否支持框选或者线选
InstallTool调用_InstallToolImplementation,_InstallToolImplementation进而调用了_OnInstall再调用_OnPostInstall函数
_GetPreferredElemSource:获取m_elemSource的值,
- 如果_AllowFence返回USES_FENCE_Required,_GetPreferredElemSource返回SOURCE_Fence
- 如果_AllowFence不返回USES_FENCE_Check,判断是否有激活的围栅,如果有则返回SOURCE_Fence
- 对_AllowSelection的判断与_AllowFence相同,如果有选择集,_GetPreferredElemSource返回SOURCE_Selectionset
- 如果围栅和选择集都不支持的话就返回SOURCE_Pick
_SetElemSource:设置m_elemSource的值
_BeginPickElements:设置点选元素时搜寻哪些Model,以及设置光标为点选元素状态
_NeedPointForSelection:判断是否需要用户输入额外的确认点才开始处理选择集元素
_NeedPointForDynamics:判断是否需要用户输入额外的确认点来启动动态绘制
_BeginDynamics:启动动态绘制
_BuildAgenda:获取选择集中的元素,根据_GetElemSource返回的结果判断是通过围栅还是选择集来填充m_agenda
_ModifyAgendaEntries:对m_agenda中的元素进行修改筛选
_FilterAgendaEntries:筛选,返回true的话,会将m_agenda中无效的元素剔除掉
_HiliteAgendaEntries:高亮最终的ElementAgenda,如果是通过围栅获取的元素,_HiliteAgendaEntries 会调用_HiliteFenceElems判断是否高亮围栅选中的元素。
鼠标或者键盘在视图中的事件等
_OnInstall和_OnPostInstall执行之后,工具处为激活状态,等待用户的输入。这个时候我们的鼠标或者键盘在视图中发生的一些事件
_OnPostLocate:当光标在视图中移动并且定位到某个元素时,这个函数就会被调用,
- 通过path参数我们可以获取到当前光标定位到的元素,我们可以在重写的_OnPostLocate函数中获取元素的属性,然后判断我们的工具是否支持处理定位到的元素。如果不支持,就返回false,这样用户就没办法选中这个元素。我们还可以设置cantAcceptReason参数的值,从而提醒用户是什么原因不能选中这个元素
virtual bool _OnPostLocate (HitPathCP path, WStringR cantAcceptReason);
_OnDataButton:单击左键被调用
_WantAdditionalLocate:判断当前是否需要拾取元素,是否支持多选
- 如果_WantAdditionalLocate返回false,则会清空m_agenda。如果返回true的话,会判断第二个参数newSearch的值。newSearch这个参数是用来控制定位元素时是否继续从上次定位到元素的位置往后查找,我们知道虽然在Mstn中我们看到的元素在空间下是杂乱无章的,但是Dgn文件在存储到磁盘上时,是按顺序一个挨着一个存储的
_SetupAndPromptForNextAction:调用输出提示、启用自动定位、AccuSnap等,在状态发生任何变化后(如识别元素后)自动调用。默认情况下,为源PICK启用自动定位,AccuSnap基于从WantAccuSnap的返回值来是否启用通用默认提示,例如“Accept/Reject”和“Identify Element”
_LocateOneElement:点选元素
_DoLocate:定位元素,_DoLocate在搜寻到元素时,会记录查找到元素的位置,_DoLocate有一个参数可以让我们从这个位置继续往后定位搜寻元素
_RemoveAgendaElement:从m_agenda中移除最近一次定位到的元素
_BuildLocateAgenda:把定位到的元素插入到m_agenda中,如果存在会调用__RemoveAgendaElement将其移除然后马上返回,这样就实现了反选的功能
_IsModifyOriginal :判断是插入元素本身还是元素的拷贝
_DoGroups:判断是否与要插入元素同一组的元素也要插入到m_agenda中
如果是点选元素的话,会调用_LocateOneElement来定位拾取元素,如果启用框选或者划选的话,那么当光标停止拖拽在_OnModelEndDrag函数中,_BuildDragSelectAgenda会被调用。_BuildDragSelectAgenda会把框选或者划选的元素加入到m_agenda中,如果当前处于多选状态下的话,框选或者划选的元素已经在m_agenda中,这些元素会被反选掉。如果不是在多选状态下的话,m_agenda首先会被清空,然后再将框选或者划选的元素插入到m_agenda中,调用_BuildDragSelectAgenda之后会调用_ModifyAgendaEntries,前面我们提到过_ModifyAgendaEntries函数,给了我们一个过滤元素的机会
_NeedAcceptPoint:判断是否需要用户再点击左键才开始处理元素,如果返回true的话,_OnDataButton会直接返回。如果返回false的话,会直接调用_ProcessAgenda开始执行元素修改的流程。_ProcessAgenda调用以后,最后调用_OnModifyComplete
_IsFenceClip:判断是否用围栅对元素进行剪切,如果需要的话,会调用_DoFenceClip来完成
_DoOperationForModify:其中会用修改后的元素替换掉原来的元素,前提是_IsModifyOriginal返回true。否则的话会直接把修改后的元素重新添加到Dgn文件中。
_ExitTool:退出当前工具