****************************************************************************/
char *file2Read = (char *)myFile.c_str();
FILE* aFileId = fopen(file2Read, "r");
- if (aFileId < 0) {
+ if ( !aFileId ) {
fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
return DRS_FAIL;
}
int nbNodes, nbCells;
//int i;
-
+
char *file2Read = (char *)myFile.c_str();
FILE* aFileId = fopen(file2Read, "w+");
- if (aFileId < 0) {
+ if ( !aFileId ) {
fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
return DRS_FAIL;
}
/****************************************************************************
* NOMBRES D'OBJETS *
****************************************************************************/
-
+
/* Combien de noeuds ? */
nbNodes = myMesh->NbNodes();
-
+
/* Combien de mailles, faces ou aretes ? */
int /*nb_of_nodes,*/ nb_of_edges, nb_of_faces, nb_of_volumes;
nb_of_edges = myMesh->NbEdges();
SCRUTE(nb_of_edges);
SCRUTE(nb_of_faces);
SCRUTE(nb_of_volumes);
-
+
fprintf(stdout, "%d %d\n", nbNodes, nbCells);
fprintf(aFileId, "%d %d\n", nbNodes, nbCells);
-
+
/****************************************************************************
* ECRITURE DES NOEUDS *
****************************************************************************/
-
+
SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator();
while(itNodes->more()){
const SMDS_MeshNode * node = itNodes->next();
{
assert (in_file.good());
assert (!ds_name.empty());
-
+
std::string olds, news;
-
+
in_file.seekg(0);
- while(true){
+ while(true)
+ {
in_file >> olds >> news;
/*
* a "-1" followed by a number means the beginning of a dataset
* stop combing at the end of the file
*/
- while( ((olds != "-1") || (news == "-1") ) && !in_file.eof() ){
+ while( ((olds != "-1") || (news == "-1")))
+ {
olds = news;
in_file >> news;
- }
- if(in_file.eof())
- {
- in_file.clear();
- return false;
+
+ if ( in_file.eof() || in_file.fail() )
+ {
+ in_file.clear();
+ return false;
+ }
}
if (news == ds_name)
return true;
return aGroup;
SMESH_Group* anOldGrp = (*itg).second;
- SMESHDS_GroupBase* anOldGrpDS = anOldGrp->GetGroupDS();
- if ( !anOldGrp || !anOldGrpDS )
+ if ( !anOldGrp || !anOldGrp->GetGroupDS() )
return aGroup;
+ SMESHDS_GroupBase* anOldGrpDS = anOldGrp->GetGroupDS();
// create new standalone group
aGroup = new SMESH_Group (theGroupID, this, anOldGrpDS->GetType(), anOldGrp->GetName() );
for ( itElem = theElements.begin(); itElem != theElements.end(); itElem++ ) {
// check element type
const SMDS_MeshElement* elem = *itElem;
- SMDSAbs_ElementType aTypeE = elem->GetType();
- if ( !elem /*|| ( aTypeE != SMDSAbs_Face && aTypeE != SMDSAbs_Edge )*/ )
+ if ( !elem )
continue;
+ // SMDSAbs_ElementType aTypeE = elem->GetType();
+ // if ( aTypeE != SMDSAbs_Face && aTypeE != SMDSAbs_Edge )
+ // continue;
vector<TNodeOfNodeListMapItr> & newNodesItVec = mapElemNewNodes[ elem ];
newNodesItVec.reserve( elem->NbNodes() );
SMESHDS_SubMesh * aFaceSubmesh,
const bool isMainShape)
{
- if ( isMainShape ) {
+ if ( isMainShape && aFaceSubmesh ) {
// check that all faces are bound to aFaceSubmesh
if ( aMeshDS->NbFaces() != aFaceSubmesh->NbElements() )
return false;
}
if ( outerBndPos != boundaryList.begin() )
- boundaryList.splice( boundaryList.begin(), boundaryList, outerBndPos, ++outerBndPos );
+ boundaryList.splice( boundaryList.begin(), boundaryList, outerBndPos );
} // if nbBoundaries > 1
//=======================================================================
void SMESHDS_Command::AddNode(int NewNodeID, double x, double y, double z)
{
- if (!myType == SMESHDS_AddNode)
+ if ( myType != SMESHDS_AddNode)
{
MESSAGE("SMESHDS_Command::AddNode : Bad Type");
return;
//=======================================================================
void SMESHDS_Command::MoveNode(int NodeID, double x, double y, double z)
{
- if (!myType == SMESHDS_MoveNode)
+ if ( myType != SMESHDS_MoveNode)
{
MESSAGE("SMESHDS_Command::MoveNode : Bad Type");
return;
//=======================================================================
void SMESHDS_Command::Add0DElement(int New0DElementID, int idnode)
{
- if (!myType == SMESHDS_Add0DElement)
+ if ( myType != SMESHDS_Add0DElement)
{
MESSAGE("SMESHDS_Command::Add0DElement : Bad Type");
return;
//=======================================================================
void SMESHDS_Command::AddEdge(int NewEdgeID, int idnode1, int idnode2)
{
- if (!myType == SMESHDS_AddEdge)
+ if ( myType != SMESHDS_AddEdge)
{
MESSAGE("SMESHDS_Command::AddEdge : Bad Type");
return;
void SMESHDS_Command::AddFace(int NewFaceID,
int idnode1, int idnode2, int idnode3)
{
- if (!myType == SMESHDS_AddTriangle)
+ if ( myType != SMESHDS_AddTriangle)
{
MESSAGE("SMESHDS_Command::AddFace : Bad Type");
return;
void SMESHDS_Command::AddFace(int NewFaceID,
int idnode1, int idnode2, int idnode3, int idnode4)
{
- if (!myType == SMESHDS_AddQuadrangle)
+ if ( myType != SMESHDS_AddQuadrangle)
{
MESSAGE("SMESHDS_Command::AddFace : Bad Type");
return;
void SMESHDS_Command::AddVolume(int NewVolID,
int idnode1, int idnode2, int idnode3, int idnode4)
{
- if (!myType == SMESHDS_AddTetrahedron)
+ if ( myType != SMESHDS_AddTetrahedron)
{
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
void SMESHDS_Command::AddVolume(int NewVolID,
int idnode1, int idnode2, int idnode3, int idnode4, int idnode5)
{
- if (!myType == SMESHDS_AddPyramid)
+ if ( myType != SMESHDS_AddPyramid)
{
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
int idnode1,
int idnode2, int idnode3, int idnode4, int idnode5, int idnode6)
{
- if (!myType == SMESHDS_AddPrism)
+ if ( myType != SMESHDS_AddPrism)
{
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
int idnode3,
int idnode4, int idnode5, int idnode6, int idnode7, int idnode8)
{
- if (!myType == SMESHDS_AddHexahedron)
+ if ( myType != SMESHDS_AddHexahedron)
{
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
void SMESHDS_Command::AddPolygonalFace (const int ElementID,
const std::vector<int>& nodes_ids)
{
- if (!myType == SMESHDS_AddPolygon) {
+ if ( myType != SMESHDS_AddPolygon) {
MESSAGE("SMESHDS_Command::AddPolygonalFace : Bad Type");
return;
}
const std::vector<int>& nodes_ids,
const std::vector<int>& quantities)
{
- if (!myType == SMESHDS_AddPolyhedron) {
+ if ( myType != SMESHDS_AddPolyhedron) {
MESSAGE("SMESHDS_Command::AddPolyhedralVolume : Bad Type");
return;
}
//=======================================================================
void SMESHDS_Command::RemoveNode(int NodeID)
{
- if (!myType == SMESHDS_RemoveNode)
+ if ( myType != SMESHDS_RemoveNode)
{
MESSAGE("SMESHDS_Command::RemoveNode : Bad Type");
return;
//=======================================================================
void SMESHDS_Command::RemoveElement(int ElementID)
{
- if (!myType == SMESHDS_RemoveElement)
+ if ( myType != SMESHDS_RemoveElement)
{
MESSAGE("SMESHDS_Command::RemoveElement : Bad Type");
return;
void SMESHDS_Command::ChangeElementNodes(int ElementID, int nodes[], int nbnodes)
{
- if (!myType == SMESHDS_ChangeElementNodes)
+ if ( myType != SMESHDS_ChangeElementNodes)
{
MESSAGE("SMESHDS_Command::ChangeElementNodes : Bad Type");
return;
void SMESHDS_Command::Renumber (const bool isNodes, const int startID, const int deltaID)
{
- if (!myType == SMESHDS_Renumber)
+ if ( myType != SMESHDS_Renumber)
{
MESSAGE("SMESHDS_Command::Renumber : Bad Type");
return;
//=======================================================================
void SMESHDS_Command::AddEdge(int NewEdgeID, int n1, int n2, int n12)
{
- if (!myType == SMESHDS_AddQuadEdge) {
+ if ( myType != SMESHDS_AddQuadEdge) {
MESSAGE("SMESHDS_Command::AddEdge : Bad Type");
return;
}
int n1, int n2, int n3,
int n12, int n23, int n31)
{
- if (!myType == SMESHDS_AddQuadTriangle) {
+ if ( myType != SMESHDS_AddQuadTriangle) {
MESSAGE("SMESHDS_Command::AddFace : Bad Type");
return;
}
int n1, int n2, int n3,
int n12, int n23, int n31, int nCenter)
{
- if (!myType == SMESHDS_AddBiQuadTriangle) {
+ if ( myType != SMESHDS_AddBiQuadTriangle) {
MESSAGE("SMESHDS_Command::AddFace : Bad Type");
return;
}
int n1, int n2, int n3, int n4,
int n12, int n23, int n34, int n41)
{
- if (!myType == SMESHDS_AddQuadQuadrangle) {
+ if ( myType != SMESHDS_AddQuadQuadrangle) {
MESSAGE("SMESHDS_Command::AddFace : Bad Type");
return;
}
int n12, int n23, int n31,
int n14, int n24, int n34)
{
- if (!myType == SMESHDS_AddQuadTetrahedron) {
+ if ( myType != SMESHDS_AddQuadTetrahedron) {
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
}
int n12, int n23, int n34, int n41,
int n15, int n25, int n35, int n45)
{
- if (!myType == SMESHDS_AddQuadPyramid) {
+ if ( myType != SMESHDS_AddQuadPyramid) {
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
}
int n45, int n56, int n64,
int n14, int n25, int n36)
{
- if (!myType == SMESHDS_AddQuadPentahedron) {
+ if ( myType != SMESHDS_AddQuadPentahedron) {
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
}
int n56, int n67, int n78, int n85,
int n15, int n26, int n37, int n48)
{
- if (!myType == SMESHDS_AddQuadHexahedron) {
+ if ( myType != SMESHDS_AddQuadHexahedron) {
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
}
int n1234,int n1256,int n2367,int n3478,
int n1458,int n5678,int nCenter)
{
- if (!myType == SMESHDS_AddQuadHexahedron) {
+ if ( myType != SMESHDS_AddQuadHexahedron) {
MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
return;
}
void SMESHDS_Command::AddBall(int NewBallID, int node, double diameter)
{
- if (!myType == SMESHDS_AddBall)
+ if ( myType != SMESHDS_AddBall)
{
MESSAGE("SMESHDS_Command::SMESHDS_AddBall : Bad Type");
return;
for ( ; aSubShapesIter != aGEOMs.end(); aSubShapesIter++, iSubSh++) {
QString aSubGeomEntry = (*aSubShapesIter);
_PTR(SObject) pSubGeom = studyDS()->FindObjectID(aSubGeomEntry.toLatin1().data());
-
- if( pSubGeom ) {
- SALOMEDS_SObject* sobj = _CAST(SObject,pSubGeom);
- if( sobj ) {
- GEOM::GEOM_Object_var aSubGeomVar =
- GEOM::GEOM_Object::_narrow(sobj->GetObject());
- if( !aSubGeomVar->_is_nil() ){
- aSeq[iSubSh] = aSubGeomVar;
- }
- }
- }
+
+ if( pSubGeom ) {
+ SALOMEDS_SObject* sobj = _CAST(SObject,pSubGeom);
+ if( sobj ) {
+ GEOM::GEOM_Object_var aSubGeomVar =
+ GEOM::GEOM_Object::_narrow(sobj->GetObject());
+ if( !aSubGeomVar->_is_nil() ){
+ aSeq[iSubSh] = aSubGeomVar;
+ }
+ }
+ }
}
} else {
// get geometry by selected sub-mesh
if ( mag > DBL_MIN )
dPi /= mag;
drv[ iP - 1 ] = dPi;
+ // drv[ iP - 1 ] = dPi / 0.001;
}
for ( int iP = 0; iP < 3; iP++ ) {
#if 1
bool hasHint = ( 0 <= theParamsHint.X() && theParamsHint.X() <= 1 &&
0 <= theParamsHint.Y() && theParamsHint.Y() <= 1 &&
- 0 <= theParamsHint.Y() && theParamsHint.Y() <= 1 );
+ 0 <= theParamsHint.Z() && theParamsHint.Z() <= 1 );
if ( !hasHint && !myGridComputed )
{
// define the first guess by thePoint projection on lines
theTag = tag;
}
if ( !theSObject->FindSubObject( theTag, aReferenceSO.inout() ))
- {
aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag );
- // add reference to the use case tree
- // (to support tree representation customization and drag-n-drop)
- SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
- useCaseBuilder->AppendTo( aReferenceSO->GetFather(), aReferenceSO );
- }
+
aStudyBuilder->Addreference( aReferenceSO, aToObjSO );
+
+ // add reference to the use case tree
+ // (to support tree representation customization and drag-n-drop)
+ SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
+ useCaseBuilder->AppendTo( theSObject, aReferenceSO );
}
}
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_MapOfShape.hxx>
#include <TopoDS.hxx>
+#include <TopoDS_Solid.hxx>
#include <gp_Ax2.hxx>
#include <gp_Ax3.hxx>
#include <gp_GTrsf.hxx>
case 3: helper.AddFace(tgtNodes[0], tgtNodes[2], tgtNodes[1]); break;
case 4: helper.AddFace(tgtNodes[0], tgtNodes[3], tgtNodes[2], tgtNodes[1]); break;
}
+ } // loop on all mesh faces on srcFace
+
+ return true;
+ }
+
+ //================================================================================
+ /*!
+ * \brief Preform projection in case of quadrilateral faces
+ */
+ //================================================================================
+
+ bool projectQuads(const TopoDS_Face& tgtFace,
+ const TopoDS_Face& srcFace,
+ const TSideVector& tgtWires,
+ const TSideVector& srcWires,
+ const TAssocTool::TShapeShapeMap& shape2ShapeMap,
+ TAssocTool::TNodeNodeMap& src2tgtNodes,
+ const bool is1DComputed)
+ {
+ SMESH_Mesh * tgtMesh = tgtWires[0]->GetMesh();
+ SMESH_Mesh * srcMesh = srcWires[0]->GetMesh();
+ SMESHDS_Mesh * tgtMeshDS = tgtMesh->GetMeshDS();
+ SMESHDS_Mesh * srcMeshDS = srcMesh->GetMeshDS();
+
+ if ( srcWires[0]->NbEdges() != 4 )
+ return false;
+ if ( !is1DComputed )
+ return false;
+ for ( int iE = 0; iE < 4; ++iE )
+ {
+ SMESHDS_SubMesh* sm = srcMeshDS->MeshElements( srcWires[0]->Edge( iE ));
+ if ( !sm ) return false;
+ if ( sm->NbNodes() + sm->NbElements() == 0 ) return false;
+ }
+ if ( BRepAdaptor_Surface( tgtFace ).GetType() != GeomAbs_Plane )
+ return false;
+ // if ( BRepAdaptor_Surface( tgtFace ).GetType() == GeomAbs_Plane &&
+ // BRepAdaptor_Surface( srcFace ).GetType() == GeomAbs_Plane )
+ // return false; // too easy
+
+ // load EDGEs to SMESH_Block
+
+ SMESH_Block block;
+ TopTools_IndexedMapOfOrientedShape blockSubShapes;
+ {
+ const TopoDS_Solid& box = srcMesh->PseudoShape();
+ TopoDS_Shell shell = TopoDS::Shell( TopExp_Explorer( box, TopAbs_SHELL ).Current() );
+ TopoDS_Vertex v;
+ block.LoadBlockShapes( shell, v, v, blockSubShapes ); // fill all since operator[] is missing
+ }
+ const SMESH_Block::TShapeID srcFaceBID = SMESH_Block::ID_Fxy0;
+ const SMESH_Block::TShapeID tgtFaceBID = SMESH_Block::ID_Fxy1;
+ vector< int > edgeBID;
+ block.GetFaceEdgesIDs( srcFaceBID, edgeBID ); // u0, u1, 0v, 1v
+ blockSubShapes.Substitute( edgeBID[0], srcWires[0]->Edge(0) );
+ blockSubShapes.Substitute( edgeBID[1], srcWires[0]->Edge(2) );
+ blockSubShapes.Substitute( edgeBID[2], srcWires[0]->Edge(3) );
+ blockSubShapes.Substitute( edgeBID[3], srcWires[0]->Edge(1) );
+ block.GetFaceEdgesIDs( tgtFaceBID, edgeBID ); // u0, u1, 0v, 1v
+ blockSubShapes.Substitute( edgeBID[0], tgtWires[0]->Edge(0) );
+ blockSubShapes.Substitute( edgeBID[1], tgtWires[0]->Edge(2) );
+ blockSubShapes.Substitute( edgeBID[2], tgtWires[0]->Edge(3) );
+ blockSubShapes.Substitute( edgeBID[3], tgtWires[0]->Edge(1) );
+ block.LoadFace( srcFace, srcFaceBID, blockSubShapes );
+ block.LoadFace( tgtFace, tgtFaceBID, blockSubShapes );
+
+ // remember connectivity of new faces in terms of ( node-or-XY )
+
+ typedef std::pair< const SMDS_MeshNode*, gp_XYZ > TNodeOrXY; // node-or-XY
+ typedef std::vector< TNodeOrXY* > TFaceConn; // face connectivity
+ std::vector< TFaceConn > newFacesVec; // connectivity of all faces
+ std::map< const SMDS_MeshNode*, TNodeOrXY > srcNode2tgtNXY; // src node -> node-or-XY
+
+ TAssocTool::TNodeNodeMap::iterator srcN_tgtN;
+ std::map< const SMDS_MeshNode*, TNodeOrXY >::iterator srcN_tgtNXY;
+ std::pair< std::map< const SMDS_MeshNode*, TNodeOrXY >::iterator, bool > n2n_isNew;
+ TNodeOrXY nullNXY( 0, gp_XYZ(0,0,0) );
+
+ SMESHDS_SubMesh* srcSubDS = srcMeshDS->MeshElements( srcFace );
+ newFacesVec.resize( srcSubDS->NbElements() );
+ int iFaceSrc = 0;
+
+ SMDS_ElemIteratorPtr elemIt = srcSubDS->GetElements();
+ while ( elemIt->more() ) // loop on all mesh faces on srcFace
+ {
+ const SMDS_MeshElement* elem = elemIt->next();
+ TFaceConn& tgtNodes = newFacesVec[ iFaceSrc++ ];
+
+ const int nbN = elem->NbCornerNodes();
+ tgtNodes.resize( nbN );
+ for ( int i = 0; i < nbN; ++i ) // loop on nodes of the source element
+ {
+ const SMDS_MeshNode* srcNode = elem->GetNode(i);
+ n2n_isNew = srcNode2tgtNXY.insert( make_pair( srcNode, nullNXY ));
+ TNodeOrXY & tgtNodeOrXY = n2n_isNew.first->second;
+ if ( n2n_isNew.second ) // new src node encounters
+ {
+ srcN_tgtN = src2tgtNodes.find( srcNode );
+ if ( srcN_tgtN != src2tgtNodes.end() )
+ {
+ tgtNodeOrXY.first = srcN_tgtN->second; // tgt node exists
+ }
+ else
+ {
+ // find XY of src node withing the quadrilateral srcFace
+ if ( !block.ComputeParameters( SMESH_TNodeXYZ( srcNode ),
+ tgtNodeOrXY.second, srcFaceBID ))
+ return false;
+ }
+ }
+ tgtNodes[ i ] = & tgtNodeOrXY;
+ }
+ }
+
+ // as all XY are computed, create tgt nodes and faces
+
+ SMESH_MesherHelper helper( *tgtMesh );
+ helper.SetSubShape( tgtFace );
+ if ( is1DComputed )
+ helper.IsQuadraticSubMesh( tgtFace );
+ else
+ helper.SetIsQuadratic( srcSubDS->GetElements()->next()->IsQuadratic() );
+ helper.SetElementsOnShape( true );
+ Handle(Geom_Surface) tgtSurface = BRep_Tool::Surface( tgtFace );
+
+ SMESH_MesherHelper srcHelper( *srcMesh );
+ srcHelper.SetSubShape( srcFace );
+
+ vector< const SMDS_MeshNode* > tgtNodes;
+ gp_XY uv;
+
+ for ( size_t iFaceTgt = 0; iFaceTgt < newFacesVec.size(); ++iFaceTgt )
+ {
+ TFaceConn& tgtConn = newFacesVec[ iFaceTgt ];
+ tgtNodes.resize( tgtConn.size() );
+ for ( size_t iN = 0; iN < tgtConn.size(); ++iN )
+ {
+ const SMDS_MeshNode* & tgtN = tgtConn[ iN ]->first;
+ if ( !tgtN ) // create a node
+ {
+ if ( !block.FaceUV( tgtFaceBID, tgtConn[iN]->second, uv ))
+ return false;
+ gp_Pnt p = tgtSurface->Value( uv.X(), uv.Y() );
+ tgtN = helper.AddNode( p.X(), p.Y(), p.Z(), uv.X(), uv.Y() );
+ }
+ tgtNodes[ tgtNodes.size() - iN - 1] = tgtN; // reversed orientation
+ }
+ switch ( tgtNodes.size() )
+ {
+ case 3: helper.AddFace(tgtNodes[0], tgtNodes[1], tgtNodes[2]); break;
+ case 4: helper.AddFace(tgtNodes[0], tgtNodes[1], tgtNodes[2], tgtNodes[3]); break;
+ default:
+ if ( tgtNodes.size() > 4 )
+ helper.AddPolygonalFace( tgtNodes );
+ }
}
return true;
- } // bool projectBy2DSimilarity(...)
+ } // bool projectQuads(...)
//================================================================================
/*!
projDone = projectBy2DSimilarity( tgtFace, srcFace, tgtWires, srcWires,
shape2ShapeMap, _src2tgtNodes, is1DComputed);
}
+ if ( !projDone )
+ {
+ // projection in case of quadrilateral faces
+ // projDone = projectQuads( tgtFace, srcFace, tgtWires, srcWires,
+ // shape2ShapeMap, _src2tgtNodes, is1DComputed);
+ }
helper.SetSubShape( tgtFace );