00001
00002
00003
00004
00005 #if !defined (AQSENSE_SAL3DPP_RANGE_MAP_HPP)
00006 #define AQSENSE_SAL3DPP_RANGE_MAP_HPP
00007
00008 #if defined (_MSC_VER) && (_MSC_VER >= 1020)
00009 #pragma once
00010 #endif // _MSC_VER && _MSC_VER >= 1020
00011
00012 #include <limits>
00013 #include <stdexcept>
00014 #include <string>
00015 #include <vector>
00016 #include <sal3d/rangemap.h>
00017 #include <sal3dpp/Common.hpp>
00018 #include <sal3dpp/Frame.hpp>
00019 #include <sal3dpp/Profile.hpp>
00020
00021 namespace sal3d
00022 {
00100 class RangeMap
00101 {
00102 public:
00124 RangeMap (int profilesLength, int maxProfiles)
00125 {
00126 _rangemap.p = 0;
00127 Error e;
00128 sal3d_range_map_new (profilesLength, maxProfiles,
00129 &_rangemap, &e.e);
00130 if ( e.e.value < 0 )
00131 throw e;
00132 }
00133
00145 explicit RangeMap (const std::string &fileName)
00146 {
00147 _rangemap.p = 0;
00148 Error e;
00149 sal3d_range_map_new_from_file (fileName.c_str (),
00150 &_rangemap, 0, &e.e);
00151 if ( e.e.value < 0 )
00152 throw e;
00153 }
00154
00174 RangeMap (const Frame &frame, int plane)
00175 {
00176 _rangemap.p = 0;
00177 Error e;
00178 sal3d_range_map_new_from_frame (frame.c_frame (),
00179 plane, &_rangemap, &e.e);
00180 if ( e.e.value < 0 )
00181 throw e;
00182 }
00183
00189 RangeMap (const RangeMap &rangeMap):
00190 _rangemap (rangeMap._rangemap)
00191 {
00192 Error e;
00193 sal3d_range_map_share (_rangemap, &e.e);
00194 if ( e.e.value < 0 )
00195 throw e;
00196 }
00197
00210 explicit RangeMap (sal3d_range_map rangemap):
00211 _rangemap (rangemap)
00212 {
00213 Error e;
00214 sal3d_range_map_check_validity (rangemap, &e.e);
00215 if ( e.e.value < 0 )
00216 throw e;
00217 }
00218
00225 ~RangeMap ()
00226 {
00227 sal3d_range_map_release (_rangemap);
00228 }
00229
00240 RangeMap
00241 copy() const
00242 {
00243 sal3d_range_map rangemap;
00244 Error e;
00245 sal3d_range_map_duplicate (_rangemap, &rangemap, &e.e);
00246 if ( e.e.value < 0 )
00247 throw e;
00248 return RangeMap (rangemap);
00249 }
00250
00260 int
00261 countProfiles () const
00262 {
00263 Error e;
00264 int count = sal3d_range_map_count_profiles (_rangemap, &e.e);
00265 if ( e.e.value < 0 )
00266 throw e;
00267 return count;
00268 }
00269
00281 int
00282 maxProfiles () const
00283 {
00284 Error e;
00285 int count = sal3d_range_map_max_profiles (_rangemap, &e.e);
00286 if ( e.e.value < 0 )
00287 throw e;
00288 return count;
00289 }
00290
00300 sal3d_range_map
00301 c_range_map () const
00302 {
00303 return _rangemap;
00304 }
00305
00313 RangeMap &
00314 operator= (const RangeMap &rhs)
00315 {
00316 Error e;
00317 sal3d_range_map_share (rhs._rangemap, &e.e);
00318 if ( e.e.value < 0 )
00319 throw e;
00320 sal3d_range_map_release (_rangemap);
00321 _rangemap = rhs._rangemap;
00322
00323 return *this;
00324 }
00325
00343 Profile
00344 getNewProfile () const
00345 {
00346 sal3d_profile profile;
00347 profile.p = 0;
00348 Error e;
00349 sal3d_range_map_get_new_profile (_rangemap,
00350 &profile, &e.e);
00351 if ( e.e.value < 0 )
00352 throw e;
00353 return Profile (profile);
00354 }
00355
00366 const Profile
00367 operator[] (int index) const
00368 {
00369 sal3d_profile profile;
00370 profile.p = 0;
00371 Error e;
00372 sal3d_range_map_get_profile (_rangemap, index,
00373 &profile, &e.e);
00374 if ( e.e.value < 0 )
00375 throw e;
00376 return Profile (profile);
00377 }
00378
00389 Profile
00390 operator[] (int index)
00391 {
00392 return static_cast<const RangeMap &>(*this)[index];
00393 }
00394
00400 int
00401 profilesLength () const
00402 {
00403 Error e;
00404 int length = sal3d_range_map_get_profiles_length (_rangemap,
00405 &e.e);
00406 if ( e.e.value < 0 )
00407 throw e;
00408
00409 return length;
00410 }
00411
00424 Frame
00425 newFrame () const
00426 {
00427 sal3d_frame frame;
00428 Error e;
00429 sal3d_range_map_get_frame (_rangemap,
00430 &frame, &e.e);
00431 if ( e.e.value < 0 )
00432 throw e;
00433 return Frame (frame);
00434 }
00435
00445 void
00446 saveToFile (const std::string &fileName) const
00447 {
00448 Error e;
00449 sal3d_range_map_save_to_file (_rangemap, fileName.c_str (),
00450 &e.e);
00451 if ( e.e.value < 0 )
00452 throw e;
00453 }
00454
00455 private:
00457 sal3d_range_map _rangemap;
00458 };
00459 }
00460
00461 #endif // !AQSENSE_SAL3DPP_RANGE_MAP_HPP