X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMClient%2FGEOM_Client.cxx;h=2659f6209b4f5a38bba8e62f6932f59d71aa854c;hb=6943eea1c391def14848539900c0705d0e3f66e9;hp=e3fb21cb3e40323358987072ae22f8660b65b426;hpb=0f1369c27fd6a84ba1149c3c5f3ed181acc055f1;p=modules%2Fgeom.git diff --git a/src/GEOMClient/GEOM_Client.cxx b/src/GEOMClient/GEOM_Client.cxx index e3fb21cb3..2659f6209 100644 --- a/src/GEOMClient/GEOM_Client.cxx +++ b/src/GEOMClient/GEOM_Client.cxx @@ -17,7 +17,7 @@ // 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // // @@ -26,25 +26,37 @@ // Module : GEOM // $Header$ -using namespace std; +#include + +#include + +#include + #include "GEOM_Client.hxx" #include +#include "OpUtil.hxx" #include "utilities.h" -#include CORBA_SERVER_HEADER(GEOM_Gen) - #include #include #include #include #include #include +#include #include -#include -#include -#include -#include -#include +#include + +#ifdef WNT +#include +#else +#include +#endif + +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(GEOM_Gen) + +#define HST_CLIENT_LEN 256 @@ -52,29 +64,53 @@ using namespace std; // function : Load() // purpose : //======================================================================= -static TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_ptr aShape ) +TopoDS_Shape GEOM_Client::Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape ) { - TopoDS_Shape S; - /* get sequence of bytes of resulting brep shape from GEOM server */ - GEOM::GEOM_Shape::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; + 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); + }; } //======================================================================= // function : Create() -// purpose : +// purpose : Create in client not in a container //======================================================================= GEOM_Client::GEOM_Client() { + pid_client = +#ifdef WNT + (long)_getpid(); +#else + (long)getpid(); +#endif } +//======================================================================= +// function : Create() +// purpose : +//======================================================================= +GEOM_Client::GEOM_Client(Engines::Container_ptr client) +{ + pid_client = client->getPID(); +} //======================================================================= // function : Find() @@ -91,6 +127,20 @@ Standard_Integer GEOM_Client::Find( const TCollection_AsciiString& IOR, TopoDS_S return 0; } +//======================================================================= +// function : Find() +// purpose : +//======================================================================= +Standard_Integer 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; + } + } + return 0; +} //======================================================================= // function : Bind() @@ -106,13 +156,13 @@ void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& // function : RemoveShapeFromBuffer() // purpose : Remove shape from Client Buffer //======================================================================= -void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& shapeIOR ) +void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR) { if( myIORs.IsEmpty() ) return ; TopoDS_Shape S ; - Standard_Integer anIndex = Find( shapeIOR, S ) ; + Standard_Integer anIndex = Find( IOR, S ) ; if( anIndex != 0 ) { myIORs.Remove(anIndex) ; myShapes.Remove(anIndex) ; @@ -148,106 +198,46 @@ unsigned int GEOM_Client::BufferLength() // 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); -TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_ptr aShape ) -{ + if (anIndex != 0) return S; - TopoDS_Shape S; - TCollection_AsciiString IOR(aShape->Name()); - Standard_Integer anIndex = Find(IOR, S); - - BRep_Builder B; - - 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 MainShape = GetShape (geom, geom->GetIORFromString(aShape->MainName())); - GEOM::GEOM_Shape::ListOfSubShapeID_var list = aShape->Index(); - - Standard_Integer j = 1; - TopExp_Explorer exp; - TopAbs_ShapeEnum ShapeType = TopAbs_ShapeEnum(aShape->ShapeType()); - - /* Case of only one subshape */ - if (list->length() == 1) - { - if (ShapeType == TopAbs_COMPOUND) - { - TopoDS_Iterator it; - TopTools_ListOfShape CL; - CL.Append( MainShape ); - TopTools_ListIteratorOfListOfShape itC; - for (itC.Initialize( CL ); itC.More(); itC.Next()) - { - for (it.Initialize( itC.Value() ); it.More(); it.Next()) - { - if ( it.Value().ShapeType() == TopAbs_COMPOUND) - { - if (j == list[0]) - { - S = it.Value(); - Bind(IOR, S); - return S; - } - j++; - CL.Append( it.Value() ); - } - } - } - } - else - { - TopTools_MapOfShape M; - for (exp.Init(MainShape, ShapeType); exp.More(); exp.Next()) { - if ( M.Add(exp.Current()) ) - { - if (j == list[0]) - { - S = exp.Current(); - Bind(IOR, S); - return S; - } - j++; - } - } - } - } - - /* Case of a compound containing two or more sub shapes (not a main shape compound !) */ - - /* Warning : the compound when representing sub shapes must be explored in a sub type */ - /* that is NOT ShapeType=aShape->ShapeType()= TopAbs_COMPOUND ! */ - /* We have to retrieve the exact sub type of shapes contained in the compound first ! */ - TopoDS_Iterator it ; - TopAbs_ShapeEnum exactSubType ; - S = Load( geom, aShape ); - it.Initialize( S, true, true ) ; - it.More(); - exactSubType = it.Value().ShapeType() ; - - TColStd_MapOfInteger MapIndex; - Standard_Integer nbSS = list->length(); - TopoDS_Compound Comp; - B.MakeCompound(Comp); - - for (Standard_Integer i=1; i<=nbSS; i++) - MapIndex.Add(list[i-1]); - - for (exp.Init(MainShape, exactSubType), j=1; exp.More() ; exp.Next(), j++) { - if ( MapIndex.Contains(j) ) { - B.Add( Comp, exp.Current() ); - } - } - Bind(IOR, Comp); - return Comp; -} + /******* 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]); + } + else { + BRep_Builder B; + TopoDS_Compound aCompound; + B.MakeCompound(aCompound); + for (int i = 0; i < list->length(); i++) { + if (0 < list[i] && list[i] <= anIndices.Extent()) { + TopoDS_Shape aSubShape = anIndices.FindKey(list[i]); + B.Add(aCompound, aSubShape); + } + } + + S = aCompound; + } + Bind(IOR, S); + return S; +}