X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers_I%2FStdMeshers_QuadrangleParams_i.cxx;h=7ab284adc99017a3108c7764503c32a916295652;hp=4d72e8de1aab0f67c4b19dd9013e0269c7981690;hb=499f29d24922cec66e41b41a0039a954993bc6df;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6 diff --git a/src/StdMeshers_I/StdMeshers_QuadrangleParams_i.cxx b/src/StdMeshers_I/StdMeshers_QuadrangleParams_i.cxx index 4d72e8de1..7ab284adc 100644 --- a/src/StdMeshers_I/StdMeshers_QuadrangleParams_i.cxx +++ b/src/StdMeshers_I/StdMeshers_QuadrangleParams_i.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,14 +21,17 @@ // Module : SMESH #include "StdMeshers_QuadrangleParams_i.hxx" -#include "SMESH_Gen_i.hxx" + #include "SMESH_Gen.hxx" +#include "SMESH_Gen_i.hxx" #include "SMESH_PythonDump.hxx" +#include "StdMeshers_ObjRefUlils.hxx" -#include "Utils_CorbaException.hxx" -#include "utilities.h" +#include +#include -#include +#include +#include "SMESH_TryCatch.hxx" using namespace std; @@ -42,14 +45,11 @@ using namespace std; StdMeshers_QuadrangleParams_i::StdMeshers_QuadrangleParams_i (PortableServer::POA_ptr thePOA, - int theStudyId, ::SMESH_Gen* theGenImpl ) : SALOME::GenericObj_i( thePOA ), SMESH_Hypothesis_i( thePOA ) { - MESSAGE( "StdMeshers_QuadrangleParams_i::StdMeshers_QuadrangleParams_i" ); myBaseImpl = new ::StdMeshers_QuadrangleParams(theGenImpl->GetANewId(), - theStudyId, theGenImpl); } @@ -63,7 +63,6 @@ StdMeshers_QuadrangleParams_i::StdMeshers_QuadrangleParams_i StdMeshers_QuadrangleParams_i::~StdMeshers_QuadrangleParams_i() { - MESSAGE( "StdMeshers_QuadrangleParams_i::~StdMeshers_QuadrangleParams_i" ); } //============================================================================= @@ -76,19 +75,16 @@ StdMeshers_QuadrangleParams_i::~StdMeshers_QuadrangleParams_i() void StdMeshers_QuadrangleParams_i::SetTriaVertex(CORBA::Long vertID) { - MESSAGE( "StdMeshers_QuadrangleParams_i::SetTriaVertex" ); ASSERT( myBaseImpl ); try { this->GetImpl()->SetTriaVertex( vertID ); } catch ( SALOME_Exception& S_ex ) { - THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), - SALOME::BAD_PARAM ); + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); } // Update Python script - SMESH::TPythonDump() << _this() << ".SetTriaVertex( " - << vertID << " )"; + SMESH::TPythonDump() << _this() << ".SetTriaVertex( " << vertID << " )"; } //============================================================================= @@ -101,7 +97,6 @@ void StdMeshers_QuadrangleParams_i::SetTriaVertex(CORBA::Long vertID) CORBA::Long StdMeshers_QuadrangleParams_i::GetTriaVertex() { - MESSAGE( "StdMeshers_QuadrangleParams_i::GetTriaVertex" ); ASSERT( myBaseImpl ); return this->GetImpl()->GetTriaVertex(); } @@ -116,7 +111,6 @@ CORBA::Long StdMeshers_QuadrangleParams_i::GetTriaVertex() void StdMeshers_QuadrangleParams_i::SetObjectEntry( const char* entry ) { - MESSAGE( "StdMeshers_QuadrangleParams_i::SetObjectEntry" ); ASSERT( myBaseImpl ); try { @@ -140,15 +134,13 @@ void StdMeshers_QuadrangleParams_i::SetObjectEntry( const char* entry ) char* StdMeshers_QuadrangleParams_i::GetObjectEntry() { - MESSAGE( "StdMeshers_QuadrangleParams_i::SetObjectEntry" ); ASSERT( myBaseImpl ); const char* entry; try { entry = this->GetImpl()->GetObjectEntry(); } catch ( SALOME_Exception& S_ex ) { - THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), - SALOME::BAD_PARAM ); + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); } return CORBA::string_dup( entry ); } @@ -162,13 +154,6 @@ char* StdMeshers_QuadrangleParams_i::GetObjectEntry() //============================================================================= void StdMeshers_QuadrangleParams_i::SetQuadType(StdMeshers::QuadType type) { - //static char* quadTypes[5] = {"StdMeshers.QUAD_STANDARD", - // "StdMeshers.QUAD_TRIANGLE_PREF", - // "StdMeshers.QUAD_QUADRANGLE_PREF", - // "StdMeshers.QUAD_QUADRANGLE_PREF_REVERSED", - // "StdMeshers.QUAD_REDUCED"}; - - MESSAGE("StdMeshers_QuadrangleParams_i::SetQuadType"); ASSERT(myBaseImpl); if (int(type) >= int(StdMeshers::QUAD_NB_TYPES)) { @@ -199,7 +184,6 @@ void StdMeshers_QuadrangleParams_i::SetQuadType(StdMeshers::QuadType type) quadType = "UNKNOWN"; } SMESH::TPythonDump() << _this() << ".SetQuadType( " << quadType << " )"; - //SMESH::TPythonDump() << _this() << ".SetQuadType( " << quadTypes[int(type)] << " )"; } //============================================================================= @@ -211,11 +195,140 @@ void StdMeshers_QuadrangleParams_i::SetQuadType(StdMeshers::QuadType type) //============================================================================= StdMeshers::QuadType StdMeshers_QuadrangleParams_i::GetQuadType() { - MESSAGE("StdMeshers_QuadrangleParams_i::GetQuadType"); ASSERT(myBaseImpl); return StdMeshers::QuadType(int(this->GetImpl()->GetQuadType())); } +//================================================================================ +/*! + * \brief Set positions of enforced nodes + */ +//================================================================================ + +void StdMeshers_QuadrangleParams_i::SetEnforcedNodes(const GEOM::ListOfGO& theVertices, + const SMESH::nodes_array& thePoints) +{ + try { + std::vector< TopoDS_Shape > shapes; + std::vector< gp_Pnt > points; + shapes.reserve( theVertices.length() ); + points.reserve( thePoints.length() ); + + myShapeEntries.clear(); + + for ( size_t i = 0; i < theVertices.length(); ++i ) + { + if ( CORBA::is_nil( theVertices[i] )) + continue; + CORBA::String_var entry = theVertices[i]->GetStudyEntry(); + if ( !entry.in() || !entry.in()[0] ) + THROW_SALOME_CORBA_EXCEPTION( "Not published enforced vertex shape", SALOME::BAD_PARAM ); + + shapes.push_back( StdMeshers_ObjRefUlils::GeomObjectToShape( theVertices[i].in() )); + myShapeEntries.push_back( entry.in() ); + } + for ( size_t i = 0; i < thePoints.length(); ++i ) + { + points.push_back( gp_Pnt( thePoints[i].x, thePoints[i].y, thePoints[i].z )); + } + this->GetImpl()->SetEnforcedNodes( shapes, points ); + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); + } + // Update Python script + SMESH::TPythonDump() << _this() << ".SetEnforcedNodes( " + << theVertices << ", " << thePoints << " )"; +} + +//================================================================================ +/*! + * \brief Returns positions of enforced nodes + */ +//================================================================================ + +void StdMeshers_QuadrangleParams_i::GetEnforcedNodes(GEOM::ListOfGO_out theVertices, + SMESH::nodes_array_out thePoints) +{ + SMESH_TRY; + + std::vector< TopoDS_Shape > shapes; + std::vector< gp_Pnt > points; + this->GetImpl()->GetEnforcedNodes( shapes, points ); + + theVertices = new GEOM::ListOfGO; + thePoints = new SMESH::nodes_array; + + size_t i = 0; + theVertices->length( myShapeEntries.size() ); + for ( i = 0; i < myShapeEntries.size(); ++i ) + theVertices[i] = + StdMeshers_ObjRefUlils::EntryOrShapeToGeomObject( myShapeEntries[i], shapes[i] ); + + thePoints->length( points.size() ); + for ( i = 0; i < points.size(); ++i ) + { + thePoints[i].x = points[i].X(); + thePoints[i].y = points[i].Y(); + thePoints[i].z = points[i].Z(); + } + SMESH_CATCH( SMESH::doNothing ); +} + +//================================================================================ +/*! + * \brief Returns study entries of shapes defining enforced nodes + */ +//================================================================================ + +SMESH::string_array* StdMeshers_QuadrangleParams_i::GetEnfVertices() +{ + SMESH::string_array_var arr = new SMESH::string_array; + arr->length( myShapeEntries.size() ); + + for ( size_t i = 0; i < myShapeEntries.size(); ++i ) + arr[ i ] = myShapeEntries[ i ].c_str(); + + return arr._retn(); +} + +//============================================================================= +/*! + * Set corner vertices + */ +//============================================================================= + +void StdMeshers_QuadrangleParams_i::SetCorners(const SMESH::long_array& theVertexIDs ) +{ + std::vector< int > ids; + for ( CORBA::ULong i = 0; i < theVertexIDs.length(); ++i ) + ids.push_back( theVertexIDs[i] ); + + if ( ids != GetImpl()->GetCorners() ) + { + GetImpl()->SetCorners( ids ); + SMESH::TPythonDump() << _this() << ".SetCorners( " << theVertexIDs << " )"; + } +} + +//============================================================================= +/*! + * Return IDs of corner vertices + */ +//============================================================================= + +SMESH::long_array* StdMeshers_QuadrangleParams_i::GetCorners() +{ + const std::vector< int >& ids = GetImpl()->GetCorners(); + + SMESH::long_array_var result = new SMESH::long_array; + result->length( ids.size() ); + for ( size_t i = 0; i < ids.size(); ++i ) + result[ i ] = ids[ i ]; + + return result._retn(); +} + //============================================================================= /*! * StdMeshers_QuadrangleParams_i::GetImpl @@ -226,7 +339,6 @@ StdMeshers::QuadType StdMeshers_QuadrangleParams_i::GetQuadType() ::StdMeshers_QuadrangleParams* StdMeshers_QuadrangleParams_i::GetImpl() { - MESSAGE( "StdMeshers_QuadrangleParams_i::GetImpl" ); return ( ::StdMeshers_QuadrangleParams* )myBaseImpl; } @@ -243,3 +355,113 @@ CORBA::Boolean StdMeshers_QuadrangleParams_i::IsDimSupported( SMESH::Dimension t { return type == SMESH::DIM_2D; } + +//================================================================================ +/*! + * \brief Write parameters in a string + * \retval char* - resulting string + */ +//================================================================================ + +char* StdMeshers_QuadrangleParams_i::SaveTo() +{ + ASSERT( myBaseImpl ); + std::ostringstream os; + + os << "ENTRIES: " << myShapeEntries.size(); + for ( size_t i = 0; i < myShapeEntries.size(); ++i ) + StdMeshers_ObjRefUlils::SaveToStream( myShapeEntries[ i ], os ); + os << " "; + + myBaseImpl->SaveTo( os ); + + return CORBA::string_dup( os.str().c_str() ); +} + +//================================================================================ +/*! + * \brief Retrieve parameters from the string + * \param theStream - the input string + */ +//================================================================================ + +void StdMeshers_QuadrangleParams_i::LoadFrom( const char* theStream ) +{ + ASSERT( myBaseImpl ); + + bool hasEntries = ( strncmp( "ENTRIES: ", theStream, 9 ) == 0 ); + std::istringstream is( theStream + ( hasEntries ? 9 : 0 )); + + if ( hasEntries ) + { + int nb = 0; + if ( is >> nb && nb > 0 ) + { + std::vector< TopoDS_Shape > shapes; + std::vector< gp_Pnt > points; + myShapeEntries.resize( nb ); + + for ( int i = 0; i < nb; ++i ) + shapes.push_back( StdMeshers_ObjRefUlils::LoadFromStream( is, & myShapeEntries[i] )); + + try { + GetImpl()->SetEnforcedNodes( shapes, points ); + } + catch (...) { + } + } + } + + myBaseImpl->LoadFrom( is ); +} + +//================================================================================ +/*! + * \brief Return geometry this hypothesis depends on. Return false if there is no geometry parameter + */ +//================================================================================ + +bool +StdMeshers_QuadrangleParams_i::getObjectsDependOn( std::vector< std::string > & entryArray, + std::vector< int > & subIDArray ) const +{ + const ::StdMeshers_QuadrangleParams* impl = + static_cast( myBaseImpl ); + + subIDArray.push_back( impl->GetTriaVertex() ); + + entryArray.push_back( impl->GetObjectEntry() ); + entryArray.insert( entryArray.end(), myShapeEntries.begin(), myShapeEntries.end() ); + + return true; +} + +//================================================================================ +/*! + * \brief Set new geometry instead of that returned by getObjectsDependOn() + */ +//================================================================================ + +bool +StdMeshers_QuadrangleParams_i::setObjectsDependOn( std::vector< std::string > & entryArray, + std::vector< int > & subIDArray ) +{ + if ( !subIDArray.empty() ) + GetImpl()->SetTriaVertex( subIDArray[0] ); + + GetImpl()->SetObjectEntry( entryArray[0].c_str() ); + + myShapeEntries.assign( ++entryArray.begin(), entryArray.end() ); + + std::vector< TopoDS_Shape > shapes; + std::vector< gp_Pnt > points; + this->GetImpl()->GetEnforcedNodes( shapes, points ); + + shapes.clear(); + for ( size_t i = 0; i < myShapeEntries.size(); ++i ) + shapes.push_back( StdMeshers_ObjRefUlils::EntryToShape( myShapeEntries[i] )); + + this->GetImpl()->SetEnforcedNodes( shapes, points ); + + return true; +}