-// Copyright (C) 2007-2012 CEA/DEN, EDF R&D
+// Copyright (C) 2007-2023 CEA/DEN, EDF R&D
//
// 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.
+// 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
extern "C"{
#include <meshgems/meshgems.h>
#include <meshgems/cadsurf.h>
-#include <meshgems/precad.h>
}
#include <BRepClass_FaceClassifier.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepTools.hxx>
-#include <BRepAdaptor_HSurface.hxx>
#include "BLSURFPlugin_Hypothesis.hxx"
class TopoDS_Shape;
-class BLSURFPlugin_BLSURF: public SMESH_2D_Algo {
- public:
- BLSURFPlugin_BLSURF(int hypId, int studyId, SMESH_Gen* gen);
+class BLSURFPlugin_BLSURF: public SMESH_2D_Algo
+{
+public:
+ BLSURFPlugin_BLSURF(int hypId, SMESH_Gen* gen, bool theHasGEOM);
- virtual ~BLSURFPlugin_BLSURF();
+ virtual ~BLSURFPlugin_BLSURF();
- virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
- SMESH_Hypothesis::Hypothesis_Status& aStatus);
+ virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
+ const TopoDS_Shape& aShape,
+ SMESH_Hypothesis::Hypothesis_Status& aStatus);
- void SetParameters(const BLSURFPlugin_Hypothesis* hyp, blsurf_session_t *bls, precad_session_t *pcs, SMESH_Mesh& aMesh, bool *use_precad);
+ void SetParameters(const BLSURFPlugin_Hypothesis* hyp, cadsurf_session_t *css, const TopoDS_Shape& shape);
- virtual bool Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape);
+ virtual bool Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape);
+ virtual bool Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelper);
-#ifdef WITH_SMESH_CANCEL_COMPUTE
- virtual void CancelCompute();
- bool computeCanceled() { return _compute_canceled; }
-#endif
+ virtual void CancelCompute();
+ bool computeCanceled() { return _compute_canceled; }
- virtual bool Evaluate(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape,
- MapShapeNbElems& aResMap);
+ virtual bool Evaluate(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape,
+ MapShapeNbElems& aResMap);
- protected:
- const BLSURFPlugin_Hypothesis* _hypothesis;
- bool _haveViscousLayers;
+ static void FillEntryToShape( const BLSURFPlugin_Hypothesis* hyp,
+ std::map< std::string, TopoDS_Shape > & s2eMap );
- private:
- bool compute(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape);
+ virtual void SetEventListener(SMESH_subMesh* subMesh) override;
+ virtual void SubmeshRestored(SMESH_subMesh* subMesh) override;
- TopoDS_Shape entryToShape(std::string entry);
- void createEnforcedVertexOnFace(TopoDS_Shape FaceShape, BLSURFPlugin_Hypothesis::TEnfVertexList enfVertexList);
- void Set_NodeOnEdge(SMESHDS_Mesh* meshDS, SMDS_MeshNode* node, const TopoDS_Shape& ed);
- void BRepClass_FaceClassifierPerform(BRepClass_FaceClassifier* fc, const TopoDS_Face& face, const gp_Pnt& P, const Standard_Real Tol);
- private:
- PyObject * main_mod;
- PyObject * main_dict;
- SALOMEDS::Study_var myStudy;
- SMESH_Gen_i* smeshGen_i;
-#ifdef WITH_SMESH_CANCEL_COMPUTE
- volatile bool _compute_canceled;
-#endif
+ // List of ids
+ typedef std::vector<int> TListOfIDs;
+
+ // PreCad Edges periodicity
+ struct TPreCadPeriodicityIDs {
+ TListOfIDs shape1IDs;
+ TListOfIDs shape2IDs;
+ std::vector<double> theSourceVerticesCoords;
+ std::vector<double> theTargetVerticesCoords;
+ };
+
+ // Edge periodicity
+ struct TEdgePeriodicityIDs {
+ int theFace1ID;
+ int theEdge1ID;
+ int theFace2ID;
+ int theEdge2ID;
+ int edge_orientation;
+ };
+
+ // Vertex periodicity
+ struct TVertexPeriodicityIDs {
+ int theEdge1ID;
+ int theVertex1ID;
+ int theEdge2ID;
+ int theVertex2ID;
+ };
+
+ // Vector of pairs of ids
+ typedef std::vector< TPreCadPeriodicityIDs > TPreCadIDsPeriodicityVector;
+ typedef std::vector< std::pair<int, int> > TShapesIDsPeriodicityVector;
+ typedef std::vector< TEdgePeriodicityIDs > TEdgesIDsPeriodicityVector;
+ typedef std::vector< TVertexPeriodicityIDs > TVerticesIDsPeriodicityVector;
+
+ // Point projection on FACE
+ typedef struct {
+ gp_XY uv;
+ gp_XYZ xyz;
+ TopAbs_State state;
+ } projectionPoint;
+
+ static projectionPoint getProjectionPoint(TopoDS_Face& theFace,
+ const gp_Pnt& thePoint,
+ const bool theAllowStateON=false);
+
+
+protected:
+ const BLSURFPlugin_Hypothesis* _hypothesis;
+ bool _haveViscousLayers;
+
+ TPreCadIDsPeriodicityVector _preCadFacesIDsPeriodicityVector;
+ TPreCadIDsPeriodicityVector _preCadEdgesIDsPeriodicityVector;
+
+private:
+ bool compute(SMESH_Mesh& aMesh,
+ const TopoDS_Shape& aShape,
+ bool allowSubMeshClearing);
+
+ void set_param(cadsurf_session_t *css,
+ const char * option_name,
+ const char * option_value);
+
+ TopoDS_Shape entryToShape(std::string entry);
+ void addCoordsFromVertices(const std::vector<std::string> &theVerticesEntries, std::vector<double> &theVerticesCoords);
+ void addCoordsFromVertex(BLSURFPlugin_Hypothesis::TEntry theVertexEntry, std::vector<double> &theVerticesCoords);
+ void createEnforcedVertexOnFace(TopoDS_Shape FaceShape, BLSURFPlugin_Hypothesis::TEnfVertexList enfVertexList);
+ void createPreCadFacesPeriodicity(TopoDS_Shape theGeomShape, const BLSURFPlugin_Hypothesis::TPreCadPeriodicity &preCadPeriodicity);
+ void createPreCadEdgesPeriodicity(TopoDS_Shape theGeomShape, const BLSURFPlugin_Hypothesis::TPreCadPeriodicity &preCadPeriodicity);
+ void Set_NodeOnEdge(SMESHDS_Mesh* meshDS, const SMDS_MeshNode* node, const TopoDS_Shape& ed);
+ void BRepClass_FaceClassifierPerform(BRepClass_FaceClassifier* fc, const TopoDS_Face& face, const gp_Pnt& P, const Standard_Real Tol);
+
+private:
+ PyObject * main_mod;
+ PyObject * main_dict;
+
+ volatile bool _compute_canceled;
};
#endif