mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-26 09:20:35 +05:00
Fix of searching for shapes on surface (NGO letter from 20.02.2015)
This commit is contained in:
parent
58803ba33e
commit
eaee8de41c
@ -36,8 +36,9 @@
|
||||
#include "GEOM_Function.hxx"
|
||||
#include "GEOM_PythonDump.hxx"
|
||||
#include "GEOMUtils.hxx"
|
||||
#include "GEOMAlgo_ClsfSurf.hxx"
|
||||
#include "GEOMAlgo_FinderShapeOn2.hxx"
|
||||
#include "GEOMAlgo_Splitter.hxx"
|
||||
#include "GEOMAlgo_FinderShapeOn1.hxx"
|
||||
|
||||
#include "GEOMImpl_Gen.hxx"
|
||||
#include "GEOMImpl_Types.hxx"
|
||||
@ -815,11 +816,13 @@ bool AdvancedEngine_IOperations::GetFacesOnSurf
|
||||
const Standard_Real theTolerance,
|
||||
TopTools_ListOfShape &theFaces)
|
||||
{
|
||||
GEOMAlgo_FinderShapeOn1 aFinder;
|
||||
GEOMAlgo_FinderShapeOn2 aFinder;
|
||||
Handle(GEOMAlgo_ClsfSurf) aClsfSurf = new GEOMAlgo_ClsfSurf;
|
||||
|
||||
aClsfSurf->SetSurface(theSurface);
|
||||
aFinder.SetShape(theShape);
|
||||
aFinder.SetTolerance(theTolerance);
|
||||
aFinder.SetSurface(theSurface);
|
||||
aFinder.SetClsf(aClsfSurf);
|
||||
aFinder.SetShapeType(TopAbs_FACE);
|
||||
aFinder.SetState(GEOMAlgo_ST_ON);
|
||||
|
||||
@ -836,7 +839,7 @@ bool AdvancedEngine_IOperations::GetFacesOnSurf
|
||||
|
||||
// Interprete results
|
||||
Standard_Integer iErr = aFinder.ErrorStatus();
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iErr) {
|
||||
MESSAGE(" iErr : " << iErr);
|
||||
TCollection_AsciiString aMsg (" iErr : ");
|
||||
@ -845,7 +848,7 @@ bool AdvancedEngine_IOperations::GetFacesOnSurf
|
||||
return false;
|
||||
}
|
||||
Standard_Integer iWrn = aFinder.WarningStatus();
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iWrn) {
|
||||
MESSAGE(" *** iWrn : " << iWrn);
|
||||
}
|
||||
|
@ -26,9 +26,9 @@
|
||||
#include "GEOM_Function.hxx"
|
||||
#include "GEOM_IOperations.hxx"
|
||||
#include "GEOMUtils.hxx"
|
||||
#include "GEOMAlgo_FinderShapeOn1.hxx"
|
||||
#include "GEOMAlgo_FinderShapeOn2.hxx"
|
||||
#include "GEOMAlgo_ClsfBox.hxx"
|
||||
#include "GEOMAlgo_ClsfSurf.hxx"
|
||||
#include "GEOMAlgo_Splitter.hxx"
|
||||
|
||||
#include "Geom_CylindricalSurface.hxx"
|
||||
@ -127,7 +127,7 @@ AdvancedEngine_PipeTShapeDriver::GetShapesOnBoxIDs(const TopoDS_Shape& aBox,
|
||||
|
||||
// Interprete results
|
||||
Standard_Integer iErr = aFinder.ErrorStatus();
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iErr) {
|
||||
TCollection_AsciiString aMsg (" iErr : ");
|
||||
aMsg += TCollection_AsciiString(iErr);
|
||||
@ -185,12 +185,14 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
}
|
||||
|
||||
// Call algo
|
||||
GEOMAlgo_FinderShapeOn1 aFinder;
|
||||
GEOMAlgo_FinderShapeOn2 aFinder;
|
||||
Handle(GEOMAlgo_ClsfSurf) aClsfSurf = new GEOMAlgo_ClsfSurf;
|
||||
Standard_Real aTol = 1e-6;
|
||||
|
||||
aClsfSurf->SetSurface(theSurface);
|
||||
aFinder.SetShape(theShape);
|
||||
aFinder.SetTolerance(aTol);
|
||||
aFinder.SetSurface(theSurface);
|
||||
aFinder.SetClsf(aClsfSurf);
|
||||
aFinder.SetShapeType(theShapeType);
|
||||
aFinder.SetState(theState);
|
||||
|
||||
@ -208,7 +210,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
|
||||
// Interprete results
|
||||
Standard_Integer iErr = aFinder.ErrorStatus();
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iErr) {
|
||||
// MESSAGE(" iErr : " << iErr);
|
||||
TCollection_AsciiString aMsg (" iErr : ");
|
||||
@ -217,7 +219,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
return aSeqOfIDs;
|
||||
}
|
||||
// Standard_Integer iWrn = aFinder.WarningStatus();
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
// if (iWrn) {
|
||||
// MESSAGE(" *** iWrn : " << iWrn);
|
||||
// }
|
||||
|
@ -51,6 +51,7 @@ SET(GEOMAlgo_HEADERS
|
||||
GEOMAlgo_BuilderShape.hxx
|
||||
GEOMAlgo_Clsf.hxx
|
||||
GEOMAlgo_ClsfBox.hxx
|
||||
GEOMAlgo_ClsfQuad.hxx
|
||||
GEOMAlgo_ClsfSolid.hxx
|
||||
GEOMAlgo_ClsfSurf.hxx
|
||||
GEOMAlgo_CoupleOfShapes.hxx
|
||||
@ -58,10 +59,7 @@ SET(GEOMAlgo_HEADERS
|
||||
GEOMAlgo_DataMapOfPassKeyInteger.hxx
|
||||
GEOMAlgo_DataMapOfShapeMapOfShape.hxx
|
||||
GEOMAlgo_DataMapOfShapePnt.hxx
|
||||
GEOMAlgo_FinderShapeOn.hxx
|
||||
GEOMAlgo_FinderShapeOn1.hxx
|
||||
GEOMAlgo_FinderShapeOn2.hxx
|
||||
GEOMAlgo_FinderShapeOnQuad.hxx
|
||||
GEOMAlgo_GetInPlace.hxx
|
||||
GEOMAlgo_GetInPlaceAPI.hxx
|
||||
GEOMAlgo_GlueAnalyser.hxx
|
||||
@ -116,13 +114,11 @@ SET(GEOMAlgo_SOURCES
|
||||
GEOMAlgo_BuilderShape.cxx
|
||||
GEOMAlgo_Clsf.cxx
|
||||
GEOMAlgo_ClsfBox.cxx
|
||||
GEOMAlgo_ClsfQuad.cxx
|
||||
GEOMAlgo_ClsfSolid.cxx
|
||||
GEOMAlgo_ClsfSurf.cxx
|
||||
GEOMAlgo_CoupleOfShapes.cxx
|
||||
GEOMAlgo_FinderShapeOn.cxx
|
||||
GEOMAlgo_FinderShapeOn1.cxx
|
||||
GEOMAlgo_FinderShapeOn2.cxx
|
||||
GEOMAlgo_FinderShapeOnQuad.cxx
|
||||
GEOMAlgo_GetInPlace.cxx
|
||||
GEOMAlgo_GetInPlace_1.cxx
|
||||
GEOMAlgo_GetInPlace_2.cxx
|
||||
|
@ -16,24 +16,20 @@ GEOMAlgo_SolidSolid.hxx
|
||||
GEOMAlgo_SolidSolid.cxx
|
||||
GEOMAlgo_ShapeAlgo.hxx
|
||||
GEOMAlgo_ShapeAlgo.cxx
|
||||
GEOMAlgo_FinderShapeOn.hxx
|
||||
GEOMAlgo_FinderShapeOn.cxx
|
||||
GEOMAlgo_FinderShapeOn1.hxx
|
||||
GEOMAlgo_FinderShapeOn1.cxx
|
||||
GEOMAlgo_HAlgo.hxx
|
||||
GEOMAlgo_HAlgo.cxx
|
||||
GEOMAlgo_Clsf.hxx
|
||||
GEOMAlgo_Clsf.cxx
|
||||
GEOMAlgo_ClsfBox.hxx
|
||||
GEOMAlgo_ClsfBox.cxx
|
||||
GEOMAlgo_ClsfQuad.hxx
|
||||
GEOMAlgo_ClsfQuad.cxx
|
||||
GEOMAlgo_ClsfSolid.hxx
|
||||
GEOMAlgo_ClsfSolid.cxx
|
||||
GEOMAlgo_ClsfSurf.hxx
|
||||
GEOMAlgo_ClsfSurf.cxx
|
||||
GEOMAlgo_FinderShapeOn2.hxx
|
||||
GEOMAlgo_FinderShapeOn2.cxx
|
||||
GEOMAlgo_FinderShapeOnQuad.hxx
|
||||
GEOMAlgo_FinderShapeOnQuad.cxx
|
||||
GEOMAlgo_Gluer.hxx
|
||||
GEOMAlgo_Gluer.cxx
|
||||
GEOMAlgo_GlueAnalyser.hxx
|
||||
|
219
src/GEOMAlgo/GEOMAlgo_ClsfQuad.cxx
Normal file
219
src/GEOMAlgo/GEOMAlgo_ClsfQuad.cxx
Normal file
@ -0,0 +1,219 @@
|
||||
// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
|
||||
//
|
||||
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 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
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
||||
//
|
||||
|
||||
// File: GEOMAlgo_ClsfQuad.cxx
|
||||
// Created: Fri Feb 13 16:03:19 2015
|
||||
// Author: Sergey KHROMOV
|
||||
//
|
||||
|
||||
|
||||
#include <GEOMAlgo_ClsfQuad.hxx>
|
||||
#include <GEOMAlgo_SurfaceTools.hxx>
|
||||
|
||||
#include <Geom_Plane.hxx>
|
||||
|
||||
|
||||
IMPLEMENT_STANDARD_HANDLE(GEOMAlgo_ClsfQuad, GEOMAlgo_Clsf);
|
||||
IMPLEMENT_STANDARD_RTTIEXT(GEOMAlgo_ClsfQuad, GEOMAlgo_Clsf);
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
GEOMAlgo_ClsfQuad::GEOMAlgo_ClsfQuad()
|
||||
: GEOMAlgo_Clsf(),
|
||||
myQuadNormal(0., 0., 0.)
|
||||
{
|
||||
}
|
||||
//=======================================================================
|
||||
//function : ~
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
GEOMAlgo_ClsfQuad::~GEOMAlgo_ClsfQuad()
|
||||
{
|
||||
}
|
||||
//=======================================================================
|
||||
//function : SetCorners
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GEOMAlgo_ClsfQuad::SetCorners(const gp_Pnt &theTopLeftPoint,
|
||||
const gp_Pnt &theTopRigthPoint,
|
||||
const gp_Pnt &theBottomLeftPoint,
|
||||
const gp_Pnt &theBottomRigthPoint)
|
||||
{
|
||||
myPoints.resize(6);
|
||||
myPoints[0] = theTopLeftPoint;
|
||||
myPoints[1] = theTopRigthPoint;
|
||||
myPoints[2] = theBottomRigthPoint;
|
||||
myPoints[3] = theBottomLeftPoint;
|
||||
myPoints[4] = myPoints[0];
|
||||
myPoints[5] = myPoints[1];
|
||||
|
||||
// Find plane normal defined by corner points, it will be used to define
|
||||
// a plane for each quadrangle side.
|
||||
myQuadNormal.SetCoord (0., 0., 0.);
|
||||
|
||||
for ( int i = 1; i <= 4; ++i ) {
|
||||
myQuadNormal +=
|
||||
gp_Vec(myPoints[i], myPoints[i+1]) ^ gp_Vec(myPoints[i], myPoints[i-1]);
|
||||
}
|
||||
|
||||
if (myQuadNormal.SquareMagnitude() <= DBL_MIN) {
|
||||
return;
|
||||
}
|
||||
|
||||
// detect concave quadrangle sides
|
||||
myConcaveQuad = false;
|
||||
myConcaveSide.resize (4, false);
|
||||
|
||||
for ( int i = 1; i <= 4; ++i ) {
|
||||
gp_Vec localQN =
|
||||
gp_Vec(myPoints[i], myPoints[i+1]) ^ gp_Vec(myPoints[i], myPoints[i-1]);
|
||||
|
||||
if (myQuadNormal * localQN < 0) {
|
||||
myConcaveSide[i-1] = myConcaveSide[i] = myConcaveQuad = true;
|
||||
}
|
||||
}
|
||||
|
||||
// loop on quadrangle sides
|
||||
myPlanes.reserve( 4 );
|
||||
|
||||
for ( int i = 0; i < 4; ++i ) {
|
||||
// point1 -> point2 vector
|
||||
gp_Vec aSideVec( myPoints[ i ], myPoints[ i + 1 ]);
|
||||
|
||||
// plane normal
|
||||
gp_Vec aSideNorm = aSideVec ^ myQuadNormal;
|
||||
if (aSideNorm.SquareMagnitude() <= DBL_MIN) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// make plane
|
||||
Handle(Geom_Plane) aPlane = new Geom_Plane(myPoints[i], aSideNorm);
|
||||
|
||||
myPlanes.push_back(GeomAdaptor_Surface());
|
||||
myPlanes.back().Load( aPlane );
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetCorners
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GEOMAlgo_ClsfQuad::GetCorners(gp_Pnt &theTopLeftPoint,
|
||||
gp_Pnt &theTopRigthPoint,
|
||||
gp_Pnt &theBottomLeftPoint,
|
||||
gp_Pnt &theBottomRigthPoint) const
|
||||
{
|
||||
if (myPoints.size() == 6) {
|
||||
theTopLeftPoint = myPoints[0];
|
||||
theTopRigthPoint = myPoints[1];
|
||||
theBottomLeftPoint = myPoints[3];
|
||||
theBottomRigthPoint = myPoints[2];
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : CheckData
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GEOMAlgo_ClsfQuad::CheckData()
|
||||
{
|
||||
|
||||
if (myQuadNormal.SquareMagnitude() <= DBL_MIN) {
|
||||
myErrorStatus = 10; // undefined quadrangle normal.
|
||||
return;
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
//function : Perform
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void GEOMAlgo_ClsfQuad::Perform()
|
||||
{
|
||||
myErrorStatus=0;
|
||||
//
|
||||
// Return IN if aP has TopAbs_IN with all sides.
|
||||
// In the case of concave quadrangle, return IN if
|
||||
// aP is OUT of only one concave side
|
||||
double nbIn = 0.;
|
||||
|
||||
for (size_t i = 0; i < myPlanes.size(); ++i) {
|
||||
TopAbs_State aSt;
|
||||
|
||||
GEOMAlgo_SurfaceTools::GetState(myPnt, myPlanes[i], myTolerance, aSt);
|
||||
|
||||
if (aSt == TopAbs_IN) {
|
||||
nbIn += myConcaveSide[i] ? 0.5 : 1.0;
|
||||
} else if (aSt == TopAbs_ON) {
|
||||
// check that aP is between quadrangle corners
|
||||
Handle(Geom_Plane) aSidePlane =
|
||||
Handle(Geom_Plane)::DownCast(myPlanes[i].Surface());
|
||||
gp_Vec aSideNorm = aSidePlane->Axis().Direction();
|
||||
gp_Vec aSideVec = myQuadNormal ^ aSideNorm;
|
||||
gp_Vec c1p (myPoints[i], myPnt);
|
||||
gp_Vec pc2 (myPnt, myPoints[i+1]);
|
||||
|
||||
if (aSideVec * c1p >= 0. && aSideVec * pc2 >= 0.) {
|
||||
myState = TopAbs_ON;
|
||||
return;
|
||||
}
|
||||
// consider to be IN (???????????)
|
||||
//nbIn += myConcaveSide[i] ? 0.5 : 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
Standard_Real inThreshold = myPlanes.size(); // usually 4.0
|
||||
|
||||
if (myConcaveQuad) {
|
||||
inThreshold = 2.5; // 1.0 + 1.0 + 0.5
|
||||
}
|
||||
|
||||
if (nbIn >= inThreshold) {
|
||||
myState = TopAbs_IN;
|
||||
} else {
|
||||
myState = TopAbs_OUT;
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
//function : CanBeON
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean GEOMAlgo_ClsfQuad::CanBeON(const Handle(Geom_Curve)& aC) const
|
||||
{
|
||||
return GEOMAlgo_Clsf::CanBeON(aC);
|
||||
}
|
||||
//=======================================================================
|
||||
//function : CanBeON
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean GEOMAlgo_ClsfQuad::CanBeON(const Handle(Geom_Surface)& aS1) const
|
||||
{
|
||||
GeomAdaptor_Surface aGAS1;
|
||||
|
||||
aGAS1.Load(aS1);
|
||||
|
||||
GeomAbs_SurfaceType aST1 = aGAS1.GetType();
|
||||
Standard_Boolean bRet = (aST1 == GeomAbs_Plane);
|
||||
|
||||
return bRet;
|
||||
}
|
92
src/GEOMAlgo/GEOMAlgo_ClsfQuad.hxx
Normal file
92
src/GEOMAlgo/GEOMAlgo_ClsfQuad.hxx
Normal file
@ -0,0 +1,92 @@
|
||||
// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
|
||||
//
|
||||
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 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
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
||||
//
|
||||
|
||||
// File: GEOMAlgo_ClsfQuad.hxx
|
||||
// Created: Fri Feb 13 16:03:19 2015
|
||||
// Author: Sergey KHROMOV
|
||||
//
|
||||
//
|
||||
#ifndef _GEOMAlgo_ClsfQuad_HeaderFile
|
||||
#define _GEOMAlgo_ClsfQuad_HeaderFile
|
||||
|
||||
|
||||
#include <GEOMAlgo_Clsf.hxx>
|
||||
|
||||
#include <GeomAdaptor_Surface.hxx>
|
||||
#include <Standard_DefineHandle.hxx>
|
||||
|
||||
#include <vector>
|
||||
|
||||
|
||||
DEFINE_STANDARD_HANDLE(GEOMAlgo_ClsfQuad, GEOMAlgo_Clsf)
|
||||
|
||||
//=======================================================================
|
||||
// class : GEOMAlgo_ClsfQuad
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
class GEOMAlgo_ClsfQuad : public GEOMAlgo_Clsf
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
Standard_EXPORT
|
||||
GEOMAlgo_ClsfQuad();
|
||||
|
||||
Standard_EXPORT
|
||||
virtual ~GEOMAlgo_ClsfQuad();
|
||||
|
||||
Standard_EXPORT
|
||||
void SetCorners(const gp_Pnt &theTopLeftPoint,
|
||||
const gp_Pnt &theTopRigthPoint,
|
||||
const gp_Pnt &theBottomLeftPoint,
|
||||
const gp_Pnt &theBottomRigthPoint);
|
||||
|
||||
Standard_EXPORT
|
||||
void GetCorners(gp_Pnt &theTopLeftPoint,
|
||||
gp_Pnt &theTopRigthPoint,
|
||||
gp_Pnt &theBottomLeftPoint,
|
||||
gp_Pnt &theBottomRigthPoint) const;
|
||||
|
||||
Standard_EXPORT
|
||||
virtual void Perform();
|
||||
|
||||
Standard_EXPORT
|
||||
virtual void CheckData();
|
||||
|
||||
Standard_EXPORT
|
||||
virtual Standard_Boolean CanBeON(const Handle(Geom_Curve)& aC) const;
|
||||
|
||||
Standard_EXPORT
|
||||
virtual Standard_Boolean CanBeON(const Handle(Geom_Surface)& aST) const;
|
||||
|
||||
DEFINE_STANDARD_RTTI(GEOMAlgo_ClsfQuad);
|
||||
|
||||
protected:
|
||||
|
||||
bool myConcaveQuad;
|
||||
std::vector<bool> myConcaveSide;
|
||||
std::vector<gp_Pnt> myPoints;
|
||||
std::vector<GeomAdaptor_Surface> myPlanes;
|
||||
gp_Vec myQuadNormal;
|
||||
|
||||
};
|
||||
#endif
|
@ -26,75 +26,54 @@
|
||||
// <pkv@irinox>
|
||||
//
|
||||
#include <GEOMAlgo_FinderShapeOn2.hxx>
|
||||
#include <math.h>
|
||||
|
||||
#include <Basics_OCCTVersion.hxx>
|
||||
|
||||
#include <Precision.hxx>
|
||||
#include <TColStd_Array1OfInteger.hxx>
|
||||
#include <TColStd_MapOfInteger.hxx>
|
||||
|
||||
#include <gp_Trsf.hxx>
|
||||
#include <gp_Cylinder.hxx>
|
||||
#include <gp_Pnt.hxx>
|
||||
|
||||
#include <TColgp_Array1OfPnt.hxx>
|
||||
|
||||
#include <Poly_Array1OfTriangle.hxx>
|
||||
#include <Poly_Triangle.hxx>
|
||||
#include <Poly_PolygonOnTriangulation.hxx>
|
||||
#include <Poly_Triangulation.hxx>
|
||||
#include <Poly_Polygon3D.hxx>
|
||||
#include <GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger.hxx>
|
||||
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
||||
#include <GEOMAlgo_ListIteratorOfListOfPnt.hxx>
|
||||
#include <GEOMAlgo_PassKey.hxx>
|
||||
#include <GEOMAlgo_StateCollector.hxx>
|
||||
#include <GEOMAlgo_SurfaceTools.hxx>
|
||||
|
||||
#include <Bnd_Box.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <BRepBndLib.hxx>
|
||||
#include <BRepMesh_IncrementalMesh.hxx>
|
||||
#include <BRepTools.hxx>
|
||||
#include <Geom_Curve.hxx>
|
||||
#include <Geom_Surface.hxx>
|
||||
#include <GeomAdaptor_Surface.hxx>
|
||||
#include <GeomAbs_SurfaceType.hxx>
|
||||
#include <GeomAdaptor_Curve.hxx>
|
||||
#include <GeomAbs_CurveType.hxx>
|
||||
|
||||
#include <TopAbs_State.hxx>
|
||||
|
||||
#include <TopLoc_Location.hxx>
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopoDS_Shape.hxx>
|
||||
#include <TopoDS_Vertex.hxx>
|
||||
#include <TopoDS_Face.hxx>
|
||||
#include <TopoDS_Edge.hxx>
|
||||
|
||||
#include <TopExp.hxx>
|
||||
#include <TopExp_Explorer.hxx>
|
||||
|
||||
#include <TopTools_IndexedMapOfShape.hxx>
|
||||
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <BRepLib_MakeEdge.hxx>
|
||||
|
||||
#include <GEOMAlgo_ListIteratorOfListOfPnt.hxx>
|
||||
#include <GEOMAlgo_SurfaceTools.hxx>
|
||||
#include <GEOMAlgo_StateCollector.hxx>
|
||||
#include <GEOMAlgo_FinderShapeOn.hxx>
|
||||
|
||||
#include <GEOMAlgo_PassKey.hxx>
|
||||
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
||||
#include <GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger.hxx>
|
||||
//
|
||||
#include <gp_Dir2d.hxx>
|
||||
#include <gp_Pnt2d.hxx>
|
||||
#include <Geom2d_Line.hxx>
|
||||
#include <Geom2dAdaptor_Curve.hxx>
|
||||
#include <Geom2dHatch_Hatcher.hxx>
|
||||
#include <TColStd_ListOfInteger.hxx>
|
||||
#include <TColStd_ListIteratorOfListOfInteger.hxx>
|
||||
#include <gp_Dir2d.hxx>
|
||||
#include <gp_Pnt2d.hxx>
|
||||
#include <gp_Pnt.hxx>
|
||||
#include <gp_Trsf.hxx>
|
||||
#include <HatchGen_Domain.hxx>
|
||||
#include <Geom2dHatch_Hatcher.hxx>
|
||||
#include <IntTools_Tools.hxx>
|
||||
#include <Poly_Array1OfTriangle.hxx>
|
||||
#include <Poly_Polygon3D.hxx>
|
||||
#include <Poly_PolygonOnTriangulation.hxx>
|
||||
#include <Poly_Triangle.hxx>
|
||||
#include <Poly_Triangulation.hxx>
|
||||
#include <Precision.hxx>
|
||||
#include <TColgp_Array1OfPnt.hxx>
|
||||
#include <TColStd_Array1OfInteger.hxx>
|
||||
#include <TColStd_MapOfInteger.hxx>
|
||||
#include <TopAbs_State.hxx>
|
||||
#include <TopExp.hxx>
|
||||
#include <TopExp_Explorer.hxx>
|
||||
#include <TopLoc_Location.hxx>
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopoDS_Edge.hxx>
|
||||
#include <TopoDS_Face.hxx>
|
||||
#include <TopoDS_Shape.hxx>
|
||||
#include <TopoDS_Vertex.hxx>
|
||||
#include <TopTools_IndexedMapOfShape.hxx>
|
||||
|
||||
#if OCC_VERSION_LARGE > 0x06070100
|
||||
#include <IntTools_Context.hxx>
|
||||
#else
|
||||
#include <BOPInt_Context.hxx>
|
||||
#endif
|
||||
#include <BRepTools.hxx>
|
||||
#include <IntTools_Tools.hxx>
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
@ -626,7 +605,7 @@ void GEOMAlgo_FinderShapeOn2::InnerPoints(const TopoDS_Face& aF,
|
||||
//
|
||||
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||
if (aTRF.IsNull()) {
|
||||
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aF)) {
|
||||
if (!BuildTriangulation(aF)) {
|
||||
myWarningStatus=20; // no triangulation found
|
||||
return;
|
||||
}
|
||||
@ -770,7 +749,7 @@ void GEOMAlgo_FinderShapeOn2::InnerPoints(const TopoDS_Edge& aE,
|
||||
if (aTRE.IsNull() || aPTE.IsNull()) {
|
||||
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
||||
if (aPE.IsNull()) {
|
||||
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aE)) {
|
||||
if (!BuildTriangulation(aE)) {
|
||||
myErrorStatus=20; // no triangulation found
|
||||
return;
|
||||
}
|
||||
@ -841,6 +820,59 @@ void GEOMAlgo_FinderShapeOn2::InnerPoints(const TopoDS_Edge& aE,
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : BuildTriangulation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean
|
||||
GEOMAlgo_FinderShapeOn2::BuildTriangulation (const TopoDS_Shape& theShape)
|
||||
{
|
||||
// calculate deflection
|
||||
Standard_Real aDeviationCoefficient = 0.001;
|
||||
|
||||
Bnd_Box B;
|
||||
BRepBndLib::Add(theShape, B);
|
||||
Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
|
||||
B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
|
||||
|
||||
Standard_Real dx = aXmax - aXmin, dy = aYmax - aYmin, dz = aZmax - aZmin;
|
||||
Standard_Real aDeflection = Max(Max(dx, dy), dz) * aDeviationCoefficient * 4;
|
||||
Standard_Real aHLRAngle = 0.349066;
|
||||
|
||||
// build triangulation
|
||||
BRepMesh_IncrementalMesh Inc (theShape, aDeflection, Standard_False, aHLRAngle);
|
||||
|
||||
// check triangulation
|
||||
bool isTriangulation = true;
|
||||
|
||||
TopExp_Explorer exp (theShape, TopAbs_FACE);
|
||||
if (exp.More())
|
||||
{
|
||||
TopLoc_Location aTopLoc;
|
||||
Handle(Poly_Triangulation) aTRF;
|
||||
aTRF = BRep_Tool::Triangulation(TopoDS::Face(exp.Current()), aTopLoc);
|
||||
if (aTRF.IsNull()) {
|
||||
isTriangulation = false;
|
||||
}
|
||||
}
|
||||
else // no faces, try edges
|
||||
{
|
||||
TopExp_Explorer expe (theShape, TopAbs_EDGE);
|
||||
if (!expe.More()) {
|
||||
isTriangulation = false;
|
||||
}
|
||||
else {
|
||||
TopLoc_Location aLoc;
|
||||
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(TopoDS::Edge(expe.Current()), aLoc);
|
||||
if (aPE.IsNull()) {
|
||||
isTriangulation = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return isTriangulation;
|
||||
}
|
||||
|
||||
//
|
||||
// myErrorStatus :
|
||||
//
|
||||
@ -854,60 +886,3 @@ void GEOMAlgo_FinderShapeOn2::InnerPoints(const TopoDS_Edge& aE,
|
||||
// 40- point can not be classified
|
||||
// 41- invalid data for classifier
|
||||
// 42- can not compute hatching
|
||||
|
||||
/*
|
||||
// A
|
||||
if (!aNb && myNbPntsMin) {
|
||||
// try to fill it yourself
|
||||
Standard_Boolean bIsDone;
|
||||
Standard_Integer aN1, aN2;
|
||||
Handle(Geom_Surface) aS;
|
||||
GeomAdaptor_Surface aGAS;
|
||||
GeomAbs_SurfaceType aType;
|
||||
//
|
||||
aS=BRep_Tool::Surface(aF);
|
||||
aGAS.Load(aS);
|
||||
aType=aGAS.GetType();
|
||||
if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder) {
|
||||
// inner links
|
||||
aNbLinks=aMPKI.Extent();
|
||||
aIt.Initialize(aMPKI);
|
||||
for (; aIt.More(); aIt.Next()) {
|
||||
iCnt=aIt.Value();
|
||||
if (iCnt>1) {
|
||||
// take the first having occured inner link
|
||||
// and discretize it
|
||||
const GEOMAlgo_PassKey& aPK=aIt.Key();
|
||||
//
|
||||
aN1=(Standard_Integer)aPK.Id(1);
|
||||
aN2=(Standard_Integer)aPK.Id(2);
|
||||
//
|
||||
aP1=aNodes(aN1).Transformed(aTrsf);
|
||||
aP2=aNodes(aN2).Transformed(aTrsf);
|
||||
//
|
||||
if (aType==GeomAbs_Cylinder) {
|
||||
gp_Cylinder aCyl;
|
||||
//
|
||||
aCyl=aGAS.Cylinder();
|
||||
if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, myTolerance)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//
|
||||
BRepLib_MakeEdge aBME(aP1, aP2);
|
||||
bIsDone=aBME.IsDone();
|
||||
if (!bIsDone) {
|
||||
myErrorStatus=30; //can not obtain the line fron the link
|
||||
return;
|
||||
}
|
||||
//
|
||||
const TopoDS_Shape& aSx=aBME.Shape();
|
||||
const TopoDS_Edge& aE=TopoDS::Edge(aSx);
|
||||
//
|
||||
InnerPoints(aE, myNbPntsMin, aLP);
|
||||
break;
|
||||
}// if (iCnt>1)
|
||||
}// for (; aIt.More(); aIt.Next())
|
||||
}// if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder)
|
||||
}// if (!aNb && myNbPntsMin) {
|
||||
*/
|
||||
|
@ -126,6 +126,9 @@ protected:
|
||||
const Standard_Integer aNbPnts,
|
||||
GEOMAlgo_ListOfPnt& aLP) ;
|
||||
|
||||
Standard_EXPORT
|
||||
Standard_Boolean BuildTriangulation(const TopoDS_Shape& aS) ;
|
||||
|
||||
|
||||
TopAbs_ShapeEnum myShapeType;
|
||||
GEOMAlgo_State myState;
|
||||
|
@ -54,9 +54,9 @@
|
||||
#include "GEOMUtils.hxx"
|
||||
|
||||
#include "GEOMAlgo_ClsfBox.hxx"
|
||||
#include "GEOMAlgo_ClsfQuad.hxx"
|
||||
#include "GEOMAlgo_ClsfSolid.hxx"
|
||||
#include "GEOMAlgo_FinderShapeOn1.hxx"
|
||||
#include "GEOMAlgo_FinderShapeOnQuad.hxx"
|
||||
#include "GEOMAlgo_ClsfSurf.hxx"
|
||||
#include "GEOMAlgo_FinderShapeOn2.hxx"
|
||||
#include "GEOMAlgo_GetInPlace.hxx"
|
||||
#include "GEOMAlgo_GetInPlaceAPI.hxx"
|
||||
@ -2636,7 +2636,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
|
||||
// Interprete results
|
||||
Standard_Integer iErr = aFinder.ErrorStatus();
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iErr) {
|
||||
MESSAGE(" iErr : " << iErr);
|
||||
TCollection_AsciiString aMsg (" iErr : ");
|
||||
@ -2645,7 +2645,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
return aSeqOfIDs;
|
||||
}
|
||||
Standard_Integer iWrn = aFinder.WarningStatus();
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iWrn) {
|
||||
MESSAGE(" *** iWrn : " << iWrn);
|
||||
}
|
||||
@ -2803,7 +2803,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
|
||||
// Interprete results
|
||||
Standard_Integer iErr = aFinder.ErrorStatus();
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iErr) {
|
||||
if (iErr == 41) {
|
||||
SetErrorCode("theCheckShape must be a solid");
|
||||
@ -2817,7 +2817,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
return aSeqOfIDs;
|
||||
}
|
||||
Standard_Integer iWrn = aFinder.WarningStatus();
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iWrn) {
|
||||
MESSAGE(" *** iWrn : " << iWrn);
|
||||
}
|
||||
@ -3074,13 +3074,14 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
// END: Mantis issue 0020961
|
||||
|
||||
// Call algo
|
||||
GEOMAlgo_FinderShapeOn1 aFinder;
|
||||
//Standard_Real aTol = 0.0001; // default value
|
||||
GEOMAlgo_FinderShapeOn2 aFinder;
|
||||
Handle(GEOMAlgo_ClsfSurf) aClsfSurf = new GEOMAlgo_ClsfSurf;
|
||||
Standard_Real aTol = VertMax; // Mantis issue 0020961
|
||||
|
||||
aClsfSurf->SetSurface(theSurface);
|
||||
aFinder.SetShape(theShape);
|
||||
aFinder.SetTolerance(aTol);
|
||||
aFinder.SetSurface(theSurface);
|
||||
aFinder.SetClsf(aClsfSurf);
|
||||
aFinder.SetShapeType(theShapeType);
|
||||
aFinder.SetState(theState);
|
||||
|
||||
@ -3098,7 +3099,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
|
||||
// Interprete results
|
||||
Standard_Integer iErr = aFinder.ErrorStatus();
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iErr) {
|
||||
MESSAGE(" iErr : " << iErr);
|
||||
TCollection_AsciiString aMsg (" iErr : ");
|
||||
@ -3107,7 +3108,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
return aSeqOfIDs;
|
||||
}
|
||||
Standard_Integer iWrn = aFinder.WarningStatus();
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iWrn) {
|
||||
MESSAGE(" *** iWrn : " << iWrn);
|
||||
}
|
||||
@ -3985,12 +3986,15 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
gp_Pnt aPntBL = BRep_Tool::Pnt(TopoDS::Vertex(aBL));
|
||||
gp_Pnt aPntBR = BRep_Tool::Pnt(TopoDS::Vertex(aBR));
|
||||
|
||||
GEOMAlgo_FinderShapeOnQuad aFinder( aPntTL, aPntTR, aPntBL, aPntBR );
|
||||
GEOMAlgo_FinderShapeOn2 aFinder;
|
||||
Handle(GEOMAlgo_ClsfQuad) aClsfQuad = new GEOMAlgo_ClsfQuad;
|
||||
|
||||
Standard_Real aTol = 0.0001; // default value
|
||||
|
||||
aClsfQuad->SetCorners(aPntTL, aPntTR, aPntBL, aPntBR);
|
||||
aFinder.SetShape(aShape);
|
||||
aFinder.SetTolerance(aTol);
|
||||
//aFinder.SetSurface(theSurface);
|
||||
aFinder.SetClsf(aClsfQuad);
|
||||
aFinder.SetShapeType(aShapeType);
|
||||
aFinder.SetState(theState);
|
||||
|
||||
@ -4008,7 +4012,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
|
||||
// Interprete results
|
||||
Standard_Integer iErr = aFinder.ErrorStatus();
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of error codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iErr) {
|
||||
MESSAGE(" iErr : " << iErr);
|
||||
TCollection_AsciiString aMsg (" iErr : ");
|
||||
@ -4017,7 +4021,7 @@ Handle(TColStd_HSequenceOfInteger)
|
||||
return aSeqOfIDs;
|
||||
}
|
||||
Standard_Integer iWrn = aFinder.WarningStatus();
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx
|
||||
// the detailed description of warning codes is in GEOMAlgo_FinderShapeOn2.cxx
|
||||
if (iWrn) {
|
||||
MESSAGE(" *** iWrn : " << iWrn);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user