图元动态感知

当鼠标在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自带的例子

 

posted @   AnyCAD  阅读(1061)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示