@@ -71,11 +71,11 @@ class CreateModelToSaveVisitor : public osg::NodeVisitor
7171 bool _addToModel;
7272};
7373
74- class DeleteSelectedNodesVisitor : public osg ::NodeVisitor
74+ class SelectedNodesVisitor : public osg ::NodeVisitor
7575{
7676public:
7777
78- DeleteSelectedNodesVisitor ():
78+ SelectedNodesVisitor ():
7979 osg::NodeVisitor (osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
8080 {
8181 }
@@ -110,6 +110,23 @@ class DeleteSelectedNodesVisitor : public osg::NodeVisitor
110110 }
111111 }
112112
113+ osg::ref_ptr<osg::Node> createSelectedNodeSubgraph ()
114+ {
115+ if (_selectedNodes.empty ()) return osg::ref_ptr<osg::Node>();
116+
117+ if (_selectedNodes.size ()==1 ) return _selectedNodes[0 ];
118+
119+ // note code doesn't yet handle selected nodes being nested within transforms.
120+ osg::ref_ptr<osg::Group> group;
121+ for (SelectedNodes::iterator itr = _selectedNodes.begin ();
122+ itr != _selectedNodes.end ();
123+ ++itr)
124+ {
125+ group->addChild (*itr);
126+ }
127+ return group;
128+ }
129+
113130 typedef std::vector< osg::ref_ptr<osgFX::Scribe> > SelectedNodes;
114131 SelectedNodes _selectedNodes;
115132
@@ -150,6 +167,18 @@ class PickHandler : public osgGA::GUIEventHandler
150167 osg::notify (osg::NOTICE)<<" Saved model to file 'saved_model.osgt'" <<std::endl;
151168 osgDB::writeNodeFile (*(viewer->getSceneData ()), " saved_model.osgt" );
152169 }
170+ else if (ea.getKey ()==' s' )
171+ {
172+ SelectedNodesVisitor snv;
173+ viewer->getSceneData ()->accept (snv);
174+ osg::ref_ptr<osg::Node> selected = snv.createSelectedNodeSubgraph ();
175+
176+ if (selected)
177+ {
178+ osg::notify (osg::NOTICE)<<" Saved selected to file 'saved_selected.osgt'" <<std::endl;
179+ osgDB::writeNodeFile (*(viewer->getSceneData ()), " saved_selected.osgt" );
180+ }
181+ }
153182 else if (ea.getKey ()==' p' )
154183 {
155184 _usePolytopeIntersector = !_usePolytopeIntersector;
@@ -177,7 +206,7 @@ class PickHandler : public osgGA::GUIEventHandler
177206 else if (ea.getKey ()==osgGA::GUIEventAdapter::KEY_Delete || ea.getKey ()==osgGA::GUIEventAdapter::KEY_BackSpace)
178207 {
179208 osg::notify (osg::NOTICE)<<" Delete" <<std::endl;
180- DeleteSelectedNodesVisitor dsnv;
209+ SelectedNodesVisitor dsnv;
181210 viewer->getSceneData ()->accept (dsnv);
182211 dsnv.pruneSelectedNodes ();
183212 }
0 commit comments