GEOMAlgo_DataMapOfShapeMapOfShape.hxx
GEOMAlgo_DataMapOfShapePnt.hxx
GEOMAlgo_Extractor.hxx
- GEOMAlgo_FinderShapeOn.hxx
- GEOMAlgo_FinderShapeOn1.hxx
GEOMAlgo_FinderShapeOn2.hxx
- GEOMAlgo_FinderShapeOnQuad.hxx
GEOMAlgo_GetInPlace.hxx
GEOMAlgo_GetInPlaceAPI.hxx
GEOMAlgo_GlueAnalyser.hxx
#include <BRepTools.hxx>
#include <BRepTools_WireExplorer.hxx>
#include <BRepBndLib.hxx>
-#include <BRepMesh_IncrementalMesh.hxx>
#include <BRepGProp.hxx>
#include <IntTools_Tools.hxx>
//
return 0;
}
-//=======================================================================
-//function : BuildTriangulation
-//purpose :
-//=======================================================================
-Standard_Boolean
- GEOMAlgo_AlgoTools::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;
-}
//=======================================================================
//function : IsCompositeShape
static Standard_Boolean IsCompositeShape(const TopoDS_Shape& aS) ;
- Standard_EXPORT
- static Standard_Boolean BuildTriangulation(const TopoDS_Shape& aS) ;
-
Standard_EXPORT
static Standard_Integer RefineSDShapes
(GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape& aMSD,
+++ /dev/null
-// Copyright (C) 2007-2024 CEA, EDF, 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_FinderShapeOn.cxx
-// Created: Tue Jan 11 14:44:31 2005
-// Author: Peter KURNEV
-
-#include <GEOMAlgo_FinderShapeOn.hxx>
-
-#include <Precision.hxx>
-
-#include <gp_Pnt.hxx>
-
-#include <TopAbs_ShapeEnum.hxx>
-#include <TopAbs_Orientation.hxx>
-
-#include <TopoDS.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TopoDS_Compound.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopoDS_Solid.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Iterator.hxx>
-
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopTools_DataMapOfShapeShape.hxx>
-
-#include <Bnd_Box.hxx>
-#include <BRepBndLib.hxx>
-#include <BRepMesh_IncrementalMesh.hxx>
-
-#include <BRep_Builder.hxx>
-#include <BRep_Tool.hxx>
-
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-
-#include <BRepLib_MakeFace.hxx>
-#include <BRepLib_FaceError.hxx>
-
-
-#include <GEOMAlgo_WireSolid.hxx>
-#include <GEOMAlgo_ShellSolid.hxx>
-#include <GEOMAlgo_VertexSolid.hxx>
-#include <GEOMAlgo_ShapeSolid.hxx>
-#include <GEOMAlgo_SolidSolid.hxx>
-#include <GEOMAlgo_SurfaceTools.hxx>
-#include <GEOMAlgo_AlgoTools.hxx>
-
-#include <BOPAlgo_PaveFiller.hxx>
-#include <BOPCol_ListOfShape.hxx>
-
-//=======================================================================
-//function : GEOMAlgo_FinderShapeOn
-//purpose :
-//=======================================================================
-GEOMAlgo_FinderShapeOn::GEOMAlgo_FinderShapeOn()
-:
- GEOMAlgo_ShapeAlgo()
-{
- myTolerance=0.0001;
- myShapeType=TopAbs_VERTEX;
- myState=GEOMAlgo_ST_UNKNOWN;
- myIsAnalytic=Standard_True;
-}
-//=======================================================================
-//function : ~
-//purpose :
-//=======================================================================
-GEOMAlgo_FinderShapeOn::~GEOMAlgo_FinderShapeOn()
-{
-}
-//=======================================================================
-//function : SetSurface
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::SetSurface(const Handle(Geom_Surface)& aS)
-{
- mySurface=aS;
-}
-//=======================================================================
-//function : Surface
-//purpose :
-//=======================================================================
-const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn::Surface() const
-{
- return mySurface;
-}
-//=======================================================================
-//function : SetShapeType
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::SetShapeType(const TopAbs_ShapeEnum aType)
-{
- myShapeType=aType;
-}
-//=======================================================================
-//function : ShapeType
-//purpose :
-//=======================================================================
-TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn::ShapeType()const
-{
- return myShapeType;
-}
-//=======================================================================
-//function : SetState
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::SetState(const GEOMAlgo_State aState)
-{
- myState=aState;
-}
-//=======================================================================
-//function : State
-//purpose :
-//=======================================================================
-GEOMAlgo_State GEOMAlgo_FinderShapeOn::State() const
-{
- return myState;
-}
-//=======================================================================
-// function: Shapes
-// purpose:
-//=======================================================================
-const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn::Shapes() const
-{
- Standard_Boolean bIsConformState;
- Standard_Integer i, aNb;
- TopAbs_State aSt;
- TopTools_ListOfShape* pL;
- //
- pL=(TopTools_ListOfShape*) &myLS;
- pL->Clear();
- //
- aNb=myMSS.Extent();
- for (i=1; i<=aNb; ++i) {
- const TopoDS_Shape& aS=myMSS.FindKey(i);
- aSt=myMSS.FindFromIndex(i);
- //
- bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
- if (bIsConformState) {
- pL->Append(aS);
- }
- }
- return myLS;
-}
-//=======================================================================
-//function : Perform
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::Perform()
-{
- myErrorStatus=0;
- myWarningStatus=0;
- myLS.Clear();
- myMSS.Clear();
- //
- if (!myResult.IsNull()){
- myResult.Nullify();
- }
- //
- CheckData();
- if(myErrorStatus) {
- return;
- }
- //
- // Initialize the context
- GEOMAlgo_ShapeAlgo::Perform();
- //
- myIsAnalytic=GEOMAlgo_SurfaceTools::IsAnalytic(mySurface);
- //
- MakeArgument1();
- if(myErrorStatus) {
- return;
- }
- //
- if (myIsAnalytic && myShapeType==TopAbs_VERTEX) {
- FindVertices();
- return;
- }
- //
- MakeArgument2();
- if(myErrorStatus) {
- return;
- }
- //
- Find();
- if(myErrorStatus || myWarningStatus) {
- return;
- }
- //
-}
-//=======================================================================
-//function : FindVertices
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::FindVertices()
-{
- Standard_Integer i, aNb, iErr;
- TopAbs_State aSt;
- TopAbs_Orientation aOr;
- gp_Pnt aP;
- TopTools_IndexedMapOfShape aM;
- //
- TopExp::MapShapes(myArg1, TopAbs_FACE, aM);
- const TopoDS_Face& aF=TopoDS::Face(aM(1));
- aOr=aF.Orientation();
- //
- aM.Clear();
- TopExp::MapShapes(myShape, myShapeType, aM);
- aNb=aM.Extent();
- if (!aNb) {
- myWarningStatus=10; // No found sub-shapes of type myShapeType
- return;
- }
- //
- for (i=1; i<=aNb; ++i) {
- const TopoDS_Shape& aS=aM(i);
- const TopoDS_Vertex& aV=TopoDS::Vertex(aS);
- aP=BRep_Tool::Pnt(aV);
- iErr=GEOMAlgo_SurfaceTools::GetState(aP, mySurface, myTolerance, aSt);
- if (aOr==TopAbs_REVERSED) {
- aSt=GEOMAlgo_SurfaceTools::ReverseState(aSt);
- }
- myMSS.Add(aS, aSt);
- }
-}
-//=======================================================================
-//function : Find
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::Find()
-{
- Standard_Integer i, aNb;
- Standard_Boolean bICS;
- TopTools_IndexedMapOfShape aM;
- //
- TopExp::MapShapes(myArg2, myShapeType, aM);
- //
- aNb=aM.Extent();
- if (!aNb) {
- myWarningStatus=10; // No found sub-shapes of type myShapeType
- return;
- }
- //
- bICS=GEOMAlgo_AlgoTools::IsCompositeShape(myArg2);
- if (!bICS || myIsAnalytic) {
- TopoDS_Compound aCmp;
- BRep_Builder aBB;
- //
- aBB.MakeCompound(aCmp);
- for (i=1; i<=aNb; ++i) {
- const TopoDS_Shape& aSi=aM(i);
- aBB.Add(aCmp, aSi);
- }
- //
- aM.Clear();
- aM.Add(aCmp);
- aNb=1;
- }
- //
- for (i=1; i<=aNb; ++i) {
- const TopoDS_Shape& aS=aM(i);
- Find(aS);
- if (myErrorStatus) {
- return;
- }
- }
-}
-//=======================================================================
-//function : Find
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::Find(const TopoDS_Shape& aS)
-{
- myErrorStatus=0;
- //
- Standard_Integer i, iErr;
- TopAbs_State aSts[]={TopAbs_IN, TopAbs_OUT, TopAbs_ON};
- TopTools_ListIteratorOfListOfShape aIt;
- BOPCol_ListOfShape aLS;
- BOPAlgo_PaveFiller aPF;
- //
- // 1. Prepare DSFiller
- aLS.Append(myArg1);
- aLS.Append(aS);
- aPF.SetArguments(aLS);
- //
- aPF.Perform();
- iErr=aPF.ErrorStatus();
- if (iErr) {
- myErrorStatus=31; // PaveFiller is failed
- return;
- }
- //
- // 2. Find shapes
- GEOMAlgo_ShapeSolid* pSS;
- GEOMAlgo_VertexSolid aVXS;
- GEOMAlgo_WireSolid aWRS;
- GEOMAlgo_ShellSolid aSHS;
- GEOMAlgo_SolidSolid aSLS;
- //
- pSS=NULL;
- //
- switch (myShapeType) {
- case TopAbs_VERTEX:
- pSS=&aVXS;
- break;
- case TopAbs_EDGE:
- pSS=&aWRS;
- break;
- case TopAbs_FACE:
- pSS=&aSHS;
- break;
- case TopAbs_SOLID:
- aSLS.SetShape2(myArg2);
- pSS=&aSLS;
- break;
- default:
- myErrorStatus=12; // unallowed sub-shape type
- return;
- }
- //
- pSS->SetFiller(aPF);
- pSS->Perform();
- iErr=pSS->ErrorStatus();
- if (iErr) {
- myErrorStatus=32; // builder ShapeSolid failed
- return;
- }
- //
- for (i=0; i<3; ++i) {
- const TopTools_ListOfShape& aLS=pSS->Shapes(aSts[i]);
- aIt.Initialize(aLS);
- for (; aIt.More(); aIt.Next()) {
- const TopoDS_Shape& aSImage=aIt.Value();
- if (myImages.IsBound(aSImage)) {
- const TopoDS_Shape& aSx=myImages.Find(aSImage);
- myMSS.Add(aSx, aSts[i]);
- }
- else {
- myErrorStatus=33;// can not find original shape
- return;
- }
- }
- }
-}
-//=======================================================================
-//function : MakeArgument1
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::MakeArgument1()
-{
- myErrorStatus=0;
- //
- Standard_Integer i, aNb;
- TopAbs_ShapeEnum aType;
- BRepLib_FaceError aFErr;
- BRepLib_MakeFace aMF;
- TopTools_IndexedMapOfShape aM;
- BRep_Builder aBB;
- TopoDS_Face aFace;
- TopoDS_Shell aSh;
- TopoDS_Solid aSd;
- //
- // Argument 1
- if (!myIsAnalytic) {
- aMF.Init(mySurface, Standard_True, Precision::Confusion());
-
- aFErr=aMF.Error();
- if (aFErr!=BRepLib_FaceDone) {
- myErrorStatus=20; // can not build the face
- return;
- }
- //
- const TopoDS_Shape& aF=aMF.Shape();
- aFace=TopoDS::Face(aF);
- //
- // update tolerances
- aM.Add(aF);
- TopExp::MapShapes(aF, TopAbs_VERTEX, aM);
- TopExp::MapShapes(aF, TopAbs_EDGE, aM);
-
- aNb=aM.Extent();
- for (i=1; i<=aNb; ++i) {
- const TopoDS_Shape& aS=aM(i);
- aType=aS.ShapeType();
- switch (aType) {
- case TopAbs_VERTEX: {
- const TopoDS_Vertex& aVx=TopoDS::Vertex(aS);
- aBB.UpdateVertex(aVx, myTolerance);
- }
- break;
- case TopAbs_EDGE: {
- const TopoDS_Edge& aEx=TopoDS::Edge(aS);
- aBB.UpdateEdge(aEx, myTolerance);
- }
- break;
- case TopAbs_FACE: {
- const TopoDS_Face& aFx=TopoDS::Face(aS);
- aBB.UpdateFace(aFx, myTolerance);
- }
- break;
- default:
- break;
- }
- }
- } //
- else {
- aBB.MakeFace(aFace, mySurface, myTolerance);
- }
- //
- // make solid
- aBB.MakeShell(aSh);
- aBB.Add(aSh, aFace);
- aBB.MakeSolid(aSd);
- aBB.Add(aSd, aSh);
- myArg1=aSd;
-}
-//=======================================================================
-//function : MakeArgument2
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::MakeArgument2()
-{
- myErrorStatus=0;
- //
- TopoDS_Shape aSC;
- TopTools_DataMapOfShapeShape aOriginals;
- //
- myImages.Clear();
- //
- GEOMAlgo_FinderShapeOn::CopySource(myShape, myImages, aOriginals, aSC);
- //
- myArg2=aSC;
-}
-//=======================================================================
-//function : CheckData
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::CheckData()
-{
- myErrorStatus=0;
- //
- if(mySurface.IsNull()) {
- myErrorStatus=10; // mySurface=NULL
- return;
- }
- //
- if (myShape.IsNull()) {
- myErrorStatus=11; // myShape=NULL
- return;
- }
- //
- if (!(myShapeType==TopAbs_VERTEX ||
- myShapeType==TopAbs_EDGE ||
- myShapeType==TopAbs_FACE ||
- myShapeType==TopAbs_SOLID)) {
- myErrorStatus=12; // unallowed sub-shape type
- return;
- }
- //
- if (myState==GEOMAlgo_ST_UNKNOWN ||
- myState==GEOMAlgo_ST_INOUT) {
- myErrorStatus=13; // unallowed state type
- return;
- }
-}
-//
-//=======================================================================
-//function : CopySource
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE,
- TopTools_DataMapOfShapeShape& aImages,
- TopTools_DataMapOfShapeShape& aOriginals,
- TopoDS_Shape& aEx)
-{
- Standard_Boolean bFree;
- TopAbs_ShapeEnum aType;
- Standard_Integer aR;
- BRep_Builder BB;
- TopoDS_Iterator aIt;
- //
- aType=aE.ShapeType();
- //
- if (aOriginals.IsBound(aE)) {
- aEx=aOriginals.ChangeFind(aE);
- return;
- }
- else {
- aEx=aE.EmptyCopied();
- aOriginals.Bind(aE, aEx);
- aImages.Bind(aEx, aE);
- }
- //
- aR=(Standard_Integer)aType+1;
- if (aR>TopAbs_VERTEX) {
- return;
- }
- //
- bFree=aEx.Free();
- aEx.Free(Standard_True);
- //
- aType=(TopAbs_ShapeEnum) aR;
- //
- aIt.Initialize(aE);//, Standard_False);
- for (; aIt.More(); aIt.Next()) {
- const TopoDS_Shape& aV=aIt.Value();
- TopoDS_Shape aVx;
- //
- CopySource (aV, aImages, aOriginals, aVx);
- //
- aVx.Orientation(aV.Orientation());
- BB.Add(aEx, aVx);
- }
- //
- aEx.Free(bFree);
-}
-//
-//=======================================================================
-//function : BuildTriangulation
-//purpose :
-//=======================================================================
-Standard_Boolean
- GEOMAlgo_FinderShapeOn::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 :
-//
-// 10 -mySurface=NULL
-// 11 -myShape=NULL
-// 12 -unallowed type of sub-shapes
-// 13 -unallowed state
-// 20 -can not build the face
-// 30 -wrong args are used for DSFiller
-// 31 -DSFiller failed
-// 32 -builder ShapeSolid failed
-// 33 -can not find original shape
-//
-// myWarningStatus
-//
-// 10 - sub-shapes of type myShapeType can not be fond in myShape
+++ /dev/null
-
-// Copyright (C) 2007-2024 CEA, EDF, 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_FinderShapeOn.hxx
-// Created: Tue Jan 11 14:44:31 2005
-// Author: Peter KURNEV
-
-#ifndef _GEOMAlgo_FinderShapeOn_HeaderFile
-#define _GEOMAlgo_FinderShapeOn_HeaderFile
-
-#include <Standard.hxx>
-#include <Standard_Macro.hxx>
-#include <Standard_Boolean.hxx>
-
-#include <Geom_Surface.hxx>
-
-#include <TopAbs_ShapeEnum.hxx>
-
-#include <TopoDS_Shape.hxx>
-
-#include <TopTools_ListOfShape.hxx>
-#include <TopTools_DataMapOfShapeShape.hxx>
-
-
-#include <GEOMAlgo_State.hxx>
-#include <GEOMAlgo_ShapeAlgo.hxx>
-#include <GEOMAlgo_IndexedDataMapOfShapeState.hxx>
-
-//=======================================================================
-//function : GEOMAlgo_FinderShapeOn
-//purpose :
-//=======================================================================
-class GEOMAlgo_FinderShapeOn : public GEOMAlgo_ShapeAlgo
-{
- public:
- Standard_EXPORT
- GEOMAlgo_FinderShapeOn();
-
- Standard_EXPORT
- virtual ~GEOMAlgo_FinderShapeOn();
-
- Standard_EXPORT
- virtual void Perform() ;
-
- Standard_EXPORT
- void SetSurface(const Handle(Geom_Surface)& aS) ;
-
- Standard_EXPORT
- void SetShapeType(const TopAbs_ShapeEnum aST) ;
-
- Standard_EXPORT
- void SetState(const GEOMAlgo_State aSF) ;
-
- Standard_EXPORT
- const Handle(Geom_Surface)& Surface() const;
-
- Standard_EXPORT
- TopAbs_ShapeEnum ShapeType() const;
-
- Standard_EXPORT
- GEOMAlgo_State State() const;
-
- Standard_EXPORT
- const TopTools_ListOfShape& Shapes() const;
-
- Standard_EXPORT
- static void CopySource(const TopoDS_Shape& aS,
- TopTools_DataMapOfShapeShape& aImages,
- TopTools_DataMapOfShapeShape& aOriginals,
- TopoDS_Shape& aSC) ;
-
- Standard_EXPORT
- static Standard_Boolean BuildTriangulation(const TopoDS_Shape& aS) ;
-
-protected:
- Standard_EXPORT
- virtual void CheckData() ;
-
- Standard_EXPORT
- void MakeArgument1() ;
-
- Standard_EXPORT
- void MakeArgument2() ;
-
- Standard_EXPORT
- void Find() ;
-
- Standard_EXPORT
- void Find(const TopoDS_Shape& aS) ;
-
- Standard_EXPORT
- void FindVertices() ;
-
-
- Handle(Geom_Surface) mySurface;
- TopAbs_ShapeEnum myShapeType;
- GEOMAlgo_State myState;
- TopoDS_Shape myArg1;
- TopoDS_Shape myArg2;
- TopTools_ListOfShape myLS;
- TopTools_DataMapOfShapeShape myImages;
- GEOMAlgo_IndexedDataMapOfShapeState myMSS;
- Standard_Boolean myIsAnalytic;
-};
-#endif
+++ /dev/null
-// Copyright (C) 2007-2024 CEA, EDF, 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_FinderShapeOn1.cxx
-// Created: Fri Mar 4 10:31:06 2005
-// Author: Peter KURNEV
-
-#include <GEOMAlgo_FinderShapeOn1.hxx>
-
-#include <math.h>
-
-#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 <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_AlgoTools.hxx>
-#include <GEOMAlgo_PassKey.hxx>
-#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
-#include <GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger.hxx>
-
-
-//=======================================================================
-//function : GEOMAlgo_FinderShapeOn1
-//purpose :
-//=======================================================================
-GEOMAlgo_FinderShapeOn1::GEOMAlgo_FinderShapeOn1()
-:
- GEOMAlgo_ShapeAlgo()
-{
- myTolerance=0.0001;
- myShapeType=TopAbs_VERTEX;
- myState=GEOMAlgo_ST_UNKNOWN;
- myNbPntsMin=3;
- myNbPntsMax=0;
-}
-//=======================================================================
-//function : ~
-//purpose :
-//=======================================================================
-GEOMAlgo_FinderShapeOn1::~GEOMAlgo_FinderShapeOn1()
-{
-}
-//=======================================================================
-//function : SetSurface
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::SetSurface(const Handle(Geom_Surface)& aS)
-{
- mySurface=aS;
-}
-//=======================================================================
-//function : Surface
-//purpose :
-//=======================================================================
-const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn1::Surface() const
-{
- return mySurface;
-}
-//=======================================================================
-//function : SetShapeType
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::SetShapeType(const TopAbs_ShapeEnum aType)
-{
- myShapeType=aType;
-}
-//=======================================================================
-//function : ShapeType
-//purpose :
-//=======================================================================
-TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn1::ShapeType()const
-{
- return myShapeType;
-}
-//=======================================================================
-//function : SetState
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::SetState(const GEOMAlgo_State aState)
-{
- myState=aState;
-}
-//=======================================================================
-//function : State
-//purpose :
-//=======================================================================
-GEOMAlgo_State GEOMAlgo_FinderShapeOn1::State() const
-{
- return myState;
-}
-//=======================================================================
-//function : SetNbPntsMin
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::SetNbPntsMin(const Standard_Integer aNb)
-{
- myNbPntsMin=aNb;
-}
-//=======================================================================
-//function : NbPntsMin
-//purpose :
-//=======================================================================
-Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMin()const
-{
- return myNbPntsMin;
-}
-//=======================================================================
-//function : SetNbPntsMax
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::SetNbPntsMax(const Standard_Integer aNb)
-{
- myNbPntsMax=aNb;
-}
-//=======================================================================
-//function : NbPntsMax
-//purpose :
-//=======================================================================
-Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMax()const
-{
- return myNbPntsMax;
-}
-//=======================================================================
-// function: MSS
-// purpose:
-//=======================================================================
-const GEOMAlgo_IndexedDataMapOfShapeState& GEOMAlgo_FinderShapeOn1::MSS() const
-{
- return myMSS;
-}
-//=======================================================================
-// function: Shapes
-// purpose:
-//=======================================================================
-const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn1::Shapes() const
-{
- Standard_Integer i, aNb;
- TopTools_ListOfShape* pL;
- //
- pL=(TopTools_ListOfShape*) &myLS;
- pL->Clear();
- //
- aNb=myMSS.Extent();
- for (i=1; i<=aNb; ++i) {
- const TopoDS_Shape& aS=myMSS.FindKey(i);
- if (aS.ShapeType()==myShapeType) {
- pL->Append(aS);
- }
- }
- return myLS;
-}
-//=======================================================================
-//function : Perform
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::Perform()
-{
- myErrorStatus=0;
- myWarningStatus=0;
- myLS.Clear();
- myMSS.Clear();
- //
- CheckData();
- if(myErrorStatus) {
- return;
- }
- //
- // Initialize the context
- GEOMAlgo_ShapeAlgo::Perform();
- //
- // 1
- ProcessVertices();
- if(myErrorStatus) {
- return;
- }
- if (myShapeType==TopAbs_VERTEX) {
- return;
- }
- //
- // 2
- ProcessEdges();
- if(myErrorStatus) {
- return;
- }
- if (myShapeType==TopAbs_EDGE) {
- return;
- }
- //
- // 3
- ProcessFaces();
- if(myErrorStatus) {
- return;
- }
- if (myShapeType==TopAbs_FACE) {
- return;
- }
- //
- // 4
- ProcessSolids();
- //
-}
-//=======================================================================
-//function : ProcessVertices
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::ProcessVertices()
-{
- myErrorStatus=0;
- //
- Standard_Boolean bIsConformState;
- Standard_Integer i, aNb;
- gp_Pnt aP;
- TopTools_IndexedMapOfShape aM;
- TopAbs_State aSt;
- //
- TopExp::MapShapes(myShape, TopAbs_VERTEX, aM);
- aNb=aM.Extent();
- for (i=1; i<=aNb; ++i) {
- const TopoDS_Vertex& aV=TopoDS::Vertex(aM(i));
- aP=BRep_Tool::Pnt(aV);
- //
- aSt = GetPointState( aP );
- bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
- //
- if (myShapeType==TopAbs_VERTEX){
- if (bIsConformState) {
- myMSS.Add(aV, aSt);
- }
- }
- else if (bIsConformState || aSt==TopAbs_ON) {
- myMSS.Add(aV, aSt);
- }
- }
-}
-//=======================================================================
-//function : ProcessEdges
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::ProcessEdges()
-{
- myErrorStatus=0;
- //
- Standard_Boolean bIsConformState, bIsToBreak;
- Standard_Integer i, aNb, iCnt;
- TopAbs_State aSt;
- TopTools_IndexedMapOfShape aM;
- TopExp_Explorer aExp;
- GEOMAlgo_ListIteratorOfListOfPnt aIt;
- GeomAbs_SurfaceType aType1;
- //
- aType1=myGAS.GetType();
- //
- TopExp::MapShapes(myShape, TopAbs_EDGE, aM);
- //
- bIsConformState=Standard_False;
- //
- aNb=aM.Extent();
- for (i=1; i<=aNb; ++i) {
- GEOMAlgo_ListOfPnt aLP;
- GEOMAlgo_StateCollector aSC;
- //
- const TopoDS_Edge& aE=TopoDS::Edge(aM(i));
- //
- aExp.Init(aE, TopAbs_VERTEX);
- for (; aExp.More(); aExp.Next()) {
- const TopoDS_Shape& aV=aExp.Current();
- //
- bIsConformState=myMSS.Contains(aV);
- if (!bIsConformState) {
- break;// vertex has non-conformed state
- }
- else {
- aSt=myMSS.FindFromKey(aV);
- aSC.AppendState(aSt);
- }
- }
- //
- if (!bIsConformState) {
- continue; // vertex has non-conformed state,skip edge
- }
- //
- if (BRep_Tool::Degenerated(aE)) {
- myMSS.Add(aE, aSt);
- continue;
- }
- //
- if (myState==GEOMAlgo_ST_ON && aType1==GeomAbs_Sphere) {
- Standard_Real aT1, aT2;
- Handle(Geom_Curve) aC;
- GeomAdaptor_Curve aGAC;
- GeomAbs_CurveType aType2;
- //
- aC=BRep_Tool::Curve(aE, aT1, aT2);
- aGAC.Load(aC);
- //
- aType2=aGAC.GetType();
- if (aType2==GeomAbs_Line) {
- continue;
- }
- }
- //
- InnerPoints(aE, aLP);
- if (myErrorStatus) {
- return;
- }
- //
- bIsConformState=Standard_True;
- aIt.Initialize(aLP);
- for (iCnt=0; aIt.More(); aIt.Next(), ++iCnt) {
- if (myNbPntsMax) {
- if (iCnt > myNbPntsMax) {
- break;
- }
- }
- //
- const gp_Pnt& aP=aIt.Value();
- aSt = GetPointState( aP );
- bIsToBreak=aSC.AppendState(aSt);
- if (bIsToBreak) {
- break;
- }
- }
- //
- aSt=aSC.State();
- //
- bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
- if (myShapeType==TopAbs_EDGE) {
- if (bIsConformState) {
- myMSS.Add(aE, aSt);
- }
- }
- else if (bIsConformState || aSt==TopAbs_ON) {
- myMSS.Add(aE, aSt);
- }
- } // for (i=1; i<=aNb; ++i) next edge
-}
-//=======================================================================
-//function : ProcessFaces
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::ProcessFaces()
-{
- myErrorStatus=0;
- //
- Standard_Boolean bIsConformState, bIsToBreak;
- Standard_Integer i, aNbF, iCnt;
- TopAbs_State aSt;
- TopTools_IndexedMapOfShape aM;
- TopExp_Explorer aExp;
- GEOMAlgo_ListIteratorOfListOfPnt aIt;
- GeomAbs_SurfaceType aType1, aType2;
- //
- aType1=myGAS.GetType();
- //
- TopExp::MapShapes(myShape, TopAbs_FACE, aM);
- aNbF=aM.Extent();
- for (i=1; i<=aNbF; ++i) {
- GEOMAlgo_StateCollector aSC;
- GEOMAlgo_ListOfPnt aLP;
- //
- const TopoDS_Face& aF=TopoDS::Face(aM(i));
- //
- if (myState==GEOMAlgo_ST_ON) {
- Handle(Geom_Surface) aS;
- GeomAdaptor_Surface aGAS;
- //
- aS=BRep_Tool::Surface(aF);
- aGAS.Load(aS);
- aType2=aGAS.GetType();
- if (aType2!=aType1) {
- continue;
- }
- }
- //
- bIsConformState=Standard_False;
- //
- aExp.Init(aF, TopAbs_EDGE);
- for (; aExp.More(); aExp.Next()) {
- const TopoDS_Shape& aE=aExp.Current();
- bIsConformState=myMSS.Contains(aE);
- if (!bIsConformState) {
- break;// edge has non-conformed state
- }
- else {
- aSt=myMSS.FindFromKey(aE);
- aSC.AppendState(aSt);
- }
- }
- //
- if (!bIsConformState) {
- continue; // edge has non-conformed state,skip face
- }
- //
- InnerPoints(aF, aLP);
- if (myErrorStatus) {
- return;
- }
- //
- bIsConformState=Standard_True;
- aIt.Initialize(aLP);
- for (iCnt=0; aIt.More(); aIt.Next(), ++iCnt) {
- if (myNbPntsMax) {
- if (iCnt > myNbPntsMax) {
- break;
- }
- }
- //
- const gp_Pnt& aP=aIt.Value();
- aSt = GetPointState( aP );
- bIsToBreak=aSC.AppendState(aSt);
- if (bIsToBreak) {
- break;
- }
- }
- //
- aSt=aSC.State();
- //
- bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
- if (myShapeType==TopAbs_FACE) {
- if (bIsConformState) {
- myMSS.Add(aF, aSt);
- }
- }
- else if (bIsConformState || aSt==TopAbs_ON) {
- myMSS.Add(aF, aSt);
- }
- }// for (i=1; i<=aNb; ++i) next face
-}
-//=======================================================================
-//function : ProcessSolids
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::ProcessSolids()
-{
- myErrorStatus=0;
- //
- Standard_Boolean bIsConformState;
- Standard_Integer i, aNbS, j, aNbF;
- TopTools_IndexedMapOfShape aM, aMF;
- TopAbs_State aSt;
- //
- TopExp::MapShapes(myShape, TopAbs_SOLID, aM);
- aNbS=aM.Extent();
- for (i=1; i<=aNbS; ++i) {
- GEOMAlgo_StateCollector aSC;
- //
- const TopoDS_Shape& aSd=aM(i);
- aMF.Clear();
- TopExp::MapShapes(aSd, TopAbs_FACE, aMF);
- //
- bIsConformState=Standard_False;
- //
- aNbF=aMF.Extent();
- for (j=1; j<=aNbF; ++j) {
- const TopoDS_Shape& aF=aMF(j);
- bIsConformState=myMSS.Contains(aF);
- if (!bIsConformState) {
- break;// face has non-conformed state
- }
- else {
- aSt=myMSS.FindFromKey(aF);
- aSC.AppendState(aSt);
- }
- }
- //
- if (!bIsConformState) {
- continue; // face has non-conformed state,skip solid
- }
- //
- aSt=aSC.State();
- //
- bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
- if (bIsConformState) {
- myMSS.Add(aSd, aSt);
- }
- }
-}
-//
-//=======================================================================
-//function : InnerPoints
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
- GEOMAlgo_ListOfPnt& aLP)
-{
- myErrorStatus=0;
- //
- Standard_Integer j, j1, j2, k, n[4], aNbLinks, aNx, aNb, iCnt;//, aNbMax, *pIds;
- TopLoc_Location aLoc;
- Handle(Poly_Triangulation) aTRF;
- TColStd_MapOfInteger aMBN;
- GEOMAlgo_DataMapOfPassKeyInteger aMPKI;
- GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger aIt;
- gp_Pnt aP, aP1, aP2;
- //
- aLP.Clear();
- //
- aTRF=BRep_Tool::Triangulation(aF, aLoc);
- if (aTRF.IsNull()) {
- if (!GEOMAlgo_AlgoTools::BuildTriangulation(aF)) {
- myWarningStatus=20; // no triangulation found
- return;
- }
- aTRF=BRep_Tool::Triangulation(aF, aLoc);
- }
- //
- const gp_Trsf& aTrsf=aLoc.Transformation();
- const Poly_Array1OfTriangle& aTrs=aTRF->Triangles();
- const TColgp_Array1OfPnt& aNodes=aTRF->Nodes();
- //
- // map link/nbtriangles
- j1=aTrs.Lower();
- j2=aTrs.Upper();
- for (j=j1; j<=j2; ++j) {
- const Poly_Triangle& aTr=aTrs(j);
- aTr.Get(n[0], n[1], n[2]);
- n[3]=n[0];
- for (k=0; k<3; ++k) {
- GEOMAlgo_PassKey aPK;
- //
- aPK.SetIds(n[k], n[k+1]);
- if (aMPKI.IsBound(aPK)) {
- Standard_Integer& iCntX=aMPKI.ChangeFind(aPK);
- ++iCntX;
- }
- else {
- aMPKI.Bind(aPK, 1);
- }
- }
- }
- //
- // boundary nodes aMBN
- aNbLinks=aMPKI.Extent();
- aIt.Initialize(aMPKI);
- for (; aIt.More(); aIt.Next()) {
- iCnt=aIt.Value();
- if (iCnt==1) {
- const GEOMAlgo_PassKey& aPK=aIt.Key();
- //
- aNx=(Standard_Integer)aPK.Id(1);
- aMBN.Add(aNx);
- aNx=(Standard_Integer)aPK.Id(2);
- aMBN.Add(aNx);
- }
- }
- //
- // inner nodes=all_nodes - boundary_nodes
- j1=aNodes.Lower();
- j2=aNodes.Upper();
- for (j=j1; j<=j2; ++j) {
- if (!aMBN.Contains(j)) {
- aP=aNodes(j).Transformed(aTrsf);
- aLP.Append(aP);
- }
- }
- //
- aNb=aLP.Extent();
- //
- 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 occurred 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 from 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) {
-}
-//=======================================================================
-//function : InnerPoints
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
- GEOMAlgo_ListOfPnt& aLP)
-{
- Standard_Integer aNbPntsMin;
- //
- myErrorStatus=0;
- aNbPntsMin=21;
- //
- aLP.Clear();
- InnerPoints(aE, aNbPntsMin, aLP);
-}
-//=======================================================================
-//function : InnerPoints
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
- const Standard_Integer aNbPntsMin,
- GEOMAlgo_ListOfPnt& aLP)
-{
- Standard_Boolean bInf1, bInf2;
- Standard_Integer j, aNbT;
- Standard_Real dT, aT, aT1, aT2;
- gp_Pnt aP;
- Handle(Geom_Curve) aC3D;
- //
- aC3D=BRep_Tool::Curve(aE, aT1, aT2);
- if (aC3D.IsNull()) {
- return;
- }
- //
- bInf1=Precision::IsNegativeInfinite(aT1);
- bInf2=Precision::IsPositiveInfinite(aT2);
- if (bInf1 || bInf2) {
- return;
- }
- //
- aNbT=aNbPntsMin+1;
- dT=(aT2-aT1)/aNbT;
- for (j=1; j<aNbT; ++j) {
- aT=aT1+j*dT;
- aC3D->D0(aT, aP);
- aLP.Append(aP);
- }
-}
-
-//=======================================================================
-//function : CheckData
-//purpose :
-//=======================================================================
-void GEOMAlgo_FinderShapeOn1::CheckData()
-{
- myErrorStatus=0;
- //
- if(mySurface.IsNull()) {
- myErrorStatus=10; // mySurface=NULL
- return;
- }
- //
- if (myShape.IsNull()) {
- myErrorStatus=11; // myShape=NULL
- return;
- }
- //
- if (!(myShapeType==TopAbs_VERTEX ||
- myShapeType==TopAbs_EDGE ||
- myShapeType==TopAbs_FACE ||
- myShapeType==TopAbs_SOLID)) {
- myErrorStatus=12; // unallowed subshape type
- return;
- }
- //
- if (myState==GEOMAlgo_ST_UNKNOWN ||
- myState==GEOMAlgo_ST_INOUT) {
- myErrorStatus=13; // unallowed state type
- return;
- }
- //
- GeomAbs_SurfaceType aType;
- //
- myGAS.Load(mySurface);
- aType=myGAS.GetType();
- if (!(aType==GeomAbs_Plane ||
- aType==GeomAbs_Cylinder ||
- aType==GeomAbs_Sphere)) {
- myErrorStatus=14; // unallowed surface type
- }
-}
-
-//=======================================================================
-//function : GetPointState
-//purpose :
-//=======================================================================
-
-TopAbs_State GEOMAlgo_FinderShapeOn1::GetPointState(const gp_Pnt& aP)
-{
- TopAbs_State aSt;
- GEOMAlgo_SurfaceTools::GetState(aP, myGAS, myTolerance, aSt);
- return aSt;
-}
-
-
-//
-// myErrorStatus :
-//
-// 10 -mySurface=NULL
-// 11 -myShape=NULL
-// 12 -unallowed type of subshapes
-// 13 -unallowed state
-// 14 -unallowed surface type
-// 15 -unallowed surface type
-// 20- no triangulation found
-// 30- can not obtain the line from the link
-
+++ /dev/null
-// Copyright (C) 2007-2024 CEA, EDF, 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_FinderShapeOn1.hxx
-// Created: Fri Mar 4 10:31:06 2005
-// Author: Peter KURNEV
-
-#ifndef _GEOMAlgo_FinderShapeOn1_HeaderFile
-#define _GEOMAlgo_FinderShapeOn1_HeaderFile
-
-#include <GEOMAlgo_State.hxx>
-#include <GEOMAlgo_IndexedDataMapOfShapeState.hxx>
-#include <GEOMAlgo_ShapeAlgo.hxx>
-#include <GEOMAlgo_ListOfPnt.hxx>
-
-#include <TopAbs_State.hxx>
-#include <TopAbs_ShapeEnum.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopTools_ListOfShape.hxx>
-
-#include <Geom_Surface.hxx>
-#include <GeomAdaptor_Surface.hxx>
-
-#include <gp_Pnt.hxx>
-
-#include <Standard.hxx>
-#include <Standard_Macro.hxx>
-#include <Standard_Integer.hxx>
-
-//=======================================================================
-//function : GEOMAlgo_FinderShapeOn1
-//purpose :
-//=======================================================================
-class GEOMAlgo_FinderShapeOn1 : public GEOMAlgo_ShapeAlgo
-{
- public:
- Standard_EXPORT
- GEOMAlgo_FinderShapeOn1();
-
- Standard_EXPORT
- virtual ~GEOMAlgo_FinderShapeOn1();
-
- Standard_EXPORT
- void SetSurface(const Handle(Geom_Surface)& aS) ;
-
- Standard_EXPORT
- void SetShapeType(const TopAbs_ShapeEnum aST) ;
-
- Standard_EXPORT
- void SetState(const GEOMAlgo_State aSF) ;
-
- Standard_EXPORT
- void SetNbPntsMin(const Standard_Integer aNb) ;
-
- Standard_EXPORT
- Standard_Integer NbPntsMin() const;
-
- Standard_EXPORT
- void SetNbPntsMax(const Standard_Integer aNb) ;
-
- Standard_EXPORT
- Standard_Integer NbPntsMax() const;
-
- Standard_EXPORT
- const Handle(Geom_Surface)& Surface() const;
-
- Standard_EXPORT
- TopAbs_ShapeEnum ShapeType() const;
-
- Standard_EXPORT
- GEOMAlgo_State State() const;
-
- Standard_EXPORT
- virtual void Perform() ;
-
- Standard_EXPORT
- const TopTools_ListOfShape& Shapes() const;
-
- Standard_EXPORT
- const GEOMAlgo_IndexedDataMapOfShapeState& MSS() const;
-
- protected:
- Standard_EXPORT
- virtual void CheckData() ;
-
- Standard_EXPORT
- void ProcessVertices() ;
-
- Standard_EXPORT
- void ProcessEdges() ;
-
- Standard_EXPORT
- void ProcessFaces() ;
-
- Standard_EXPORT
- void ProcessSolids() ;
-
- Standard_EXPORT
- void InnerPoints(const TopoDS_Face& aF,
- GEOMAlgo_ListOfPnt& aLP) ;
-
- Standard_EXPORT
- void InnerPoints(const TopoDS_Edge& aE,
- GEOMAlgo_ListOfPnt& aLP) ;
-
- Standard_EXPORT
- void InnerPoints(const TopoDS_Edge& aE,
- const Standard_Integer aNbPnts,
- GEOMAlgo_ListOfPnt& aLP) ;
-
- Standard_EXPORT
- virtual TopAbs_State GetPointState(const gp_Pnt& aP) ;
-
-
- Handle(Geom_Surface) mySurface;
- TopAbs_ShapeEnum myShapeType;
- GEOMAlgo_State myState;
- Standard_Integer myNbPntsMin;
- Standard_Integer myNbPntsMax;
- GeomAdaptor_Surface myGAS;
- TopTools_ListOfShape myLS;
- GEOMAlgo_IndexedDataMapOfShapeState myMSS;
-};
-
-#endif
#include <GEOMAlgo_StateCollector.hxx>
#include <GEOMAlgo_SurfaceTools.hxx>
+#include <GEOMUtils.hxx>
+
#include <Bnd_Box.hxx>
#include <BRep_Tool.hxx>
#include <BRepBndLib.hxx>
//
aLP.Clear();
//
- aTRF=BRep_Tool::Triangulation(aF, aLoc);
- if (aTRF.IsNull()) {
- if (!BuildTriangulation(aF)) {
- myWarningStatus=20; // no triangulation found
- return;
- }
- aTRF=BRep_Tool::Triangulation(aF, aLoc);
+ if (!GEOMUtils::MeshShape(aF, /*deflection*/0.001, /*forced*/false,
+ /*angle deflection*/0.349066, /*isRelative*/true,
+ /*doPostCheck*/true)) {
+ myWarningStatus=20; // no triangulation found
+ return;
}
+ aTRF=BRep_Tool::Triangulation(aF, aLoc);
//
const gp_Trsf& aTrsf=aLoc.Transformation();
//
gp_Pnt aP;
//
aLP.Clear();
+ if (!GEOMUtils::MeshShape(aE, /*deflection*/0.001, /*forced*/false,
+ /*angle deflection*/0.349066, /*isRelative*/true,
+ /*doPostCheck*/true)) {
+ myErrorStatus=20; // no triangulation found
+ return;
+ }
BRep_Tool::PolygonOnTriangulation(aE, aPTE, aTRE, aLoc);
if (aTRE.IsNull() || aPTE.IsNull()) {
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
- if (aPE.IsNull()) {
- if (!BuildTriangulation(aE)) {
- myErrorStatus=20; // no triangulation found
- return;
- }
- aPE = BRep_Tool::Polygon3D(aE, aLoc);
- }
const gp_Trsf& aTrsf=aLoc.Transformation();
const TColgp_Array1OfPnt& aNodes=aPE->Nodes();
//
}
}
-//=======================================================================
-//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 :
//
const Standard_Integer aNbPnts,
GEOMAlgo_ListOfPnt& aLP) ;
- Standard_EXPORT
- Standard_Boolean BuildTriangulation(const TopoDS_Shape& aS) ;
-
TopAbs_ShapeEnum myShapeType;
GEOMAlgo_State myState;
+++ /dev/null
-// Copyright (C) 2007-2024 CEA, EDF, 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_FinderShapeOnQuad.cxx
-// Created : Mon Oct 17 17:31:45 2005
-// Author : Edward AGAPOV (eap)
-//
-#include "GEOMAlgo_FinderShapeOnQuad.hxx"
-#include "GEOMAlgo_SurfaceTools.hxx"
-
-#include <gp_Pnt.hxx>
-#include <gp_Vec.hxx>
-#include <Geom_Plane.hxx>
-
-
-GEOMAlgo_FinderShapeOnQuad::GEOMAlgo_FinderShapeOnQuad(const gp_Pnt & theTopLeftPoint,
- const gp_Pnt & theTopRightPoint,
- const gp_Pnt & theBottomLeftPoint,
- const gp_Pnt & theBottomRightPoint)
-{
- myPoints.resize(6);
- myPoints[0] = theTopLeftPoint ;
- myPoints[1] = theTopRightPoint ;
- myPoints[2] = theBottomRightPoint;
- 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] );
- //std::cout<<std::endl<<" X Vec : "<<myQuadNormal.X()<<" "<<myQuadNormal.Y()<<" "<<myQuadNormal.Z()<<" "<<endl;
-
- if ( myQuadNormal.SquareMagnitude() <= DBL_MIN ) {
- myErrorStatus = 101;
- 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 ]);
- //std::cout<<" Y Vec : "<<aSideVec.X()<<" "<<aSideVec.Y()<<" "<<aSideVec.Z()<<" "<<endl;
-
- // plane normal
- gp_Vec aSideNorm = aSideVec ^ myQuadNormal;
- if ( aSideNorm.SquareMagnitude() <= DBL_MIN )
- continue;
- //std::cout<<" Z Vec : "<<aSideNorm.X()<<" "<<aSideNorm.Y()<<" "<<aSideNorm.Z()<<" "<<endl;
-
- // make plane
- Handle(Geom_Plane) aPlane = new Geom_Plane( myPoints[ i ], aSideNorm );
- myPlanes.push_back( GeomAdaptor_Surface() );
- myPlanes.back().Load( aPlane );
- }
-}
-
-//=======================================================================
-//function : CheckData
-//purpose :
-//=======================================================================
-
-void GEOMAlgo_FinderShapeOnQuad::CheckData()
-{
- if ( !myPlanes.empty() )
- mySurface = myPlanes[0].Surface();
- GEOMAlgo_FinderShapeOn1::CheckData();
-}
-
-//=======================================================================
-//function : GetPointState
-//purpose :
-//=======================================================================
-
-TopAbs_State GEOMAlgo_FinderShapeOnQuad::GetPointState(const gp_Pnt& aP)
-{
- // 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(aP, 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], aP );
- gp_Vec pc2 ( aP, myPoints[i+1] );
- if ( aSideVec * c1p >= 0. && aSideVec * pc2 >= 0. )
- return TopAbs_ON;
- // 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 )
- return TopAbs_IN;
-
- return TopAbs_OUT;
-}
-
+++ /dev/null
-// Copyright (C) 2007-2024 CEA, EDF, 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_FinderShapeOnQuad.hxx
-// Created : Mon Oct 17 17:15:59 2005
-// Author : Edward AGAPOV (eap)
-//
-#ifndef GEOMAlgo_FinderShapeOnQuad_HeaderFile
-#define GEOMAlgo_FinderShapeOnQuad_HeaderFile
-
-#include "GEOMAlgo_FinderShapeOn1.hxx"
-
-#include <gp_Vec.hxx>
-
-#include <vector>
-
-
-class GEOMAlgo_FinderShapeOnQuad: public GEOMAlgo_FinderShapeOn1
-{
-public:
-
- Standard_EXPORT
- GEOMAlgo_FinderShapeOnQuad(const gp_Pnt & theTopLeftPoint,
- const gp_Pnt & theTopRightPoint,
- const gp_Pnt & theBottomLeftPoint,
- const gp_Pnt & theBottomRightPoint);
-
-protected:
-
- virtual void CheckData() ;
-
- virtual TopAbs_State GetPointState(const gp_Pnt& aP) ;
-
-private:
-
- bool myConcaveQuad;
- std::vector<bool> myConcaveSide;
- std::vector<gp_Pnt> myPoints;
- std::vector<GeomAdaptor_Surface> myPlanes;
- gp_Vec myQuadNormal;
-};
-#endif
#include <Basics_OCCTVersion.hxx>
-#if OCC_VERSION_LARGE < 0x07080000
-
#include <Standard_Real.hxx> // E.A. must be included before Python.h to fix compilation on windows
-#else
-
-#ifdef _MSC_VER
-#ifndef _USE_MATH_DEFINES
-#define _USE_MATH_DEFINES
-#endif
-#include <math.h>
-#endif
-
-#endif
-
#ifdef HAVE_FINITE
#undef HAVE_FINITE // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
#endif
#include <GEOMImpl_ITestOperations.hxx>
-#include <BRepBndLib.hxx>
+#include <GEOMUtils.hxx>
+
#include <BRepBuilderAPI_Copy.hxx>
-#include <BRepMesh_IncrementalMesh.hxx>
-#include <BRepTools.hxx>
-#include <Bnd_Box.hxx>
+
#include <utilities.h>
#ifndef MAX2
// reset error code
SetErrorCode(KO);
+
// create a copy of the source shape
TopoDS_Shape aShape = BRepBuilderAPI_Copy(theShape->GetValue()).Shape();
+
// use default deflection if necessary
if (theLinearDeflection <= 0)
theLinearDeflection = 0.001;
- // compute absolute deflection if necessary: 0.001
- if (theIsRelative) {
- Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
- Bnd_Box bndBox;
- BRepBndLib::Add(aShape, bndBox);
- bndBox.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
- theLinearDeflection = MAX3(aXmax-aXmin, aYmax-aYmin, aZmax-aZmin) * theLinearDeflection * 4;
- }
+
// use default deviation angle if necessary: 20 degrees
if (theAngularDeflection <= 0)
theAngularDeflection = 20. * M_PI / 180.;
+
// compute triangulation
- BRepTools::Clean(aShape);
- BRepMesh_IncrementalMesh aMesh(aShape, theLinearDeflection, Standard_False, theAngularDeflection);
+ GEOMUtils::MeshShape(aShape, theLinearDeflection, /*theForced*/ true,
+ theAngularDeflection, theIsRelative);
+
// set OK status and return
SetErrorCode(OK);
return true;
#include <GEOMImpl_IProximity.hxx>
#include <GEOMImpl_Types.hxx>
+#include <GEOMUtils.hxx>
+
#include <BRep_Tool.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <TopoDS.hxx>
namespace {
- static void tessellateShape(const TopoDS_Shape& theShape)
- {
- Standard_Boolean isTessellate = Standard_False;
- TopLoc_Location aLoc;
- for (TopExp_Explorer anExp(theShape, TopAbs_FACE); anExp.More() && !isTessellate; anExp.Next())
- {
- Handle(Poly_Triangulation) aTria = BRep_Tool::Triangulation(TopoDS::Face(anExp.Value()), aLoc);
- isTessellate = aTria.IsNull();
- }
- for (TopExp_Explorer anExp(theShape, TopAbs_EDGE); anExp.More() && !isTessellate; anExp.Next())
- {
- Handle(Poly_Polygon3D) aPoly = BRep_Tool::Polygon3D(TopoDS::Edge(anExp.Value()), aLoc);
- isTessellate = aPoly.IsNull();
- }
-
- if (isTessellate)
- {
- BRepMesh_IncrementalMesh aMesher(theShape, 0.1);
- Standard_ProgramError_Raise_if(!aMesher.IsDone(), "Meshing failed");
- }
- }
-
static Standard_Real paramOnCurve(const BRepAdaptor_Curve& theCurve, const gp_Pnt& thePoint, const Standard_Real theTol)
{
Extrema_ExtPC aParamSearch(thePoint, theCurve, theCurve.FirstParameter(), theCurve.LastParameter());
if (aFunction->GetType() == PROXIMITY_COARSE)
{
// tessellate shapes if there is no mesh exists
- tessellateShape(aShape1);
- tessellateShape(aShape2);
+ GEOMUtils::MeshShape(aShape1, 0.1, /*theForced*/false, 0.5, /*isRelative*/false);
+ GEOMUtils::MeshShape(aShape2, 0.1, /*theForced*/false, 0.5, /*isRelative*/false);
// compute proximity basing on the tessellation
BRepExtrema_ShapeProximity aCalcProx;
#include <ProjLib.hxx>
#include <ElSLib.hxx>
+#include <Prs3d.hxx>
+
#include <vector>
#include <sstream>
#include <algorithm>
}
}
-//=======================================================================
-//function : CheckTriangulation
-//purpose :
-//=======================================================================
-bool GEOMUtils::CheckTriangulation (const TopoDS_Shape& aShape)
-{
- bool isTriangulation = true;
-
- TopExp_Explorer exp (aShape, 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 (aShape, TopAbs_EDGE);
- if (!expe.More()) {
- return false;
- }
- TopLoc_Location aLoc;
- Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(TopoDS::Edge(expe.Current()), aLoc);
- if (aPE.IsNull()) {
- isTriangulation = false;
- }
- }
-
- if (!isTriangulation) {
- // calculate deflection
- Standard_Real aDeviationCoefficient = 0.001;
-
- Bnd_Box B;
- BRepBndLib::Add(aShape, 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;
-
- BRepMesh_IncrementalMesh Inc (aShape, aDeflection, Standard_False, aHLRAngle);
- }
-
- return true;
-}
-
//=======================================================================
//function : GetTypeOfSimplePart
//purpose :
return result;
}
-void GEOMUtils::MeshShape( const TopoDS_Shape shape,
- double deflection, bool theForced )
+//=======================================================================
+//function : DefaultDeflection
+//purpose :
+//=======================================================================
+double GEOMUtils::DefaultDeflection()
+{
+ return 0.001;
+}
+
+//=======================================================================
+//function : CanBeMeshed
+//purpose :
+//=======================================================================
+static bool GEOMUtils_CanBeMeshed (const TopoDS_Shape& theShape,
+ const bool theCheckMesh,
+ bool& theHasMesh)
{
- Standard_Real aDeflection = ( deflection <= 0 ) ? DefaultDeflection() : deflection;
-
// Is shape triangulated?
- Standard_Boolean alreadyMeshed = true;
- TopExp_Explorer ex;
+ theHasMesh = true;
+
+ TopExp_Explorer ex (theShape, TopAbs_FACE);
TopLoc_Location aLoc;
- for ( ex.Init( shape, TopAbs_FACE ); ex.More() && alreadyMeshed; ex.Next() ) {
- const TopoDS_Face& aFace = TopoDS::Face( ex.Current() );
- Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation( aFace, aLoc );
- alreadyMeshed = !aPoly.IsNull();
+ if (ex.More()) {
+ if (theCheckMesh) {
+ for ( ; ex.More() && theHasMesh; ex.Next() ) {
+ const TopoDS_Face& aFace = TopoDS::Face( ex.Current() );
+ Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation( aFace, aLoc );
+ theHasMesh = !aPoly.IsNull();
+ }
+ }
}
-
- if ( !alreadyMeshed || theForced ) {
+ else { // no faces, try edges
+ ex.Init(theShape, TopAbs_EDGE);
+ if (!ex.More()) {
+ return false; // nothing to mesh
+ }
+ if (theCheckMesh) {
+ for ( ; ex.More() && theHasMesh; ex.Next() ) {
+ Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(TopoDS::Edge(ex.Current()), aLoc);
+ theHasMesh = !aPE.IsNull();
+ }
+ }
+ }
+
+ return true;
+}
+
+//=======================================================================
+//function : MeshShape
+//purpose :
+//=======================================================================
+bool GEOMUtils::MeshShape( const TopoDS_Shape theShape,
+ const double theDeflection,
+ const bool theForced,
+ const double theAngleDeflection,
+ const bool isRelative,
+ const bool doPostCheck)
+{
+ Standard_Real aDeflection = (theDeflection <= 0) ? DefaultDeflection() : theDeflection;
+
+ // Is shape triangulated?
+ bool alreadyMeshed = true;
+ if (!GEOMUtils_CanBeMeshed (theShape, /*theCheckMesh*/true, alreadyMeshed))
+ return false;
+
+ if (alreadyMeshed && !theForced)
+ return true;
+
+ if (isRelative) {
// Compute bounding box
Bnd_Box B;
- BRepBndLib::Add( shape, B );
- if ( B.IsVoid() )
- return; // NPAL15983 (Bug when displaying empty groups)
- Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
- B.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
-
- // This magic line comes from Prs3d_ShadedShape.gxx in OCCT
- aDeflection = MAX3(aXmax-aXmin, aYmax-aYmin, aZmax-aZmin) * aDeflection * 4;
-
- // Clean triangulation before compute incremental mesh
- BRepTools::Clean( shape );
-
- // Compute triangulation
- BRepMesh_IncrementalMesh mesh( shape, aDeflection );
+ BRepBndLib::Add(theShape, B);
+ if (B.IsVoid())
+ return false; // NPAL15983 (Bug when displaying empty groups)
+
+ Standard_Real aDeviationCoeff = aDeflection;
+ Standard_Real aMaxChordialDeviation = aDeflection;
+ aDeflection = Prs3d::GetDeflection(B, aDeviationCoeff, aMaxChordialDeviation);
}
+
+ // Clean triangulation before compute incremental mesh
+ BRepTools::Clean(theShape);
+
+ // Compute triangulation
+ BRepMesh_IncrementalMesh mesh (theShape, aDeflection, Standard_False, theAngleDeflection);
+
+ if (!doPostCheck)
+ return true;
+
+ if (!mesh.IsDone())
+ return false;
+
+ GEOMUtils_CanBeMeshed(theShape, /*theCheckMesh*/true, alreadyMeshed);
+ return alreadyMeshed;
}
-double GEOMUtils::DefaultDeflection()
+//=======================================================================
+//function : CheckTriangulation
+//purpose :
+//=======================================================================
+bool GEOMUtils::CheckTriangulation (const TopoDS_Shape& theShape)
{
- return 0.001;
+ Standard_Real aHLRAngle = 0.349066;
+ return MeshShape(theShape, DefaultDeflection(), false, aHLRAngle);
}
//=======================================================================
Standard_EXPORT void AddSimpleShapes (const TopoDS_Shape& theShape,
TopTools_ListOfShape& theList);
- /*!
- * \brief Build a triangulation on \a theShape if it is absent.
- * \param theShape The shape to check/build triangulation on.
- * \retval bool Returns false if the shape has no faces, i.e. impossible to build triangulation.
- */
- Standard_EXPORT bool CheckTriangulation (const TopoDS_Shape& theShape);
-
/*!
* \brief Return type of shape for explode. In case of compound it will be a type of its first sub shape.
* \param theShape The shape to get type of.
Standard_EXPORT TopoDS_Shape ReduceCompound( const TopoDS_Shape& shape );
/*!
- * \brief Generate triangulation for the shape.
+ * \brief Get default deflection coefficient used for triangulation
+ * \return default deflection value
+ */
+ Standard_EXPORT double DefaultDeflection();
+
+ /*!
+ * \brief Generate triangulation for \a theShape.
*
- * \param shape shape being meshed
- * \param deflection deflection coefficient to be used
- * \param forced if \c true, causes generation of mesh regardless it is already present in the shape
+ * \param theShape shape to be meshed.
+ * \param theDeflection deflection coefficient to be used.
+ * \param theForced if \c true, causes generation of mesh regardless it is already present in the shape.
+ * \param theAngleDeflection angular deflection coefficient to be used.
+ * \param isRelative if true, \a theDeflection is considered relative to \a theShape maximum axial dimension.
+ * \param doPostCheck if true, check mesh generation result and return corresponding boolean value.
+ * \retval bool Returns false in the following cases:
+ * 1. The shape has neither faces nor edges, i.e. impossible to build triangulation or polygon.
+ * 2. \a theForced is false and \a theShape has no mesh or has incomplete mesh.
+ * 3. \a doPostCheck is true and mesh generation failed or produced an incomplete mesh.
*/
- Standard_EXPORT void MeshShape( const TopoDS_Shape shape,
- double deflection, bool forced = true );
+ Standard_EXPORT bool MeshShape( const TopoDS_Shape theShape,
+ const double theDeflection = DefaultDeflection(),
+ const bool theForced = true,
+ const double theAngleDeflection = 0.5,
+ const bool isRelative = true,
+ const bool doPostCheck = false);
/*!
- * \brief Get default deflection coefficient used for triangulation
- * \return default deflection value
+ * \brief Build a triangulation on \a theShape if it is absent.
+ * \param theShape The shape to check/build triangulation on.
+ * \retval bool Returns false if the shape has no faces, i.e. impossible to build triangulation.
*/
- Standard_EXPORT double DefaultDeflection();
+ Standard_EXPORT bool CheckTriangulation (const TopoDS_Shape& theShape);
/**
* \brief Check if the shape is not a closed wire or edge.
#include <BRepTools.hxx>
#include <BRepBndLib.hxx>
-#include <BRepMesh_IncrementalMesh.hxx>
#include <Poly_Triangulation.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
BRepBndLib::Add( aShape, bndBox );
bndBox.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
aDeflection = MAX3( aXmax-aXmin, aYmax-aYmin, aZmax-aZmin ) * aDeflection;
+ aDeflection = MAX2( aDeflection, Precision::Confusion() );
}
//Compute triangulation
BRepTools::Clean( aCopyShape );