X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FBLSURFPlugin%2FBLSURFPlugin_BLSURF.cxx;h=94e8065769ef2d2afaf6da97c51990370d6a739c;hb=ce134533bb9155786bb02b76e6a63b4efae4f0d0;hp=c93ecc83a3a242223fec123899badd00b8c7283d;hpb=4723b6011ebb969012c3aa7f8ea7125fd05c1426;p=plugins%2Fblsurfplugin.git diff --git a/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx b/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx index c93ecc8..94e8065 100644 --- a/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx +++ b/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2021 CEA/DEN, EDF R&D +// Copyright (C) 2007-2023 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -25,37 +25,39 @@ // --- #include "BLSURFPlugin_BLSURF.hxx" -#include "BLSURFPlugin_Hypothesis.hxx" + #include "BLSURFPlugin_Attractor.hxx" +#include "BLSURFPlugin_EnforcedMesh1D.hxx" +#include "BLSURFPlugin_Hypothesis.hxx" extern "C"{ #include #include } -#include - - -#include - #include #include +#include #include #include +#include #include #include #include #include +#include #include -#include +#include #include +#include #include #include -#include #include -#include +#include + +#include // python // OPENCASCADE includes #include @@ -90,13 +92,14 @@ extern "C"{ #include #include #include -#include -#include #ifndef WIN32 #include #endif +#include +#include + using namespace std; /* ================================== @@ -405,14 +408,12 @@ status_t size_on_surface(integer face_id, real *uv, real *size, void *user_data) status_t size_on_edge(integer edge_id, real t, real *size, void *user_data); status_t size_on_vertex(integer vertex_id, real *size, void *user_data); -typedef struct { - gp_XY uv; - gp_XYZ xyz; -} projectionPoint; - ///////////////////////////////////////////////////////// -projectionPoint getProjectionPoint(TopoDS_Face& theFace, const gp_Pnt& thePoint) +BLSURFPlugin_BLSURF::projectionPoint +BLSURFPlugin_BLSURF::getProjectionPoint(TopoDS_Face& theFace, + const gp_Pnt& thePoint, + const bool theAllowStateON) { projectionPoint myPoint; @@ -440,16 +441,18 @@ projectionPoint getProjectionPoint(TopoDS_Face& theFace, const gp_Pnt& thePoint) { // check location on the face BRepClass_FaceClassifier FC( face, uv, BRep_Tool::Tolerance( face )); - if ( FC.State() == TopAbs_IN ) + if (( FC.State() == TopAbs_IN ) || + ( FC.State() == TopAbs_ON && theAllowStateON )) { - if ( !foundFace.IsNull() ) + if ( !foundFace.IsNull() && !theAllowStateON ) return myPoint; // thePoint seems to be TopAbs_ON - foundFace = face; - myPoint.uv = uv.XY(); - myPoint.xyz = surface->Value( uv ).XYZ(); + foundFace = face; + myPoint.uv = uv.XY(); + myPoint.xyz = surface->Value( uv ).XYZ(); + myPoint.state = FC.State(); // break; } - if ( FC.State() == TopAbs_ON ) + if ( FC.State() == TopAbs_ON && !theAllowStateON ) return myPoint; } } @@ -462,12 +465,15 @@ projectionPoint getProjectionPoint(TopoDS_Face& theFace, const gp_Pnt& thePoint) const TopoDS_Face& face = d2f->second.first; const gp_Pnt2d & uv = d2f->second.second; BRepClass_FaceClassifier FC( face, uv, Precision::Confusion()); - if ( FC.State() == TopAbs_IN ) + if (( FC.State() == TopAbs_IN ) || + ( FC.State() == TopAbs_ON && theAllowStateON )) { - foundFace = face; - myPoint.uv = uv.XY(); - myPoint.xyz = theHelper->GetSurface( face )->Value( uv ).XYZ(); - break; + foundFace = face; + myPoint.uv = uv.XY(); + myPoint.xyz = theHelper->GetSurface( face )->Value( uv ).XYZ(); + myPoint.state = FC.State(); + if ( FC.State() == TopAbs_IN ) + break; } } } @@ -477,7 +483,7 @@ projectionPoint getProjectionPoint(TopoDS_Face& theFace, const gp_Pnt& thePoint) // "getProjectionPoint: can't find a face by a vertex"); theFace = TopoDS::Face( foundFace ); } - else + else // !theFace.IsNull() { Handle(Geom_Surface) surface = BRep_Tool::Surface( theFace ); GeomAPI_ProjectPointOnSurf projector( thePoint, surface ); @@ -487,12 +493,14 @@ projectionPoint getProjectionPoint(TopoDS_Face& theFace, const gp_Pnt& thePoint) Standard_Real u,v; projector.LowerDistanceParameters(u,v); - myPoint.uv = gp_XY(u,v); - gp_Pnt aPnt = projector.NearestPoint(); - myPoint.xyz = gp_XYZ(aPnt.X(),aPnt.Y(),aPnt.Z()); + myPoint.uv = gp_XY(u,v); + myPoint.xyz = projector.NearestPoint().XYZ(); BRepClass_FaceClassifier FC( theFace, myPoint.uv, Precision::Confusion()); - if ( FC.State() != TopAbs_IN ) + myPoint.state = FC.State(); + + if (( FC.State() != TopAbs_IN ) && + ( FC.State() != TopAbs_ON || !theAllowStateON )) theFace.Nullify(); } @@ -502,25 +510,53 @@ projectionPoint getProjectionPoint(TopoDS_Face& theFace, const gp_Pnt& thePoint) ///////////////////////////////////////////////////////// TopoDS_Shape BLSURFPlugin_BLSURF::entryToShape(std::string entry) { - GEOM::GEOM_Object_var aGeomObj; - TopoDS_Shape S = TopoDS_Shape(); - SALOMEDS::SObject_var aSObj = SMESH_Gen_i::GetSMESHGen()->getStudyServant()->FindObjectID( entry.c_str() ); - if (!aSObj->_is_nil()) { - CORBA::Object_var obj = aSObj->GetObject(); - aGeomObj = GEOM::GEOM_Object::_narrow(obj); - aSObj->UnRegister(); - } - if ( !aGeomObj->_is_nil() ) - S = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( aGeomObj.in() ); + GEOM::GEOM_Object_var aGeomObj = SMESH_Gen_i::GetSMESHGen()->GetGeomObjectByEntry( entry ); + TopoDS_Shape S = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( aGeomObj ); return S; } -void _createEnforcedVertexOnFace(TopoDS_Face faceShape, gp_Pnt aPnt, BLSURFPlugin_Hypothesis::TEnfVertex *enfVertex) +// Check if a point is already on the shape. +// if faceShape is defined, we use it +// else we use the sub-shape of the mesh +bool _doVertexAlreadyExists(const TopoDS_Face& faceShape, + const gp_Pnt& aPnt) +{ + // If the point is already on the shape, no need to add it + TopExp_Explorer ex; + TopoDS_Shape shapeToCheckVertices(faceShape); + bool alreadyExists(false); + if (faceShape.IsNull()) + shapeToCheckVertices = theHelper->GetSubShape(); + for (ex.Init(shapeToCheckVertices, TopAbs_VERTEX); ex.More(); ex.Next()) + { + TopoDS_Vertex vertex = TopoDS::Vertex(ex.Current()); + double tol = BRep_Tool::Tolerance( vertex ); + gp_Pnt p = BRep_Tool::Pnt(vertex); + if ( p.IsEqual( aPnt, tol)) + { + MESSAGE("The enforced vertex is already on the shape => No need to add it."); + alreadyExists = true; + break; + } + } + return alreadyExists; +} + +void _createEnforcedVertexOnFace(TopoDS_Face faceShape, + const gp_Pnt& aPnt, + BLSURFPlugin_Hypothesis::TEnfVertex *enfVertex, + bool checkVertexAlreadyExists=true) { BLSURFPlugin_Hypothesis::TEnfVertexCoords enf_coords, coords, s_coords; + // checkVertexAlreadyExists only for non internal vertices. + // For them we set checkVertexAlreadyExists=false as we do have to add them + if (checkVertexAlreadyExists && _doVertexAlreadyExists(faceShape, aPnt)) + return; + // Find the face and get the (u,v) values of the enforced vertex on the face - projectionPoint myPoint = getProjectionPoint(faceShape,aPnt); + BLSURFPlugin_BLSURF::projectionPoint projPnt = + BLSURFPlugin_BLSURF::getProjectionPoint( faceShape, aPnt, /*allowStateON=*/true ); if ( faceShape.IsNull() ) return; @@ -528,15 +564,16 @@ void _createEnforcedVertexOnFace(TopoDS_Face faceShape, gp_Pnt aPnt, BLSURFPlugi enf_coords.push_back(aPnt.Y()); enf_coords.push_back(aPnt.Z()); - coords.push_back(myPoint.uv.X()); - coords.push_back(myPoint.uv.Y()); - coords.push_back(myPoint.xyz.X()); - coords.push_back(myPoint.xyz.Y()); - coords.push_back(myPoint.xyz.Z()); + coords.push_back(projPnt.uv.X()); + coords.push_back(projPnt.uv.Y()); + coords.push_back(projPnt.xyz.X()); + coords.push_back(projPnt.xyz.Y()); + coords.push_back(projPnt.xyz.Z()); + coords.push_back(projPnt.state == TopAbs_ON); - s_coords.push_back(myPoint.xyz.X()); - s_coords.push_back(myPoint.xyz.Y()); - s_coords.push_back(myPoint.xyz.Z()); + s_coords.push_back(projPnt.xyz.X()); + s_coords.push_back(projPnt.xyz.Y()); + s_coords.push_back(projPnt.xyz.Z()); // Save pair projected vertex / enf vertex EnfVertexCoords2ProjVertex[s_coords] = enf_coords; @@ -548,16 +585,10 @@ void _createEnforcedVertexOnFace(TopoDS_Face faceShape, gp_Pnt aPnt, BLSURFPlugi (*it)->grpName = enfVertex->grpName; } - int key = 0; - if (! FacesWithEnforcedVertices.Contains(faceShape)) { - key = FacesWithEnforcedVertices.Add(faceShape); - } - else { - key = FacesWithEnforcedVertices.FindIndex(faceShape); - } + int key = FacesWithEnforcedVertices.Add( faceShape ); // If a node is already created by an attractor, do not create enforced vertex - int attractorKey = FacesWithSizeMap.FindIndex(faceShape); + int attractorKey = FacesWithSizeMap.FindIndex( faceShape ); bool sameAttractor = false; if (attractorKey >= 0) if (FaceId2AttractorCoords.count(attractorKey) > 0) @@ -566,7 +597,7 @@ void _createEnforcedVertexOnFace(TopoDS_Face faceShape, gp_Pnt aPnt, BLSURFPlugi if (FaceId2EnforcedVertexCoords.find(key) != FaceId2EnforcedVertexCoords.end()) { if (! sameAttractor) - FaceId2EnforcedVertexCoords[key].insert(coords); // there should be no redondant coords here (see std::set management) + FaceId2EnforcedVertexCoords[key].insert(coords); // there should be no redundant coords here (see std::set management) } else { if (! sameAttractor) { @@ -576,17 +607,13 @@ void _createEnforcedVertexOnFace(TopoDS_Face faceShape, gp_Pnt aPnt, BLSURFPlugi } } } - + ///////////////////////////////////////////////////////// void BLSURFPlugin_BLSURF::createEnforcedVertexOnFace(TopoDS_Shape faceShape, BLSURFPlugin_Hypothesis::TEnfVertexList enfVertexList) { - BLSURFPlugin_Hypothesis::TEnfVertex* enfVertex; gp_Pnt aPnt; - - BLSURFPlugin_Hypothesis::TEnfVertexList::const_iterator enfVertexListIt = enfVertexList.begin(); - - for( ; enfVertexListIt != enfVertexList.end() ; ++enfVertexListIt ) { - enfVertex = *enfVertexListIt; + for( BLSURFPlugin_Hypothesis::TEnfVertex* enfVertex : enfVertexList ) + { // Case of manual coords if (enfVertex->coords.size() != 0) { aPnt.SetCoord(enfVertex->coords[0],enfVertex->coords[1],enfVertex->coords[2]); @@ -595,7 +622,7 @@ void BLSURFPlugin_BLSURF::createEnforcedVertexOnFace(TopoDS_Shape faceShape, BLS // Case of geom vertex coords if (enfVertex->geomEntry != "") { - TopoDS_Shape GeomShape = entryToShape(enfVertex->geomEntry); + TopoDS_Shape GeomShape = entryToShape(enfVertex->geomEntry); TopAbs_ShapeEnum GeomType = GeomShape.ShapeType(); if (GeomType == TopAbs_VERTEX) { @@ -639,30 +666,30 @@ void createAttractorOnFace(TopoDS_Shape GeomShape, std::string AttractorFunction // xa pos1 = AttractorFunction.find(sep); if (pos1!=string::npos) - xa = atof(AttractorFunction.substr(10, pos1-10).c_str()); + xa = atof(AttractorFunction.substr(10, pos1-10).c_str()); // ya pos2 = AttractorFunction.find(sep, pos1+1); if (pos2!=string::npos) { - ya = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); - pos1 = pos2; + ya = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); + pos1 = pos2; } // za pos2 = AttractorFunction.find(sep, pos1+1); if (pos2!=string::npos) { - za = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); - pos1 = pos2; + za = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); + pos1 = pos2; } // a pos2 = AttractorFunction.find(sep, pos1+1); if (pos2!=string::npos) { - a = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); - pos1 = pos2; + a = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); + pos1 = pos2; } // b pos2 = AttractorFunction.find(sep, pos1+1); if (pos2!=string::npos) { - b = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); - pos1 = pos2; + b = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); + pos1 = pos2; } // createNode pos2 = AttractorFunction.find(sep, pos1+1); @@ -674,13 +701,14 @@ void createAttractorOnFace(TopoDS_Shape GeomShape, std::string AttractorFunction // d pos2 = AttractorFunction.find(")"); if (pos2!=string::npos) { - d = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); + d = atof(AttractorFunction.substr(pos1+1, pos2-pos1-1).c_str()); } // Get the (u,v) values of the attractor on the face - projectionPoint myPoint = getProjectionPoint(TopoDS::Face(GeomShape),gp_Pnt(xa,ya,za)); - gp_XY uvPoint = myPoint.uv; - gp_XYZ xyzPoint = myPoint.xyz; + BLSURFPlugin_BLSURF::projectionPoint projPnt = + BLSURFPlugin_BLSURF::getProjectionPoint(TopoDS::Face(GeomShape),gp_Pnt(xa,ya,za)); + gp_XY uvPoint = projPnt.uv; + gp_XYZ xyzPoint = projPnt.xyz; Standard_Real u0 = uvPoint.X(); Standard_Real v0 = uvPoint.Y(); Standard_Real x0 = xyzPoint.X(); @@ -1011,7 +1039,7 @@ void BLSURFPlugin_BLSURF::SetParameters(const BLSURFPlugin_Hypothesis* hyp, //set_param(css, "process_3d_topology", _precadProcess3DTopology ? "1" : "0"); //set_param(css, "discard_input_topology", _precadDiscardInput ? "1" : "0"); //set_param(css, "max_number_of_points_per_patch", "1000000"); - + bool useGradation = false; switch (_physicalMesh) { @@ -1317,7 +1345,7 @@ void BLSURFPlugin_BLSURF::SetParameters(const BLSURFPlugin_Hypothesis* hyp, ++theNbAttractors; } else{ - MESSAGE("Wrong shape type !!") + MESSAGE("Wrong shape type !!"); } } @@ -1377,7 +1405,8 @@ void BLSURFPlugin_BLSURF::SetParameters(const BLSURFPlugin_Hypothesis* hyp, enfVertex->geomEntry = ""; enfVertex->grpName = grpName; enfVertex->vertex = TopoDS::Vertex( exp_face.Current() ); - _createEnforcedVertexOnFace( TopoDS::Face(exp.Current()), aPnt, enfVertex); + _createEnforcedVertexOnFace( TopoDS::Face(exp.Current()), aPnt, enfVertex, + /*checkVertexAlreadyExists*/false); HasSizeMapOnFace = true; } } @@ -1485,7 +1514,7 @@ namespace // distene_sizemap_delete(iso_sizemap_e); // if(iso_sizemap_f) // distene_sizemap_delete(iso_sizemap_f); - // + // // // if(clean_geo_sizemap_e) // // distene_sizemap_delete(clean_geo_sizemap_e); // // if(clean_geo_sizemap_f) @@ -1565,7 +1594,7 @@ namespace //double tol = (( u2node.rbegin()->first - u2node.begin()->first ) / 20.) / u2node.size(); Standard_Real f,l; BRep_Tool::Range( TopoDS::Edge( shape ), f,l ); - double tol = (( l - f ) / 10.) / u2node.size(); // 10. - adjusted for #17262 + double tol = (( l - f ) / 10.) / double( u2node.size() ); // 10. - adjusted for #17262 std::multimap< double, const SMDS_MeshNode* >::iterator un2, un1; for ( un2 = u2node.begin(), un1 = un2++; un2 != u2node.end(); un1 = un2++ ) @@ -1619,7 +1648,7 @@ namespace TmpMesh() { - _myMeshDS = new SMESHDS_Mesh( _id, true ); + _meshDS = new SMESHDS_Mesh( _id, true ); } //-------------------------------------------------------------------------------- /*! @@ -1767,7 +1796,7 @@ namespace TSeg2EdgeMap seg2EdgeMap; TopoDS_Iterator edgeIt( wire ); - for ( int iSeg = 1; edgeIt.More(); edgeIt.Next(), ++iSeg ) + for ( size_t iSeg = 1; edgeIt.More() && iSeg < nodesOfVertices.size(); edgeIt.Next(), ++iSeg ) { SMESH_TLink link( nodesOfVertices[ iSeg-1 ], nodesOfVertices[ iSeg ]); TopoDS_Edge edge( TopoDS::Edge( edgeIt.Value() )); @@ -1818,7 +1847,7 @@ namespace if ( !n2nIt->second ) { n->GetXYZ( xyz ); gp_XY uv = tmpHelper.GetNodeUV( _proxyFace, n ); - n2nIt->second = helper.AddNode( xyz[0], xyz[1], xyz[2], uv.X(), uv.Y() ); + n2nIt->second = helper.AddNode( xyz[0], xyz[1], xyz[2], /*id=*/0, uv.X(), uv.Y() ); } nodes[ nbN ] = n2nIt->second; } @@ -1931,10 +1960,14 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); SMESH_MesherHelper helper( aMesh ), helperWithShape( aMesh ); - myHelper = theHelper = & helperWithShape; + theHelper = & helperWithShape; // do not call helper.IsQuadraticSubMesh() because sub-meshes // may be cleaned and helper.myTLinkNodeMap gets invalid in such a case bool haveQuadraticSubMesh = helperWithShape.IsQuadraticSubMesh( aShape ); + haveQuadraticSubMesh = haveQuadraticSubMesh || (_hypothesis && _hypothesis->GetQuadraticMesh()); + helper.SetIsQuadratic( haveQuadraticSubMesh ); + helperWithShape.SetIsQuadratic( haveQuadraticSubMesh ); + bool quadraticSubMeshAndViscousLayer = false; bool needMerge = false; typedef set< SMESHDS_SubMesh*, ShapeTypeCompare > TSubMeshSet; @@ -1947,6 +1980,8 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, TopTools_IndexedDataMapOfShapeListOfShape e2ffmap; TopExp::MapShapesAndAncestors( aShape, TopAbs_EDGE, TopAbs_FACE, e2ffmap ); + BLSURFPlugin_EnforcedMesh1D enforcedMesh( helperWithShape, _hypothesis ); + // Issue 0019864. On DebianSarge, FE signals do not obey to OSD::SetSignal(false) #ifndef WIN32 feclearexcept( FE_ALL_EXCEPT ); @@ -1988,9 +2023,6 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, SetParameters(_hypothesis, css, aShape); - haveQuadraticSubMesh = haveQuadraticSubMesh || (_hypothesis != NULL && _hypothesis->GetQuadraticMesh()); - helper.SetIsQuadratic( haveQuadraticSubMesh ); - // To remove as soon as quadratic mesh is allowed - BEGIN // GDD: Viscous layer is not allowed with quadratic mesh if (_haveViscousLayers && haveQuadraticSubMesh ) { @@ -2030,8 +2062,8 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, { TopoDS_Face f = TopoDS::Face(face_iter.Current()); - SMESH_subMesh* fSM = aMesh.GetSubMesh( f ); - if ( !fSM->IsEmpty() ) continue; // skip already meshed FACE with viscous layers + //SMESH_subMesh* fSM = aMesh.GetSubMesh( f ); + //if ( !fSM->IsEmpty() ) continue; // skip already meshed FACE with viscous layers // make INTERNAL face oriented FORWARD (issue 0020993) if (f.Orientation() != TopAbs_FORWARD && f.Orientation() != TopAbs_REVERSED ) @@ -2088,35 +2120,29 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, } // Specific size map = Attractor - std::map >::iterator attractor_iter = FaceId2AttractorCoords.begin(); - - for (; attractor_iter != FaceId2AttractorCoords.end(); ++attractor_iter) { - if (attractor_iter->first == faceKey) + std::map >::iterator attractor_iter = + FaceId2AttractorCoords.find( faceKey ); + if (attractor_iter != FaceId2AttractorCoords.end() ) + { + double * xyzCoords = & attractor_iter->second[2]; + gp_Pnt P(xyzCoords[0],xyzCoords[1],xyzCoords[2]); + BRepClass_FaceClassifier scl(f,P,1e-7); + TopAbs_State result = scl.State(); + if ( result == TopAbs_OUT ) + MESSAGE("Point is out of face: node is not created"); + if ( result == TopAbs_UNKNOWN ) + MESSAGE("Point position on face is unknown: node is not created"); + if ( result == TopAbs_ON ) + MESSAGE("Point is on border of face: node is not created"); + if ( result == TopAbs_IN ) { - double xyzCoords[3] = {attractor_iter->second[2], - attractor_iter->second[3], - attractor_iter->second[4]}; - - gp_Pnt P(xyzCoords[0],xyzCoords[1],xyzCoords[2]); - BRepClass_FaceClassifier scl(f,P,1e-7); - scl.Perform(f, P, 1e-7); - TopAbs_State result = scl.State(); - if ( result == TopAbs_OUT ) - MESSAGE("Point is out of face: node is not created"); - if ( result == TopAbs_UNKNOWN ) - MESSAGE("Point position on face is unknown: node is not created"); - if ( result == TopAbs_ON ) - MESSAGE("Point is on border of face: node is not created"); - if ( result == TopAbs_IN ) - { - // Point is inside face and not on border - double uvCoords[2] = {attractor_iter->second[0],attractor_iter->second[1]}; - ienf++; - cad_point_t* point_p = cad_point_new(fce, ienf, uvCoords); - cad_point_set_tag(point_p, ienf); - } - FaceId2AttractorCoords.erase(faceKey); + // Point is inside face and not on border + double * uvCoords = & attractor_iter->second[0]; + ienf++; + cad_point_t* point_p = cad_point_new(fce, ienf, uvCoords); + cad_point_set_tag(point_p, ienf); } + FaceId2AttractorCoords.erase(faceKey); } // ----------------- @@ -2146,14 +2172,19 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, BLSURFPlugin_Hypothesis::TEnfVertexCoordsList::const_iterator evlIt = evl.begin(); for (; evlIt != evl.end(); ++evlIt) { + BLSURFPlugin_Hypothesis::TEnfVertexCoords xyzCoords = { evlIt->at(2), + evlIt->at(3), + evlIt->at(4)}; + bool isOnEdge = evlIt->at(5); + if ( isOnEdge ) + { + enforcedMesh.AddVertexOnEdge( xyzCoords.data() ); + continue; + } double uvCoords[2] = { evlIt->at(0), evlIt->at(1) }; ienf++; cad_point_t* point_p = cad_point_new(fce, ienf, uvCoords); int tag = 0; - BLSURFPlugin_Hypothesis::TEnfVertexCoords xyzCoords; - xyzCoords.push_back(evlIt->at(2)); - xyzCoords.push_back(evlIt->at(3)); - xyzCoords.push_back(evlIt->at(4)); std::map< BLSURFPlugin_Hypothesis::TEnfVertexCoords, BLSURFPlugin_Hypothesis::TEnfVertexList >::const_iterator enfCoordsIt = EnfVertexCoords2EnfVertexList.find(xyzCoords); if (enfCoordsIt != EnfVertexCoords2EnfVertexList.end() && !enfCoordsIt->second.empty() ) @@ -2182,19 +2213,24 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, EDGES now create the edges associated to this face *****************************************************************************************/ - int edgeKey = -1; - for (TopExp_Explorer edge_iter(f,TopAbs_EDGE);edge_iter.More();edge_iter.Next()) + + std::vector< TopoDS_Edge > edges; + for ( TopExp_Explorer edge_iter( f, TopAbs_EDGE ); edge_iter.More(); edge_iter.Next() ) + { + const TopoDS_Edge& e = TopoDS::Edge( edge_iter.Current() ); + if ( !enforcedMesh.GetSplitsOfEdge( e, edges, emap )) + edges.push_back( e ); + } + for ( const TopoDS_Edge& e : edges ) { - TopoDS_Edge e = TopoDS::Edge(edge_iter.Current()); - int ic = emap.FindIndex(e); - if (ic <= 0) - ic = emap.Add(e); + int ic = emap.Add(e); double tmin,tmax; curves.push_back(BRep_Tool::CurveOnSurface(e, f, tmin, tmax)); - if (HasSizeMapOnEdge){ - edgeKey = EdgesWithSizeMap.FindIndex(e); + if ( HasSizeMapOnEdge ) + { + int edgeKey = EdgesWithSizeMap.FindIndex(e); if (EdgeId2SizeMap.find(edgeKey)!=EdgeId2SizeMap.end()) { theSizeMapStr = EdgeId2SizeMap[edgeKey]; @@ -2240,7 +2276,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, tmin = nodeDataVec.front().param; tmax = nodeDataVec.back().param; - existingPhySize += nodeData->Length() / ( nodeDataVec.size() - 1 ); + existingPhySize += nodeData->Length() / double( nodeDataVec.size() - 1 ); } else { @@ -2256,6 +2292,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, The following call sets it to the same value as the edge_id : */ // IMP23368. Do not set tag to an EDGE shared by FACEs of a hyper-patch bool isInHyperPatch = false; + if ( e2ffmap.Contains( e )) // not there for a part of EDGE divided by enforced segments { std::set< int > faceTags, faceIDs; TopTools_ListIteratorOfListOfShape fIt( e2ffmap.FindFromKey( e )); @@ -2275,7 +2312,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, if ( !isInHyperPatch ) cad_edge_set_tag(edg, ic); - /* by default, an edge does not necessalry appear in the resulting mesh, + /* by default, an edge does not necessarily appear in the resulting mesh, unless the following property is set : */ cad_edge_set_property(edg, EDGE_PROPERTY_SOFT_REQUIRED); @@ -2288,7 +2325,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, if ( nodeData ) { const std::vector& nodeDataVec = nodeData->GetUVPtStruct(); - const int nbNodes = nodeDataVec.size(); + const int nbNodes = (int) nodeDataVec.size(); dcad_edge_discretization_t *dedge; dcad_get_edge_discretization(dcad, edg, &dedge); @@ -2299,9 +2336,9 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, for ( int iN = 0; iN < nbNodes; ++iN ) { const UVPtStruct& nData = nodeDataVec[ iN ]; - double t = nData.param; - real uv[2] = { nData.u, nData.v }; - SMESH_TNodeXYZ nXYZ( nData.node ); + double t = nData.param; + real uv[2] = { nData.u, nData.v }; + SMESH_TNodeXYZ nXYZ = nData.node; // cout << "\tt = " << t // << "\t uv = ( " << uv[0] << ","<< uv[1] << " ) " // << "\t u = " << nData.param @@ -2324,38 +2361,23 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, *****************************************************************************************/ int npts = 0; - int ip1, ip2, *ip; - gp_Pnt2d e0 = curves.back()->Value(tmin); - gp_Pnt ee0 = surfaces.back()->Value(e0.X(), e0.Y()); - Standard_Real d1=0,d2=0; - - int vertexKey = -1; - for (TopExp_Explorer ex_edge(e ,TopAbs_VERTEX); ex_edge.More(); ex_edge.Next()) { - TopoDS_Vertex v = TopoDS::Vertex(ex_edge.Current()); - ++npts; - if (npts == 1){ - ip = &ip1; - d1 = ee0.SquareDistance(BRep_Tool::Pnt(v)); - } else { - ip = &ip2; - d2 = ee0.SquareDistance(BRep_Tool::Pnt(v)); - } - *ip = pmap.FindIndex(v); - if(*ip <= 0) { - *ip = pmap.Add(v); - // SMESH_subMesh* sm = aMesh.GetSubMesh(v); - // if ( sm->IsMeshComputed() ) - // edgeSubmeshes.insert( sm->GetSubMeshDS() ); - } + int ip[2]; + double d[2]; + gp_Pnt2d uv0 = curves.back()->Value(tmin); + gp_Pnt p0 = surfaces.back()->Value( uv0.X(), uv0.Y() ); -// std::string aFileName = "fmap_vertex_"; -// aFileName.append(val_to_string(*ip)); -// aFileName.append(".brep"); -// BRepTools::Write(v,aFileName.c_str()); + for (TopExp_Explorer ex_edge(e ,TopAbs_VERTEX); ex_edge.More(); ex_edge.Next()) + { + const TopoDS_Vertex& v = TopoDS::Vertex(ex_edge.Current()); + ip[ npts ] = pmap.Add(v); + d [ npts ] = p0.SquareDistance(BRep_Tool::Pnt(v)); + ++npts; - if (HasSizeMapOnVertex){ - vertexKey = VerticesWithSizeMap.FindIndex(v); - if (VertexId2SizeMap.find(vertexKey)!=VertexId2SizeMap.end()){ + if (HasSizeMapOnVertex) + { + int vertexKey = VerticesWithSizeMap.FindIndex(v); + if (VertexId2SizeMap.find(vertexKey)!=VertexId2SizeMap.end()) + { theSizeMapStr = VertexId2SizeMap[vertexKey]; if (theSizeMapStr.find(bad_end) == (theSizeMapStr.size()-bad_end.size()-1)) continue; @@ -2371,23 +2393,65 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, PyGILState_Release(gstate); } } - } - if (npts != 2) { - // should not happen + } // loop on vertices + + if (npts != 2) { // should not happen MESSAGE("An edge does not have 2 extremities."); - } else { - if (d1 < d2) { - // This defines the curves extremity connectivity - cad_edge_set_extremities(edg, ip1, ip2); - /* set the tag (color) to the same value as the extremity id : */ - cad_edge_set_extremities_tag(edg, ip1, ip2); - } - else { - cad_edge_set_extremities(edg, ip2, ip1); - cad_edge_set_extremities_tag(edg, ip2, ip1); - } + continue; } + + if ( d[0] > d[1] ) + std::swap( ip[0], ip[1] ); + + // This defines the curves extremity connectivity + cad_edge_set_extremities (edg, ip[0], ip[1]); + /* set the tag (color) to the same value as the extremity id : */ + cad_edge_set_extremities_tag(edg, ip[0], ip[1]); + } // for edge + + // ============================== + // Add segments of enforced mesh + // ============================== + + if ( enforcedMesh.HasSegmentsOnFace( f )) + { + BLSURFPlugin_EnforcedMesh1D::Segmemnt seg; + while ( enforcedMesh.NextSegment( seg, pmap )) + { + curves.push_back( seg._pcurve ); + + cad_edge_t *edg = cad_edge_new( fce, seg._tag, seg._u[0], seg._u[1], + curv_fun,seg._pcurve.get()); + cad_edge_set_tag( edg, seg._tag ); + + cad_edge_set_property( edg, EDGE_PROPERTY_SOFT_REQUIRED ); + cad_edge_set_property( edg, EDGE_PROPERTY_INTERNAL ); + + cad_edge_set_extremities ( edg, seg._vTag[0], seg._vTag[1]); + cad_edge_set_extremities_tag( edg, seg._vTag[0], seg._vTag[1]); + + dcad_edge_discretization_t *dedge; + dcad_get_edge_discretization( dcad, edg, &dedge ); + dcad_edge_discretization_set_vertex_count( dedge, 2 ); + + dcad_edge_discretization_set_vertex_coordinates( dedge, 1, + seg._u [0], + &seg._uv[0].ChangeCoord(1), + seg._xyz[0].ChangeData() ); + dcad_edge_discretization_set_vertex_coordinates( dedge, 2, + seg._u [1], + &seg._uv[1].ChangeCoord(1), + seg._xyz[1].ChangeData() ); + + dcad_edge_discretization_set_vertex_tag( dedge, 1, seg._vTag[0] ); + dcad_edge_discretization_set_vertex_tag( dedge, 2, seg._vTag[1] ); + + dcad_edge_discretization_set_property(dedge, DISTENE_DCAD_PROPERTY_REQUIRED); + } + } + + } //for face /////////////////////// @@ -2415,8 +2479,9 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, { // If no source points, call periodicity without transformation function meshgems_cad_periodicity_transformation_t periodicity_transformation = NULL; - status = cad_add_face_multiple_periodicity_with_transformation_function(c, theFace1_ids_c, theFace1_ids.size(), - theFace2_ids_c, theFace2_ids.size(), periodicity_transformation, NULL); + status = cad_add_face_multiple_periodicity_with_transformation_function + (c, theFace1_ids_c, (meshgems_integer) theFace1_ids.size(), theFace2_ids_c, + (meshgems_integer) theFace2_ids.size(), periodicity_transformation, NULL); if(status != STATUS_OK) cout << "cad_add_face_multiple_periodicity_with_transformation_function failed with error code " << status << "\n"; } @@ -2425,11 +2490,12 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, // get the transformation vertices double* theSourceVerticesCoords_c = &_preCadFacesIDsPeriodicityVector[i].theSourceVerticesCoords[0]; double* theTargetVerticesCoords_c = &_preCadFacesIDsPeriodicityVector[i].theTargetVerticesCoords[0]; - int nbSourceVertices = _preCadFacesIDsPeriodicityVector[i].theSourceVerticesCoords.size()/3; - int nbTargetVertices = _preCadFacesIDsPeriodicityVector[i].theTargetVerticesCoords.size()/3; + int nbSourceVertices = (int)_preCadFacesIDsPeriodicityVector[i].theSourceVerticesCoords.size()/3; + int nbTargetVertices = (int)_preCadFacesIDsPeriodicityVector[i].theTargetVerticesCoords.size()/3; - status = cad_add_face_multiple_periodicity_with_transformation_function_by_points(c, theFace1_ids_c, theFace1_ids.size(), - theFace2_ids_c, theFace2_ids.size(), theSourceVerticesCoords_c, nbSourceVertices, theTargetVerticesCoords_c, nbTargetVertices); + status = cad_add_face_multiple_periodicity_with_transformation_function_by_points + (c, theFace1_ids_c, (meshgems_integer) theFace1_ids.size(), theFace2_ids_c, + (meshgems_integer) theFace2_ids.size(), theSourceVerticesCoords_c, nbSourceVertices, theTargetVerticesCoords_c, nbTargetVertices); if(status != STATUS_OK) cout << "cad_add_face_multiple_periodicity_with_transformation_function_by_points failed with error code " << status << "\n"; } @@ -2460,8 +2526,9 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, { // If no source points, call periodicity without transformation function meshgems_cad_periodicity_transformation_t periodicity_transformation = NULL; - status = cad_add_edge_multiple_periodicity_with_transformation_function(c, theEdge1_ids_c, theEdge1_ids.size(), - theEdge2_ids_c, theEdge2_ids.size(), periodicity_transformation, NULL); + status = cad_add_edge_multiple_periodicity_with_transformation_function + (c, theEdge1_ids_c, (meshgems_integer) theEdge1_ids.size(), theEdge2_ids_c, + (meshgems_integer) theEdge2_ids.size(), periodicity_transformation, NULL); if(status != STATUS_OK) cout << "cad_add_edge_multiple_periodicity_with_transformation_function failed with error code " << status << "\n"; } @@ -2470,11 +2537,12 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, // get the transformation vertices double* theSourceVerticesCoords_c = &_preCadEdgesIDsPeriodicityVector[i].theSourceVerticesCoords[0]; double* theTargetVerticesCoords_c = &_preCadEdgesIDsPeriodicityVector[i].theTargetVerticesCoords[0]; - int nbSourceVertices = _preCadEdgesIDsPeriodicityVector[i].theSourceVerticesCoords.size()/3; - int nbTargetVertices = _preCadEdgesIDsPeriodicityVector[i].theTargetVerticesCoords.size()/3; + int nbSourceVertices = (int) _preCadEdgesIDsPeriodicityVector[i].theSourceVerticesCoords.size()/3; + int nbTargetVertices = (int) _preCadEdgesIDsPeriodicityVector[i].theTargetVerticesCoords.size()/3; - status = cad_add_edge_multiple_periodicity_with_transformation_function_by_points(c, theEdge1_ids_c, theEdge1_ids.size(), - theEdge2_ids_c, theEdge2_ids.size(), theSourceVerticesCoords_c, nbSourceVertices, theTargetVerticesCoords_c, nbTargetVertices); + status = cad_add_edge_multiple_periodicity_with_transformation_function_by_points + (c, theEdge1_ids_c, (meshgems_integer) theEdge1_ids.size(), theEdge2_ids_c, + (meshgems_integer) theEdge2_ids.size(), theSourceVerticesCoords_c, nbSourceVertices, theTargetVerticesCoords_c, nbTargetVertices); if(status != STATUS_OK) cout << "cad_add_edge_multiple_periodicity_with_transformation_function_by_points failed with error code " << status << "\n"; } @@ -2497,11 +2565,10 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, // set_param(css, "global_physical_size", val_to_string( minFaceSize * 0.5 ).c_str()); // set_param(css, "max_size", val_to_string( minFaceSize * 5 ).c_str()); } - - // TODO: be able to use a mesh in input. - // See imsh usage in Products/templates/mg-cadsurf_template_common.cpp - // => cadsurf_set_mesh - + std::string errorTxt; + if ( !SMESHUtils_MGLicenseKeyGen::SignCAD( c, errorTxt )) + return error( "Problem with library SalomeMeshGemsKeyGenerator: " + errorTxt ); + // Use the original dcad cadsurf_set_dcad(css, dcad); @@ -2587,7 +2654,8 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, std::string GMFFileName = BLSURFPlugin_Hypothesis::GetDefaultGMFFile(); if (_hypothesis) GMFFileName = _hypothesis->GetGMFFile(); - if (GMFFileName != "") { + if (GMFFileName != "") + { bool asciiFound = (GMFFileName.find(".mesh", GMFFileName.length()-5) != std::string::npos); bool binaryFound = (GMFFileName.find(".meshb",GMFFileName.length()-6) != std::string::npos); if (!asciiFound && !binaryFound) @@ -2597,98 +2665,100 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, /* retrieve mesh data (see meshgems/mesh.h) */ integer nv, ne, nt, nq, vtx[4], tag, nb_tag; - integer *evedg, *evtri, *evquad, *tags_buff, type; + integer type; real xyz[3]; - mesh_get_vertex_count(msh, &nv); - mesh_get_edge_count(msh, &ne); - mesh_get_triangle_count(msh, &nt); + mesh_get_vertex_count (msh, &nv); + mesh_get_edge_count (msh, &ne); + mesh_get_triangle_count (msh, &nt); mesh_get_quadrangle_count(msh, &nq); + + using deleted_unique_ptr = std::unique_ptr>; + + deleted_unique_ptr evedg_var((integer *)mesh_calloc_generic_buffer(msh), [](integer *ptr) { free(ptr); }); + deleted_unique_ptr evtri_var((integer *)mesh_calloc_generic_buffer(msh), [](integer *ptr) { free(ptr); }); + deleted_unique_ptr evquad_var((integer *)mesh_calloc_generic_buffer(msh), [](integer *ptr) { free(ptr); }); + deleted_unique_ptr tags_buff_var((integer*)mesh_calloc_generic_buffer(msh), [](integer *ptr) { free(ptr); }); - evedg = (integer *)mesh_calloc_generic_buffer(msh); - evtri = (integer *)mesh_calloc_generic_buffer(msh); - evquad = (integer *)mesh_calloc_generic_buffer(msh); - tags_buff = (integer*)mesh_calloc_generic_buffer(msh); + integer *evedg(evedg_var.get()),*evtri(evtri_var.get()),*evquad(evquad_var.get()),*tags_buff(tags_buff_var.get()); std::vector nodes(nv+1); std::vector tags(nv+1); + BLSURFPlugin_Hypothesis::TEnfVertexCoords projVertex; + /* enumerated vertices */ - for(int iv=1;iv<=nv;iv++) { + for ( int iv = 1; iv <= nv; iv++ ) + { mesh_get_vertex_coordinates(msh, iv, xyz); mesh_get_vertex_tag(msh, iv, &tag); // Issue 0020656. Use vertex coordinates nodes[iv] = NULL; - if ( tag > 0 && tag <= pmap.Extent() ) { - TopoDS_Vertex v = TopoDS::Vertex(pmap(tag)); - double tol = BRep_Tool::Tolerance( v ); - gp_Pnt p = BRep_Tool::Pnt( v ); - if ( p.IsEqual( gp_Pnt( xyz[0], xyz[1], xyz[2]), 1e3*tol)) - xyz[0] = p.X(), xyz[1] = p.Y(), xyz[2] = p.Z(); - else - tag = 0; // enforced or attracted vertex - nodes[iv] = SMESH_Algo::VertexNode( v, meshDS ); + bool isEnforcedNode = false; + if ( tag > 0 ) + { + if ( tag <= pmap.Extent() ) + { + TopoDS_Vertex v = TopoDS::Vertex(pmap(tag)); + double tol = BRep_Tool::Tolerance( v ); + gp_Pnt p = BRep_Tool::Pnt( v ); + if ( p.IsEqual( gp_Pnt( xyz[0], xyz[1], xyz[2]), 1e3*tol)) + xyz[0] = p.X(), xyz[1] = p.Y(), xyz[2] = p.Z(); + else + tag = 0; // enforced or attracted vertex + nodes[iv] = SMESH_Algo::VertexNode( v, meshDS ); + } + if ( !nodes[iv] ) + isEnforcedNode = ( nodes[iv] = enforcedMesh.GetNodeByTag( tag, pmap )); } if ( !nodes[iv] ) nodes[iv] = meshDS->AddNode(xyz[0], xyz[1], xyz[2]); // Create group of enforced vertices if requested - BLSURFPlugin_Hypothesis::TEnfVertexCoords projVertex; - projVertex.clear(); - projVertex.push_back((double)xyz[0]); - projVertex.push_back((double)xyz[1]); - projVertex.push_back((double)xyz[2]); - std::map< BLSURFPlugin_Hypothesis::TEnfVertexCoords, BLSURFPlugin_Hypothesis::TEnfVertexList >::const_iterator enfCoordsIt = EnfVertexCoords2EnfVertexList.find(projVertex); + projVertex.assign( xyz, xyz + 3 ); + auto enfCoordsIt = EnfVertexCoords2EnfVertexList.find( projVertex ); if (enfCoordsIt != EnfVertexCoords2EnfVertexList.end()) { - BLSURFPlugin_Hypothesis::TEnfVertexList::const_iterator enfListIt = enfCoordsIt->second.begin(); - BLSURFPlugin_Hypothesis::TEnfVertex *currentEnfVertex; - for (; enfListIt != enfCoordsIt->second.end(); ++enfListIt) { - currentEnfVertex = (*enfListIt); - if (currentEnfVertex->grpName != "") { - bool groupDone = false; - SMESH_Mesh::GroupIteratorPtr grIt = aMesh.GetGroups(); - while (grIt->more()) { + for ( BLSURFPlugin_Hypothesis::TEnfVertex *currentEnfVertex : enfCoordsIt->second ) + if (currentEnfVertex->grpName != "") + { + SMDS_MeshGroup* groupDS = nullptr; + for ( SMESH_Mesh::GroupIteratorPtr grIt = aMesh.GetGroups(); grIt->more() && !groupDS; ) + { SMESH_Group * group = grIt->next(); - if ( !group ) continue; - SMESHDS_GroupBase* groupDS = group->GetGroupDS(); - if ( !groupDS ) continue; - if ( groupDS->GetType()==SMDSAbs_Node && currentEnfVertex->grpName.compare(group->GetName())==0) { - SMESHDS_Group* aGroupDS = static_cast( groupDS ); - aGroupDS->SMDSGroup().Add(nodes[iv]); - // How can I inform the hypothesis ? - // _hypothesis->AddEnfVertexNodeID(currentEnfVertex->grpName,nodes[iv]->GetID()); - groupDone = true; - break; - } + SMESHDS_Group * grp = dynamic_cast< SMESHDS_Group* >( group->GetGroupDS() ); + if ( grp && + grp->GetType() == SMDSAbs_Node && + currentEnfVertex->grpName == group->GetName() ) + groupDS = &grp->SMDSGroup(); } - if (!groupDone) + if ( !groupDS ) { - SMESH_Group* aGroup = aMesh.AddGroup( SMDSAbs_Node, currentEnfVertex->grpName.c_str() ); - aGroup->SetName( currentEnfVertex->grpName.c_str() ); - SMESHDS_Group* aGroupDS = static_cast( aGroup->GetGroupDS() ); - aGroupDS->SMDSGroup().Add(nodes[iv]); - groupDone = true; + SMESH_Group * group = aMesh.AddGroup( SMDSAbs_Node, currentEnfVertex->grpName.c_str() ); + SMESHDS_Group * grp = static_cast< SMESHDS_Group* >( group->GetGroupDS() ); + groupDS = &grp->SMDSGroup(); } - if (!groupDone) - throw SALOME_Exception(LOCALIZED("An enforced vertex node was not added to a group")); + groupDS->Add( nodes[iv] ); } - else - MESSAGE("Group name is empty: '"<grpName<<"' => group is not created"); - } } + if ( isEnforcedNode ) + continue; // internal points are tagged to zero - if(tag > 0 && tag <= pmap.Extent() ){ + if ( tag > 0 && tag <= pmap.Extent() ) + { meshDS->SetNodeOnVertex(nodes[iv], TopoDS::Vertex(pmap(tag))); tags[iv] = false; - } else { + } + else + { tags[iv] = true; } } /* enumerate edges */ - for(int it=1;it<=ne;it++) { + for ( int it = 1; it <= ne; it++ ) + { SMDS_MeshEdge* edg; mesh_get_edge_vertices(msh, it, vtx); mesh_get_edge_extra_vertices(msh, it, &type, evedg); @@ -2696,17 +2766,24 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, // If PreCAD performed some cleaning operations (remove tiny edges, // merge edges ...) an output tag can indeed represent several original tags. - // Get the initial tags corresponding to the output tag and redefine the tag as + // Get the initial tags corresponding to the output tag and redefine the tag as // the last of the two initial tags (else the output tag is out of emap and hasn't any meaning) mesh_get_composite_tag_definition(msh, tag, &nb_tag, tags_buff); - if(nb_tag > 1) - tag=tags_buff[nb_tag-1]; + if ( nb_tag > 1 ) + tag = tags_buff[ nb_tag-1 ]; if ( tag < 1 || tag > emap.Extent() ) { - std::cerr << "MG-CADSurf BUG:::: Edge tag " << tag - << " does not point to a CAD edge (nb edges " << emap.Extent() << ")" << std::endl; + if ( !enforcedMesh.IsSegmentTag( tag )) // it's a false INTERNAL EDGE of enforced mesh + { + std::cerr << "MG-CADSurf BUG:::: Edge tag " << tag + << " does not point to a CAD edge (nb edges " << emap.Extent() << ")" + << std::endl; + } continue; } + if ( meshDS->ShapeToIndex( emap( tag )) == 0 ) + tag = enforcedMesh.GetTagOfSplitEdge( tag ); + if (tags[vtx[0]]) { Set_NodeOnEdge(meshDS, nodes[vtx[0]], emap(tag)); tags[vtx[0]] = false; @@ -2925,6 +3002,14 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, error(_comment); } + // Set event listeners + if ( _hypothesis ) + for ( int iF = 1; iF <= fmap.Size(); ++iF ) + { + const TopoDS_Shape& face = fmap( iF ); + SetEventListener( aMesh.GetSubMesh( face )); + } + // Issue 0019864. On DebianSarge, FE signals do not obey to OSD::SetSignal(false) #ifndef WIN32 if ( oldFEFlags > 0 ) @@ -2960,6 +3045,10 @@ bool BLSURFPlugin_BLSURF::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelpe context_t *ctx = context_new(); if (!ctx) return error("Pb in context_new()"); + if ( aMesh.NbNodes() > std::numeric_limits< meshgems_integer >::max() || + aMesh.NbFaces() > std::numeric_limits< meshgems_integer >::max() ) + return error("Too large input mesh"); + BLSURF_Cleaner cleaner( ctx ); message_cb_user_data mcud; @@ -2978,7 +3067,7 @@ bool BLSURFPlugin_BLSURF::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelpe // Fill an input mesh mesh_t * msh = meshgems_mesh_new_in_memory( ctx ); - if ( !msh ) return error("Pb. in meshgems_mesh_new_in_memory()"); + if ( !msh ) return error("Pb. in meshgems_mesh_new_in_memory()"); // mark nodes used by 2D elements SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); @@ -2988,7 +3077,7 @@ bool BLSURFPlugin_BLSURF::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelpe const SMDS_MeshNode* n = nodeIt->next(); n->setIsMarked( n->NbInverseElements( SMDSAbs_Face )); } - meshgems_mesh_set_vertex_count( msh, meshDS->NbNodes() ); + meshgems_mesh_set_vertex_count( msh, (meshgems_integer) meshDS->NbNodes() ); // set node coordinates if ( meshDS->NbNodes() != meshDS->MaxNodeID() ) @@ -3005,8 +3094,8 @@ bool BLSURFPlugin_BLSURF::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelpe } // set nodes of faces - meshgems_mesh_set_triangle_count ( msh, meshDS->GetMeshInfo().NbTriangles() ); - meshgems_mesh_set_quadrangle_count( msh, meshDS->GetMeshInfo().NbQuadrangles() ); + meshgems_mesh_set_triangle_count ( msh, (meshgems_integer) meshDS->GetMeshInfo().NbTriangles() ); + meshgems_mesh_set_quadrangle_count( msh, (meshgems_integer) meshDS->GetMeshInfo().NbQuadrangles() ); meshgems_integer nodeIDs[4]; meshgems_integer iT = 1, iQ = 1; SMDS_FaceIteratorPtr faceIt = meshDS->facesIterator(); @@ -3017,13 +3106,18 @@ bool BLSURFPlugin_BLSURF::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelpe if ( nbNodes > 4 || face->IsPoly() ) continue; for ( i = 0; i < nbNodes; ++i ) - nodeIDs[i] = face->GetNode( i )->GetID(); + nodeIDs[i] = (meshgems_integer) face->GetNode( i )->GetID(); if ( nbNodes == 3 ) meshgems_mesh_set_triangle_vertices ( msh, iT++, nodeIDs ); else meshgems_mesh_set_quadrangle_vertices( msh, iQ++, nodeIDs ); } + std::string errorTxt; + + if ( !SMESHUtils_MGLicenseKeyGen::SignMesh( msh, "cadsurf", errorTxt )) + return error( "Problem with library SalomeMeshGemsKeyGenerator: " + errorTxt ); + ret = cadsurf_set_mesh(css, msh); if ( ret != STATUS_OK ) return error("Pb in cadsurf_set_mesh()"); @@ -3077,7 +3171,7 @@ bool BLSURFPlugin_BLSURF::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelpe { meshgems_mesh_get_vertex_coordinates( omsh, i, xyz ); SMDS_MeshNode* n = meshDS->AddNode( xyz[0], xyz[1], xyz[2] ); - nodeID = n->GetID(); + nodeID = (meshgems_integer) n->GetID(); meshgems_mesh_set_vertex_tag( omsh, i, &nodeID ); // save mapping of IDs in MG and SALOME meshes } @@ -3199,31 +3293,27 @@ void BLSURFPlugin_BLSURF::Set_NodeOnEdge(SMESHDS_Mesh* meshDS, */ status_t curv_fun(real t, real *uv, real *dt, real *dtt, void *user_data) { - /* t is given. It contains the t (time) 1D parametric coordintaes - of the point PreCAD/MG-CADSurf is querying on the curve */ + /* t is given. It contains the 1D parametric coordintaes + of the point MG-CADSurf is querying on the curve */ - /* user_data identifies the edge PreCAD/MG-CADSurf is querying - * (see cad_edge_new later in this example) */ - const Geom2d_Curve*pargeo = (const Geom2d_Curve*) user_data; + /* user_data identifies the edge MG-CADSurf is querying */ + const Geom2d_Curve* pargeo = (const Geom2d_Curve*) user_data; - if (uv){ - /* MG-CADSurf is querying the function evaluation */ - gp_Pnt2d P; - P=pargeo->Value(t); + if (uv) { + /* MG-CADSurf is querying the function evaluation */ + gp_Pnt2d P = pargeo->Value(t); uv[0]=P.X(); uv[1]=P.Y(); } - if(dt) { - /* query for the first order derivatives */ - gp_Vec2d V1; - V1=pargeo->DN(t,1); + if (dt) { + /* query for the first order derivatives */ + gp_Vec2d V1 = pargeo->DN(t,1); dt[0]=V1.X(); dt[1]=V1.Y(); } - if(dtt){ + if (dtt) { /* query for the second order derivatives */ - gp_Vec2d V2; - V2=pargeo->DN(t,2); + gp_Vec2d V2 = pargeo->DN(t,2); dtt[0]=V2.X(); dtt[1]=V2.Y(); } @@ -3417,7 +3507,7 @@ status_t message_cb(message_t *msg, void *user_data) err.find("periodicity") != string::npos ) { // remove ^A from the tail - int len = strlen( desc ); + size_t len = strlen( desc ); while (len > 0 && desc[len-1] != '\n') len--; mcud->_error->append( desc, len ); @@ -3448,7 +3538,7 @@ status_t interrupt_cb(integer *interrupt_status, void *user_data) else /* you want to stop MG-CADSurf */ { *interrupt_status = INTERRUPT_STOP; - return STATUS_ERROR; + return STATUS_OK; } } @@ -3523,8 +3613,8 @@ bool BLSURFPlugin_BLSURF::Evaluate(SMESH_Mesh& aMesh, nb1d = (int)( fullAng/_angleMesh + 1 ); } fullNbSeg += nb1d; - std::vector aVec(SMDSEntity_Last); - for(int i=SMDSEntity_Node; i aVec(SMDSEntity_Last); + for(smIdType i=SMDSEntity_Node; i 0 ) { aVec[SMDSEntity_Node] = 2*nb1d - 1; aVec[SMDSEntity_Quad_Edge] = nb1d; @@ -3571,7 +3661,7 @@ bool BLSURFPlugin_BLSURF::Evaluate(SMESH_Mesh& aMesh, nbTria = nbQuad = nbTria / 3 + 1; } } - std::vector aVec(SMDSEntity_Last,0); + std::vector aVec(SMDSEntity_Last,0); if( IsQuadratic ) { int nb1d_in = (nbTria*3 - nb1d) / 2; aVec[SMDSEntity_Node] = nbNodes + nb1d_in; @@ -3595,8 +3685,8 @@ bool BLSURFPlugin_BLSURF::Evaluate(SMESH_Mesh& aMesh, double tetrVol = 0.1179*ELen*ELen*ELen; int nbVols = int(aVolume/tetrVol); int nb1d_in = int(( nbVols*6 - fullNbSeg ) / 6 ); - std::vector aVec(SMDSEntity_Last); - for(int i=SMDSEntity_Node; i aVec(SMDSEntity_Last); + for(smIdType i=SMDSEntity_Node; iGetEnforcedMeshes() ) + { + SMESH_Mesh* mesh1D; + _hypothesis->GetEnforcedSegments( enfMesh, mesh1D ); + if ( !mesh1D ) + continue; + + TopExp_Explorer edgeExp( mesh1D->GetShapeToMesh(), TopAbs_EDGE ); + if ( edgeExp.More() ) + StdMeshers_ProjectionUtils::SetEventListener( faceSubMesh, + edgeExp.Current(), + mesh1D ); + // StdMeshers_ProjectionUtils::SetEventListener( faceSubMesh, + // mesh1D->GetShapeToMesh(), + // mesh1D ); + } + return; +} + +//================================================================================ +/*! + * \brief Allow algo to do something after persistent restoration + * \param subMesh - restored submesh + * + * This method is called only if a submesh has HYP_OK algo_state. + */ +//================================================================================ + +void BLSURFPlugin_BLSURF::SubmeshRestored(SMESH_subMesh* subMesh) +{ + SetEventListener( subMesh ); +}