From 4592fecfcf7f19fbb7650f63c49947e0ac9b108b Mon Sep 17 00:00:00 2001 From: jfa Date: Thu, 16 Jul 2009 13:33:03 +0000 Subject: [PATCH] IMP 0020089: Take into account 0D elements (MED_POINT1) --- doc/salome/gui/SMESH/images/add0delement.png | Bin 0 -> 10523 bytes doc/salome/gui/SMESH/images/add_0delement.png | Bin 0 -> 1014 bytes doc/salome/gui/SMESH/images/image146.png | Bin 30825 -> 18252 bytes .../SMESH/input/adding_nodes_and_elements.doc | 15 +- idl/SMESH_Mesh.idl | 5 + idl/SMESH_MeshEditor.idl | 6 + resources/SalomeApp.xml | 2 + src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx | 15 +- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx | 19 +- src/OBJECT/SMESH_Actor.cxx | 196 +++++++++++---- src/OBJECT/SMESH_Actor.h | 2 +- src/OBJECT/SMESH_ActorDef.h | 5 + src/OBJECT/SMESH_Object.cxx | 42 +++- src/SMDS/Makefile.am | 2 + src/SMDS/SMDSAbs_ElementType.hxx | 1 + src/SMDS/SMDS_ElemIterator.hxx | 10 +- src/SMDS/SMDS_Mesh.cxx | 231 +++++++++++++++--- src/SMDS/SMDS_Mesh.hxx | 126 +++++----- src/SMDS/SMDS_Mesh0DElement.cxx | 155 ++++++++++++ src/SMDS/SMDS_Mesh0DElement.hxx | 61 +++++ src/SMDS/SMDS_MeshInfo.hxx | 39 +-- src/SMESH/SMESH_Mesh.cxx | 12 + src/SMESH/SMESH_Mesh.hxx | 2 + src/SMESHClient/SMESH_Client.cxx | 24 ++ src/SMESHDS/SMESHDS_Command.cxx | 16 ++ src/SMESHDS/SMESHDS_Command.hxx | 1 + src/SMESHDS/SMESHDS_CommandType.hxx | 1 + src/SMESHDS/SMESHDS_Mesh.cxx | 24 ++ src/SMESHDS/SMESHDS_Mesh.hxx | 7 +- src/SMESHDS/SMESHDS_Script.cxx | 13 + src/SMESHDS/SMESHDS_Script.hxx | 1 + src/SMESHGUI/SMESHGUI.cxx | 54 +++- src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx | 61 +++-- src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx | 55 +++-- src/SMESHGUI/SMESHGUI_MeshInfosDlg.h | 2 + src/SMESHGUI/SMESHGUI_Selection.cxx | 12 +- src/SMESHGUI/SMESHGUI_VTKUtils.cxx | 9 + src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx | 2 + src/SMESHGUI/SMESH_images.ts | 4 + src/SMESHGUI/SMESH_msg_en.ts | 48 ++++ src/SMESH_I/SMESH_2smeshpy.cxx | 2 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 62 +++-- src/SMESH_I/SMESH_MeshEditor_i.hxx | 1 + src/SMESH_I/SMESH_Mesh_i.cxx | 11 + src/SMESH_I/SMESH_Mesh_i.hxx | 3 + src/SMESH_SWIG/smeshDC.py | 13 + 46 files changed, 1116 insertions(+), 256 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/add0delement.png create mode 100644 doc/salome/gui/SMESH/images/add_0delement.png create mode 100644 src/SMDS/SMDS_Mesh0DElement.cxx create mode 100644 src/SMDS/SMDS_Mesh0DElement.hxx diff --git a/doc/salome/gui/SMESH/images/add0delement.png b/doc/salome/gui/SMESH/images/add0delement.png new file mode 100644 index 0000000000000000000000000000000000000000..e6578f888240f0654c8c08bf4f29cd1e5869283b GIT binary patch literal 10523 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/add_0delement.png b/doc/salome/gui/SMESH/images/add_0delement.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1075b6881bb4977e7fd571d27be881f18cc416 GIT binary patch literal 1014 zcmeAS@N?(olHy`uVBq!ia0vp^XMuPJ2NRGyZ}{Jbfq{9ir;B4q#hkY{Y=a&<2s8wC ze)60?<+hGy`c<~gOPQul(5=4m`Fk9b-XzX_ukvhsff`}J;q$cA$Z1QzXur6VTlas? zvdqY7mGivq+w%4%xj3b8`DT~gJueoX6LOdKx88NW%<@*nq0Y)}o7^m4&paoz_2Z7`*4{F?Hjlp4 zZaaPP*v9bZH&01Db=Y=JD0@n5<+o>Trl;JVft3Gzw+g6yV$AKxM;VVN{mz-bI5$P` zb53e6pY|4@70g-}fD+PPcRQuZ@~}X7g0jsO9&pysw1KwgdU%>x)-*x1VOLc03QVUd-Gjz0))*;D2@T zVJY3D1t4EM?!6JYXq(65vS}8#l6cDJzb)DloBIVMqrY^s{FO4nxo-=$q&~O%J$13J z^5-`lrn9=wz1!>-zkIX%Qd2A6%QokCpAKndFDX0p-Sm{^KYk0{tH(60l$*|VEZBT` z+WP)W{u%w}&PDFCd-mO5{Z{1XFVFK|nr~6;-RPTm`g;3%W4VXby}!%2AB)VD4UEvU z`WqpZNc+%JsYdO+?;tR>vD8D*XrPKpsH0@J=2dxJe~F4C($=! zhjFXvlB?(DB;{tV2kLdzEnT*u%=Ge1*PC0|tc;IY1(c?9y>?qVS96WAY1uQ8*Z#3{ zC6o8AT58<-b!|;Lm$c(Upx$PUYcmbarZCOb%yC!s-yACx_1I zc!ffbyiLtDnm{r-UW|NSWpZ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/image146.png b/doc/salome/gui/SMESH/images/image146.png index 2fb825cc865d820a61def6629daac7a63d338869..2f2f7120f3890cbb91faad52cd2ae9f87cae5f31 100755 GIT binary patch literal 18252 zcmaL9bzD_#w=RqUA|NH5g0!Txlypi-r+|VW4H8n)CEe29CEXxlAPv$D(wμCc7n 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 V48I8neoGF5w79%jiO4Ij{|}>O3~&Gd literal 30825 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 dE=@
  • \ref adding_nodes_anchor "Nodes"
  • +
  • \ref adding_0delems_anchor "0D Elements"
  • \ref adding_edges_anchor "Edges"
  • \ref adding_triangles_anchor "Triangles"
  • \ref adding_quadrangles_anchor "Quadrangles"
  • @@ -43,6 +44,18 @@ created: \image html add_node.png +
    +\anchor adding_0delems_anchor +

    Adding 0D elements

    + +\image html add0delement.png + +In this dialog box specify the node which will form your 0d element by +selecting it in the 3D viewer and click the \b Apply or +Apply and Close button. Your 0D element will be created: + +\image html add_0delement.png +
    \anchor adding_edges_anchor

    Adding edges

    @@ -137,4 +150,4 @@ button. If you've managed to obtain the necessary result, click the \image html add_polyhedron.png -*/ \ No newline at end of file +*/ diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index fa5180a24..b27bff80d 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -46,6 +46,7 @@ module SMESH enum log_command { ADD_NODE, + ADD_ELEM0D, ADD_EDGE, ADD_TRIANGLE, ADD_QUADRANGLE, @@ -110,6 +111,7 @@ module SMESH { ALL, NODE, + ELEM0D, EDGE, FACE, VOLUME @@ -532,6 +534,9 @@ module SMESH long NbElements() raises (SALOME::SALOME_Exception); + long Nb0DElements() + raises (SALOME::SALOME_Exception); + long NbEdges() raises (SALOME::SALOME_Exception); diff --git a/idl/SMESH_MeshEditor.idl b/idl/SMESH_MeshEditor.idl index 21ea8a5dd..b1b36c257 100644 --- a/idl/SMESH_MeshEditor.idl +++ b/idl/SMESH_MeshEditor.idl @@ -41,6 +41,12 @@ module SMESH long AddNode(in double x, in double y, in double z); + /*! + * Create 0D element on the given node. + * \param IdOfNode Node IDs for creation of element. + */ + long Add0DElement(in long IDOfNode); + /*! * Create edge, either linear and quadratic (this is determed * by number of given nodes). diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index 37f3d3ab1..3dba06efd 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -31,8 +31,10 @@ + + diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index 99f892d14..145a13c93 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -395,6 +395,16 @@ DriverMED_R_SMESHDS_Mesh //MESSAGE("Try to create element # " << iElem << " with id = " // << aCellInfo->GetElemNum(iElem)); switch(aGeom) { + case ePOINT1: + //anElement = FindNode(myMesh,aNodeIds[0]); + if(anIsElemNum) + anElement = myMesh->Add0DElementWithID + (aNodeIds[0], aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->Add0DElement(FindNode(myMesh,aNodeIds[0])); + isRenum = anIsElemNum; + } + break; case eSEG2: if(anIsElemNum) anElement = myMesh->AddEdgeWithID(aNodeIds[0], @@ -680,11 +690,8 @@ DriverMED_R_SMESHDS_Mesh isRenum = anIsElemNum; } break; - - case ePOINT1: - anElement = FindNode(myMesh,aNodeIds[0]); - break; } + #ifndef _DEXCEPT_ }catch(const std::exception& exc){ //INFOS("Follow exception was cought:\n\t"< T0DElementIterator; typedef TypedElemIterator< SMDS_EdgeIteratorPtr > TEdgeIterator; typedef TypedElemIterator< SMDS_FaceIteratorPtr > TFaceIterator; typedef TypedElemIterator< SMDS_VolumeIteratorPtr > TVolumeIterator; @@ -422,10 +424,12 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // Storing SMDS groups and sub-meshes as med families //---------------------------------------------------- int myNodesDefaultFamilyId = 0; + int my0DElementsDefaultFamilyId = 0; int myEdgesDefaultFamilyId = 0; int myFacesDefaultFamilyId = 0; int myVolumesDefaultFamilyId = 0; int nbNodes = myMesh->NbNodes(); + int nb0DElements = myMesh->Nb0DElements(); int nbEdges = myMesh->NbEdges(); int nbFaces = myMesh->NbFaces(); int nbVolumes = myMesh->NbVolumes(); @@ -533,6 +537,13 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() list< TElemTypeData > aTElemTypeDatas; EEntiteMaillage anEntity = eMAILLE; +#ifdef _ELEMENTS_BY_DIM_ + anEntity = eNOEUD_ELEMENT; +#endif + aTElemTypeDatas.push_back(TElemTypeData(anEntity, + ePOINT1, + nbElemInfo.Nb0DElements(), + SMDSAbs_0DElement)); #ifdef _ELEMENTS_BY_DIM_ anEntity = eARETE; #endif @@ -635,6 +646,10 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() PElemIterator elemIterator; int defaultFamilyId = 0; switch ( aElemTypeData->_smdsType ) { + case SMDSAbs_0DElement: + elemIterator = PElemIterator( new T0DElementIterator( myMesh->elements0dIterator() )); + defaultFamilyId = my0DElementsDefaultFamilyId; + break; case SMDSAbs_Edge: elemIterator = PElemIterator( new TEdgeIterator( myMesh->edgesIterator() )); defaultFamilyId = myEdgesDefaultFamilyId; diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 36a44924d..f86a577f1 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -120,17 +120,18 @@ SMESH_ActorDef::SMESH_ActorDef() myControlsPrecision = -1; SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - + if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) myControlsPrecision = mgr->integerValue( "SMESH", "controls_precision", -1); - vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3); - vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1); - + vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3); + vtkFloatingPointType aElem0DSize = SMESH::GetFloat("SMESH:elem0d_size",5); + vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1); + vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; - //Definition 2D and 3D divices of the actor + //Definition 2D and 3D devices of the actor //----------------------------------------- vtkFloatingPointType anRGB[3] = {1,1,1}; mySurfaceProp = vtkProperty::New(); @@ -194,7 +195,7 @@ SMESH_ActorDef::SMESH_ActorDef() aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); - //Definition 1D divice of the actor + //Definition 1D device of the actor //--------------------------------- myEdgeProp = vtkProperty::New(); myEdgeProp->SetAmbient(1.0); @@ -242,8 +243,49 @@ SMESH_ActorDef::SMESH_ActorDef() aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); - //Definition 0D divice of the actor - //--------------------------------- + //Definition 0D device of the actor (0d elements) + //----------------------------------------------- + my0DProp = vtkProperty::New(); + SMESH::GetColor( "SMESH", "elem0d_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 0 ) ); + my0DProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + my0DProp->SetPointSize(aElem0DSize); + + my0DActor = SMESH_DeviceActor::New(); + my0DActor->SetUserMatrix(aMatrix); + my0DActor->SetStoreClippingMapping(true); + my0DActor->PickableOff(); + my0DActor->SetVisibility(false); + my0DActor->SetProperty(my0DProp); + my0DActor->SetRepresentation(SMESH_DeviceActor::eSurface); + aFilter = my0DActor->GetExtractUnstructuredGrid(); + //aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + aFilter->RegisterCellsWithType(VTK_VERTEX); + + //my0DExtProp = vtkProperty::New(); + //my0DExtProp->DeepCopy(my0DProp); + //anRGB[0] = 1 - anRGB[0]; + //anRGB[1] = 1 - anRGB[1]; + //anRGB[2] = 1 - anRGB[2]; + //my0DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + //my0DExtProp->SetPointSize(aElem0DSize); + // + //my0DExtActor = SMESH_DeviceActor::New(); + //my0DExtActor->SetUserMatrix(aMatrix); + //my0DExtActor->SetStoreClippingMapping(true); + //my0DExtActor->PickableOff(); + //my0DExtActor->SetHighlited(true); + //my0DExtActor->SetVisibility(false); + //my0DExtActor->SetProperty(my0DExtProp); + //my0DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe); + //aFilter = my0DExtActor->GetExtractUnstructuredGrid(); + ////aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); + //aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + //aFilter->RegisterCellsWithType(VTK_VERTEX); + + + //Definition 0D device of the actor (nodes) + //----------------------------------------- myNodeProp = vtkProperty::New(); SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) ); myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); @@ -288,23 +330,25 @@ SMESH_ActorDef::SMESH_ActorDef() myBaseActor->GetProperty()->SetOpacity(0.0); myPickableActor = myBaseActor; - + myHighlightProp = vtkProperty::New(); myHighlightProp->SetAmbient(1.0); myHighlightProp->SetDiffuse(0.0); myHighlightProp->SetSpecular(0.0); SMESH::GetColor( "SMESH", "selection_object_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) ); myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myHighlightProp->SetPointSize(aPointSize); + //myHighlightProp->SetPointSize(aPointSize); + myHighlightProp->SetPointSize(std::max(aElem0DSize,aPointSize)); // ?? myHighlightProp->SetRepresentation(1); - + myPreselectProp = vtkProperty::New(); myPreselectProp->SetAmbient(1.0); myPreselectProp->SetDiffuse(0.0); myPreselectProp->SetSpecular(0.0); SMESH::GetColor( "SMESH", "highlight_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 255 ) ); myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myPreselectProp->SetPointSize(aPointSize); + //myPreselectProp->SetPointSize(aPointSize); + myPreselectProp->SetPointSize(std::max(aElem0DSize,aPointSize)); // ?? myPreselectProp->SetRepresentation(1); myHighlitableActor = SMESH_DeviceActor::New(); @@ -461,6 +505,12 @@ SMESH_ActorDef::~SMESH_ActorDef() myNodeProp->Delete(); myNodeExtProp->Delete(); + my0DProp->Delete(); + my0DActor->Delete(); + + //my0DExtProp->Delete(); + //my0DExtActor->Delete(); + my1DProp->Delete(); my1DActor->Delete(); @@ -479,7 +529,7 @@ SMESH_ActorDef::~SMESH_ActorDef() myHighlitableActor->Delete(); - //Deleting of pints numbering pipeline + //Deleting of points numbering pipeline //--------------------------------------- myPointsNumDataSet->Delete(); @@ -621,6 +671,7 @@ SetControlMode(eControl theMode, myControlMode = eNone; theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false ); + my0DActor->GetMapper()->SetScalarVisibility(false); my1DActor->GetMapper()->SetScalarVisibility(false); my2DActor->GetMapper()->SetScalarVisibility(false); my3DActor->GetMapper()->SetScalarVisibility(false); @@ -806,6 +857,9 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ theRenderer->AddActor(my1DActor); theRenderer->AddActor(my1DExtActor); + theRenderer->AddActor(my0DActor); + //theRenderer->AddActor(my0DExtActor); + theRenderer->AddActor(myHighlitableActor); theRenderer->AddActor2D(myScalarBarActor); @@ -827,6 +881,9 @@ void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ theRenderer->RemoveActor(myHighlitableActor); + theRenderer->RemoveActor(my0DActor); + //theRenderer->RemoveActor(my0DExtActor); + theRenderer->RemoveActor(my1DActor); theRenderer->RemoveActor(my1DExtActor); @@ -859,6 +916,9 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, myNodeExtActor->Init(myVisualObj,myImplicitBoolean); + my0DActor->Init(myVisualObj,myImplicitBoolean); + //my0DExtActor->Init(myVisualObj,myImplicitBoolean); + my1DActor->Init(myVisualObj,myImplicitBoolean); my1DExtActor->Init(myVisualObj,myImplicitBoolean); @@ -866,6 +926,9 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, my2DExtActor->Init(myVisualObj,myImplicitBoolean); my3DActor->Init(myVisualObj,myImplicitBoolean); + my0DActor->GetMapper()->SetLookupTable(myLookupTable); + //my0DExtActor->GetMapper()->SetLookupTable(myLookupTable); + my1DActor->GetMapper()->SetLookupTable(myLookupTable); my1DExtActor->GetMapper()->SetLookupTable(myLookupTable); @@ -931,6 +994,9 @@ void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){ myNodeExtActor->SetTransform(theTransform); + my0DActor->SetTransform(theTransform); + //my0DExtActor->SetTransform(theTransform); + my1DActor->SetTransform(theTransform); my1DExtActor->SetTransform(theTransform); @@ -1060,6 +1126,9 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ myNodeExtActor->VisibilityOff(); + my0DActor->VisibilityOff(); + //my0DExtActor->VisibilityOff(); + my1DActor->VisibilityOff(); my1DExtActor->VisibilityOff(); @@ -1102,6 +1171,10 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ myNodeActor->VisibilityOn(); } + if(myEntityMode & e0DElements){ + my0DActor->VisibilityOn(); + } + if(myEntityMode & eEdges){ my1DActor->VisibilityOn(); } @@ -1127,25 +1200,34 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ } -void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ +void SMESH_ActorDef::SetEntityMode(unsigned int theMode) +{ myEntityState = eAllEntity; - if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)){ + if(!myVisualObj->GetNbEntities(SMDSAbs_0DElement)) { + myEntityState &= ~e0DElements; + theMode &= ~e0DElements; + } + + if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)) { myEntityState &= ~eEdges; theMode &= ~eEdges; } - if(!myVisualObj->GetNbEntities(SMDSAbs_Face)){ + if(!myVisualObj->GetNbEntities(SMDSAbs_Face)) { myEntityState &= ~eFaces; theMode &= ~eFaces; } - if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)){ + if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)) { myEntityState &= ~eVolumes; theMode &= ~eVolumes; } - if(!theMode){ + if (!theMode) { + if(myVisualObj->GetNbEntities(SMDSAbs_0DElement)) + theMode |= e0DElements; + if(myVisualObj->GetNbEntities(SMDSAbs_Edge)) theMode |= eEdges; @@ -1168,8 +1250,13 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ aHightFilter->ClearRegisteredCellsWithType(); aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - - if(myEntityMode & eEdges){ + if (myEntityMode & e0DElements) { + if (MYDEBUG) MESSAGE("0D ELEMENTS"); + aFilter->RegisterCellsWithType(VTK_VERTEX); + aHightFilter->RegisterCellsWithType(VTK_VERTEX); + } + + if (myEntityMode & eEdges) { if (MYDEBUG) MESSAGE("EDGES"); aFilter->RegisterCellsWithType(VTK_LINE); aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); @@ -1178,7 +1265,7 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); } - if(myEntityMode & eFaces){ + if (myEntityMode & eFaces) { if (MYDEBUG) MESSAGE("FACES"); aFilter->RegisterCellsWithType(VTK_TRIANGLE); aFilter->RegisterCellsWithType(VTK_POLYGON); @@ -1193,7 +1280,7 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); } - if(myEntityMode & eVolumes){ + if (myEntityMode & eVolumes) { if (MYDEBUG) MESSAGE("VOLUMES"); aFilter->RegisterCellsWithType(VTK_TETRA); aFilter->RegisterCellsWithType(VTK_VOXEL); @@ -1220,37 +1307,39 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ SetVisibility(GetVisibility(),false); } -void SMESH_ActorDef::SetRepresentation(int theMode){ +void SMESH_ActorDef::SetRepresentation (int theMode) +{ int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); - if(theMode < 0){ + + if (theMode < 0) { myRepresentation = eSurface; - if(!aNbFaces && !aNbVolumes && aNbEdges){ + if (!aNbFaces && !aNbVolumes && aNbEdges) { myRepresentation = eEdge; - }else if(!aNbFaces && !aNbVolumes && !aNbEdges){ + } else if (!aNbFaces && !aNbVolumes && !aNbEdges) { myRepresentation = ePoint; } - }else{ - switch(theMode){ + } else { + switch (theMode) { case eEdge: - if(!aNbFaces && !aNbVolumes && !aNbEdges) return; + if (!aNbFaces && !aNbVolumes && !aNbEdges) return; break; case eSurface: - if(!aNbFaces && !aNbVolumes) return; + if (!aNbFaces && !aNbVolumes) return; break; } myRepresentation = theMode; } - if(!GetUnstructuredGrid()->GetNumberOfCells()) + if (!GetUnstructuredGrid()->GetNumberOfCells()) myRepresentation = ePoint; - if(myIsShrunk){ - if(myRepresentation == ePoint){ + if (myIsShrunk) { + if (myRepresentation == ePoint) { UnShrink(); myIsShrunk = true; - }else{ + } else { SetShrink(); } } @@ -1261,7 +1350,7 @@ void SMESH_ActorDef::SetRepresentation(int theMode){ vtkProperty *aProp = NULL, *aBackProp = NULL; SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1); SMESH_Actor::EQuadratic2DRepresentation aQuadraticMode = GetQuadratic2DRepresentation(); - switch(myRepresentation){ + switch (myRepresentation) { case ePoint: myPickableActor = myNodeActor; myNodeActor->SetVisibility(true); @@ -1278,7 +1367,7 @@ void SMESH_ActorDef::SetRepresentation(int theMode){ aBackProp = myBackSurfaceProp; aReperesent = SMESH_DeviceActor::eSurface; break; - } + } my2DActor->SetProperty(aProp); my2DActor->SetBackfaceProperty(aBackProp); @@ -1295,9 +1384,16 @@ void SMESH_ActorDef::SetRepresentation(int theMode){ my3DActor->SetBackfaceProperty(aBackProp); my3DActor->SetRepresentation(aReperesent); + //my0DExtActor->SetVisibility(false); my1DExtActor->SetVisibility(false); my2DExtActor->SetVisibility(false); + // ??? + //my0DActor->SetProperty(aProp); + //my0DActor->SetBackfaceProperty(aBackProp); + my0DActor->SetRepresentation(aReperesent); + //my0DExtActor->SetRepresentation(aReperesent); + switch(myControlMode){ case eLength: case eMultiConnection: @@ -1311,14 +1407,13 @@ void SMESH_ActorDef::SetRepresentation(int theMode){ my1DActor->SetQuadraticArcMode(false); else if(aQuadraticMode == SMESH_Actor::eArcs) my1DActor->SetQuadraticArcMode(true); - - + my1DActor->SetProperty(aProp); my1DActor->SetBackfaceProperty(aBackProp); my1DActor->SetRepresentation(aReperesent); my1DExtActor->SetRepresentation(aReperesent); - + if(myIsPointsVisible) myPickableActor = myNodeActor; if(GetPointRepresentation()) @@ -1567,8 +1662,12 @@ void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){ void SMESH_ActorDef::SetNodeSize(vtkFloatingPointType theVal){ myNodeProp->SetPointSize(theVal); myNodeExtProp->SetPointSize(theVal); - myHighlightProp->SetPointSize(theVal); - myPreselectProp->SetPointSize(theVal); + + vtkFloatingPointType aPointSize = my0DProp->GetPointSize() > theVal ? my0DProp->GetPointSize() : theVal; + //myHighlightProp->SetPointSize(theVal); + myHighlightProp->SetPointSize(aPointSize); // ?? + //myPreselectProp->SetPointSize(theVal); + myPreselectProp->SetPointSize(aPointSize); // ?? my1DProp->SetPointSize(theVal + aPointSizeInc); my1DExtProp->SetPointSize(theVal + aPointSizeInc); @@ -1593,27 +1692,28 @@ IsImplicitFunctionUsed() const } void -SMESH_ActorDef:: -SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) +SMESH_ActorDef::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) { myNodeActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); myBaseActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - + myHighlitableActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); myNodeExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - + + my0DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + //my0DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + my1DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); my1DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - + my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); my2DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); } vtkIdType -SMESH_ActorDef:: -AddClippingPlane(vtkPlane* thePlane) +SMESH_ActorDef::AddClippingPlane(vtkPlane* thePlane) { if(thePlane){ myImplicitBoolean->GetFunction()->AddItem(thePlane); diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h index 111b55c16..99005dcf1 100644 --- a/src/OBJECT/SMESH_Actor.h +++ b/src/OBJECT/SMESH_Actor.h @@ -74,7 +74,7 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor enum EReperesent { ePoint, eEdge, eSurface}; - enum EEntityMode { eEdges = 0x01, eFaces = 0x02, eVolumes = 0x04, eAllEntity = 0x07}; + enum EEntityMode { e0DElements = 0x01, eEdges = 0x02, eFaces = 0x04, eVolumes = 0x08, eAllEntity = 0x0f}; enum EQuadratic2DRepresentation { eLines = 0x01, eArcs = 0x02 }; diff --git a/src/OBJECT/SMESH_ActorDef.h b/src/OBJECT/SMESH_ActorDef.h index 1dbb7435c..dbbe0a5bb 100644 --- a/src/OBJECT/SMESH_ActorDef.h +++ b/src/OBJECT/SMESH_ActorDef.h @@ -233,6 +233,11 @@ class SMESH_ActorDef : public SMESH_Actor vtkProperty* my1DExtProp; SMESH_DeviceActor* my1DExtActor; + vtkProperty* my0DProp; + SMESH_DeviceActor* my0DActor; + vtkProperty* my0DExtProp; + SMESH_DeviceActor* my0DExtActor; + unsigned int myEntityMode; unsigned int myEntityState; bool myIsPointsVisible; diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index c286fcc7e..5f12330ef 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -86,6 +86,9 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, { switch( theType ) { + case SMDSAbs_0DElement: + return VTK_VERTEX; + case SMDSAbs_Edge: if( theNbNodes == 2 ) return VTK_LINE; else if ( theNbNodes == 3 ) return VTK_QUADRATIC_EDGE; @@ -295,22 +298,23 @@ void SMESH_VisualObjDef::buildElemPrs() // Calculate cells size - static SMDSAbs_ElementType aTypes[ 3 ] = { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume }; + static SMDSAbs_ElementType aTypes[ 4 ] = + { SMDSAbs_0DElement, SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume }; // get entity data map nbEnts; map anEnts; - for ( int i = 0; i <= 2; i++ ) + for ( int i = 0; i <= 3; i++ ) nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] ); // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead, // so check remaining memory size for safety SMDS_Mesh::CheckMemory(); // PAL16631 - vtkIdType aCellsSize = 3 * nbEnts[ SMDSAbs_Edge ]; + vtkIdType aCellsSize = 2 * nbEnts[ SMDSAbs_0DElement ] + 3 * nbEnts[ SMDSAbs_Edge ]; - for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes + for ( int i = 2; i <= 3; i++ ) // iterate through faces and volumes { if ( nbEnts[ aTypes[ i ] ] ) { @@ -321,22 +325,23 @@ void SMESH_VisualObjDef::buildElemPrs() } } - vtkIdType aNbCells = nbEnts[ SMDSAbs_Edge ] + nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ]; + vtkIdType aNbCells = nbEnts[ SMDSAbs_0DElement ] + nbEnts[ SMDSAbs_Edge ] + + nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ]; if ( MYDEBUG ) MESSAGE( "Update - aNbCells = "<more()) MESSAGE(it0d->next()); +} + //======================================================================= //function : DumpEdges //purpose : @@ -1750,6 +1866,7 @@ void SMDS_Mesh::DebugStats() const MESSAGE("Debug stats of mesh : "); MESSAGE("===== NODES ====="<more()) myNodeIDFactory->ReleaseID(itn->next()->GetID()); } + SetOfNodes::Iterator itn(myNodes); for (; itn.More(); itn.Next()) delete itn.Value(); + SetOf0DElements::Iterator it0d (my0DElements); + for (; it0d.More(); it0d.Next()) + { + SMDS_MeshElement* elem = it0d.Value(); + delete elem; + } + SetOfEdges::Iterator ite(myEdges); for (; ite.More(); ite.Next()) { @@ -1883,7 +2016,6 @@ SMDS_Mesh::~SMDS_Mesh() SMDS_MeshElement* elem = itv.Value(); delete elem; } - } //================================================================================ @@ -1921,6 +2053,11 @@ void SMDS_Mesh::Clear() delete ite->next(); myEdges.Clear(); + SMDS_0DElementIteratorPtr it0d = elements0dIterator(); + while (it0d->more()) + delete it0d->next(); + my0DElements.Clear(); + SMDS_NodeIteratorPtr itn = nodesIterator(); while (itn->more()) delete itn->next(); @@ -2048,6 +2185,17 @@ struct MYNCollection_Map_Iterator: public FATHER } }; +/////////////////////////////////////////////////////////////////////////////// +///Return an iterator on 0D elements of the current mesh. +/////////////////////////////////////////////////////////////////////////////// + +SMDS_0DElementIteratorPtr SMDS_Mesh::elements0dIterator() const +{ + typedef MYNCollection_Map_Iterator + < SetOf0DElements, const SMDS_Mesh0DElement*, SMDS_0DElementIterator > TIterator; + return SMDS_0DElementIteratorPtr(new TIterator(my0DElements)); +} + /////////////////////////////////////////////////////////////////////////////// ///Return an iterator on edges of the current mesh. /////////////////////////////////////////////////////////////////////////////// @@ -2095,6 +2243,8 @@ SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator(SMDSAbs_ElementType type) const return SMDS_ElemIteratorPtr (new MYNCollection_Map_Iterator< SetOfFaces >(myFaces)); case SMDSAbs_Edge: return SMDS_ElemIteratorPtr (new MYNCollection_Map_Iterator< SetOfEdges >(myEdges)); + case SMDSAbs_0DElement: + return SMDS_ElemIteratorPtr (new MYNCollection_Map_Iterator< SetOf0DElements >(my0DElements)); case SMDSAbs_Node: return myNodeIDFactory->elementsIterator(); default:; @@ -2184,16 +2334,20 @@ static set * getExclusiveNodes( ///@param element The element were to search matching children ///@param nodes The nodes that the children must have to be selected /////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren, - const SMDS_MeshElement * element, set& nodes) +void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren, + const SMDS_MeshElement * element, + set& nodes) { - - switch(element->GetType()) - { - case SMDSAbs_Node: - MESSAGE("Internal Error: This should not append"); - break; - case SMDSAbs_Edge: + switch(element->GetType()) + { + case SMDSAbs_Node: + MESSAGE("Internal Error: This should not happend"); + break; + case SMDSAbs_0DElement: + { + } + break; + case SMDSAbs_Edge: { SMDS_ElemIteratorPtr itn=element->nodesIterator(); while(itn->more()) @@ -2206,7 +2360,7 @@ void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren } } } break; - case SMDSAbs_Face: + case SMDSAbs_Face: { SMDS_ElemIteratorPtr itn=element->nodesIterator(); while(itn->more()) @@ -2225,7 +2379,7 @@ void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren addChildrenWithNodes(setOfChildren, ite->next(), nodes); } } break; - case SMDSAbs_Volume: + case SMDSAbs_Volume: { if(hasConstructionFaces()) { @@ -2240,7 +2394,7 @@ void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren addChildrenWithNodes(setOfChildren, ite->next(), nodes); } } - } + } } /////////////////////////////////////////////////////////////////////////////// @@ -2248,7 +2402,7 @@ void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren ///@param removenodes if true remaining nodes will be removed /////////////////////////////////////////////////////////////////////////////// void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, - const bool removenodes) + const bool removenodes) { list removedElems; list removedNodes; @@ -2268,8 +2422,9 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, { // get finite elements built on elem set * s1; - if (!hasConstructionEdges() && elem->GetType() == SMDSAbs_Edge || - !hasConstructionFaces() && elem->GetType() == SMDSAbs_Face || + if (elem->GetType() == SMDSAbs_0DElement || + elem->GetType() == SMDSAbs_Edge && !hasConstructionEdges() || + elem->GetType() == SMDSAbs_Face && !hasConstructionFaces() || elem->GetType() == SMDSAbs_Volume) { s1 = new set(); @@ -2319,6 +2474,12 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, case SMDSAbs_Node: MESSAGE("Internal Error: This should not happen"); break; + case SMDSAbs_0DElement: + my0DElements.Remove(static_cast + (const_cast(*it))); + //myInfo.Remove0DElement(*it); + myInfo.remove(*it); + break; case SMDSAbs_Edge: myEdges.Remove(static_cast (const_cast(*it))); @@ -2395,6 +2556,12 @@ void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem) // in meshes without descendants elements are always free switch (aType) { + case SMDSAbs_0DElement: + my0DElements.Remove(static_cast + (const_cast(elem))); + //myInfo.Remove0DElement(elem); + myInfo.remove(elem); + break; case SMDSAbs_Edge: myEdges.Remove(static_cast (const_cast(elem))); @@ -2430,6 +2597,10 @@ bool SMDS_Mesh::Contains (const SMDS_MeshElement* elem) const while (itn->more()) if (elem == itn->next()) return true; + SMDS_0DElementIteratorPtr it0d = elements0dIterator(); + while (it0d->more()) + if (elem == it0d->next()) + return true; SMDS_EdgeIteratorPtr ite = edgesIterator(); while (ite->more()) if (elem == ite->next()) diff --git a/src/SMDS/SMDS_Mesh.hxx b/src/SMDS/SMDS_Mesh.hxx index ab76e9b9c..df4a2b356 100644 --- a/src/SMDS/SMDS_Mesh.hxx +++ b/src/SMDS/SMDS_Mesh.hxx @@ -22,13 +22,14 @@ // SMESH SMDS : implementaion of Salome mesh data structure // File : SMDS_Mesh.hxx // Module : SMESH -// + #ifndef _SMDS_Mesh_HeaderFile #define _SMDS_Mesh_HeaderFile #include "SMESH_SMDS.hxx" #include "SMDS_MeshNode.hxx" +#include "SMDS_Mesh0DElement.hxx" #include "SMDS_MeshEdge.hxx" #include "SMDS_MeshFace.hxx" #include "SMDS_MeshVolume.hxx" @@ -43,34 +44,39 @@ class SMDS_EXPORT SMDS_Mesh:public SMDS_MeshObject{ public: - + SMDS_Mesh(); - + SMDS_NodeIteratorPtr nodesIterator() const; + SMDS_0DElementIteratorPtr elements0dIterator() const; SMDS_EdgeIteratorPtr edgesIterator() const; SMDS_FaceIteratorPtr facesIterator() const; SMDS_VolumeIteratorPtr volumesIterator() const; - SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const; - + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const; + SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const; SMDS_Mesh *AddSubMesh(); - + virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); virtual SMDS_MeshNode* AddNode(double x, double y, double z); - + + virtual SMDS_Mesh0DElement* Add0DElementWithID(int n, int ID); + virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * n, int ID); + virtual SMDS_Mesh0DElement* Add0DElement (const SMDS_MeshNode * n); + virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, + const SMDS_MeshNode * n2, int ID); virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2); - + // 2d order edge with 3 nodes: n12 - node between n1 and n2 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID); virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n12, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n12, int ID); virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -79,23 +85,23 @@ public: virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, + const SMDS_MeshNode * n3, int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3); - + virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, + const SMDS_MeshNode * n4, int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, const SMDS_MeshNode * n4); - + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, const SMDS_MeshEdge * e2, const SMDS_MeshEdge * e3, int ID); @@ -117,10 +123,10 @@ public: int n12,int n23,int n31, int ID); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, + const SMDS_MeshNode * n3, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, + const SMDS_MeshNode * n31, int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -135,11 +141,11 @@ public: virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, + const SMDS_MeshNode * n4, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, + const SMDS_MeshNode * n41, int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -154,27 +160,27 @@ public: virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, + const SMDS_MeshNode * n4, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, const SMDS_MeshNode * n4); - + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID); virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, + const SMDS_MeshNode * n5, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, const SMDS_MeshNode * n4, const SMDS_MeshNode * n5); - + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID); virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, @@ -182,7 +188,7 @@ public: const SMDS_MeshNode * n3, const SMDS_MeshNode * n4, const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, + const SMDS_MeshNode * n6, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -190,7 +196,7 @@ public: const SMDS_MeshNode * n4, const SMDS_MeshNode * n5, const SMDS_MeshNode * n6); - + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID); virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, @@ -200,7 +206,7 @@ public: const SMDS_MeshNode * n5, const SMDS_MeshNode * n6, const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, + const SMDS_MeshNode * n8, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -251,13 +257,13 @@ public: virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, + const SMDS_MeshNode * n4, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n31, - const SMDS_MeshNode * n14, + const SMDS_MeshNode * n14, const SMDS_MeshNode * n24, - const SMDS_MeshNode * n34, + const SMDS_MeshNode * n34, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -266,7 +272,7 @@ public: const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n31, - const SMDS_MeshNode * n14, + const SMDS_MeshNode * n14, const SMDS_MeshNode * n24, const SMDS_MeshNode * n34); @@ -279,15 +285,15 @@ public: const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, + const SMDS_MeshNode * n5, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, + const SMDS_MeshNode * n41, const SMDS_MeshNode * n15, const SMDS_MeshNode * n25, const SMDS_MeshNode * n35, - const SMDS_MeshNode * n45, + const SMDS_MeshNode * n45, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -297,7 +303,7 @@ public: const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, + const SMDS_MeshNode * n41, const SMDS_MeshNode * n15, const SMDS_MeshNode * n25, const SMDS_MeshNode * n35, @@ -315,29 +321,29 @@ public: const SMDS_MeshNode * n3, const SMDS_MeshNode * n4, const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, + const SMDS_MeshNode * n6, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, + const SMDS_MeshNode * n31, const SMDS_MeshNode * n45, const SMDS_MeshNode * n56, - const SMDS_MeshNode * n64, + const SMDS_MeshNode * n64, const SMDS_MeshNode * n14, const SMDS_MeshNode * n25, - const SMDS_MeshNode * n36, + const SMDS_MeshNode * n36, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, const SMDS_MeshNode * n4, const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, + const SMDS_MeshNode * n6, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, + const SMDS_MeshNode * n31, const SMDS_MeshNode * n45, const SMDS_MeshNode * n56, - const SMDS_MeshNode * n64, + const SMDS_MeshNode * n64, const SMDS_MeshNode * n14, const SMDS_MeshNode * n25, const SMDS_MeshNode * n36); @@ -356,19 +362,19 @@ public: const SMDS_MeshNode * n5, const SMDS_MeshNode * n6, const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, + const SMDS_MeshNode * n8, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, + const SMDS_MeshNode * n41, const SMDS_MeshNode * n56, const SMDS_MeshNode * n67, const SMDS_MeshNode * n78, - const SMDS_MeshNode * n85, + const SMDS_MeshNode * n85, const SMDS_MeshNode * n15, const SMDS_MeshNode * n26, const SMDS_MeshNode * n37, - const SMDS_MeshNode * n48, + const SMDS_MeshNode * n48, int ID); virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, @@ -377,15 +383,15 @@ public: const SMDS_MeshNode * n5, const SMDS_MeshNode * n6, const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, + const SMDS_MeshNode * n8, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, + const SMDS_MeshNode * n41, const SMDS_MeshNode * n56, const SMDS_MeshNode * n67, const SMDS_MeshNode * n78, - const SMDS_MeshNode * n85, + const SMDS_MeshNode * n85, const SMDS_MeshNode * n15, const SMDS_MeshNode * n26, const SMDS_MeshNode * n37, @@ -419,6 +425,7 @@ public: const bool removenodes = false); virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false); virtual void RemoveNode(const SMDS_MeshNode * node); + virtual void Remove0DElement(const SMDS_Mesh0DElement * elem0d); virtual void RemoveEdge(const SMDS_MeshEdge * edge); virtual void RemoveFace(const SMDS_MeshFace * face); virtual void RemoveVolume(const SMDS_MeshVolume * volume); @@ -430,7 +437,7 @@ public: virtual void RemoveFreeElement(const SMDS_MeshElement * elem); virtual void Clear(); - + virtual bool RemoveFromParent(); virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh); @@ -445,6 +452,7 @@ public: // Renumber all nodes or elements. const SMDS_MeshNode *FindNode(int idnode) const; + const SMDS_Mesh0DElement* Find0DElement(int idnode) const; const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const; const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2, int idnode3) const; const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const; @@ -454,6 +462,7 @@ public: const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4, int idnode5, int idnode6, int idnode7, int idnode8) const; const SMDS_MeshElement *FindElement(int IDelem) const; + static const SMDS_Mesh0DElement* Find0DElement(const SMDS_MeshNode * n); static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2); static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1, @@ -499,11 +508,13 @@ public: const SMDS_MeshInfo& GetMeshInfo() const { return myInfo; } int NbNodes() const; + int Nb0DElements() const; int NbEdges() const; int NbFaces() const; int NbVolumes() const; int NbSubMesh() const; void DumpNodes() const; + void Dump0DElements() const; void DumpEdges() const; void DumpFaces() const; void DumpVolumes() const; @@ -527,6 +538,7 @@ public: bool Contains (const SMDS_MeshElement* elem) const; typedef NCollection_Map SetOfNodes; + typedef NCollection_Map SetOf0DElements; typedef NCollection_Map SetOfEdges; typedef NCollection_Map SetOfFaces; typedef NCollection_Map SetOfVolumes; @@ -534,13 +546,14 @@ public: private: SMDS_Mesh(SMDS_Mesh * parent); - SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, + SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2, const SMDS_MeshNode * node3); SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3, const SMDS_MeshNode * node4); + SMDS_Mesh0DElement* Find0DElementOrCreate(const SMDS_MeshNode * n); SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2); SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, @@ -553,13 +566,14 @@ private: bool registerElement(int ID, SMDS_MeshElement * element); - void addChildrenWithNodes(std::set& setOfChildren, - const SMDS_MeshElement * element, + void addChildrenWithNodes(std::set& setOfChildren, + const SMDS_MeshElement * element, std::set& nodes); // Fields PRIVATE - + SetOfNodes myNodes; + SetOf0DElements my0DElements; SetOfEdges myEdges; SetOfFaces myFaces; SetOfVolumes myVolumes; diff --git a/src/SMDS/SMDS_Mesh0DElement.cxx b/src/SMDS/SMDS_Mesh0DElement.cxx new file mode 100644 index 000000000..b4fbe8bc4 --- /dev/null +++ b/src/SMDS/SMDS_Mesh0DElement.cxx @@ -0,0 +1,155 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// SMESH SMDS : implementaion of Salome mesh data structure +// File : SMDS_Mesh0DElement.cxx +// Author : Jean-Michel BOULCOURT +// Module : SMESH + +#ifdef _MSC_VER +#pragma warning(disable:4786) +#endif + +#include "SMDS_Mesh0DElement.hxx" +#include "SMDS_IteratorOfElements.hxx" +#include "SMDS_MeshNode.hxx" + +using namespace std; + +//======================================================================= +//function : SMDS_Mesh0DElement +//purpose : +//======================================================================= +SMDS_Mesh0DElement::SMDS_Mesh0DElement (const SMDS_MeshNode * node) +{ + myNode = node; +} + +//======================================================================= +//function : Print +//purpose : +//======================================================================= +void SMDS_Mesh0DElement::Print (ostream & OS) const +{ + OS << "0D Element <" << GetID() << "> : (" << myNode << ") " << endl; +} + +//======================================================================= +//function : NbNodes +//purpose : +//======================================================================= +int SMDS_Mesh0DElement::NbNodes() const +{ + return 1; +} + +//======================================================================= +//function : NbEdges +//purpose : +//======================================================================= +int SMDS_Mesh0DElement::NbEdges() const +{ + return 0; +} + +//======================================================================= +//function : GetType +//purpose : +//======================================================================= +SMDSAbs_ElementType SMDS_Mesh0DElement::GetType() const +{ + return SMDSAbs_0DElement; +} + +//======================================================================= +//function : elementsIterator +//purpose : +//======================================================================= +class SMDS_Mesh0DElement_MyNodeIterator: public SMDS_ElemIterator +{ + const SMDS_MeshNode * myNode; + int myIndex; + public: + SMDS_Mesh0DElement_MyNodeIterator(const SMDS_MeshNode * node): + myNode(node),myIndex(0) {} + + bool more() + { + return myIndex < 1; + } + + const SMDS_MeshElement* next() + { + myIndex++; + if (myIndex == 1) + return myNode; + return NULL; + } +}; + +SMDS_ElemIteratorPtr SMDS_Mesh0DElement::elementsIterator (SMDSAbs_ElementType type) const +{ + switch(type) + { + case SMDSAbs_0DElement: + return SMDS_MeshElement::elementsIterator(SMDSAbs_0DElement); + case SMDSAbs_Node: + return SMDS_ElemIteratorPtr(new SMDS_Mesh0DElement_MyNodeIterator(myNode)); + default: + return SMDS_ElemIteratorPtr + (new SMDS_IteratorOfElements + (this,type, SMDS_ElemIteratorPtr(new SMDS_Mesh0DElement_MyNodeIterator(myNode)))); + } +} + +//======================================================================= +//function : operator< +//purpose : +//======================================================================= +bool operator< (const SMDS_Mesh0DElement & e1, const SMDS_Mesh0DElement & e2) +{ + int id1 = e1.myNode->GetID(); + int id2 = e2.myNode->GetID(); + + return (id1 < id2); +} + +/*! + * \brief Return node by its index + * \param ind - node index + * \retval const SMDS_MeshNode* - the node + */ +const SMDS_MeshNode* SMDS_Mesh0DElement::GetNode(const int ind) const +{ + if (ind == 0) + return myNode; + return NULL; +} + +//======================================================================= +//function : ChangeNode +//purpose : +//======================================================================= +bool SMDS_Mesh0DElement::ChangeNode (const SMDS_MeshNode * node) +{ + myNode = node; + return true; +} diff --git a/src/SMDS/SMDS_Mesh0DElement.hxx b/src/SMDS/SMDS_Mesh0DElement.hxx new file mode 100644 index 000000000..93a204934 --- /dev/null +++ b/src/SMDS/SMDS_Mesh0DElement.hxx @@ -0,0 +1,61 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// SMESH SMDS : implementaion of Salome mesh data structure +// File : SMDS_Mesh0DElement.hxx +// Module : SMESH + +#ifndef _SMDS_Mesh0DElement_HeaderFile +#define _SMDS_Mesh0DElement_HeaderFile + +#include "SMESH_SMDS.hxx" + +#include "SMDS_MeshElement.hxx" + +#include + +class SMDS_EXPORT SMDS_Mesh0DElement: public SMDS_MeshElement +{ + public: + SMDS_Mesh0DElement (const SMDS_MeshNode * node); + bool ChangeNode (const SMDS_MeshNode * node); + void Print (std::ostream & OS) const; + + SMDSAbs_ElementType GetType() const; + int NbNodes() const; + int NbEdges() const; + friend bool operator< (const SMDS_Mesh0DElement& e1, const SMDS_Mesh0DElement& e2); + + /*! + * \brief Return node by its index + * \param ind - node index + * \retval const SMDS_MeshNode* - the node + */ + virtual const SMDS_MeshNode* GetNode (const int ind) const; + + protected: + SMDS_ElemIteratorPtr elementsIterator (SMDSAbs_ElementType type) const; + + protected: + const SMDS_MeshNode* myNode; +}; + +#endif diff --git a/src/SMDS/SMDS_MeshInfo.hxx b/src/SMDS/SMDS_MeshInfo.hxx index 91613bb5d..222782488 100644 --- a/src/SMDS/SMDS_MeshInfo.hxx +++ b/src/SMDS/SMDS_MeshInfo.hxx @@ -42,6 +42,7 @@ public: int NbNodes() const { return myNbNodes; } inline int NbElements(SMDSAbs_ElementType type=SMDSAbs_All) const; + int Nb0DElements() const { return myNb0DElements; } inline int NbEdges (SMDSAbs_ElementOrder order = ORDER_ANY) const; inline int NbFaces (SMDSAbs_ElementOrder order = ORDER_ANY) const; inline int NbTriangles (SMDSAbs_ElementOrder order = ORDER_ANY) const; @@ -69,6 +70,7 @@ private: int myNbNodes; + int myNb0DElements; int myNbEdges , myNbQuadEdges ; int myNbTriangles , myNbQuadTriangles ; int myNbQuadrangles, myNbQuadQuadrangles; @@ -86,6 +88,7 @@ private: inline SMDS_MeshInfo::SMDS_MeshInfo(): myNbNodes(0), + myNb0DElements(0), myNbEdges (0), myNbQuadEdges (0), myNbTriangles (0), myNbQuadTriangles (0), myNbQuadrangles(0), myNbQuadQuadrangles(0), @@ -97,30 +100,30 @@ inline SMDS_MeshInfo::SMDS_MeshInfo(): myNbPolyhedrons(0) { // Number of nodes in standard element types - // n v f e - // o o a d + // n v f e 0 + // o o a d d // d l c g // e e e - // ----------- - // 1 + // -------------- + // 1 * // 2 * // 3 * // 4 * * * - // 5 * + // 5 * // 6 * * - // 7 + // 7 // 8 * * - // 9 - // 10 * - // 11 - // 12 - // 13 * - // 14 - // 15 * - // 16 - // 17 - // 18 - // 19 + // 9 + // 10 * + // 11 + // 12 + // 13 * + // 14 + // 15 * + // 16 + // 17 + // 18 + // 19 // 20 * // // So to have a unique index for each type basing on nb of nodes, we use a shift: @@ -131,6 +134,8 @@ inline SMDS_MeshInfo::SMDS_MeshInfo(): myNb.resize( index( SMDSAbs_Volume,20 ) + 1, NULL); myNb[ index( SMDSAbs_Node,1 )] = & myNbNodes; + myNb[ index( SMDSAbs_0DElement,1 )] = & myNb0DElements; + myNb[ index( SMDSAbs_Edge,2 )] = & myNbEdges; myNb[ index( SMDSAbs_Edge,4 )] = & myNbQuadEdges; diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 88bb601e0..bba940ee6 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1192,6 +1192,18 @@ int SMESH_Mesh::NbNodes() throw(SALOME_Exception) */ //================================================================================ +int SMESH_Mesh::Nb0DElements() throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + return _myMeshDS->GetMeshInfo().Nb0DElements(); +} + +//================================================================================ +/*! + * \brief Return number of edges of given order in the mesh + */ +//================================================================================ + int SMESH_Mesh::NbEdges(SMDSAbs_ElementOrder order) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 0ece936c2..284bf89a7 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -202,6 +202,8 @@ public: int NbNodes() throw(SALOME_Exception); + int Nb0DElements() throw(SALOME_Exception); + int NbEdges(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception); int NbFaces(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception); diff --git a/src/SMESHClient/SMESH_Client.cxx b/src/SMESHClient/SMESH_Client.cxx index af83fe041..e62753123 100644 --- a/src/SMESHClient/SMESH_Client.cxx +++ b/src/SMESHClient/SMESH_Client.cxx @@ -103,6 +103,28 @@ namespace } + //======================================================================= + //function : Add0DElementsWithID + //======================================================================= + inline void Add0DElementsWithID(SMDS_Mesh* theMesh, + SMESH::log_array_var& theSeq, + CORBA::Long theId) + { + const SMESH::long_array& anIndexes = theSeq[theId].indexes; + CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number; + if (2*aNbElems != anIndexes.length()) + EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != aCoords.length()"); + CORBA::Long anIndexId = 0; + for (; anElemId < aNbElems; anElemId++, anIndexId+=2) + { + SMDS_MeshElement* anElem = theMesh->Add0DElementWithID(anIndexes[anIndexId+1], + anIndexes[anIndexId]); + if (!anElem) + EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot Add0DElementWithID for ID = "<NbNodes() = "<NbNodes()); + MESSAGE("Update - mySMDSMesh->Nb0DElements() = "<Nb0DElements()); MESSAGE("Update - mySMDSMesh->NbEdges() = "<NbEdges()); MESSAGE("Update - mySMDSMesh->NbFaces() = "<NbFaces()); MESSAGE("Update - mySMDSMesh->NbVolumes() = "<NbVolumes()); diff --git a/src/SMESHDS/SMESHDS_Command.cxx b/src/SMESHDS/SMESHDS_Command.cxx index be0e5e632..ab46ee27b 100644 --- a/src/SMESHDS/SMESHDS_Command.cxx +++ b/src/SMESHDS/SMESHDS_Command.cxx @@ -84,6 +84,22 @@ void SMESHDS_Command::MoveNode(int NodeID, double x, double y, double z) myNumber++; } +//======================================================================= +//function : +//purpose : +//======================================================================= +void SMESHDS_Command::Add0DElement(int New0DElementID, int idnode) +{ + if (!myType == SMESHDS_Add0DElement) + { + MESSAGE("SMESHDS_Command::Add0DElement : Bad Type"); + return; + } + myIntegers.push_back(New0DElementID); + myIntegers.push_back(idnode); + myNumber++; +} + //======================================================================= //function : //purpose : diff --git a/src/SMESHDS/SMESHDS_Command.hxx b/src/SMESHDS/SMESHDS_Command.hxx index 09d720b9a..d425a054a 100644 --- a/src/SMESHDS/SMESHDS_Command.hxx +++ b/src/SMESHDS/SMESHDS_Command.hxx @@ -38,6 +38,7 @@ class SMESHDS_EXPORT SMESHDS_Command public: SMESHDS_Command(const SMESHDS_CommandType aType); void AddNode(int NewNodeID, double x, double y, double z); + void Add0DElement(int New0DElementID, int idnode); void AddEdge(int NewEdgeID, int idnode1, int idnode2); void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3); void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3, diff --git a/src/SMESHDS/SMESHDS_CommandType.hxx b/src/SMESHDS/SMESHDS_CommandType.hxx index bafaba863..a033961bc 100644 --- a/src/SMESHDS/SMESHDS_CommandType.hxx +++ b/src/SMESHDS/SMESHDS_CommandType.hxx @@ -30,6 +30,7 @@ enum SMESHDS_CommandType { SMESHDS_AddNode, + SMESHDS_Add0DElement, SMESHDS_AddEdge, SMESHDS_AddTriangle, SMESHDS_AddQuadrangle, diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index 63ebf3dba..ff27ae915 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -248,6 +248,30 @@ void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int de myScript->Renumber( isNodes, startID, deltaID ); } +//======================================================================= +//function : Add0DElement +//purpose : +//======================================================================= +SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID(int nodeID, int ID) +{ + SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElementWithID(nodeID, ID); + if (anElem) myScript->Add0DElement(ID, nodeID); + return anElem; +} + +SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID + (const SMDS_MeshNode * node, int ID) +{ + return Add0DElementWithID(node->GetID(), ID); +} + +SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElement(const SMDS_MeshNode * node) +{ + SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElement(node); + if (anElem) myScript->Add0DElement(anElem->GetID(), node->GetID()); + return anElem; +} + //======================================================================= //function :AddEdgeWithID //purpose : diff --git a/src/SMESHDS/SMESHDS_Mesh.hxx b/src/SMESHDS/SMESHDS_Mesh.hxx index d3df2e688..4c1398fef 100644 --- a/src/SMESHDS/SMESHDS_Mesh.hxx +++ b/src/SMESHDS/SMESHDS_Mesh.hxx @@ -30,6 +30,7 @@ #include "SMDS_Mesh.hxx" #include "SMDS_MeshNode.hxx" +#include "SMDS_Mesh0DElement.hxx" #include "SMDS_MeshEdge.hxx" #include "SMDS_MeshFace.hxx" #include "SMDS_MeshVolume.hxx" @@ -66,7 +67,11 @@ public: bool RemoveHypothesis(const TopoDS_Shape & S, const SMESHDS_Hypothesis * H); virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); - virtual SMDS_MeshNode * AddNode(double x, double y, double z); + virtual SMDS_MeshNode* AddNode(double x, double y, double z); + + virtual SMDS_Mesh0DElement* Add0DElementWithID(int nodeID, int ID); + virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * node, int ID); + virtual SMDS_Mesh0DElement* Add0DElement (const SMDS_MeshNode * node); virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, diff --git a/src/SMESHDS/SMESHDS_Script.cxx b/src/SMESHDS/SMESHDS_Script.cxx index 9b6daa8b1..3d379c4b0 100644 --- a/src/SMESHDS/SMESHDS_Script.cxx +++ b/src/SMESHDS/SMESHDS_Script.cxx @@ -95,6 +95,19 @@ void SMESHDS_Script::AddNode(int NewNodeID, double x, double y, double z) getCommand(SMESHDS_AddNode)->AddNode(NewNodeID, x, y, z); } +//======================================================================= +//function : +//purpose : +//======================================================================= +void SMESHDS_Script::Add0DElement (int New0DElementID, int idnode) +{ + if (myIsEmbeddedMode) { + myIsModified = true; + return; + } + getCommand(SMESHDS_Add0DElement)->Add0DElement(New0DElementID, idnode); +} + //======================================================================= //function : //purpose : diff --git a/src/SMESHDS/SMESHDS_Script.hxx b/src/SMESHDS/SMESHDS_Script.hxx index 808066bc3..9e01fc01c 100644 --- a/src/SMESHDS/SMESHDS_Script.hxx +++ b/src/SMESHDS/SMESHDS_Script.hxx @@ -44,6 +44,7 @@ class SMESHDS_EXPORT SMESHDS_Script bool IsModified(); void AddNode(int NewNodeID, double x, double y, double z); + void Add0DElement(int New0DElementID, int idnode); void AddEdge(int NewEdgeID, int idnode1, int idnode2); void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3); void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3, diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 8904fb435..4561074f7 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -508,6 +508,9 @@ if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ unsigned int aMode = anActor->GetEntityMode(); switch(theCommandID){ + case 216: + InverseEntityMode(aMode,SMESH_Actor::e0DElements); + break; case 217: InverseEntityMode(aMode,SMESH_Actor::eEdges); break; @@ -1467,6 +1470,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; // Display Entity + case 216: // 0D elements case 217: // Edges case 218: // Faces case 219: // Volumes @@ -1571,7 +1575,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 400: // NODES + case 4000: // NODES { if(checkLock(aStudy)) break; @@ -2192,7 +2196,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 401: // GEOM::EDGE + case 4009: // ELEM0D + case 4010: // GEOM::EDGE case 4021: // TRIANGLE case 4022: // QUAD case 4023: // POLYGON @@ -2205,6 +2210,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SMDSAbs_ElementType type = SMDSAbs_Edge; int nbNodes = 2; switch (theCommandID) { + case 4009: // ELEM0D + type = SMDSAbs_0DElement; nbNodes = 1; break; case 4021: // TRIANGLE type = SMDSAbs_Face; nbNodes = 3; break; case 4022: // QUAD @@ -2729,8 +2736,9 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 6018, "LENGTH_2D", "ICON_LENGTH_2D", 0, true ); createSMESHAction( 6019, "CONNECTION_2D", "ICON_CONNECTION_2D", 0, true ); createSMESHAction( 6009, "VOLUME_3D", "ICON_VOLUME_3D", 0, true ); - createSMESHAction( 400, "NODE", "ICON_DLG_NODE" ); - createSMESHAction( 401, "EDGE", "ICON_DLG_EDGE" ); + createSMESHAction( 4000, "NODE", "ICON_DLG_NODE" ); + createSMESHAction( 4009, "ELEM0D", "ICON_DLG_ELEM0D" ); + createSMESHAction( 4010, "EDGE", "ICON_DLG_EDGE" ); createSMESHAction( 4021, "TRIANGLE", "ICON_DLG_TRIANGLE" ); createSMESHAction( 4022, "QUAD", "ICON_DLG_QUADRANGLE" ); createSMESHAction( 4023, "POLYGON", "ICON_DLG_POLYGON" ); @@ -2767,6 +2775,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 213, "SHRINK", "ICON_SHRINK", 0, true ); createSMESHAction( 214, "UPDATE", "ICON_UPDATE" ); createSMESHAction( 215, "NODES", "ICON_POINTS", 0, true ); + createSMESHAction( 216, "ELEMS0D", "ICON_DLG_ELEM0D", 0, true ); createSMESHAction( 217, "EDGES", "ICON_DLG_EDGE", 0, true ); createSMESHAction( 218, "FACES", "ICON_DLG_TRIANGLE", 0, true ); createSMESHAction( 219, "VOLUMES", "ICON_DLG_TETRAS", 0, true ); @@ -2883,8 +2892,9 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( 6021, ctrlId, -1 ); createMenu( separator(), ctrlId, -1 ); - createMenu( 400, addId, -1 ); - createMenu( 401, addId, -1 ); + createMenu( 4000, addId, -1 ); + createMenu( 4009, addId, -1 ); + createMenu( 4010, addId, -1 ); createMenu( 4021, addId, -1 ); createMenu( 4022, addId, -1 ); createMenu( 4023, addId, -1 ); @@ -2977,8 +2987,9 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( 6021, ctrlTb ); createTool( separator(), ctrlTb ); - createTool( 400, addRemTb ); - createTool( 401, addRemTb ); + createTool( 4000, addRemTb ); + createTool( 4009, addRemTb ); + createTool( 4010, addRemTb ); createTool( 4021, addRemTb ); createTool( 4022, addRemTb ); createTool( 4023, addRemTb ); @@ -3111,6 +3122,7 @@ void SMESHGUI::initialize( CAM_Application* app ) hasNodes("(numberOfNodes > 0 )"),//&& isVisible)"), hasElems("(count( elemTypes ) > 0)"), hasDifferentElems("(count( elemTypes ) > 1)"), + hasElems0d("({'Elem0d'} in elemTypes)"), hasEdges("({'Edge'} in elemTypes)"), hasFaces("({'Face'} in elemTypes)"), hasVolumes("({'Volume'} in elemTypes)"); @@ -3169,6 +3181,10 @@ void SMESHGUI::initialize( CAM_Application* app ) anId = popupMgr()->insert( tr( "MEN_DISP_ENT" ), -1, -1 ); + popupMgr()->insert( action(216), anId, -1 ); // ELEMS 0D + popupMgr()->setRule(action(216), aDiffElemsInVTK + "&& isVisible &&" + hasElems0d, QtxPopupMgr::VisibleRule); + popupMgr()->setRule(action(216), "{'Elem0d'} in entityMode", QtxPopupMgr::ToggleRule); + popupMgr()->insert( action( 217 ), anId, -1 ); // EDGES popupMgr()->setRule( action( 217 ), aDiffElemsInVTK + "&& isVisible &&" + hasEdges, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 217 ), "{'Edge'} in entityMode", QtxPopupMgr::ToggleRule ); @@ -3580,17 +3596,29 @@ void SMESHGUI::createPreferences() int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab ); setPreferenceProperty( elemGroup, "columns", 2 ); - addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::Color, "SMESH", "fill_color" ); - addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" ); + addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::Color, "SMESH", "fill_color" ); + addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" ); addPreference( tr( "PREF_BACKFACE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "backface_color" ); + addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" ); + + //int sp = addPreference( "", elemGroup, LightApp_Preferences::Space ); + //setPreferenceProperty( sp, "hstretch", 0 ); + //setPreferenceProperty( sp, "vstretch", 0 ); + + int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup, + LightApp_Preferences::IntSpin, "SMESH", "elem0d_size"); int sp = addPreference( "", elemGroup, LightApp_Preferences::Space ); + int elemW = addPreference(tr("PREF_WIDTH"), elemGroup, + LightApp_Preferences::IntSpin, "SMESH", "element_width"); + int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup, + LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff"); + + setPreferenceProperty( size0d, "min", 1 ); + setPreferenceProperty( size0d, "max", 10 ); setPreferenceProperty( sp, "hstretch", 0 ); setPreferenceProperty( sp, "vstretch", 0 ); - int elemW = addPreference( tr( "PREF_WIDTH" ), elemGroup, LightApp_Preferences::IntSpin, "SMESH", "element_width" ); - int shrink = addPreference( tr( "PREF_SHRINK_COEFF" ), elemGroup, LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff" ); - setPreferenceProperty( elemW, "min", 1 ); setPreferenceProperty( elemW, "max", 5 ); diff --git a/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx index 97e393a24..fd617e809 100644 --- a/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx @@ -22,8 +22,8 @@ // SMESH SMESHGUI : GUI for SMESH component // File : SMESHGUI_AddMeshElementDlg.cxx // Author : Nicolas REJNERI, Open CASCADE S.A.S. + // SMESH includes -// #include "SMESHGUI_AddMeshElementDlg.h" #include "SMESHGUI.h" @@ -236,7 +236,7 @@ namespace SMESH // purpose : constructor //================================================================================= SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule, - SMDSAbs_ElementType ElementType, + SMDSAbs_ElementType ElementType, int nbNodes ) : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), @@ -255,6 +255,10 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule, myNbNodes = nbNodes; myElementType = ElementType; switch (ElementType) { + case SMDSAbs_0DElement: + if (myNbNodes != 1) + myNbNodes = 1; + break; case SMDSAbs_Face: // if (myNbNodes != 3 && myNbNodes != 4) // myNbNodes = 3; @@ -269,7 +273,11 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule, } QString elemName; - if (myNbNodes == 2) { + if (myNbNodes == 1) { + elemName = "ELEM0D"; + myHelpFileName = "adding_nodes_and_elements_page.html#adding_0delems_anchor"; + } + else if (myNbNodes == 2) { elemName = "EDGE"; myHelpFileName = "adding_nodes_and_elements_page.html#adding_edges_anchor"; } @@ -277,7 +285,7 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule, elemName = "TRIANGLE"; myHelpFileName = "adding_nodes_and_elements_page.html#adding_triangles_anchor"; } - else if (myNbNodes == 4) + else if (myNbNodes == 4) { if (myElementType == SMDSAbs_Face) { elemName = "QUADRANGLE"; myHelpFileName = "adding_nodes_and_elements_page.html#adding_quadrangles_anchor"; @@ -286,6 +294,7 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule, elemName = "TETRAS"; myHelpFileName = "adding_nodes_and_elements_page.html#adding_tetrahedrons_anchor"; } + } else if (myNbNodes == 8) { elemName = "HEXAS"; myHelpFileName = "adding_nodes_and_elements_page.html#adding_hexahedrons_anchor"; @@ -298,7 +307,7 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule, else if (myElementType == SMDSAbs_Volume) { myHelpFileName = "adding_nodes_and_elements_page.html#adding_polyhedrons_anchor"; } - + QString iconName = tr(QString("ICON_DLG_%1").arg(elemName).toLatin1().data()); QString buttonGrTitle = tr(QString("SMESH_%1").arg(elemName).toLatin1().data()); QString caption = tr(QString("SMESH_ADD_%1_TITLE").arg(elemName).toLatin1().data()); @@ -439,30 +448,31 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply() { if (myNbOkNodes && !mySMESHGUI->isActiveStudyLocked()) { myBusy = true; - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(myNbNodes); + SMESH::long_array_var anArrayOfIndices = new SMESH::long_array; + anArrayOfIndices->length(myNbNodes); bool reverse = (Reverse && Reverse->isChecked()); QStringList aListId = myEditCurrentArgument->text().split(" ", QString::SkipEmptyParts); for (int i = 0; i < aListId.count(); i++) if (reverse) - anArrayOfIdeces[i] = aListId[ myNbNodes - i - 1 ].toInt(); + anArrayOfIndices[i] = aListId[ myNbNodes - i - 1 ].toInt(); else - anArrayOfIdeces[i] = aListId[ i ].toInt(); + anArrayOfIndices[i] = aListId[ i ].toInt(); SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); switch (myElementType) { + case SMDSAbs_0DElement: + aMeshEditor->Add0DElement(anArrayOfIndices[0]); break; case SMDSAbs_Edge: - aMeshEditor->AddEdge(anArrayOfIdeces.inout()); break; - case SMDSAbs_Face:{ + aMeshEditor->AddEdge(anArrayOfIndices.inout()); break; + case SMDSAbs_Face: { if(myIsPoly) - aMeshEditor->AddPolygonalFace(anArrayOfIdeces.inout()); + aMeshEditor->AddPolygonalFace(anArrayOfIndices.inout()); else - aMeshEditor->AddFace(anArrayOfIdeces.inout()); + aMeshEditor->AddFace(anArrayOfIndices.inout()); break; - } case SMDSAbs_Volume: - aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break; + aMeshEditor->AddVolume(anArrayOfIndices.inout()); break; default:; } @@ -515,8 +525,9 @@ void SMESHGUI_AddMeshElementDlg::ClickOnCancel() void SMESHGUI_AddMeshElementDlg::ClickOnHelp() { LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); - if (app) - app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); + if (app) + app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), + myHelpFileName); else { QString platform; #ifdef WIN32 @@ -526,7 +537,7 @@ void SMESHGUI_AddMeshElementDlg::ClickOnHelp() #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", + arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)). arg(myHelpFileName)); } @@ -555,7 +566,7 @@ void SMESHGUI_AddMeshElementDlg::onTextChange (const QString& theNewText) if (aMesh) { TColStd_MapOfInteger newIndices; - + QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); bool allOk = true; for (int i = 0; i < aListId.count(); i++) { @@ -567,13 +578,13 @@ void SMESHGUI_AddMeshElementDlg::onTextChange (const QString& theNewText) else allOk = false; } - + mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false ); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->highlight( myActor->getIO(), true, true ); - + myNbOkNodes = ( allOk && myNbNodes == aListId.count() ); - + if (myIsPoly) { if ( !allOk || myElementType != SMDSAbs_Face || aListId.count() < 3 ) @@ -582,13 +593,13 @@ void SMESHGUI_AddMeshElementDlg::onTextChange (const QString& theNewText) myNbOkNodes = aListId.count(); } } - + if(myNbOkNodes) { buttonOk->setEnabled(true); buttonApply->setEnabled(true); displaySimulation(); } - + myBusy = false; } @@ -795,7 +806,7 @@ void SMESHGUI_AddMeshElementDlg::keyPressEvent( QKeyEvent* e ) QDialog::keyPressEvent( e ); if ( e->isAccepted() ) return; - + if ( e->key() == Qt::Key_F1 ) { e->accept(); ClickOnHelp(); diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx index 005183023..c8c3072d3 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx @@ -126,8 +126,15 @@ SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg(SMESHGUI* theModule): // --> nodes QLabel* myMeshNbNodesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_NODES")), myMeshWidget); - myMeshNbNodes = new QLabel(myMeshWidget); + myMeshNbNodes = new QLabel(myMeshWidget); myMeshNbNodes->setMinimumWidth(100); + QFrame* line12 = new QFrame(myMeshWidget); + line12->setFrameStyle(QFrame::HLine | QFrame::Sunken); + + // --> 0D elements + QLabel* myMeshNb0DElemsLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_0DELEMS")), myMeshWidget); + myMeshNb0DElems = new QLabel(myMeshWidget); + myMeshNb0DElems->setMinimumWidth(100); // --> header with orders QLabel* myMeshOrder0Lab = new QLabel(tr("SMESH_MESHINFO_ORDER0"), myMeshWidget); @@ -290,16 +297,19 @@ SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg(SMESHGUI* theModule): aMeshLayout->addWidget(line1, 1, 0, 1, 2); aMeshLayout->addWidget(myMeshNbNodesLab, 2, 0); aMeshLayout->addWidget(myMeshNbNodes, 2, 1); - aMeshLayout->addWidget(myMeshOrder0Lab, 3, 1); - aMeshLayout->addWidget(myMeshOrder1Lab, 3, 2); - aMeshLayout->addWidget(myMeshOrder2Lab, 3, 3); - aMeshLayout->addWidget(myMeshNbEdgesLab, 4, 0); - aMeshLayout->addWidget(myMeshNbEdges, 4, 1); - aMeshLayout->addWidget(myMeshNbEdges1, 4, 2); - aMeshLayout->addWidget(myMeshNbEdges2, 4, 3); - aMeshLayout->addWidget(myMeshFacesGroup, 5, 0, 1, 4); - aMeshLayout->addWidget(myMeshVolumesGroup, 6, 0, 1, 4); - aMeshLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 7, 0); + aMeshLayout->addWidget(line12, 3, 0, 1, 2); + aMeshLayout->addWidget(myMeshNb0DElemsLab, 4, 0); + aMeshLayout->addWidget(myMeshNb0DElems, 4, 1); + aMeshLayout->addWidget(myMeshOrder0Lab, 5, 1); + aMeshLayout->addWidget(myMeshOrder1Lab, 5, 2); + aMeshLayout->addWidget(myMeshOrder2Lab, 5, 3); + aMeshLayout->addWidget(myMeshNbEdgesLab, 6, 0); + aMeshLayout->addWidget(myMeshNbEdges, 6, 1); + aMeshLayout->addWidget(myMeshNbEdges1, 6, 2); + aMeshLayout->addWidget(myMeshNbEdges2, 6, 3); + aMeshLayout->addWidget(myMeshFacesGroup, 7, 0, 1, 4); + aMeshLayout->addWidget(myMeshVolumesGroup, 8, 0, 1, 4); + aMeshLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 9, 0); // submesh mySubMeshWidget = new QWidget(myWGStack); @@ -331,6 +341,11 @@ SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg(SMESHGUI* theModule): mySubMeshNbElements->setMinimumWidth(100); mySubMeshNbElements->setFont(fnt); + // --> 0D elements + QLabel* mySubMeshNb0DElemsLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_0DELEMS")), mySubMeshElementsGroup); + mySubMeshNb0DElems = new QLabel(mySubMeshElementsGroup); + mySubMeshNb0DElems->setMinimumWidth(100); + // --> elements --> edges QLabel* mySubMeshNbEdgesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_EDGES")), mySubMeshElementsGroup); mySubMeshNbEdges = new QLabel(mySubMeshElementsGroup); @@ -348,12 +363,14 @@ SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg(SMESHGUI* theModule): mySubMeshElementsGroupLayout->addWidget(mySubMeshNbElementsLab, 0, 0); mySubMeshElementsGroupLayout->addWidget(mySubMeshNbElements, 0, 1); - mySubMeshElementsGroupLayout->addWidget(mySubMeshNbEdgesLab, 1, 0); - mySubMeshElementsGroupLayout->addWidget(mySubMeshNbEdges, 1, 1); - mySubMeshElementsGroupLayout->addWidget(mySubMeshNbFacesLab, 2, 0); - mySubMeshElementsGroupLayout->addWidget(mySubMeshNbFaces, 2, 1); - mySubMeshElementsGroupLayout->addWidget(mySubMeshNbVolumesLab, 3, 0); - mySubMeshElementsGroupLayout->addWidget(mySubMeshNbVolumes, 3, 1); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNb0DElemsLab, 1, 0); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNb0DElems, 1, 1); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNbEdgesLab, 2, 0); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNbEdges, 2, 1); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNbFacesLab, 3, 0); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNbFaces, 3, 1); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNbVolumesLab, 4, 0); + mySubMeshElementsGroupLayout->addWidget(mySubMeshNbVolumes, 4, 1); aSubMeshLayout->addWidget(mySubMeshNameLab, 0, 0); aSubMeshLayout->addWidget(mySubMeshName, 0, 1); @@ -466,6 +483,7 @@ void SMESHGUI_MeshInfosDlg::DumpMeshInfos() setWindowTitle(tr("SMESH_MESHINFO_TITLE") + " [" + tr("SMESH_OBJECT_MESH") + "]"); myMeshName->setText(aSO->GetName().c_str()); myMeshNbNodes->setNum((int)aMesh->NbNodes()); + myMeshNb0DElems->setNum((int)aMesh->Nb0DElements()); myMeshNbEdges->setNum((int)aMesh->NbEdges()); myMeshNbEdges1->setNum((int)aMesh->NbEdgesOfOrder(SMESH::ORDER_LINEAR)); myMeshNbEdges2->setNum((int)aMesh->NbEdgesOfOrder(SMESH::ORDER_QUADRATIC)); @@ -504,6 +522,7 @@ void SMESHGUI_MeshInfosDlg::DumpMeshInfos() mySubMeshName->setText(aSO->GetName().c_str()); mySubMeshNbNodes->setNum((int)aSubMesh->GetNumberOfNodes(true)); mySubMeshNbElements->setNum((int)aSubMesh->GetNumberOfElements()); + mySubMeshNb0DElems->setNum((int)(aSubMesh->GetElementsByType(SMESH::ELEM0D)->length())); mySubMeshNbEdges->setNum((int)(aSubMesh->GetElementsByType(SMESH::EDGE)->length())); mySubMeshNbFaces->setNum((int)(aSubMesh->GetElementsByType(SMESH::FACE)->length())); mySubMeshNbVolumes->setNum((int)(aSubMesh->GetElementsByType(SMESH::VOLUME)->length())); @@ -519,6 +538,8 @@ void SMESHGUI_MeshInfosDlg::DumpMeshInfos() switch (aType) { case SMESH::NODE: strType = "SMESH_MESHINFO_NODES"; break; + case SMESH::ELEM0D: + strType = "SMESH_MESHINFO_0DELEMS"; break; case SMESH::EDGE: strType = "SMESH_MESHINFO_EDGES"; break; case SMESH::FACE: diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h index b2b84c9e6..c05a2c39a 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h +++ b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h @@ -75,6 +75,7 @@ private: QWidget* myMeshWidget; QLabel* myMeshName; QLabel* myMeshNbNodes; + QLabel* myMeshNb0DElems; QLabel* myMeshNbEdges; QLabel* myMeshNbEdges1; QLabel* myMeshNbEdges2; @@ -112,6 +113,7 @@ private: QLabel* mySubMeshNbNodes; QGroupBox* mySubMeshElementsGroup; QLabel* mySubMeshNbElements; + QLabel* mySubMeshNb0DElems; QLabel* mySubMeshNbEdges; QLabel* mySubMeshNbFaces; QLabel* mySubMeshNbVolumes; diff --git a/src/SMESHGUI/SMESHGUI_Selection.cxx b/src/SMESHGUI/SMESHGUI_Selection.cxx index d3b80a7c4..ba08f5570 100644 --- a/src/SMESHGUI/SMESHGUI_Selection.cxx +++ b/src/SMESHGUI/SMESHGUI_Selection.cxx @@ -142,7 +142,7 @@ SMESH_Actor* SMESHGUI_Selection::getActor( int ind ) const //======================================================================= //function : elemTypes -//purpose : may return {'Edge' 'Face' 'Volume'} at most +//purpose : may return {'Elem0d' 'Edge' 'Face' 'Volume'} at most //======================================================================= QList SMESHGUI_Selection::elemTypes( int ind ) const @@ -152,6 +152,7 @@ QList SMESHGUI_Selection::elemTypes( int ind ) const if ( actor ) { TVisualObjPtr object = actor->GetObject(); if ( object ) { + if ( object->GetNbEntities( SMDSAbs_0DElement )) types.append( "Elem0d" ); if ( object->GetNbEntities( SMDSAbs_Edge )) types.append( "Edge" ); if ( object->GetNbEntities( SMDSAbs_Face )) types.append( "Face" ); if ( object->GetNbEntities( SMDSAbs_Volume )) types.append( "Volume" ); @@ -231,7 +232,7 @@ QString SMESHGUI_Selection::shrinkMode( int ind ) const //======================================================================= //function : entityMode -//purpose : may return {'Edge' 'Face' 'Volume'} at most +//purpose : may return {'Elem0d' 'Edge' 'Face' 'Volume'} at most //======================================================================= QList SMESHGUI_Selection::entityMode( int ind ) const @@ -240,9 +241,10 @@ QList SMESHGUI_Selection::entityMode( int ind ) const SMESH_Actor* actor = getActor( ind ); if ( actor ) { unsigned int aMode = actor->GetEntityMode(); - if ( aMode & SMESH_Actor::eVolumes) types.append( "Volume"); - if ( aMode & SMESH_Actor::eFaces ) types.append( "Face" ); - if ( aMode & SMESH_Actor::eEdges ) types.append( "Edge" ); + if ( aMode & SMESH_Actor::eVolumes ) types.append( "Volume" ); + if ( aMode & SMESH_Actor::eFaces ) types.append( "Face" ); + if ( aMode & SMESH_Actor::eEdges ) types.append( "Edge" ); + if ( aMode & SMESH_Actor::e0DElements ) types.append( "Elem0d" ); } return types; } diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index 9289f0108..f4c7e00ae 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -810,6 +810,15 @@ namespace SMESH int SW = mgr->integerValue( "SMESH", "selection_width", 5 ), PW = mgr->integerValue( "SMESH", "highlight_width", 5 ); + // adjust highlight_width to the width of mesh entities + int aPointSize = mgr->integerValue("SMESH", "node_size", 3); + int aElem0DSize = mgr->integerValue("SMESH", "elem0d_size", 5); + int aLineWidth = mgr->integerValue("SMESH", "element_width", 1); + int maxSize = aPointSize; + if (aElem0DSize > maxSize) maxSize = aElem0DSize; + if (aLineWidth > maxSize) maxSize = aLineWidth; + if (PW < maxSize + 2) PW = maxSize + 2; + double SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ), SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 ), SP3 = mgr->doubleValue( "SMESH", "selection_precision_object", 0.025 ); diff --git a/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx b/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx index 1af954d48..57830cefb 100755 --- a/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx @@ -443,6 +443,8 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument() if(e->GetType() == SMDSAbs_Node) { anInfo+=tr("MESH_NODE")+"
    "; //const SMDS_MeshNode *en = (SMDS_MeshNode*) e; // VSR: not used! + } else if (e->GetType() == SMDSAbs_0DElement) { + anInfo+=tr("SMESH_ELEM0D")+"
    "; } else if(e->GetType() == SMDSAbs_Edge) { anInfo+=tr("SMESH_EDGE")+"
    "; anInfo+="" + tr("SMESH_MESHINFO_TYPE")+": "; diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts index 0319ce689..c2569ba1a 100644 --- a/src/SMESHGUI/SMESH_images.ts +++ b/src/SMESHGUI/SMESH_images.ts @@ -109,6 +109,10 @@ ICON_DLG_BUILD_COMPOUND_MESH mesh_build_compound.png + + ICON_DLG_ELEM0D + mesh_vertex.png + ICON_DLG_EDGE mesh_line.png diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index edde69cc3..ab6fe272b 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -261,6 +261,14 @@ MEN_DISP_ENT Display Entity + + MEN_ELEM0D + 0D Element + + + MEN_ELEMS0D + 0D Elements + MEN_EDGE Edge @@ -739,6 +747,14 @@ Please enter correct values and try again SMESH_ADD_ALGORITHM_TITLE Algorithms Assignation + + SMESH_ADD_ELEM0D + Add 0D Element + + + SMESH_ADD_ELEM0D_TITLE + Add 0D Element + SMESH_ADD_EDGE Add Edge @@ -1063,6 +1079,10 @@ so that the application may crash. Do you wish to continue visualization?SMESH_DZ dZ + + SMESH_ELEM0D + 0D Element + SMESH_EDGE Edge @@ -1404,6 +1424,10 @@ Are you sure want to export to MED 2.1 ? SMESH_MESH Mesh + + SMESH_MESHINFO_0DELEMS + 0D Elements + SMESH_MESHINFO_ALL_TYPES Heterogenous @@ -2071,6 +2095,14 @@ Consider saving your work before application crash STB_DISP_ENT Display entity + + STB_ELEM0D + 0D Element + + + STB_ELEMS0D + 0D Elements + STB_EDGE Edge @@ -2557,6 +2589,14 @@ Consider saving your work before application crash TOP_DISP_ENT Display entity + + TOP_ELEM0D + 0D Element + + + TOP_ELEMS0D + 0D Elements + TOP_EDGE Edge @@ -3127,6 +3167,14 @@ Please, create VTK viewer and try again PREF_TITLE_COLOR Title color + + PREF_COLOR_0D + 0D elements + + + PREF_SIZE_0D + Size of 0D elements + PREF_WIDTH Width diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 82264dd10..077766762 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -1066,7 +1066,7 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) static TStringSet sameMethods; if ( sameMethods.empty() ) { const char * names[] = { - "RemoveElements","RemoveNodes","AddNode","AddEdge","AddFace","AddPolygonalFace", + "RemoveElements","RemoveNodes","AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace", "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces","MoveNode", "MoveClosestNodeToPoint", "InverseDiag","DeleteDiag","Reorient","ReorientObject","TriToQuad","SplitQuad","SplitQuadObject", "BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject", diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 0463ee5d2..428aacbc9 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -26,6 +26,7 @@ #include "SMESH_MeshEditor_i.hxx" +#include "SMDS_Mesh0DElement.hxx" #include "SMDS_MeshEdge.hxx" #include "SMDS_MeshFace.hxx" #include "SMDS_MeshVolume.hxx" @@ -319,6 +320,47 @@ CORBA::Boolean SMESH_MeshEditor_i::RemoveNodes(const SMESH::long_array & IDsOfNo */ //============================================================================= +CORBA::Long SMESH_MeshEditor_i::AddNode(CORBA::Double x, + CORBA::Double y, CORBA::Double z) +{ + initData(); + + const SMDS_MeshNode* N = GetMeshDS()->AddNode(x, y, z); + + // Update Python script + TPythonDump() << "nodeID = " << this << ".AddNode( " + << x << ", " << y << ", " << z << " )"; + + return N->GetID(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= +CORBA::Long SMESH_MeshEditor_i::Add0DElement(CORBA::Long IDOfNode) +{ + initData(); + + const SMDS_MeshNode* aNode = GetMeshDS()->FindNode(IDOfNode); + SMDS_MeshElement* elem = GetMeshDS()->Add0DElement(aNode); + + // Update Python script + TPythonDump() << "elem0d = " << this << ".Add0DElement( " << IDOfNode <<" )"; + + if (elem) + return elem->GetID(); + + return 0; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + CORBA::Long SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes) { initData(); @@ -353,26 +395,6 @@ CORBA::Long SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes) return 0; } -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Long SMESH_MeshEditor_i::AddNode(CORBA::Double x, - CORBA::Double y, CORBA::Double z) -{ - initData(); - - const SMDS_MeshNode* N = GetMeshDS()->AddNode(x, y, z); - - // Update Python script - TPythonDump() << "nodeID = " << this << ".AddNode( " - << x << ", " << y << ", " << z << " )"; - - return N->GetID(); -} - //============================================================================= /*! * AddFace diff --git a/src/SMESH_I/SMESH_MeshEditor_i.hxx b/src/SMESH_I/SMESH_MeshEditor_i.hxx index 81411fe36..9943e74cb 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.hxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.hxx @@ -55,6 +55,7 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * Returns ID of created element or 0 if element not created */ CORBA::Long AddNode(CORBA::Double x, CORBA::Double y, CORBA::Double z); + CORBA::Long Add0DElement(CORBA::Long IDOfNode); CORBA::Long AddEdge(const SMESH::long_array & IDsOfNodes); CORBA::Long AddFace(const SMESH::long_array & IDsOfNodes); CORBA::Long AddPolygonalFace(const SMESH::long_array & IDsOfNodes); diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 2aee2fa97..6673da334 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -2416,6 +2416,17 @@ CORBA::Long SMESH_Mesh_i::NbElements()throw (SALOME::SALOME_Exception) return NbEdges() + NbFaces() + NbVolumes(); } +//============================================================================= +/*! + * + */ +//============================================================================= +CORBA::Long SMESH_Mesh_i::Nb0DElements()throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->Nb0DElements(); +} + //============================================================================= /*! * diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index 2915d4091..a79c3c21a 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -227,6 +227,9 @@ public: CORBA::Long NbElements() throw (SALOME::SALOME_Exception); + CORBA::Long Nb0DElements() + throw (SALOME::SALOME_Exception); + CORBA::Long NbEdges() throw (SALOME::SALOME_Exception); diff --git a/src/SMESH_SWIG/smeshDC.py b/src/SMESH_SWIG/smeshDC.py index d7a72c7dd..9bf05b303 100644 --- a/src/SMESH_SWIG/smeshDC.py +++ b/src/SMESH_SWIG/smeshDC.py @@ -1600,6 +1600,12 @@ class Mesh: def NbElements(self): return self.mesh.NbElements() + ## Returns the number of 0d elements in the mesh + # @return an integer value + # @ingroup l1_meshinfo + def Nb0DElements(self): + return self.mesh.Nb0DElements() + ## Returns the number of edges in the mesh # @return an integer value # @ingroup l1_meshinfo @@ -1938,6 +1944,13 @@ class Mesh: self.mesh.SetParameters(Parameters) return self.editor.AddNode( x, y, z) + ## Creates a 0D element on a node with given number. + # @param IDOfNode the ID of node for creation of the element. + # @return the Id of the new 0D element + # @ingroup l2_modif_add + def Add0DElement(self, IDOfNode): + return self.editor.Add0DElement(IDOfNode) + ## Creates a linear or quadratic edge (this is determined # by the number of given nodes). # @param IDsOfNodes the list of node IDs for creation of the element. -- 2.39.2