热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WPF3D中如何选择模型的一部分并维护模型

最近的一个项目有个需求,就是点击WPF3D模型的某个部分并对其后续操作,例如获得这个部分的数据并展示曲线图等等(这部分暂不展开)先上截图。我选择了一个方块,将方块显示为蓝色,同时屏

最近的一个项目有个需求,就是点击WPF 3D模型的某个部分并对其后续操作,例如获得这个部分的数据并展示曲线图等等(这部分暂不展开)

先上截图。

我选择了一个方块,将方块显示为蓝色,同时屏幕坐上显示了点击方块后的操作。

整个流程我处理了两个问题:

1. 如何选择模型的这一部分

2. 如何维护你选择的这个部分 

WPF 3D中如何选择模型的一部分并维护模型 


问题1:如何选择模型的这一部分

由于WPF 3D模型中只有Viewport3D对象有MouseButtonLeftDown事件,而模型的某个部分是没有这个事件的。因此需要使用首先VisualTreeHelper.HitTest来确定具体点击的是哪个模型,同时这个模型是需要给外部用的,因此我们自定义了一个ModelVisual3DSelectedEventHandler的事件给外部调用。

 

 1 //自定义个一个模型选中的EventHandler 
 2 public class Visual3DEventArgs : EventArgs
 3 {
 4  public ModelVisual3D Visual3D { getset; }
 5 
 6      public Visual3DEventArgs(ModelVisual3D modelVisual3D)
 7      {
 8         this.Visual3D = modelVisual3D;
 9      }
10 }
11 
12 public delegate void ModelVisual3DSelectedEventHandler(object sender, Visual3DEventArgs args);
13 //....
14 
15 //声明Viewport3D的LeftButton事件
16 ViewPort.MouseLeftButtonDown += ViewPort_MouseLeftButtonDown;
17 
18 //Viewport LeftButton的函数
19 void ViewPort_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs args)
20 {
21     Point mousePos = args.GetPosition(ViewPort);
22     var hitParams = new PointHitTestParameters(mousePos);
23     VisualTreeHelper.HitTest(ViewPort, null, ResultCallback, hitParams);
24 }
25 
26 //根据HitTest选中之后的处理
27  private HitTestResultBehavior ResultCallback(HitTestResult result)
28  {
29             RayHitTestResult rayResult = result as RayHitTestResult;
30             
31             if (rayResult != null)
32             {
33                 var visual3D = result.VisualHit as ModelVisual3D;
34                 if (visual3D != null)
35                 {
36                     if (OnModelSelected != null)
37                     {
38                         OnModelSelected(thisnew Visual3DEventArgs(visual3D));
39                     }
40 
41                     return HitTestResultBehavior.Stop;
42                 }
43                 
44             }
45             return HitTestResultBehavior.Continue;
46 }

 

2. 问题2:如何维护你选择部分

我刚刚在Visual3DEventArgs中已经获得了选择的模型了,这时候我就可以对它进行操作了。或许数据库中有个模型叫"block1",查找数据等等.... 但是很悲催的是, 虽然在xaml文件中ModelVisual3D是有x:name的,但是ModelVisual3D本书是没有 ModelVisual3D.Name这个属性的,即使获取了这个模型,也只能对其进行基本的渲染,根本没有办法进行逻辑操作(例如根据数据库通信等)。

 

只有通过viewport3D.FindName(string name)才能获取对象!

 

解决办法是:我们自己可以维护一个模型名字表(其实就是个xml文件): 

 <Sections>

<Section>
    <Name>dg01Name>
Section>
<Section>
    <Name>dg02Name>
Section>
<Section>
    <Name>dg04Name>
Section>
Sections>

 

然后定义一个返回名字的函数:

 

 1 public Section GetSelSection(ModelVisual3D visual3D)
 2         {
 3             if (_context != null && _context.Sections != null && visual3D != null)
 4             {
 5                 var viewPort = _context.Model.ViewPort;
 6 
 7                 foreach (var section in _context.Sections)
 8                 {
 9                     if (viewPort.FindName(section.Name) == visual3D)
10                     {
11                         return section;
12                     }
13                 }
14             }
15 
17             return null;
18         }

 

 

我就可以通过GetSelSection(args.Visual3D)获得这个section对象了。对了,这个Section就是刚才XML文件的映射类。和数据库操作就可以使用这个Section了。 

 

 


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了关于汉庭酒店价格的知识点,提供了一篇由congdi7904投稿的技术文章,希望能帮到读者解决相关技术问题。同时还提供了汉庭酒店的官方链接和转载信息。请注意,引用汉庭酒店需遵循CC 4.0 BY-SA版权协议。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
当初
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有