X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMClient%2FGEOM_Client.cxx;h=52e007c2893f7279b307367c8c53a2c4cf910e1a;hb=08a90cb03f6d2befe6f0b923bd690182ded48378;hp=35710a5062d1a402046a3c8c6af6b1f7d81212a6;hpb=ca429d817a18d6acc571443f6a596575dee03c2f;p=modules%2Fgeom.git diff --git a/src/GEOMClient/GEOM_Client.cxx b/src/GEOMClient/GEOM_Client.cxx index 35710a506..52e007c28 100644 --- a/src/GEOMClient/GEOM_Client.cxx +++ b/src/GEOMClient/GEOM_Client.cxx @@ -1,43 +1,39 @@ -// GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// 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 // // File : GEOM_Client.cxx // Author : Yves FRICAUD/Lucien PIGNOLONI // Module : GEOM -// $Header$ -#include +#include -using namespace std; +#include + +#include #include "GEOM_Client.hxx" #include -#include "OpUtil.hxx" +#include "Basics_Utils.hxx" #include "utilities.h" -#include CORBA_SERVER_HEADER(SALOMEDS) -#include CORBA_SERVER_HEADER(GEOM_Gen) - #include #include #include @@ -48,40 +44,45 @@ using namespace std; #include #include +#ifdef WNT +#include +#else #include +#endif -#define HST_CLIENT_LEN 256 - +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(GEOM_Gen) +#define HST_CLIENT_LEN 256 //======================================================================= // function : Load() -// purpose : +// purpose : //======================================================================= TopoDS_Shape GEOM_Client::Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape ) { - string hst_client = GetHostname(); - - Engines::Container_var ctn_server = geom->GetContainerRef(); - long pid_server = ctn_server->getPID(); - - if ( (pid_client==pid_server) && (strcmp(hst_client.c_str(), ctn_server->getHostName())==0) ) { - TopoDS_Shape* S = (TopoDS_Shape*)(aShape->getShape()); - return(*S); - } else { - /* get sequence of bytes of resulting brep shape from GEOM server */ - TopoDS_Shape S; - SALOMEDS::TMPFile_var SeqFile = aShape->GetShapeStream(); - int sizebuf = SeqFile->length(); - char* buf; - buf = (char*) &SeqFile[0]; - istrstream streamBrep(buf,sizebuf); - BRep_Builder aBuilder; - BRepTools::Read(S, streamBrep, aBuilder); - return(S); - }; -} + std::string hst_client = Kernel_Utils::GetHostname(); + Engines::Container_var ctn_server = geom->GetContainerRef(); + long pid_server = ctn_server->getPID(); + + CORBA::String_var hostname = ctn_server->getHostName(); + if ( pid_client == pid_server && !strcmp(hst_client.c_str(), hostname.in()) ) { + TopoDS_Shape* S = (TopoDS_Shape*)(aShape->getShape()); + return(*S); + } else { + /* get sequence of bytes of resulting brep shape from GEOM server */ + TopoDS_Shape S; + SALOMEDS::TMPFile_var SeqFile = aShape->GetShapeStream(); + /*int sizebuf = */SeqFile->length(); + char* buf; + buf = (char*) &SeqFile[0]; + std::istringstream streamBrep(buf); + BRep_Builder aBuilder; + BRepTools::Read(S, streamBrep, aBuilder); + return(S); + } +} //======================================================================= // function : Create() @@ -89,46 +90,78 @@ TopoDS_Shape GEOM_Client::Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr a //======================================================================= GEOM_Client::GEOM_Client() { - pid_client = (long)getpid(); + pid_client = +#ifdef WNT + (long)_getpid(); +#else + (long)getpid(); +#endif } //======================================================================= // function : Create() -// purpose : +// purpose : Copy constructor +//======================================================================= +GEOM_Client::GEOM_Client(const GEOM_Client& client) +{ + _mySubShapes = client._mySubShapes; + myShapesMap = client.myShapesMap; + pid_client = client.pid_client; +} + +//======================================================================= +// function : Create() +// purpose : //======================================================================= GEOM_Client::GEOM_Client(Engines::Container_ptr client) { pid_client = client->getPID(); } +//======================================================================= +// function : get_client() +// purpose : Static method to have the only one instance of GEOM_Client +//======================================================================= +#ifdef SINGLE_CLIENT +GEOM_Client& GEOM_Client::get_client() +{ + static GEOM_Client a; + return a; +} +#else +GEOM_Client GEOM_Client::get_client() +{ + return GEOM_Client(); +} +#endif + //======================================================================= // function : Find() -// purpose : +// purpose : //======================================================================= -Standard_Integer GEOM_Client::Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S ) +Standard_Boolean GEOM_Client::Find (const TCollection_AsciiString& IOR, TopoDS_Shape& S) { - for ( Standard_Integer i = 1; i<= myIORs.Length(); i++ ) { - if (myIORs.Value(i).IsEqual(IOR)) { - S = myShapes.Value(i); - return i; - } + if (myShapesMap.count(IOR) != 0) { + S = myShapesMap[IOR]; + return Standard_True; } - return 0; + return Standard_False; } //======================================================================= // function : Find() -// purpose : +// purpose : //======================================================================= -Standard_Integer GEOM_Client::Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR ) +Standard_Boolean GEOM_Client::Find (const TopoDS_Shape& S, TCollection_AsciiString& IOR) { - for ( Standard_Integer i = 1; i<= myShapes.Length(); i++ ) { - if (myShapes.Value(i) == S) { - IOR = myIORs.Value(i); - return i; + std::map< TCollection_AsciiString, TopoDS_Shape >::const_iterator it; + for (it = myShapesMap.begin(); it != myShapesMap.end(); ++it) { + if ((*it).second == S) { + IOR = (*it).first; + return Standard_True; } } - return 0; + return Standard_False; } //======================================================================= @@ -137,8 +170,7 @@ Standard_Integer GEOM_Client::Find( const TopoDS_Shape& S, TCollection_AsciiStri //======================================================================= void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S ) { - myIORs.Append(IOR); - myShapes.Append(S); + myShapesMap[IOR] = S; } //======================================================================= @@ -147,30 +179,26 @@ void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& //======================================================================= void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR) { - if( myIORs.IsEmpty() ) - return ; - - TopoDS_Shape S ; - Standard_Integer anIndex = Find( IOR, S ) ; - if( anIndex != 0 ) { - myIORs.Remove(anIndex) ; - myShapes.Remove(anIndex) ; + if (myShapesMap.size() == 0) + return; + + if (myShapesMap.count(IOR) != 0) { + myShapesMap.erase(IOR); + _mySubShapes.erase(IOR); } - return ; } - //======================================================================= // function : ClearClientBuffer() // purpose : purge buffer //======================================================================= void GEOM_Client::ClearClientBuffer() { - if( myIORs.IsEmpty() ) - return ; - myIORs.Clear() ; - myShapes.Clear() ; - return ; + if (myShapesMap.size() == 0) + return; + + _mySubShapes.clear(); + myShapesMap.clear(); } //======================================================================= @@ -179,55 +207,66 @@ void GEOM_Client::ClearClientBuffer() //======================================================================= unsigned int GEOM_Client::BufferLength() { - return myIORs.Length() ; + return myShapesMap.size(); } - //======================================================================= // function : GetShape() -// purpose : -//======================================================================= - -TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape ) -{ - TopoDS_Shape S; - TCollection_AsciiString IOR = geom->GetStringFromIOR(aShape); - Standard_Integer anIndex = Find(IOR, S); - - if (anIndex !=0 ) return S ; - - /******* in case of a MAIN GEOM::SHAPE ********/ - if (aShape->IsMainShape()) { - S = Load(geom, aShape); - Bind(IOR, S); - return S; - } - - /******* in case of SUB GEOM::SHAPE ***********/ - // Load and Explore the Main Shape - TopoDS_Shape aMainShape = GetShape (geom, aShape->GetMainShape()); - GEOM::ListOfLong_var list = aShape->GetSubShapeIndices(); - - TopTools_IndexedMapOfShape anIndices; - TopExp::MapShapes(aMainShape, anIndices); - - /* Case of only one subshape */ - if (list->length() == 1) - { - S = anIndices.FindKey(list[0]); - } +// purpose : +//======================================================================= +TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape ) +{ + TopoDS_Shape S; + CORBA::String_var anIOR = geom->GetStringFromIOR(aShape); + TCollection_AsciiString IOR = (char*)anIOR.in(); + Standard_Boolean anIndex = Find(IOR, S); + + if (anIndex) return S; + + /******* in case of a MAIN GEOM::SHAPE ********/ + if (aShape->IsMainShape()) { + S = Load(geom, aShape); + Bind(IOR, S); + return S; + } + + /******* in case of SUB GEOM::SHAPE ***********/ + // Load and Explore the Main Shape + TopoDS_Shape aMainShape = GetShape (geom, aShape->GetMainShape()); + GEOM::ListOfLong_var list = aShape->GetSubShapeIndices(); + + CORBA::String_var aMainIOR = geom->GetStringFromIOR(aShape->GetMainShape()); + TCollection_AsciiString mainIOR = (char*)aMainIOR.in(); + + //find subshapes only one time + if (_mySubShapes.count(mainIOR) == 0) + { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aMainShape, anIndices); + Standard_Integer ii = 1, nbSubSh = anIndices.Extent(); + for (; ii <= nbSubSh; ii++) + { + _mySubShapes[mainIOR].push_back(anIndices.FindKey(ii)); + } + } + + /* Case of only one subshape */ + if (list->length() == 1 && list[0] > 0) { + S = _mySubShapes[mainIOR][list[0]-1]; + } else { BRep_Builder B; TopoDS_Compound aCompound; B.MakeCompound(aCompound); - for(int i=0; ilength(); i++) { - TopoDS_Shape aSubShape = anIndices.FindKey(list[i]); - B.Add(aCompound, aSubShape); + for (int i = 0; i < list->length(); i++) { + if (0 < list[i] && list[i] <= _mySubShapes[mainIOR].size()) { + TopoDS_Shape aSubShape = _mySubShapes[mainIOR][list[i]-1]; + B.Add(aCompound, aSubShape); + } } S = aCompound; } - Bind(IOR, S); - return S; -} - + Bind(IOR, S); + return S; +}