Properties.cpp
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "PreCompiled.h"
00025 #ifndef _PreComp_
00026 # include <cmath>
00027 # include <iostream>
00028 # include <algorithm>
00029 #endif
00030 
00031 #include <Base/Exception.h>
00032 #include <Base/Matrix.h>
00033 #include <Base/Persistence.h>
00034 #include <Base/Stream.h>
00035 #include <Base/Writer.h>
00036 
00037 #include "Points.h"
00038 #include "Properties.h"
00039 #include "PointsPy.h"
00040 
00041 using namespace Points;
00042 using namespace std;
00043 
00044 TYPESYSTEM_SOURCE(Points::PropertyGreyValue, App::PropertyFloat);
00045 TYPESYSTEM_SOURCE(Points::PropertyGreyValueList, App::PropertyFloatList);
00046 TYPESYSTEM_SOURCE(Points::PropertyNormalList, App::PropertyVectorList);
00047 TYPESYSTEM_SOURCE(Points::PropertyCurvatureList , App::PropertyLists);
00048 
00049 void PropertyGreyValueList::removeIndices( const std::vector<unsigned long>& uIndices )
00050 {
00051     
00052     std::vector<unsigned long> uSortedInds = uIndices;
00053     std::sort(uSortedInds.begin(), uSortedInds.end());
00054 
00055     const std::vector<float>& rValueList = getValues();
00056 
00057     assert( uSortedInds.size() <= rValueList.size() );
00058     if ( uSortedInds.size() > rValueList.size() )
00059         return;
00060 
00061     std::vector<float> remainValue;
00062     remainValue.reserve(rValueList.size() - uSortedInds.size());
00063 
00064     std::vector<unsigned long>::iterator pos = uSortedInds.begin();
00065     for ( std::vector<float>::const_iterator it = rValueList.begin(); it != rValueList.end(); ++it ) {
00066         unsigned long index = it - rValueList.begin();
00067         if (pos == uSortedInds.end())
00068             remainValue.push_back( *it );
00069         else if (index != *pos)
00070             remainValue.push_back( *it );
00071         else 
00072             pos++;
00073     }
00074 
00075     setValues(remainValue);
00076 }
00077 
00078 void PropertyNormalList::transform(const Base::Matrix4D &mat)
00079 {
00080     
00081     
00082 
00083     
00084     
00085     
00086     double s[3];
00087     s[0] = sqrt(mat[0][0] * mat[0][0] + mat[0][1] * mat[0][1] + mat[0][2] * mat[0][2]);
00088     s[1] = sqrt(mat[1][0] * mat[1][0] + mat[1][1] * mat[1][1] + mat[1][2] * mat[1][2]);
00089     s[2] = sqrt(mat[2][0] * mat[2][0] + mat[2][1] * mat[2][1] + mat[2][2] * mat[2][2]);
00090 
00091     
00092     Base::Matrix4D rot;
00093     rot.setToUnity();
00094     for (unsigned short i = 0; i < 3; i++) {
00095         for (unsigned short j = 0; j < 3; j++) {
00096             rot[i][j] = mat[i][j] / s[i];
00097         }
00098     }
00099 
00100     
00101     for (int ii=0; ii<getSize(); ii++) {
00102         set1Value(ii, rot * operator[](ii));
00103     }
00104 }
00105 
00106 void PropertyNormalList::removeIndices( const std::vector<unsigned long>& uIndices )
00107 {
00108     
00109     std::vector<unsigned long> uSortedInds = uIndices;
00110     std::sort(uSortedInds.begin(), uSortedInds.end());
00111 
00112     const std::vector<Base::Vector3f>& rValueList = getValues();
00113 
00114     assert( uSortedInds.size() <= rValueList.size() );
00115     if ( uSortedInds.size() > rValueList.size() )
00116         return;
00117 
00118     std::vector<Base::Vector3f> remainValue;
00119     remainValue.reserve(rValueList.size() - uSortedInds.size());
00120 
00121     std::vector<unsigned long>::iterator pos = uSortedInds.begin();
00122     for ( std::vector<Base::Vector3f>::const_iterator it = rValueList.begin(); it != rValueList.end(); ++it ) {
00123         unsigned long index = it - rValueList.begin();
00124         if (pos == uSortedInds.end())
00125             remainValue.push_back( *it );
00126         else if (index != *pos)
00127             remainValue.push_back( *it );
00128         else 
00129             pos++;
00130     }
00131 
00132     setValues(remainValue);
00133 }
00134 
00135 PropertyCurvatureList::PropertyCurvatureList()
00136 {
00137 
00138 }
00139 
00140 PropertyCurvatureList::~PropertyCurvatureList()
00141 {
00142 
00143 }
00144 
00145 void PropertyCurvatureList::setValue(const CurvatureInfo& lValue)
00146 {
00147     aboutToSetValue();
00148     _lValueList.resize(1);
00149     _lValueList[0]=lValue;
00150     hasSetValue();
00151 }
00152 
00153 void PropertyCurvatureList::setValues(const std::vector<CurvatureInfo>& lValues)
00154 {
00155     aboutToSetValue();
00156     _lValueList=lValues;
00157     hasSetValue();
00158 }
00159 
00160 std::vector<float> PropertyCurvatureList::getCurvature( int mode ) const
00161 {
00162     const std::vector<Points::CurvatureInfo>& fCurvInfo = getValues();
00163     std::vector<float> fValues;
00164     fValues.reserve(fCurvInfo.size());
00165 
00166     
00167     if (mode == MeanCurvature) {
00168         for (std::vector<Points::CurvatureInfo>::const_iterator it=fCurvInfo.begin();it!=fCurvInfo.end(); ++it) {
00169             fValues.push_back( 0.5f*(it->fMaxCurvature+it->fMinCurvature) );
00170         }
00171     }
00172     
00173     else if (mode == GaussCurvature) {
00174         for (std::vector<Points::CurvatureInfo>::const_iterator it=fCurvInfo.begin();it!=fCurvInfo.end(); ++it) {
00175             fValues.push_back( it->fMaxCurvature * it->fMinCurvature );
00176         }
00177     }
00178     
00179     else if (mode == MaxCurvature) {
00180         for (std::vector<Points::CurvatureInfo>::const_iterator it=fCurvInfo.begin();it!=fCurvInfo.end(); ++it) {
00181             fValues.push_back( it->fMaxCurvature );
00182         }
00183     }
00184     
00185     else if (mode == MinCurvature) {
00186         for (std::vector<Points::CurvatureInfo>::const_iterator it=fCurvInfo.begin();it!=fCurvInfo.end(); ++it) {
00187             fValues.push_back( it->fMinCurvature );
00188         }
00189     }
00190     
00191     else if (mode == AbsCurvature) {
00192         for (std::vector<Points::CurvatureInfo>::const_iterator it=fCurvInfo.begin();it!=fCurvInfo.end(); ++it) {
00193             if (fabs(it->fMaxCurvature) > fabs(it->fMinCurvature))
00194                 fValues.push_back( it->fMaxCurvature );
00195             else
00196                 fValues.push_back( it->fMinCurvature );
00197         }
00198     }
00199 
00200     return fValues;
00201 }
00202 
00203 void PropertyCurvatureList::transform(const Base::Matrix4D &mat)
00204 {
00205     
00206     
00207 
00208     
00209     
00210     
00211     double s[3];
00212     s[0] = sqrt(mat[0][0] * mat[0][0] + mat[0][1] * mat[0][1] + mat[0][2] * mat[0][2]);
00213     s[1] = sqrt(mat[1][0] * mat[1][0] + mat[1][1] * mat[1][1] + mat[1][2] * mat[1][2]);
00214     s[2] = sqrt(mat[2][0] * mat[2][0] + mat[2][1] * mat[2][1] + mat[2][2] * mat[2][2]);
00215 
00216     
00217     Base::Matrix4D rot;
00218     rot.setToUnity();
00219     for (unsigned short i = 0; i < 3; i++) {
00220         for (unsigned short j = 0; j < 3; j++) {
00221             rot[i][j] = mat[i][j] / s[i];
00222         }
00223     }
00224 
00225     
00226     for (int ii=0; ii<getSize(); ii++) {
00227         CurvatureInfo ci = operator[](ii);
00228         ci.cMaxCurvDir = rot * ci.cMaxCurvDir;
00229         ci.cMinCurvDir = rot * ci.cMinCurvDir;
00230         set1Value(ii, ci);
00231     }
00232 }
00233 
00234 void PropertyCurvatureList::removeIndices( const std::vector<unsigned long>& uIndices )
00235 {
00236     
00237     std::vector<unsigned long> uSortedInds = uIndices;
00238     std::sort(uSortedInds.begin(), uSortedInds.end());
00239 
00240     assert( uSortedInds.size() <= _lValueList.size() );
00241     if ( uSortedInds.size() > _lValueList.size() )
00242         return;
00243 
00244     std::vector<CurvatureInfo> remainValue;
00245     remainValue.reserve(_lValueList.size() - uSortedInds.size());
00246 
00247     std::vector<unsigned long>::iterator pos = uSortedInds.begin();
00248     for ( std::vector<CurvatureInfo>::const_iterator it = _lValueList.begin(); it != _lValueList.end(); ++it ) {
00249         unsigned long index = it - _lValueList.begin();
00250         if (pos == uSortedInds.end())
00251             remainValue.push_back( *it );
00252         else if (index != *pos)
00253             remainValue.push_back( *it );
00254         else 
00255             pos++;
00256     }
00257 
00258     setValues(remainValue);
00259 }
00260 
00261 void PropertyCurvatureList::Save (Base::Writer &writer) const
00262 {
00263     if (!writer.isForceXML()) {
00264         writer.Stream() << writer.ind() << "<CurvatureList file=\"" << writer.addFile(getName(), this) << "\"/>" << std::endl;
00265     }
00266 }
00267 
00268 void PropertyCurvatureList::Restore(Base::XMLReader &reader)
00269 {
00270     reader.readElement("CurvatureList");
00271     std::string file (reader.getAttribute("file") );
00272 
00273     if (!file.empty()) {
00274         
00275         reader.addFile(file.c_str(),this);
00276     }
00277 }
00278 
00279 void PropertyCurvatureList::SaveDocFile (Base::Writer &writer) const
00280 {
00281     Base::OutputStream str(writer.Stream());
00282     uint32_t uCt = (uint32_t)getSize();
00283     str << uCt;
00284     if (uCt > 0)
00285     for (std::vector<CurvatureInfo>::const_iterator it = _lValueList.begin(); it != _lValueList.end(); ++it) {
00286         str << it->fMaxCurvature << it->fMinCurvature;
00287         str << it->cMaxCurvDir.x << it->cMaxCurvDir.y << it->cMaxCurvDir.z;
00288         str << it->cMinCurvDir.x << it->cMinCurvDir.y << it->cMinCurvDir.z;
00289     }
00290 }
00291 
00292 void PropertyCurvatureList::RestoreDocFile(Base::Reader &reader)
00293 {
00294     Base::InputStream str(reader);
00295     uint32_t uCt=0;
00296     str >> uCt;
00297     std::vector<CurvatureInfo> values(uCt);
00298     for (std::vector<CurvatureInfo>::iterator it = values.begin(); it != values.end(); ++it) {
00299         str >> it->fMaxCurvature >> it->fMinCurvature;
00300         str >> it->cMaxCurvDir.x >> it->cMaxCurvDir.y >> it->cMaxCurvDir.z;
00301         str >> it->cMinCurvDir.x >> it->cMinCurvDir.y >> it->cMinCurvDir.z;
00302     }
00303 
00304     setValues(values);
00305 }
00306 
00307 App::Property *PropertyCurvatureList::Copy(void) const 
00308 {
00309     PropertyCurvatureList* prop = new PropertyCurvatureList();
00310     prop->_lValueList = this->_lValueList;
00311     return prop;
00312 }
00313 
00314 void PropertyCurvatureList::Paste(const App::Property &from)
00315 {
00316     aboutToSetValue();
00317     const PropertyCurvatureList& prop = dynamic_cast<const PropertyCurvatureList&>(from);
00318     this->_lValueList = prop._lValueList;
00319     hasSetValue();
00320 }
00321 
00322 unsigned int PropertyCurvatureList::getMemSize (void) const
00323 {
00324     return sizeof(CurvatureInfo) * this->_lValueList.size();
00325 }