天天看点

图元动态感知

当鼠标在AnyCAD三维控件中掠过图元上方的时候,图元会“高亮”显示,当鼠标移走的时候会回复之前的状态。在一般的窗体控件中会提供MouseEnter/MouseLeave事件。

在AnyCAD提供了图元选择消息,当图元选择的时候会被触发。现在,新版SDK利用同样的机制就可以捕获到“高亮”状态,并很容易的实现MouseEnter/Leave机制。

比如在MFC对话框中实现这样的功能,当鼠标掠过(在点击之前)曲线的时候显示出该线的长度信息:

当鼠标在AnyCAD三维控件中掠过图元上方的时候,图元会“高亮”显示,当鼠标移走的时候会回复之前的状态。在一般的窗体控件中会提供MouseEnter/MouseLeave事件。

在AnyCAD提供了图元选择消息,当图元选择的时候会被触发。现在,新版SDK利用同样的机制就可以捕获到“高亮”状态,并很容易的实现MouseEnter/Leave机制。

比如在MFC对话框中实现这样的功能,当鼠标掠过(在点击之前)曲线的时候显示出该线的长度信息:

图元动态感知
1 #include <APISelectionChangeArgs.h>
 2 #include <APISelectedIdSetQuery.h>
 3 void CDialog3DDlg::OnSelectionChanged(const AnyCAD::API::SelectionChangeArgs& args)
 4 {
 5     auto sceneManager = m_Window3D.GetView().GetSceneManager();
 6 
 7     //Highlight event mode
 8     if (args.IsHighlightMode())
 9     {
10         // get the object id
11         SelectedIdSetQuery query;
12         auto renderer = m_Window3D.GetView().GetRenderer();
13         renderer.QueryHighlight(query);
14         if (query.GetIds().empty())
15         {
16             m_Info = _T("");
17         }
18         else
19         {
20             for (auto id : query.GetIds())
21             {
22 
23                 m_Info.Format(_T("ID: %d, Length: %g米"), id.AsInt(), m_mapEdgeLength[id.AsInt()]);
24                 break;
25             }
26         }
27 
28 
29         UpdateData(FALSE);
30     }
31     //Selection event mode
32     else
33     {        
34         for (auto id : args.GetIds())
35         {
36             auto sceneNode = sceneManager.FindNode(id);
37             if (sceneNode.IsValid())
38             {
39                 CString text;
40                 text.Format(_T("ID: %d, Length: %g m"), id.AsInt(), m_mapEdgeLength[id.AsInt()]);
41                 MessageBox(text);
42             }
43             break;
44         }
45     }
46 
47      

完整代码请查看C++SDK自带的例子