geom/GEOMClient/GEOM_Client.cxx
2003-07-09 07:30:56 +00:00

254 lines
7.1 KiB
C++

// GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client
//
// 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
//
//
//
// File : GEOM_Client.cxx
// Author : Yves FRICAUD/Lucien PIGNOLONI
// Module : GEOM
// $Header$
using namespace std;
#include "GEOM_Client.hxx"
#include <SALOMEconfig.h>
#include "utilities.h"
#include CORBA_SERVER_HEADER(GEOM_Gen)
#include <BRep_Builder.hxx>
#include <BRepTools.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Compound.hxx>
#include <TCollection_AsciiString.hxx>
#include <TopExp_Explorer.hxx>
#include <TopAbs.hxx>
#include <TColStd_MapOfInteger.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopTools_MapOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
//=======================================================================
// function : Load()
// purpose :
//=======================================================================
static TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_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;
}
//=======================================================================
// function : Create()
// purpose :
//=======================================================================
GEOM_Client::GEOM_Client()
{
}
//=======================================================================
// 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;
}
//=======================================================================
// 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
//=======================================================================
void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& shapeIOR )
{
if( myIORs.IsEmpty() )
return ;
TopoDS_Shape S ;
Standard_Integer anIndex = Find( shapeIOR, S ) ;
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_Shape_ptr aShape )
{
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;
}