- return true;
-}
-
-//=======================================================================
-//function : writePoints
-//purpose :
-//=======================================================================
-
-static bool writePoints (ofstream & theFile,
- SMESH_MesherHelper& theHelper,
- map <int,int> & theSmdsToGhs3dIdMap,
- map <int,int> & theEnforcedNodeIdToGhs3dIdMap,
- map <int,const SMDS_MeshNode*> & theGhs3dIdToNodeMap,
- GHS3DPlugin_Hypothesis::TID2SizeMap & theNodeIDToSizeMap,
- GHS3DPlugin_Hypothesis::TGHS3DEnforcedVertexCoordsValues & theEnforcedVertices,
- GHS3DPlugin_Hypothesis::TIDSortedNodeGroupMap & theEnforcedNodes,
- GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap & theEnforcedEdges,
- GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap & theEnforcedTriangles)
-{
- // record structure:
- //
- // NB_NODES
- // Loop from 1 to NB_NODES
- // X Y Z DUMMY_INT
-
- SMESHDS_Mesh * theMeshDS = theHelper.GetMeshDS();
- int nbNodes = theMeshDS->NbNodes();
- if ( nbNodes == 0 )
- return false;
-
- int nbEnforcedVertices = theEnforcedVertices.size();
- int nbEnforcedNodes = theEnforcedNodes.size();
-
- const TopoDS_Shape shapeToMesh = theMeshDS->ShapeToMesh();
-
- int aGhs3dID = 1;
- SMDS_NodeIteratorPtr nodeIt = theMeshDS->nodesIterator();
- const SMDS_MeshNode* node;
-
- // Issue 020674: EDF 870 SMESH: Mesh generated by Netgen not usable by GHS3D
- // The problem is in nodes on degenerated edges, we need to skip nodes which are free
- // and replace not-free nodes on degenerated edges by the node on vertex
- TNodeNodeMap n2nDegen; // map a node on degenerated edge to a node on vertex
- TNodeNodeMap::iterator n2nDegenIt;
- if ( theHelper.HasDegeneratedEdges() )
- {
- set<int> checkedSM;
- for (TopExp_Explorer e(theMeshDS->ShapeToMesh(), TopAbs_EDGE ); e.More(); e.Next())
- {
- SMESH_subMesh* sm = theHelper.GetMesh()->GetSubMesh( e.Current() );
- if ( checkedSM.insert( sm->GetId() ).second && theHelper.IsDegenShape(sm->GetId() ))
- {
- if ( SMESHDS_SubMesh* smDS = sm->GetSubMeshDS() )
- {
- TopoDS_Shape vertex = TopoDS_Iterator( e.Current() ).Value();
- const SMDS_MeshNode* vNode = SMESH_Algo::VertexNode( TopoDS::Vertex( vertex ), theMeshDS);
- {
- SMDS_NodeIteratorPtr nIt = smDS->GetNodes();
- while ( nIt->more() )
- n2nDegen.insert( make_pair( nIt->next(), vNode ));
- }
- }
- }
- }
- nbNodes -= n2nDegen.size();
- }
-
- const bool isQuadMesh =
- theHelper.GetMesh()->NbEdges( ORDER_QUADRATIC ) ||
- theHelper.GetMesh()->NbFaces( ORDER_QUADRATIC ) ||
- theHelper.GetMesh()->NbVolumes( ORDER_QUADRATIC );
- if ( isQuadMesh )
- {
- // descrease nbNodes by nb of medium nodes
- while ( nodeIt->more() )
- {
- node = nodeIt->next();
- if ( !theHelper.IsDegenShape( node->getshapeId() ))
- nbNodes -= int( theHelper.IsMedium( node ));
- }
- nodeIt = theMeshDS->nodesIterator();
- }
-
- const char* space = " ";
- const int dummyint = 0;
-
- std::string tmpStr;
- (nbNodes == 0 || nbNodes == 1) ? tmpStr = " node" : tmpStr = " nodes";
- // NB_NODES
- std::cout << std::endl;
- std::cout << "The initial 2D mesh contains :" << std::endl;
- std::cout << " " << nbNodes << tmpStr << std::endl;
- if (nbEnforcedVertices > 0) {
- (nbEnforcedVertices == 1) ? tmpStr = "vertex" : tmpStr = "vertices";
- std::cout << " " << nbEnforcedVertices << " enforced " << tmpStr << std::endl;
- }
- if (nbEnforcedNodes > 0) {
- (nbEnforcedNodes == 1) ? tmpStr = "node" : tmpStr = "nodes";
- std::cout << " " << nbEnforcedNodes << " enforced " << tmpStr << std::endl;
- }
- std::cout << std::endl;
- std::cout << "Start writing in 'points' file ..." << std::endl;
-
- theFile << nbNodes << std::endl;
-
- // Loop from 1 to NB_NODES
-
- while ( nodeIt->more() )
- {
- node = nodeIt->next();
- if ( isQuadMesh && theHelper.IsMedium( node )) // Issue 0021238
- continue;
- if ( n2nDegen.count( node ) ) // Issue 0020674
- continue;
-
- theSmdsToGhs3dIdMap.insert( make_pair( node->GetID(), aGhs3dID ));
- theGhs3dIdToNodeMap.insert( make_pair( aGhs3dID, node ));
- aGhs3dID++;
-
- // X Y Z DUMMY_INT
- theFile
- << node->X() << space
- << node->Y() << space
- << node->Z() << space
- << dummyint;
-
- theFile << std::endl;
-
- }
-
- // Iterate over the enforced nodes
- std::map<int,double> enfVertexIndexSizeMap;
- if (nbEnforcedNodes) {
- GHS3DPlugin_Hypothesis::TIDSortedNodeGroupMap::const_iterator nodeIt = theEnforcedNodes.begin();
- for( ; nodeIt != theEnforcedNodes.end() ; ++nodeIt) {
- double x = nodeIt->first->X();
- double y = nodeIt->first->Y();
- double z = nodeIt->first->Z();
- // Test if point is inside shape to mesh
- gp_Pnt myPoint(x,y,z);
- BRepClass3d_SolidClassifier scl(shapeToMesh);
- scl.Perform(myPoint, 1e-7);
- TopAbs_State result = scl.State();
- if ( result != TopAbs_IN )
- continue;
- std::vector<double> coords;
- coords.push_back(x);
- coords.push_back(y);
- coords.push_back(z);
- if (theEnforcedVertices.find(coords) != theEnforcedVertices.end())
- continue;
-
-// double size = theNodeIDToSizeMap.find(nodeIt->first->GetID())->second;
- // theGhs3dIdToNodeMap.insert( make_pair( nbNodes + i, (*nodeIt) ));
- // MESSAGE("Adding enforced node (" << x << "," << y <<"," << z << ")");
- // X Y Z PHY_SIZE DUMMY_INT
- theFile
- << x << space
- << y << space
- << z << space
- << -1 << space
- << dummyint << space;
- theFile << std::endl;
- theEnforcedNodeIdToGhs3dIdMap.insert( make_pair( nodeIt->first->GetID(), aGhs3dID ));
- enfVertexIndexSizeMap[aGhs3dID] = -1;
- aGhs3dID++;
- // else
- // MESSAGE("Enforced vertex (" << x << "," << y <<"," << z << ") is not inside the geometry: it was not added ");
- }
- }
-
- if (nbEnforcedVertices) {
- // Iterate over the enforced vertices
- GHS3DPlugin_Hypothesis::TGHS3DEnforcedVertexCoordsValues::const_iterator vertexIt = theEnforcedVertices.begin();
- for( ; vertexIt != theEnforcedVertices.end() ; ++vertexIt) {
- double x = vertexIt->first[0];
- double y = vertexIt->first[1];
- double z = vertexIt->first[2];
- // Test if point is inside shape to mesh
- gp_Pnt myPoint(x,y,z);
- BRepClass3d_SolidClassifier scl(shapeToMesh);
- scl.Perform(myPoint, 1e-7);
- TopAbs_State result = scl.State();
- if ( result != TopAbs_IN )
- continue;
- MESSAGE("Adding enforced vertex (" << x << "," << y <<"," << z << ") = " << vertexIt->second);
- // X Y Z PHY_SIZE DUMMY_INT
- theFile
- << x << space
- << y << space
- << z << space
- << vertexIt->second << space
- << dummyint << space;
- theFile << std::endl;
- enfVertexIndexSizeMap[aGhs3dID] = vertexIt->second;
- aGhs3dID++;
- }
- }
-
-
- std::cout << std::endl;
- std::cout << "End writing in 'points' file." << std::endl;
-
- return true;
-}
-
-//=======================================================================
-//function : readResultFile
-//purpose : readResultFile with geometry
-//=======================================================================
-
-static bool readResultFile(const int fileOpen,
-#ifdef WIN32
- const char* fileName,
-#endif
- GHS3DPlugin_GHS3D* theAlgo,
- SMESH_MesherHelper& theHelper,
- TopoDS_Shape tabShape[],
- double** tabBox,
- const int nbShape,
- map <int,const SMDS_MeshNode*>& theGhs3dIdToNodeMap,
- std::map <int,int> & theNodeId2NodeIndexMap,
- bool toMeshHoles,
- int nbEnforcedVertices,
- int nbEnforcedNodes,
- GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap & theEnforcedEdges,
- GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap & theEnforcedTriangles,
- bool toMakeGroupsOfDomains)
-{
- MESSAGE("GHS3DPlugin_GHS3D::readResultFile()");
- Kernel_Utils::Localizer loc;
- struct stat status;
- size_t length;
-
- std::string tmpStr;
-
- char *ptr, *mapPtr;
- char *tetraPtr;
- char *shapePtr;
-
- SMESHDS_Mesh* theMeshDS = theHelper.GetMeshDS();
-
- int nbElems, nbNodes, nbInputNodes;
- int nbTriangle;
- int ID, shapeID, ghs3dShapeID;
- int IdShapeRef = 1;
- int compoundID =
- nbShape ? theMeshDS->ShapeToIndex( tabShape[0] ) : theMeshDS->ShapeToIndex( theMeshDS->ShapeToMesh() );
-
- int *tab, *tabID, *nodeID, *nodeAssigne;
- double *coord;
- const SMDS_MeshNode **node;
-
- tab = new int[3];
- nodeID = new int[4];
- coord = new double[3];
- node = new const SMDS_MeshNode*[4];
-
- TopoDS_Shape aSolid;
- SMDS_MeshNode * aNewNode;
- map <int,const SMDS_MeshNode*>::iterator itOnNode;
- SMDS_MeshElement* aTet;
-#ifdef _DEBUG_
- set<int> shapeIDs;
-#endif
-
- // Read the file state
- fstat(fileOpen, &status);
- length = status.st_size;
-
- // Mapping the result file into memory
-#ifdef WIN32
- HANDLE fd = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ,
- NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- HANDLE hMapObject = CreateFileMapping(fd, NULL, PAGE_READONLY,
- 0, (DWORD)length, NULL);
- ptr = ( char* ) MapViewOfFile(hMapObject, FILE_MAP_READ, 0, 0, 0 );
-#else
- ptr = (char *) mmap(0,length,PROT_READ,MAP_PRIVATE,fileOpen,0);
-#endif
- mapPtr = ptr;
-
- ptr = readMapIntLine(ptr, tab);
- tetraPtr = ptr;
-
- nbElems = tab[0];
- nbNodes = tab[1];
- nbInputNodes = tab[2];
-
- nodeAssigne = new int[ nbNodes+1 ];
-
- if (nbShape > 0)
- aSolid = tabShape[0];
-
- // Reading the nodeId
- for (int i=0; i < 4*nbElems; i++)
- strtol(ptr, &ptr, 10);
-
- MESSAGE("nbInputNodes: "<<nbInputNodes);
- MESSAGE("nbEnforcedVertices: "<<nbEnforcedVertices);
- MESSAGE("nbEnforcedNodes: "<<nbEnforcedNodes);
- // Reading the nodeCoor and update the nodeMap
- for (int iNode=1; iNode <= nbNodes; iNode++) {
- if(theAlgo->computeCanceled())
- return false;
- for (int iCoor=0; iCoor < 3; iCoor++)
- coord[ iCoor ] = strtod(ptr, &ptr);
- nodeAssigne[ iNode ] = 1;
- if ( iNode > (nbInputNodes-(nbEnforcedVertices+nbEnforcedNodes)) ) {
- // Creating SMESH nodes
- // - for enforced vertices
- // - for vertices of forced edges
- // - for ghs3d nodes
- nodeAssigne[ iNode ] = 0;
- aNewNode = theMeshDS->AddNode( coord[0],coord[1],coord[2] );
- theGhs3dIdToNodeMap.insert(theGhs3dIdToNodeMap.end(), make_pair( iNode, aNewNode ));
- }
- }
-
- // Reading the number of triangles which corresponds to the number of sub-domains
- nbTriangle = strtol(ptr, &ptr, 10);
-
- tabID = new int[nbTriangle];
- for (int i=0; i < nbTriangle; i++) {
- if(theAlgo->computeCanceled())
- return false;
- tabID[i] = 0;
- // find the solid corresponding to GHS3D sub-domain following
- // the technique proposed in GHS3D manual in chapter
- // "B.4 Subdomain (sub-region) assignment"
- int nodeId1 = strtol(ptr, &ptr, 10);
- int nodeId2 = strtol(ptr, &ptr, 10);
- int nodeId3 = strtol(ptr, &ptr, 10);
- if ( nbTriangle > 1 ) {
- const SMDS_MeshNode* n1 = theGhs3dIdToNodeMap[ nodeId1 ];
- const SMDS_MeshNode* n2 = theGhs3dIdToNodeMap[ nodeId2 ];
- const SMDS_MeshNode* n3 = theGhs3dIdToNodeMap[ nodeId3 ];
- if (!n1 || !n2 || !n3) {
- tabID[i] = HOLE_ID;
- continue;
- }
- try {
- OCC_CATCH_SIGNALS;
-// tabID[i] = findShapeID( theHelper, n1, n2, n3, toMeshHoles );
- tabID[i] = findShapeID( *theHelper.GetMesh(), n1, n2, n3, toMeshHoles );
- // -- 0020330: Pb with ghs3d as a submesh
- // check that found shape is to be meshed
- if ( tabID[i] > 0 ) {
- const TopoDS_Shape& foundShape = theMeshDS->IndexToShape( tabID[i] );
- bool isToBeMeshed = false;
- for ( int iS = 0; !isToBeMeshed && iS < nbShape; ++iS )
- isToBeMeshed = foundShape.IsSame( tabShape[ iS ]);
- if ( !isToBeMeshed )
- tabID[i] = HOLE_ID;
- }
- // END -- 0020330: Pb with ghs3d as a submesh
-#ifdef _DEBUG_
- std::cout << i+1 << " subdomain: findShapeID() returns " << tabID[i] << std::endl;
-#endif
- }
- catch ( Standard_Failure & ex)
- {
-#ifdef _DEBUG_
- std::cout << i+1 << " subdomain: Exception caugt: " << ex.GetMessageString() << std::endl;
-#endif
- }
- catch (...) {
-#ifdef _DEBUG_
- std::cout << i+1 << " subdomain: unknown exception caught " << std::endl;
-#endif
- }
- }
- }
-
- shapePtr = ptr;
-
- if ( nbTriangle <= nbShape ) // no holes
- toMeshHoles = true; // not avoid creating tetras in holes
-
- // IMP 0022172: [CEA 790] create the groups corresponding to domains
- std::vector< std::vector< const SMDS_MeshElement* > > elemsOfDomain( Max( nbTriangle, nbShape ));
-
- // Associating the tetrahedrons to the shapes
- shapeID = compoundID;
- for (int iElem = 0; iElem < nbElems; iElem++) {
- if(theAlgo->computeCanceled())
- return false;
- for (int iNode = 0; iNode < 4; iNode++) {
- ID = strtol(tetraPtr, &tetraPtr, 10);
- itOnNode = theGhs3dIdToNodeMap.find(ID);
- node[ iNode ] = itOnNode->second;
- nodeID[ iNode ] = ID;
- }
- // We always run GHS3D with "to mesh holes"==TRUE but we must not create
- // tetras within holes depending on hypo option,
- // so we first check if aTet is inside a hole and then create it
- //aTet = theMeshDS->AddVolume( node[1], node[0], node[2], node[3] );
- ghs3dShapeID = 0; // domain ID
- if ( nbTriangle > 1 ) {
- shapeID = HOLE_ID; // negative shapeID means not to create tetras if !toMeshHoles
- ghs3dShapeID = strtol(shapePtr, &shapePtr, 10) - IdShapeRef;
- if ( tabID[ ghs3dShapeID ] == 0 ) {
- TopAbs_State state;
- aSolid = findShape(node, aSolid, tabShape, tabBox, nbShape, &state);
- if ( toMeshHoles || state == TopAbs_IN )
- shapeID = theMeshDS->ShapeToIndex( aSolid );
- tabID[ ghs3dShapeID ] = shapeID;
- }
- else
- shapeID = tabID[ ghs3dShapeID ];
- }
- else if ( nbShape > 1 ) {
- // Case where nbTriangle == 1 while nbShape == 2 encountered
- // with compound of 2 boxes and "To mesh holes"==False,
- // so there are no subdomains specified for each tetrahedron.
- // Try to guess a solid by a node already bound to shape
- shapeID = 0;
- for ( int i=0; i<4 && shapeID==0; i++ ) {
- if ( nodeAssigne[ nodeID[i] ] == 1 &&
- node[i]->GetPosition()->GetTypeOfPosition() == SMDS_TOP_3DSPACE &&
- node[i]->getshapeId() > 1 )
- {
- shapeID = node[i]->getshapeId();
- }
- }
- if ( shapeID==0 ) {
- aSolid = findShape(node, aSolid, tabShape, tabBox, nbShape);
- shapeID = theMeshDS->ShapeToIndex( aSolid );
- }
- }
- // set new nodes and tetrahedron onto the shape
- for ( int i=0; i<4; i++ ) {
- if ( nodeAssigne[ nodeID[i] ] == 0 ) {
- if ( shapeID != HOLE_ID )
- theMeshDS->SetNodeInVolume( node[i], shapeID );
- nodeAssigne[ nodeID[i] ] = shapeID;
- }
- }
- if ( toMeshHoles || shapeID != HOLE_ID ) {
- aTet = theHelper.AddVolume( node[1], node[0], node[2], node[3],
- /*id=*/0, /*force3d=*/false);
- theMeshDS->SetMeshElementOnShape( aTet, shapeID );
- if ( toMakeGroupsOfDomains )
- {
- if ( int( elemsOfDomain.size() ) < ghs3dShapeID+1 )
- elemsOfDomain.resize( ghs3dShapeID+1 );
- elemsOfDomain[ ghs3dShapeID ].push_back( aTet );
- }
- }
-#ifdef _DEBUG_
- shapeIDs.insert( shapeID );
-#endif
- }
- if ( toMakeGroupsOfDomains )
- makeDomainGroups( elemsOfDomain, &theHelper );
-
- // Add enforced elements
- GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap::const_iterator elemIt;
- const SMDS_MeshElement* anElem;
- SMDS_ElemIteratorPtr itOnEnfElem;
- map<int,int>::const_iterator itOnMap;
- shapeID = compoundID;
- // Enforced edges
- if (theEnforcedEdges.size()) {
- (theEnforcedEdges.size() <= 1) ? tmpStr = " enforced edge" : " enforced edges";
- std::cout << "Add " << theEnforcedEdges.size() << tmpStr << std::endl;
- std::vector< const SMDS_MeshNode* > node( 2 );
- // Iterate over the enforced edges
- for(elemIt = theEnforcedEdges.begin() ; elemIt != theEnforcedEdges.end() ; ++elemIt) {
- anElem = elemIt->first;
- bool addElem = true;
- itOnEnfElem = anElem->nodesIterator();
- for ( int j = 0; j < 2; ++j ) {
- int aNodeID = itOnEnfElem->next()->GetID();
- itOnMap = theNodeId2NodeIndexMap.find(aNodeID);
- if (itOnMap != theNodeId2NodeIndexMap.end()) {
- itOnNode = theGhs3dIdToNodeMap.find((*itOnMap).second);
- if (itOnNode != theGhs3dIdToNodeMap.end()) {
- node.push_back((*itOnNode).second);
-// shapeID =(*itOnNode).second->getshapeId();
- }
- else
- addElem = false;
- }
- else
- addElem = false;
- }
- if (addElem) {
- aTet = theHelper.AddEdge( node[0], node[1], 0, false);
- theMeshDS->SetMeshElementOnShape( aTet, shapeID );
- }
- }
- }
- // Enforced faces
- if (theEnforcedTriangles.size()) {
- (theEnforcedTriangles.size() <= 1) ? tmpStr = " enforced triangle" : " enforced triangles";
- std::cout << "Add " << theEnforcedTriangles.size() << " enforced triangles" << std::endl;
- std::vector< const SMDS_MeshNode* > node( 3 );
- // Iterate over the enforced triangles
- for(elemIt = theEnforcedTriangles.begin() ; elemIt != theEnforcedTriangles.end() ; ++elemIt) {
- anElem = elemIt->first;
- bool addElem = true;
- itOnEnfElem = anElem->nodesIterator();
- for ( int j = 0; j < 3; ++j ) {
- int aNodeID = itOnEnfElem->next()->GetID();
- itOnMap = theNodeId2NodeIndexMap.find(aNodeID);
- if (itOnMap != theNodeId2NodeIndexMap.end()) {
- itOnNode = theGhs3dIdToNodeMap.find((*itOnMap).second);
- if (itOnNode != theGhs3dIdToNodeMap.end()) {
- node.push_back((*itOnNode).second);
-// shapeID =(*itOnNode).second->getshapeId();
- }
- else
- addElem = false;
- }
- else
- addElem = false;
- }
- if (addElem) {
- aTet = theHelper.AddFace( node[0], node[1], node[2], 0, false);
- theMeshDS->SetMeshElementOnShape( aTet, shapeID );
- }
- }
- }
-
- // Remove nodes of tetras inside holes if !toMeshHoles
- if ( !toMeshHoles ) {
- itOnNode = theGhs3dIdToNodeMap.find( nbInputNodes );
- for ( ; itOnNode != theGhs3dIdToNodeMap.end(); ++itOnNode) {
- ID = itOnNode->first;
- if ( nodeAssigne[ ID ] == HOLE_ID )
- theMeshDS->RemoveFreeNode( itOnNode->second, 0 );
- }
- }
-
-
- if ( nbElems ) {
- (nbElems <= 1) ? tmpStr = " tetrahedra" : " tetrahedrons";
- cout << nbElems << tmpStr << " have been associated to " << nbShape;
- (nbShape <= 1) ? tmpStr = " shape" : " shapes";
- cout << tmpStr << endl;
- }
-#ifdef WIN32
- UnmapViewOfFile(mapPtr);
- CloseHandle(hMapObject);
- CloseHandle(fd);
-#else
- munmap(mapPtr, length);
-#endif
- close(fileOpen);
-
- delete [] tab;
- delete [] tabID;
- delete [] nodeID;
- delete [] coord;
- delete [] node;
- delete [] nodeAssigne;
-
-#ifdef _DEBUG_
- shapeIDs.erase(-1);
- if ( shapeIDs.size() != nbShape ) {
- (shapeIDs.size() <= 1) ? tmpStr = " solid" : " solids";
- std::cout << "Only " << shapeIDs.size() << tmpStr << " of " << nbShape << " found" << std::endl;
- for (int i=0; i<nbShape; i++) {
- shapeID = theMeshDS->ShapeToIndex( tabShape[i] );
- if ( shapeIDs.find( shapeID ) == shapeIDs.end() )
- std::cout << " Solid #" << shapeID << " not found" << std::endl;
- }
- }
-#endif
-
- return true;
-}
-
-
-//=============================================================================
-/*!
- *Here we are going to use the GHS3D mesher with geometry
- */
-//=============================================================================
-
-bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh,
- const TopoDS_Shape& theShape)
-{
- bool Ok(false);
- //SMESHDS_Mesh* meshDS = theMesh.GetMeshDS();
-
- // we count the number of shapes
- // _nbShape = countShape( meshDS, TopAbs_SOLID ); -- 0020330: Pb with ghs3d as a submesh
- // _nbShape = 0;
- TopExp_Explorer expBox ( theShape, TopAbs_SOLID );
- // for ( ; expBox.More(); expBox.Next() )
- // _nbShape++;
-
- // create bounding box for every shape inside the compound
-
- // int iShape = 0;
- // TopoDS_Shape* tabShape;
- // double** tabBox;
- // tabShape = new TopoDS_Shape[_nbShape];
- // tabBox = new double*[_nbShape];
- // for (int i=0; i<_nbShape; i++)
- // tabBox[i] = new double[6];
- // Standard_Real Xmin, Ymin, Zmin, Xmax, Ymax, Zmax;
-
- // for (expBox.ReInit(); expBox.More(); expBox.Next()) {
- // tabShape[iShape] = expBox.Current();
- // Bnd_Box BoundingBox;
- // BRepBndLib::Add(expBox.Current(), BoundingBox);
- // BoundingBox.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax);
- // tabBox[iShape][0] = Xmin; tabBox[iShape][1] = Xmax;
- // tabBox[iShape][2] = Ymin; tabBox[iShape][3] = Ymax;
- // tabBox[iShape][4] = Zmin; tabBox[iShape][5] = Zmax;
- // iShape++;
- // }
-
- // a unique working file name
- // to avoid access to the same files by eg different users
- _genericName = GHS3DPlugin_Hypothesis::GetFileName(_hyp);
- TCollection_AsciiString aGenericName((char*) _genericName.c_str() );
- TCollection_AsciiString aGenericNameRequired = aGenericName + "_required";
-
- TCollection_AsciiString aLogFileName = aGenericName + ".log"; // log
- TCollection_AsciiString aResultFileName;
-
- TCollection_AsciiString aGMFFileName, aRequiredVerticesFileName, aSolFileName;
-//#ifdef _DEBUG_
- aGMFFileName = aGenericName + ".mesh"; // GMF mesh file
- aResultFileName = aGenericName + "Vol.mesh"; // GMF mesh file
- aRequiredVerticesFileName = aGenericNameRequired + ".mesh"; // GMF required vertices mesh file
- aSolFileName = aGenericNameRequired + ".sol"; // GMF solution file
-//#else
-// aGMFFileName = aGenericName + ".meshb"; // GMF mesh file
-// aResultFileName = aGenericName + "Vol.meshb"; // GMF mesh file
-// aRequiredVerticesFileName = aGenericNameRequired + ".meshb"; // GMF required vertices mesh file
-// aSolFileName = aGenericNameRequired + ".solb"; // GMF solution file
-//#endif
-
- std::map <int,int> aNodeId2NodeIndexMap, aSmdsToGhs3dIdMap, anEnforcedNodeIdToGhs3dIdMap;
- std::map <int,const SMDS_MeshNode*> aGhs3dIdToNodeMap;
- std::map <int, int> nodeID2nodeIndexMap;
- std::map<std::vector<double>, std::string> enfVerticesWithGroup;
- GHS3DPlugin_Hypothesis::TGHS3DEnforcedVertexCoordsValues coordsSizeMap = GHS3DPlugin_Hypothesis::GetEnforcedVerticesCoordsSize(_hyp);
- GHS3DPlugin_Hypothesis::TIDSortedNodeGroupMap enforcedNodes = GHS3DPlugin_Hypothesis::GetEnforcedNodes(_hyp);
- GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap enforcedEdges = GHS3DPlugin_Hypothesis::GetEnforcedEdges(_hyp);
- GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap enforcedTriangles = GHS3DPlugin_Hypothesis::GetEnforcedTriangles(_hyp);
-// TIDSortedElemSet enforcedQuadrangles = GHS3DPlugin_Hypothesis::GetEnforcedQuadrangles(_hyp);
- GHS3DPlugin_Hypothesis::TID2SizeMap nodeIDToSizeMap = GHS3DPlugin_Hypothesis::GetNodeIDToSizeMap(_hyp);
-
- int nbEnforcedVertices = coordsSizeMap.size();
- int nbEnforcedNodes = enforcedNodes.size();
-