X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FBLSURFPlugin%2FBLSURFPlugin_BLSURF.cxx;h=ca54cf399db7228228ada1e08581c449c731623d;hb=0d3082a841df02944ed867bbdfee21658fa17224;hp=4cfa4f0d1f1beeffc215698b614d33e18e1c7a0b;hpb=fbf4b5afe907be5ac63c0260663f17c34d3672f0;p=plugins%2Fblsurfplugin.git diff --git a/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx b/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx index 4cfa4f0..ca54cf3 100644 --- a/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx +++ b/src/BLSURFPlugin/BLSURFPlugin_BLSURF.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 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 @@ -31,7 +31,6 @@ extern "C"{ #include #include -#include } #include @@ -49,6 +48,7 @@ extern "C"{ #include #include #include +#include #include @@ -95,112 +95,116 @@ extern "C"{ #include #endif +using namespace std; + /* ================================== * =========== PYTHON ============== * ==================================*/ -typedef struct { - PyObject_HEAD - int softspace; - std::string *out; - } PyStdOut; - -static void -PyStdOut_dealloc(PyStdOut *self) +namespace { - PyObject_Del(self); -} + typedef struct { + PyObject_HEAD + int softspace; + std::string *out; + } PyStdOut; + + static void + PyStdOut_dealloc(PyStdOut *self) + { + PyObject_Del(self); + } -static PyObject * -PyStdOut_write(PyStdOut *self, PyObject *args) -{ - char *c; - int l; - if (!PyArg_ParseTuple(args, "t#:write",&c, &l)) - return NULL; + static PyObject * + PyStdOut_write(PyStdOut *self, PyObject *args) + { + char *c; + int l; + if (!PyArg_ParseTuple(args, "t#:write",&c, &l)) + return NULL; - //std::cerr << c ; - *(self->out)=*(self->out)+c; + *(self->out)=*(self->out)+c; - Py_INCREF(Py_None); - return Py_None; -} + Py_INCREF(Py_None); + return Py_None; + } -static PyMethodDef PyStdOut_methods[] = { - {"write", (PyCFunction)PyStdOut_write, METH_VARARGS, - PyDoc_STR("write(string) -> None")}, - {NULL, NULL} /* sentinel */ -}; - -static PyMemberDef PyStdOut_memberlist[] = { - {(char*)"softspace", T_INT, offsetof(PyStdOut, softspace), 0, - (char*)"flag indicating that a space needs to be printed; used by print"}, - {NULL} /* Sentinel */ -}; - -static PyTypeObject PyStdOut_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "PyOut", /*tp_name*/ - sizeof(PyStdOut), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)PyStdOut_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr, /*tp_getattro*/ - /* softspace is writable: we must supply tp_setattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - PyStdOut_methods, /*tp_methods*/ - PyStdOut_memberlist, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - 0, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ -}; - -PyObject * newPyStdOut( std::string& out ) -{ - PyStdOut *self; - self = PyObject_New(PyStdOut, &PyStdOut_Type); - if (self == NULL) - return NULL; - self->softspace = 0; - self->out=&out; - return (PyObject*)self; + static PyMethodDef PyStdOut_methods[] = { + {"write", (PyCFunction)PyStdOut_write, METH_VARARGS, + PyDoc_STR("write(string) -> None")}, + {NULL, NULL} /* sentinel */ + }; + + static PyMemberDef PyStdOut_memberlist[] = { + {(char*)"softspace", T_INT, offsetof(PyStdOut, softspace), 0, + (char*)"flag indicating that a space needs to be printed; used by print"}, + {NULL} /* Sentinel */ + }; + + static PyTypeObject PyStdOut_Type = { + /* The ob_type field must be initialized in the module init function + * to be portable to Windows without using C++. */ + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "PyOut", /*tp_name*/ + sizeof(PyStdOut), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyStdOut_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + PyObject_GenericGetAttr, /*tp_getattro*/ + /* softspace is writable: we must supply tp_setattro */ + PyObject_GenericSetAttr, /* tp_setattro */ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + PyStdOut_methods, /*tp_methods*/ + PyStdOut_memberlist, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + 0, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + }; + + PyObject * newPyStdOut( std::string& out ) + { + PyStdOut* self = PyObject_New(PyStdOut, &PyStdOut_Type); + if (self) { + self->softspace = 0; + self->out=&out; + } + return (PyObject*)self; + } } ////////////////////////END PYTHON/////////////////////////// //////////////////MY MAPS//////////////////////////////////////// +namespace { TopTools_IndexedMapOfShape FacesWithSizeMap; std::map FaceId2SizeMap; TopTools_IndexedMapOfShape EdgesWithSizeMap; @@ -212,9 +216,11 @@ std::map FaceId2PythonSmp; std::map EdgeId2PythonSmp; std::map VertexId2PythonSmp; +typedef std::map > TId2ClsAttractorVec; +TId2ClsAttractorVec FaceId2ClassAttractor; +TId2ClsAttractorVec FaceIndex2ClassAttractor; std::map > FaceId2AttractorCoords; -std::map FaceId2ClassAttractor; -std::map FaceIndex2ClassAttractor; +int theNbAttractors; TopTools_IndexedMapOfShape FacesWithEnforcedVertices; std::map< int, BLSURFPlugin_Hypothesis::TEnfVertexCoordsList > FaceId2EnforcedVertexCoords; @@ -225,7 +231,7 @@ bool HasSizeMapOnFace=false; bool HasSizeMapOnEdge=false; bool HasSizeMapOnVertex=false; //bool HasAttractorOnFace=false; - +} //============================================================================= /*! * @@ -238,7 +244,7 @@ BLSURFPlugin_BLSURF::BLSURFPlugin_BLSURF(int hypId, int studyId, { MESSAGE("BLSURFPlugin_BLSURF::BLSURFPlugin_BLSURF"); - _name = "BLSURF"; + _name = "MG-CADSurf";//"BLSURF"; _shapeType = (1 << TopAbs_FACE); // 1 bit /shape type _compatibleHypothesis.push_back(BLSURFPlugin_Hypothesis::GetHypType()); _compatibleHypothesis.push_back(StdMeshers_ViscousLayers2D::GetHypType()); @@ -255,7 +261,7 @@ BLSURFPlugin_BLSURF::BLSURFPlugin_BLSURF(int hypId, int studyId, myStudy = NULL; myStudy = aStudyMgr->GetStudyByID(_studyId); - if (myStudy) + if ( !myStudy->_is_nil() ) MESSAGE("myStudy->StudyId() = " << myStudy->StudyId()); /* Initialize the Python interpreter */ @@ -329,7 +335,7 @@ bool BLSURFPlugin_BLSURF::CheckHypothesis return true; // can work with no hypothesis } - for ( itl = hyps.begin(); itl != hyps.end(); ++itl ) + for ( itl = hyps.begin(); itl != hyps.end() && ( aStatus == HYP_OK ); ++itl ) { theHyp = *itl; string hypName = theHyp->GetName(); @@ -344,7 +350,11 @@ bool BLSURFPlugin_BLSURF::CheckHypothesis } else if ( hypName == StdMeshers_ViscousLayers2D::GetHypType() ) { - _haveViscousLayers = true; + if ( !_haveViscousLayers ) + { + if ( error( StdMeshers_ViscousLayers2D::CheckHypothesis( aMesh, aShape, aStatus ))) + _haveViscousLayers = true; + } } else { @@ -356,18 +366,18 @@ bool BLSURFPlugin_BLSURF::CheckHypothesis //============================================================================= /*! - * Pass parameters to BLSURF + * Pass parameters to MG-CADSurf */ //============================================================================= -inline std::string to_string(double d) +inline std::string val_to_string(double d) { std::ostringstream o; o << d; return o.str(); } -inline std::string to_string_rel(double d) +inline std::string val_to_string_rel(double d) { std::ostringstream o; o << d; @@ -375,14 +385,14 @@ inline std::string to_string_rel(double d) return o.str(); } -inline std::string to_string(int i) +inline std::string val_to_string(int i) { std::ostringstream o; o << i; return o.str(); } -inline std::string to_string_rel(int i) +inline std::string val_to_string_rel(int i) { std::ostringstream o; o << i; @@ -391,12 +401,6 @@ inline std::string to_string_rel(int i) } double _smp_phy_size; -// #if BLSURF_VERSION_LONG >= "3.1.1" -// // sizemap_t *geo_sizemap_e, *geo_sizemap_f; -// sizemap_t *iso_sizemap_p, *iso_sizemap_e, *iso_sizemap_f; -// // sizemap_t *clean_geo_sizemap_e, *clean_geo_sizemap_f; -// sizemap_t *clean_iso_sizemap_p, *clean_iso_sizemap_e, *clean_iso_sizemap_f; -// #endif 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); @@ -575,7 +579,7 @@ void createAttractorOnFace(TopoDS_Shape GeomShape, std::string AttractorFunction double a, b; // Attractor parameter double d = 0.; bool createNode=false; // To create a node on attractor projection - int pos1, pos2; + size_t pos1, pos2; const char *sep = ";"; // atIt->second has the following pattern: // ATTRACTOR(xa;ya;za;a;b;True|False;d) @@ -714,6 +718,23 @@ BLSURFPlugin_BLSURF::TListOfIDs _getSubShapeIDsInMainShape(TopoDS_Shape theMainS return face_ids; } +BLSURFPlugin_BLSURF::TListOfIDs _getSubShapeIDsInMainShape(SMESH_Mesh* theMesh, + TopoDS_Shape theSubShape, + TopAbs_ShapeEnum theShapeType) +{ + BLSURFPlugin_BLSURF::TListOfIDs face_ids; + + for (TopExp_Explorer face_iter(theSubShape,theShapeType);face_iter.More();face_iter.Next()) + { + int face_id = theMesh->GetMeshDS()->ShapeToIndex(face_iter.Current()); + if (face_id == 0) + throw SALOME_Exception ( SMESH_Comment("Sub_shape not found in main_shape")); + face_ids.push_back(face_id); + } + + return face_ids; +} + void BLSURFPlugin_BLSURF::addCoordsFromVertices(const std::vector &theVerticesEntries, std::vector &theVerticesCoords) { for (std::vector::const_iterator it = theVerticesEntries.begin(); it != theVerticesEntries.end(); it++) @@ -746,7 +767,7 @@ void BLSURFPlugin_BLSURF::addCoordsFromVertex(BLSURFPlugin_Hypothesis::TEntry th ///////////////////////////////////////////////////////// void BLSURFPlugin_BLSURF::createPreCadFacesPeriodicity(TopoDS_Shape theGeomShape, const BLSURFPlugin_Hypothesis::TPreCadPeriodicity &preCadPeriodicity) { - MESSAGE("BLSURFPlugin_BLSURF::createFacesPeriodicity"); + MESSAGE("BLSURFPlugin_BLSURF::createPreCadFacesPeriodicity"); TopoDS_Shape geomShape1 = entryToShape(preCadPeriodicity.shape1Entry); TopoDS_Shape geomShape2 = entryToShape(preCadPeriodicity.shape2Entry); @@ -769,14 +790,14 @@ void BLSURFPlugin_BLSURF::createPreCadFacesPeriodicity(TopoDS_Shape theGeomShape _preCadFacesIDsPeriodicityVector.push_back(preCadFacesPeriodicityIDs); MESSAGE("_preCadFacesIDsPeriodicityVector.size() = " << _preCadFacesIDsPeriodicityVector.size()); - MESSAGE("BLSURFPlugin_BLSURF::createFacesPeriodicity END"); + MESSAGE("BLSURFPlugin_BLSURF::createPreCadFacesPeriodicity END"); } ///////////////////////////////////////////////////////// void BLSURFPlugin_BLSURF::createPreCadEdgesPeriodicity(TopoDS_Shape theGeomShape, const BLSURFPlugin_Hypothesis::TPreCadPeriodicity &preCadPeriodicity) { - MESSAGE("BLSURFPlugin_BLSURF::createEdgesPeriodicity"); + MESSAGE("BLSURFPlugin_BLSURF::createPreCadEdgesPeriodicity"); TopoDS_Shape geomShape1 = entryToShape(preCadPeriodicity.shape1Entry); TopoDS_Shape geomShape2 = entryToShape(preCadPeriodicity.shape2Entry); @@ -793,164 +814,60 @@ void BLSURFPlugin_BLSURF::createPreCadEdgesPeriodicity(TopoDS_Shape theGeomShape _preCadEdgesIDsPeriodicityVector.push_back(preCadEdgesPeriodicityIDs); MESSAGE("_preCadEdgesIDsPeriodicityVector.size() = " << _preCadEdgesIDsPeriodicityVector.size()); - MESSAGE("BLSURFPlugin_BLSURF::createEdgesPeriodicity END"); - -} - -///////////////////////////////////////////////////////// -void BLSURFPlugin_BLSURF::createFacesPeriodicity(TopoDS_Shape theGeomShape, BLSURFPlugin_Hypothesis::TEntry theFace1, BLSURFPlugin_Hypothesis::TEntry theFace2) -{ - MESSAGE("BLSURFPlugin_BLSURF::createFacesPeriodicity"); - - TopoDS_Shape GeomShape1 = entryToShape(theFace1); - TopoDS_Shape GeomShape2 = entryToShape(theFace2); - - TListOfIDs theFace1_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomShape1, TopAbs_FACE); - TListOfIDs theFace2_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomShape2, TopAbs_FACE); - - // Only one face id, since only a face can be selected - int theFace1_id = theFace1_ids[0]; - int theFace2_id = theFace2_ids[0]; - - std::pair pairOfFacesID = std::make_pair(theFace1_id, theFace2_id); - - _facesIDsPeriodicityVector.push_back(pairOfFacesID); - MESSAGE("_facesIDsPeriodicityVector.size() = " << _facesIDsPeriodicityVector.size()); - MESSAGE("BLSURFPlugin_BLSURF::createFacesPeriodicity END"); - -} - - -///////////////////////////////////////////////////////// -void BLSURFPlugin_BLSURF::createEdgesPeriodicity(TopoDS_Shape theGeomShape, BLSURFPlugin_Hypothesis::TEntry theFace1, BLSURFPlugin_Hypothesis::TEntry theEdge1, - BLSURFPlugin_Hypothesis::TEntry theFace2, BLSURFPlugin_Hypothesis::TEntry theEdge2, int edge_orientation) -{ - MESSAGE("BLSURFPlugin_BLSURF::createEdgesPeriodicity"); - - TEdgePeriodicityIDs edgePeriodicityIDs; - - if (theFace1 != "") - { - TopoDS_Shape GeomFace1 = entryToShape(theFace1); - TListOfIDs theFace1_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomFace1, TopAbs_FACE); - // Only one face id, since only a face can be selected - edgePeriodicityIDs.theFace1ID = theFace1_ids[0]; - } - else - edgePeriodicityIDs.theFace1ID = 0; - if (theFace2 != "") - { - TopoDS_Shape GeomFace2 = entryToShape(theFace2); - TListOfIDs theFace2_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomFace2, TopAbs_FACE); - edgePeriodicityIDs.theFace2ID = theFace2_ids[0]; - } - else - edgePeriodicityIDs.theFace2ID = 0; - - TopoDS_Shape GeomEdge1 = entryToShape(theEdge1); - TopoDS_Shape GeomEdge2 = entryToShape(theEdge2); - - TListOfIDs theEdge1_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomEdge1, TopAbs_EDGE); - TListOfIDs theEdge2_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomEdge2, TopAbs_EDGE); - - if (edge_orientation == 0 && GeomEdge1.Closed()) - { - // if edge is closed, we have to set its orientation - MESSAGE("GeomEdge1.Orientation() = " << GeomEdge1.Orientation()); - MESSAGE("GeomEdge2.Orientation() = " << GeomEdge2.Orientation()); - if(GeomEdge1.Orientation() == TopAbs_FORWARD) - edge_orientation = CAD_ORIENTATION_REVERSED; - else - edge_orientation = CAD_ORIENTATION_FORWARD; - } - - // Only one edge id, since only a edge can be selected - edgePeriodicityIDs.theEdge1ID = theEdge1_ids[0]; - edgePeriodicityIDs.theEdge2ID = theEdge2_ids[0]; - edgePeriodicityIDs.edge_orientation = edge_orientation; - - _edgesIDsPeriodicityVector.push_back(edgePeriodicityIDs); - MESSAGE("_edgesIDsPeriodicityVector.size() = " << _edgesIDsPeriodicityVector.size()); - MESSAGE("BLSURFPlugin_BLSURF::createEdgesPeriodicity END"); + MESSAGE("BLSURFPlugin_BLSURF::createPreCadEdgesPeriodicity END"); } ///////////////////////////////////////////////////////// -void BLSURFPlugin_BLSURF::createVerticesPeriodicity(TopoDS_Shape theGeomShape, BLSURFPlugin_Hypothesis::TEntry theEdge1, BLSURFPlugin_Hypothesis::TEntry theVertex1, - BLSURFPlugin_Hypothesis::TEntry theEdge2, BLSURFPlugin_Hypothesis::TEntry theVertex2) -{ - MESSAGE("BLSURFPlugin_BLSURF::createVerticesPeriodicity"); - - TopoDS_Shape GeomEdge1 = entryToShape(theEdge1); - TopoDS_Shape GeomVertex1 = entryToShape(theVertex1); - TopoDS_Shape GeomEdge2 = entryToShape(theEdge2); - TopoDS_Shape GeomVertex2 = entryToShape(theVertex2); - - TListOfIDs theEdge1_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomEdge1, TopAbs_EDGE); - TListOfIDs vertices1_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomVertex1, TopAbs_VERTEX); - TListOfIDs theEdge2_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomEdge2, TopAbs_EDGE); - TListOfIDs vertices2_ids = _getSubShapeIDsInMainShape(theGeomShape, GeomVertex2, TopAbs_VERTEX); - - // Only one vertex id, since only a vertex can be selected - TVertexPeriodicityIDs vertexPeriodicityIDs; - vertexPeriodicityIDs.theEdge1ID = theEdge1_ids[0]; - vertexPeriodicityIDs.theVertex1ID = vertices1_ids[0]; - vertexPeriodicityIDs.theEdge2ID = theEdge2_ids[0]; - vertexPeriodicityIDs.theVertex2ID = vertices2_ids[0]; - - _verticesIDsPeriodicityVector.push_back(vertexPeriodicityIDs); - MESSAGE("_verticesIDsPeriodicityVector.size() = " << _verticesIDsPeriodicityVector.size()); - MESSAGE("BLSURFPlugin_BLSURF::createVerticesPeriodicity END"); -} - -///////////////////////////////////////////////////////// - -void BLSURFPlugin_BLSURF::SetParameters( -// #if BLSURF_VERSION_LONG >= "3.1.1" -// cad_t * c, -// #endif - const BLSURFPlugin_Hypothesis* hyp, +void BLSURFPlugin_BLSURF::SetParameters(const BLSURFPlugin_Hypothesis* hyp, cadsurf_session_t * css, - precad_session_t * pcs, - const TopoDS_Shape& theGeomShape, - bool * use_precad - ) + const TopoDS_Shape& theGeomShape + ) { // rnc : Bug 1457 // Clear map so that it is not stored in the algorithm with old enforced vertices in it EnfVertexCoords2EnfVertexList.clear(); - - double diagonal = SMESH_Mesh::GetShapeDiagonalSize( theGeomShape ); - double bbSegmentation = _gen->GetBoundaryBoxSegmentation(); - int _physicalMesh = BLSURFPlugin_Hypothesis::GetDefaultPhysicalMesh(); - int _geometricMesh = BLSURFPlugin_Hypothesis::GetDefaultGeometricMesh(); - double _phySize = BLSURFPlugin_Hypothesis::GetDefaultPhySize(diagonal, bbSegmentation); - bool _phySizeRel = BLSURFPlugin_Hypothesis::GetDefaultPhySizeRel(); - double _minSize = BLSURFPlugin_Hypothesis::GetDefaultMinSize(diagonal); - bool _minSizeRel = BLSURFPlugin_Hypothesis::GetDefaultMinSizeRel(); - double _maxSize = BLSURFPlugin_Hypothesis::GetDefaultMaxSize(diagonal); - bool _maxSizeRel = BLSURFPlugin_Hypothesis::GetDefaultMaxSizeRel(); - double _gradation = BLSURFPlugin_Hypothesis::GetDefaultGradation(); - bool _quadAllowed = BLSURFPlugin_Hypothesis::GetDefaultQuadAllowed(); - double _angleMesh = BLSURFPlugin_Hypothesis::GetDefaultAngleMesh(); - double _chordalError = BLSURFPlugin_Hypothesis::GetDefaultChordalError(diagonal); - bool _anisotropic = BLSURFPlugin_Hypothesis::GetDefaultAnisotropic(); - double _anisotropicRatio = BLSURFPlugin_Hypothesis::GetDefaultAnisotropicRatio(); - bool _removeTinyEdges = BLSURFPlugin_Hypothesis::GetDefaultRemoveTinyEdges(); - double _tinyEdgeLength = BLSURFPlugin_Hypothesis::GetDefaultTinyEdgeLength(diagonal); - bool _badElementRemoval = BLSURFPlugin_Hypothesis::GetDefaultBadElementRemoval(); - double _badElementAspectRatio = BLSURFPlugin_Hypothesis::GetDefaultBadElementAspectRatio(); - bool _optimizeMesh = BLSURFPlugin_Hypothesis::GetDefaultOptimizeMesh(); - bool _quadraticMesh = BLSURFPlugin_Hypothesis::GetDefaultQuadraticMesh(); - int _verb = BLSURFPlugin_Hypothesis::GetDefaultVerbosity(); - int _topology = BLSURFPlugin_Hypothesis::GetDefaultTopology(); + + double diagonal = SMESH_Mesh::GetShapeDiagonalSize( theGeomShape ); + double bbSegmentation = _gen->GetBoundaryBoxSegmentation(); + int _physicalMesh = BLSURFPlugin_Hypothesis::GetDefaultPhysicalMesh(); + int _geometricMesh = BLSURFPlugin_Hypothesis::GetDefaultGeometricMesh(); + double _phySize = BLSURFPlugin_Hypothesis::GetDefaultPhySize(diagonal, bbSegmentation); + bool _phySizeRel = BLSURFPlugin_Hypothesis::GetDefaultPhySizeRel(); + double _minSize = BLSURFPlugin_Hypothesis::GetDefaultMinSize(diagonal); + bool _minSizeRel = BLSURFPlugin_Hypothesis::GetDefaultMinSizeRel(); + double _maxSize = BLSURFPlugin_Hypothesis::GetDefaultMaxSize(diagonal); + bool _maxSizeRel = BLSURFPlugin_Hypothesis::GetDefaultMaxSizeRel(); + double _use_gradation = BLSURFPlugin_Hypothesis::GetDefaultUseGradation(); + double _gradation = BLSURFPlugin_Hypothesis::GetDefaultGradation(); + double _use_volume_gradation = BLSURFPlugin_Hypothesis::GetDefaultUseVolumeGradation(); + double _volume_gradation = BLSURFPlugin_Hypothesis::GetDefaultVolumeGradation(); + bool _quadAllowed = BLSURFPlugin_Hypothesis::GetDefaultQuadAllowed(); + double _angleMesh = BLSURFPlugin_Hypothesis::GetDefaultAngleMesh(); + double _chordalError = BLSURFPlugin_Hypothesis::GetDefaultChordalError(diagonal); + bool _anisotropic = BLSURFPlugin_Hypothesis::GetDefaultAnisotropic(); + double _anisotropicRatio = BLSURFPlugin_Hypothesis::GetDefaultAnisotropicRatio(); + bool _removeTinyEdges = BLSURFPlugin_Hypothesis::GetDefaultRemoveTinyEdges(); + double _tinyEdgeLength = BLSURFPlugin_Hypothesis::GetDefaultTinyEdgeLength(diagonal); + bool _optimiseTinyEdges = BLSURFPlugin_Hypothesis::GetDefaultOptimiseTinyEdges(); + double _tinyEdgeOptimisLength = BLSURFPlugin_Hypothesis::GetDefaultTinyEdgeOptimisationLength(diagonal); + bool _correctSurfaceIntersec= BLSURFPlugin_Hypothesis::GetDefaultCorrectSurfaceIntersection(); + double _corrSurfaceIntersCost = BLSURFPlugin_Hypothesis::GetDefaultCorrectSurfaceIntersectionMaxCost(); + bool _badElementRemoval = BLSURFPlugin_Hypothesis::GetDefaultBadElementRemoval(); + double _badElementAspectRatio = BLSURFPlugin_Hypothesis::GetDefaultBadElementAspectRatio(); + bool _optimizeMesh = BLSURFPlugin_Hypothesis::GetDefaultOptimizeMesh(); + bool _quadraticMesh = BLSURFPlugin_Hypothesis::GetDefaultQuadraticMesh(); + int _verb = BLSURFPlugin_Hypothesis::GetDefaultVerbosity(); + //int _topology = BLSURFPlugin_Hypothesis::GetDefaultTopology(); // PreCAD - int _precadMergeEdges = BLSURFPlugin_Hypothesis::GetDefaultPreCADMergeEdges(); - int _precadProcess3DTopology = BLSURFPlugin_Hypothesis::GetDefaultPreCADProcess3DTopology(); - int _precadDiscardInput = BLSURFPlugin_Hypothesis::GetDefaultPreCADDiscardInput(); + //int _precadMergeEdges = BLSURFPlugin_Hypothesis::GetDefaultPreCADMergeEdges(); + int _precadRemoveTinyUVEdges = BLSURFPlugin_Hypothesis::GetDefaultPreCADRemoveTinyUVEdges(); + //int _precadRemoveDuplicateCADFaces = BLSURFPlugin_Hypothesis::GetDefaultPreCADRemoveDuplicateCADFaces(); + int _precadProcess3DTopology = BLSURFPlugin_Hypothesis::GetDefaultPreCADProcess3DTopology(); + //int _precadDiscardInput = BLSURFPlugin_Hypothesis::GetDefaultPreCADDiscardInput(); if (hyp) { @@ -972,80 +889,84 @@ void BLSURFPlugin_BLSURF::SetParameters( // if max size is not explicitly specified, "relative" flag is ignored _maxSizeRel = hyp->IsMaxSizeRel(); } - if (hyp->GetGradation() > 0) + _use_gradation = hyp->GetUseGradation(); + if (hyp->GetGradation() > 0 && _use_gradation) _gradation = hyp->GetGradation(); - _quadAllowed = hyp->GetQuadAllowed(); - if (hyp->GetAngleMesh() > 0) - _angleMesh = hyp->GetAngleMesh(); - if (hyp->GetChordalError() > 0) - _chordalError = hyp->GetChordalError(); - _anisotropic = hyp->GetAnisotropic(); - if (hyp->GetAnisotropicRatio() >= 0) - _anisotropicRatio = hyp->GetAnisotropicRatio(); - _removeTinyEdges = hyp->GetRemoveTinyEdges(); - if (hyp->GetTinyEdgeLength() > 0) - _tinyEdgeLength = hyp->GetTinyEdgeLength(); - _badElementRemoval = hyp->GetBadElementRemoval(); - if (hyp->GetBadElementAspectRatio() >= 0) - _badElementAspectRatio = hyp->GetBadElementAspectRatio(); - _optimizeMesh = hyp->GetOptimizeMesh(); - _quadraticMesh = hyp->GetQuadraticMesh(); + _use_volume_gradation = hyp->GetUseVolumeGradation(); + if (hyp->GetVolumeGradation() > 0 && _use_volume_gradation ) + _volume_gradation = hyp->GetVolumeGradation(); + _quadAllowed = hyp->GetQuadAllowed(); + if (hyp->GetAngleMesh() > 0) + _angleMesh = hyp->GetAngleMesh(); + if (hyp->GetChordalError() > 0) + _chordalError = hyp->GetChordalError(); + _anisotropic = hyp->GetAnisotropic(); + if (hyp->GetAnisotropicRatio() >= 0) + _anisotropicRatio = hyp->GetAnisotropicRatio(); + _removeTinyEdges = hyp->GetRemoveTinyEdges(); + if (hyp->GetTinyEdgeLength() > 0) + _tinyEdgeLength = hyp->GetTinyEdgeLength(); + _optimiseTinyEdges = hyp->GetOptimiseTinyEdges(); + if (hyp->GetTinyEdgeOptimisationLength() > 0) + _tinyEdgeOptimisLength = hyp->GetTinyEdgeOptimisationLength(); + _correctSurfaceIntersec = hyp->GetCorrectSurfaceIntersection(); + if (hyp->GetCorrectSurfaceIntersectionMaxCost() > 0) + _corrSurfaceIntersCost = hyp->GetCorrectSurfaceIntersectionMaxCost(); + _badElementRemoval = hyp->GetBadElementRemoval(); + if (hyp->GetBadElementAspectRatio() >= 0) + _badElementAspectRatio = hyp->GetBadElementAspectRatio(); + _optimizeMesh = hyp->GetOptimizeMesh(); + _quadraticMesh = hyp->GetQuadraticMesh(); _verb = hyp->GetVerbosity(); - _topology = (int) hyp->GetTopology(); - // PreCAD - _precadMergeEdges = hyp->GetPreCADMergeEdges(); - _precadProcess3DTopology = hyp->GetPreCADProcess3DTopology(); - _precadDiscardInput = hyp->GetPreCADDiscardInput(); - - const BLSURFPlugin_Hypothesis::TOptionValues & opts = hyp->GetOptionValues(); + //_topology = (int) hyp->GetTopology(); + // PreCAD + //_precadMergeEdges = hyp->GetPreCADMergeEdges(); + _precadRemoveTinyUVEdges = hyp->GetPreCADRemoveTinyUVEdges(); + //_precadRemoveDuplicateCADFaces = hyp->GetPreCADRemoveDuplicateCADFaces(); + _precadProcess3DTopology = hyp->GetPreCADProcess3DTopology(); + //_precadDiscardInput = hyp->GetPreCADDiscardInput(); + + const BLSURFPlugin_Hypothesis::TOptionValues& opts = hyp->GetOptionValues(); BLSURFPlugin_Hypothesis::TOptionValues::const_iterator opIt; for ( opIt = opts.begin(); opIt != opts.end(); ++opIt ) if ( !opIt->second.empty() ) { MESSAGE("cadsurf_set_param(): " << opIt->first << " = " << opIt->second); set_param(css, opIt->first.c_str(), opIt->second.c_str()); } - - const BLSURFPlugin_Hypothesis::TOptionValues & preCADopts = hyp->GetPreCADOptionValues(); + + const BLSURFPlugin_Hypothesis::TOptionValues& custom_opts = hyp->GetCustomOptionValues(); + for ( opIt = custom_opts.begin(); opIt != custom_opts.end(); ++opIt ) + if ( !opIt->second.empty() ) { + MESSAGE("cadsurf_set_param(): " << opIt->first << " = " << opIt->second); + set_param(css, opIt->first.c_str(), opIt->second.c_str()); + } + + const BLSURFPlugin_Hypothesis::TOptionValues& preCADopts = hyp->GetPreCADOptionValues(); for ( opIt = preCADopts.begin(); opIt != preCADopts.end(); ++opIt ) if ( !opIt->second.empty() ) { - *use_precad = true; - MESSAGE("precad_set_param(): " << opIt->first << " = " << opIt->second); - precad_set_param(pcs, opIt->first.c_str(), opIt->second.c_str()); + MESSAGE("cadsurf_set_param(): " << opIt->first << " = " << opIt->second); + set_param(css, opIt->first.c_str(), opIt->second.c_str()); } } -// else { -// //0020968: EDF1545 SMESH: Problem in the creation of a mesh group on geometry -// // GetDefaultPhySize() sometimes leads to computation failure -// // GDD 26/07/2012 From Distene documentation, global physical size default value = diag/100 -// _phySize = BLSURFPlugin_Hypothesis::GetDefaultPhySize(diagonal); -// _minSize = BLSURFPlugin_Hypothesis::GetDefaultMinSize(diagonal); -// _maxSize = BLSURFPlugin_Hypothesis::GetDefaultMaxSize(diagonal); -// _chordalError = BLSURFPlugin_Hypothesis::GetDefaultChordalError(diagonal); -// _tinyEdgeLength = BLSURFPlugin_Hypothesis::GetDefaultTinyEdgeLength(diagonal); -// MESSAGE("BLSURFPlugin_BLSURF::SetParameters using defaults"); -// } - // PreCAD - if (_topology == BLSURFPlugin_Hypothesis::PreCAD) { - *use_precad = true; - precad_set_param(pcs, "verbose", to_string(_verb).c_str()); - precad_set_param(pcs, "merge_edges", _precadMergeEdges ? "1" : "0"); - precad_set_param(pcs, "process_3d_topology", _precadProcess3DTopology ? "1" : "0"); - precad_set_param(pcs, "discard_input_topology", _precadDiscardInput ? "1" : "0"); - } - // unlimit mesh size (issue 0022266) - set_param(css, "max_number_of_points_per_patch", "1000000"); + // PreProcessor (formerly PreCAD) -- commented params are preCADoptions (since 0023307) + //set_param(css, "merge_edges", _precadMergeEdges ? "yes" : "no"); + set_param(css, "remove_tiny_uv_edges", _precadRemoveTinyUVEdges ? "yes" : "no"); + //set_param(css, "remove_duplicate_cad_faces", _precadRemoveDuplicateCADFaces ? "yes" : "no"); + 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) { case BLSURFPlugin_Hypothesis::PhysicalGlobalSize: set_param(css, "physical_size_mode", "global"); - set_param(css, "global_physical_size", _phySizeRel ? to_string_rel(_phySize).c_str() : to_string(_phySize).c_str()); + set_param(css, "global_physical_size", _phySizeRel ? val_to_string_rel(_phySize).c_str() : val_to_string(_phySize).c_str()); break; case BLSURFPlugin_Hypothesis::PhysicalLocalSize: set_param(css, "physical_size_mode", "local"); - set_param(css, "global_physical_size", _phySizeRel ? to_string_rel(_phySize).c_str() : to_string(_phySize).c_str()); + set_param(css, "global_physical_size", _phySizeRel ? val_to_string_rel(_phySize).c_str() : val_to_string(_phySize).c_str()); useGradation = true; break; default: @@ -1056,14 +977,14 @@ void BLSURFPlugin_BLSURF::SetParameters( { case BLSURFPlugin_Hypothesis::GeometricalGlobalSize: set_param(css, "geometric_size_mode", "global"); - set_param(css, "geometric_approximation", to_string(_angleMesh).c_str()); - set_param(css, "chordal_error", to_string(_chordalError).c_str()); + set_param(css, "geometric_approximation", val_to_string(_angleMesh).c_str()); + set_param(css, "chordal_error", val_to_string(_chordalError).c_str()); useGradation = true; break; case BLSURFPlugin_Hypothesis::GeometricalLocalSize: set_param(css, "geometric_size_mode", "local"); - set_param(css, "geometric_approximation", to_string(_angleMesh).c_str()); - set_param(css, "chordal_error", to_string(_chordalError).c_str()); + set_param(css, "geometric_approximation", val_to_string(_angleMesh).c_str()); + set_param(css, "chordal_error", val_to_string(_chordalError).c_str()); useGradation = true; break; default: @@ -1077,42 +998,52 @@ void BLSURFPlugin_BLSURF::SetParameters( double mins = _minSizeRel ? _minSize * diagonal : _minSize; // - min size should not be greater than user size if ( _phySize < mins ) - set_param(css, "min_size", _phySizeRel ? to_string_rel(_phySize).c_str() : to_string(_phySize).c_str()); + set_param(css, "min_size", _phySizeRel ? val_to_string_rel(_phySize).c_str() : val_to_string(_phySize).c_str()); else - set_param(css, "min_size", _minSizeRel ? to_string_rel(_minSize).c_str() : to_string(_minSize).c_str()); + set_param(css, "min_size", _minSizeRel ? val_to_string_rel(_minSize).c_str() : val_to_string(_minSize).c_str()); // - compute absolute max size double maxs = _maxSizeRel ? _maxSize * diagonal : _maxSize; // - max size should not be less than user size if ( _phySize > maxs ) - set_param(css, "max_size", _phySizeRel ? to_string_rel(_phySize).c_str() : to_string(_phySize).c_str()); + set_param(css, "max_size", _phySizeRel ? val_to_string_rel(_phySize).c_str() : val_to_string(_phySize).c_str()); else - set_param(css, "max_size", _maxSizeRel ? to_string_rel(_maxSize).c_str() : to_string(_maxSize).c_str()); + set_param(css, "max_size", _maxSizeRel ? val_to_string_rel(_maxSize).c_str() : val_to_string(_maxSize).c_str()); } else { // user size is not explicitly specified // - if minsize is not explicitly specified, we pass default value computed automatically, in this case "relative" flag is ignored - set_param(css, "min_size", _minSizeRel ? to_string_rel(_minSize).c_str() : to_string(_minSize).c_str()); + set_param(css, "min_size", _minSizeRel ? val_to_string_rel(_minSize).c_str() : val_to_string(_minSize).c_str()); // - if maxsize is not explicitly specified, we pass default value computed automatically, in this case "relative" flag is ignored - set_param(css, "max_size", _maxSizeRel ? to_string_rel(_maxSize).c_str() : to_string(_maxSize).c_str()); + set_param(css, "max_size", _maxSizeRel ? val_to_string_rel(_maxSize).c_str() : val_to_string(_maxSize).c_str()); } - - if ( useGradation ) - set_param(css, "gradation", to_string(_gradation).c_str()); + // anisotropic and quadrangle mesh requires disabling gradation + if ( _anisotropic && _quadAllowed ) + useGradation = false; // limitation of V1.3 + if ( useGradation && _use_gradation ) + set_param(css, "gradation", val_to_string(_gradation).c_str()); + if ( useGradation && _use_volume_gradation ) + set_param(css, "volume_gradation", val_to_string(_volume_gradation).c_str()); set_param(css, "element_generation", _quadAllowed ? "quad_dominant" : "triangle"); set_param(css, "metric", _anisotropic ? "anisotropic" : "isotropic"); if ( _anisotropic ) - set_param(css, "anisotropic_ratio", to_string(_anisotropicRatio).c_str()); + set_param(css, "anisotropic_ratio", val_to_string(_anisotropicRatio).c_str()); set_param(css, "remove_tiny_edges", _removeTinyEdges ? "1" : "0"); if ( _removeTinyEdges ) - set_param(css, "tiny_edge_length", to_string(_tinyEdgeLength).c_str()); + set_param(css, "tiny_edge_length", val_to_string(_tinyEdgeLength).c_str()); + set_param(css, "optimise_tiny_edges", _optimiseTinyEdges ? "1" : "0"); + if ( _optimiseTinyEdges ) + set_param(css, "tiny_edge_optimisation_length", val_to_string(_tinyEdgeOptimisLength).c_str()); + set_param(css, "correct_surface_intersections", _correctSurfaceIntersec ? "1" : "0"); + if ( _correctSurfaceIntersec ) + set_param(css, "surface_intersections_processing_max_cost", val_to_string(_corrSurfaceIntersCost ).c_str()); set_param(css, "force_bad_surface_element_removal", _badElementRemoval ? "1" : "0"); if ( _badElementRemoval ) - set_param(css, "bad_surface_element_aspect_ratio", to_string(_badElementAspectRatio).c_str()); + set_param(css, "bad_surface_element_aspect_ratio", val_to_string(_badElementAspectRatio).c_str()); set_param(css, "optimisation", _optimizeMesh ? "yes" : "no"); set_param(css, "element_order", _quadraticMesh ? "quadratic" : "linear"); - set_param(css, "verbose", to_string(_verb).c_str()); + set_param(css, "verbose", val_to_string(_verb).c_str()); _smp_phy_size = _phySizeRel ? _phySize*diagonal : _phySize; if ( _verb > 0 ) @@ -1136,7 +1067,7 @@ void BLSURFPlugin_BLSURF::SetParameters( MESSAGE("Geomtype is " << GeomType); int key = -1; // Group Management - if (GeomType == TopAbs_COMPOUND){ + if (GeomType == TopAbs_COMPOUND) { for (TopoDS_Iterator it (GeomShape); it.More(); it.Next()){ // Group of faces if (it.Value().ShapeType() == TopAbs_FACE){ @@ -1280,6 +1211,7 @@ void BLSURFPlugin_BLSURF::SetParameters( // - build the map here for each face with an attractor set and only if the attractor shape as changed since the last call to _buildmap() // -> define a bool _mapbuilt in the class that is set to false by default and set to true when calling _buildmap() OK + theNbAttractors = 0; const BLSURFPlugin_Hypothesis::TAttractorMap class_attractors = BLSURFPlugin_Hypothesis::GetClassAttractorEntries(hyp); int key=-1; BLSURFPlugin_Hypothesis::TAttractorMap::const_iterator AtIt = class_attractors.begin(); @@ -1287,6 +1219,8 @@ void BLSURFPlugin_BLSURF::SetParameters( if ( !AtIt->second->Empty() ) { // MESSAGE("cadsurf_set_attractor(): " << AtIt->first << " = " << AtIt->second); GeomShape = entryToShape(AtIt->first); + if ( !SMESH_MesherHelper::IsSubShape( GeomShape, theGeomShape )) + continue; AttShape = AtIt->second->GetAttractorShape(); GeomType = GeomShape.ShapeType(); // Group Management @@ -1306,15 +1240,10 @@ void BLSURFPlugin_BLSURF::SetParameters( || AttShape.ShapeType() == TopAbs_COMPOUND) ){ HasSizeMapOnFace = true; - if (! FacesWithSizeMap.Contains(TopoDS::Face(GeomShape)) ) { - key = FacesWithSizeMap.Add(TopoDS::Face(GeomShape) ); - } - else { - key = FacesWithSizeMap.FindIndex(TopoDS::Face(GeomShape)); -// MESSAGE("Face with key " << key << " already in map"); - } + key = FacesWithSizeMap.Add(TopoDS::Face(GeomShape) ); - FaceId2ClassAttractor[key] = AtIt->second; + FaceId2ClassAttractor[key].push_back( AtIt->second ); + ++theNbAttractors; } else{ MESSAGE("Wrong shape type !!") @@ -1384,36 +1313,15 @@ void BLSURFPlugin_BLSURF::SetParameters( } MESSAGE("Setting Size Map on FACES "); -// #if BLSURF_VERSION_LONG < "3.1.1" - cadsurf_data_set_sizemap_iso_cad_face(css, size_on_surface, &_smp_phy_size); -// #else -// if (*use_precad) -// iso_sizemap_f = sizemap_new(c, distene_sizemap_type_iso_cad_face, (void *)size_on_surface, NULL); -// else -// clean_iso_sizemap_f = sizemap_new(c, distene_sizemap_type_iso_cad_face, (void *)size_on_surface, NULL); -// #endif + cadsurf_set_sizemap_iso_cad_face(css, size_on_surface, &_smp_phy_size); if (HasSizeMapOnEdge){ MESSAGE("Setting Size Map on EDGES "); -// #if BLSURF_VERSION_LONG < "3.1.1" - cadsurf_data_set_sizemap_iso_cad_edge(css, size_on_edge, &_smp_phy_size); -// #else -// if (*use_precad) -// iso_sizemap_e = sizemap_new(c, distene_sizemap_type_iso_cad_edge, (void *)size_on_edge, NULL); -// else -// clean_iso_sizemap_e = sizemap_new(c, distene_sizemap_type_iso_cad_edge, (void *)size_on_edge, NULL); -// #endif + cadsurf_set_sizemap_iso_cad_edge(css, size_on_edge, &_smp_phy_size); } if (HasSizeMapOnVertex){ MESSAGE("Setting Size Map on VERTICES "); -// #if BLSURF_VERSION_LONG < "3.1.1" - cadsurf_data_set_sizemap_iso_cad_point(css, size_on_vertex, &_smp_phy_size); -// #else -// if (*use_precad) -// iso_sizemap_p = sizemap_new(c, distene_sizemap_type_iso_cad_point, (void *)size_on_vertex, NULL); -// else -// clean_iso_sizemap_p = sizemap_new(c, distene_sizemap_type_iso_cad_point, (void *)size_on_vertex, NULL); -// #endif + cadsurf_set_sizemap_iso_cad_point(css, size_on_vertex, &_smp_phy_size); } } @@ -1422,9 +1330,6 @@ void BLSURFPlugin_BLSURF::SetParameters( // reset vectors _preCadFacesIDsPeriodicityVector.clear(); _preCadEdgesIDsPeriodicityVector.clear(); - _facesIDsPeriodicityVector.clear(); - _edgesIDsPeriodicityVector.clear(); - _verticesIDsPeriodicityVector.clear(); MESSAGE("SetParameters preCadFacesPeriodicityVector"); const BLSURFPlugin_Hypothesis::TPreCadPeriodicityVector preCadFacesPeriodicityVector = BLSURFPlugin_Hypothesis::GetPreCadFacesPeriodicityVector(hyp); @@ -1444,44 +1349,6 @@ void BLSURFPlugin_BLSURF::SetParameters( } MESSAGE("_preCadEdgesIDsPeriodicityVector.size() = " << _preCadEdgesIDsPeriodicityVector.size()); - if ( _preCadFacesIDsPeriodicityVector.size() > 0 || _preCadEdgesIDsPeriodicityVector.size() > 0 ) - { - MESSAGE("USING PRECAD FOR PERIODICITY") - *use_precad = true; - precad_set_param(pcs, "verbose", to_string(_verb).c_str()); - } - - MESSAGE("SetParameters facesPeriodicityVector"); - const BLSURFPlugin_Hypothesis::TFacesPeriodicityVector facesPeriodicityVector = BLSURFPlugin_Hypothesis::GetFacesPeriodicityVector(hyp); - - for (std::size_t i = 0; i= "3.1.1" - // c, - // #endif - _hypothesis, css, pcs, aShape, &use_precad); + SetParameters(_hypothesis, css, aShape); MESSAGE("END SetParameters"); MESSAGE("_preCadFacesIDsPeriodicityVector.size() = " << _preCadFacesIDsPeriodicityVector.size()); @@ -2027,7 +1883,6 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, vector curves; vector surfaces; - fmap.Clear(); emap.Clear(); pmap.Clear(); FaceId2PythonSmp.clear(); @@ -2060,11 +1915,9 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, if (f.Orientation() != TopAbs_FORWARD && f.Orientation() != TopAbs_REVERSED ) f.Orientation(TopAbs_FORWARD); - if (fmap.FindIndex(f) > 0) - continue; iface = fmap.Add(f); // std::string aFileName = "fmap_face_"; -// aFileName.append(to_string(iface)); +// aFileName.append(val_to_string(iface)); // aFileName.append(".brep"); // BRepTools::Write(f,aFileName.c_str()); @@ -2076,11 +1929,16 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, * (For this face, it will be called by cadsurf with your_face_object_ptr * as last parameter. */ +#if OCC_VERSION_MAJOR < 7 cad_face_t *fce = cad_face_new(c, iface, surf_fun, surfaces.back()); +#else + cad_face_t *fce = cad_face_new(c, iface, surf_fun, surfaces.back().get()); +#endif /* by default a face has no tag (color). - The following call sets it to the same value as the face_id : */ - cad_face_set_tag(fce, iface); + The following call sets it to the same value as the Geom module ID : */ + const int faceTag = meshDS->ShapeToIndex(f); + cad_face_set_tag(fce, faceTag); /* Set face orientation (optional if you want a well oriented output mesh)*/ if(f.Orientation() != TopAbs_FORWARD) @@ -2088,7 +1946,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, else cad_face_set_orientation(fce, CAD_ORIENTATION_FORWARD); - if (HasSizeMapOnFace && !use_precad) + if (HasSizeMapOnFace /*&& !use_precad*/) //22903: use_precad seems not to interfere { // ----------------- // Classic size map @@ -2097,8 +1955,8 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, if (FaceId2SizeMap.find(faceKey)!=FaceId2SizeMap.end()) { - MESSAGE("A size map is defined on face :"<::iterator clAttractor_iter = FaceId2ClassAttractor.find(faceKey); + TId2ClsAttractorVec::iterator clAttractor_iter = FaceId2ClassAttractor.find(faceKey); if (clAttractor_iter != FaceId2ClassAttractor.end()){ MESSAGE("Face indice: " << iface); MESSAGE("Adding attractor"); - FaceIndex2ClassAttractor[iface]=clAttractor_iter->second; + std::vector< BLSURFPlugin_Attractor* > & attVec = clAttractor_iter->second; + for ( size_t i = 0; i < attVec.size(); ++i ) + if ( !attVec[i]->IsMapBuilt() ) { + std::cout<<"Compute " << theNbAttractors-- << "-th attractor" <BuildMap(); + } + FaceIndex2ClassAttractor[iface].swap( attVec ); FaceId2ClassAttractor.erase(clAttractor_iter); } } // if (HasSizeMapOnFace && !use_precad) @@ -2198,21 +2062,22 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, MESSAGE("Point is out of face: node is not created"); if (EnfVertexCoords2ProjVertex.find(xyzCoords) != EnfVertexCoords2ProjVertex.end()) { EnfVertexCoords2ProjVertex.erase(xyzCoords); - EnfVertexCoords2EnfVertexList.erase(xyzCoords); + // isssue 22783. Do not erase as this point can be IN other face of a group + //EnfVertexCoords2EnfVertexList.erase(xyzCoords); } } if ( result == TopAbs_UNKNOWN ) { MESSAGE("Point position on face is unknown: node is not created"); if (EnfVertexCoords2ProjVertex.find(xyzCoords) != EnfVertexCoords2ProjVertex.end()) { EnfVertexCoords2ProjVertex.erase(xyzCoords); - EnfVertexCoords2EnfVertexList.erase(xyzCoords); + //EnfVertexCoords2EnfVertexList.erase(xyzCoords); } } if ( result == TopAbs_ON ) { MESSAGE("Point is on border of face: node is not created"); if (EnfVertexCoords2ProjVertex.find(xyzCoords) != EnfVertexCoords2ProjVertex.end()) { EnfVertexCoords2ProjVertex.erase(xyzCoords); - EnfVertexCoords2EnfVertexList.erase(xyzCoords); + //EnfVertexCoords2EnfVertexList.erase(xyzCoords); } } if ( result == TopAbs_IN ) @@ -2261,7 +2126,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, ic = emap.Add(e); // std::string aFileName = "fmap_edge_"; -// aFileName.append(to_string(ic)); +// aFileName.append(val_to_string(ic)); // aFileName.append(".brep"); // BRepTools::Write(e,aFileName.c_str()); @@ -2323,7 +2188,11 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, } /* attach the edge to the current cadsurf face */ +#if OCC_VERSION_MAJOR < 7 cad_edge_t *edg = cad_edge_new(fce, ic, tmin, tmax, curv_fun, curves.back()); +#else + cad_edge_t *edg = cad_edge_new(fce, ic, tmin, tmax, curv_fun, curves.back().get()); +#endif /* by default an edge has no tag (color). The following call sets it to the same value as the edge_id : */ @@ -2338,7 +2207,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, if (e.Orientation() == TopAbs_INTERNAL) cad_edge_set_property(edg, EDGE_PROPERTY_INTERNAL); - // pass existing nodes of sub-meshes to BLSURF + // pass existing nodes of sub-meshes to MG-CADSurf if ( nodeData ) { const std::vector& nodeDataVec = nodeData->GetUVPtStruct(); @@ -2395,7 +2264,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, } // std::string aFileName = "fmap_vertex_"; -// aFileName.append(to_string(*ip)); +// aFileName.append(val_to_string(*ip)); // aFileName.append(".brep"); // BRepTools::Write(v,aFileName.c_str()); @@ -2481,7 +2350,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, MESSAGE("BEFORE PERIODICITY"); MESSAGE("_preCadFacesIDsPeriodicityVector.size() = " << _preCadFacesIDsPeriodicityVector.size()); - if (! _preCadFacesIDsPeriodicityVector.empty()){ + if (! _preCadFacesIDsPeriodicityVector.empty()) { MESSAGE("INTO PRECAD FACES PERIODICITY"); for (std::size_t i=0; i < _preCadFacesIDsPeriodicityVector.size(); i++){ std::vector theFace1_ids = _preCadFacesIDsPeriodicityVector[i].shape1IDs; @@ -2531,7 +2400,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, } MESSAGE("_preCadEdgesIDsPeriodicityVector.size() = " << _preCadEdgesIDsPeriodicityVector.size()); - if (! _preCadEdgesIDsPeriodicityVector.empty()){ + if (! _preCadEdgesIDsPeriodicityVector.empty()) { MESSAGE("INTO PRECAD EDGES PERIODICITY"); for (std::size_t i=0; i < _preCadEdgesIDsPeriodicityVector.size(); i++){ std::vector theEdge1_ids = _preCadEdgesIDsPeriodicityVector[i].shape1IDs; @@ -2585,139 +2454,16 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, MESSAGE("END PRECAD EDGES PERIODICITY"); } - if (! _facesIDsPeriodicityVector.empty()){ - MESSAGE("INTO FACE PERIODICITY"); - for (std::size_t i=0; i < _facesIDsPeriodicityVector.size(); i++){ - int theFace1 = _facesIDsPeriodicityVector[i].first; - int theFace2 = _facesIDsPeriodicityVector[i].second; - MESSAGE("_facesIDsPeriodicityVector[" << i << "] = (" << theFace1 << ", " << theFace2 << ")"); - status = cad_add_face_periodicity(c, theFace1, theFace2); - if(status != STATUS_OK){ - cout << "cad_add_face_periodicity failed with error code " << status << "\n"; - } - } - MESSAGE("END FACE PERIODICITY"); - } - - - if (! _edgesIDsPeriodicityVector.empty()){ - MESSAGE("INTO EDGE PERIODICITY"); - for (std::size_t i=0; i < _edgesIDsPeriodicityVector.size(); i++){ - int theFace1 = _edgesIDsPeriodicityVector[i].theFace1ID; - int theEdge1 = _edgesIDsPeriodicityVector[i].theEdge1ID; - int theFace2 = _edgesIDsPeriodicityVector[i].theFace2ID; - int theEdge2 = _edgesIDsPeriodicityVector[i].theEdge2ID; - int edge_orientation = _edgesIDsPeriodicityVector[i].edge_orientation; - MESSAGE("_edgesIDsPeriodicityVector[" << i << "] = (" << theFace1 << ", " << theEdge1 << ", " << theFace2 << ", " << theEdge2 << ", " << edge_orientation << ")"); - status = cad_add_edge_periodicity(c, theFace1, theEdge1, theFace2, theEdge2, edge_orientation); - if(status != STATUS_OK){ - cout << "cad_add_edge_periodicity failed with error code " << status << "\n"; - } - } - MESSAGE("END EDGE PERIODICITY"); - } - - if (! _verticesIDsPeriodicityVector.empty()){ - MESSAGE("INTO VERTEX PERIODICITY"); - for (std::size_t i=0; i < _verticesIDsPeriodicityVector.size(); i++){ - int theEdge1 = _verticesIDsPeriodicityVector[i].theEdge1ID; - int theVertex1 = _verticesIDsPeriodicityVector[i].theVertex1ID; - int theEdge2 = _verticesIDsPeriodicityVector[i].theEdge2ID; - int theVertex2 = _verticesIDsPeriodicityVector[i].theVertex2ID; - MESSAGE("_verticesIDsPeriodicityVector[" << i << "] = (" << theEdge1 << ", " << theVertex1 << ", " << theEdge2 << ", " << theVertex2 << ")"); - status = cad_add_point_periodicity(c, theEdge1, theVertex1, theEdge2, theVertex2); - if(status != STATUS_OK){ - cout << "cad_add_vertex_periodicity failed with error code " << status << "\n"; - } - } - MESSAGE("END VERTEX PERIODICITY"); - } - - //// - - if (use_precad) { - MESSAGE("use_precad"); - /* Now launch the PreCAD process */ - status = precad_process(pcs); - if(status != STATUS_OK){ - // TODO: raise an error if status < 0. - cout << "================ WARNING =================== \n"; - stringstream msg; - msg << "PreCAD processing failed with error code " << status << "\n"; - msg << *mcud._error; - cout << msg.str(); - cout << "============================================ \n"; - // the text of _comment is set in message_cb by mcud->_error - // => No need to append msg to _comment - if (status > 0) - { - // TODO: fix the SIGSEGV of COMPERR_WARNING with 2 launches - error(COMPERR_WARNING, _comment); - } - if (status < 0) - { - error(_comment); - } - } - else { - // retrieve the pre-processed CAD object - - // dcad - cleandc = precad_new_dcad(pcs); - if(!cleandc){ - cout << "Unable to retrieve PreCAD result on dcad \n"; - } - else - cout << "PreCAD processing successfull on dcad \n"; - - // cad - cleanc = precad_new_cad(pcs); - if(!cleanc){ - cout << "Unable to retrieve PreCAD result on cad \n"; - } - else - cout << "PreCAD processing successfull on cad \n"; - - // #if BLSURF_VERSION_LONG >= "3.1.1" - // /* We can now get the updated sizemaps (if any) */ - // // if(geo_sizemap_e) - // // clean_geo_sizemap_e = precad_new_sizemap(pcs, geo_sizemap_e); - // // - // // if(geo_sizemap_f) - // // clean_geo_sizemap_f = precad_new_sizemap(pcs, geo_sizemap_f); - // - // if(iso_sizemap_p) - // clean_iso_sizemap_p = precad_new_sizemap(pcs, iso_sizemap_p); - // - // if(iso_sizemap_e) - // clean_iso_sizemap_e = precad_new_sizemap(pcs, iso_sizemap_e); - // - // if(iso_sizemap_f) - // clean_iso_sizemap_f = precad_new_sizemap(pcs, iso_sizemap_f); - // #endif - } - // Now we can delete the PreCAD session - precad_session_delete(pcs); - } + + // TODO: be able to use a mesh in input. + // See imsh usage in Products/templates/mg-cadsurf_template_common.cpp + // => cadsurf_set_mesh + + // Use the original dcad + cadsurf_set_dcad(css, dcad); - if (cleandc) { - cout << "Give the pre-processed dcad object to the current BLSurf session \n"; - cadsurf_data_set_dcad(css, cleandc); - } - else { - // Use the original one - cadsurf_data_set_dcad(css, dcad); - } - - if (cleanc) { - // Give the pre-processed CAD object to the current BLSurf session - cout << "Give the pre-processed CAD object to the current BLSurf session \n"; - cadsurf_data_set_cad(css, cleanc); - } - else { - // Use the original one - cadsurf_data_set_cad(css, c); - } + // Use the original cad + cadsurf_set_cad(css, c); std::cout << std::endl; std::cout << "Beginning of Surface Mesh generation" << std::endl; @@ -2743,20 +2489,16 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, if ( _comment.empty() ) _comment = "Exception in cadsurf_compute_mesh()"; } - if ( status != STATUS_OK) { - // There was an error while meshing - error(_comment); - } std::cout << std::endl; std::cout << "End of Surface Mesh generation" << std::endl; std::cout << std::endl; mesh_t *msh = NULL; - cadsurf_data_get_mesh(css, &msh); + cadsurf_get_mesh(css, &msh); if(!msh){ /* release the mesh object */ - cadsurf_data_regain_mesh(css, msh); + cadsurf_regain_mesh(css, msh); return error(_comment); } @@ -2764,8 +2506,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, if (_hypothesis) GMFFileName = _hypothesis->GetGMFFile(); if (GMFFileName != "") { - // bool GMFFileMode = _hypothesis->GetGMFFileMode(); - bool asciiFound = (GMFFileName.find(".mesh",GMFFileName.length()-5) != std::string::npos); + 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) GMFFileName.append(".mesh"); @@ -2887,8 +2628,13 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, // 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]; - + 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; + continue; + } if (tags[vtx[0]]) { Set_NodeOnEdge(meshDS, nodes[vtx[0]], emap(tag)); tags[vtx[0]] = false; @@ -2918,29 +2664,29 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, mesh_get_triangle_extra_vertices(msh, it, &type, evtri); mesh_get_triangle_tag(msh, it, &tag); if (tags[vtx[0]]) { - meshDS->SetNodeOnFace(nodes[vtx[0]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[vtx[0]], tag); tags[vtx[0]] = false; }; if (tags[vtx[1]]) { - meshDS->SetNodeOnFace(nodes[vtx[1]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[vtx[1]], tag); tags[vtx[1]] = false; }; if (tags[vtx[2]]) { - meshDS->SetNodeOnFace(nodes[vtx[2]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[vtx[2]], tag); tags[vtx[2]] = false; }; if (type == MESHGEMS_MESH_ELEMENT_TYPE_TRIA6) { // QUADRATIC TRIANGLE if (tags[evtri[0]]) { - meshDS->SetNodeOnFace(nodes[evtri[0]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evtri[0]], tag); tags[evtri[0]] = false; } if (tags[evtri[1]]) { - meshDS->SetNodeOnFace(nodes[evtri[1]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evtri[1]], tag); tags[evtri[1]] = false; } if (tags[evtri[2]]) { - meshDS->SetNodeOnFace(nodes[evtri[2]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evtri[2]], tag); tags[evtri[2]] = false; } tri = meshDS->AddFace(nodes[vtx[0]], nodes[vtx[1]], nodes[vtx[2]], @@ -2949,7 +2695,7 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, else { tri = helper.AddFace(nodes[vtx[0]], nodes[vtx[1]], nodes[vtx[2]]); } - meshDS->SetMeshElementOnShape(tri, TopoDS::Face(fmap(tag))); + meshDS->SetMeshElementOnShape(tri, tag); } /* enumerate quadrangles */ @@ -2959,42 +2705,42 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, mesh_get_quadrangle_extra_vertices(msh, it, &type, evquad); mesh_get_quadrangle_tag(msh, it, &tag); if (tags[vtx[0]]) { - meshDS->SetNodeOnFace(nodes[vtx[0]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[vtx[0]], tag); tags[vtx[0]] = false; }; if (tags[vtx[1]]) { - meshDS->SetNodeOnFace(nodes[vtx[1]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[vtx[1]], tag); tags[vtx[1]] = false; }; if (tags[vtx[2]]) { - meshDS->SetNodeOnFace(nodes[vtx[2]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[vtx[2]], tag); tags[vtx[2]] = false; }; if (tags[vtx[3]]) { - meshDS->SetNodeOnFace(nodes[vtx[3]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[vtx[3]], tag); tags[vtx[3]] = false; }; if (type == MESHGEMS_MESH_ELEMENT_TYPE_QUAD9) { // QUADRATIC QUADRANGLE std::cout << "This is a quadratic quadrangle" << std::endl; if (tags[evquad[0]]) { - meshDS->SetNodeOnFace(nodes[evquad[0]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evquad[0]], tag); tags[evquad[0]] = false; } if (tags[evquad[1]]) { - meshDS->SetNodeOnFace(nodes[evquad[1]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evquad[1]], tag); tags[evquad[1]] = false; } if (tags[evquad[2]]) { - meshDS->SetNodeOnFace(nodes[evquad[2]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evquad[2]], tag); tags[evquad[2]] = false; } if (tags[evquad[3]]) { - meshDS->SetNodeOnFace(nodes[evquad[3]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evquad[3]], tag); tags[evquad[3]] = false; } if (tags[evquad[4]]) { - meshDS->SetNodeOnFace(nodes[evquad[4]], TopoDS::Face(fmap(tag))); + meshDS->SetNodeOnFace(nodes[evquad[4]], tag); tags[evquad[4]] = false; } quad = meshDS->AddFace(nodes[vtx[0]], nodes[vtx[1]], nodes[vtx[2]], nodes[vtx[3]], @@ -3004,24 +2750,21 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, else { quad = helper.AddFace(nodes[vtx[0]], nodes[vtx[1]], nodes[vtx[2]], nodes[vtx[3]]); } - meshDS->SetMeshElementOnShape(quad, TopoDS::Face(fmap(tag))); + meshDS->SetMeshElementOnShape(quad, tag); } /* release the mesh object, the rest is released by cleaner */ - cadsurf_data_regain_mesh(css, msh); + cadsurf_regain_mesh(css, msh); - if ( needMerge ) // sew mesh computed by BLSURF with pre-existing mesh + if ( needMerge ) // sew mesh computed by MG-CADSurf with pre-existing mesh { SMESH_MeshEditor editor( &aMesh ); SMESH_MeshEditor::TListOfListOfNodes nodeGroupsToMerge; TIDSortedElemSet segementsOnEdge; - TIDSortedNodeSet nodesOnEdge; TSubMeshSet::iterator smIt; SMESHDS_SubMesh* smDS; - typedef SMDS_StdIterator< const SMDS_MeshNode*, SMDS_NodeIteratorPtr > TNodeIterator; - double tol; - // merge nodes on EDGE's with ones computed by BLSURF + // merge nodes on EDGE's with ones computed by MG-CADSurf for ( smIt = mergeSubmeshes.begin(); smIt != mergeSubmeshes.end(); ++smIt ) { if (! (smDS = *smIt) ) continue; @@ -3058,7 +2801,6 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, } // SetIsAlwaysComputed( true ) to sub-meshes of EDGEs w/o mesh - TopLoc_Location loc; double f,l; for (int i = 1; i <= emap.Extent(); i++) if ( SMESH_subMesh* sm = aMesh.GetSubMeshContaining( emap( i ))) sm->SetIsAlwaysComputed( true ); @@ -3069,16 +2811,28 @@ bool BLSURFPlugin_BLSURF::compute(SMESH_Mesh& aMesh, // Set error to FACE's w/o elements SMESH_ComputeErrorName err = COMPERR_ALGO_FAILED; - if ( _comment.empty() ) + if ( _comment.empty() && status == STATUS_OK ) { err = COMPERR_WARNING; _comment = "No mesh elements assigned to a face"; } - for ( int i = 1; i <= fmap.Extent(); ++i ) + bool badFaceFound = false; + for (TopExp_Explorer face_iter(aShape,TopAbs_FACE);face_iter.More();face_iter.Next()) { - SMESH_subMesh* sm = aMesh.GetSubMesh( fmap(i) ); + TopoDS_Face f = TopoDS::Face(face_iter.Current()); + SMESH_subMesh* sm = aMesh.GetSubMesh( f ); if ( !sm->GetSubMeshDS() || sm->GetSubMeshDS()->NbElements() == 0 ) + { sm->GetComputeError().reset( new SMESH_ComputeError( err, _comment, this )); + badFaceFound = true; + } + } + if ( err == COMPERR_WARNING ) + { + _comment.clear(); + } + if ( status != STATUS_OK && !badFaceFound ) { + error(_comment); } // Issue 0019864. On DebianSarge, FE signals do not obey to OSD::SetSignal(false) @@ -3129,6 +2883,12 @@ void BLSURFPlugin_BLSURF::Set_NodeOnEdge(SMESHDS_Mesh* meshDS, const SMDS_MeshNo Standard_Real p1 = 1.0; TopLoc_Location loc; Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, loc, p0, p1); + if ( curve.IsNull() ) + { + // issue 22499. Node at a sphere apex + meshDS->SetNodeOnEdge(node, edge, p0); + return; + } if ( !loc.IsIdentity() ) pnt.Transform( loc.Transformation().Inverted() ); GeomAPI_ProjectPointOnCurve proj(pnt, curve, p0, p1); @@ -3147,9 +2907,6 @@ void BLSURFPlugin_BLSURF::Set_NodeOnEdge(SMESHDS_Mesh* meshDS, const SMDS_MeshNo meshDS->MoveNode( node, curve_pnt.X(), curve_pnt.Y(), curve_pnt.Z() ); } } -// GProp_GProps LProps; -// BRepGProp::LinearProperties(ed, LProps); -// double lg = (double)LProps.Mass(); meshDS->SetNodeOnEdge(node, edge, pa); } @@ -3164,14 +2921,14 @@ void BLSURFPlugin_BLSURF::Set_NodeOnEdge(SMESHDS_Mesh* meshDS, const SMDS_MeshNo 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/BLSurf is querying on the curve */ + of the point PreCAD/MG-CADSurf is querying on the curve */ - /* user_data identifies the edge PreCAD/BLSurf is querying + /* 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; if (uv){ - /* BLSurf is querying the function evaluation */ + /* MG-CADSurf is querying the function evaluation */ gp_Pnt2d P; P=pargeo->Value(t); uv[0]=P.X(); uv[1]=P.Y(); @@ -3205,9 +2962,9 @@ status_t surf_fun(real *uv, real *xyz, real*du, real *dv, real *duu, real *duv, real *dvv, void *user_data) { /* uv[2] is given. It contains the u,v coordinates of the point - * PreCAD/BLSurf is querying on the surface */ + * PreCAD/MG-CADSurf is querying on the surface */ - /* user_data identifies the face PreCAD/BLSurf is querying (see + /* user_data identifies the face PreCAD/MG-CADSurf is querying (see * cad_face_new later in this example)*/ const Geom_Surface* geometry = (const Geom_Surface*) user_data; @@ -3244,15 +3001,12 @@ status_t surf_fun(real *uv, real *xyz, real*du, real *dv, status_t size_on_surface(integer face_id, real *uv, real *size, void *user_data) { - //MESSAGE("size_on_surface") + TId2ClsAttractorVec::iterator f2attVec; if (FaceId2PythonSmp.count(face_id) != 0){ - //MESSAGE("A size map is used to calculate size on face : "<Empty()){ + else if (( f2attVec = FaceIndex2ClassAttractor.find(face_id)) != FaceIndex2ClassAttractor.end() && !f2attVec->second.empty()){ // MESSAGE("attractor used on face :"<Empty()) - real result = FaceIndex2ClassAttractor[face_id]->GetSize(uv[0],uv[1]); + real result = 0; + result = 1e100; + std::vector< BLSURFPlugin_Attractor* > & attVec = f2attVec->second; + for ( size_t i = 0; i < attVec.size(); ++i ) + { + //result += attVec[i]->GetSize(uv[0],uv[1]); + result = Min( result, attVec[i]->GetSize(uv[0],uv[1])); + } + //*size = result / attVec.size(); // mean of sizes defined by all attractors *size = result; } else { @@ -3291,12 +3055,10 @@ 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) { if (EdgeId2PythonSmp.count(edge_id) != 0){ - PyObject * pyresult = NULL; - PyObject* new_stderr = NULL; assert(Py_IsInitialized()); PyGILState_STATE gstate; gstate = PyGILState_Ensure(); - pyresult = PyObject_CallFunction(EdgeId2PythonSmp[edge_id],(char*)"(f)",t); + PyObject* pyresult = PyObject_CallFunction(EdgeId2PythonSmp[edge_id],(char*)"(f)",t); real result; if ( pyresult != NULL) { result = PyFloat_AsDouble(pyresult); @@ -3306,10 +3068,12 @@ status_t size_on_edge(integer edge_id, real t, real *size, void *user_data) else{ fflush(stderr); string err_description=""; - new_stderr = newPyStdOut(err_description); + PyObject* new_stderr = newPyStdOut(err_description); + PyObject* old_stderr = PySys_GetObject((char*)"stderr"); + Py_INCREF(old_stderr); PySys_SetObject((char*)"stderr", new_stderr); PyErr_Print(); - PySys_SetObject((char*)"stderr", PySys_GetObject((char*)"__stderr__")); + PySys_SetObject((char*)"stderr", old_stderr); Py_DECREF(new_stderr); MESSAGE("Can't evaluate f(" << t << ")" << " error is " << err_description); result = *((real*)user_data); @@ -3326,12 +3090,10 @@ status_t size_on_edge(integer edge_id, real t, real *size, void *user_data) status_t size_on_vertex(integer point_id, real *size, void *user_data) { if (VertexId2PythonSmp.count(point_id) != 0){ - PyObject * pyresult = NULL; - PyObject* new_stderr = NULL; assert(Py_IsInitialized()); PyGILState_STATE gstate; gstate = PyGILState_Ensure(); - pyresult = PyObject_CallFunction(VertexId2PythonSmp[point_id],(char*)""); + PyObject* pyresult = PyObject_CallFunction(VertexId2PythonSmp[point_id],(char*)""); real result; if ( pyresult != NULL) { result = PyFloat_AsDouble(pyresult); @@ -3341,10 +3103,12 @@ status_t size_on_vertex(integer point_id, real *size, void *user_data) else { fflush(stderr); string err_description=""; - new_stderr = newPyStdOut(err_description); + PyObject* new_stderr = newPyStdOut(err_description); + PyObject* old_stderr = PySys_GetObject((char*)"stderr"); + Py_INCREF(old_stderr); PySys_SetObject((char*)"stderr", new_stderr); PyErr_Print(); - PySys_SetObject((char*)"stderr", PySys_GetObject((char*)"__stderr__")); + PySys_SetObject((char*)"stderr", old_stderr); Py_DECREF(new_stderr); MESSAGE("Can't evaluate f()" << " error is " << err_description); result = *((real*)user_data); @@ -3359,7 +3123,7 @@ status_t size_on_vertex(integer point_id, real *size, void *user_data) } /* - * The following function will be called for PreCAD/BLSurf message + * The following function will be called for PreCAD/MG-CADSurf message * printing. See context_set_message_callback (later in this * template) for how to set user_data. */ @@ -3372,7 +3136,10 @@ status_t message_cb(message_t *msg, void *user_data) string err( desc ); message_cb_user_data * mcud = (message_cb_user_data*)user_data; // Get all the error message and some warning messages related to license and periodicity - if ( errnumber < 0 || err.find("license") != string::npos || err.find("periodicity") != string::npos ) { + if ( errnumber < 0 || + err.find("license" ) != string::npos || + err.find("periodicity") != string::npos ) + { // remove ^A from the tail int len = strlen( desc ); while (len > 0 && desc[len-1] != '\n') @@ -3388,7 +3155,7 @@ status_t message_cb(message_t *msg, void *user_data) return STATUS_OK; } -/* This is the interrupt callback. PreCAD/BLSurf will call this +/* This is the interrupt callback. PreCAD/MG-CADSurf will call this * function regularily. See the file meshgems/interrupt.h */ status_t interrupt_cb(integer *interrupt_status, void *user_data) @@ -3402,7 +3169,7 @@ status_t interrupt_cb(integer *interrupt_status, void *user_data) *interrupt_status = INTERRUPT_CONTINUE; return STATUS_OK; } - else /* you want to stop BLSurf */ + else /* you want to stop MG-CADSurf */ { *interrupt_status = INTERRUPT_STOP; return STATUS_ERROR;