Files
create/src/Mod/Mesh/App/Core/Info.cpp
2022-11-21 03:59:13 +01:00

255 lines
8.7 KiB
C++

/***************************************************************************
* Copyright (c) 2005 Imetric 3D GmbH *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <iomanip>
# include <iostream>
# include <map>
# include <set>
#endif
#include "Info.h"
#include "Iterator.h"
using namespace MeshCore;
MeshInfo::MeshInfo (const MeshKernel &rclM)
: _rclMesh(rclM)
{
}
std::ostream& MeshInfo::GeneralInformation (std::ostream &rclStream) const
{
unsigned long ulCtPt, ulCtEd, ulCtFc;
ulCtPt = _rclMesh.CountPoints();
ulCtFc = _rclMesh.CountFacets();
ulCtEd = _rclMesh.CountEdges();
rclStream << "Mesh: ["
<< ulCtFc << " Faces, ";
rclStream << ulCtEd << " Edges, ";
rclStream << ulCtPt << " Points"
<< "]" << std::endl;
return rclStream;
}
std::ostream& MeshInfo::DetailedPointInfo (std::ostream& rclStream) const
{
// print points
rclStream << _rclMesh.CountPoints() << " Points:" << std::endl;
MeshPointIterator pPIter(_rclMesh), pPEnd(_rclMesh);
pPIter.Begin();
pPEnd.End();
PointIndex i = 0;
rclStream.precision(3);
rclStream.setf(std::ios::fixed | std::ios::showpoint | std::ios::showpos);
while (pPIter < pPEnd)
{
rclStream << "P " << std::setw(4) << (i++) << ": ("
<< std::setw(8) << (*pPIter).x << ", "
<< std::setw(8) << (*pPIter).y << ", "
<< std::setw(8) << (*pPIter).z << ")" << std::endl;
++pPIter;
}
return rclStream;
}
std::ostream& MeshInfo::DetailedEdgeInfo (std::ostream& rclStream) const
{
// print edges
// get edges from facets
std::map<std::pair<PointIndex, PointIndex>, int > lEdges;
const MeshFacetArray& rFacets = _rclMesh.GetFacets();
MeshFacetArray::_TConstIterator pFIter;
pFIter = rFacets.begin();
while (pFIter < rFacets.end())
{
const MeshFacet& rFacet = *pFIter;
for ( int j=0; j<3; j++ )
{
PointIndex ulPt0 = std::min<PointIndex>(rFacet._aulPoints[j], rFacet._aulPoints[(j+1)%3]);
PointIndex ulPt1 = std::max<PointIndex>(rFacet._aulPoints[j], rFacet._aulPoints[(j+1)%3]);
std::pair<PointIndex, PointIndex> cEdge(ulPt0, ulPt1);
lEdges[ cEdge ]++;
}
pFIter++;
}
// print edges
rclStream << lEdges.size() << " Edges:" << std::endl;
std::map<std::pair<PointIndex, PointIndex>, int >::const_iterator pEIter;
pEIter = lEdges.begin();
rclStream.precision(3);
rclStream.setf(std::ios::fixed | std::ios::showpoint | std::ios::showpos);
unsigned long i=0;
const MeshPointArray& rPoints = _rclMesh.GetPoints();
while (pEIter != lEdges.end())
{
int ct = pEIter->second;
const Base::Vector3f& rP0 = rPoints[ pEIter->first.first ];
const Base::Vector3f& rP1 = rPoints[ pEIter->first.second ];
rclStream << "E " << std::setw(4) << (i++) << ": "
<< " P (" << std::setw(8) << rP0.x << ", "
<< std::setw(8) << rP0.y << ", "
<< std::setw(8) << rP0.z << "); "
<< " P (" << std::setw(8) << rP1.x << ", "
<< std::setw(8) << rP1.y << ", "
<< std::setw(8) << rP1.z << "), B: " << (ct == 2 ? "n" : "y") << std::endl;
++pEIter;
}
return rclStream;
}
std::ostream& MeshInfo::DetailedFacetInfo (std::ostream& rclStream) const
{
// print facets
unsigned long i, j;
rclStream << _rclMesh.CountFacets() << " Faces:" << std::endl;
MeshFacetIterator pFIter(_rclMesh), pFEnd(_rclMesh);
pFIter.Begin();
pFEnd.End();
i = 0;
rclStream.precision(3);
rclStream.setf(std::ios::fixed | std::ios::showpoint | std::ios::showpos);
while (pFIter < pFEnd)
{
rclStream << "F " << std::setw(4) << (i++) << ":" << std::endl;
rclStream << " N (" << std::setw(8) << (*pFIter).GetNormal().x << ", "
<< std::setw(8) << (*pFIter).GetNormal().y << ", "
<< std::setw(8) << (*pFIter).GetNormal().z << ")" << std::endl;
for (j = 0; j < 3; j++)
{
rclStream << " P (" << std::setw(8) << (*pFIter)._aclPoints[j].x << ", "
<< std::setw(8) << (*pFIter)._aclPoints[j].y << ", "
<< std::setw(8) << (*pFIter)._aclPoints[j].z << ")" << std::endl;
}
++pFIter;
}
return rclStream;
}
std::ostream& MeshInfo::DetailedInformation (std::ostream& rclStream) const
{
DetailedPointInfo( rclStream );
DetailedEdgeInfo ( rclStream );
DetailedFacetInfo( rclStream );
return rclStream;
}
std::ostream& MeshInfo::InternalPointInfo (std::ostream& rclStream) const
{
// print points
unsigned long i;
rclStream << _rclMesh.CountPoints() << " Points:" << std::endl;
MeshPointIterator pPIter(_rclMesh), pPEnd(_rclMesh);
pPIter.Begin();
pPEnd.End();
i = 0;
rclStream.precision(3);
rclStream.setf(std::ios::fixed | std::ios::showpoint | std::ios::showpos);
while (pPIter < pPEnd)
{
rclStream << "P " << std::setw(4) << (i++) << ": ("
<< std::setw(8) << (*pPIter).x << ", "
<< std::setw(8) << (*pPIter).y << ", "
<< std::setw(8) << (*pPIter).z << ")";
if (pPIter->IsValid())
rclStream << std::endl;
else
rclStream << " invalid" << std::endl;
++pPIter;
}
return rclStream;
}
std::ostream& MeshInfo::InternalFacetInfo (std::ostream& rclStream) const
{
// print facets
unsigned long i;
rclStream << _rclMesh.CountFacets() << " Faces:" << std::endl;
const MeshFacetArray& rFacets = _rclMesh.GetFacets();
MeshFacetArray::_TConstIterator pFIter;
pFIter = rFacets.begin();
i = 0;
while (pFIter < rFacets.end())
{
rclStream << "F " << std::setw(4) << (i++) << ": P ("
<< std::setw(4) << pFIter->_aulPoints[0] << ", "
<< std::setw(4) << pFIter->_aulPoints[1] << ", "
<< std::setw(4) << pFIter->_aulPoints[2] << ") "
<< "N (" << std::setw(4) << pFIter->_aulNeighbours[0] << ", "
<< std::setw(4) << pFIter->_aulNeighbours[1] << ", "
<< std::setw(4) << pFIter->_aulNeighbours[2] << ") ";
if (pFIter->IsValid())
rclStream << std::endl;
else
rclStream << " invalid" << std::endl;
pFIter++;
}
return rclStream;
}
std::ostream& MeshInfo::InternalInformation (std::ostream& rclStream) const
{
InternalPointInfo( rclStream );
InternalFacetInfo( rclStream );
return rclStream;
}
std::ostream& MeshInfo::TopologyInformation (std::ostream& rclStream) const
{
unsigned long index = 0;
const MeshFacetArray& rFAry = _rclMesh.GetFacets();
for (MeshFacetArray::_TConstIterator it = rFAry.begin(); it != rFAry.end(); ++it, ++index) {
rclStream << "F " << std::setw(4) << index << ": P ("
<< it->_aulPoints[0] << ", "
<< it->_aulPoints[1] << ", "
<< it->_aulPoints[2] << "), N ("
<< it->_aulNeighbours[0] << ", "
<< it->_aulNeighbours[1] << ", "
<< it->_aulNeighbours[2] << ")" << std::endl;
}
return rclStream;
}