导航

三维场景树Group折叠 Layer控制可见

Posted on 2013-09-12 09:18  亦舒雪  阅读(461)  评论(0)    收藏  举报

三维场景的数据组织结构基本都是树状,一个工程,按照图层分组,然后在组别内添加对应的图层。如果场景层次较少,则在工程初始时,默认的树列表空间可以展示场景结构,但是如果场景层次复杂,则需要拖动滚动条或者折叠Group实现。再次需求的基础上,修改项目的场景树,为Group添加Expand属性,为图层Layer添加Vislble属性,在新打开工程时,能够按需打开上次保存的场景层次。

任务分两部分:

1.Group添加Expand 2.Layer添加Vislble

1.Group添加Expand

第一个问题是在哪里添加属性,因为项目的配置主要是xml的config文件实现,肯定需要修改项目的config配置。本项目的xml的结构组织跟实际的osg场景数据组织一致。主要分为两类组属性和层属性。显然Expand需要对组属性添加。实现的思路是GroupConfig类添加expand属性,默认为展开。添加的过程就是在xml文件遍历时根据Group的expand写入xml文件中,保存。在系统界面中对Tree列表操作时,根据item的check状态改变的槽函数updata工程xml文件的config。

根据上述思路,实现函数也就清晰了,在Tree控件中添加expand和collapse槽函数,改变Group的visible属性。然后在xml的管理类GroupConfig中写出改变的状态。

函数一:记录expand状态

 1 void doItemExpand( QTreeWidgetItem* item )
 2 {
 3 //根据item判断是否为Group节点    
 4 LayerGroupTreeItem *layerGroupTreeItem = dynamic_cast<LayerGroupTreeItem*>(item);
 5     if (layerGroupTreeItem)
 6     {
 7                                     //获取该item的GroupConfig,设置其expand属性
 8         layerGroupTreeItem->getLayerGroup()->setExpandState(true);
 9     }
10 }

 

  

函数二:记录collapse状态

1 void doItemCollapse( QTreeWidgetItem* item )
2 {
3     LayerGroupTreeItem *layerGroupTreeItem = dynamic_cast<LayerGroupTreeItem*>(item);
4     if (layerGroupTreeItem)
5     {
6         layerGroupTreeItem->getLayerGroup()->setExpandState(false);
7     }
8 
9 }

 

函数三:写入xml文件

 1         if (LayerConf.key()== "group")
 2         {
 3             LayerGroupConfig* layerGroupconfig = new LayerGroupConfig(LayerConf);
 4             //test 获取每个group节点的展开状态
 5             std::string expandstate;
 6             LayerConf.getIfSet("expandstate",expandstate);
 7             if (expandstate == "true")
 8             {
 9                 layerGroupconfig->setExpandState(true);
10             }else
11             {
12                 layerGroupconfig->setExpandState(false);
13             }
14             _layerGroupConfig.push_back(layerGroupconfig);
15         

这样就实现了写入,写出,更新状态。在使用中只要遍历树判断Group的属性,即可实现状态可控。