OpenWalnut  1.3.1
WFiberSelector.cpp
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #include <algorithm>
26 #include <iostream>
27 #include <list>
28 #include <vector>
29 
30 #include "../kernel/WKernel.h"
31 #include "WFiberSelector.h"
32 #include "WROIManager.h"
33 
34 WFiberSelector::WFiberSelector( boost::shared_ptr< const WDataSetFibers > fibers ) :
35  m_fibers( fibers ),
36  m_size( fibers->size() ),
37  m_dirty( true )
38 {
39  boost::shared_ptr< std::vector< float > > verts = m_fibers->getVertices();
40  m_kdTree = boost::shared_ptr< WKdTree >( new WKdTree( verts->size() / 3, &( ( *verts )[0] ) ) );
41 
42  m_outputBitfield = boost::shared_ptr< std::vector< bool > >( new std::vector< bool >( m_size, true ) );
43 
44  std::vector< osg::ref_ptr< WROI > >rois = WKernel::getRunningKernel()->getRoiManager()->getRois();
45 
47  = boost::shared_ptr< boost::function< void() > >( new boost::function< void() >( boost::bind( &WFiberSelector::setDirty, this ) ) );
48 
50  boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > >(
51  new boost::function< void( osg::ref_ptr< WROI > ) > ( boost::bind( &WFiberSelector::slotAddRoi, this, _1 ) ) );
53 
55  boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > >(
56  new boost::function< void( osg::ref_ptr< WROI > ) > ( boost::bind( &WFiberSelector::slotRemoveRoi, this, _1 ) ) );
58 
60  boost::shared_ptr< boost::function< void( boost::shared_ptr< WRMBranch > ) > >(
61  new boost::function< void( boost::shared_ptr< WRMBranch > ) > (
62  boost::bind( &WFiberSelector::slotRemoveBranch, this, _1 ) ) );
63  WKernel::getRunningKernel()->getRoiManager()->addRemoveBranchNotifier( m_removeBranchSignal );
64 
65  for( size_t i = 0; i < rois.size(); ++i )
66  {
67  slotAddRoi( rois[i] );
68  ( rois[i] )->getProperties()->getProperty( "Dirty" )->toPropBool()->set( true );
69  }
70 }
71 
73 {
74  WKernel::getRunningKernel()->getRoiManager()->removeAddNotifier( m_assocRoiSignal );
75  WKernel::getRunningKernel()->getRoiManager()->removeRemoveNotifier( m_removeRoiSignal );
76  WKernel::getRunningKernel()->getRoiManager()->removeRemoveBranchNotifier( m_removeBranchSignal );
77 
78  // We need the following because not all ROIs are removed per slot below
79  {
80  for( std::list< boost::shared_ptr< WSelectorBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
81  {
82  std::list< boost::shared_ptr< WSelectorRoi > > rois = ( *iter )->getROIs();
83  for( std::list< boost::shared_ptr< WSelectorRoi > >::iterator roiIter = rois.begin(); roiIter != rois.end(); ++roiIter )
84  {
85  ( *roiIter )->getRoi()->removeROIChangeNotifier( m_changeRoiSignal );
86  }
87  }
88  }
89  m_branches.clear();
90 }
91 
92 void WFiberSelector::slotAddRoi( osg::ref_ptr< WROI > roi )
93 {
94  boost::shared_ptr< WSelectorBranch > branch;
95 
96  for( std::list< boost::shared_ptr< WSelectorBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
97  {
98  if( ( *iter )->getBranch() == WKernel::getRunningKernel()->getRoiManager()->getBranch( roi ) )
99  {
100  branch = ( *iter );
101  }
102  }
103  if( !branch )
104  {
105  branch = boost::shared_ptr<WSelectorBranch>(
106  new WSelectorBranch( m_fibers, WKernel::getRunningKernel()->getRoiManager()->getBranch( roi ) ) );
107  m_branches.push_back( branch );
108  }
109 
110  boost::shared_ptr< WSelectorRoi> sroi = boost::shared_ptr< WSelectorRoi>( new WSelectorRoi( roi, m_fibers, m_kdTree ) );
111 
112  branch->addRoi( sroi );
113  sroi->getRoi()->addROIChangeNotifier( m_changeRoiSignal );
114 
115  setDirty();
116 }
117 
118 void WFiberSelector::slotRemoveRoi( osg::ref_ptr< WROI > roi )
119 {
120  roi->removeROIChangeNotifier( m_changeRoiSignal );
121  for( std::list< boost::shared_ptr< WSelectorBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
122  {
123  ( *iter )->removeRoi( roi );
124 
125  if( (*iter )->empty() )
126  {
127  m_branches.erase( iter );
128  break;
129  }
130  }
131  setDirty();
132 }
133 
134 void WFiberSelector::slotRemoveBranch( boost::shared_ptr< WRMBranch > branch )
135 {
136  for( std::list< boost::shared_ptr< WSelectorBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
137  {
138  if( branch == ( *iter )->getBranch() )
139  {
140  m_branches.erase( iter );
141  break;
142  }
143  }
144  setDirty();
145 }
146 
147 boost::shared_ptr< std::vector< bool > > WFiberSelector::getBitfield()
148 {
149  for( std::list< boost::shared_ptr< WSelectorBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
150  {
151  m_dirty = std::max( m_dirty, ( *iter )->dirty() );
152  }
153 
154  if( m_dirty )
155  {
156  recalculate();
157  }
158  return m_outputBitfield;
159 }
160 
162 {
163  if( m_branches.empty() )
164  {
165  m_workerBitfield = boost::shared_ptr< std::vector< bool > >( new std::vector< bool >( m_size, true ) );
166  }
167  else
168  {
169  m_workerBitfield = boost::shared_ptr< std::vector< bool > >( new std::vector< bool >( m_size, false ) );
170 
171  for( std::list< boost::shared_ptr< WSelectorBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
172  {
173  boost::shared_ptr< std::vector< bool > > bf = ( *iter )->getBitField();
174 
175  for( size_t i = 0; i < m_size; ++i )
176  {
177  ( *m_workerBitfield )[i] = ( *m_workerBitfield )[i] | ( *bf )[i];
178  }
179  }
180  }
181 
182  for( size_t i = 0; i < m_size; ++i )
183  {
184  ( *m_outputBitfield )[i] = ( *m_workerBitfield )[i];
185  }
186  m_dirty = false;
187  //m_outputBitfield = m_workerBitfield;
188 }
189 
191 {
192  recalculate();
193  m_dirty = true;
194 }