#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"
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);
// 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 : ");
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);
}
#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"
// 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);
}
// Call algo
- GEOMAlgo_FinderShapeOn1 aFinder;
- Standard_Real aTol = 1e-6;
+ 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);
// 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 : ");
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);
// }
GEOMAlgo_BuilderShape.hxx
GEOMAlgo_Clsf.hxx
GEOMAlgo_ClsfBox.hxx
+ GEOMAlgo_ClsfQuad.hxx
GEOMAlgo_ClsfSolid.hxx
GEOMAlgo_ClsfSurf.hxx
GEOMAlgo_CoupleOfShapes.hxx
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_GlueAnalyser.hxx
GEOMAlgo_GlueDetector.hxx
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
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
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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
// <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 <GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger.hxx>
+#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
+#include <GEOMAlgo_ListIteratorOfListOfPnt.hxx>
+#include <GEOMAlgo_PassKey.hxx>
+#include <GEOMAlgo_StateCollector.hxx>
+#include <GEOMAlgo_SurfaceTools.hxx>
-#include <gp_Trsf.hxx>
-#include <gp_Cylinder.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 <Geom2d_Line.hxx>
+#include <Geom2dAdaptor_Curve.hxx>
+#include <Geom2dHatch_Hatcher.hxx>
+#include <gp_Dir2d.hxx>
+#include <gp_Pnt2d.hxx>
#include <gp_Pnt.hxx>
-
-#include <TColgp_Array1OfPnt.hxx>
-
+#include <gp_Trsf.hxx>
+#include <HatchGen_Domain.hxx>
+#include <IntTools_Tools.hxx>
#include <Poly_Array1OfTriangle.hxx>
-#include <Poly_Triangle.hxx>
+#include <Poly_Polygon3D.hxx>
#include <Poly_PolygonOnTriangulation.hxx>
+#include <Poly_Triangle.hxx>
#include <Poly_Triangulation.hxx>
-#include <Poly_Polygon3D.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 <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 <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 <HatchGen_Domain.hxx>
-#include <Geom2dHatch_Hatcher.hxx>
#if OCC_VERSION_LARGE > 0x06070100
#include <IntTools_Context.hxx>
#else
#include <BOPInt_Context.hxx>
#endif
-#include <BRepTools.hxx>
-#include <IntTools_Tools.hxx>
//=======================================================================
//function :
//
aTRF=BRep_Tool::Triangulation(aF, aLoc);
if (aTRF.IsNull()) {
- if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aF)) {
+ if (!BuildTriangulation(aF)) {
myWarningStatus=20; // no triangulation found
return;
}
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;
}
}
}
+//=======================================================================
+//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 :
//
// 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) {
-*/
const Standard_Integer aNbPnts,
GEOMAlgo_ListOfPnt& aLP) ;
+ Standard_EXPORT
+ Standard_Boolean BuildTriangulation(const TopoDS_Shape& aS) ;
+
TopAbs_ShapeEnum myShapeType;
GEOMAlgo_State myState;
#include "GEOMUtils.hxx"
#include "GEOMAlgo_ClsfBox.hxx"
+#include "GEOMAlgo_ClsfQuad.hxx"
#include "GEOMAlgo_ClsfSolid.hxx"
+#include "GEOMAlgo_ClsfSurf.hxx"
#include "GEOMAlgo_CoupleOfShapes.hxx"
-#include "GEOMAlgo_FinderShapeOn1.hxx"
-#include "GEOMAlgo_FinderShapeOnQuad.hxx"
#include "GEOMAlgo_FinderShapeOn2.hxx"
#include "GEOMAlgo_GetInPlace.hxx"
#include "GEOMAlgo_GlueDetector.hxx"
// 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 : ");
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);
}
// 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");
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);
}
// END: Mantis issue 0020961
// Call algo
- GEOMAlgo_FinderShapeOn1 aFinder;
- //Standard_Real aTol = 0.0001; // default value
- Standard_Real aTol = VertMax; // Mantis issue 0020961
+ 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);
// 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 : ");
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);
}
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);
// 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 : ");
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);
}