--- /dev/null
+using namespace std;
+// File : GEOM_Client.cxx
+// Created :
+// Author : Yves FRICAUD/Lucien PIGNOLONI
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE
+// $Header$
+
+#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;
+}
--- /dev/null
+// File : GEOM_Client.hxx
+// Created :
+// Author : Yves FRICAUD
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE
+// $Header$
+
+#ifndef _GEOM_Client_HeaderFile
+#define _GEOM_Client_HeaderFile
+
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(GEOM_Shape)
+#include CORBA_SERVER_HEADER(GEOM_Gen)
+#
+#ifndef _TColStd_SequenceOfAsciiString_HeaderFile
+#include <TColStd_SequenceOfAsciiString.hxx>
+#endif
+#ifndef _TopTools_SequenceOfShape_HeaderFile
+#include <TopTools_SequenceOfShape.hxx>
+#endif
+#ifndef _Standard_Integer_HeaderFile
+#include <Standard_Integer.hxx>
+#endif
+class TCollection_AsciiString;
+class TopoDS_Shape;
+
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+//=====================================================================
+// GEOM_Client : class definition
+//=====================================================================
+class GEOM_Client {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+ // Methods PUBLIC
+ //
+ Standard_EXPORT GEOM_Client();
+ Standard_EXPORT Standard_Integer Find( const TCollection_AsciiString& ShapeIOR, TopoDS_Shape& S ) ;
+ Standard_EXPORT void Bind( const TCollection_AsciiString& ShapeIOR, const TopoDS_Shape& S ) ;
+ Standard_EXPORT TopoDS_Shape GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_ptr aShape );
+ Standard_EXPORT void RemoveShapeFromBuffer( const TCollection_AsciiString& shapeIOR ) ;
+ Standard_EXPORT void ClearClientBuffer() ;
+ Standard_EXPORT unsigned int BufferLength() ;
+
+private:
+ // Fields PRIVATE
+ //
+ TColStd_SequenceOfAsciiString myIORs ;
+ TopTools_SequenceOfShape myShapes ;
+};
+
+
+#endif
--- /dev/null
+# -* Makefile *-
+#
+# Author : Patrick GOLDBRONN (CEA)
+# Date : 29/06/2001
+# $Header$
+#
+
+# source path
+top_srcdir=@top_srcdir@
+top_builddir=../..
+srcdir=@srcdir@
+VPATH=.:$(srcdir):${KERNEL_ROOT_DIR}/idl/salome
+
+
+@COMMENCE@
+
+# header files
+EXPORT_HEADERS = \
+ GEOM_Client.hxx
+
+# Libraries targets
+
+LIB = libGeometryClient.la
+LIB_SRC = GEOM_Client.cxx
+LIB_SERVER_IDL = SALOME_Component.idl SALOMEDS.idl SALOME_Exception.idl GEOM_Shape.idl GEOM_Gen.idl
+
+# Executables targets
+BIN =
+BIN_SRC =
+BIN_CLIENT_IDL =
+BIN_SERVER_IDL =
+
+# additionnal information to compil and link file
+CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
+CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome
+LDFLAGS += $(OCC_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome
+
+
+@CONCLUDE@
+
--- /dev/null
+-- File: GEOMDS.cdl
+-- Created: Fri Mar 16 12:16:40 2001
+-- Author: Yves FRICAUD
+-- <yfr@claquox.paris1.matra-dtv.fr>
+---Copyright: Matra Datavision 2001
+
+
+package GEOMDS
+
+ ---Purpose:
+
+uses
+ TDF,
+ TDocStd,
+ TDataStd,
+ TColStd,
+ TopoDS,
+ TCollection,
+ TNaming
+
+
+is
+ class Application;
+ class Commands;
+ class Explorer;
+
+
+ class DataMapOfIntegerTransient instantiates DataMap from
+TCollection(Integer from Standard, Transient from Standard, MapIntegerHasher
+from TColStd);
+
+end GEOMDS;
+
--- /dev/null
+// File : GEOMDS_Application.cdl
+// Created :
+// Author : Yves FRICAUD
+// Project : SALOME
+// Module : GEOM
+// Copyright : OPEN CASCADE
+// $Header$
+
+
+class Application from GEOMDS inherits Application from TDocStd
+
+ ---Purpose:
+
+uses
+ Label from TDF,
+ SequenceOfExtendedString from TColStd,
+ CString from Standard,
+ Document from TDocStd
+
+
+is
+
+ Create
+ returns mutable Application from GEOMDS;
+
+ Formats(me: mutable; Formats: out SequenceOfExtendedString from TColStd)
+ is redefined;
+
+ ResourcesName (me: mutable) returns CString from Standard;
+
+end Application;
--- /dev/null
+using namespace std;
+// File : GEOMDS_Application.cxx
+// Created :
+// Author : Yves FRICAUD
+// Project : SALOME
+// Module : GEOM
+// Copyright : OPEN CASCADE
+// $Header$
+
+
+#include "GEOMDS_Application.ixx"
+
+//=======================================================================
+//function : GEOMDS_Application
+//purpose :
+//=======================================================================
+
+GEOMDS_Application::GEOMDS_Application()
+{
+}
+
+
+//=======================================================================
+//function : Formats
+//purpose :
+//=======================================================================
+
+void GEOMDS_Application::Formats(TColStd_SequenceOfExtendedString& Formats)
+{
+ Formats.Append(TCollection_ExtendedString ("SALOME_GEOM"));
+}
+
+
+//=======================================================================
+//function : ResourcesName
+//purpose :
+//=======================================================================
+
+Standard_CString GEOMDS_Application::ResourcesName()
+{
+ return Standard_CString ("Resources");
+}
+
+
+
+
+
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#ifndef _GEOMDS_Application_HeaderFile
+#define _GEOMDS_Application_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Handle_GEOMDS_Application_HeaderFile
+#include <Handle_GEOMDS_Application.hxx>
+#endif
+
+#ifndef _TDocStd_Application_HeaderFile
+#include <TDocStd_Application.hxx>
+#endif
+#ifndef _Standard_CString_HeaderFile
+#include <Standard_CString.hxx>
+#endif
+class TColStd_SequenceOfExtendedString;
+
+
+class GEOMDS_Application : public TDocStd_Application {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOMDS_Application();
+Standard_EXPORT virtual void Formats(TColStd_SequenceOfExtendedString& Formats) ;
+Standard_EXPORT Standard_CString ResourcesName() ;
+Standard_EXPORT ~GEOMDS_Application();
+
+
+
+
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& GEOMDS_Application_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+
+
+};
+
+
+
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOMDS_Application.jxx"
+
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+GEOMDS_Application::~GEOMDS_Application() {}
+
+
+
+Standard_EXPORT Handle_Standard_Type& GEOMDS_Application_Type_()
+{
+
+ static Handle_Standard_Type aType1 = STANDARD_TYPE(TDocStd_Application);
+ if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TDocStd_Application);
+ static Handle_Standard_Type aType2 = STANDARD_TYPE(CDF_Application);
+ if ( aType2.IsNull()) aType2 = STANDARD_TYPE(CDF_Application);
+ static Handle_Standard_Type aType3 = STANDARD_TYPE(CDM_Application);
+ if ( aType3.IsNull()) aType3 = STANDARD_TYPE(CDM_Application);
+ static Handle_Standard_Type aType4 = STANDARD_TYPE(Standard_Transient);
+ if ( aType4.IsNull()) aType4 = STANDARD_TYPE(Standard_Transient);
+
+
+ static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,aType4,NULL};
+ static Handle_Standard_Type _aType = new Standard_Type("GEOMDS_Application",
+ sizeof(GEOMDS_Application),
+ 1,
+ (Standard_Address)_Ancestors,
+ (Standard_Address)NULL);
+
+ return _aType;
+}
+
+// DownCast method
+// allow safe downcasting
+
+
+const Handle(GEOMDS_Application) Handle(GEOMDS_Application)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+ Handle(GEOMDS_Application) _anOtherObject;
+
+ if (!AnObject.IsNull()) {
+ if (AnObject->IsKind(STANDARD_TYPE(GEOMDS_Application))) {
+ _anOtherObject = Handle(GEOMDS_Application)((Handle(GEOMDS_Application)&)AnObject);
+ }
+ }
+
+ return _anOtherObject ;
+}
+
+
+const Handle(Standard_Type)& GEOMDS_Application::DynamicType() const
+{
+ return STANDARD_TYPE(GEOMDS_Application) ;
+}
+Standard_Boolean GEOMDS_Application::IsKind(const Handle(Standard_Type)& AType) const
+{
+ return (STANDARD_TYPE(GEOMDS_Application) == AType || TDocStd_Application::IsKind(AType));
+}
+Handle_GEOMDS_Application::~Handle_GEOMDS_Application() {}
\ No newline at end of file
--- /dev/null
+#ifndef _TColStd_SequenceOfExtendedString_HeaderFile
+#include <TColStd_SequenceOfExtendedString.hxx>
+#endif
+#ifndef _GEOMDS_Application_HeaderFile
+#include "GEOMDS_Application.hxx"
+#endif
--- /dev/null
+-- File: GEOMDS_Commands.cdl
+-- Created: Fri Mar 16 12:21:51 2001
+-- Author: Yves FRICAUD
+-- <yfr@claquox.paris1.matra-dtv.fr>
+---Copyright: Matra Datavision 2001
+
+
+class Commands from GEOMDS
+
+ ---Purpose:
+
+uses
+ Label from TDF,
+ Shape from TopoDS,
+ ExtendedString from TCollection
+
+is
+ Create ( Main : Label from TDF) returns Commands from GEOMDS;
+
+ AddShape(me : in out; S : Shape from TopoDS;
+ Name : ExtendedString from TCollection)
+ returns Label from TDF;
+
+fields
+ myLab : Label from TDF;
+end Commands;
--- /dev/null
+using namespace std;
+// File : GeomDS_Commands.cxx
+// Created :
+// Author : Yves FRICAUD/Lucien PIGNOLONI
+// Project : SALOME
+// Module : GEOM
+// Copyright : OPEN CASCADE
+// $Header$
+
+#include "utilities.h"
+#include "GEOMDS_Commands.ixx"
+
+#include <TNaming_Builder.hxx>
+#include <TNaming_NamedShape.hxx>
+#include <TDataStd_Name.hxx>
+#include <TDataStd_Integer.hxx>
+#include <TDF_Reference.hxx>
+#include <TNaming_Tool.hxx>
+#include <TDF_ChildIterator.hxx>
+
+
+//=======================================================================
+//function : GEOMDS_Commands
+//purpose :
+//=======================================================================
+GEOMDS_Commands::GEOMDS_Commands(const TDF_Label& Main)
+ : myLab(Main)
+{
+}
+
+
+//=======================================================================
+// function : Generated()
+// purpose :
+//=======================================================================
+TDF_Label GEOMDS_Commands::Generated(const TopoDS_Shape& S,
+ const TCollection_ExtendedString& Name)
+{
+ TDF_Label NewLab = myLab.NewChild();
+ TNaming_Builder B(NewLab);
+ B.Generated(S);
+ TDataStd_Name::Set(NewLab,Name);
+ return NewLab;
+}
+
+
+
+//=======================================================================
+// function : Generated()
+// purpose :
+//=======================================================================
+TDF_Label GEOMDS_Commands::Generated(const TopoDS_Shape& S1,
+ const TopoDS_Shape& S2,
+ const TCollection_ExtendedString& Name)
+{
+ TDF_Label NewLab = myLab.NewChild();
+ TNaming_Builder B(NewLab);
+ B.Generated(S1,S2);
+ TDataStd_Name::Set(NewLab,Name);
+ return NewLab;
+}
+
+
+
+//=======================================================================
+// function : AddShape()
+// purpose :
+//=======================================================================
+TDF_Label GEOMDS_Commands::AddShape(const TopoDS_Shape& S,
+ const TCollection_ExtendedString& Name)
+{
+ TDF_Label NewLab = myLab.NewChild();
+ TNaming_Builder B(NewLab);
+ B.Select(S,S);
+ TDataStd_Name::Set(NewLab,Name);
+ return NewLab;
+}
+
+
+//=======================================================================
+// function : AddIndependentShape()
+// purpose : SAME than AddShape() : will be renamed later
+//=======================================================================
+TDF_Label GEOMDS_Commands::AddIndependentShape(const TopoDS_Shape& S,
+ const TCollection_AsciiString& nameIOR)
+{
+ TDF_Label NewLab = myLab.NewChild();
+ TNaming_Builder B(NewLab);
+ B.Select(S,S);
+ TDataStd_Name::Set(NewLab, nameIOR);
+ return NewLab;
+}
+
+
+//=======================================================================
+// function : AddDependentShape()
+// purpose :
+//=======================================================================
+TDF_Label GEOMDS_Commands::AddDependentShape(const TopoDS_Shape& S,
+ const TCollection_AsciiString& nameIOR,
+ const TDF_Label& mainLab)
+{
+ TDF_Label NewLab = myLab.NewChild();
+ TNaming_Builder B(NewLab);
+ B.Select(S,S);
+ TDataStd_Name::Set(NewLab, nameIOR);
+ /* NewLab has a reference attribute to mainLab (the main shape in fact) */
+ TDF_Reference::Set(NewLab, mainLab) ;
+ return NewLab;
+}
+
+
+
+//=======================================================================
+// function : AddConstructiveElement()
+// purpose :
+//=======================================================================
+TDF_Label GEOMDS_Commands::AddConstructiveElement(const TopoDS_Shape& S,
+ const TCollection_ExtendedString& nameIOR,
+ const GEOMDS_ConstructiveType& aType)
+{
+ TDF_Label NewLab = myLab.NewChild();
+ TNaming_Builder B(NewLab);
+ B.Select(S,S);
+ TDataStd_Name::Set(NewLab, nameIOR);
+ /* Add the Attribute Constructive Element coded with a TDataStd_Integer from an enum */
+ TDataStd_Integer::Set(NewLab, Standard_Integer(aType));
+ return NewLab;
+}
+
+
+//=======================================================================
+// function : AddIORNameAttribute()
+// purpose : Add attribute TDataStd_Name to a label
+// : this attribute represents the name/IOR of object
+// : Return false if attribute exist before
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::AddIORNameAttribute(const TDF_Label& aLabel,
+ const TCollection_ExtendedString& nameIOR)
+{
+ if( this->HasIOR(aLabel) )
+ return false ;
+ TDataStd_Name::Set(aLabel, nameIOR);
+ return true ;
+}
+
+
+
+//=======================================================================
+// function : IsConstructiveElement() 1/2
+// purpose : Return true if 'aLabel' is a constructive element
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::IsConstructiveElement(const TDF_Label& aLabel)
+{
+ Handle(TDataStd_Integer) anAttType ;
+ if( aLabel.FindAttribute(TDataStd_Integer::GetID(), anAttType ) )
+ return true ;
+ return false;
+}
+
+
+//=======================================================================
+// function : IsConstructiveElement() 2/2
+// purpose : Return true if 'aLabel' is a constructive element and return the
+// : topology ' returnTopo' and type 'returnType'
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::IsConstructiveElement(const TDF_Label& aLabel,
+ TopoDS_Shape& returnTopo,
+ GEOMDS_ConstructiveType& returnType)
+{
+ Handle(TDataStd_Integer) anAttType ;
+ Handle(TNaming_NamedShape) anAttTopo ;
+
+ if( aLabel.FindAttribute(TDataStd_Integer::GetID(), anAttType) && aLabel.FindAttribute(TNaming_NamedShape::GetID(), anAttTopo)) {
+
+ returnTopo = TNaming_Tool::GetShape(anAttTopo) ;
+ returnType = GEOMDS_ConstructiveType( anAttType->Get() ) ;
+ return true ;
+ }
+ return false;
+}
+
+
+//=======================================================================
+// function : GetShape()
+// purpose : return true and 'returnTopo' if a topology is found on 'aLabel'
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::GetShape(const TDF_Label& aLabel,
+ TopoDS_Shape& returnTopo)
+{
+ Handle(TNaming_NamedShape) anAttTopo ;
+ if( aLabel.FindAttribute(TNaming_NamedShape::GetID(), anAttTopo)) {
+ returnTopo = TNaming_Tool::GetShape(anAttTopo) ;
+ return true ;
+ }
+ return false;
+}
+
+
+//=======================================================================
+// function : IsDependentShape()
+// purpose : return true if the shape in the label is dependant (a sub shape)
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::IsDependentShape(const TDF_Label& aLabel)
+{
+ Handle(TDF_Reference) anAttRef ;
+ if( aLabel.FindAttribute(TDF_Reference::GetID(), anAttRef))
+ return true ;
+ return false;
+}
+
+
+
+//=======================================================================
+// function : GetMainShapeLabel()
+// purpose : return true if an attribute Reference is found for 'aLabel'
+// : so 'returnMainLabel' is defined. 'aLabel' is supposed to be
+// : a dependent object, otherwise return false.
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::GetMainShapeLabel(const TDF_Label& aLabel,
+ TDF_Label& returnMainLabel)
+{
+ Handle(TDF_Reference) anAttRef ;
+ if( aLabel.FindAttribute(TDF_Reference::GetID(), anAttRef)) {
+ returnMainLabel = anAttRef->Get() ;
+ return true ;
+ }
+ return false;
+}
+
+
+//=======================================================================
+// function : ClearAllIOR()
+// purpose : Clear all IOR from aLabel usually the main label.
+// : Useful before reconstruction after a load of a document.
+// : IOR is the attribute often called 'name' or 'nameIOR'
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::ClearAllIOR(const TDF_Label& aLabel)
+{
+ TDF_ChildIterator it;
+ Handle(TDataStd_Name) anAttName ;
+ bool notTested = false ;
+ for( it.Initialize(aLabel, Standard_False); it.More(); it.Next() ) {
+ TDF_Label L = it.Value() ;
+ if( L.FindAttribute(TDataStd_Name::GetID(), anAttName) ) {
+ notTested = L.ForgetAttribute(TDataStd_Name::GetID()) ;
+ }
+ if(notTested)
+ MESSAGE("in GEOMDS_Commands::ClearAllIOR : IOR CLEARED" )
+ }
+ return true ;
+}
+
+
+//=======================================================================
+// function : HasIOR()
+// purpose : Return true is 'aLabel' has an attribute IOR (nameIOR)
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::HasIOR(const TDF_Label& aLabel)
+{
+ Handle(TDataStd_Name) anAttName ;
+ if( !aLabel.FindAttribute(TDataStd_Name::GetID(), anAttName) )
+ return false ;
+ return true ;
+}
+
+//=======================================================================
+// function : ReturnNameIOR()
+// purpose : Return true is 'aLabel' has an attribute IOR (nameIOR)
+// : and define 'returnNameIOR'
+//=======================================================================
+Standard_Boolean GEOMDS_Commands::ReturnNameIOR(const TDF_Label& aLabel,
+ TCollection_ExtendedString& returnNameIOR)
+{
+ Handle(TDataStd_Name) anAttName ;
+ if( !aLabel.FindAttribute(TDataStd_Name::GetID(), anAttName) )
+ return false ;
+ else {
+ returnNameIOR = anAttName->Get() ;
+ return true ;
+ }
+}
--- /dev/null
+// File : GeomDS_Commands.hxx
+// Created :
+// Author : Yves FRICAUD/Lucien PIGNOLONI
+// Project : SALOME
+// Module : GEOM
+// Copyright : OPEN CASCADE
+// $Header$
+
+
+#ifndef _GEOMDS_Commands_HeaderFile
+#define _GEOMDS_Commands_HeaderFile
+
+#ifndef _TDF_Label_HeaderFile
+#include <TDF_Label.hxx>
+#endif
+class TDF_Label;
+class TopoDS_Shape;
+class TCollection_ExtendedString;
+
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+
+
+//============================================================================
+// class : GEOMDS_Commands
+// purpose :
+//============================================================================
+class GEOMDS_Commands {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+ // inline void operator delete(void *anAddress, size_t size)
+ // {
+ // if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+ // }
+ // Methods PUBLIC
+ //
+
+ // used for specific entities
+ enum GEOMDS_ConstructiveType { VECTOR, LINE, PLANE } ;
+
+ // Methods to add or create items in the data structure
+ Standard_EXPORT GEOMDS_Commands(const TDF_Label& Main);
+ Standard_EXPORT TDF_Label AddShape(const TopoDS_Shape& S,
+ const TCollection_ExtendedString& Name) ;
+
+ Standard_EXPORT TDF_Label Generated(const TopoDS_Shape& S,
+ const TCollection_ExtendedString& Name) ;
+ Standard_EXPORT TDF_Label Generated(const TopoDS_Shape& S1,
+ const TopoDS_Shape& S2,
+ const TCollection_ExtendedString& Name) ;
+
+ /* Shapes construction */
+ Standard_EXPORT TDF_Label AddIndependentShape(const TopoDS_Shape& S,
+ const TCollection_AsciiString& nameIOR) ;
+ Standard_EXPORT TDF_Label AddDependentShape(const TopoDS_Shape& S,
+ const TCollection_AsciiString& nameIOR,
+ const TDF_Label& mainLab) ;
+ Standard_EXPORT TDF_Label AddConstructiveElement(const TopoDS_Shape& S,
+ const TCollection_ExtendedString& nameIOR,
+ const GEOMDS_ConstructiveType& aType);
+
+ Standard_EXPORT Standard_Boolean AddIORNameAttribute(const TDF_Label& aLabel,
+ const TCollection_ExtendedString& nameIOR) ;
+
+ /* Shapes query */
+
+ Standard_EXPORT Standard_Boolean IsConstructiveElement(const TDF_Label& aLabel) ;
+
+ Standard_EXPORT Standard_Boolean IsConstructiveElement(const TDF_Label& aLabel,
+ TopoDS_Shape& returnTopo,
+ GEOMDS_ConstructiveType& returnType) ;
+
+ Standard_EXPORT Standard_Boolean GetShape(const TDF_Label& aLabel,
+ TopoDS_Shape& returnTopo) ;
+
+ Standard_EXPORT Standard_Boolean IsDependentShape(const TDF_Label& aLabel) ;
+
+ Standard_EXPORT Standard_Boolean GetMainShapeLabel(const TDF_Label& aLabel,
+ TDF_Label& returnMainLabel) ;
+
+ Standard_EXPORT Standard_Boolean ClearAllIOR(const TDF_Label& aLabel) ;
+
+ Standard_EXPORT Standard_Boolean HasIOR(const TDF_Label& aLabel) ;
+
+ Standard_EXPORT Standard_Boolean ReturnNameIOR(const TDF_Label& aLabel,
+ TCollection_ExtendedString& returnNameIOR) ;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+ // Fields PROTECTED
+ //
+
+private:
+
+ // Methods PRIVATE
+ //
+
+ // Fields PRIVATE
+ //
+
+ TDF_Label myLab;
+
+};
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+// File generated by CPPExt (Value)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOMDS_Commands.jxx"
+
+
+
+
--- /dev/null
+#ifndef _TDF_Label_HeaderFile
+#include <TDF_Label.hxx>
+#endif
+#ifndef _TopoDS_Shape_HeaderFile
+#include <TopoDS_Shape.hxx>
+#endif
+#ifndef _TCollection_ExtendedString_HeaderFile
+#include <TCollection_ExtendedString.hxx>
+#endif
+#ifndef _GEOMDS_Commands_HeaderFile
+#include "GEOMDS_Commands.hxx"
+#endif
\ No newline at end of file
--- /dev/null
+// File generated by CPPExt (Value)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient_HeaderFile
+#define _GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient_HeaderFile
+
+#ifndef _TCollection_BasicMapIterator_HeaderFile
+#include <TCollection_BasicMapIterator.hxx>
+#endif
+#ifndef _Standard_Integer_HeaderFile
+#include <Standard_Integer.hxx>
+#endif
+#ifndef _Handle_Standard_Transient_HeaderFile
+#include <Handle_Standard_Transient.hxx>
+#endif
+#ifndef _Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+#include "Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx"
+#endif
+class Standard_NoSuchObject;
+class Standard_Transient;
+class TColStd_MapIntegerHasher;
+class GEOMDS_DataMapOfIntegerTransient;
+class GEOMDS_DataMapNodeOfDataMapOfIntegerTransient;
+
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+class GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient : public TCollection_BasicMapIterator {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient();
+Standard_EXPORT GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient(const GEOMDS_DataMapOfIntegerTransient& aMap);
+Standard_EXPORT void Initialize(const GEOMDS_DataMapOfIntegerTransient& aMap) ;
+Standard_EXPORT const Standard_Integer& Key() const;
+Standard_EXPORT const Handle_Standard_Transient& Value() const;
+
+
+
+
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+
+
+};
+
+
+
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+using namespace std;
+// File generated by CPPExt (Value)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient.hxx"
+
+#ifndef _Standard_NoSuchObject_HeaderFile
+#include <Standard_NoSuchObject.hxx>
+#endif
+#ifndef _Standard_Transient_HeaderFile
+#include <Standard_Transient.hxx>
+#endif
+#ifndef _TColStd_MapIntegerHasher_HeaderFile
+#include <TColStd_MapIntegerHasher.hxx>
+#endif
+#ifndef _GEOMDS_DataMapOfIntegerTransient_HeaderFile
+#include "GEOMDS_DataMapOfIntegerTransient.hxx"
+#endif
+#ifndef _GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+#include "GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx"
+#endif
+
+
+#define TheKey Standard_Integer
+#define TheKey_hxx <Standard_Integer.hxx>
+#define TheItem Handle_Standard_Transient
+#define TheItem_hxx <Standard_Transient.hxx>
+#define Hasher TColStd_MapIntegerHasher
+#define Hasher_hxx <TColStd_MapIntegerHasher.hxx>
+#define TCollection_DataMapNode GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_hxx <GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx>
+#define TCollection_DataMapIterator GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient
+#define TCollection_DataMapIterator_hxx <GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient.hxx>
+#define Handle_TCollection_DataMapNode Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_Type_() GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_Type_()
+#define TCollection_DataMap GEOMDS_DataMapOfIntegerTransient
+#define TCollection_DataMap_hxx <GEOMDS_DataMapOfIntegerTransient.hxx>
+#include <TCollection_DataMapIterator.gxx>
+
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#ifndef _GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+#define _GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+#include "Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx"
+#endif
+
+#ifndef _Standard_Integer_HeaderFile
+#include <Standard_Integer.hxx>
+#endif
+#ifndef _Handle_Standard_Transient_HeaderFile
+#include <Handle_Standard_Transient.hxx>
+#endif
+#ifndef _TCollection_MapNode_HeaderFile
+#include <TCollection_MapNode.hxx>
+#endif
+#ifndef _TCollection_MapNodePtr_HeaderFile
+#include <TCollection_MapNodePtr.hxx>
+#endif
+class Standard_Transient;
+class TColStd_MapIntegerHasher;
+class GEOMDS_DataMapOfIntegerTransient;
+class GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient;
+
+
+class GEOMDS_DataMapNodeOfDataMapOfIntegerTransient : public TCollection_MapNode {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT inline GEOMDS_DataMapNodeOfDataMapOfIntegerTransient(const Standard_Integer& K,const Handle(Standard_Transient)& I,const TCollection_MapNodePtr& n);
+Standard_EXPORT inline Standard_Integer& Key() const;
+Standard_EXPORT inline Handle_Standard_Transient& Value() const;
+Standard_EXPORT ~GEOMDS_DataMapNodeOfDataMapOfIntegerTransient();
+
+
+
+
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+Standard_Integer myKey;
+Handle_Standard_Transient myValue;
+
+
+};
+
+#define TheKey Standard_Integer
+#define TheKey_hxx <Standard_Integer.hxx>
+#define TheItem Handle_Standard_Transient
+#define TheItem_hxx <Standard_Transient.hxx>
+#define Hasher TColStd_MapIntegerHasher
+#define Hasher_hxx <TColStd_MapIntegerHasher.hxx>
+#define TCollection_DataMapNode GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_hxx <GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx>
+#define TCollection_DataMapIterator GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient
+#define TCollection_DataMapIterator_hxx <GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient.hxx>
+#define Handle_TCollection_DataMapNode Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_Type_() GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_Type_()
+#define TCollection_DataMap GEOMDS_DataMapOfIntegerTransient
+#define TCollection_DataMap_hxx <GEOMDS_DataMapOfIntegerTransient.hxx>
+
+#include <TCollection_DataMapNode.lxx>
+
+#undef TheKey
+#undef TheKey_hxx
+#undef TheItem
+#undef TheItem_hxx
+#undef Hasher
+#undef Hasher_hxx
+#undef TCollection_DataMapNode
+#undef TCollection_DataMapNode_hxx
+#undef TCollection_DataMapIterator
+#undef TCollection_DataMapIterator_hxx
+#undef Handle_TCollection_DataMapNode
+#undef TCollection_DataMapNode_Type_
+#undef TCollection_DataMap
+#undef TCollection_DataMap_hxx
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+using namespace std;
+// File generated by CPPExt (Transient)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx"
+
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+#ifndef _Standard_Transient_HeaderFile
+#include <Standard_Transient.hxx>
+#endif
+#ifndef _TColStd_MapIntegerHasher_HeaderFile
+#include <TColStd_MapIntegerHasher.hxx>
+#endif
+#ifndef _GEOMDS_DataMapOfIntegerTransient_HeaderFile
+#include "GEOMDS_DataMapOfIntegerTransient.hxx"
+#endif
+#ifndef _GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient_HeaderFile
+#include "GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient.hxx"
+#endif
+GEOMDS_DataMapNodeOfDataMapOfIntegerTransient::~GEOMDS_DataMapNodeOfDataMapOfIntegerTransient() {}
+
+
+
+Standard_EXPORT Handle_Standard_Type& GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_Type_()
+{
+
+ static Handle_Standard_Type aType1 = STANDARD_TYPE(TCollection_MapNode);
+ if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TCollection_MapNode);
+ static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
+ if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
+ static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
+ if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
+
+
+ static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
+ static Handle_Standard_Type _aType = new Standard_Type("GEOMDS_DataMapNodeOfDataMapOfIntegerTransient",
+ sizeof(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient),
+ 1,
+ (Standard_Address)_Ancestors,
+ (Standard_Address)NULL);
+
+ return _aType;
+}
+
+
+// DownCast method
+// allow safe downcasting
+//
+const Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient) Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+ Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient) _anOtherObject;
+
+ if (!AnObject.IsNull()) {
+ if (AnObject->IsKind(STANDARD_TYPE(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient))) {
+ _anOtherObject = Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)((Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)&)AnObject);
+ }
+ }
+
+ return _anOtherObject ;
+}
+const Handle(Standard_Type)& GEOMDS_DataMapNodeOfDataMapOfIntegerTransient::DynamicType() const
+{
+ return STANDARD_TYPE(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient) ;
+}
+Standard_Boolean GEOMDS_DataMapNodeOfDataMapOfIntegerTransient::IsKind(const Handle(Standard_Type)& AType) const
+{
+ return (STANDARD_TYPE(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient) == AType || TCollection_MapNode::IsKind(AType));
+}
+Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient::~Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient() {}
+#define TheKey Standard_Integer
+#define TheKey_hxx <Standard_Integer.hxx>
+#define TheItem Handle_Standard_Transient
+#define TheItem_hxx <Standard_Transient.hxx>
+#define Hasher TColStd_MapIntegerHasher
+#define Hasher_hxx <TColStd_MapIntegerHasher.hxx>
+#define TCollection_DataMapNode GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_hxx <GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx>
+#define TCollection_DataMapIterator GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient
+#define TCollection_DataMapIterator_hxx <GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient.hxx>
+#define Handle_TCollection_DataMapNode Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_Type_() GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_Type_()
+#define TCollection_DataMap GEOMDS_DataMapOfIntegerTransient
+#define TCollection_DataMap_hxx <GEOMDS_DataMapOfIntegerTransient.hxx>
+#include <TCollection_DataMapNode.gxx>
+
--- /dev/null
+// File generated by CPPExt (Value)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _GEOMDS_DataMapOfIntegerTransient_HeaderFile
+#define _GEOMDS_DataMapOfIntegerTransient_HeaderFile
+
+#ifndef _TCollection_BasicMap_HeaderFile
+#include <TCollection_BasicMap.hxx>
+#endif
+#ifndef _Standard_Integer_HeaderFile
+#include <Standard_Integer.hxx>
+#endif
+#ifndef _Handle_Standard_Transient_HeaderFile
+#include <Handle_Standard_Transient.hxx>
+#endif
+#ifndef _Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+#include "Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx"
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+class Standard_DomainError;
+class Standard_NoSuchObject;
+class Standard_Transient;
+class TColStd_MapIntegerHasher;
+class GEOMDS_DataMapNodeOfDataMapOfIntegerTransient;
+class GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient;
+
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+class GEOMDS_DataMapOfIntegerTransient : public TCollection_BasicMap {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOMDS_DataMapOfIntegerTransient(const Standard_Integer NbBuckets = 1);
+Standard_EXPORT GEOMDS_DataMapOfIntegerTransient& Assign(const GEOMDS_DataMapOfIntegerTransient& Other) ;
+GEOMDS_DataMapOfIntegerTransient& operator =(const GEOMDS_DataMapOfIntegerTransient& Other)
+{
+ return Assign(Other);
+}
+
+Standard_EXPORT void ReSize(const Standard_Integer NbBuckets) ;
+Standard_EXPORT void Clear() ;
+~GEOMDS_DataMapOfIntegerTransient()
+{
+ Clear();
+}
+
+Standard_EXPORT Standard_Boolean Bind(const Standard_Integer& K,const Handle(Standard_Transient)& I) ;
+Standard_EXPORT Standard_Boolean IsBound(const Standard_Integer& K) const;
+Standard_EXPORT Standard_Boolean UnBind(const Standard_Integer& K) ;
+Standard_EXPORT const Handle_Standard_Transient& Find(const Standard_Integer& K) const;
+ const Handle_Standard_Transient& operator()(const Standard_Integer& K) const
+{
+ return Find(K);
+}
+
+Standard_EXPORT Handle_Standard_Transient& ChangeFind(const Standard_Integer& K) ;
+ Handle_Standard_Transient& operator()(const Standard_Integer& K)
+{
+ return ChangeFind(K);
+}
+
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+
+
+private:
+
+ // Methods PRIVATE
+ //
+ Standard_EXPORT GEOMDS_DataMapOfIntegerTransient(const GEOMDS_DataMapOfIntegerTransient& Other);
+
+
+// Fields PRIVATE
+//
+
+
+};
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+using namespace std;
+// File generated by CPPExt (Value)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOMDS_DataMapOfIntegerTransient.hxx"
+
+#ifndef _Standard_DomainError_HeaderFile
+#include <Standard_DomainError.hxx>
+#endif
+#ifndef _Standard_NoSuchObject_HeaderFile
+#include <Standard_NoSuchObject.hxx>
+#endif
+#ifndef _Standard_Transient_HeaderFile
+#include <Standard_Transient.hxx>
+#endif
+#ifndef _TColStd_MapIntegerHasher_HeaderFile
+#include <TColStd_MapIntegerHasher.hxx>
+#endif
+#ifndef _GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+#include "GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx"
+#endif
+#ifndef _GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient_HeaderFile
+#include "GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient.hxx"
+#endif
+
+
+#define TheKey Standard_Integer
+#define TheKey_hxx <Standard_Integer.hxx>
+#define TheItem Handle_Standard_Transient
+#define TheItem_hxx <Standard_Transient.hxx>
+#define Hasher TColStd_MapIntegerHasher
+#define Hasher_hxx <TColStd_MapIntegerHasher.hxx>
+#define TCollection_DataMapNode GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_hxx <GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx>
+#define TCollection_DataMapIterator GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient
+#define TCollection_DataMapIterator_hxx <GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient.hxx>
+#define Handle_TCollection_DataMapNode Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient
+#define TCollection_DataMapNode_Type_() GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_Type_()
+#define TCollection_DataMap GEOMDS_DataMapOfIntegerTransient
+#define TCollection_DataMap_hxx <GEOMDS_DataMapOfIntegerTransient.hxx>
+#include <TCollection_DataMap.gxx>
+
--- /dev/null
+// File : GEOMDS_Explorer.cdl
+// Created :
+// Author : Yves FRICAUD
+// Project : SALOME
+// Module : GEOM
+// Copyright : OPEN CASCADE
+// $Header$
+
+class Explorer from GEOMDS
+
+ ---Purpose:
+
+uses
+ ChildIterator from TDF,
+ Label from TDF,
+ ExtendedString from TCollection,
+ Shape from TopoDS
+
+
+is
+ Create ( Main : Label from TDF) returns Explorer from GEOMDS;
+
+ More(me : in out) returns Boolean from Standard;
+
+ Next(me : in out);
+
+ Shape(me)returns Shape from TopoDS;
+
+ Name(me) returns ExtendedString from TCollection;
+
+fields
+ myChildIterator : ChildIterator from TDF;
+end Explorer;
--- /dev/null
+using namespace std;
+// File : GEOMDS_Explorer.cxx
+// Created :
+// Author : Yves FRICAUD
+// Project : SALOME
+// Module : GEOM
+// Copyright : OPEN CASCADE
+// $Header$
+
+
+#include "GEOMDS_Explorer.ixx"
+
+#include <TNaming_NamedShape.hxx>
+#include <TNaming_Tool.hxx>
+#include <TDataStd_Name.hxx>
+
+
+//=======================================================================
+//function : GEOMDS_Explorer
+//purpose :
+//=======================================================================
+
+GEOMDS_Explorer::GEOMDS_Explorer(const TDF_Label& Main) : myChildIterator(Main)
+{
+}
+
+
+//=======================================================================
+//function : const;
+//purpose :
+//=======================================================================
+
+Standard_Boolean GEOMDS_Explorer::More()
+{
+ if (!myChildIterator.More())
+ return 0;
+ Handle(TDataStd_Name) Att;
+ Handle(TNaming_NamedShape) NS;
+ TDF_Label L = myChildIterator.Value();
+ if (( L.FindAttribute(TDataStd_Name::GetID(),Att) ) ||
+ (L.FindAttribute(TNaming_NamedShape::GetID(),NS))
+ )
+ return 1;
+ // myChildIterator.Next();
+ // More();
+ return 0;
+ /*
+ if (!myChildIterator.More())
+ return 0;
+ TDF_Label L = myChildIterator.Value();
+ Handle(TNaming_NamedShape) NS;
+ for (TDF_ChildIterator it2(L); it2.More(); it2.Next()) {
+ TDF_Label L2 = it2.Value();
+ if (L2.FindAttribute(TNaming_NamedShape::GetID(),NS)) {
+ return 1;
+ }
+ myChildIterator.Next();
+ }
+ return 0;
+ */
+}
+
+
+//=======================================================================
+//function : Next
+//purpose :
+//=======================================================================
+
+void GEOMDS_Explorer::Next()
+{
+ myChildIterator.Next();
+}
+
+
+//=======================================================================
+//function : Shape
+//purpose :
+//=======================================================================
+
+TopoDS_Shape GEOMDS_Explorer::Shape() const
+{
+ Handle(TNaming_NamedShape) NS;
+ TDF_Label L = myChildIterator.Value();
+ L.FindAttribute(TNaming_NamedShape::GetID(),NS);
+ TopoDS_Shape S = TNaming_Tool::GetShape(NS);
+ return S;
+}
+
+//=======================================================================
+//function : Name
+//purpose :
+//=======================================================================
+
+TCollection_ExtendedString GEOMDS_Explorer::Name() const
+{
+ TDF_Label L = myChildIterator.Value();
+ Handle(TDataStd_Name) Att;
+ if ( L.FindAttribute(TDataStd_Name::GetID(),Att) )
+ //L.FindAttribute(TDataStd_Name::GetID(),Att);
+ return Att->Get();
+ else
+ return TCollection_ExtendedString();
+}
+
+
+
+
--- /dev/null
+// File generated by CPPExt (Value)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _GEOMDS_Explorer_HeaderFile
+#define _GEOMDS_Explorer_HeaderFile
+
+#ifndef _TDF_ChildIterator_HeaderFile
+#include <TDF_ChildIterator.hxx>
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+class TDF_Label;
+class TopoDS_Shape;
+class TCollection_ExtendedString;
+
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+
+class GEOMDS_Explorer {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOMDS_Explorer(const TDF_Label& Main);
+Standard_EXPORT Standard_Boolean More() ;
+Standard_EXPORT void Next() ;
+Standard_EXPORT TopoDS_Shape Shape() const;
+Standard_EXPORT TCollection_ExtendedString Name() const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+ // Fields PROTECTED
+ //
+
+
+private:
+
+ // Methods PRIVATE
+ //
+
+ // Fields PRIVATE
+ //
+TDF_ChildIterator myChildIterator;
+
+
+};
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+#endif
--- /dev/null
+// File generated by CPPExt (Value)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOMDS_Explorer.jxx"
+
+
+
+
--- /dev/null
+#ifndef _TDF_Label_HeaderFile
+#include <TDF_Label.hxx>
+#endif
+#ifndef _TopoDS_Shape_HeaderFile
+#include <TopoDS_Shape.hxx>
+#endif
+#ifndef _TCollection_ExtendedString_HeaderFile
+#include <TCollection_ExtendedString.hxx>
+#endif
+#ifndef _GEOMDS_Explorer_HeaderFile
+#include "GEOMDS_Explorer.hxx"
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _Handle_GEOMDS_Application_HeaderFile
+#define _Handle_GEOMDS_Application_HeaderFile
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Handle_TDocStd_Application_HeaderFile
+#include <Handle_TDocStd_Application.hxx>
+#endif
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(TDocStd_Application);
+class GEOMDS_Application;
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(SimpleOCAF_Application);
+
+class Handle(GEOMDS_Application) : public Handle(TDocStd_Application) {
+ public:
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ Handle(GEOMDS_Application)():Handle(TDocStd_Application)() {}
+ Handle(GEOMDS_Application)(const Handle(GEOMDS_Application)& aHandle) : Handle(TDocStd_Application)(aHandle)
+ {
+ }
+
+ Handle(GEOMDS_Application)(const GEOMDS_Application* anItem) : Handle(TDocStd_Application)((TDocStd_Application *)anItem)
+ {
+ }
+
+ Handle(GEOMDS_Application)& operator=(const Handle(GEOMDS_Application)& aHandle)
+ {
+ Assign(aHandle.Access());
+ return *this;
+ }
+
+ Handle(GEOMDS_Application)& operator=(const GEOMDS_Application* anItem)
+ {
+ Assign((Standard_Transient *)anItem);
+ return *this;
+ }
+
+ GEOMDS_Application* operator->()
+ {
+ return (GEOMDS_Application *)ControlAccess();
+ }
+
+ GEOMDS_Application* operator->() const
+ {
+ return (GEOMDS_Application *)ControlAccess();
+ }
+
+ Standard_EXPORT ~Handle(GEOMDS_Application)();
+
+ Standard_EXPORT static const Handle(GEOMDS_Application) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+#define _Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_HeaderFile
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Handle_TCollection_MapNode_HeaderFile
+#include <Handle_TCollection_MapNode.hxx>
+#endif
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(TCollection_MapNode);
+class GEOMDS_DataMapNodeOfDataMapOfIntegerTransient;
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient);
+
+class Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient) : public Handle(TCollection_MapNode) {
+ public:
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)():Handle(TCollection_MapNode)() {}
+ Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)(const Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)& aHandle) : Handle(TCollection_MapNode)(aHandle)
+ {
+ }
+
+ Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)(const GEOMDS_DataMapNodeOfDataMapOfIntegerTransient* anItem) : Handle(TCollection_MapNode)((TCollection_MapNode *)anItem)
+ {
+ }
+
+ Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)& operator=(const Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)& aHandle)
+ {
+ Assign(aHandle.Access());
+ return *this;
+ }
+
+ Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)& operator=(const GEOMDS_DataMapNodeOfDataMapOfIntegerTransient* anItem)
+ {
+ Assign((Standard_Transient *)anItem);
+ return *this;
+ }
+
+ GEOMDS_DataMapNodeOfDataMapOfIntegerTransient* operator->()
+ {
+ return (GEOMDS_DataMapNodeOfDataMapOfIntegerTransient *)ControlAccess();
+ }
+
+ GEOMDS_DataMapNodeOfDataMapOfIntegerTransient* operator->() const
+ {
+ return (GEOMDS_DataMapNodeOfDataMapOfIntegerTransient *)ControlAccess();
+ }
+
+ Standard_EXPORT ~Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient)();
+
+ Standard_EXPORT static const Handle(GEOMDS_DataMapNodeOfDataMapOfIntegerTransient) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+#endif
--- /dev/null
+# -* Makefile *-
+#
+# Author : Patrick GOLDBRONN (CEA)
+# Date : 29/06/2001
+# $Header$
+#
+
+# source path
+top_srcdir=@top_srcdir@
+top_builddir=../..
+srcdir=@srcdir@
+VPATH=.:$(srcdir):$(top_srcdir)/idl:$(top_builddir)/idl
+
+
+@COMMENCE@
+
+# Libraries targets
+
+LIB = libGeometryDS.la
+LIB_SRC = GEOMDS_Application.cxx \
+ GEOMDS_Commands.cxx \
+ GEOMDS_Explorer.cxx \
+ GEOMDS_DataMapIteratorOfDataMapOfIntegerTransient_0.cxx \
+ GEOMDS_DataMapNodeOfDataMapOfIntegerTransient_0.cxx \
+ GEOMDS_DataMapOfIntegerTransient_0.cxx
+LIB_CLIENT_IDL =
+LIB_SERVER_IDL =
+
+# Executables targets
+BIN =
+BIN_SRC =
+BIN_CLIENT_IDL =
+BIN_SERVER_IDL =
+
+# header files
+EXPORT_HEADERS= GEOMDS_Application.hxx \
+ GEOMDS_DataMapOfIntegerTransient.hxx \
+ Handle_GEOMDS_DataMapNodeOfDataMapOfIntegerTransient.hxx \
+ Handle_GEOMDS_Application.hxx \
+ GEOMDS_Commands.hxx \
+ GEOMDS_Explorer.hxx
+
+# additionnal information to compil and link file
+CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
+CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome
+LDFLAGS += $(OCC_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome
+
+# additional file to be cleaned
+MOSTLYCLEAN =
+CLEAN =
+DISTCLEAN =
+
+@CONCLUDE@
+
--- /dev/null
+using namespace std;
+// File : GEOM_EdgeFilter.cxx
+// Created : Fri Dec 07 09:57:24 2001
+// Author : Nicolas REJNERI
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE
+// $Header$
+
+#include "GEOM_EdgeFilter.ixx"
+#include "GEOM_Client.hxx"
+
+#include "SALOME_InteractiveObject.hxx"
+#include "GEOM_InteractiveObject.hxx"
+#include "GEOM_ShapeTypeFilter.hxx"
+#include "SALOME_TypeFilter.hxx"
+
+#include "utilities.h"
+#include "QAD_Application.h"
+#include "QAD_Desktop.h"
+#include "QAD_Study.h"
+
+// Open CASCADE Includes
+#include <BRepAdaptor_Curve.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS.hxx>
+#include <TopAbs.hxx>
+
+
+static GEOM_Client ShapeReader;
+
+
+/*!
+ enumeration TypeOfEdge is AnyEdge,Line,Circle;
+*/
+GEOM_EdgeFilter::GEOM_EdgeFilter(const StdSelect_TypeOfEdge Edge,
+ GEOM::GEOM_Gen_ptr geom)
+{
+ myKind = Edge;
+ myComponentGeom = GEOM::GEOM_Gen::_narrow(geom);
+}
+
+Standard_Boolean GEOM_EdgeFilter::IsOk(const Handle(SALOME_InteractiveObject)& anObj) const
+{
+ Handle(SALOME_TypeFilter) GeomFilter = new SALOME_TypeFilter( "GEOM" );
+ if ( !GeomFilter->IsOk(anObj) )
+ return false;
+
+ Handle(GEOM_ShapeTypeFilter) GeomShapeTypeFilter = new GEOM_ShapeTypeFilter( TopAbs_EDGE, myComponentGeom );
+ if ( !GeomShapeTypeFilter->IsOk(anObj) )
+ return false;
+
+ if ( anObj->hasEntry() ) {
+ QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
+ SALOMEDS::Study_var aStudy = ActiveStudy->getStudyDocument();
+ SALOMEDS::SObject_var obj = aStudy->FindObjectID( anObj->getEntry() );
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributeIOR_var anIOR;
+ if ( !obj->_is_nil() ) {
+ if (obj->FindAttribute(anAttr, "AttributeIOR")) {
+ anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
+ GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( anIOR->Value() );
+ if ( aShape->_is_nil() )
+ return false;
+
+ TopoDS_Shape Shape = ShapeReader.GetShape( myComponentGeom, aShape );
+ if ( Shape.IsNull() )
+ return false;
+
+ switch (myKind) {
+ case StdSelect_AnyEdge:
+ return Standard_True;
+ case StdSelect_Line:
+ {
+ BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
+ return (curv.GetType() == GeomAbs_Line);
+ }
+ break;
+ case StdSelect_Circle:
+ BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
+ return (curv.GetType() == GeomAbs_Circle);
+ }
+ }
+ }
+ }
+
+ if ( anObj->IsInstance(STANDARD_TYPE(GEOM_InteractiveObject)) ) {
+ Handle(GEOM_InteractiveObject) GObject =
+ Handle(GEOM_InteractiveObject)::DownCast(anObj);
+
+ GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( GObject->getIOR() );
+ if ( aShape->_is_nil() )
+ return false;
+
+ TopoDS_Shape Shape = ShapeReader.GetShape( myComponentGeom, aShape );
+ if ( Shape.IsNull() )
+ return false;
+
+ switch (myKind) {
+ case StdSelect_AnyEdge:
+ return Standard_True;
+ case StdSelect_Line:
+ {
+ BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
+ return (curv.GetType() == GeomAbs_Line);
+ }
+ break;
+ case StdSelect_Circle:
+ BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
+ return (curv.GetType() == GeomAbs_Circle);
+ }
+ }
+ return false;
+}
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#ifndef _GEOM_EdgeFilter_HeaderFile
+#define _GEOM_EdgeFilter_HeaderFile
+
+#ifndef _Handle_GEOM_EdgeFilter_HeaderFile
+#include "Handle_GEOM_EdgeFilter.hxx"
+#endif
+
+#include "SALOME_InteractiveObject.hxx"
+#include "SALOME_Filter.hxx"
+
+// IDL Headers
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(GEOM_Shape)
+#include CORBA_SERVER_HEADER(GEOM_Gen)
+#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
+
+// Open CASCADE Includes
+#include <Standard.hxx>
+#include <TopAbs.hxx>
+#include <TopoDS_Shape.hxx>
+#include <StdSelect_TypeOfEdge.hxx>
+
+class GEOM_EdgeFilter : public SALOME_Filter {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOM_EdgeFilter(const StdSelect_TypeOfEdge Edge,
+ GEOM::GEOM_Gen_ptr geom);
+
+Standard_EXPORT virtual Standard_Boolean IsOk(const Handle(SALOME_InteractiveObject)& anobj) const;
+Standard_EXPORT ~GEOM_EdgeFilter();
+
+
+
+
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& GEOM_EdgeFilter_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+StdSelect_TypeOfEdge myKind;
+GEOM::GEOM_Gen_var myComponentGeom;
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+
+
+};
+
+
+
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOM_EdgeFilter.jxx"
+
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+GEOM_EdgeFilter::~GEOM_EdgeFilter() {}
+
+
+
+Standard_EXPORT Handle_Standard_Type& GEOM_EdgeFilter_Type_()
+{
+
+ static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_Filter);
+ if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_Filter);
+ static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
+ if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
+ static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
+ if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
+
+
+ static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
+ static Handle_Standard_Type _aType = new Standard_Type("GEOM_EdgeFilter",
+ sizeof(GEOM_EdgeFilter),
+ 1,
+ (Standard_Address)_Ancestors,
+ (Standard_Address)NULL);
+
+ return _aType;
+}
+
+
+// DownCast method
+// allow safe downcasting
+//
+const Handle(GEOM_EdgeFilter) Handle(GEOM_EdgeFilter)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+ Handle(GEOM_EdgeFilter) _anOtherObject;
+
+ if (!AnObject.IsNull()) {
+ if (AnObject->IsKind(STANDARD_TYPE(GEOM_EdgeFilter))) {
+ _anOtherObject = Handle(GEOM_EdgeFilter)((Handle(GEOM_EdgeFilter)&)AnObject);
+ }
+ }
+
+ return _anOtherObject ;
+}
+const Handle(Standard_Type)& GEOM_EdgeFilter::DynamicType() const
+{
+ return STANDARD_TYPE(GEOM_EdgeFilter) ;
+}
+Standard_Boolean GEOM_EdgeFilter::IsKind(const Handle(Standard_Type)& AType) const
+{
+ return (STANDARD_TYPE(GEOM_EdgeFilter) == AType || SALOME_Filter::IsKind(AType));
+}
+Handle_GEOM_EdgeFilter::~Handle_GEOM_EdgeFilter() {}
+
--- /dev/null
+#ifndef _GEOM_EdgeFilter_HeaderFile
+#include "GEOM_EdgeFilter.hxx"
+#endif
--- /dev/null
+using namespace std;
+// File : GEOM_FaceFilter.cxx
+// Created : Fri Dec 07 09:57:24 2001
+// Author : Nicolas REJNERI
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE
+// $Header$
+
+#include "GEOM_FaceFilter.ixx"
+#include "GEOM_Client.hxx"
+
+#include "SALOME_InteractiveObject.hxx"
+#include "GEOM_InteractiveObject.hxx"
+#include "GEOM_ShapeTypeFilter.hxx"
+#include "SALOME_TypeFilter.hxx"
+
+#include "utilities.h"
+#include "QAD_Application.h"
+#include "QAD_Desktop.h"
+#include "QAD_Study.h"
+
+// Open CASCADE Includes
+#include <BRepAdaptor_Surface.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+#include <TopAbs.hxx>
+
+
+static GEOM_Client ShapeReader;
+
+/*!
+ enumeration TypeOfFace is AnyFace,Plane,Cylinder,Sphere,Torus,Revol,Cone;
+*/
+GEOM_FaceFilter::GEOM_FaceFilter(const StdSelect_TypeOfFace Face,
+ GEOM::GEOM_Gen_ptr geom)
+{
+ myKind = Face;
+ myComponentGeom = GEOM::GEOM_Gen::_narrow(geom);
+}
+
+Standard_Boolean GEOM_FaceFilter::IsOk(const Handle(SALOME_InteractiveObject)& anObj) const
+{
+ Handle(SALOME_TypeFilter) GeomFilter = new SALOME_TypeFilter( "GEOM" );
+ if ( !GeomFilter->IsOk(anObj) )
+ return false;
+
+ Handle(GEOM_ShapeTypeFilter) GeomShapeTypeFilter = new GEOM_ShapeTypeFilter( TopAbs_FACE, myComponentGeom );
+ if ( !GeomShapeTypeFilter->IsOk(anObj) )
+ return false;
+
+ if ( anObj->hasEntry() ) {
+ QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
+ SALOMEDS::Study_var aStudy = ActiveStudy->getStudyDocument();
+ SALOMEDS::SObject_var obj = aStudy->FindObjectID( anObj->getEntry() );
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributeIOR_var anIOR;
+ if ( !obj->_is_nil() ) {
+ if (obj->FindAttribute(anAttr, "AttributeIOR")) {
+ anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
+ GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( anIOR->Value() );
+ if ( aShape->_is_nil() )
+ return false;
+
+ TopoDS_Shape Shape = ShapeReader.GetShape( myComponentGeom, aShape );
+ if ( Shape.IsNull() )
+ return false;
+
+ switch (myKind) {
+ case StdSelect_AnyFace:
+ return Standard_True;
+ case StdSelect_Plane:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Plane);
+ }
+ case StdSelect_Cylinder:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Cylinder);
+ }
+ case StdSelect_Sphere:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Sphere);
+ }
+ case StdSelect_Torus:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return ( surf.GetType() == GeomAbs_Torus);
+ }
+ case StdSelect_Revol:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return ( surf.GetType() == GeomAbs_Cylinder ||
+ surf.GetType() == GeomAbs_Cone ||
+ surf.GetType() == GeomAbs_Torus ||
+ surf.GetType() == GeomAbs_Sphere ||
+ surf.GetType() == GeomAbs_SurfaceOfRevolution );
+ }
+ case StdSelect_Cone: // en attendant la liberation du cdl, on l'utilise pour Cone
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Cone);
+ }
+ }
+ }
+ }
+ }
+
+ if ( anObj->IsInstance(STANDARD_TYPE(GEOM_InteractiveObject)) ) {
+ Handle(GEOM_InteractiveObject) GObject =
+ Handle(GEOM_InteractiveObject)::DownCast(anObj);
+
+ GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( GObject->getIOR() );
+ if ( aShape->_is_nil() )
+ return false;
+
+ TopoDS_Shape Shape = ShapeReader.GetShape( myComponentGeom, aShape );
+ if ( Shape.IsNull() )
+ return false;
+
+ switch (myKind) {
+ case StdSelect_AnyFace:
+ return Standard_True;
+ case StdSelect_Plane:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Plane);
+ }
+ case StdSelect_Cylinder:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Cylinder);
+ }
+ case StdSelect_Sphere:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Sphere);
+ }
+ case StdSelect_Torus:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return ( surf.GetType() == GeomAbs_Torus);
+ }
+ case StdSelect_Revol:
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return ( surf.GetType() == GeomAbs_Cylinder ||
+ surf.GetType() == GeomAbs_Cone ||
+ surf.GetType() == GeomAbs_Torus ||
+ surf.GetType() == GeomAbs_Sphere ||
+ surf.GetType() == GeomAbs_SurfaceOfRevolution );
+ }
+ case StdSelect_Cone: // en attendant la liberation du cdl, on l'utilise pour Cone
+ {
+ BRepAdaptor_Surface surf(TopoDS::Face(Shape));
+ return (surf.GetType() == GeomAbs_Cone);
+ }
+ }
+ }
+ return false;
+}
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#ifndef _GEOM_FaceFilter_HeaderFile
+#define _GEOM_FaceFilter_HeaderFile
+
+#ifndef _Handle_GEOM_FaceFilter_HeaderFile
+#include "Handle_GEOM_FaceFilter.hxx"
+#endif
+
+#include "SALOME_InteractiveObject.hxx"
+#include "SALOME_Filter.hxx"
+
+// IDL Headers
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(GEOM_Shape)
+#include CORBA_SERVER_HEADER(GEOM_Gen)
+#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
+
+// Open CASCADE Includes
+#include <Standard.hxx>
+#include <TopAbs.hxx>
+#include <TopoDS_Shape.hxx>
+#include <StdSelect_TypeOfFace.hxx>
+
+class GEOM_FaceFilter : public SALOME_Filter {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOM_FaceFilter(const StdSelect_TypeOfFace Face,
+ GEOM::GEOM_Gen_ptr geom);
+
+Standard_EXPORT virtual Standard_Boolean IsOk(const Handle(SALOME_InteractiveObject)& anobj) const;
+Standard_EXPORT ~GEOM_FaceFilter();
+
+
+
+
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& GEOM_FaceFilter_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+StdSelect_TypeOfFace myKind;
+GEOM::GEOM_Gen_var myComponentGeom;
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+
+
+};
+
+
+
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOM_FaceFilter.jxx"
+
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+GEOM_FaceFilter::~GEOM_FaceFilter() {}
+
+
+
+Standard_EXPORT Handle_Standard_Type& GEOM_FaceFilter_Type_()
+{
+
+ static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_Filter);
+ if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_Filter);
+ static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
+ if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
+ static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
+ if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
+
+
+ static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
+ static Handle_Standard_Type _aType = new Standard_Type("GEOM_FaceFilter",
+ sizeof(GEOM_FaceFilter),
+ 1,
+ (Standard_Address)_Ancestors,
+ (Standard_Address)NULL);
+
+ return _aType;
+}
+
+
+// DownCast method
+// allow safe downcasting
+//
+const Handle(GEOM_FaceFilter) Handle(GEOM_FaceFilter)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+ Handle(GEOM_FaceFilter) _anOtherObject;
+
+ if (!AnObject.IsNull()) {
+ if (AnObject->IsKind(STANDARD_TYPE(GEOM_FaceFilter))) {
+ _anOtherObject = Handle(GEOM_FaceFilter)((Handle(GEOM_FaceFilter)&)AnObject);
+ }
+ }
+
+ return _anOtherObject ;
+}
+const Handle(Standard_Type)& GEOM_FaceFilter::DynamicType() const
+{
+ return STANDARD_TYPE(GEOM_FaceFilter) ;
+}
+Standard_Boolean GEOM_FaceFilter::IsKind(const Handle(Standard_Type)& AType) const
+{
+ return (STANDARD_TYPE(GEOM_FaceFilter) == AType || SALOME_Filter::IsKind(AType));
+}
+Handle_GEOM_FaceFilter::~Handle_GEOM_FaceFilter() {}
+
--- /dev/null
+#ifndef _GEOM_FaceFilter_HeaderFile
+#include "GEOM_FaceFilter.hxx"
+#endif
--- /dev/null
+using namespace std;
+// File : GEOM_ShapeTypeFilter.cxx
+// Created : Fri Dec 07 09:57:24 2001
+// Author : Nicolas REJNERI
+// Project : SALOME
+// Module : SALOMEGUI
+// Copyright : Open CASCADE
+// $Header$
+
+#include "GEOM_ShapeTypeFilter.ixx"
+#include "GEOM_Client.hxx"
+
+#include "SALOME_InteractiveObject.hxx"
+#include "GEOM_InteractiveObject.hxx"
+#include "SALOME_TypeFilter.hxx"
+
+#include "utilities.h"
+#include "QAD_Application.h"
+#include "QAD_Desktop.h"
+#include "QAD_Study.h"
+
+static GEOM_Client ShapeReader;
+
+GEOM_ShapeTypeFilter::GEOM_ShapeTypeFilter(TopAbs_ShapeEnum ShapeType,
+ GEOM::GEOM_Gen_ptr geom)
+{
+ myKind = ShapeType;
+ myComponentGeom = GEOM::GEOM_Gen::_narrow(geom);
+}
+
+Standard_Boolean GEOM_ShapeTypeFilter::IsOk(const Handle(SALOME_InteractiveObject)& anObj) const
+{
+ Handle(SALOME_TypeFilter) GeomFilter = new SALOME_TypeFilter( "GEOM" );
+ if ( !GeomFilter->IsOk(anObj) )
+ return false;
+ if ( anObj->hasEntry() ) {
+ QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
+ SALOMEDS::Study_var aStudy = ActiveStudy->getStudyDocument();
+ SALOMEDS::SObject_var obj = aStudy->FindObjectID( anObj->getEntry() );
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributeIOR_var anIOR;
+ if ( !obj->_is_nil() ) {
+ if (obj->FindAttribute(anAttr, "AttributeIOR")) {
+ anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
+ GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( anIOR->Value() );
+ if ( aShape->_is_nil() )
+ return false;
+
+ TopoDS_Shape Shape = ShapeReader.GetShape( myComponentGeom, aShape );
+ if ( Shape.IsNull() )
+ return false;
+
+ MESSAGE ( " myKind = " << myKind );
+ MESSAGE ( " Shape.ShapeType = " << Shape.ShapeType() );
+ if ( myKind == TopAbs_SHAPE )
+ return true;
+
+ if ( Shape.ShapeType() == myKind )
+ return true;
+ else
+ return false;
+ }
+ }
+ }
+
+ if ( anObj->IsInstance(STANDARD_TYPE(GEOM_InteractiveObject)) ) {
+ Handle(GEOM_InteractiveObject) GObject =
+ Handle(GEOM_InteractiveObject)::DownCast(anObj);
+
+ GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( GObject->getIOR() );
+ if ( aShape->_is_nil() )
+ return false;
+
+ TopoDS_Shape Shape = ShapeReader.GetShape( myComponentGeom, aShape );
+ if ( Shape.IsNull() )
+ return false;
+
+ MESSAGE ( " myKind = " << myKind );
+ MESSAGE ( " Shape.ShapeType = " << Shape.ShapeType() );
+ if ( myKind == TopAbs_SHAPE )
+ return true;
+
+ if ( Shape.ShapeType() == myKind )
+ return true;
+ else
+ return false;
+ }
+ return false;
+}
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#ifndef _GEOM_ShapeTypeFilter_HeaderFile
+#define _GEOM_ShapeTypeFilter_HeaderFile
+
+#ifndef _Handle_GEOM_ShapeTypeFilter_HeaderFile
+#include "Handle_GEOM_ShapeTypeFilter.hxx"
+#endif
+
+#include "SALOME_InteractiveObject.hxx"
+#include "SALOME_Filter.hxx"
+
+// IDL Headers
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(GEOM_Shape)
+#include CORBA_SERVER_HEADER(GEOM_Gen)
+#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
+
+// Open CASCADE Includes
+#include <Standard.hxx>
+#include <TopAbs.hxx>
+#include <TopoDS_Shape.hxx>
+
+class GEOM_ShapeTypeFilter : public SALOME_Filter {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOM_ShapeTypeFilter(TopAbs_ShapeEnum ShapeType,
+ GEOM::GEOM_Gen_ptr geom);
+Standard_EXPORT virtual Standard_Boolean IsOk(const Handle(SALOME_InteractiveObject)& anobj) const;
+Standard_EXPORT ~GEOM_ShapeTypeFilter();
+
+
+
+
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& GEOM_ShapeTypeFilter_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+TopAbs_ShapeEnum myKind;
+GEOM::GEOM_Gen_var myComponentGeom;
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+
+
+};
+
+
+
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOM_ShapeTypeFilter.jxx"
+
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+GEOM_ShapeTypeFilter::~GEOM_ShapeTypeFilter() {}
+
+
+
+Standard_EXPORT Handle_Standard_Type& GEOM_ShapeTypeFilter_Type_()
+{
+
+ static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_Filter);
+ if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_Filter);
+ static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
+ if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
+ static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
+ if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
+
+
+ static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
+ static Handle_Standard_Type _aType = new Standard_Type("GEOM_ShapeTypeFilter",
+ sizeof(GEOM_ShapeTypeFilter),
+ 1,
+ (Standard_Address)_Ancestors,
+ (Standard_Address)NULL);
+
+ return _aType;
+}
+
+
+// DownCast method
+// allow safe downcasting
+//
+const Handle(GEOM_ShapeTypeFilter) Handle(GEOM_ShapeTypeFilter)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+ Handle(GEOM_ShapeTypeFilter) _anOtherObject;
+
+ if (!AnObject.IsNull()) {
+ if (AnObject->IsKind(STANDARD_TYPE(GEOM_ShapeTypeFilter))) {
+ _anOtherObject = Handle(GEOM_ShapeTypeFilter)((Handle(GEOM_ShapeTypeFilter)&)AnObject);
+ }
+ }
+
+ return _anOtherObject ;
+}
+const Handle(Standard_Type)& GEOM_ShapeTypeFilter::DynamicType() const
+{
+ return STANDARD_TYPE(GEOM_ShapeTypeFilter) ;
+}
+Standard_Boolean GEOM_ShapeTypeFilter::IsKind(const Handle(Standard_Type)& AType) const
+{
+ return (STANDARD_TYPE(GEOM_ShapeTypeFilter) == AType || SALOME_Filter::IsKind(AType));
+}
+Handle_GEOM_ShapeTypeFilter::~Handle_GEOM_ShapeTypeFilter() {}
+
--- /dev/null
+#ifndef _GEOM_ShapeTypeFilter_HeaderFile
+#include "GEOM_ShapeTypeFilter.hxx"
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _Handle_GEOM_EdgeFilter_HeaderFile
+#define _Handle_GEOM_EdgeFilter_HeaderFile
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Handle_SALOME_Filter_HeaderFile
+#include "Handle_SALOME_Filter.hxx"
+#endif
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(SALOME_Filter);
+class GEOM_EdgeFilter;
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_EdgeFilter);
+
+class Handle(GEOM_EdgeFilter) : public Handle(SALOME_Filter) {
+ public:
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ Handle(GEOM_EdgeFilter)():Handle(SALOME_Filter)() {}
+ Handle(GEOM_EdgeFilter)(const Handle(GEOM_EdgeFilter)& aHandle) : Handle(SALOME_Filter)(aHandle)
+ {
+ }
+
+ Handle(GEOM_EdgeFilter)(const GEOM_EdgeFilter* anItem) : Handle(SALOME_Filter)((SALOME_Filter *)anItem)
+ {
+ }
+
+ Handle(GEOM_EdgeFilter)& operator=(const Handle(GEOM_EdgeFilter)& aHandle)
+ {
+ Assign(aHandle.Access());
+ return *this;
+ }
+
+ Handle(GEOM_EdgeFilter)& operator=(const GEOM_EdgeFilter* anItem)
+ {
+ Assign((Standard_Transient *)anItem);
+ return *this;
+ }
+
+ GEOM_EdgeFilter* operator->()
+ {
+ return (GEOM_EdgeFilter *)ControlAccess();
+ }
+
+ GEOM_EdgeFilter* operator->() const
+ {
+ return (GEOM_EdgeFilter *)ControlAccess();
+ }
+
+ Standard_EXPORT ~Handle(GEOM_EdgeFilter)();
+
+ Standard_EXPORT static const Handle(GEOM_EdgeFilter) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _Handle_GEOM_FaceFilter_HeaderFile
+#define _Handle_GEOM_FaceFilter_HeaderFile
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Handle_SALOME_Filter_HeaderFile
+#include "Handle_SALOME_Filter.hxx"
+#endif
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(SALOME_Filter);
+class GEOM_FaceFilter;
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_FaceFilter);
+
+class Handle(GEOM_FaceFilter) : public Handle(SALOME_Filter) {
+ public:
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ Handle(GEOM_FaceFilter)():Handle(SALOME_Filter)() {}
+ Handle(GEOM_FaceFilter)(const Handle(GEOM_FaceFilter)& aHandle) : Handle(SALOME_Filter)(aHandle)
+ {
+ }
+
+ Handle(GEOM_FaceFilter)(const GEOM_FaceFilter* anItem) : Handle(SALOME_Filter)((SALOME_Filter *)anItem)
+ {
+ }
+
+ Handle(GEOM_FaceFilter)& operator=(const Handle(GEOM_FaceFilter)& aHandle)
+ {
+ Assign(aHandle.Access());
+ return *this;
+ }
+
+ Handle(GEOM_FaceFilter)& operator=(const GEOM_FaceFilter* anItem)
+ {
+ Assign((Standard_Transient *)anItem);
+ return *this;
+ }
+
+ GEOM_FaceFilter* operator->()
+ {
+ return (GEOM_FaceFilter *)ControlAccess();
+ }
+
+ GEOM_FaceFilter* operator->() const
+ {
+ return (GEOM_FaceFilter *)ControlAccess();
+ }
+
+ Standard_EXPORT ~Handle(GEOM_FaceFilter)();
+
+ Standard_EXPORT static const Handle(GEOM_FaceFilter) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _Handle_GEOM_ShapeTypeFilter_HeaderFile
+#define _Handle_GEOM_ShapeTypeFilter_HeaderFile
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Handle_SALOME_Filter_HeaderFile
+#include "Handle_SALOME_Filter.hxx"
+#endif
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(SALOME_Filter);
+class GEOM_ShapeTypeFilter;
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_ShapeTypeFilter);
+
+class Handle(GEOM_ShapeTypeFilter) : public Handle(SALOME_Filter) {
+ public:
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ Handle(GEOM_ShapeTypeFilter)():Handle(SALOME_Filter)() {}
+ Handle(GEOM_ShapeTypeFilter)(const Handle(GEOM_ShapeTypeFilter)& aHandle) : Handle(SALOME_Filter)(aHandle)
+ {
+ }
+
+ Handle(GEOM_ShapeTypeFilter)(const GEOM_ShapeTypeFilter* anItem) : Handle(SALOME_Filter)((SALOME_Filter *)anItem)
+ {
+ }
+
+ Handle(GEOM_ShapeTypeFilter)& operator=(const Handle(GEOM_ShapeTypeFilter)& aHandle)
+ {
+ Assign(aHandle.Access());
+ return *this;
+ }
+
+ Handle(GEOM_ShapeTypeFilter)& operator=(const GEOM_ShapeTypeFilter* anItem)
+ {
+ Assign((Standard_Transient *)anItem);
+ return *this;
+ }
+
+ GEOM_ShapeTypeFilter* operator->()
+ {
+ return (GEOM_ShapeTypeFilter *)ControlAccess();
+ }
+
+ GEOM_ShapeTypeFilter* operator->() const
+ {
+ return (GEOM_ShapeTypeFilter *)ControlAccess();
+ }
+
+ Standard_EXPORT ~Handle(GEOM_ShapeTypeFilter)();
+
+ Standard_EXPORT static const Handle(GEOM_ShapeTypeFilter) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+#endif
--- /dev/null
+# -* Makefile *-
+#
+# Author : Patrick GOLDBRONN (CEA)
+# Date : 29/06/2001
+# $Header$
+#
+
+# source path
+top_srcdir=@top_srcdir@
+top_builddir=../..
+srcdir=@srcdir@
+VPATH=.:$(srcdir):$(top_srcdir)/idl:$(top_builddir)/idl
+
+
+@COMMENCE@
+
+# Libraries targets
+
+LIB = libGeometryFiltersSelection.la
+LIB_SRC = GEOM_ShapeTypeFilter.cxx \
+ GEOM_FaceFilter.cxx \
+ GEOM_EdgeFilter.cxx
+
+LIB_CLIENT_IDL = SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl GEOM_Shape.idl GEOM_Gen.idl
+
+# header files
+EXPORT_HEADERS= GEOM_ShapeTypeFilter.hxx \
+ Handle_GEOM_ShapeTypeFilter.hxx \
+ GEOM_FaceFilter.hxx \
+ Handle_GEOM_FaceFilter.hxx \
+ GEOM_EdgeFilter.hxx \
+ Handle_GEOM_EdgeFilter.hxx
+
+# additionnal information to compil and link file
+CPPFLAGS += $(OCC_INCLUDES) $(QT_INCLUDES) $(PYTHON_INCLUDES) $(VTK_INCLUDES)
+CXXFLAGS += $(OCC_CXXFLAGS)
+LDFLAGS += $(OCC_LIBS)
+
+# additional file to be cleaned
+MOSTLYCLEAN =
+CLEAN =
+DISTCLEAN =
+
+@CONCLUDE@
+
--- /dev/null
+using namespace std;
+// File : GEOM_AISShape.cxx
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Nicolas REJNERI
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+/*!
+ \class GEOM_AISShape GEOM_AISShape.hxx
+ \brief ....
+*/
+
+#include "GEOM_AISShape.ixx"
+#include "SALOME_InteractiveObject.hxx"
+
+#include "utilities.h"
+
+// Open CASCADE Includes
+#include <AIS_Drawer.hxx>
+#include <Prs3d_Drawer.hxx>
+#include <Prs3d_IsoAspect.hxx>
+#include <Prs3d_LineAspect.hxx>
+#include <Prs3d_ShadingAspect.hxx>
+#include <StdSelect_DisplayMode.hxx>
+#include <StdPrs_WFShape.hxx>
+#include <StdPrs_ShadedShape.hxx>
+
+#include <Graphic3d_AspectFillArea3d.hxx>
+
+GEOM_AISShape::GEOM_AISShape(const TopoDS_Shape& shape,
+ const Standard_CString aName): SALOME_AISShape(shape)
+{
+ myIO = NULL;
+ myName = new char [strlen(aName)+1];
+ strcpy( myName, aName);
+
+ myShadingColor = Quantity_Color( Quantity_NOC_GOLDENROD );
+}
+
+void GEOM_AISShape::setIO(const Handle(SALOME_InteractiveObject)& io){
+ myIO = io;
+}
+
+Handle(SALOME_InteractiveObject) GEOM_AISShape::getIO(){
+ return myIO;
+}
+
+Standard_Boolean GEOM_AISShape::hasIO(){
+ return !( myIO == NULL ) ;
+}
+
+void GEOM_AISShape::setName(const Standard_CString aName)
+{
+ myName = new char [strlen(aName)+1];
+ strcpy( myName, aName);
+
+ if ( hasIO() )
+ myIO->setName(aName);
+}
+
+Standard_CString GEOM_AISShape::getName(){
+ return myName;
+}
+
+void GEOM_AISShape::Compute(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
+ const Handle(Prs3d_Presentation)& aPrs,
+ const Standard_Integer aMode)
+{
+ if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //pas de prise en compte lors du FITALL
+
+ StdSelect_DisplayMode d = (StdSelect_DisplayMode) aMode;
+
+ switch (d) {
+ case StdSelect_DM_Wireframe:
+ {
+ StdPrs_WFShape::Add(aPrs,myshape,myDrawer);
+ break;
+ }
+ case StdSelect_DM_Shading:
+ {
+ myDrawer->ShadingAspect()->Aspect()->SetDistinguishOn();
+ myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(Graphic3d_NOM_BRASS);
+ myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(Graphic3d_NOM_JADE);
+
+ Graphic3d_MaterialAspect FMat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
+ Graphic3d_MaterialAspect BMat = myDrawer->ShadingAspect()->Aspect()->BackMaterial();
+ FMat.SetTransparency(myTransparency); BMat.SetTransparency(myTransparency);
+ myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(FMat);
+ myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(BMat);
+
+ //Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
+ // P->SetPrimitivesAspect(a4bis);
+ // G->SetGroupPrimitivesAspect(a4bis);
+ //a4bis->SetInteriorColor(myShadingColor);
+ myDrawer->ShadingAspect()->SetColor(myShadingColor);
+
+ StdPrs_ShadedShape::Add(aPrs,myshape,myDrawer);
+ break;
+ }
+ }
+ // aPrs->ReCompute(); // for hidden line recomputation if necessary...
+}
+
+void GEOM_AISShape::SetTransparency(const Standard_Real aValue)
+{
+ if(aValue<0.0 || aValue>1.0) return;
+
+ if(aValue<=0.05)
+ {
+ UnsetTransparency();
+ return;
+ }
+
+ Graphic3d_MaterialAspect FMat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
+ Graphic3d_MaterialAspect BMat = myDrawer->ShadingAspect()->Aspect()->BackMaterial();
+ FMat.SetTransparency(aValue); BMat.SetTransparency(aValue);
+ myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(FMat);
+ myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(BMat);
+ myTransparency = aValue;
+}
+
+void GEOM_AISShape::SetShadingColor(const Quantity_Color &aCol)
+{
+ myShadingColor = aCol;
+}
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#ifndef _GEOM_AISShape_HeaderFile
+#define _GEOM_AISShape_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Handle_GEOM_AISShape_HeaderFile
+#include "Handle_GEOM_AISShape.hxx"
+#endif
+
+#ifndef _Handle_SALOME_InteractiveObject_HeaderFile
+#include "Handle_SALOME_InteractiveObject.hxx"
+#endif
+#ifndef _Standard_CString_HeaderFile
+#include <Standard_CString.hxx>
+#endif
+#ifndef _SALOME_AISShape_HeaderFile
+#include "SALOME_AISShape.hxx"
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+#ifndef _Handle_PrsMgr_PresentationManager3d_HeaderFile
+#include <Handle_PrsMgr_PresentationManager3d.hxx>
+#endif
+#ifndef _Handle_Prs3d_Presentation_HeaderFile
+#include <Handle_Prs3d_Presentation.hxx>
+#endif
+
+class PrsMgr_PresentationManager3d;
+class Prs3d_Presentation;
+class SALOME_InteractiveObject;
+class TopoDS_Shape;
+
+
+class GEOM_AISShape : public SALOME_AISShape {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOM_AISShape(const TopoDS_Shape& shape, const Standard_CString aName);
+Standard_EXPORT Standard_Boolean hasIO() ;
+Standard_EXPORT void setIO(const Handle(SALOME_InteractiveObject)& name) ;
+Standard_EXPORT void setName(const Standard_CString aName) ;
+Standard_EXPORT Standard_CString getName() ;
+Standard_EXPORT Handle_SALOME_InteractiveObject getIO() ;
+Standard_EXPORT ~GEOM_AISShape();
+
+Standard_EXPORT void SetTransparency(const Standard_Real aValue);
+Standard_EXPORT void SetShadingColor(const Quantity_Color &aCol);
+
+Standard_EXPORT virtual void Compute(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
+ const Handle(Prs3d_Presentation)& aPresentation,
+ const Standard_Integer aMode = 0) ;
+
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& GEOM_AISShape_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+ Handle_SALOME_InteractiveObject myIO;
+ Standard_CString myName;
+ Quantity_Color myShadingColor;
+};
+
+
+
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOM_AISShape.jxx"
+
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+GEOM_AISShape::~GEOM_AISShape() {}
+
+
+
+Standard_EXPORT Handle_Standard_Type& GEOM_AISShape_Type_()
+{
+
+ static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_AISShape);
+ if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_AISShape);
+ static Handle_Standard_Type aType2 = STANDARD_TYPE(AIS_Shape);
+ if ( aType2.IsNull()) aType2 = STANDARD_TYPE(AIS_Shape);
+ static Handle_Standard_Type aType3 = STANDARD_TYPE(AIS_InteractiveObject);
+ if ( aType3.IsNull()) aType3 = STANDARD_TYPE(AIS_InteractiveObject);
+ static Handle_Standard_Type aType4 = STANDARD_TYPE(SelectMgr_SelectableObject);
+ if ( aType4.IsNull()) aType4 = STANDARD_TYPE(SelectMgr_SelectableObject);
+ static Handle_Standard_Type aType5 = STANDARD_TYPE(PrsMgr_PresentableObject);
+ if ( aType5.IsNull()) aType5 = STANDARD_TYPE(PrsMgr_PresentableObject);
+ static Handle_Standard_Type aType6 = STANDARD_TYPE(MMgt_TShared);
+ if ( aType6.IsNull()) aType6 = STANDARD_TYPE(MMgt_TShared);
+ static Handle_Standard_Type aType7 = STANDARD_TYPE(Standard_Transient);
+ if ( aType7.IsNull()) aType7 = STANDARD_TYPE(Standard_Transient);
+
+
+ static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,aType4,aType5,aType6,aType7,NULL};
+ static Handle_Standard_Type _aType = new Standard_Type("GEOM_AISShape",
+ sizeof(GEOM_AISShape),
+ 1,
+ (Standard_Address)_Ancestors,
+ (Standard_Address)NULL);
+
+ return _aType;
+}
+
+
+// DownCast method
+// allow safe downcasting
+//
+const Handle(GEOM_AISShape) Handle(GEOM_AISShape)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+ Handle(GEOM_AISShape) _anOtherObject;
+
+ if (!AnObject.IsNull()) {
+ if (AnObject->IsKind(STANDARD_TYPE(GEOM_AISShape))) {
+ _anOtherObject = Handle(GEOM_AISShape)((Handle(GEOM_AISShape)&)AnObject);
+ }
+ }
+
+ return _anOtherObject ;
+}
+const Handle(Standard_Type)& GEOM_AISShape::DynamicType() const
+{
+ return STANDARD_TYPE(GEOM_AISShape) ;
+}
+Standard_Boolean GEOM_AISShape::IsKind(const Handle(Standard_Type)& AType) const
+{
+ return (STANDARD_TYPE(GEOM_AISShape) == AType || SALOME_AISShape::IsKind(AType));
+}
+Handle_GEOM_AISShape::~Handle_GEOM_AISShape() {}
+
--- /dev/null
+#ifndef _GEOM_InteractiveObject_HeaderFile
+#include "GEOM_InteractiveObject.hxx"
+#endif
+#ifndef _TopoDS_Shape_HeaderFile
+#include <TopoDS_Shape.hxx>
+#endif
+#ifndef _GEOM_AISShape_HeaderFile
+#include "GEOM_AISShape.hxx"
+#endif
+#ifndef _PrsMgr_PresentationManager3d_HeaderFile
+#include <PrsMgr_PresentationManager3d.hxx>
+#endif
+#ifndef _Prs3d_Presentation_HeaderFile
+#include <Prs3d_Presentation.hxx>
+#endif
\ No newline at end of file
--- /dev/null
+using namespace std;
+// File : GEOM_Actor.cxx
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Christophe ATTANASIO
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+/*!
+ \class GEOM_Actor GEOM_Actor.h
+ \brief This class allows to display an OpenCASCADE CAD model in a VTK viewer.
+*/
+
+#include "GEOM_Actor.h"
+
+// VTK Includes
+#include <vtkObjectFactory.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkMath.h>
+
+// OpenCASCADE Includes
+#include "GEOM_OCCReader.h"
+#include <BRep_Tool.hxx>
+
+//-------------------------------------------------------------
+// Main methods
+//-------------------------------------------------------------
+
+
+GEOM_Actor* GEOM_Actor::New()
+{
+ // First try to create the object from the vtkObjectFactory
+ vtkObject* ret = vtkObjectFactory::CreateInstance("GEOM_Actor");
+ if(ret)
+ {
+ return (GEOM_Actor*)ret;
+ }
+ // If the factory was unable to create the object, then create it here.
+ return new GEOM_Actor;
+}
+
+
+GEOM_Actor::GEOM_Actor()
+{
+ this->Device = vtkActor::New();
+
+ this->WireframeMapper = NULL;
+ this->ShadingMapper = NULL;
+
+ this->ShadingProperty = NULL;
+ this->WireframeProperty = NULL;
+
+ this->deflection = 0;
+ myDisplayMode = 0;
+
+ this->myIO = NULL;
+ this->myName = "";
+
+ this->HighlightProperty = NULL;
+ this->ishighlighted = false;
+
+ this->subshape = false;
+}
+
+GEOM_Actor::~GEOM_Actor()
+{
+ if (WireframeMapper != NULL)
+ WireframeMapper->Delete();
+ if (ShadingMapper != NULL)
+ ShadingMapper->Delete();
+ if (ShadingProperty != NULL)
+ ShadingProperty->Delete();
+ if (WireframeProperty != NULL)
+ WireframeProperty->Delete();
+ if (HighlightProperty != NULL)
+ HighlightProperty->Delete();
+}
+
+
+void GEOM_Actor::ShallowCopy(vtkProp *prop)
+{
+ GEOM_Actor *f = GEOM_Actor::SafeDownCast(prop);
+ if ( f != NULL )
+ {
+ this->setInputShape(f->getTopo(),f->getDeflection(),f->getDisplayMode());
+ this->setName( f->getName() );
+ if ( f->hasIO() )
+ this->setIO( f->getIO() );
+ this->ShadingMapper = NULL;
+ this->WireframeMapper = NULL;
+ } else {
+ this->myIO = NULL;
+ this->myName = "";
+ this->ShadingMapper = NULL;
+ this->WireframeMapper = NULL;
+ }
+
+ // Now do superclass
+ this->SALOME_Actor::ShallowCopy(prop);
+}
+
+//-------------------------------------------------------------
+// Set parameters
+//-------------------------------------------------------------
+
+
+void GEOM_Actor::setDisplayMode(int thenewmode) {
+ myDisplayMode = thenewmode;
+ if ( thenewmode >=1 ) {
+ if ((myShape.ShapeType() == TopAbs_WIRE) ||
+ (myShape.ShapeType() == TopAbs_EDGE) ||
+ (myShape.ShapeType() == TopAbs_VERTEX)) {
+ if ( !subshape )
+ CreateWireframeMapper();
+ else
+ return;
+ } else
+ CreateShadingMapper();
+ } else
+ CreateWireframeMapper();
+}
+
+void GEOM_Actor::setDeflection(double adef) {
+ deflection = adef;
+}
+
+void GEOM_Actor::setInputShape(const TopoDS_Shape& aShape,double adef,int imode) {
+ myShape = aShape;
+ deflection = adef;
+ setDisplayMode(imode);
+}
+
+//-------------------------------------------------------------
+// Get parameters
+//-------------------------------------------------------------
+
+const TopoDS_Shape& GEOM_Actor::getTopo() {
+ return myShape;
+}
+
+double GEOM_Actor::getDeflection() {
+ return deflection;
+}
+
+void GEOM_Actor::SetWireframeProperty(vtkProperty* Prop) {
+ this->WireframeProperty = Prop;
+}
+
+void GEOM_Actor::SetShadingProperty(vtkProperty* Prop) {
+ this->ShadingProperty = Prop;
+}
+
+
+//-------------------------------------------------------------
+// Mapper creating function
+//-------------------------------------------------------------
+void GEOM_Actor::CreateMapper(int theMode) {
+ if(myShape.ShapeType() == TopAbs_VERTEX) {
+ gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(myShape));
+ this->SetPosition(aPnt.X(),aPnt.Y(),aPnt.Z());
+ }
+ GEOM_OCCReader* aread = GEOM_OCCReader::New();
+ aread->setTopo(myShape);
+ aread->setDisplayMode(theMode);
+ aread->GetOutput()->ReleaseDataFlagOn();
+
+ vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New();
+ if (theMode == 0) {
+ aMapper->SetInput(aread->GetOutput());
+ } else {
+ vtkPolyDataNormals *normals = vtkPolyDataNormals::New();
+ normals->SetInput(aread->GetOutput());
+ aMapper->SetInput(normals->GetOutput());
+ }
+ aread->Delete();
+ this->SetMapper(theMode == 0? WireframeMapper = aMapper : ShadingMapper = aMapper);
+}
+
+void GEOM_Actor::CreateShadingMapper() {
+ CreateMapper(1);
+}
+
+
+void GEOM_Actor::CreateWireframeMapper() {
+ CreateMapper(0);
+}
+
+//-------------------------------------------------------------
+// Render function
+//-------------------------------------------------------------
+
+void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *Mapper)
+{
+ /* render the property */
+ if (!this->Property) {
+ // force creation of a property
+ this->GetProperty();
+ this->Property->SetInterpolation(1);
+ this->Property->SetRepresentationToSurface();
+ this->Property->SetAmbient(0.3);
+ this->Property->SetAmbientColor(0.88,0.86,0.2);
+ this->Property->SetDiffuseColor(0.99,0.7,0.21);
+ this->Property->SetSpecularColor(0.99,0.98,0.83);
+ }
+
+ if(!ishighlighted) {
+ if(myDisplayMode >= 1) {
+ // SHADING
+ this->Property = ShadingProperty;
+ }
+ else {
+ this->Property = WireframeProperty;
+ }
+
+ if ( ispreselected )
+ this->Property = PreviewProperty;
+ }
+
+ this->Property->Render(this, ren);
+ if (this->BackfaceProperty) {
+ this->BackfaceProperty->BackfaceRender(this, ren);
+ this->Device->SetBackfaceProperty(this->BackfaceProperty);
+ }
+ this->Device->SetProperty(this->Property);
+ // Store information on time it takes to render.
+ // We might want to estimate time from the number of polygons in mapper.
+ if(myDisplayMode >= 1) {
+ if((myShape.ShapeType() == TopAbs_WIRE) ||
+ (myShape.ShapeType() == TopAbs_EDGE) ||
+ (myShape.ShapeType() == TopAbs_VERTEX)) {
+ if ( !subshape ) {
+ if(WireframeMapper==NULL) CreateWireframeMapper();
+ } else
+ return;
+ }
+ else {
+ if(ShadingMapper==NULL) CreateShadingMapper();
+ }
+ }
+ else {
+ if(WireframeMapper==NULL) CreateWireframeMapper();
+ }
+ if(myShape.ShapeType() == TopAbs_VERTEX) {
+ if(ren){
+ //The parameter determine size of vertex actor relate to diagonal of RendererWindow
+ static float delta = 0.01;
+ float X1 = -1, Y1 = -1, Z1 = 0;
+ ren->ViewToWorld(X1,Y1,Z1);
+ float X2 = +1, Y2 = +1, Z2 = 0;
+ ren->ViewToWorld(X2,Y2,Z2);
+ Z2 = sqrt((X2-X1)*(X2-X1) + (Y2-Y1)*(Y2-Y1) + (Z2-Z1)*(Z2-Z1));
+ this->SetScale(Z2*delta);
+ }
+ vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New();
+ this->GetMatrix(ren->GetActiveCamera(), aMatrix);
+ this->Device->SetUserMatrix(aMatrix);
+ this->Device->Render(ren,this->Mapper);
+ aMatrix->Delete();
+ } else
+ this->Device->Render(ren, this->Mapper);
+ this->EstimatedRenderTime = WireframeMapper->GetTimeToDraw();
+}
+
+// SubShape
+void GEOM_Actor::SubShapeOn()
+{
+ subshape = true;
+}
+void GEOM_Actor::SubShapeOff()
+{
+ subshape = false;
+}
+
+//-------------------------------------------------------------
+// Opacity methods
+//-------------------------------------------------------------
+
+void GEOM_Actor::SetOpacity(float opa)
+{
+ //HighlightProperty->SetOpacity(opa);
+ SALOME_Actor::SetOpacity(opa);
+ ShadingProperty->SetOpacity(opa);
+}
+
+float GEOM_Actor::GetOpacity() {
+ return ShadingProperty->GetOpacity();
+}
+
+//-------------------------------------------------------------
+// Color methods
+//-------------------------------------------------------------
+void GEOM_Actor::SetColor(float r,float g,float b) {
+ ShadingProperty->SetColor(r,g,b);
+}
+
+void GEOM_Actor::GetColor(float& r,float& g,float& b) {
+ float color[3];
+ ShadingProperty->GetColor(color);
+ r = color[0];
+ g = color[1];
+ b = color[2];
+}
+
+//-------------------------------------------------------------
+// Highlight methods
+//-------------------------------------------------------------
+
+void GEOM_Actor::highlight(Standard_Boolean highlight) {
+
+ if(highlight && !ishighlighted) {
+ ishighlighted=true;
+ // build highlight property is necessary
+ if(HighlightProperty==NULL) {
+ HighlightProperty = vtkProperty::New();
+ HighlightProperty->SetAmbient(0.5);
+ HighlightProperty->SetDiffuse(0.3);
+ HighlightProperty->SetSpecular(0.2);
+ HighlightProperty->SetRepresentationToSurface();
+ HighlightProperty->SetAmbientColor(1, 1, 1);
+ HighlightProperty->SetDiffuseColor(1, 1, 1);
+ HighlightProperty->SetSpecularColor(0.5, 0.5, 0.5);
+ }
+
+ this->Property = HighlightProperty;
+
+ }
+ else if (!highlight) {
+ if(ishighlighted) {
+ ishighlighted=false;
+ if(myDisplayMode==1) {
+ //unhilight in shading
+ this->Property = ShadingProperty;
+ }
+ else {
+ //unhilight in wireframe
+ this->Property = WireframeProperty;
+ }
+ }
+ }
+}
+
+bool GEOM_Actor::hasHighlight()
+{
+ return true;
+}
+
+void GEOM_Actor::SetHighlightProperty(vtkProperty* Prop) {
+ this->HighlightProperty = Prop;
+}
+
+
+void GEOM_Actor::ReleaseGraphicsResources(vtkWindow *renWin)
+{
+ vtkActor::ReleaseGraphicsResources(renWin);
+
+ // broadcast the message down to the individual LOD mappers
+
+ if(WireframeMapper) this->WireframeMapper->ReleaseGraphicsResources(renWin);
+ if(ShadingMapper) this->ShadingMapper->ReleaseGraphicsResources(renWin);
+}
+
+
+// Copy the follower's composite 4x4 matrix into the matrix provided.
+void GEOM_Actor::GetMatrix(vtkCamera* theCam, vtkMatrix4x4 *result)
+{
+ double *pos, *vup;
+ double Rx[3], Ry[3], Rz[3], p1[3];
+ vtkMatrix4x4 *matrix = vtkMatrix4x4::New();
+ int i;
+ double distance;
+
+ this->GetOrientation();
+ this->Transform->Push();
+ this->Transform->PostMultiply();
+ this->Transform->Identity();
+
+ // apply user defined matrix last if there is one
+ if (this->UserMatrix)
+ {
+ this->Transform->Concatenate(this->UserMatrix);
+ }
+
+ this->Transform->Translate(-this->Origin[0],
+ -this->Origin[1],
+ -this->Origin[2]);
+ // scale
+ this->Transform->Scale(this->Scale[0],
+ this->Scale[1],
+ this->Scale[2]);
+
+ // rotate
+ this->Transform->RotateY(this->Orientation[1]);
+ this->Transform->RotateX(this->Orientation[0]);
+ this->Transform->RotateZ(this->Orientation[2]);
+
+ if (theCam)
+ {
+ // do the rotation
+ // first rotate y
+ pos = theCam->GetPosition();
+ vup = theCam->GetViewUp();
+
+ if (theCam->GetParallelProjection())
+ {
+ theCam->GetDirectionOfProjection(Rz);
+ }
+ else
+ {
+ distance = sqrt(
+ (pos[0] - this->Position[0])*(pos[0] - this->Position[0]) +
+ (pos[1] - this->Position[1])*(pos[1] - this->Position[1]) +
+ (pos[2] - this->Position[2])*(pos[2] - this->Position[2]));
+ for (i = 0; i < 3; i++)
+ {
+ Rz[i] = (pos[i] - this->Position[i])/distance;
+ }
+ }
+
+ vtkMath::Cross(vup,Rz,Rx);
+ vtkMath::Normalize(Rx);
+ vtkMath::Cross(Rz,Rx,Ry);
+
+ matrix->Element[0][0] = Rx[0];
+ matrix->Element[1][0] = Rx[1];
+ matrix->Element[2][0] = Rx[2];
+ matrix->Element[0][1] = Ry[0];
+ matrix->Element[1][1] = Ry[1];
+ matrix->Element[2][1] = Ry[2];
+ matrix->Element[0][2] = Rz[0];
+ matrix->Element[1][2] = Rz[1];
+ matrix->Element[2][2] = Rz[2];
+
+ this->Transform->Concatenate(matrix);
+ }
+
+ // translate to projection reference point PRP
+ // this is the camera's position blasted through
+ // the current matrix
+ p1[0] = this->Origin[0] + this->Position[0];
+ p1[1] = this->Origin[1] + this->Position[1];
+ p1[2] = this->Origin[2] + this->Position[2];
+
+ this->Transform->Translate(p1[0],p1[1],p1[2]);
+ this->Transform->GetMatrix(result);
+
+ matrix->Delete();
+ this->Transform->Pop();
+}
--- /dev/null
+// File : GEOM_Actor.h
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Christophe ATTANASIO
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+
+#ifndef GEOM_ACTOR_H
+#define GEOM_ACTOR_H
+
+#include "SALOME_Actor.h"
+
+//VTK
+#include <vtkMapper.h>
+#include <vtkProperty.h>
+#include <vtkMatrix4x4.h>
+#include <vtkCamera.h>
+
+//OpenCASCADE
+#include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+
+
+class TopoDS_Shape;
+
+#ifdef _WIN_32
+#define VTKOCC_EXPORT __declspec (dllexport)
+#else
+#define VTKOCC_EXPORT
+#endif
+class VTKOCC_EXPORT GEOM_Actor : public SALOME_Actor {
+
+
+ public:
+ vtkTypeMacro(GEOM_Actor,SALOME_Actor);
+
+ static GEOM_Actor* New();
+
+ // Description:
+ // This causes the actor to be rendered. It, in turn, will render the actor's
+ // property and then mapper.
+ virtual void Render(vtkRenderer *, vtkMapper *);
+
+ // Description:
+ // Release any graphics resources that are being consumed by this actor.
+ // The parameter window could be used to determine which graphic
+ // resources to release.
+ void ReleaseGraphicsResources(vtkWindow *);
+
+ const TopoDS_Shape& getTopo();
+ void setInputShape(const TopoDS_Shape& ashape,double adef1,int imode);
+
+ double getDeflection();
+ void setDeflection(double adefl);
+
+ // SubShape
+ void SubShapeOn();
+ void SubShapeOff();
+
+ // Display Mode
+ void setDisplayMode(int);
+
+ // Highlight
+ void highlight(Standard_Boolean highlight);
+ bool hasHighlight();
+
+ void ShallowCopy(vtkProp *prop);
+
+ // Properties
+ void SetHighlightProperty(vtkProperty* Prop);
+ void SetWireframeProperty(vtkProperty* Prop);
+ void SetShadingProperty(vtkProperty* Prop);
+
+ // Opacity
+ void SetOpacity(float opa);
+ float GetOpacity();
+
+ // Color
+ void SetColor(float r,float g,float b);
+ void GetColor(float& r,float& g,float& b);
+
+ protected:
+
+ GEOM_Actor();
+ ~GEOM_Actor();
+ GEOM_Actor(const GEOM_Actor&) {};
+ void operator=(const GEOM_Actor&) {};
+
+ void CreateWireframeMapper();
+ void CreateShadingMapper();
+ void CreateMapper(int theMode);
+ void GetMatrix(vtkCamera* theCam, vtkMatrix4x4 *result);
+
+
+ private:
+
+ bool subshape;
+
+ TopoDS_Shape myShape;
+ double deflection;
+
+ vtkMapper* ShadingMapper;
+ vtkMapper* WireframeMapper;
+
+ vtkProperty* ShadingProperty;
+ vtkProperty* WireframeProperty;
+ vtkProperty* HighlightProperty;
+
+ int myDisplayMode;
+
+};
+#endif //GEOM_ACTOR_H
--- /dev/null
+using namespace std;
+// File : GEOM_AssemblyBuilder.cxx
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Christophe ATTANASIO
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+/*!
+ \class GEOM_AssemblyBuilder GEOM_AssemblyBuilder.h
+ \brief ....
+*/
+
+#include "GEOM_AssemblyBuilder.h"
+#include "GEOM_Actor.h"
+#include "utilities.h"
+
+// Open CASCADE Includes
+#include <TopExp_Explorer.hxx>
+#include <Bnd_Box.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
+#include <Poly_Triangulation.hxx>
+#include <BRepBndLib.hxx>
+#include <BRep_Tool.hxx>
+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
+#include <TopExp.hxx>
+#include <TopTools_ListOfShape.hxx>
+
+// SALOME
+
+#define MAX2(X, Y) ( Abs(X) > Abs(Y)? Abs(X) : Abs(Y) )
+#define MAX3(X, Y, Z) ( MAX2 ( MAX2(X,Y) , Z) )
+
+
+
+
+
+void GEOM_AssemblyBuilder::InitProperties(vtkProperty* IsoProp,
+ vtkProperty* FaceProp,
+ vtkProperty* EdgeFProp,
+ vtkProperty* EdgeSProp,
+ vtkProperty* EdgeIProp,
+ vtkProperty* VertexProp,
+ vtkProperty* IsoPVProp,
+ vtkProperty* EdgePVProp,
+ vtkProperty* VertexPVProp)
+{
+ // Shading like default OCC material
+ FaceProp->SetRepresentationToSurface();
+ FaceProp->SetInterpolation(1);
+ FaceProp->SetAmbient(1.0);
+ FaceProp->SetDiffuse(1.0);
+ FaceProp->SetSpecular(0.4);
+ FaceProp->SetAmbientColor(0.329412, 0.223529, 0.027451);
+ FaceProp->SetDiffuseColor(0.780392, 0.568627, 0.113725);
+ FaceProp->SetSpecularColor(0.992157, 0.941176, 0.807843);
+
+ // Wireframe for iso
+ IsoProp->SetRepresentationToWireframe();
+ IsoProp->SetAmbientColor(0.5, 0.5, 0.5);
+ IsoProp->SetDiffuseColor(0.5, 0.5, 0.5);
+ IsoProp->SetSpecularColor(0.5, 0.5, 0.5);
+
+ // Wireframe for iso
+ IsoPVProp->SetRepresentationToWireframe();
+ IsoPVProp->SetAmbientColor(0, 1, 1);
+ IsoPVProp->SetDiffuseColor(0, 1, 1);
+ IsoPVProp->SetSpecularColor(0, 1, 1);
+
+ // Wireframe for shared edge
+ EdgeSProp->SetRepresentationToWireframe();
+ EdgeSProp->SetAmbientColor(1, 1, 0);
+ EdgeSProp->SetDiffuseColor(1, 1, 0);
+ EdgeSProp->SetSpecularColor(1, 1, 0);
+
+ // Wireframe for free edge
+ EdgeFProp->SetRepresentationToWireframe();
+ EdgeFProp->SetAmbientColor(0, 1, 0);
+ EdgeFProp->SetDiffuseColor(0, 1, 0);
+ EdgeFProp->SetSpecularColor(0, 1, 0);
+
+ // Wireframe for isolated edge
+ EdgeIProp->SetRepresentationToWireframe();
+ EdgeIProp->SetAmbientColor(1, 0, 0);
+ EdgeIProp->SetDiffuseColor(1, 0, 0);
+ EdgeIProp->SetSpecularColor(1, 0, 0);
+
+ // Wireframe for Preview edge
+ EdgePVProp->SetRepresentationToWireframe();
+ EdgePVProp->SetAmbientColor(0, 1, 1);
+ EdgePVProp->SetDiffuseColor(0, 1, 1);
+ EdgePVProp->SetSpecularColor(0, 1, 1);
+
+ // Wireframe for vertex
+ VertexProp->SetRepresentationToWireframe();
+ VertexProp->SetAmbientColor(1, 1, 0);
+ VertexProp->SetDiffuseColor(1, 1, 0);
+ VertexProp->SetSpecularColor(1, 1, 0);
+
+ // Wireframe for vertex
+ VertexPVProp->SetRepresentationToWireframe();
+ VertexPVProp->SetAmbientColor(0, 1, 1);
+ VertexPVProp->SetDiffuseColor(0, 1, 1);
+ VertexPVProp->SetSpecularColor(0, 1, 1);
+}
+
+
+void GEOM_AssemblyBuilder::MeshShape(const TopoDS_Shape myShape,
+ Standard_Real deflection,
+ Standard_Boolean forced)
+{
+ // Mesh the shape if necessary
+ Standard_Boolean alreadymesh = Standard_True;
+ TopExp_Explorer ex;
+ TopLoc_Location aLoc;
+
+ for (ex.Init(myShape, TopAbs_FACE); ex.More(); ex.Next()) {
+ const TopoDS_Face& aFace = TopoDS::Face(ex.Current());
+ Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation(aFace,aLoc);
+ if(aPoly.IsNull()) { alreadymesh = Standard_False; break; }
+ }
+
+ if(!alreadymesh || forced) {
+ if(deflection<=0) {
+ // Compute default deflection
+ Bnd_Box B;
+ BRepBndLib::Add(myShape, B);
+ Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
+ B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
+ deflection = MAX3( aXmax-aXmin , aYmax-aYmin , aZmax-aZmin) * 0.001 *4;
+ }
+ BRepMesh_IncrementalMesh MESH(myShape,deflection);
+ }
+}
+
+
+
+vtkActorCollection* GEOM_AssemblyBuilder::BuildActors(const TopoDS_Shape& myShape,
+ Standard_Real deflection,
+ Standard_Integer mode,
+ Standard_Boolean forced) {
+
+ vtkActorCollection* AISActors = vtkActorCollection::New();
+
+ // Create graphics properties
+
+ vtkProperty* IsoProp = vtkProperty::New();
+ vtkProperty* FaceProp = vtkProperty::New();
+ vtkProperty* EdgeFProp = vtkProperty::New();
+ vtkProperty* EdgeSProp = vtkProperty::New();
+ vtkProperty* EdgeIProp = vtkProperty::New();
+ vtkProperty* VertexProp = vtkProperty::New();
+
+ vtkProperty* IsoPVProp = vtkProperty::New();
+ vtkProperty* EdgePVProp = vtkProperty::New();
+ vtkProperty* VertexPVProp = vtkProperty::New();
+
+ InitProperties(IsoProp,FaceProp,EdgeFProp,EdgeSProp,EdgeIProp,VertexProp,IsoPVProp,EdgePVProp,VertexPVProp);
+
+ MeshShape(myShape,deflection,forced);
+
+ if ( myShape.ShapeType() <= 4 ) {
+
+ // FACE Actor
+ // look if edges are free or shared
+ TopTools_IndexedDataMapOfShapeListOfShape edgemap;
+ TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,edgemap);
+
+ TopExp_Explorer ex;
+
+ for (ex.Init(myShape, TopAbs_FACE); ex.More(); ex.Next()) {
+
+ GEOM_Actor* FaceActor = GEOM_Actor::New();
+ FaceActor->SetShadingProperty(FaceProp);
+ FaceActor->SetWireframeProperty(IsoProp);
+
+ FaceActor->SetPreviewProperty(IsoPVProp);
+
+ FaceActor->setInputShape(ex.Current(),deflection,mode);
+
+ AISActors->AddItem(FaceActor);
+
+ TopExp_Explorer ex2;
+ for (ex2.Init(ex.Current(), TopAbs_EDGE); ex2.More(); ex2.Next()) {
+ const TopoDS_Edge& aEdge = TopoDS::Edge(ex2.Current());
+
+ if (BRep_Tool::Degenerated(aEdge)) {
+ continue;
+ }
+
+ // compute the number of faces
+ Standard_Integer nbf = edgemap.FindFromKey(ex2.Current()).Extent();
+ GEOM_Actor* EdgeActor = GEOM_Actor::New();
+ EdgeActor->SubShapeOn();
+ EdgeActor->setInputShape(ex2.Current(),deflection,mode);
+ switch (nbf) {
+
+ case 0 : // isolated edge
+ {
+ EdgeActor->SetShadingProperty(EdgeIProp);
+ EdgeActor->SetWireframeProperty(EdgeIProp);
+ }
+ break;
+
+ case 1 :// edge in only one face
+ {
+ EdgeActor->SetShadingProperty(EdgeFProp);
+ EdgeActor->SetWireframeProperty(EdgeFProp);
+ }
+ break;
+
+ default : // edge shared by at least two faces
+ {
+ EdgeActor->SetShadingProperty(EdgeSProp);
+ EdgeActor->SetWireframeProperty(EdgeSProp);
+ }
+ }
+ EdgeActor->SetPreviewProperty(EdgePVProp);
+ AISActors->AddItem(EdgeActor);
+ }
+ }
+ } else if ( myShape.ShapeType() == TopAbs_WIRE ) { // WIRE Actor
+ TopExp_Explorer ex;
+ for (ex.Init(myShape, TopAbs_EDGE); ex.More(); ex.Next()) {
+ const TopoDS_Edge& aEdge = TopoDS::Edge(ex.Current());
+
+ if (BRep_Tool::Degenerated(aEdge)) {
+ continue;
+ }
+
+ GEOM_Actor* EdgeActor = GEOM_Actor::New();
+ EdgeActor->setInputShape(ex.Current(),deflection,mode);
+ EdgeActor->SetShadingProperty(EdgeIProp);
+ EdgeActor->SetWireframeProperty(EdgeIProp);
+ EdgeActor->SetPreviewProperty(EdgePVProp);
+
+ AISActors->AddItem(EdgeActor);
+ }
+ } else if ( myShape.ShapeType() == TopAbs_EDGE ) { // EDGE Actor
+ GEOM_Actor* EdgeActor = GEOM_Actor::New();
+ EdgeActor->setInputShape(myShape,deflection,mode);
+ EdgeActor->SetShadingProperty(EdgeIProp);
+ EdgeActor->SetWireframeProperty(EdgeIProp);
+ EdgeActor->SetPreviewProperty(EdgePVProp);
+
+ AISActors->AddItem(EdgeActor);
+ } else if ( myShape.ShapeType() == TopAbs_VERTEX ) { // VERTEX Actor
+ GEOM_Actor* VertexActor = GEOM_Actor::New();
+ VertexActor->setInputShape(myShape,deflection,mode);
+ VertexActor->SetShadingProperty(VertexProp);
+ VertexActor->SetWireframeProperty(VertexProp);
+ VertexActor->SetPreviewProperty(VertexPVProp);
+
+ AISActors->AddItem(VertexActor);
+
+ }
+
+ return AISActors;
+
+}
+
+
+
+//-------------------------------------------------------------
+// BUILD ASSEMBLY
+//-------------------------------------------------------------
+vtkAssembly* GEOM_AssemblyBuilder::BuildAssembly(const TopoDS_Shape& myShape,
+ Standard_Real deflection,
+ Standard_Integer mode,
+ Standard_Boolean forced)
+{
+ // Create a new vtkAssembly
+
+ vtkAssembly* myVTKShape = vtkAssembly::New();
+
+
+ // Create graphics properties
+
+ vtkProperty* IsoProp = vtkProperty::New();
+ vtkProperty* FaceProp = vtkProperty::New();
+ vtkProperty* EdgeFProp = vtkProperty::New();
+ vtkProperty* EdgeSProp = vtkProperty::New();
+ vtkProperty* EdgeIProp = vtkProperty::New();
+ vtkProperty* VertexProp = vtkProperty::New();
+ vtkProperty* EdgePVProp = vtkProperty::New();
+ vtkProperty* VertexPVProp = vtkProperty::New();
+ vtkProperty* IsoPVProp = vtkProperty::New();
+
+ InitProperties(IsoProp,FaceProp,EdgeFProp,EdgeSProp,EdgeIProp,VertexProp,IsoPVProp,EdgePVProp,VertexPVProp);
+
+ MeshShape(myShape,deflection,forced);
+
+
+ // FACE Actor
+
+ // look if edges are free or shared
+ TopTools_IndexedDataMapOfShapeListOfShape edgemap;
+ TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,edgemap);
+
+ TopExp_Explorer ex;
+
+ for (ex.Init(myShape, TopAbs_FACE); ex.More(); ex.Next()) {
+ //const TopoDS_Face& aFace = TopoDS::Face(ex.Current());
+
+ GEOM_Actor* FaceActor = GEOM_Actor::New();
+ FaceActor->SetShadingProperty(FaceProp);
+ FaceActor->SetWireframeProperty(IsoProp);
+
+ vtkAssembly* myFaceAssembly = vtkAssembly::New();
+
+
+ FaceActor->setInputShape(ex.Current(),deflection,mode);
+ myFaceAssembly->AddPart(FaceActor);
+
+ TopExp_Explorer ex2;
+ for (ex2.Init(ex.Current(), TopAbs_EDGE); ex2.More(); ex2.Next()) {
+ const TopoDS_Edge& aEdge = TopoDS::Edge(ex2.Current());
+
+ if (BRep_Tool::Degenerated(aEdge)) {
+ continue;
+ }
+
+
+ // compute the number of faces
+ Standard_Integer nbf = edgemap.FindFromKey(ex2.Current()).Extent();
+ GEOM_Actor* EdgeActor = GEOM_Actor::New();
+ switch (nbf) {
+
+ case 0 : // isolated edge
+ {
+ EdgeActor->SetShadingProperty(EdgeIProp);
+ EdgeActor->SetWireframeProperty(EdgeIProp);
+ }
+ break;
+
+ case 1 :// edge in only one face
+ {
+ EdgeActor->SetShadingProperty(EdgeFProp);
+ EdgeActor->SetWireframeProperty(EdgeFProp);
+ }
+ break;
+
+ default : // edge shared by at least two faces
+ {
+ EdgeActor->SetShadingProperty(EdgeSProp);
+ EdgeActor->SetWireframeProperty(EdgeSProp);
+ }
+ }
+
+ EdgeActor->setInputShape(ex2.Current(),deflection,mode);
+ myFaceAssembly->AddPart(EdgeActor);
+ }
+ myVTKShape->AddPart(myFaceAssembly);
+ }
+
+ return myVTKShape;
+
+}
+
+//-------------------------------------------------------------
+// CHANGE SPECIFIC DISPLAY MODE
+//-------------------------------------------------------------
+void GEOM_AssemblyBuilder::SwitchDisplayMode(vtkAssembly* aOCCAssembly)
+{
+}
+
+void GEOM_AssemblyBuilder::SwitchDisplayMode(vtkActorCollection* aOCCAssembly)
+{
+}
+
+//-------------------------------------------------------------
+// DISPLAY/ERASE
+//-------------------------------------------------------------
+
+void GEOM_AssemblyBuilder::DisplayErase(vtkAssembly* mySALOMEAssembly)
+{
+}
+
+
+void GEOM_AssemblyBuilder::DisplayErase(vtkActorCollection* mySALOMEActors)
+{
+}
+
+
+
+
+
--- /dev/null
+// File : GEOM_AssemblyBuilder.h
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Christophe ATTANASIO
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+// VTK
+#include <vtkAssembly.h>
+#include <vtkPropAssembly.h>
+#include <vtkActorCollection.h>
+
+// Open CASCADE Inlcudes
+#include <TopoDS.hxx>
+#include <TopoDS_Shape.hxx>
+
+class GEOM_AssemblyBuilder {
+
+ private:
+
+ static void InitProperties(vtkProperty* IsoProp,
+ vtkProperty* FaceProp,
+ vtkProperty* EdgeFProp,
+ vtkProperty* EdgeSProp,
+ vtkProperty* EdgeIProp,
+ vtkProperty* VertexProp,
+ vtkProperty* IsoPVProp,
+ vtkProperty* EdgePVProp,
+ vtkProperty* VertePVProp);
+
+ static void MeshShape(const TopoDS_Shape myShape,
+ Standard_Real deflection,
+ Standard_Boolean forced);
+
+
+ public:
+
+
+ //------------------------------------------------------------------
+ // WARNING! Poor graphic performance :-( use BuildActors instead
+ //------------------------------------------------------------------
+
+ static vtkAssembly* BuildAssembly(const TopoDS_Shape& myShape,
+ Standard_Real deflection,
+ Standard_Integer amode,
+ Standard_Boolean forced);
+
+ //------------------------------------------------------------------
+ // Good performance
+ //------------------------------------------------------------------
+
+ static vtkActorCollection* BuildActors(const TopoDS_Shape& myShape,
+ Standard_Real deflection,
+ Standard_Integer amode,
+ Standard_Boolean forced);
+
+
+ //------------------------------------------------------------------
+ // Change mode - Not implemented !!
+ //------------------------------------------------------------------
+
+ static void SwitchDisplayMode(vtkAssembly* mySALOMEAssembly);
+ static void SwitchDisplayMode(vtkActorCollection* mySALOMEActors);
+
+ //------------------------------------------------------------------
+ // Erase/Display - Not implemented !!
+ //------------------------------------------------------------------
+
+ static void DisplayErase(vtkAssembly* mySALOMEAssembly);
+ static void DisplayErase(vtkActorCollection* mySALOMEActors);
+
+
+};
--- /dev/null
+using namespace std;
+// File : GEOM_InteractiveObject.cxx
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Christophe ATTANASIO
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+/*!
+ \class GEOM_InteractiveObject GEOM_InteractiveObject.hxx
+ \brief ....
+*/
+
+#include "GEOM_InteractiveObject.ixx"
+
+GEOM_InteractiveObject::GEOM_InteractiveObject()
+ : SALOME_InteractiveObject()
+{
+ myIOR = "";
+ myFatherIOR = "";
+}
+
+GEOM_InteractiveObject::GEOM_InteractiveObject(const Standard_CString anIOR,
+ const Standard_CString aFatherIOR,
+ const Standard_CString aComponentDataType,
+ const Standard_CString anEntry)
+ : SALOME_InteractiveObject(anEntry,aComponentDataType)
+{
+ myIOR = new char [strlen(anIOR)+1];
+ strcpy( myIOR, anIOR);
+ myFatherIOR = new char [strlen(aFatherIOR)+1];
+ strcpy( myFatherIOR, aFatherIOR);
+}
+
+Standard_CString GEOM_InteractiveObject::getIOR(){
+ return myIOR;
+}
+Standard_CString GEOM_InteractiveObject::getFatherIOR(){
+ return myFatherIOR;
+}
+
+Standard_Boolean GEOM_InteractiveObject::isSame(const Handle(SALOME_InteractiveObject)& anIO ){
+ if ( anIO->hasEntry() && this->hasEntry() ) {
+ if ( strcmp(myEntry, anIO->getEntry() ) == 0 )
+ return Standard_True;
+ }
+
+ if ( anIO->IsKind(STANDARD_TYPE(GEOM_InteractiveObject))) {
+ Handle(GEOM_InteractiveObject) theIO = Handle(GEOM_InteractiveObject)::DownCast( anIO );
+ if ( strcmp(myIOR, theIO->getIOR() ) == 0 )
+ return Standard_True;
+ }
+
+ return Standard_False;
+}
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#ifndef _GEOM_InteractiveObject_HeaderFile
+#define _GEOM_InteractiveObject_HeaderFile
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Handle_GEOM_InteractiveObject_HeaderFile
+#include "Handle_GEOM_InteractiveObject.hxx"
+#endif
+
+#ifndef _Standard_CString_HeaderFile
+#include <Standard_CString.hxx>
+#endif
+#ifndef _SALOME_InteractiveObject_HeaderFile
+#include "SALOME_InteractiveObject.hxx"
+#endif
+#ifndef _Standard_Boolean_HeaderFile
+#include <Standard_Boolean.hxx>
+#endif
+#ifndef _Handle_SALOME_InteractiveObject_HeaderFile
+#include "Handle_SALOME_InteractiveObject.hxx"
+#endif
+class SALOME_InteractiveObject;
+
+
+class GEOM_InteractiveObject : public SALOME_InteractiveObject {
+
+public:
+
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ // Methods PUBLIC
+ //
+Standard_EXPORT GEOM_InteractiveObject();
+Standard_EXPORT GEOM_InteractiveObject(const Standard_CString anIOR,
+ const Standard_CString aFatherIOR,
+ const Standard_CString aComponentDataType,
+ const Standard_CString anEntry = "");
+Standard_EXPORT void setIOR(const Standard_CString anEntry) ;
+Standard_EXPORT Standard_CString getIOR() ;
+Standard_EXPORT void setFatherIOR(const Standard_CString anEntry) ;
+Standard_EXPORT Standard_CString getFatherIOR() ;
+Standard_EXPORT virtual Standard_Boolean isSame(const Handle(SALOME_InteractiveObject)& anIO) ;
+Standard_EXPORT ~GEOM_InteractiveObject();
+
+
+
+
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& GEOM_InteractiveObject_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
+
+protected:
+
+ // Methods PROTECTED
+ //
+
+
+ // Fields PROTECTED
+ //
+
+
+private:
+
+ // Methods PRIVATE
+ //
+
+
+ // Fields PRIVATE
+ //
+Standard_CString myIOR;
+Standard_CString myFatherIOR;
+
+
+};
+
+
+
+
+
+// other inline functions and methods (like "C++: function call" methods)
+//
+
+
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+//
+#include "GEOM_InteractiveObject.jxx"
+
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+GEOM_InteractiveObject::~GEOM_InteractiveObject() {}
+
+
+
+Standard_EXPORT Handle_Standard_Type& GEOM_InteractiveObject_Type_()
+{
+
+ static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_InteractiveObject);
+ if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_InteractiveObject);
+ static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
+ if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
+ static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
+ if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
+
+
+ static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
+ static Handle_Standard_Type _aType = new Standard_Type("GEOM_InteractiveObject",
+ sizeof(GEOM_InteractiveObject),
+ 1,
+ (Standard_Address)_Ancestors,
+ (Standard_Address)NULL);
+
+ return _aType;
+}
+
+
+// DownCast method
+// allow safe downcasting
+//
+const Handle(GEOM_InteractiveObject) Handle(GEOM_InteractiveObject)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+ Handle(GEOM_InteractiveObject) _anOtherObject;
+
+ if (!AnObject.IsNull()) {
+ if (AnObject->IsKind(STANDARD_TYPE(GEOM_InteractiveObject))) {
+ _anOtherObject = Handle(GEOM_InteractiveObject)((Handle(GEOM_InteractiveObject)&)AnObject);
+ }
+ }
+
+ return _anOtherObject ;
+}
+const Handle(Standard_Type)& GEOM_InteractiveObject::DynamicType() const
+{
+ return STANDARD_TYPE(GEOM_InteractiveObject) ;
+}
+Standard_Boolean GEOM_InteractiveObject::IsKind(const Handle(Standard_Type)& AType) const
+{
+ return (STANDARD_TYPE(GEOM_InteractiveObject) == AType || SALOME_InteractiveObject::IsKind(AType));
+}
+Handle_GEOM_InteractiveObject::~Handle_GEOM_InteractiveObject() {}
+
--- /dev/null
+#ifndef _SALOME_InteractiveObject_HeaderFile
+#include "SALOME_InteractiveObject.hxx"
+#endif
+#ifndef _GEOM_InteractiveObject_HeaderFile
+#include "GEOM_InteractiveObject.hxx"
+#endif
--- /dev/null
+using namespace std;
+// File : GEOM_OCCReader.h
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Christophe ATTANASIO
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+#include "GEOM_OCCReader.h"
+
+// SALOME Includes
+#include "utilities.h"
+
+// VTK Includes
+#include <vtkObjectFactory.h>
+#include <vtkMergePoints.h>
+
+// OpenCASCADE Includes
+#include <BRepAdaptor_Surface.hxx>
+#include <TopExp_Explorer.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
+#include <Poly_Triangulation.hxx>
+#include <Poly_Polygon3D.hxx>
+#include <BRep_Tool.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Wire.hxx>
+#include <BRepBndLib.hxx>
+#include <TopoDS.hxx>
+#include <TopAbs.hxx>
+#include <Precision.hxx>
+#include <BRepTools.hxx>
+#include <BRep_Tool.hxx>
+#include <Geom2dAdaptor_Curve.hxx>
+#include <Geom2dHatch_Intersector.hxx>
+#include <Geom2dHatch_Hatcher.hxx>
+#include <Geom2d_Curve.hxx>
+#include <Geom2d_Line.hxx>
+#include <Geom2d_TrimmedCurve.hxx>
+#include <HatchGen_Domain.hxx>
+#include <GeomAbs_IsoType.hxx>
+#include <Precision.hxx>
+#include <TopAbs_ShapeEnum.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Edge.hxx>
+#include <gp_Dir2d.hxx>
+#include <gp_Pnt2d.hxx>
+#include <TColStd_Array1OfInteger.hxx>
+#include <TColStd_Array1OfReal.hxx>
+#include <Adaptor3d_HCurve.hxx>
+
+
+#define MAX2(X, Y) ( Abs(X) > Abs(Y)? Abs(X) : Abs(Y) )
+#define MAX3(X, Y, Z) ( MAX2 ( MAX2(X,Y) , Z) )
+
+// Constante for iso building
+static Standard_Real IntersectorConfusion = 1.e-10 ; // -8 ;
+static Standard_Real IntersectorTangency = 1.e-10 ; // -8 ;
+static Standard_Real HatcherConfusion2d = 1.e-8 ;
+static Standard_Real HatcherConfusion3d = 1.e-8 ;
+
+static Standard_Integer lastVTKpoint = 0;
+static Standard_Integer PlotCount = 0;
+static Standard_Real IsoRatio = 1.001;
+static Standard_Integer MaxPlotCount = 5;
+
+//=======================================================================
+// Function : New
+// Purpose :
+//=======================================================================
+
+GEOM_OCCReader* GEOM_OCCReader::New()
+{
+ vtkObject* ret = vtkObjectFactory::CreateInstance("GEOM_OCCReader");
+ if(ret) {
+ return (GEOM_OCCReader*)ret;
+ }
+ return new GEOM_OCCReader;
+}
+
+//=======================================================================
+// Function : GEOM_OCCReader
+// Purpose :
+//=======================================================================
+
+GEOM_OCCReader::GEOM_OCCReader()
+{
+ //this->myShape = NULL;
+ this->amode = 0;
+ this->forced = Standard_False;
+ this->discretiso = 15;
+ this->nbisos = 1;
+}
+//=======================================================================
+// Function : ~GEOM_OCCReader
+// Purpose :
+//=======================================================================
+
+GEOM_OCCReader::~GEOM_OCCReader()
+{
+}
+
+
+//=======================================================================
+// Function : Execute
+// Purpose :
+//=======================================================================
+
+
+void GEOM_OCCReader::Execute() {
+
+ vtkPolyData* output = this->GetOutput();
+ vtkPoints* Pts = NULL;
+ vtkCellArray* Cells = NULL;
+ TopLoc_Location aLoc;
+
+ // Allocation
+ Pts = vtkPoints::New();
+ Cells = vtkCellArray::New();
+
+ //Compute number of triangles and points
+ Standard_Integer nbpoly=0,nbpts=0;
+
+ if(amode==1) {
+ //for shading
+
+ if(myShape.ShapeType() == TopAbs_FACE) {
+ // whole FACE
+ const TopoDS_Face& aFace = TopoDS::Face(myShape);
+ Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation(aFace,aLoc);
+ if(aPoly.IsNull()) {
+ Pts->Delete();
+ Cells->Delete();
+ return;
+ }
+
+ nbpts = aPoly->NbNodes();
+ nbpoly = aPoly->NbTriangles();
+
+ Pts->SetNumberOfPoints(nbpts);
+ Cells->Allocate(Cells->EstimateSize(nbpoly,3));
+ }
+ else {
+ Cells->Delete();
+ Pts->Delete();
+ return;
+ }
+ }
+
+ // Start computation
+ if(amode == 0) {
+ ComputeWireframe(Pts,Cells);
+ output->SetPoints(Pts);
+ output->SetLines(Cells);
+ output->Squeeze();
+ }
+ else {
+ if(myShape.ShapeType() == TopAbs_FACE) {
+ ComputeShading(Pts,Cells);
+
+ output->SetPoints(Pts);
+ output->SetPolys(Cells);
+ output->Squeeze();
+ }
+ }
+ Pts->Delete();
+ Cells->Delete();
+
+}
+
+//=======================================================================
+// Function : ComputeWireframe
+// Purpose : Compute the shape in CAD wireframe mode
+//=======================================================================
+
+void GEOM_OCCReader::ComputeWireframe(vtkPoints* Pts,vtkCellArray* Cells){
+
+ // Check the type of the shape:
+ if(myShape.ShapeType() == TopAbs_FACE) {
+ // Face
+ TransferFaceWData(TopoDS::Face(myShape),Pts,Cells);
+ } else if(myShape.ShapeType() == TopAbs_EDGE) {
+ // Edge
+ TransferEdgeWData(TopoDS::Edge(myShape),Pts,Cells);
+ } else {
+ if(myShape.ShapeType() == TopAbs_VERTEX) {
+ // Vertex
+ TransferVertexWData(TopoDS::Vertex(myShape),Pts,Cells);
+ }
+ }
+}
+
+//=======================================================================
+// Function : TransferFaceWData
+// Purpose : Transfert wireframe data for FACE
+//=======================================================================
+
+void GEOM_OCCReader::TransferFaceWData(const TopoDS_Face& aFace,
+ vtkPoints* Pts,
+ vtkCellArray* Cells)
+{
+ TopoDS_Face aCopyFace = aFace;
+ aCopyFace.Orientation (TopAbs_FORWARD);
+ createISO(aCopyFace,Precision::Infinite(),1,Pts,Cells);
+}
+
+//=======================================================================
+// Function : createISO
+// Purpose : Create ISO for Face Wireframe representation
+//=======================================================================
+
+void GEOM_OCCReader::createISO (const TopoDS_Face& TopologicalFace,
+ const Standard_Real Infinite,
+ const Standard_Integer NbIsos,
+ vtkPoints* Pts,
+ vtkCellArray* Cell)
+{
+ Geom2dHatch_Hatcher aHatcher (Geom2dHatch_Intersector (IntersectorConfusion,
+ IntersectorTangency),
+ HatcherConfusion2d,
+ HatcherConfusion3d,
+ Standard_True,
+ Standard_False);
+
+ Standard_Real myInfinite,myUMin,myUMax,myVMin,myVMax;
+ //myInfinite = Precision::Infinite();
+ myInfinite = 1e38; // VTK uses float numbers - Precision::Infinite() is double and can not be accepted.
+
+ Standard_Integer myNbDom;
+ TColStd_Array1OfReal myUPrm(1, NbIsos),myVPrm(1, NbIsos);
+ TColStd_Array1OfInteger myUInd(1, NbIsos),myVInd(1, NbIsos);
+
+ myUInd.Init(0);
+ myVInd.Init(0);
+
+ //-----------------------------------------------------------------------
+ // If the Min Max bounds are infinite, there are bounded to Infinite
+ // value.
+ //-----------------------------------------------------------------------
+
+ BRepTools::UVBounds (TopologicalFace, myUMin, myUMax, myVMin, myVMax) ;
+ Standard_Boolean InfiniteUMin = Precision::IsNegativeInfinite (myUMin) ;
+ Standard_Boolean InfiniteUMax = Precision::IsPositiveInfinite (myUMax) ;
+ Standard_Boolean InfiniteVMin = Precision::IsNegativeInfinite (myVMin) ;
+ Standard_Boolean InfiniteVMax = Precision::IsPositiveInfinite (myVMax) ;
+ if (InfiniteUMin && InfiniteUMax) {
+ myUMin = - myInfinite ;
+ myUMax = myInfinite ;
+ } else if (InfiniteUMin) {
+ myUMin = myUMax - myInfinite ;
+ } else if (InfiniteUMax) {
+ myUMax = myUMin + myInfinite ;
+ }
+ if (InfiniteVMin && InfiniteVMax) {
+ myVMin = - myInfinite ;
+ myVMax = myInfinite ;
+ } else if (InfiniteVMin) {
+ myVMin = myVMax - myInfinite ;
+ } else if (InfiniteVMax) {
+ myVMax = myVMin + myInfinite ;
+ }
+
+ //-----------------------------------------------------------------------
+ // Retreiving the edges and loading them into the hatcher.
+ //-----------------------------------------------------------------------
+
+ TopExp_Explorer ExpEdges ;
+ for (ExpEdges.Init (TopologicalFace, TopAbs_EDGE) ; ExpEdges.More() ; ExpEdges.Next()) {
+ const TopoDS_Edge& TopologicalEdge = TopoDS::Edge (ExpEdges.Current()) ;
+ Standard_Real U1, U2 ;
+ const Handle(Geom2d_Curve) PCurve = BRep_Tool::CurveOnSurface (TopologicalEdge, TopologicalFace, U1, U2) ;
+
+ if ( PCurve.IsNull() ) {
+ return;
+ }
+
+ if ( U1==U2) {
+ return;
+ }
+
+ //-- Test if a TrimmedCurve is necessary
+ if( Abs(PCurve->FirstParameter()-U1)<= Precision::PConfusion()
+ && Abs(PCurve->LastParameter()-U2)<= Precision::PConfusion()) {
+ aHatcher.AddElement (PCurve, TopologicalEdge.Orientation()) ;
+ }
+ else {
+ if (!PCurve->IsPeriodic()) {
+ Handle (Geom2d_TrimmedCurve) TrimPCurve =Handle(Geom2d_TrimmedCurve)::DownCast(PCurve);
+ if (!TrimPCurve.IsNull()) {
+ if (TrimPCurve->BasisCurve()->FirstParameter()-U1 > Precision::PConfusion() ||
+ U2-TrimPCurve->BasisCurve()->LastParameter() > Precision::PConfusion()) {
+ aHatcher.AddElement (PCurve, TopologicalEdge.Orientation()) ;
+ return;
+ }
+ }
+ else {
+ if (PCurve->FirstParameter()-U1 > Precision::PConfusion()){
+ U1=PCurve->FirstParameter();
+ }
+ if (U2-PCurve->LastParameter() > Precision::PConfusion()){
+ U2=PCurve->LastParameter();
+ }
+ }
+ }
+ Handle (Geom2d_TrimmedCurve) TrimPCurve = new Geom2d_TrimmedCurve (PCurve, U1, U2) ;
+ aHatcher.AddElement (TrimPCurve, TopologicalEdge.Orientation()) ;
+ }
+ }
+
+
+ //-----------------------------------------------------------------------
+ // Loading and trimming the hatchings.
+ //-----------------------------------------------------------------------
+
+ Standard_Integer IIso ;
+ Standard_Real DeltaU = Abs (myUMax - myUMin) ;
+ Standard_Real DeltaV = Abs (myVMax - myVMin) ;
+ Standard_Real confusion = Min (DeltaU, DeltaV) * HatcherConfusion3d ;
+ aHatcher.Confusion3d (confusion) ;
+
+ Standard_Real StepU = DeltaU / (Standard_Real) NbIsos ;
+ if (StepU > confusion) {
+ Standard_Real UPrm = myUMin + StepU / 2. ;
+ gp_Dir2d Dir (0., 1.) ;
+ for (IIso = 1 ; IIso <= NbIsos ; IIso++) {
+ myUPrm(IIso) = UPrm ;
+ gp_Pnt2d Ori (UPrm, 0.) ;
+ Geom2dAdaptor_Curve HCur (new Geom2d_Line (Ori, Dir)) ;
+ myUInd(IIso) = aHatcher.AddHatching (HCur) ;
+ UPrm += StepU ;
+ }
+ }
+
+ Standard_Real StepV = DeltaV / (Standard_Real) NbIsos ;
+ if (StepV > confusion) {
+ Standard_Real VPrm = myVMin + StepV / 2. ;
+ gp_Dir2d Dir (1., 0.) ;
+ for (IIso = 1 ; IIso <= NbIsos ; IIso++) {
+ myVPrm(IIso) = VPrm ;
+ gp_Pnt2d Ori (0., VPrm) ;
+ Geom2dAdaptor_Curve HCur (new Geom2d_Line (Ori, Dir)) ;
+ myVInd(IIso) = aHatcher.AddHatching (HCur) ;
+ VPrm += StepV ;
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ // Computation.
+ //-----------------------------------------------------------------------
+
+ aHatcher.Trim() ;
+
+ myNbDom = 0 ;
+ for (IIso = 1 ; IIso <= NbIsos ; IIso++) {
+ Standard_Integer Index ;
+
+ Index = myUInd(IIso) ;
+ if (Index != 0) {
+ if (aHatcher.TrimDone (Index) && !aHatcher.TrimFailed (Index)) {
+ aHatcher.ComputeDomains (Index);
+ if (aHatcher.IsDone (Index)) myNbDom = myNbDom + aHatcher.NbDomains (Index) ;
+ }
+ }
+
+ Index = myVInd(IIso) ;
+ if (Index != 0) {
+ if (aHatcher.TrimDone (Index) && !aHatcher.TrimFailed (Index)) {
+ aHatcher.ComputeDomains (Index);
+ if (aHatcher.IsDone (Index)) myNbDom = myNbDom + aHatcher.NbDomains (Index) ;
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ // Push iso lines in vtk kernel
+ //-----------------------------------------------------------------------
+
+
+ Standard_Integer pt_start_idx = 0;
+
+ for (Standard_Integer UIso = myUPrm.Lower() ; UIso <= myUPrm.Upper() ; UIso++) {
+ Standard_Integer UInd = myUInd.Value (UIso) ;
+ if (UInd != 0) {
+ Standard_Real UPrm = myUPrm.Value (UIso) ;
+ if (!aHatcher.IsDone (UInd)) {
+ MESSAGE("DBRep_IsoBuilder:: U iso of parameter: "<<UPrm)
+ switch (aHatcher.Status (UInd)) {
+ case HatchGen_NoProblem : MESSAGE("No Problem") ; break ;
+ case HatchGen_TrimFailure : MESSAGE("Trim Failure") ; break ;
+ case HatchGen_TransitionFailure : MESSAGE("Transition Failure") ; break ;
+ case HatchGen_IncoherentParity : MESSAGE("Incoherent Parity") ; break ;
+ case HatchGen_IncompatibleStates : MESSAGE("Incompatible States") ; break ;
+ }
+ } else {
+ Standard_Integer NbDom = aHatcher.NbDomains (UInd) ;
+ for (Standard_Integer IDom = 1 ; IDom <= NbDom ; IDom++) {
+ const HatchGen_Domain& Dom = aHatcher.Domain (UInd, IDom) ;
+ Standard_Real V1 = Dom.HasFirstPoint() ? Dom.FirstPoint().Parameter() : myVMin - myInfinite ;
+ Standard_Real V2 = Dom.HasSecondPoint() ? Dom.SecondPoint().Parameter() : myVMax + myInfinite ;
+ DrawIso(GeomAbs_IsoU, UPrm, V1, V2, Pts, Cell,pt_start_idx);
+ }
+ }
+ }
+ }
+
+ for (Standard_Integer VIso = myVPrm.Lower() ; VIso <= myVPrm.Upper() ; VIso++) {
+ Standard_Integer VInd = myVInd.Value (VIso) ;
+ if (VInd != 0) {
+ Standard_Real VPrm = myVPrm.Value (VIso) ;
+ if (!aHatcher.IsDone (VInd)) {
+ MESSAGE("DBRep_IsoBuilder:: V iso of parameter: "<<VPrm)
+ switch (aHatcher.Status (VInd)) {
+ case HatchGen_NoProblem : MESSAGE("No Problem") ; break ;
+ case HatchGen_TrimFailure : MESSAGE("Trim Failure") ; break ;
+ case HatchGen_TransitionFailure : MESSAGE("Transition Failure") ; break ;
+ case HatchGen_IncoherentParity : MESSAGE("Incoherent Parity") ; break ;
+ case HatchGen_IncompatibleStates : MESSAGE("Incompatible States") ; break ;
+ }
+ } else {
+ Standard_Integer NbDom = aHatcher.NbDomains (VInd) ;
+ for (Standard_Integer IDom = 1 ; IDom <= NbDom ; IDom++) {
+ const HatchGen_Domain& Dom = aHatcher.Domain (VInd, IDom) ;
+ Standard_Real U1 = Dom.HasFirstPoint() ? Dom.FirstPoint().Parameter() : myVMin - myInfinite ;
+ Standard_Real U2 = Dom.HasSecondPoint() ? Dom.SecondPoint().Parameter() : myVMax + myInfinite ;
+ DrawIso(GeomAbs_IsoV, VPrm, U1, U2, Pts, Cell,pt_start_idx) ;
+ }
+ }
+ }
+ }
+
+}
+
+//=======================================================================
+// Function : MoveTo
+// Purpose : Init VTK ISO PLOT
+//=======================================================================
+void GEOM_OCCReader::MoveTo(gp_Pnt P,
+ vtkPoints* Pts)
+{
+ float coord[3];
+
+ coord[0] = P.X(); coord[1] = P.Y(); coord[2] = P.Z();
+ lastVTKpoint = Pts->InsertNextPoint(coord);
+
+}
+
+//=======================================================================
+// Function : DrawTo
+// Purpose : Plot point in VTK
+//=======================================================================
+void GEOM_OCCReader::DrawTo(gp_Pnt P,
+ vtkPoints* Pts,
+ vtkCellArray* Cells)
+{
+ float coord[3];
+ coord[0] = P.X(); coord[1] = P.Y(); coord[2] = P.Z();
+ Standard_Integer NewVTKpoint = Pts->InsertNextPoint(coord);
+
+ int pts[2];
+ pts[0] = lastVTKpoint;
+ pts[1] = NewVTKpoint;
+
+ Cells->InsertNextCell(2,pts);
+
+ lastVTKpoint = NewVTKpoint;
+}
+
+
+//=======================================================================
+// Function : DrawIso
+// Purpose : Draw an iso on vtk
+//=======================================================================
+void GEOM_OCCReader::DrawIso(GeomAbs_IsoType T,
+ Standard_Real Par,
+ Standard_Real T1,
+ Standard_Real T2,
+ vtkPoints* Pts,
+ vtkCellArray* Cells,
+ Standard_Integer& startidx)
+{
+
+ Standard_Boolean halt = Standard_False;
+ Standard_Integer j,myDiscret = discretiso;
+ Standard_Real U1,U2,V1,V2,stepU=0.,stepV=0.;
+ gp_Pnt P;
+ TopLoc_Location l;
+
+ const Handle(Geom_Surface)& S = BRep_Tool::Surface(TopoDS::Face(myShape),l);
+ if (!S.IsNull()) {
+ BRepAdaptor_Surface S(TopoDS::Face(myShape),Standard_False);
+
+ GeomAbs_SurfaceType SurfType = S.GetType();
+
+ GeomAbs_CurveType CurvType = GeomAbs_OtherCurve;
+
+ Standard_Integer Intrv, nbIntv;
+ Standard_Integer nbUIntv = S.NbUIntervals(GeomAbs_CN);
+ Standard_Integer nbVIntv = S.NbVIntervals(GeomAbs_CN);
+ TColStd_Array1OfReal TI(1,Max(nbUIntv, nbVIntv)+1);
+
+
+ if (T == GeomAbs_IsoU) {
+ S.VIntervals(TI, GeomAbs_CN);
+ V1 = Max(T1, TI(1));
+ V2 = Min(T2, TI(2));
+ U1 = Par;
+ U2 = Par;
+ stepU = 0;
+ nbIntv = nbVIntv;
+ }
+ else {
+ S.UIntervals(TI, GeomAbs_CN);
+ U1 = Max(T1, TI(1));
+ U2 = Min(T2, TI(2));
+ V1 = Par;
+ V2 = Par;
+ stepV = 0;
+ nbIntv = nbUIntv;
+ }
+
+ S.D0(U1,V1,P);
+ MoveTo(P,Pts);
+
+ for (Intrv = 1; Intrv <= nbIntv; Intrv++) {
+
+ if (TI(Intrv) <= T1 && TI(Intrv + 1) <= T1)
+ continue;
+ if (TI(Intrv) >= T2 && TI(Intrv + 1) >= T2)
+ continue;
+ if (T == GeomAbs_IsoU) {
+ V1 = Max(T1, TI(Intrv));
+ V2 = Min(T2, TI(Intrv + 1));
+ stepV = (V2 - V1) / myDiscret;
+ }
+ else {
+ U1 = Max(T1, TI(Intrv));
+ U2 = Min(T2, TI(Intrv + 1));
+ stepU = (U2 - U1) / myDiscret;
+ }
+
+ switch (SurfType) {
+ //-------------GeomAbs_Plane---------------
+ case GeomAbs_Plane :
+ break;
+ //----GeomAbs_Cylinder GeomAbs_Cone------
+ case GeomAbs_Cylinder :
+ case GeomAbs_Cone :
+ if (T == GeomAbs_IsoV) {
+ for (j = 1; j < myDiscret; j++) {
+ U1 += stepU;
+ V1 += stepV;
+ S.D0(U1,V1,P);
+ DrawTo(P,Pts,Cells);
+ }
+ }
+ break;
+ //---GeomAbs_Sphere GeomAbs_Torus--------
+ //GeomAbs_BezierSurface GeomAbs_BezierSurface
+ case GeomAbs_Sphere :
+ case GeomAbs_Torus :
+ case GeomAbs_OffsetSurface :
+ case GeomAbs_OtherSurface :
+ for (j = 1; j < myDiscret; j++) {
+ U1 += stepU;
+ V1 += stepV;
+ S.D0(U1,V1,P);
+ DrawTo(P,Pts,Cells);
+ }
+ break;
+ //-------------GeomAbs_BSplineSurface------
+ case GeomAbs_BezierSurface :
+ case GeomAbs_BSplineSurface :
+ for (j = 1; j <= myDiscret/2; j++) {
+
+ PlotCount = 0;
+
+ PlotIso ( S, T, U1, V1, (T == GeomAbs_IsoV) ? stepU*2. : stepV*2., halt, Pts, Cells);
+ U1 += stepU*2.;
+ V1 += stepV*2.;
+ }
+ break;
+ //-------------GeomAbs_SurfaceOfExtrusion--
+ //-------------GeomAbs_SurfaceOfRevolution-
+ case GeomAbs_SurfaceOfExtrusion :
+ case GeomAbs_SurfaceOfRevolution :
+ if ((T == GeomAbs_IsoV && SurfType == GeomAbs_SurfaceOfRevolution) ||
+ (T == GeomAbs_IsoU && SurfType == GeomAbs_SurfaceOfExtrusion)) {
+ if (SurfType == GeomAbs_SurfaceOfExtrusion) break;
+ for (j = 1; j < myDiscret; j++) {
+ U1 += stepU;
+ V1 += stepV;
+ S.D0(U1,V1,P);
+ DrawTo(P,Pts,Cells);
+ }
+ } else {
+ CurvType = (S.BasisCurve())->GetType();
+ switch (CurvType) {
+ case GeomAbs_Line :
+ break;
+ case GeomAbs_Circle :
+ case GeomAbs_Ellipse :
+ for (j = 1; j < myDiscret; j++) {
+ U1 += stepU;
+ V1 += stepV;
+ S.D0(U1,V1,P);
+ DrawTo(P,Pts,Cells);
+ }
+ break;
+ case GeomAbs_Parabola :
+ case GeomAbs_Hyperbola :
+ case GeomAbs_BezierCurve :
+ case GeomAbs_BSplineCurve :
+ case GeomAbs_OtherCurve :
+ for (j = 1; j <= myDiscret/2; j++) {
+
+ PlotCount = 0;
+
+ PlotIso ( S, T, U1, V1,(T == GeomAbs_IsoV) ? stepU*2. : stepV*2., halt, Pts, Cells);
+ U1 += stepU*2.;
+ V1 += stepV*2.;
+ }
+ break;
+ }
+ }
+ }
+ }
+ S.D0(U2,V2,P);
+ DrawTo(P,Pts,Cells);
+ }
+}
+
+//=======================================================================
+// Function : PlotIso
+// Purpose : Plot iso for other surface
+//=======================================================================
+
+void GEOM_OCCReader::PlotIso (BRepAdaptor_Surface& S,
+ GeomAbs_IsoType T,
+ Standard_Real& U,
+ Standard_Real& V,
+ Standard_Real Step,
+ Standard_Boolean& halt,
+ vtkPoints* Pts,
+ vtkCellArray* Cells)
+{
+
+ ++PlotCount;
+
+ gp_Pnt Pl, Pr, Pm;
+
+ if (T == GeomAbs_IsoU) {
+ S.D0(U, V, Pl);
+ S.D0(U, V + Step/2., Pm);
+ S.D0(U, V + Step, Pr);
+ } else {
+ S.D0(U, V, Pl);
+ S.D0(U + Step/2., V, Pm);
+ S.D0(U + Step, V, Pr);
+ }
+
+ if (PlotCount > MaxPlotCount) {
+ DrawTo(Pr,Pts,Cells);
+ return;
+ }
+
+ if (Pm.Distance(Pl) + Pm.Distance(Pr) <= IsoRatio*Pl.Distance(Pr)) {
+ DrawTo(Pr,Pts,Cells);
+ } else
+ if (T == GeomAbs_IsoU) {
+ PlotIso ( S, T, U, V, Step/2, halt, Pts, Cells);
+ Standard_Real aLocalV = V + Step/2 ;
+ PlotIso ( S, T, U, aLocalV , Step/2, halt, Pts, Cells);
+ } else {
+ PlotIso ( S, T, U, V, Step/2, halt, Pts, Cells);
+ Standard_Real aLocalU = U + Step/2 ;
+ PlotIso ( S, T, aLocalU , V, Step/2, halt, Pts, Cells);
+ }
+}
+
+//=======================================================================
+// Function : TransferEdgeWData
+// Purpose : Transfert wireframe data for EDGE
+//=======================================================================
+
+void GEOM_OCCReader::TransferEdgeWData(const TopoDS_Edge& aEdge,
+ vtkPoints* Pts,
+ vtkCellArray* Cells) {
+
+
+ Handle(Poly_PolygonOnTriangulation) aEdgePoly;
+ Standard_Integer i = 1;
+ Handle(Poly_Triangulation) T;
+ TopLoc_Location aEdgeLoc;
+ BRep_Tool::PolygonOnTriangulation(aEdge, aEdgePoly, T, aEdgeLoc, i);
+
+ Handle(Poly_Polygon3D) P;
+ if(aEdgePoly.IsNull()) {
+ P = BRep_Tool::Polygon3D(aEdge, aEdgeLoc);
+ }
+
+ if(P.IsNull() && aEdgePoly.IsNull())
+ return;
+
+ // Location edges
+ //---------------
+
+ gp_Trsf edgeTransf;
+ Standard_Boolean isidtrsf = true;
+ if(!aEdgeLoc.IsIdentity()) {
+ isidtrsf = false;
+ edgeTransf = aEdgeLoc.Transformation();
+ }
+
+ Standard_Integer nbnodes;
+ if (aEdgePoly.IsNull()) {
+ nbnodes = P->NbNodes();
+ const TColgp_Array1OfPnt& theNodesP = P->Nodes();
+
+ float coord[3];
+ int pts[2];
+
+ for(int j=1;j<nbnodes;j++) {
+ gp_Pnt pt1 = theNodesP(j);
+ gp_Pnt pt2 = theNodesP(j+1);
+
+ if(!isidtrsf) {
+ // apply edge transformation
+ pt1.Transform(edgeTransf);
+ pt2.Transform(edgeTransf);
+ }
+
+ // insert pt1
+ coord[0] = pt1.X(); coord[1] = pt1.Y(); coord[2] = pt1.Z();
+ pts[0] = Pts->InsertNextPoint(coord);
+
+ // insert pt2
+ coord[0] = pt2.X(); coord[1] = pt2.Y(); coord[2] = pt2.Z();
+ pts[1] = Pts->InsertNextPoint(coord);
+
+ // insert line (pt1,pt2)
+ Cells->InsertNextCell(2,pts);
+ }
+ } else {
+ nbnodes = aEdgePoly->NbNodes();
+ const TColStd_Array1OfInteger& Nodesidx = aEdgePoly->Nodes();
+ const TColgp_Array1OfPnt& theNodesPoly = T->Nodes();
+
+ float coord[3];
+ int pts[2];
+
+ for(int j=1;j<nbnodes;j++) {
+ Standard_Integer id1 = Nodesidx(j);
+ Standard_Integer id2 = Nodesidx(j+1);
+
+ gp_Pnt pt1 = theNodesPoly(id1);
+ gp_Pnt pt2 = theNodesPoly(id2);
+
+ if(!isidtrsf) {
+ // apply edge transformation
+ pt1.Transform(edgeTransf);
+ pt2.Transform(edgeTransf);
+ }
+
+ // insert pt1
+ coord[0] = pt1.X(); coord[1] = pt1.Y(); coord[2] = pt1.Z();
+ pts[0] = Pts->InsertNextPoint(coord);
+
+ // insert pt2
+ coord[0] = pt2.X(); coord[1] = pt2.Y(); coord[2] = pt2.Z();
+ pts[1] = Pts->InsertNextPoint(coord);
+
+ // insert line (pt1,pt2)
+ Cells->InsertNextCell(2,pts);
+ }
+ }
+}
+
+/* Standard_Integer nbnodes = aEdgePoly->NbNodes();
+ const TColStd_Array1OfInteger& Nodesidx = aEdgePoly->Nodes();
+ const TColgp_Array1OfPnt& theNodes = T->Nodes();
+
+ float coord[3];
+ int pts[2];
+
+
+ // PUSH NODES
+ for(i=1;i<=nbnodes;i++) {
+ Standard_Integer id = Nodesidx(i);
+ gp_Pnt pt = theNodes(id);
+
+ float coord[3];
+ if(!isidtrsf) pt.Transform(edgeTransf);
+
+ coord[0] = pt.X(); coord[1] = pt.Y(); coord[2] = pt.Z();
+
+ Pts->SetPoint(id-1,coord);
+
+ }
+
+ // PUSH EDGES
+ for(i=1;i<nbnodes;i++) {
+
+ Standard_Integer id1 = Nodesidx(i);
+ Standard_Integer id2 = Nodesidx(i+1);
+
+ int pts[2];
+ pts[0] = id1-1; pts[1] = id2-1;
+
+ // insert line (pt1,pt2)
+ Cells->InsertNextCell(2,pts);
+ }
+
+
+ }*/
+
+//=======================================================================
+// Function : TransferVertexWData
+// Purpose : Transfert wireframe data for VERTEX
+//=======================================================================
+
+void GEOM_OCCReader::TransferVertexWData(const TopoDS_Vertex& aVertex,
+ vtkPoints* Pts,
+ vtkCellArray* Cells) {
+#define ZERO_COORD coord[0] = 0.0; coord[1] = 0.0; coord[2] = 0.0
+
+ gp_Pnt P = BRep_Tool::Pnt( aVertex );
+ float delta = 1, coord[3];
+ int pts[2];
+ // insert pt
+ ZERO_COORD; coord[0] = +delta;
+ pts[0] = Pts->InsertNextPoint(coord);
+ coord[0] = -delta;
+ pts[1] = Pts->InsertNextPoint(coord);
+ // insert line (pt1,pt2)
+ Cells->InsertNextCell(2,pts);
+
+ ZERO_COORD; coord[1] = +delta;
+ pts[0] = Pts->InsertNextPoint(coord);
+ coord[1] = -delta;
+ pts[1] = Pts->InsertNextPoint(coord);
+ // insert line (pt1,pt2)
+ Cells->InsertNextCell(2,pts);
+
+ ZERO_COORD; coord[2] = +delta;
+ pts[0] = Pts->InsertNextPoint(coord);
+ coord[2] = -delta;
+ pts[1] = Pts->InsertNextPoint(coord);
+ // insert line (pt1,pt2)
+ Cells->InsertNextCell(2,pts);
+
+#undef ZERO_COORD
+}
+
+//=======================================================================
+// Function : TransferEdgeSData(
+// Purpose : Transfert shading data for EDGE
+//=======================================================================
+
+void GEOM_OCCReader::TransferEdgeSData(const TopoDS_Edge& aFace,
+ vtkPoints* Pts,
+ vtkCellArray* Cells)
+{
+}
+
+
+//=======================================================================
+// Function : TransferFaceSData
+// Purpose : Transfert shading data for FACE
+//=======================================================================
+void GEOM_OCCReader::TransferFaceSData(const TopoDS_Face& aFace,
+ vtkPoints* Pts,
+ vtkCellArray* Cells) {
+
+ TopLoc_Location aLoc;
+ Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation(aFace,aLoc);
+ if(aPoly.IsNull()) return;
+ else {
+
+ gp_Trsf myTransf;
+ Standard_Boolean identity = true;
+ if(!aLoc.IsIdentity()) {
+ identity = false;
+ myTransf = aLoc.Transformation();
+ }
+
+ Standard_Integer nbNodesInFace = aPoly->NbNodes();
+ Standard_Integer nbTriInFace = aPoly->NbTriangles();
+
+ const Poly_Array1OfTriangle& Triangles = aPoly->Triangles();
+ const TColgp_Array1OfPnt& Nodes = aPoly->Nodes();
+
+ Standard_Integer i;
+ for(i=1;i<=nbNodesInFace;i++) {
+ gp_Pnt P = Nodes(i);
+ float coord[3];
+ if(!identity) P.Transform(myTransf);
+ coord[0] = P.X(); coord[1] = P.Y(); coord[2] = P.Z();
+ Pts->SetPoint(i-1,coord);
+ }
+
+ for(i=1;i<=nbTriInFace;i++) {
+ // Get the triangle
+
+ Standard_Integer N1,N2,N3;
+ Triangles(i).Get(N1,N2,N3);
+
+ int pts[3];
+ pts[0] = N1-1; pts[1] = N2-1; pts[2] = N3-1;
+ Cells->InsertNextCell(3,pts);
+
+ }
+ }
+}
+
+//=======================================================================
+// Function : ComputeShading
+// Purpose : Compute the shape in shading mode
+//=======================================================================
+void GEOM_OCCReader::ComputeShading(vtkPoints* Pts,vtkCellArray* Cells){
+
+ // Check the type of the shape:
+ if(myShape.ShapeType() == TopAbs_FACE) {
+ // Face
+ TransferFaceSData(TopoDS::Face(myShape),Pts,Cells);
+ }
+ else {
+ if(myShape.ShapeType() == TopAbs_EDGE) {
+ // Edge
+ TransferEdgeSData(TopoDS::Edge(myShape),Pts,Cells);
+ }
+ else {
+ }
+
+ }
+
+}
+
+//=======================================================================
+// Function :
+// Purpose : Set parameters
+//=======================================================================
+void GEOM_OCCReader::setDisplayMode(int thenewmode) {
+ amode = thenewmode;
+}
+
+void GEOM_OCCReader::setTopo(const TopoDS_Shape& aShape) {
+ myShape = aShape;
+}
+
+void GEOM_OCCReader::setForceUpdate(Standard_Boolean bol) {
+ forced = bol;
+}
+
+//=======================================================================
+// Function :
+// Purpose : Get parameters
+//=======================================================================
+const TopoDS_Shape& GEOM_OCCReader::getTopo() {
+ return myShape;
+}
+
+int GEOM_OCCReader::getDisplayMode() {
+ return amode;
+}
+
+
--- /dev/null
+// File : GEOM_OCCReader.h
+// Created : Wed Feb 20 17:24:59 2002
+// Author : Christophe ATTANASIO
+// Project : SALOME
+// Module : GEOM
+// Copyright : Open CASCADE 2002
+// $Header$
+
+/*!
+ \class GEOM_OCCReader GEOM_OCCReader.h
+ \brief This class allow to display a OpenCASCADE CAD model in a VTK viewer.
+*/
+
+#ifndef GEOM_OCCREADER_H
+#define GEOM_OCCREADER_H
+
+// VTK
+#include <vtkPolyDataSource.h>
+#include <vtkPoints.h>
+#include <vtkCellArray.h>
+
+// OpenCASCADE
+#include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+#include <Poly_Polygon3D.hxx>
+#include <Poly_PolygonOnTriangulation.hxx>
+#include <GeomAbs_IsoType.hxx>
+#include <BRepAdaptor_Surface.hxx>
+
+#ifdef _WIN_32
+#define VTKOCC_EXPORT __declspec (dllexport)
+#else
+#define VTKOCC_EXPORT
+#endif
+class VTKOCC_EXPORT GEOM_OCCReader : public vtkPolyDataSource {
+
+ // methods
+
+ public:
+
+ static GEOM_OCCReader* New();
+
+ const TopoDS_Shape& getTopo();
+
+ void setTopo(const TopoDS_Shape& ashape);
+
+ int getDisplayMode();
+ void setDisplayMode(int);
+
+ void setForceUpdate(Standard_Boolean bol);
+
+ protected:
+
+ GEOM_OCCReader();
+ ~GEOM_OCCReader();
+ void Execute();
+
+ void ComputeShading(vtkPoints* Pts,vtkCellArray* Cells);
+ void ComputeWireframe(vtkPoints* Pts,vtkCellArray* Cells);
+
+ void TransferFaceSData(const TopoDS_Face& aFace,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ void TransferFaceWData(const TopoDS_Face& aFace,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ void TransferEdgeSData(const TopoDS_Edge& aEdge,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ void TransferEdgeWData(const TopoDS_Edge& aEdge,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ void TransferVertexWData(const TopoDS_Vertex& aVertex,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ void createISO(const TopoDS_Face &,
+ double, int,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ void DrawIso(GeomAbs_IsoType aType,
+ Standard_Real PParm,
+ Standard_Real p1,
+ Standard_Real p2,
+ vtkPoints* Pts,
+ vtkCellArray* Cells,
+ Standard_Integer& startidx);
+
+ void MoveTo(gp_Pnt P,
+ vtkPoints* Pts);
+
+ void DrawTo(gp_Pnt P,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ void PlotIso(BRepAdaptor_Surface& S,
+ GeomAbs_IsoType T,
+ Standard_Real& U,
+ Standard_Real& V,
+ Standard_Real Step,
+ Standard_Boolean& halt,
+ vtkPoints* Pts,
+ vtkCellArray* Cells);
+
+ // fields
+
+ private:
+
+ Standard_Boolean forced;
+ int discretiso;
+ int amode;
+ int nbisos;
+ TopoDS_Shape myShape;
+
+};
+
+#endif //GEOM_OCCREADER_H
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _Handle_GEOM_AISShape_HeaderFile
+#define _Handle_GEOM_AISShape_HeaderFile
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Handle_SALOME_AISShape_HeaderFile
+#include "Handle_SALOME_AISShape.hxx"
+#endif
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(SALOME_AISShape);
+class GEOM_AISShape;
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_AISShape);
+
+class Handle(GEOM_AISShape) : public Handle(SALOME_AISShape) {
+ public:
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ Handle(GEOM_AISShape)():Handle(SALOME_AISShape)() {}
+ Handle(GEOM_AISShape)(const Handle(GEOM_AISShape)& aHandle) : Handle(SALOME_AISShape)(aHandle)
+ {
+ }
+
+ Handle(GEOM_AISShape)(const GEOM_AISShape* anItem) : Handle(SALOME_AISShape)((SALOME_AISShape *)anItem)
+ {
+ }
+
+ Handle(GEOM_AISShape)& operator=(const Handle(GEOM_AISShape)& aHandle)
+ {
+ Assign(aHandle.Access());
+ return *this;
+ }
+
+ Handle(GEOM_AISShape)& operator=(const GEOM_AISShape* anItem)
+ {
+ Assign((Standard_Transient *)anItem);
+ return *this;
+ }
+
+ GEOM_AISShape* operator->()
+ {
+ return (GEOM_AISShape *)ControlAccess();
+ }
+
+ GEOM_AISShape* operator->() const
+ {
+ return (GEOM_AISShape *)ControlAccess();
+ }
+
+ Standard_EXPORT ~Handle(GEOM_AISShape)();
+
+ Standard_EXPORT static const Handle(GEOM_AISShape) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+#endif
--- /dev/null
+// File generated by CPPExt (Transient)
+//
+// Copyright (C) 1991,1995 by
+//
+// MATRA DATAVISION, FRANCE
+//
+// This software is furnished in accordance with the terms and conditions
+// of the contract and with the inclusion of the above copyright notice.
+// This software or any other copy thereof may not be provided or otherwise
+// be made available to any other person. No title to an ownership of the
+// software is hereby transferred.
+//
+// At the termination of the contract, the software and all copies of this
+// software must be deleted.
+
+#ifndef _Handle_GEOM_InteractiveObject_HeaderFile
+#define _Handle_GEOM_InteractiveObject_HeaderFile
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Handle_SALOME_InteractiveObject_HeaderFile
+#include "Handle_SALOME_InteractiveObject.hxx"
+#endif
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(SALOME_InteractiveObject);
+class GEOM_InteractiveObject;
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_InteractiveObject);
+
+class Handle(GEOM_InteractiveObject) : public Handle(SALOME_InteractiveObject) {
+ public:
+ inline void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ inline void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ inline void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+// inline void operator delete(void *anAddress, size_t size)
+// {
+// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
+// }
+ Handle(GEOM_InteractiveObject)():Handle(SALOME_InteractiveObject)() {}
+ Handle(GEOM_InteractiveObject)(const Handle(GEOM_InteractiveObject)& aHandle) : Handle(SALOME_InteractiveObject)(aHandle)
+ {
+ }
+
+ Handle(GEOM_InteractiveObject)(const GEOM_InteractiveObject* anItem) : Handle(SALOME_InteractiveObject)((SALOME_InteractiveObject *)anItem)
+ {
+ }
+
+ Handle(GEOM_InteractiveObject)& operator=(const Handle(GEOM_InteractiveObject)& aHandle)
+ {
+ Assign(aHandle.Access());
+ return *this;
+ }
+
+ Handle(GEOM_InteractiveObject)& operator=(const GEOM_InteractiveObject* anItem)
+ {
+ Assign((Standard_Transient *)anItem);
+ return *this;
+ }
+
+ GEOM_InteractiveObject* operator->()
+ {
+ return (GEOM_InteractiveObject *)ControlAccess();
+ }
+
+ GEOM_InteractiveObject* operator->() const
+ {
+ return (GEOM_InteractiveObject *)ControlAccess();
+ }
+
+ Standard_EXPORT ~Handle(GEOM_InteractiveObject)();
+
+ Standard_EXPORT static const Handle(GEOM_InteractiveObject) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+#endif
--- /dev/null
+# source path
+top_srcdir=@top_srcdir@
+top_builddir=../..
+srcdir=@srcdir@
+VPATH=.:$(srcdir):$(top_srcdir)/idl:$(top_builddir)/idl
+
+
+@COMMENCE@
+
+EXPORT_HEADERS = GEOM_Actor.h \
+ GEOM_AssemblyBuilder.h \
+ GEOM_AISShape.hxx \
+ Handle_GEOM_AISShape.hxx \
+ GEOM_InteractiveObject.hxx \
+ Handle_GEOM_InteractiveObject.hxx
+
+
+# Libraries targets
+
+LIB = libGeometryObject.la
+LIB_SRC = GEOM_Actor.cxx \
+ GEOM_OCCReader.cxx \
+ GEOM_AssemblyBuilder.cxx \
+ GEOM_AISShape.cxx \
+ GEOM_InteractiveObject.cxx
+
+LIB_CLIENT_IDL =
+
+# Executables targets
+BIN =
+BIN_SRC =
+
+CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
+CXXFLAGS += -I${KERNEL_ROOT_DIR}/include/salome
+LDFLAGS+=$(QT_MT_LIBS) $(OCC_LIBS) $(VTK_LIBS) $(OGL_LIBS) $(PYTHON_LIBS) -lSalomeObject -L${KERNEL_ROOT_DIR}/lib/salome
+
+%_moc.cxx: %.h
+ $(MOC) $< -o $@
+
+
+@CONCLUDE@
--- /dev/null
+using namespace std;
+// File : GEOM_Sketcher.cxx
+// Created : Wed Jul 5 10:12:09 2000
+// Author : Martine LANGLOIS
+
+// Modified : Tue Dec 11 21:28:07 2001
+// Author : Nicolas REJNERI
+// Project : SALOME
+// Module : SALOMEGUI
+// Copyright : Open CASCADE
+// $Header$
+
+#include "GEOM_Sketcher.h"
+#include "utilities.h"
+
+#include <qstring.h>
+
+#include <Geom_Axis1Placement.hxx>
+#include <Geom_Circle.hxx>
+#include <Geom_Line.hxx>
+#include <Geom_CartesianPoint.hxx>
+#include <BRep_Tool.hxx>
+#include <BRepBuilderAPI_MakeEdge2d.hxx>
+#include <BRepBuilderAPI_MakeEdge.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <gp_Lin2d.hxx>
+#include <gp_Pln.hxx>
+#include <gp_Lin.hxx>
+#include <gp_Dir.hxx>
+#include <gp_Circ2d.hxx>
+#include <gp_Vec2d.hxx>
+#include <IntAna_IntConicQuad.hxx>
+#include <BRepLib.hxx>
+#include <TopExp.hxx>
+#include <ProjLib.hxx>
+#include <Precision.hxx>
+#include <ElSLib.hxx>
+#include <BRepTools_WireExplorer.hxx>
+#include <GccAna_Pnt2dBisec.hxx>
+#include <GeomAPI.hxx>
+#include <Geom2dAPI_ProjectPointOnCurve.hxx>
+#include <Geom2d_TrimmedCurve.hxx>
+#include <Geom2d_Circle.hxx>
+#include <gce_MakeCirc2d.hxx>
+#include <GccAna_Circ2d2TanRad.hxx>
+#include <GccAna_Circ2d2TanOn.hxx>
+#include <GccEnt.hxx>
+#include <GccEnt_QualifiedLin.hxx>
+#include <GccEnt_QualifiedCirc.hxx>
+#include <GccAna_Lin2dTanPer.hxx>
+#include <GccAna_Lin2dTanObl.hxx>
+#include <gce_MakeLin2d.hxx>
+#include <GCE2d_MakeArcOfCircle.hxx>
+#include <Precision.hxx>
+#include <ElCLib.hxx>
+#include <AIS_Point.hxx>
+#include <TColgp_HArray1OfPnt2d.hxx>
+#include <Geom2dAPI_Interpolate.hxx>
+#include <TColgp_Array1OfVec2d.hxx>
+#include <TColStd_HArray1OfBoolean.hxx>
+#include <GeomAPI_ProjectPointOnCurve.hxx>
+#include <DsgPrs_ArrowSide.hxx>
+#include <BRepBuilderAPI_Transform.hxx>
+
+#include <AIS_Drawer.hxx>
+#include <Prs3d_TextAspect.hxx>
+#include <Prs3d_LineAspect.hxx>
+#include <Graphic3d_NameOfFont.hxx>
+
+#include <TopoDS_Wire.hxx>
+
+/*!
+ \class GEOM_Sketcher GEOM_Sketcher.h
+ \brief ...
+*/
+
+Standard_Real resol = 1.0;
+
+/*!
+ Constructor.
+*/
+Sketch::Sketch()
+{
+
+}
+
+/*!
+ Destructor.
+*/
+Sketch::~Sketch()
+{
+
+}
+
+
+/*!
+ Constructor.
+
+ \param V3d_Viewer
+*/
+Sketch::Sketch(const Handle(V3d_Viewer)& aViewer) :
+myInteractiveContext(new AIS_InteractiveContext(aViewer)),
+myAxisColor(Quantity_Color(Quantity_NOC_YELLOW)),
+myCurrentColor(Quantity_Color(Quantity_NOC_GREEN)),
+myWireColor(Quantity_Color(Quantity_NOC_RED))
+{
+ Init();
+}
+
+/*!
+ Constructor.
+
+ \param V3d_Viewer
+ \param Quantity_Color
+ \param Quantity_Color
+ \param Quantity_Color
+*/
+Sketch::Sketch(const Handle(V3d_Viewer)& aViewer,
+ const Quantity_Color& anAxisColor,
+ const Quantity_Color& aCurrentColor,
+ const Quantity_Color& aWireColor):
+myInteractiveContext(new AIS_InteractiveContext(aViewer)),
+myAxisColor(anAxisColor),
+myCurrentColor(aCurrentColor),
+myWireColor(aWireColor)
+{
+ Init();
+}
+
+/*!
+ Build the current edge in a graphic mode.
+ The first signature with view coordinates is used to connect to the move event from the user interface.
+ The second signature is used when the current point is known by 2d real coordinates.
+
+ \param Xp
+ \param Yp
+ \param V3d_View
+*/
+void Sketch::MakeCurrentEdge(const Standard_Integer Xp ,
+ const Standard_Integer Yp ,
+ const Handle(V3d_View)& aView )
+{
+ /* 3d coordinates of the picked point */
+ Standard_Real Xv,Yv,Zv;
+ aView->Convert(Xp,Yp,Xv,Yv,Zv);
+ /* computation of real 2d coordinates in plane of sketch */
+ Standard_Real Vx,Vy,Vz;
+ aView->Proj(Vx,Vy,Vz);
+ gp_Dir D(Vx,Vy,Vz);
+ gp_Pnt P(Xv,Yv,Zv);
+ gp_Lin L(P,D);
+ Standard_Real X,Y;
+ gp_Pnt Sol;
+ IntAna_IntConicQuad Int(L,myPlane->Pln(),Precision::Angular());
+ if (Int.IsDone()) {
+ if (!Int.IsParallel()) {
+ if (Int.NbPoints() > 0 ) {
+ Sol = Int.Point(1);
+ ElSLib::Parameters(myPlane->Pln(),Sol,X,Y);
+ }
+ }
+ }
+ MakeCurrentEdge(X,Y);
+}
+
+/*!
+ Build the current edge in a graphic mode.
+ The first signature with view coordinates is used to connect to the move event from the user interface.
+ The second signature is used when the current point is known by 2d real coordinates.
+
+ \param X
+ \param Y
+*/
+void Sketch::MakeCurrentEdge(const Standard_Real X, const Standard_Real Y)
+{
+ /* Create the current edge depending on the active mode */
+ switch (myCurrentStatus) {
+ case BEGIN_SKETCH:
+ myCurrentEdge = BRepBuilderAPI_MakeVertex(ElCLib::To3d(myPlane->Pln().Position().Ax2(),gp_Pnt2d(X,Y)));
+ break;
+ case SEGMENT:
+ MakeCurrentSegment(X,Y);
+ break;
+ case ARC_CHORD:
+ MakeCurrentSegment(X,Y);
+ break;
+ case ARC_CHORD_END:
+ MakeCurrentArc(X,Y);
+ break;
+ }
+ DisplayCurrentEdge();
+}
+
+/*!
+ Build the current edge in a graphic mode.
+ Function to connect to the input event from the user interface.
+*/
+void Sketch::ValidateEdge()
+{
+ gp_Pnt pt;
+ gp_Pnt2d pt2d;
+ switch (myCurrentStatus) {
+ case BEGIN_SKETCH:
+ {
+ myFirstPointSketch = TopoDS::Vertex(myCurrentEdge);
+ myPresentableWire = new AIS_Shape(myFirstPointSketch);
+ myPresentableWire->SetColor(myWireColor.Name());
+ myInteractiveContext->Display(myPresentableWire);
+ pt = BRep_Tool::Pnt(myFirstPointSketch);
+ pt2d = ProjLib::Project(myPlane->Pln(),pt);
+ myLastX = pt2d.X();
+ myLastY = pt2d.Y();
+ myCurrentStatus = SEGMENT;
+ break;
+ }
+ case SEGMENT:
+ {
+ Standard_Real first,last;
+ TopLoc_Location L;
+ Handle(Geom2d_Curve) C = BRep_Tool::CurveOnSurface(TopoDS::Edge(myCurrentEdge),myPlane,L,first,last);
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(Handle(Geom2d_Line)::DownCast(C)->Lin2d(),0.,myLengthDimension->Value());
+ if (myTransitionStatus == ANGLE ||
+ myTransitionStatus == LENGTH_FIXED ||
+ myTransitionStatus == X_FIXED ||
+ myTransitionStatus == Y_FIXED)
+ myTransitionStatus = NOCONSTRAINT;
+ AddEdgeToWire();
+ break;
+ }
+ case ARC_CHORD:
+ {
+ myInteractiveContext->CloseLocalContext();
+ myInteractiveContext->OpenLocalContext();
+ gp_Pnt2d p1 (myLastX,myLastY);
+ pt = BRep_Tool::Pnt(TopExp::LastVertex(TopoDS::Edge(myCurrentEdge)));
+ gp_Pnt2d p2 = ProjLib::Project(myPlane->Pln(),pt);
+ GccAna_Pnt2dBisec ComputeMediatrice(p1,p2);
+ if (ComputeMediatrice.HasSolution()) {
+ myMediatrice = new Geom2d_Line(ComputeMediatrice.ThisSolution());
+ Handle(Geom_Curve) aMediatrice3d = GeomAPI::To3d(myMediatrice,myPlane->Pln());
+ myPresentableMediatrice = new AIS_Axis(Handle(Geom_Line)::DownCast(aMediatrice3d));
+ myInteractiveContext->Display(myPresentableMediatrice);
+ }
+ TopoDS_Edge e = BRepBuilderAPI_MakeEdge2d(gce_MakeCirc2d(gp_Pnt2d(0.,0),1.));
+ BRepLib::BuildCurve3d(e);
+ myLengthDimension->SetText(TCollection_ExtendedString());
+ myInteractiveContext->Redisplay(myLengthDimension,Standard_False);
+ if (myEdgesNumber == 0)
+ myPreviousEdge = TopoDS::Edge(myCurrentEdge);
+ pt2d = ProjLib::Project(myPlane->Pln(),pt);
+ myLastX = pt2d.X();
+ myLastY = pt2d.Y();
+ myTransitionStatus = NOCONSTRAINT;
+ myCurrentStatus = ARC_CHORD_END;
+ break;
+ }
+ case ARC_CHORD_END:
+ myCurrentStatus = ARC_CHORD;
+ AddEdgeToWire();
+ break;
+ }
+}
+
+/*!
+ Add edge to current wire on an edge validation .
+*/
+void Sketch::AddEdgeToWire()
+{
+ myPreviousEdge = TopoDS::Edge(myCurrentEdge);
+ BRepLib::BuildCurve3d(myPreviousEdge);
+ myCurrentWire.Add(TopoDS::Edge(myPreviousEdge));
+ myEdgesNumber++;
+ myPresentableWire->Set( myCurrentWire.Wire() );
+ myInteractiveContext->Redisplay(myPresentableWire);
+ myConstructionMode.Append(myCurrentStatus);
+ myConstraintMode.Append(myTransitionStatus);
+ myInteractiveContext->CloseLocalContext();
+ gp_Pnt pt;
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD )
+ pt = BRep_Tool::Pnt(TopExp::LastVertex(TopoDS::Edge(myPreviousEdge)));
+ else
+ pt = BRep_Tool::Pnt(TopExp::FirstVertex(TopoDS::Edge(myPreviousEdge)));
+ gp_Pnt2d pt2d= ProjLib::Project(myPlane->Pln(),pt);
+ myLastX = pt2d.X();
+ myLastY = pt2d.Y();
+}
+
+/*!
+ Set the numeric dimension for the current edge and validate creation.
+
+ \param aValue
+ \return Standard_Boolean
+*/
+Standard_Boolean Sketch::SetDimension(Standard_Real& aValue)
+{
+ fitInResol(aValue);
+ if (myCurrentStatus == SEGMENT ||
+ myCurrentStatus == ARC_CHORD){
+ Standard_Real first,last;
+ TopLoc_Location L;
+ Handle(Geom2d_Curve) C =
+ BRep_Tool::CurveOnSurface(TopoDS::Edge(myCurrentEdge),myPlane,L,first,last);
+ myCurrentEdge =
+ BRepBuilderAPI_MakeEdge2d(Handle(Geom2d_Line)::DownCast(C)->Lin2d(),0.,aValue);
+ DisplayCurrentEdge();
+ if (myTransitionStatus == NOCONSTRAINT) {
+ mySegmentLength = aValue;
+ myTransitionStatus = LENGTH_FIXED;
+ }
+ else
+ ValidateEdge();
+ return Standard_True;
+ }
+
+ else if( myCurrentStatus == ARC_CHORD_END){
+ if (myTransitionStatus == TANGENT) return Standard_False;
+ gp_Pnt2d p;
+ if (myEdgesNumber > 0) {
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD)
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(TopExp::LastVertex(myPreviousEdge)));
+ else
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(TopExp::FirstVertex(myPreviousEdge)));
+ }
+ else
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(myFirstPointSketch));
+ GccAna_Circ2d2TanRad aSol(p, gp_Pnt2d(myLastX,myLastY),aValue,Precision::Confusion());
+ Standard_Real dist = RealLast();
+ if (aSol.NbSolutions() > 0) {
+ gp_Circ2d CirSol;
+ gp_Pnt2d pc = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(TopoDS::Vertex(myCenterCircle->Shape())));
+ for (Standard_Integer i =1; i<= aSol.NbSolutions(); i++) {
+ if (pc.Distance(aSol.ThisSolution(i).Location()) < dist)
+ CirSol = aSol.ThisSolution(i);
+ }
+ if (myCurrentEdge.Orientation() == TopAbs_FORWARD)
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(aSol.ThisSolution(1),p,gp_Pnt2d(myLastX,myLastY));
+ else {
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(aSol.ThisSolution(1),gp_Pnt2d(myLastX,myLastY),p);
+ myCurrentEdge.Reverse();
+ }
+ DisplayCurrentEdge();
+ ValidateEdge();
+ return Standard_True;
+ }
+ }
+
+ return Standard_False;
+}
+
+/*!
+ Set the numeric dimension for the current edge and validate creation.
+
+ \param deltaX
+ \param deltaY
+*/
+void Sketch::SetDimension(Standard_Real& deltaX, Standard_Real& deltaY)
+{
+ fitInResol(deltaX);
+ fitInResol(deltaY);
+ Standard_Real X = myLastX + deltaX;
+ Standard_Real Y = myLastY + deltaY;
+ MakeCurrentEdge(X,Y);
+ ValidateEdge();
+}
+
+/*!
+ Set the numeric value of the X coordinate of current point giving a deltaX relative to previous point.
+
+ \param deltaX
+*/
+void Sketch::SetXDimension(Standard_Real& deltaX)
+{
+ fitInResol(deltaX);
+ Standard_Real X = myLastX + deltaX;
+ Standard_Real Y = myLastY;
+ if ( deltaX == 0. )
+ Y = Y + 100.0 * Precision::Confusion();
+
+ if (myTransitionStatus == NOCONSTRAINT) {
+ MakeCurrentEdge(X,Y);
+ myTransitionStatus = X_FIXED;
+ mySegmentX = X;
+ }
+ else if (myTransitionStatus == Y_FIXED) {
+ myTransitionStatus = NOCONSTRAINT;
+ MakeCurrentEdge(X,mySegmentY);
+ ValidateEdge();
+ }
+ else if (myTransitionStatus == ANGLE) {
+ myTransitionStatus = NOCONSTRAINT;
+ Standard_Real angle;
+ if (0 <= mySegmentAngle && mySegmentAngle<= PI )
+ angle = PI - mySegmentAngle;
+ else
+ angle = mySegmentAngle - PI;
+ Y = X*Tan(angle);
+ MakeCurrentEdge(X,Y);
+ ValidateEdge();
+ }
+ else
+ myTransitionStatus = NOCONSTRAINT;
+}
+
+/*!
+ Set the numeric value of the Y coordinate of current point giving a deltaY relative to previous point.
+
+ \param deltaY
+*/
+void Sketch::SetYDimension(Standard_Real& deltaY)
+{
+ fitInResol(deltaY);
+ Standard_Real X = myLastX;
+ Standard_Real Y = myLastY + deltaY;
+
+ if ( deltaY == 0. )
+ X = X + 100.0 * Precision::Confusion();
+
+ if (myTransitionStatus == NOCONSTRAINT) {
+ MakeCurrentEdge(X,Y);
+ myTransitionStatus = Y_FIXED;
+ mySegmentY = Y;
+ }
+ else if (myTransitionStatus == X_FIXED) {
+ myTransitionStatus = NOCONSTRAINT;
+ MakeCurrentEdge(mySegmentX,Y);
+ ValidateEdge();
+ }
+ else if (myTransitionStatus == ANGLE) {
+ myTransitionStatus = NOCONSTRAINT;
+ Standard_Real angle;
+ if (0 <= mySegmentAngle && mySegmentAngle<= PI )
+ angle = PI - mySegmentAngle;
+ else
+ angle = mySegmentAngle - PI;
+ X = Y/Tan(angle);
+ MakeCurrentEdge(X,Y);
+ ValidateEdge();
+ }
+ else
+ myTransitionStatus = NOCONSTRAINT;
+}
+
+/*!
+ Set the numeric value of angle between 2 segments.
+
+ \param aValue
+*/
+void Sketch::SetSegmentAngle(Standard_Real& aValue)
+{
+ if (myEdgesNumber > 0) {
+ Standard_Real First,Last;
+ TopLoc_Location L;
+ Standard_Real angle;
+ if (0 <= aValue && aValue<= PI )
+ angle = PI - aValue;
+ else
+ angle = aValue - PI;
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,First,Last);
+ if (PreviousCurve->IsKind(STANDARD_TYPE(Geom2d_Line))) {
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(TopoDS::Edge(myPreviousEdge),myPlane,L,First,Last);
+
+ GccAna_Lin2dTanObl aSol(gp_Pnt2d(myLastX,myLastY),Handle(Geom2d_Line)::DownCast(PreviousCurve)->Lin2d(),angle);
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(aSol.ThisSolution(1),0.,myLengthDimension->Value());
+ }
+ if (myTransitionStatus == LENGTH_FIXED) {
+ ValidateEdge();
+ }
+ else if (myTransitionStatus == X_FIXED) {
+ Standard_Real length = mySegmentX/Cos(angle);
+ SetDimension(length);
+ ValidateEdge();
+ }
+ else if (myTransitionStatus == Y_FIXED) {
+ Standard_Real length = mySegmentY/Sin(angle);
+ SetDimension(length);
+ ValidateEdge();
+ }
+ else {
+ mySegmentAngle = aValue;
+ myTransitionStatus = ANGLE;
+ }
+ }
+}
+
+/*!
+ Get the angle value between 2 segments.
+
+ \return Standard_Real
+*/
+Standard_Real Sketch::GetSegmentAngle()
+{
+ return mySegmentAngle;
+}
+
+/*!
+ Close automatically an open sketch.
+
+ \return TopoDS_Wire. Return null shape if not possible.
+*/
+TopoDS_Wire Sketch::Close()
+{
+ myCurrentStatus = END_SKETCH;
+ myInteractiveContext->CloseAllContexts();
+ myInteractiveContext->EraseAll(Standard_False);
+ if (myEdgesNumber >= 2) {
+ BRepTools_WireExplorer Ex(myCurrentWire.Wire());
+ TopoDS_Vertex V1;
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD)
+ V1 = TopExp::LastVertex(myPreviousEdge);
+ else
+ V1 = TopExp::FirstVertex(myPreviousEdge);
+ myCurrentWire.Add(BRepBuilderAPI_MakeEdge(V1,myFirstPointSketch).Edge());
+ myEdgesNumber++;
+ return myCurrentWire.Wire();
+ }
+ else
+ return TopoDS_Wire();
+}
+
+
+
+/*!
+ Clear sketch presentation.
+*/
+void Sketch::Clear()
+{
+ myCurrentStatus = END_SKETCH;
+ myInteractiveContext->CloseAllContexts();
+ myInteractiveContext->EraseAll(Standard_False);
+}
+
+/*!
+ Terminate sketch without closing.
+
+ \return TopoDS_Wire. Return null shape if not possible.
+*/
+TopoDS_Wire Sketch::End()
+{
+ myCurrentStatus = END_SKETCH;
+ myInteractiveContext->CloseAllContexts();
+ myInteractiveContext->EraseAll(Standard_False);
+ if (myCurrentWire.IsDone()) {
+ return myCurrentWire.Wire();
+ }
+ else
+ return TopoDS_Wire();
+}
+
+
+/*!
+ Delete current edge.
+*/
+Standard_Boolean Sketch::Delete()
+{
+ myInteractiveContext->Erase(myAngleDimension,Standard_True,Standard_False);
+ myInteractiveContext->Erase(myLengthDimension,Standard_True,Standard_False);
+ myInteractiveContext->Erase(myRadiusDimension,Standard_True,Standard_False);
+ myInteractiveContext->Erase(myCenterCircle,Standard_True,Standard_False);
+ myInteractiveContext->Erase(myXDimension,Standard_True,Standard_False);
+ myInteractiveContext->Erase(myYDimension,Standard_True,Standard_False);
+
+ if (myCurrentStatus == BEGIN_SKETCH) {
+ myCurrentStatus = END_SKETCH;
+ myInteractiveContext->CloseAllContexts();
+ myInteractiveContext->EraseAll(Standard_False);
+ return true;
+ }
+ else if(myCurrentStatus == SEGMENT ||
+ myCurrentStatus == ARC_CHORD ) {
+ RemoveLastEdge();
+ }
+ else if(myCurrentStatus == ARC_CHORD_END) {
+ myCurrentStatus = ARC_CHORD;
+ myInteractiveContext->CloseAllContexts();
+ }
+ gp_Pnt pt;
+ if (myEdgesNumber == 0) {
+ //myInteractiveContext->EraseAll(Standard_False);
+ ChangeMode(BEGIN_SKETCH); // DCQ
+ pt = BRep_Tool::Pnt(myFirstPointSketch);
+ }
+ else {
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD )
+ pt = BRep_Tool::Pnt(TopExp::LastVertex(TopoDS::Edge(myPreviousEdge)));
+ else
+ pt = BRep_Tool::Pnt(TopExp::FirstVertex(TopoDS::Edge(myPreviousEdge)));
+ }
+ gp_Pnt2d pt2d= ProjLib::Project(myPlane->Pln(),pt);
+ myLastX = pt2d.X();
+ myLastY = pt2d.Y();
+
+ return false;
+}
+
+/*!
+ Set a specific plane for sketch.
+
+ \param GeomyPlane
+*/
+void Sketch::SetPlane(const Handle(Geom_Plane)& aPlane)
+{
+ myPlane = aPlane;
+}
+
+/*!
+ Set display parameters.
+
+ \param aColor
+*/
+void Sketch::SetWireColor(const Quantity_Color& aColor)
+{
+ myWireColor = aColor;
+}
+
+/*!
+ Set display parameters.
+
+ \param aColor
+*/
+void Sketch::SetCurrentColor(const Quantity_Color& aColor)
+{
+ myCurrentColor = aColor;
+}
+
+/*!
+ Set display parameters.
+
+ \param aColor
+*/
+void Sketch::SetAxisColor(const Quantity_Color& aColor)
+{
+ myAxisColor = aColor;
+}
+
+
+/*!
+ Change mode of construction line.
+
+ \param aMode : SEGMENT, ARC_CHORD.
+*/
+void Sketch::ChangeMode(const SketchStatus aMode)
+{
+ gp_Pnt2d p;
+ if (myEdgesNumber > 0) {
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD)
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(TopExp::LastVertex(myPreviousEdge)));
+ else
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(TopExp::FirstVertex(myPreviousEdge)));
+ myLastX = p.X();
+ myLastY = p.Y();
+ myInteractiveContext->CloseLocalContext(myInteractiveContext->IndexOfCurrentLocal());
+ }
+ if (!myCurrentStatus == BEGIN_SKETCH)
+ myCurrentStatus = aMode; /* change the mode only when the sketch is not in state BEGIN_SKETCH, i.d. fist point has been fixed */
+
+}
+
+/*!
+ Set transition constraint between consecutive edges.
+
+ \param aStatus : NOCONSTRAINT, TANGENT, PERPENDICULAR, ANGLE, LENGTH_FIXED, X_FIXED, Y_FIXED.
+*/
+void Sketch::SetTransitionStatus(const TransitionStatus aStatus)
+{
+ myTransitionStatus = aStatus;
+}
+
+/*!
+ Set or unset the display of dimensions.
+
+ \param atype
+ \param OnOff
+*/
+void Sketch::SetParameterVisibility(const TypeOfParameter atype, const Standard_Boolean OnOff)
+{
+ switch (atype) {
+ case ANGLE_PARAMETER:
+ myIsAngleDimensionVisible = OnOff;
+ if (!myIsAngleDimensionVisible && !myAngleDimension.IsNull())
+ myInteractiveContext->Erase(myAngleDimension,Standard_True,Standard_False);
+ //else DCQ
+ // DisplayCurrentEdge();
+ break;
+ case LENGTH_PARAMETER:
+ myIsLengthDimensionVisible = OnOff;
+ if (!myIsLengthDimensionVisible&& !myLengthDimension.IsNull())
+ myInteractiveContext->Erase(myLengthDimension,Standard_True,Standard_False);
+ //else DCQ
+ // DisplayCurrentEdge();
+ break;
+ case RADIUS_PARAMETER:
+ myIsRadiusDimensionVisible = OnOff;
+ if (!myIsRadiusDimensionVisible&& !myRadiusDimension.IsNull()){
+ myInteractiveContext->Erase(myRadiusDimension,Standard_True,Standard_False);
+ myInteractiveContext->Erase(myCenterCircle,Standard_True,Standard_False);
+ }
+ //else DCQ
+ // DisplayCurrentEdge();
+ break;
+ case XVALUE_PARAMETER:
+ myIsXDimensionVisible = OnOff;
+ if (!myIsXDimensionVisible&& !myXDimension.IsNull())
+ myInteractiveContext->Erase(myXDimension,Standard_True,Standard_False);
+ break;
+ case YVALUE_PARAMETER:
+ myIsYDimensionVisible = OnOff;
+ if (!myIsYDimensionVisible&& !myYDimension.IsNull())
+ myInteractiveContext->Erase(myYDimension,Standard_True,Standard_False);
+ break;
+ }
+}
+
+/*!
+ Hilight parameters.
+
+ \param atype
+ \param acolor
+*/
+void Sketch::HiligthWithColor(const TypeOfParameter atype, const Quantity_NameOfColor acolor)
+{
+ switch (atype) {
+ case ANGLE_PARAMETER:
+ myInteractiveContext->HilightWithColor(myAngleDimension, acolor);
+ break;
+ case LENGTH_PARAMETER:
+ myInteractiveContext->HilightWithColor(myLengthDimension, acolor);
+ break;
+ case RADIUS_PARAMETER:
+ myInteractiveContext->HilightWithColor(myRadiusDimension, acolor);
+ break;
+ case XVALUE_PARAMETER:
+ myInteractiveContext->HilightWithColor(myXDimension, acolor);
+ break;
+ case YVALUE_PARAMETER:
+ myInteractiveContext->HilightWithColor(myYDimension, acolor);
+ break;
+ }
+}
+
+
+/*!
+ Unhilight parameters.
+
+ \param atype
+*/
+void Sketch::Unhiligth(const TypeOfParameter atype)
+{
+ switch (atype) {
+ case ANGLE_PARAMETER:
+ myInteractiveContext->Unhilight(myAngleDimension);
+ break;
+ case LENGTH_PARAMETER:
+ myInteractiveContext->Unhilight(myLengthDimension);
+ break;
+ case RADIUS_PARAMETER:
+ myInteractiveContext->Unhilight(myRadiusDimension);
+ break;
+ case XVALUE_PARAMETER:
+ myInteractiveContext->Unhilight(myXDimension);
+ break;
+ case YVALUE_PARAMETER:
+ myInteractiveContext->Unhilight(myYDimension);
+ break;
+ }
+}
+
+/*!
+ Check if the edition of a type of parameter is relevant depending on sketch current status.
+
+ \param atype
+ \return Standard_Boolean
+*/
+Standard_Boolean Sketch::IsValidCurrentParameter(const TypeOfParameter atype)
+{
+ switch (atype) {
+ case ANGLE_PARAMETER:
+ if (myCurrentStatus != SEGMENT && myCurrentStatus != ARC_CHORD)
+ return Standard_False;
+ else if (myTransitionStatus == TANGENT || myTransitionStatus == PERPENDICULAR)
+ return Standard_False;
+ else if (myEdgesNumber < 1)
+ return Standard_False;
+ else {
+ TopLoc_Location L;
+ Standard_Real First,Last;
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,First,Last);
+ if (!PreviousCurve->IsKind(STANDARD_TYPE(Geom2d_Line)))
+ return Standard_False;
+ }
+ break;
+ case LENGTH_PARAMETER:
+ if (myCurrentStatus != SEGMENT &&
+ myCurrentStatus != ARC_CHORD /*&&
+ myCurrentStatus != CURVE_POINTS*/
+ )
+ return Standard_False;
+ else if (myTransitionStatus == LENGTH_FIXED)
+ return Standard_False;
+ break;
+ case RADIUS_PARAMETER:
+ if (myCurrentStatus != ARC_CHORD_END)
+ return Standard_False;
+ break;
+ case XVALUE_PARAMETER:
+ if (myCurrentStatus != SEGMENT &&
+ myCurrentStatus != ARC_CHORD /*&&
+ myCurrentStatus != CURVE_POINTS*/
+ )
+ return Standard_False;
+ else if (myTransitionStatus == X_FIXED)
+ return Standard_False;
+ break;
+ case YVALUE_PARAMETER:
+ if (myCurrentStatus != SEGMENT &&
+ myCurrentStatus != ARC_CHORD /*&&
+ myCurrentStatus != CURVE_POINTS*/
+ )
+ return Standard_False;
+ else if (myTransitionStatus == Y_FIXED)
+ return Standard_False;
+ break;
+ }
+ return Standard_True;
+}
+
+/*!
+ Set a parameter value.
+
+ \param atype
+ \param aValue
+*/
+void Sketch::SetParameterValue(const TypeOfParameter atype, Standard_Real aValue)
+{
+ switch (atype) {
+ case ANGLE_PARAMETER:
+ SetSegmentAngle(aValue);
+ break;
+ case LENGTH_PARAMETER:
+ SetDimension(aValue);
+ break;
+ case RADIUS_PARAMETER:
+ SetDimension(aValue);
+ break;
+ case XVALUE_PARAMETER:
+ SetXDimension(aValue);
+ break;
+ case YVALUE_PARAMETER:
+ SetYDimension(aValue);
+ break;
+ }
+}
+
+/*!
+ Initialisation of sketch parameters or options.
+*/
+void Sketch::Init()
+{
+ myPlane = new Geom_Plane (0.,0.,1.,0.);
+ CreateConstraints();
+ BRepLib::Plane(myPlane);
+ myEdgesNumber = 0;
+ myCurrentStatus = BEGIN_SKETCH;
+ /* In order to update the visulisation of current objects by using Redisplay method from InteractiveContext */
+ myCurrentEdge = BRepBuilderAPI_MakeVertex(gp_Pnt(0.,0.,0.));
+ myPresentableEdge = new AIS_Shape(myCurrentEdge);
+ myPresentableEdge->SetColor(myCurrentColor.Name());
+ myInteractiveContext->Display(myPresentableEdge);
+ myTransitionStatus = NOCONSTRAINT;
+ /* Init for display objects */
+ TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(gp_Pnt(0.,0.,0.));
+ TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(gp_Pnt(10.,0.,0.));
+ myLengthDimension = new AIS_LengthDimension (V1,V2,myPlane,0.,TCollection_ExtendedString());
+ myXDimension = new AIS_LengthDimension (V1,V2,myPlane,0.,TCollection_ExtendedString(),gp_Pnt(),DsgPrs_AS_NONE,
+ AIS_TOD_Horizontal);
+ myYDimension = new AIS_LengthDimension (V1,V2,myPlane,0.,TCollection_ExtendedString(),gp_Pnt(),DsgPrs_AS_NONE,
+ AIS_TOD_Vertical);
+ myRadiusDimension = new AIS_LengthDimension (V1,V2,myPlane,0.,TCollection_ExtendedString());
+ myCenterCircle = new AIS_Shape(V1);
+ myIsLengthDimensionVisible = Standard_False;
+ myIsXDimensionVisible = Standard_False;
+ myIsYDimensionVisible = Standard_False;
+ myIsRadiusDimensionVisible = Standard_False;
+}
+
+/*!
+ Build the current segment.
+
+ \param X
+ \param Y
+*/
+void Sketch::MakeCurrentSegment(Standard_Real X, Standard_Real Y)
+{
+ if (myTransitionStatus == NOCONSTRAINT)
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(gp_Pnt2d(myLastX,myLastY), gp_Pnt2d(X,Y));
+ else if (myTransitionStatus == X_FIXED)
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(gp_Pnt2d(myLastX,myLastY),gp_Pnt2d(mySegmentX,Y));
+ else if (myTransitionStatus == Y_FIXED)
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(gp_Pnt2d(myLastX,myLastY),gp_Pnt2d(X,mySegmentY));
+ else if (myTransitionStatus == TANGENT && myEdgesNumber > 0) {
+ Standard_Real first,last;
+ TopLoc_Location L;
+ Handle(Geom2d_Curve) C = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,first,last);
+ gp_Pnt2d p1;
+ gp_Vec2d Vt;
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD)
+ C->D1(last,p1,Vt);
+ else
+ C->D1(first,p1,Vt);
+ gp_Lin2d aline(p1,Vt);
+ Geom2dAPI_ProjectPointOnCurve proj(gp_Pnt2d(X,Y),new Geom2d_Line(aline));
+ if (proj.NbPoints() > 0)
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(p1,proj.Point(1));
+ }
+ else if (myTransitionStatus == PERPENDICULAR && myEdgesNumber > 0) {
+ Standard_Real first,last;
+ TopLoc_Location L;
+ Handle(Geom2d_Curve) C = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,first,last);
+ gp_Pnt2d p1;
+ gp_Lin2d perpen;
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD)
+ C->D0(last,p1);
+ else
+ C->D0(first,p1);
+ if (C->IsKind(STANDARD_TYPE(Geom2d_Line))) {
+ GccAna_Lin2dTanPer aSol(p1,Handle(Geom2d_Line)::DownCast(C)->Lin2d());
+ perpen = aSol.ThisSolution(1);
+ }
+ else if (C->IsKind(STANDARD_TYPE(Geom2d_Circle))) {
+ GccAna_Lin2dTanPer aSol(p1,Handle(Geom2d_Circle)::DownCast(C)->Circ2d());
+ perpen = aSol.ThisSolution(1);
+ }
+ Geom2dAPI_ProjectPointOnCurve proj(gp_Pnt2d(X,Y),new Geom2d_Line(perpen));
+ if (proj.NbPoints() > 0)
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(p1,proj.Point(1));
+ }
+ else if (myTransitionStatus == ANGLE && myEdgesNumber > 0) {
+ Standard_Real First,Last;
+ TopLoc_Location L;
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,First,Last);
+ if (PreviousCurve->IsKind(STANDARD_TYPE(Geom2d_Line))) {
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(TopoDS::Edge(myPreviousEdge),myPlane,L,First,Last);
+ Standard_Real angle;
+ if (0 <= mySegmentAngle && mySegmentAngle<= PI )
+ angle = PI - mySegmentAngle;
+ else
+ angle = mySegmentAngle - PI;
+ GccAna_Lin2dTanObl aSol(gp_Pnt2d(myLastX,myLastY),Handle(Geom2d_Line)::DownCast(PreviousCurve)->Lin2d(),angle);
+ Standard_Real dist = RealLast();
+ gp_Pnt2d pt(X,Y),ptproj;
+ for (Standard_Integer i =1; i<=aSol.NbSolutions(); i++) {
+ Geom2dAPI_ProjectPointOnCurve proj(pt,new Geom2d_Line(aSol.ThisSolution(i)));
+ if (pt.Distance(proj.Point(1)) < dist) {
+ dist = pt.Distance(proj.Point(1));
+ ptproj = proj.Point(1);
+ }
+ }
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(gp_Pnt2d(myLastX,myLastY),ptproj);
+ }
+ }
+ else if (myTransitionStatus == LENGTH_FIXED && myEdgesNumber > 0) {
+ Standard_Real First,Last;
+ TopLoc_Location L;
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,First,Last);
+ if (PreviousCurve->IsKind(STANDARD_TYPE(Geom2d_Line))) {
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(TopoDS::Edge(myPreviousEdge),myPlane,L,First,Last);
+ gp_Lin2d aline = gce_MakeLin2d(gp_Pnt2d(myLastX,myLastY), gp_Pnt2d(X,Y));
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(aline,0.,mySegmentLength);
+ }
+ }
+}
+
+/*!
+ Build the current arc.
+
+ \param X
+ \param Y
+*/
+void Sketch::MakeCurrentArc(Standard_Real X, Standard_Real Y)
+{
+ gp_Circ2d CircSol;
+ Standard_Boolean OK(Standard_False);
+
+ if (myTransitionStatus == NOCONSTRAINT) {
+ GccAna_Circ2d2TanOn aSol(gp_Pnt2d(myLastX,myLastY), gp_Pnt2d(X,Y),myMediatrice->Lin2d(),Precision::Confusion());
+ if (aSol.NbSolutions() > 0){
+ CircSol = aSol.ThisSolution(1);
+ OK = Standard_True;
+ }
+ }
+ /* Tangency with previous edge */
+ else if (myTransitionStatus == TANGENT && myEdgesNumber > 0) {
+ Standard_Real first,last;
+ TopLoc_Location L;
+ Handle(Geom2d_Curve) C = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,first,last);
+ if (C->IsKind(STANDARD_TYPE(Geom2d_Line))){
+ GccAna_Circ2d2TanOn aSol(GccEnt::Unqualified(Handle(Geom2d_Line)::DownCast(C)->Lin2d()), gp_Pnt2d(myLastX,myLastY),myMediatrice->Lin2d(),Precision::Confusion());
+ if (aSol.NbSolutions() > 0){
+ CircSol = aSol.ThisSolution(1);
+ OK = Standard_True;
+ }
+ }
+ else if (C->IsKind(STANDARD_TYPE(Geom2d_Circle))) {
+ GccAna_Circ2d2TanOn aSol(GccEnt::Unqualified(Handle(Geom2d_Circle)::DownCast(C)->Circ2d()), gp_Pnt2d(myLastX,myLastY),myMediatrice->Lin2d(),Precision::Confusion());
+ if (aSol.NbSolutions() > 0){
+ CircSol = aSol.ThisSolution(1);
+ OK = Standard_True;
+ }
+ }
+ else if(C->IsKind(STANDARD_TYPE(Geom2d_BSplineCurve))) {
+ gp_Pnt2d pc;
+ gp_Vec2d Vt;
+ C->D1(last,pc,Vt);
+ gp_Lin2d alin2d(pc,gp_Dir2d(Vt));
+ GccAna_Circ2d2TanOn aSol(GccEnt::Unqualified(alin2d), gp_Pnt2d(myLastX,myLastY),myMediatrice->Lin2d(),Precision::Confusion());
+ if (aSol.NbSolutions() > 0){
+ CircSol = aSol.ThisSolution(1);
+ OK = Standard_True;
+ }
+ }
+ }
+ /* Tangency with the perpendicular to the previous edge */
+ else if (myTransitionStatus == PERPENDICULAR && myEdgesNumber > 0) {
+ Standard_Real first,last;
+ TopLoc_Location L;
+ Handle(Geom2d_Curve) C = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,first,last);
+ gp_Pnt2d p1;
+ gp_Lin2d perpen;
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD)
+ C->D0(last,p1);
+ else
+ C->D0(first,p1);
+ if (C->IsKind(STANDARD_TYPE(Geom2d_Line))) {
+ GccAna_Lin2dTanPer aSol(p1,Handle(Geom2d_Line)::DownCast(C)->Lin2d());
+ perpen = aSol.ThisSolution(1);
+ }
+ else if (C->IsKind(STANDARD_TYPE(Geom2d_Circle))) {
+ GccAna_Lin2dTanPer aSol(p1,Handle(Geom2d_Circle)::DownCast(C)->Circ2d());
+ perpen = aSol.ThisSolution(1);
+ }
+ GccAna_Circ2d2TanOn aSol(GccEnt::Unqualified(perpen), gp_Pnt2d(myLastX,myLastY),myMediatrice->Lin2d(),Precision::Confusion());
+ if (aSol.NbSolutions() > 0){
+ CircSol = aSol.ThisSolution(1);
+ OK = Standard_True;
+ }
+ }
+
+ gp_Pnt2d p;
+ if (myEdgesNumber > 0) {
+ if (myPreviousEdge.Orientation() == TopAbs_FORWARD)
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(TopExp::LastVertex(myPreviousEdge)));
+ else
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(TopExp::FirstVertex(myPreviousEdge)));
+ }
+ else
+ p = ProjLib::Project(myPlane->Pln(),BRep_Tool::Pnt(myFirstPointSketch));
+ if (OK){
+ gp_Vec2d V1(p,gp_Pnt2d(X,Y));
+ gp_Vec2d V2(p,gp_Pnt2d(myLastX,myLastY));
+ if (V1.Angle(V2) > 0 )
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(CircSol,p,gp_Pnt2d(myLastX,myLastY));
+ else {
+ myCurrentEdge = BRepBuilderAPI_MakeEdge2d(CircSol,gp_Pnt2d(myLastX,myLastY),p);
+ myCurrentEdge.Reverse();
+ }
+ }
+ else {
+ myCurrentStatus = ARC_CHORD;
+ myLastX = p.X();
+ myLastY = p.Y();
+ myInteractiveContext->CloseLocalContext();
+ }
+
+}
+
+/*!
+ Display the current edge under construction with it's dimension.
+*/
+void Sketch::DisplayCurrentEdge()
+{
+ myPresentableEdge->Set(myCurrentEdge);
+ myInteractiveContext->Redisplay(myPresentableEdge);
+ if (myCurrentStatus == SEGMENT ||
+ myCurrentStatus == ARC_CHORD ) {
+ /* Length dimension */
+ TopoDS_Vertex V1 = TopExp::FirstVertex(TopoDS::Edge(myCurrentEdge));
+ TopoDS_Vertex V2 = TopExp::LastVertex(TopoDS::Edge(myCurrentEdge));
+ DisplayLengthDimension(V1,V2);
+ /* Angular dimension */
+ DisplayAngleDimension();
+ DisplayXDimension(V1,V2);
+ DisplayYDimension(V1,V2);
+ }
+ else if (myCurrentStatus == ARC_CHORD_END )
+ DisplayRadiusDimension();
+ else {
+ TopoDS_Vertex V1 = TopoDS::Vertex(myCurrentEdge);
+ TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(gp_Pnt(0.,0.,0.));
+ DisplayXDimension(V1,V2);
+ DisplayYDimension(V1,V2);
+ }
+
+}
+
+/*!
+ Display the current length dimension.
+
+ \param V1
+ \param V2
+*/
+void Sketch::DisplayLengthDimension(const TopoDS_Vertex& V1,const TopoDS_Vertex& V2)
+{
+ gp_Pnt p1 = BRep_Tool::Pnt(TopoDS::Vertex(V1));
+ gp_Pnt p2 = BRep_Tool::Pnt(TopoDS::Vertex(V2));
+ Standard_Real length = p1.Distance(p2);
+ if (length <= Precision::Confusion()) return;
+ myLengthDimension->SetFirstShape(V1);
+ myLengthDimension->SetSecondShape(V2);
+ fitInResol(length);
+ myLengthDimension->SetValue(length);
+ QString S;
+ S.sprintf("%.1f",length);
+ myLengthDimension->SetText(TCollection_ExtendedString(strdup(S)));
+ if (myIsLengthDimensionVisible) {
+ if (myInteractiveContext->IsDisplayed(myLengthDimension))
+ myInteractiveContext->Redisplay(myLengthDimension);
+ else
+ myInteractiveContext->Display(myLengthDimension);
+ }
+}
+
+/*!
+ Display the current X dimension.
+
+ \param V1
+ \param V2
+*/
+void Sketch::DisplayXDimension(const TopoDS_Vertex& V1,const TopoDS_Vertex& V2)
+{
+ if (myTransitionStatus != X_FIXED) {
+ gp_Pnt p1 = BRep_Tool::Pnt(TopoDS::Vertex(V1));
+ gp_Pnt p2 = BRep_Tool::Pnt(TopoDS::Vertex(V2));
+
+ gp_Lin aline(p1,myPlane->Pln().XAxis().Direction());
+ GeomAPI_ProjectPointOnCurve proj(p2,new Geom_Line(aline));
+
+ gp_Pnt pb = p1;
+
+ if (proj.NbPoints() > 0) {
+ Standard_Real length = p1.Distance(proj.Point(1));
+ if (length <= Precision::Confusion()) return;
+ myXDimension->SetFirstShape(V1);
+ myXDimension->SetSecondShape(V2);
+ fitInResol(length);
+ myXDimension->SetValue(length);
+ QString S;
+ S.sprintf("%.1f",length);
+ myXDimension->SetText(TCollection_ExtendedString(strdup(S)));
+ // myXDimension->SetPosition(proj.Point(1));
+ pb.BaryCenter(5,proj.Point(1),5);
+ myXDimension->SetPosition(pb);
+ if (myIsXDimensionVisible) {
+ if (myInteractiveContext->IsDisplayed(myXDimension))
+ myInteractiveContext->Redisplay(myXDimension);
+ else
+ myInteractiveContext->Display(myXDimension);
+ }
+ }
+ } else
+ myInteractiveContext->Erase(myXDimension,Standard_True,Standard_False);
+}
+
+/*!
+ Display the current Y dimension.
+
+ \param V1
+ \param V2
+*/
+void Sketch::DisplayYDimension(const TopoDS_Vertex& V1,const TopoDS_Vertex& V2)
+{
+ if (myTransitionStatus != Y_FIXED) {
+
+ gp_Pnt p1 = BRep_Tool::Pnt(TopoDS::Vertex(V1));
+ gp_Pnt p2 = BRep_Tool::Pnt(TopoDS::Vertex(V2));
+ gp_Lin aline(p2 /*p1*/, myPlane->Pln().YAxis().Direction());
+ gp_Pnt pb = p2 /*p1*/;
+ GeomAPI_ProjectPointOnCurve proj(p1 /*p2*/,new Geom_Line(aline));
+ if (proj.NbPoints() > 0) {
+ Standard_Real length = /*p1*/ p2.Distance(proj.Point(1));
+ if (length <= Precision::Confusion()) return;
+ myYDimension->SetFirstShape(V1);
+ myYDimension->SetSecondShape(V2);
+ fitInResol(length);
+ myYDimension->SetValue(length);
+ QString S;
+ S.sprintf("%.1f",length);
+ myYDimension->SetText(TCollection_ExtendedString(strdup(S)));
+ pb.BaryCenter(5,proj.Point(1),5);
+ myYDimension->SetPosition(pb);
+ // myYDimension->SetPosition(p2);
+ if (myIsYDimensionVisible) {
+ if (myInteractiveContext->IsDisplayed(myYDimension))
+ myInteractiveContext->Redisplay(myYDimension);
+ else
+ myInteractiveContext->Display(myYDimension);
+ }
+ }
+ } else
+ myInteractiveContext->Erase(myYDimension,Standard_True,Standard_False);
+}
+
+/*!
+ Display the current angle dimension.
+*/
+void Sketch::DisplayAngleDimension()
+{
+ if (!myIsAngleDimensionVisible)
+ return;
+ if (myEdgesNumber > 0) {
+ Standard_Real First,Last;
+ TopLoc_Location L;
+ Handle (Geom2d_Curve) PreviousCurve = BRep_Tool::CurveOnSurface(myPreviousEdge,myPlane,L,First,Last);
+ Handle (Geom2d_Curve) CurrentCurve = BRep_Tool::CurveOnSurface(TopoDS::Edge(myCurrentEdge),myPlane,L,First,Last);
+ if (PreviousCurve->IsKind(STANDARD_TYPE(Geom2d_Line)) && CurrentCurve->IsKind(STANDARD_TYPE(Geom2d_Line))) {
+ Standard_Real angle = Handle(Geom2d_Line)::DownCast(PreviousCurve)->Lin2d().Angle(Handle(Geom2d_Line)::DownCast(CurrentCurve)->Lin2d());
+ gp_Pnt2d apos;
+ if (0 <= angle && angle<= PI)
+ angle = PI - angle;
+ else
+ angle = PI + angle;
+ CurrentCurve->D0((First+Last)/5.,apos);
+ gp_Pnt apos3d = ElCLib::To3d(myPlane->Pln().Position().Ax2(),apos);
+ Standard_Real angtext = angle*180./PI;
+ mySegmentAngle = angle;
+ BRepLib::BuildCurve3d(TopoDS::Edge(myCurrentEdge));
+ fitInResol(angtext);
+
+ QString S;
+ S.sprintf("%.1f",angtext);
+ if (myInteractiveContext->IndexOfCurrentLocal() == 0) {
+ myInteractiveContext->OpenLocalContext();
+ myAngleDimension = new AIS_AngleDimension(myPreviousEdge,TopoDS::Edge(myCurrentEdge),myPlane,angle,
+ TCollection_ExtendedString(strdup(S)));
+ myInteractiveContext->Display(myAngleDimension);
+ }
+ else {
+ myAngleDimension->SetSecondShape(myCurrentEdge);
+ myAngleDimension->SetValue(angle);
+ myAngleDimension->SetPosition(apos3d);
+ myAngleDimension->SetText(TCollection_ExtendedString(strdup(S)));
+ myInteractiveContext->Redisplay(myAngleDimension);
+ }
+ }
+ }
+}
+
+/*!
+ Display the current radius dimension.
+*/
+void Sketch::DisplayRadiusDimension()
+{
+ if (! myIsRadiusDimensionVisible)
+ return;
+ BRepLib::BuildCurve3d(TopoDS::Edge(myCurrentEdge));
+ Standard_Real First,Last;
+ Handle (Geom_Circle) C = Handle (Geom_Circle)::DownCast(BRep_Tool::Curve(TopoDS::Edge(myCurrentEdge),First,Last));
+ if (!C.IsNull()) {
+ Standard_Real R = C->Radius();
+ TopoDS_Shape V1 = BRepBuilderAPI_MakeVertex(C->Location());
+ gp_Pnt MidlePoint ;
+ C->D0((First+Last)/2.,MidlePoint);
+ TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(MidlePoint);
+ myRadiusDimension->SetFirstShape(V1);
+ myRadiusDimension->SetSecondShape(V2);
+ myRadiusDimension->SetValue(R);
+ fitInResol(R);
+ QString S;
+ S.sprintf("%.1f",R);
+ myRadiusDimension->SetText(TCollection_ExtendedString(strdup(S)));
+ if (myInteractiveContext->IsDisplayed(myRadiusDimension))
+ myInteractiveContext->Redisplay(myRadiusDimension);
+ else
+ myInteractiveContext->Display(myRadiusDimension);
+ myCenterCircle->Set(V1);
+ if (myInteractiveContext->IsDisplayed(myCenterCircle))
+ myInteractiveContext->Redisplay(myCenterCircle);
+ else
+ myInteractiveContext->Display(myCenterCircle);
+ }
+}
+
+/*!
+ Remove last edge from the current wire.
+*/
+void Sketch::RemoveLastEdge()
+{
+ if (myEdgesNumber == 0) {
+ myCurrentStatus = END_SKETCH;
+ myInteractiveContext->CloseAllContexts();
+ myInteractiveContext->EraseAll(Standard_False);
+ return;
+ }
+ else {
+ BRepTools_WireExplorer Ex;
+ BRepBuilderAPI_MakeWire MW;
+ Standard_Integer index = 1;
+ myCurrentEdge = myPreviousEdge;
+ for (Ex.Init(myCurrentWire.Wire());Ex.More();Ex.Next()){
+ if (index <= myEdgesNumber-1) {
+ MW.Add(Ex.Current());
+ myPreviousEdge = Ex.Current();
+ index++;
+ }
+ }
+ myCurrentWire = MW;
+ myCurrentStatus = (SketchStatus)myConstructionMode(myEdgesNumber);
+ myTransitionStatus = (TransitionStatus)myConstraintMode(myEdgesNumber);
+ myEdgesNumber--;
+ myConstructionMode.Remove(index);
+ myConstraintMode.Remove(index);
+ if (myEdgesNumber == 0)
+ myPresentableWire->Set(myFirstPointSketch);
+ else
+ myPresentableWire->Set(myCurrentWire.Wire());
+ myInteractiveContext->Redisplay(myPresentableWire);
+ myInteractiveContext->CloseLocalContext();
+ myPresentableEdge->Set(myCurrentEdge);
+ myInteractiveContext->Redisplay(myPresentableEdge);
+ }
+}
+
+/*!
+ Create initial constraints.
+*/
+void Sketch::CreateConstraints()
+{
+ Handle(Geom_Axis1Placement) xAxis = new Geom_Axis1Placement(myPlane->Pln().XAxis());
+ Handle(Geom_Axis1Placement) yAxis = new Geom_Axis1Placement(myPlane->Pln().YAxis());
+ myHAxis = new AIS_Axis(xAxis);
+ myVAxis = new AIS_Axis(yAxis);
+ myAngularAxis = myVAxis;
+ myHAxis->SetColor(myAxisColor.Name());
+ myVAxis->SetColor(myAxisColor.Name());
+ myAngularAxis->SetColor(myAxisColor.Name());
+}
+
+/*!
+ fitInResol.
+
+ \param toFit
+ \param minIsResol
+*/
+void Sketch::fitInResol(Standard_Real &toFit, Standard_Boolean minIsResol)
+{
+ Standard_Real sign = (toFit < 0) ? -1. : +1.;
+ Standard_Real value = toFit + sign * resol/2.0; /* why "+ resol/2.0" ? because if resol = 0.5, 3.3 is rounded to 3.5 */
+ int nTimesResol = int(value/resol);
+ if ((nTimesResol == 0) && (minIsResol)) nTimesResol = 1;
+ toFit = nTimesResol*resol;
+}
+
+SketchStatus Sketch::GetCurrentStatus()
+{
+ return myCurrentStatus;
+}
+
+Standard_Integer Sketch::GetmyEdgesNumber()
+{
+ return myEdgesNumber;
+}
+
+
+
--- /dev/null
+// File : GEOM_Sketcher.h
+// Created : Wed Jul 5 10:12:09 2000
+// Author : Martine LANGLOIS
+
+// Modified : Tue Dec 11 21:23:41 2001
+// Author : Nicolas REJNERI
+// Project : SALOME
+// Module : SALOMEGUI
+// Copyright : Open CASCADE
+// $Header$
+
+#include "GEOM_SketcherStatus.h"
+
+#include <V3d_Viewer.hxx>
+#include <V3d_View.hxx>
+#include <BRepBuilderAPI_MakeWire.hxx>
+#include <Geom_Plane.hxx>
+#include <AIS_InteractiveContext.hxx>
+#include <AIS_Shape.hxx>
+#include <AIS_Axis.hxx>
+#include <TopoDS_Edge.hxx>
+#include <AIS_LengthDimension.hxx>
+#include <AIS_RadiusDimension.hxx>
+#include <AIS_AngleDimension.hxx>
+#include <Geom2d_Line.hxx>
+#include <TColStd_SequenceOfInteger.hxx>
+#include <TColgp_SequenceOfPnt2d.hxx>
+#include <gp_Vec2d.hxx>
+
+class Sketch
+{
+public:
+ Sketch();
+ ~Sketch();
+ Sketch(const Handle(V3d_Viewer)& aViewer);
+ Sketch(const Handle(V3d_Viewer)& aViewer,
+ const Quantity_Color& anAxisColor,
+ const Quantity_Color& aCurrentColor,
+ const Quantity_Color& aWireColor);
+
+ static void fitInResol(Standard_Real &toFit,
+ Standard_Boolean minIsResol = Standard_False);
+
+ void MakeCurrentEdge(const Standard_Integer Xp ,
+ const Standard_Integer Yp ,
+ const Handle(V3d_View)& aView );
+
+ void MakeCurrentEdge(const Standard_Real X, const Standard_Real Y);
+
+ Standard_Boolean SetDimension(Standard_Real& aValue);
+ void SetDimension(Standard_Real& deltaX,Standard_Real& deltaY);
+
+ void SetXDimension(Standard_Real& deltaX);
+ void SetYDimension(Standard_Real& deltaY);
+
+ void SetSegmentAngle(Standard_Real& aValue);
+ Standard_Real GetSegmentAngle();
+
+ void ValidateEdge();
+
+ TopoDS_Wire Close();
+ TopoDS_Wire End();
+
+ void Clear();
+
+ Standard_Boolean Delete();
+
+ void SetPlane(const Handle(Geom_Plane)& aPlane);
+
+ void SetWireColor(const Quantity_Color& aColor);
+ void SetCurrentColor(const Quantity_Color& aColor);
+ void SetAxisColor(const Quantity_Color& aColor);
+
+ void SetParameterVisibility(const TypeOfParameter atype,
+ const Standard_Boolean OnOff);
+
+ void HiligthWithColor(const TypeOfParameter atype,
+ const Quantity_NameOfColor acolor);
+ void Unhiligth(const TypeOfParameter atype);
+
+ Standard_Boolean IsValidCurrentParameter(const TypeOfParameter atype);
+
+ void SetParameterValue(const TypeOfParameter atype, Standard_Real aValue);
+
+ void ChangeMode(const SketchStatus aMode);
+
+ void SetTransitionStatus(const TransitionStatus aStatus);
+
+ SketchStatus GetCurrentStatus();
+ Standard_Integer GetmyEdgesNumber();
+
+private :
+
+ void Init();
+
+ void MakeCurrentSegment(Standard_Real X, Standard_Real Y);
+
+ void MakeCurrentArc(Standard_Real X, Standard_Real Y);
+
+ void DisplayCurrentEdge();
+
+ void DisplayLengthDimension(const TopoDS_Vertex& V1,const TopoDS_Vertex& V2);
+ void DisplayXDimension(const TopoDS_Vertex& V1,const TopoDS_Vertex& V2);
+ void DisplayYDimension(const TopoDS_Vertex& V1,const TopoDS_Vertex& V2);
+ void DisplayAngleDimension();
+ void DisplayRadiusDimension();
+
+ void AddEdgeToWire();
+
+ void RemoveLastEdge();
+
+ void CreateConstraints();
+
+private:
+ // Current status of construction
+ SketchStatus myCurrentStatus;
+ // Transition status between arcs and segments
+ TransitionStatus myTransitionStatus;
+ // Current wire
+ BRepBuilderAPI_MakeWire myCurrentWire;
+ // Current presentable wire
+ Handle_AIS_Shape myPresentableWire;
+ // Number of edges into the current wire
+ Standard_Integer myEdgesNumber;
+ // Store for each edge how it has been built i.d the value of myCurrentStatus
+ TColStd_SequenceOfInteger myConstructionMode;
+ // Store for each edge how it has been built i.d the value of myTransitionStatus
+ TColStd_SequenceOfInteger myConstraintMode;
+ // Current edge
+ TopoDS_Shape myCurrentEdge;
+ // Previous edge
+ TopoDS_Edge myPreviousEdge;
+ // List of points to interpolate when computing a curve by interpolation
+ TColgp_SequenceOfPnt2d myPointsToInterpolate;
+ // Tangent vector at beginning of curve
+ gp_Vec2d myTangentVector;
+ // Tangent flag at beginning og curve
+ Standard_Boolean myTangentFlag;
+
+ // Origin of sketch
+ TopoDS_Vertex myFirstPointSketch;
+ // Last x coordinate of end point of previous edge or picked point
+ Standard_Real myLastX;
+ // Last y coordinate of end point of previous edge or picked point
+ Standard_Real myLastY;
+ // angle between 2 segments when an ANGLE TransitionStatus is set.
+ Standard_Real mySegmentAngle;
+ // Length of segment when the length of the segment is fixed before the angle
+ Standard_Real mySegmentLength;
+ // Value of X fixed coordinate
+ Standard_Real mySegmentX;
+ // Value of Y fixed Coordinate
+ Standard_Real mySegmentY;
+ Handle_AIS_Shape myPresentableEdge; // Current presentable edge
+ Handle_AIS_LengthDimension myLengthDimension;// For display of current length segment dimension
+ Handle_AIS_LengthDimension myXDimension; // For display of current X segment dimension
+ Handle_AIS_LengthDimension myYDimension; // For display of current Y segment dimension
+ Handle_AIS_LengthDimension myRadiusDimension;// For display of current radius dimension
+ Handle_AIS_AngleDimension myAngleDimension; // For display of current angle dimension
+ Standard_Boolean myIsLengthDimensionVisible; // Visibility flag for LengthDimension
+ Standard_Boolean myIsXDimensionVisible; // Visibility flag for X Dimension
+ Standard_Boolean myIsYDimensionVisible; // Visibility flag for Y Dimension
+ Standard_Boolean myIsRadiusDimensionVisible; // Visibility flag for RadiusDimension
+ Standard_Boolean myIsAngleDimensionVisible; // Visibility flag for AngleDimension
+ Handle_AIS_Axis myPresentableMediatrice; // Chord mediatrice of current circle as a presentable object
+ Handle_Geom2d_Line myMediatrice; // Chord mediatrice of current circle as a 2d line
+ Handle_AIS_Shape myCenterCircle; // to visualise center of current arc
+
+ Handle_AIS_Axis myHAxis; // Horizontal axis
+ Handle_AIS_Axis myVAxis; // Vertical axis
+ Handle_AIS_Axis myAngularAxis; // Axis making a predefined angle with the previous edge
+
+ Quantity_Color myWireColor; // Color of wire and of build edges
+ Quantity_Color myCurrentColor; // Color of edge under construction
+ Quantity_Color myAxisColor; // Color for axis
+ Handle_AIS_InteractiveContext myInteractiveContext; // Interactive context for display management
+
+ Handle_Geom_Plane myPlane; // Plane of sketch
+
+ BRepBuilderAPI_MakeWire myPasteWire;
+ Standard_Integer myPasteEdgesNumber;
+ TColStd_SequenceOfInteger myPasteConstructionMode;
+ TColStd_SequenceOfInteger myPasteConstraintMode;
+};
--- /dev/null
+// File : GEOM_SketcherStatus.h
+// Created : Wed Jul 5 10:12:09 2000
+// Author : Martine LANGLOIS
+
+// Modified : Tue Dec 11 21:29:57 2001
+// Author : Nicolas REJNERI
+// Project : SALOME
+// Module : SALOMEGUI
+// Copyright : Open CASCADE
+// $Header$
+
+enum TransitionStatus {
+ NOCONSTRAINT, // no constraint between consecutive edges
+ TANGENT, // arc and segment are tangent
+ PERPENDICULAR,// arc is tangent to the perpendicular to the segment
+ ANGLE, // Angular constraint between 2 segments
+ LENGTH_FIXED, // Length of segment has been fixed
+ X_FIXED, // X coordinate for segment has been fixed
+ Y_FIXED // Y coordinate for segment has been fixed
+ };
+
+enum TypeOfParameter {
+ ANGLE_PARAMETER,
+ LENGTH_PARAMETER,
+ RADIUS_PARAMETER,
+ XVALUE_PARAMETER,
+ YVALUE_PARAMETER
+ };
+
+enum SketchStatus {
+ BEGIN_SKETCH, // Begin sketch; no edges created yet
+ SEGMENT, // Current mode for creation is segment
+ ARC_CHORD, // Current mode for creation is arc by chord
+ ARC_CHORD_END,// Chord validated, waiting for radius or center
+ END_SKETCH // End sketch
+};
--- /dev/null
+# -* Makefile *-
+#
+# Author : Patrick GOLDBRONN (CEA)
+# Date : 29/06/2001
+# $Header$
+#
+
+# source path
+top_srcdir=@top_srcdir@
+top_builddir=../..
+srcdir=@srcdir@
+VPATH=.:$(srcdir):$(top_srcdir)/idl:$(top_builddir)/idl
+
+@COMMENCE@
+
+# Libraries targets
+
+LIB = libGeometrySketcher.la
+LIB_SRC = GEOM_Sketcher.cxx
+LIB_CLIENT_IDL = SALOME_Component.idl SALOMEDS.idl SALOME_Exception.idl GEOM_Shape.idl GEOM_Gen.idl
+
+# header files
+EXPORT_HEADERS= GEOM_Sketcher.h \
+ GEOM_SketcherStatus.h
+
+# additionnal information to compil and link file
+CPPFLAGS += $(OCC_INCLUDES) $(QT_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
+CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome
+LDFLAGS += $(OCC_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome
+
+# additional file to be cleaned
+MOSTLYCLEAN =
+CLEAN =
+DISTCLEAN =
+
+@CONCLUDE@
+