geom/src/GEOMClient/GEOM_Client.cxx

243 lines
7.0 KiB
C++
Raw Normal View History

2009-02-13 17:16:39 +05:00
// 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
2003-07-09 20:33:44 +06:00
//
2009-02-13 17:16:39 +05:00
// 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.
2003-07-09 20:33:44 +06:00
//
2009-02-13 17:16:39 +05:00
// 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.
2003-07-09 20:33:44 +06:00
//
2009-02-13 17:16:39 +05:00
// 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
2003-07-09 20:33:44 +06:00
//
2009-02-13 17:16:39 +05:00
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client
2003-07-09 20:33:44 +06:00
// File : GEOM_Client.cxx
// Author : Yves FRICAUD/Lucien PIGNOLONI
// Module : GEOM
2003-05-12 21:09:12 +06:00
// $Header$
2009-02-13 17:16:39 +05:00
//
2005-08-11 10:14:22 +06:00
#include <Standard_Stream.hxx>
2005-01-20 11:24:17 +05:00
2005-08-19 17:51:38 +06:00
#include <Standard_Stream.hxx>
2005-08-11 10:14:22 +06:00
#include <strstream>
2005-01-20 11:24:17 +05:00
2003-05-12 21:09:12 +06:00
#include "GEOM_Client.hxx"
#include <SALOMEconfig.h>
2009-02-13 17:16:39 +05:00
#include "Basics_Utils.hxx"
2003-05-12 21:09:12 +06:00
#include "utilities.h"
#include <BRep_Builder.hxx>
#include <BRepTools.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Compound.hxx>
#include <TCollection_AsciiString.hxx>
#include <TopExp_Explorer.hxx>
2004-12-01 15:39:14 +05:00
#include <TopExp.hxx>
2003-05-12 21:09:12 +06:00
#include <TopAbs.hxx>
2004-12-01 15:39:14 +05:00
#include <TopTools_IndexedMapOfShape.hxx>
2003-05-12 21:09:12 +06:00
2005-08-11 10:14:22 +06:00
#ifdef WNT
#include <process.h>
#else
2004-03-26 20:09:49 +05:00
#include <unistd.h>
2005-08-11 10:14:22 +06:00
#endif
#include CORBA_SERVER_HEADER(SALOMEDS)
#include CORBA_SERVER_HEADER(GEOM_Gen)
2004-03-26 20:09:49 +05:00
#define HST_CLIENT_LEN 256
2003-05-12 21:09:12 +06:00
2004-12-01 15:39:14 +05:00
2003-05-12 21:09:12 +06:00
//=======================================================================
// function : Load()
// purpose :
//=======================================================================
2004-12-01 15:39:14 +05:00
TopoDS_Shape GEOM_Client::Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape )
2003-05-12 21:09:12 +06:00
{
2009-02-13 17:16:39 +05:00
std::string hst_client = Kernel_Utils::GetHostname();
2004-03-26 20:09:49 +05:00
Engines::Container_var ctn_server = geom->GetContainerRef();
long pid_server = ctn_server->getPID();
2004-12-01 15:39:14 +05:00
if ( (pid_client==pid_server) && (strcmp(hst_client.c_str(), ctn_server->getHostName())==0) ) {
2004-03-26 20:09:49 +05:00
TopoDS_Shape* S = (TopoDS_Shape*)(aShape->getShape());
return(*S);
} else {
/* get sequence of bytes of resulting brep shape from GEOM server */
TopoDS_Shape S;
2004-12-01 15:39:14 +05:00
SALOMEDS::TMPFile_var SeqFile = aShape->GetShapeStream();
2004-03-26 20:09:49 +05:00
int sizebuf = SeqFile->length();
char* buf;
buf = (char*) &SeqFile[0];
2009-02-13 17:16:39 +05:00
std::istrstream streamBrep(buf,sizebuf);
2004-03-26 20:09:49 +05:00
BRep_Builder aBuilder;
BRepTools::Read(S, streamBrep, aBuilder);
return(S);
};
2003-05-12 21:09:12 +06:00
}
//=======================================================================
// function : Create()
2004-03-26 20:09:49 +05:00
// purpose : Create in client not in a container
2003-05-12 21:09:12 +06:00
//=======================================================================
GEOM_Client::GEOM_Client()
{
2005-08-11 10:14:22 +06:00
pid_client =
#ifdef WNT
(long)_getpid();
#else
(long)getpid();
#endif
2003-05-12 21:09:12 +06:00
}
2004-03-26 20:09:49 +05:00
//=======================================================================
// function : Create()
// purpose :
//=======================================================================
GEOM_Client::GEOM_Client(Engines::Container_ptr client)
{
pid_client = client->getPID();
}
2003-05-12 21:09:12 +06:00
//=======================================================================
// function : Find()
// purpose :
//=======================================================================
Standard_Integer 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;
}
}
return 0;
}
2004-12-01 15:39:14 +05:00
//=======================================================================
// 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;
}
2003-05-12 21:09:12 +06:00
//=======================================================================
// function : Bind()
// purpose :
//=======================================================================
void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S )
{
myIORs.Append(IOR);
myShapes.Append(S);
}
//=======================================================================
// function : RemoveShapeFromBuffer()
// purpose : Remove shape from Client Buffer
//=======================================================================
2004-12-01 15:39:14 +05:00
void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
2003-05-12 21:09:12 +06:00
{
if( myIORs.IsEmpty() )
return ;
TopoDS_Shape S ;
2004-12-01 15:39:14 +05:00
Standard_Integer anIndex = Find( IOR, S ) ;
2003-05-12 21:09:12 +06:00
if( anIndex != 0 ) {
myIORs.Remove(anIndex) ;
myShapes.Remove(anIndex) ;
}
return ;
}
//=======================================================================
// function : ClearClientBuffer()
// purpose : purge buffer
//=======================================================================
void GEOM_Client::ClearClientBuffer()
{
if( myIORs.IsEmpty() )
return ;
myIORs.Clear() ;
myShapes.Clear() ;
return ;
}
//=======================================================================
// function : BufferLength()
// purpose :
//=======================================================================
unsigned int GEOM_Client::BufferLength()
{
return myIORs.Length() ;
}
//=======================================================================
// 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);
2003-05-12 21:09:12 +06:00
if (anIndex != 0) return S;
2003-05-12 21:09:12 +06:00
/******* in case of a MAIN GEOM::SHAPE ********/
if (aShape->IsMainShape()) {
S = Load(geom, aShape);
Bind(IOR, S);
return S;
}
2003-05-12 21:09:12 +06:00
/******* 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();
2004-12-01 15:39:14 +05:00
TopTools_IndexedMapOfShape anIndices;
TopExp::MapShapes(aMainShape, anIndices);
2003-05-12 21:09:12 +06:00
/* Case of only one subshape */
if (list->length() == 1 && list[0] > 0) {
S = anIndices.FindKey(list[0]);
}
2004-12-01 15:39:14 +05:00
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);
}
2004-12-01 15:39:14 +05:00
}
2003-05-12 21:09:12 +06:00
2004-12-01 15:39:14 +05:00
S = aCompound;
}
Bind(IOR, S);
return S;
}