mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-09-29 22:22:51 +05:00
359 lines
9.8 KiB
C++
359 lines
9.8 KiB
C++
// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes
|
|
//
|
|
// Copyright (C) 2004 CEA
|
|
//
|
|
// 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.org
|
|
//
|
|
//
|
|
//
|
|
// File : SMESH_Group_i.cxx
|
|
// Author : Sergey ANIKIN, OCC
|
|
// Module : SMESH
|
|
// $Header$
|
|
|
|
#include "SMESH_Group_i.hxx"
|
|
#include "SMESH_Mesh_i.hxx"
|
|
#include "SMESH_Gen_i.hxx"
|
|
#include <SMESH_Group.hxx>
|
|
#include <SMESHDS_Group.hxx>
|
|
#include <SMDSAbs_ElementType.hxx>
|
|
#include <utilities.h>
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
SMESH_Group_i::SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID )
|
|
: SALOME::GenericObj_i( thePOA ),
|
|
myMeshServant( theMeshServant ),
|
|
myLocalID( theLocalID )
|
|
{
|
|
thePOA->activate_object( this );
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
SMESH_Group_i::~SMESH_Group_i()
|
|
{
|
|
MESSAGE("~SMESH_Group_i;" );
|
|
if ( myMeshServant )
|
|
myMeshServant->removeGroup(myLocalID);
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
void SMESH_Group_i::SetName( const char* theName )
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
aGroup->SetName(theName);
|
|
|
|
// Update group name in a study
|
|
SALOMEDS::Study_var aStudy = myMeshServant->GetGen()->GetCurrentStudy();
|
|
if ( !aStudy->_is_nil() ) {
|
|
SALOMEDS::SObject_var aGroupSO = aStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( _this() ) );
|
|
if ( !aGroupSO->_is_nil() ) {
|
|
SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder();
|
|
aBuilder->SetName( aGroupSO, theName );
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
MESSAGE("can't set name of a vague group");
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
char* SMESH_Group_i::GetName()
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup)
|
|
return CORBA::string_dup (aGroup->GetName());
|
|
}
|
|
MESSAGE("get name of a vague group");
|
|
return CORBA::string_dup( "NO_NAME" );
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
SMESH::ElementType SMESH_Group_i::GetType()
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
|
|
SMESH::ElementType aType;
|
|
switch (aSMDSType) {
|
|
case SMDSAbs_Node: aType = SMESH::NODE; break;
|
|
case SMDSAbs_Edge: aType = SMESH::EDGE; break;
|
|
case SMDSAbs_Face: aType = SMESH::FACE; break;
|
|
case SMDSAbs_Volume: aType = SMESH::VOLUME; break;
|
|
default: aType = SMESH::ALL; break;
|
|
}
|
|
return aType;
|
|
}
|
|
}
|
|
MESSAGE("get type of a vague group");
|
|
return SMESH::ALL;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
CORBA::Long SMESH_Group_i::Size()
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
int aSize = aGroup->GetGroupDS()->Extent();
|
|
return aSize;
|
|
}
|
|
}
|
|
MESSAGE("get size of a vague group");
|
|
return 0;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
CORBA::Boolean SMESH_Group_i::IsEmpty()
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
bool isEmpty = aGroup->GetGroupDS()->IsEmpty();
|
|
return isEmpty;
|
|
}
|
|
}
|
|
MESSAGE("checking IsEmpty of a vague group");
|
|
return true;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
void SMESH_Group_i::Clear()
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
// a SMDS group forgets its type after clearing, so we must re-set it
|
|
SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
|
|
aGroup->GetGroupDS()->Clear();
|
|
aGroup->GetGroupDS()->SetType(aSMDSType);
|
|
return;
|
|
}
|
|
}
|
|
MESSAGE("attempt to clear a vague group");
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
CORBA::Boolean SMESH_Group_i::Contains( CORBA::Long theID )
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
bool res = aGroup->GetGroupDS()->Contains(theID);
|
|
return res;
|
|
}
|
|
}
|
|
MESSAGE("attempt to check contents of a vague group");
|
|
return false;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
CORBA::Long SMESH_Group_i::Add( const SMESH::long_array& theIDs )
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
|
|
int nbAdd = 0;
|
|
for (int i = 0; i < theIDs.length(); i++) {
|
|
int anID = (int) theIDs[i];
|
|
if (aGroupDS->Add(anID))
|
|
nbAdd++;
|
|
}
|
|
return nbAdd;
|
|
}
|
|
}
|
|
MESSAGE("attempt to add elements to a vague group");
|
|
return 0;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
CORBA::Long SMESH_Group_i::GetID( CORBA::Long theIndex )
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
int anID = aGroup->GetGroupDS()->GetID(theIndex);
|
|
return anID;
|
|
}
|
|
}
|
|
MESSAGE("attempt to iterate on a vague group");
|
|
return -1;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
SMESH::long_array* SMESH_Group_i::GetListOfID()
|
|
{
|
|
SMESH::long_array_var aRes = new SMESH::long_array();
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
|
|
int aSize = aGroupDS->Extent();
|
|
aRes->length(aSize);
|
|
for (int i = 0; i < aSize; i++)
|
|
aRes[i] = aGroupDS->GetID(i+1);
|
|
return aRes._retn();
|
|
}
|
|
}
|
|
MESSAGE("get list of IDs of a vague group");
|
|
return aRes._retn();
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
|
|
CORBA::Long SMESH_Group_i::Remove( const SMESH::long_array& theIDs )
|
|
{
|
|
if ( myMeshServant ) {
|
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
|
if (aGroup) {
|
|
// a SMDS group forgets its type after clearing, so we must re-set it
|
|
// if the group becomes empty
|
|
SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
|
|
SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
|
|
int nbDel = 0;
|
|
for (int i = 0; i < theIDs.length(); i++) {
|
|
int anID = (int) theIDs[i];
|
|
if (aGroupDS->Remove(anID))
|
|
nbDel++;
|
|
}
|
|
if (aGroupDS->IsEmpty())
|
|
aGroupDS->SetType(aSMDSType);
|
|
return nbDel;
|
|
}
|
|
}
|
|
MESSAGE("attempt to remove elements from a vague group");
|
|
return 0;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
SMESH::SMESH_Mesh_ptr SMESH_Group_i::GetMesh()
|
|
{
|
|
MESSAGE("SMESH_Group_i::GetMesh(): mesh servant = " << myMeshServant );
|
|
SMESH::SMESH_Mesh_var aMesh;
|
|
if ( myMeshServant )
|
|
aMesh = SMESH::SMESH_Mesh::_narrow( myMeshServant->_this() );
|
|
return aMesh._retn();
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
/*!
|
|
*
|
|
*/
|
|
//=============================================================================
|
|
int SMESH_Group_i::GetLocalID()
|
|
{
|
|
return myLocalID;
|
|
}
|