Files
create/src/Mod/Cam/App/deviation.cpp
2021-12-10 14:29:34 +01:00

228 lines
6.2 KiB
C++

/**************************************************************************
* Copyright (c) 2007 Joachim Zettler <Joachim.Zettler@gmx.de> *
* Copyright (c) 2007 Human Rezai <human@mytum.de> *
* *
* 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"
#include "deviation.h"
#include <Mod/Mesh/App/Core/MeshKernel.h>
#include <Mod/Mesh/App/Core/Builder.h>
#include <Mod/Mesh/App/Core/Grid.h>
#include <BRepAdaptor_Surface.hxx>
#include <Base/Builder3D.h>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <Geom_Surface.hxx>
#include <Poly_PolygonOnTriangulation.hxx>
#include <Poly_Triangulation.hxx>
#include <TColgp_Array1OfPnt2d.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
Deviation::Deviation()
{}
Deviation::~Deviation()
{}
void Deviation::ImportGeometry(const TopoDS_Shape& aShape, const MeshCore::MeshKernel& aMesh)
{
m_Mesh = aMesh;
m_Cad = aShape;
}
bool Deviation::GenNormals()
{
Base::Builder3D log;
TopExp_Explorer aExpFace;
MeshPnt aMeshStruct;
std::pair<Base::Vector3f, MeshPnt> inp;
std::map<Base::Vector3f,MeshPnt,MeshPntLess >::iterator meshIt;
MeshCore::MeshKernel FaceMesh;
MeshCore::MeshPointArray MeshPnts;
int n;
MeshPnts = m_MeshCad.GetPoints();
m_pnts.resize(m_MeshCad.CountPoints());
m_nlvec.resize((m_MeshCad.CountPoints()));
for (unsigned int i=0; i<MeshPnts.size(); ++i)
{
aMeshStruct.pnt = MeshPnts[i]; // stores point
aMeshStruct.index = i; // stores index
inp.first = aMeshStruct.pnt;
inp.second = aMeshStruct;
MeshMap.insert(inp);
}
// explores all faces ------------ Hauptschleife
for (aExpFace.Init(m_Cad,TopAbs_FACE);aExpFace.More();aExpFace.Next())
{
TopoDS_Face aFace = TopoDS::Face(aExpFace.Current());
TransferFaceTriangulationtoFreeCAD(aFace, FaceMesh);
MeshPnts.clear();
MeshPnts = FaceMesh.GetPoints();
n = MeshPnts.size();
TopLoc_Location aLocation;
Handle_Poly_Triangulation aTr = BRep_Tool::Triangulation(aFace,aLocation);
const TColgp_Array1OfPnt& aNodes = aTr->Nodes();
// create array of node points in absolute coordinate system
TColgp_Array1OfPnt aPoints(1, aNodes.Length());
for (Standard_Integer i = 1; i <= aNodes.Length(); i++)
aPoints(i) = aNodes(i).Transformed(aLocation);
const TColgp_Array1OfPnt2d& aUVNodes = aTr->UVNodes();
BRepAdaptor_Surface aSurface(aFace);
Base::Vector3f pnt, normal;
gp_Pnt2d par;
gp_Pnt P;
gp_Vec D1U, D1V;
for (int i=1; i<n+1; ++i)
{
par = aUVNodes.Value(i);
aSurface.D1(par.X(),par.Y(),P,D1U,D1V);
P = aPoints(i);
pnt.x = (float) P.X();
pnt.y = (float) P.Y();
pnt.z = (float) P.Z();
meshIt = MeshMap.find(pnt);
if (meshIt == MeshMap.end())
{
cout << "error";
return false;
}
D1U.Cross(D1V);
D1U.Normalize();
if (aFace.Orientation() == TopAbs_FORWARD) D1U.Scale(-1.0);
normal.x = (float) D1U.X();
normal.y = (float) D1U.Y();
normal.z = (float) D1U.Z();
m_pnts[((*meshIt).second).index] = pnt;
m_nlvec[((*meshIt).second).index] = normal;
log.addSingleArrow(pnt,pnt+normal);
}
}
log.saveToFile("c:/deviation.iv");
return true;
}
bool Deviation::Compute()
{
Base::Builder3D log;
best_fit::Tesselate_Shape(m_Cad, m_MeshCad, float(0.1));
GenNormals();
//return true;
std::vector<int> FailProj;
MeshCore::MeshFacetGrid aFacetGrid(m_Mesh,10);
MeshCore::MeshAlgorithm malg(m_Mesh);
MeshCore::MeshAlgorithm malg2(m_Mesh);
MeshCore::MeshPointIterator p_it(m_MeshCad);
Base::Vector3f projPoint, distVec, nvec(0,0,0), projPoint2;
unsigned long facetIndex;
std::stringstream text;
unsigned int c=0;
int i=0;
for (p_it.Begin(); p_it.More(); p_it.Next())
{
if (malg.NearestFacetOnRay(*p_it, m_nlvec[i], aFacetGrid, projPoint, facetIndex)) // gridoptimiert
{
distVec = projPoint - *p_it;
m_nlvec[i] = distVec; // überschreibt normalenvektor
}
else
{
if (!malg2.NearestFacetOnRay(*p_it, m_nlvec[i], projPoint, facetIndex)) // nicht gridoptimiert
{
c++;
FailProj.push_back(i);
m_nlvec[i] = nvec;
}
else
{
distVec = projPoint - *p_it;
m_nlvec[i] = distVec; // überschreibt normalenvektor
}
}
++i;
}
for(int i=0; i<m_nlvec.size(); i++)
{
log.addSingleArrow(m_pnts[i], m_pnts[i] + m_nlvec[i]);
}
log.saveToFile("c:/deviation2.iv");
return true;
}
#include <QFile>
#include <QTextStream>
void Deviation::WriteOutput(const QString &dateiname)
{
QFile anOutputFile(dateiname);
if (!anOutputFile.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&anOutputFile);
out << m_nlvec.size() << endl;
for(int i=0; i<m_nlvec.size(); i++)
{
out << m_pnts[i].x << ","
<< m_pnts[i].y << ","
<< m_pnts[i].z << ","
<< m_nlvec[i].x << ","
<< m_nlvec[i].y << ","
<< m_nlvec[i].z << endl;
}
anOutputFile.close();
}