-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-#ifdef WNT
+#ifdef WIN32
#pragma warning( disable:4786 )
#endif
#include "GEOM_Engine.hxx"
-#include "GEOM_Solver.hxx"
+#include "GEOM_Field.hxx"
#include "GEOM_Function.hxx"
#include "GEOM_ISubShape.hxx"
-#include "GEOM_SubShapeDriver.hxx"
-#include "GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx"
#include "GEOM_PythonDump.hxx"
+#include "GEOM_Solver.hxx"
+#include "GEOM_SubShapeDriver.hxx"
#include "Sketcher_Profile.hxx"
#include <Basics_OCCTVersion.hxx>
#include <TColStd_MapOfTransient.hxx>
#include <TColStd_HSequenceOfInteger.hxx>
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
-#include <TColStd_HArray1OfByte.hxx>
#include <TColStd_DataMapIteratorOfDataMapOfIntegerTransient.hxx>
-#else
-#include <TDataStd_HArray1OfByte.hxx>
-#include <Interface_DataMapIteratorOfDataMapOfIntegerTransient.hxx>
-#endif
#include <Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx>
+#if OCC_VERSION_LARGE > 0x07000000
+#include <BinDrivers.hxx>
+#include <StdDrivers_DocumentRetrievalDriver.hxx>
+#include <PCDM_StorageDriver.hxx>
+#endif
+
#include <set>
#include <Standard_Failure.hxx>
typedef std::map< TCollection_AsciiString, TCollection_AsciiString > TSting2StringMap;
typedef std::map< TCollection_AsciiString, TObjectData > TSting2ObjDataMap;
typedef std::map< TCollection_AsciiString, TObjectData* > TSting2ObjDataPtrMap;
+typedef std::map< int, std::list < int > > TIntToListIntMap;
static GEOM_Engine* TheEngine = NULL;
-static TCollection_AsciiString BuildIDFromObject(Handle(GEOM_Object)& theObject)
+static TCollection_AsciiString BuildIDFromObject(Handle(GEOM_BaseObject)& theObject)
{
TCollection_AsciiString anID(theObject->GetDocID()), anEntry;
TDF_Tool::Entry(theObject->GetEntry(), anEntry);
return anID;
}
-static TCollection_AsciiString BuildID(Standard_Integer theDocID, char* theEntry)
+static TCollection_AsciiString BuildID(Standard_Integer theDocID, const char* theEntry)
{
TCollection_AsciiString anID(theDocID);
anID+=(TCollection_AsciiString("_")+theEntry);
std::set<TCollection_AsciiString>& theIgnoreObjs,
bool& theIsDumpCollected);
+static int GetTag(const TCollection_AsciiString &theEntry);
+
+static void FillMapOfRef(const Handle(GEOM_Function) &theFunction,
+ TIntToListIntMap &theRefMap);
+
void ReplaceVariables(TCollection_AsciiString& theCommand,
const TVariablesList& theVariables);
std::map< int, TCollection_AsciiString >& theEntryToCmdMap,
std::set<TCollection_AsciiString>& theMapOfPublished);
-namespace
-{
+static TCollection_AsciiString GetPublishCommands
+ (const int theTag,
+ const std::map< int, TCollection_AsciiString > &theEntryToCmdMap,
+ const TIntToListIntMap &theMapRefs,
+ std::set< int > &thePublished);
- //================================================================================
- /*!
- * \brief Fix up the name of python variable
- */
- //================================================================================
+//================================================================================
+/*!
+ * \brief Fix up the name of python variable
+ */
+//================================================================================
- void healPyName( TCollection_AsciiString& pyName,
- const TCollection_AsciiString& anEntry,
- Resource_DataMapOfAsciiStringAsciiString& aNameToEntry)
- {
- const TCollection_AsciiString allowedChars
- ("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_");
+void GEOM_Engine::healPyName( TCollection_AsciiString& pyName,
+ const TCollection_AsciiString& anEntry,
+ Resource_DataMapOfAsciiStringAsciiString& aNameToEntry)
+{
+ const TCollection_AsciiString allowedChars
+ ("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_");
- if ( pyName.IsIntegerValue() ) { // pyName must not start with a digit
- pyName.Insert( 1, 'a' );
- }
- int p, p2=1; // replace not allowed chars
- while ((p = pyName.FirstLocationNotInSet(allowedChars, p2, pyName.Length()))) {
- pyName.SetValue(p, '_');
- p2=p;
- }
- if ( aNameToEntry.IsBound( pyName ) && anEntry != aNameToEntry( pyName ))
+ if ( pyName.IsIntegerValue() ) { // pyName must not start with a digit
+ pyName.Insert( 1, 'a' );
+ }
+ int p, p2=1; // replace not allowed chars
+ while ((p = pyName.FirstLocationNotInSet(allowedChars, p2, pyName.Length()))) {
+ pyName.SetValue(p, '_');
+ p2=p;
+ }
+ if ( aNameToEntry.IsBound( pyName ) && anEntry != aNameToEntry( pyName ))
{ // diff objects have same name - make a new name by appending a digit
TCollection_AsciiString aName2;
Standard_Integer i = 0;
} while ( aNameToEntry.IsBound( aName2 ) && anEntry != aNameToEntry( aName2 ));
pyName = aName2;
}
- }
}
//=======================================================================
TFunction_DriverTable::Get()->AddDriver(GEOM_Object::GetSubShapeID(), new GEOM_SubShapeDriver());
_OCAFApp = new GEOM_Application();
- _UndoLimit = 10;
+#if OCC_VERSION_LARGE > 0x07000000
+ _OCAFApp->DefineFormat("SALOME_GEOM", "GEOM Document Version 1.0", "sgd",
+ new StdDrivers_DocumentRetrievalDriver, 0);
+ BinDrivers::DefineFormat(_OCAFApp);
+#endif
+ _UndoLimit = 0;
}
/*!
RemoveObject(*objit);
//Close all documents not closed
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
TColStd_DataMapIteratorOfDataMapOfIntegerTransient anItr (_mapIDDocument);
-#else
- Interface_DataMapIteratorOfDataMapOfIntegerTransient anItr (_mapIDDocument);
-#endif
for (; anItr.More(); anItr.Next())
{
Close(anItr.Key());
aDoc = Handle(TDocStd_Document)::DownCast(_mapIDDocument(theDocID));
}
else if (force) {
+#if OCC_VERSION_MAJOR > 6
+ _OCAFApp->NewDocument("BinOcaf", aDoc);
+#else
_OCAFApp->NewDocument("SALOME_GEOM", aDoc);
+#endif
aDoc->SetUndoLimit(_UndoLimit);
_mapIDDocument.Bind(theDocID, aDoc);
TDataStd_Integer::Set(aDoc->Main(), theDocID);
int GEOM_Engine::GetDocID(Handle(TDocStd_Document) theDocument)
{
if (theDocument.IsNull()) return -1;
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
TColStd_DataMapIteratorOfDataMapOfIntegerTransient anItr (_mapIDDocument);
-#else
- Interface_DataMapIteratorOfDataMapOfIntegerTransient anItr (_mapIDDocument);
-#endif
for (; anItr.More(); anItr.Next())
if (anItr.Value() == theDocument) return anItr.Key();
* GetObject
*/
//=============================================================================
-Handle(GEOM_Object) GEOM_Engine::GetObject(int theDocID, char* theEntry, bool force)
+
+Handle(GEOM_BaseObject) GEOM_Engine::GetObject(int theDocID, const char* theEntry, bool force)
{
- Handle(GEOM_Object) anObject;
+ Handle(GEOM_BaseObject) anObject;
TCollection_AsciiString anID = BuildID(theDocID, theEntry);
if (_objects.IsBound(anID)) {
- anObject = Handle(GEOM_Object)::DownCast(_objects(anID));
+ anObject = Handle(GEOM_BaseObject)::DownCast(_objects(anID));
}
else if (force) {
Handle(TDocStd_Document) aDoc = GetDocument(theDocID, force);
if ( !aDoc.IsNull()) {
TDF_Label aLabel;
TDF_Tool::Label(aDoc->Main().Data(), theEntry, aLabel, Standard_True);
- anObject = new GEOM_Object(aLabel);
- _objects.Bind(anID, anObject);
+ if ( !aLabel.IsNull() ) {
+ int objType = GEOM_BaseObject::GetType( aLabel );
+ switch ( objType ) {
+ case GEOM_FIELD_OBJTYPE: anObject = new GEOM_Field (aLabel); break;
+ case GEOM_FIELD_STEP_OBJTYPE: anObject = new GEOM_FieldStep(aLabel); break;
+ default: anObject = new GEOM_Object (aLabel);
+ }
+ _objects.Bind(anID, anObject);
+ }
}
}
//=============================================================================
/*!
- * AddObject
+ * AddBaseObject
*/
//=============================================================================
-Handle(GEOM_Object) GEOM_Engine::AddObject(int theDocID, int theType)
+
+Handle(GEOM_BaseObject) GEOM_Engine::AddBaseObject(int theDocID, int theType)
{
Handle(TDocStd_Document) aDoc = GetDocument(theDocID);
Handle(TDataStd_TreeNode) aRoot = TDataStd_TreeNode::Set(aDoc->Main());
aChild = TDF_TagSource::NewChild(aDoc->Main());
}
- Handle(GEOM_Object) anObject = new GEOM_Object(aChild, theType);
+ Handle(GEOM_BaseObject) anObject;
+ switch ( theType ) {
+ case GEOM_FIELD_OBJTYPE: anObject = new GEOM_Field (aChild, theType); break;
+ case GEOM_FIELD_STEP_OBJTYPE: anObject = new GEOM_FieldStep(aChild, theType); break;
+ default: anObject = new GEOM_Object (aChild, theType);
+ }
//Put an object in the map of created objects
TCollection_AsciiString anID = BuildIDFromObject(anObject);
return anObject;
}
+//================================================================================
+/*!
+ * \brief Adds a new object of the type theType in the OCAF document
+ */
+//================================================================================
+
+Handle(GEOM_Object) GEOM_Engine::AddObject(int theDocID, int theType)
+{
+ return Handle(GEOM_Object)::DownCast( AddBaseObject(theDocID, theType) );
+}
+
//=============================================================================
/*!
* AddSubShape
*/
//=============================================================================
-Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape,
+
+Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape,
Handle(TColStd_HArray1OfInteger) theIndices,
bool isStandaloneOperation)
{
aSSI.SetIndices(theIndices);
try {
-#if OCC_VERSION_LARGE > 0x06010000
OCC_CATCH_SIGNALS;
-#endif
GEOM_Solver aSolver (GEOM_Engine::GetEngine());
if (!aSolver.ComputeFunction(aFunction)) {
MESSAGE("GEOM_Engine::AddSubShape Error: Can't build a sub shape");
* RemoveObject
*/
//=============================================================================
-bool GEOM_Engine::RemoveObject(Handle(GEOM_Object) theObject)
+bool GEOM_Engine::RemoveObject(Handle(GEOM_BaseObject)& theObject)
{
if (theObject.IsNull()) return false;
//Remove an object from the map of available objects
TCollection_AsciiString anID = BuildIDFromObject(theObject);
- if (_objects.IsBound(anID)) _objects.UnBind(anID);
+ if (_objects.IsBound(anID)) {
+ Handle(GEOM_BaseObject) anObject = Handle(GEOM_BaseObject)::DownCast(_objects(anID));
+ if ( anObject != theObject )
+ anObject->_label = anObject->_label.Root();
+ _objects.UnBind(anID);
+ }
// If sub-shape, remove it from the list of sub-shapes of its main shape
- if (!theObject->IsMainShape()) {
+ Handle(GEOM_Object) aGO = Handle(GEOM_Object)::DownCast( theObject );
+ if ( !aGO.IsNull() && !aGO->IsMainShape()) {
Handle(GEOM_Function) aFunction = theObject->GetFunction(1);
GEOM_ISubShape aSSI (aFunction);
Handle(GEOM_Function) aMainShape = aSSI.GetMainShape();
// Remember the label to reuse it then
std::list<TDF_Label>& aFreeLabels = _freeLabels[aDocID];
- aFreeLabels.push_back(aLabel);
+ if ( aFreeLabels.empty() || aFreeLabels.back() != aLabel )
+ aFreeLabels.push_back(aLabel);
+
+ // we can't explicitely delete theObject. At least prevent its functioning
+ // as an alive object when aLabel is reused for a new object
+ theObject->_label = aLabel.Root();
+ theObject->_ior.Clear();
+ theObject->_parameters.Clear();
+ theObject->_docID = -1;
theObject.Nullify();
* Save
*/
//=============================================================================
-bool GEOM_Engine::Save(int theDocID, char* theFileName)
+bool GEOM_Engine::Save(int theDocID, const char* theFileName)
{
if(!_mapIDDocument.IsBound(theDocID)) return false;
Handle(TDocStd_Document) aDoc = Handle(TDocStd_Document)::DownCast(_mapIDDocument(theDocID));
* Load
*/
//=============================================================================
-bool GEOM_Engine::Load(int theDocID, char* theFileName)
+bool GEOM_Engine::Load(int theDocID, const char* theFileName)
{
Handle(TDocStd_Document) aDoc;
-#if OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher
if (_OCAFApp->Open(theFileName, aDoc) != PCDM_RS_OK) {
-#else
- if (_OCAFApp->Open(theFileName, aDoc) != CDF_RS_OK) {
-#endif
return false;
}
+#if OCC_VERSION_MAJOR > 6
+ // Replace old document format by the new one.
+ if (aDoc->StorageFormat().IsEqual("SALOME_GEOM")) {
+ aDoc->ChangeStorageFormat("BinOcaf");
+ }
+#endif
+
aDoc->SetUndoLimit(_UndoLimit);
if(_mapIDDocument.IsBound(theDocID)) _mapIDDocument.UnBind(theDocID);
TDF_Label L;
TDF_Tool::Label( aDoc->GetData(), data._entry, L );
if ( L.IsNull() ) continue;
- Handle(GEOM_Object) obj = GEOM_Object::GetObject( L );
+ Handle(GEOM_BaseObject) obj = GEOM_BaseObject::GetObject( L );
// fill maps
if ( !obj.IsNull() ) {
TSting2ObjDataMap::iterator ent2Data =
// Mantis issue 0020768
Standard_Integer objectCounter = 0;
Resource_DataMapOfAsciiStringAsciiString aNameToEntry;
+ TIntToListIntMap aRefMap;
if (aDoc->Main().FindAttribute(GEOM_Function::GetFunctionTreeID(), aRoot)) {
TDataStd_ChildNodeIterator Itr(aRoot);
continue; // aCurScript is already at the end of aFuncScript
aFuncScript += aCurScript;
}
+
+ // Fill the map of references.
+ FillMapOfRef(aFunction, aRefMap);
+
if (isDumpCollected ) {
// Replace entries by the names
ReplaceEntriesByNames( aFuncScript, aEntry2ObjData, isPublished,
aNameToEntry, anEntryToCmdMap, anIgnoreObjMap );
}
// add publishing commands to the script
+ std::set< int > aPublished;
std::map< int, TCollection_AsciiString >::iterator anEntryToCmd = anEntryToCmdMap.begin();
- for ( ; anEntryToCmd != anEntryToCmdMap.end(); ++anEntryToCmd )
- aFuncScript += anEntryToCmd->second;
+
+ for ( ; anEntryToCmd != anEntryToCmdMap.end(); ++anEntryToCmd ) {
+ const TCollection_AsciiString aPublishCmds =
+ GetPublishCommands(anEntryToCmd->first, anEntryToCmdMap,
+ aRefMap, aPublished);
+
+ aFuncScript += aPublishCmds;
+ }
// PTv, 0020001 add result objects from RestoreGivenSubShapes into ignore list,
// because they will be published during command execution
aNameToEntry, anEntryToCmdMap, anIgnoreObjMap );
}
// add publishing commands to the script
+ std::set< int > aPublished;
std::map< int, TCollection_AsciiString >::iterator anEntryToCmd = anEntryToCmdMap.begin();
- for ( ; anEntryToCmd != anEntryToCmdMap.end(); ++anEntryToCmd )
- aScript += anEntryToCmd->second;
+
+ for ( ; anEntryToCmd != anEntryToCmdMap.end(); ++anEntryToCmd ) {
+ const TCollection_AsciiString aPublishCmds =
+ GetPublishCommands(anEntryToCmd->first, anEntryToCmdMap,
+ aRefMap, aPublished);
+
+ aScript += aPublishCmds;
+ }
}
//RNV: issue 16219: EDF PAL 469: "RemoveFromStudy" Function
{
TObjectData* data = aStEntry2ObjDataPtrIt->second;
if ( data->_unpublished && !data->_pyName.IsEmpty() ) {
- aScript += unpublishCmd + data->_pyName + ")";
+ aScript += unpublishCmd + data->_pyName + ")";
}
}
#define TEXTURE_LABEL_DATA 5
int GEOM_Engine::addTexture(int theDocID, int theWidth, int theHeight,
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
const Handle(TColStd_HArray1OfByte)& theTexture,
-#else
- const Handle(TDataStd_HArray1OfByte)& theTexture,
-#endif
const TCollection_AsciiString& theFileName)
{
Handle(TDocStd_Document) aDoc = GetDocument(theDocID);
return aTextureID;
}
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
Handle(TColStd_HArray1OfByte) GEOM_Engine::getTexture(int theDocID, int theTextureID,
-#else
-Handle(TDataStd_HArray1OfByte) GEOM_Engine::getTexture(int theDocID, int theTextureID,
-#endif
int& theWidth, int& theHeight,
TCollection_AsciiString& theFileName)
{
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
Handle(TColStd_HArray1OfByte) anArray;
-#else
- Handle(TDataStd_HArray1OfByte) anArray;
-#endif
theWidth = theHeight = 0;
Handle(TDocStd_Document) aDoc = GetDocument(theDocID);
return id_list;
}
+void GEOM_Engine::DocumentModified(const int theDocId, const bool isModified)
+{
+ if (isModified) _mapModifiedDocs.Add(theDocId);
+ else _mapModifiedDocs.Remove(theDocId);
+}
+
+bool GEOM_Engine::DocumentModified(const int theDocId)
+{
+ return _mapModifiedDocs.Contains(theDocId);
+}
+
//===========================================================================
// Internal functions
//===========================================================================
return true;
}
+//=============================================================================
+/*!
+ * GetTag: Returns the tag from entry
+ */
+//=============================================================================
+int GetTag(const TCollection_AsciiString &theEntry)
+{
+ const int aGeomObjDepth = 3;
+ const int aTag = theEntry.Token(":", aGeomObjDepth).IntegerValue();
+
+ return aTag;
+}
+
+//=============================================================================
+/*!
+ * FillMapOfRef: Fill the map of references
+ */
+//=============================================================================
+void FillMapOfRef(const Handle(GEOM_Function) &theFunction,
+ TIntToListIntMap &theRefMap)
+{
+ TDF_LabelSequence aSeq;
+ TCollection_AsciiString anObjEntry;
+ int anObjTag;
+
+ TDF_Tool::Entry(theFunction->GetOwnerEntry(), anObjEntry);
+ anObjTag = GetTag(anObjEntry);
+ theFunction->GetDependency(aSeq);
+
+ const Standard_Integer aLen = aSeq.Length();
+ Standard_Integer i;
+
+ for (i = 1; i <= aLen; i++) {
+ TDF_Label aRefLabel = aSeq.Value(i);
+ Handle(TDF_Reference) aRef;
+
+ if (aRefLabel.FindAttribute(TDF_Reference::GetID(), aRef)) {
+ if (!aRef.IsNull() && !aRef->Get().IsNull()) {
+ Handle(TDataStd_TreeNode) aT;
+
+ if (TDataStd_TreeNode::Find(aRef->Get(), aT)) {
+ TDF_Label aDepLabel = aT->Label();
+ Handle(GEOM_Function) aRefFunct = GEOM_Function::GetFunction(aDepLabel);
+
+ if (!aRefFunct.IsNull()) {
+ // Get entry of the referenced object.
+ TDF_Tool::Entry(aRefFunct->GetOwnerEntry(), anObjEntry);
+
+ const int aRefTag = GetTag(anObjEntry);
+
+ if (anObjTag != aRefTag) {
+ // Avoid making references for operations without copy.
+ theRefMap[anObjTag].push_back(aRefTag);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
//=============================================================================
/*!
* FindEntries: Returns a sequence of start/end positions of entries in the string
if(MYDEBUG)
cout<<"aParamIndex: "<<aParamIndex<<" aStartParamPos: " <<aStartParamPos<<" aEndParamPos: "<<aEndParamPos<<endl;
- if ( aStartParamPos == aEndParamPos)
- continue;
+ if ( aStartParamPos == aEndParamPos)
+ continue;
aParameter = aSection.SubString(aStartParamPos, aEndParamPos-1);
if(MYDEBUG)
Standard_Integer& objectCounter,
Resource_DataMapOfAsciiStringAsciiString& aNameToEntry)
{
+ GEOM_Engine* engine = GEOM_Engine::GetEngine();
Handle(TColStd_HSequenceOfInteger) aSeq = FindEntries(theScript);
Standard_Integer aLen = aSeq->Length(), aStart = 1, aScriptLength = theScript.Length();
if ( data._pyName.IsEmpty() ) { // encounted for the 1st time
if ( !data._name.IsEmpty() ) { // published object
data._pyName = data._name;
- healPyName( data._pyName, anEntry, aNameToEntry);
+ engine->healPyName( data._pyName, anEntry, aNameToEntry);
}
else {
do {
case Aspect_TOM_POINT: aCommand += "GEOM.MT_POINT"; break;
case Aspect_TOM_PLUS: aCommand += "GEOM.MT_PLUS"; break;
case Aspect_TOM_STAR: aCommand += "GEOM.MT_STAR"; break;
- case Aspect_TOM_O: aCommand += "GEOM.MT_O"; break;
case Aspect_TOM_X: aCommand += "GEOM.MT_X"; break;
+ case Aspect_TOM_O: aCommand += "GEOM.MT_O"; break;
case Aspect_TOM_O_POINT: aCommand += "GEOM.MT_O_POINT"; break;
case Aspect_TOM_O_PLUS: aCommand += "GEOM.MT_O_PLUS"; break;
case Aspect_TOM_O_STAR: aCommand += "GEOM.MT_O_STAR"; break;
case Aspect_TOM_O_X: aCommand += "GEOM.MT_O_X"; break;
- case Aspect_TOM_BALL: aCommand += "GEOM.MT_BALL"; break;
case Aspect_TOM_RING1: aCommand += "GEOM.MT_RING1"; break;
case Aspect_TOM_RING2: aCommand += "GEOM.MT_RING2"; break;
case Aspect_TOM_RING3: aCommand += "GEOM.MT_RING3"; break;
+ case Aspect_TOM_BALL: aCommand += "GEOM.MT_BALL"; break;
default: aCommand += "GEOM.MT_NONE"; break; // just for completeness, should not get here
}
aCommand += ", ";
}
}
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
static TCollection_AsciiString pack_data (const Handle(TColStd_HArray1OfByte)& aData)
-#else
-static TCollection_AsciiString pack_data (const Handle(TDataStd_HArray1OfByte)& aData)
-#endif
{
TCollection_AsciiString stream;
if (!aData.IsNull()) {
if (*it <= 0) continue;
Standard_Integer aWidth, aHeight;
TCollection_AsciiString aFileName;
-#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
Handle(TColStd_HArray1OfByte) aTexture =
-#else
- Handle(TDataStd_HArray1OfByte) aTexture =
-#endif
engine->getTexture(theDocID, *it, aWidth, aHeight, aFileName);
if (aWidth > 0 && aHeight > 0 && !aTexture.IsNull() && aTexture->Length() > 0 ) {
TCollection_AsciiString aCommand = "\n\t";
std::map< int, TCollection_AsciiString >& theEntryToCmdMap,
std::set< TCollection_AsciiString>& theIgnoreMap)
{
+ GEOM_Engine* engine = GEOM_Engine::GetEngine();
if ( theObjectData._studyEntry.IsEmpty() )
return; // was not published
if ( theIgnoreMap.count( theObjectData._entry ) )
if ( stEntry2DataPtr != theStEntry2ObjDataPtr.end() )
aFatherData = stEntry2DataPtr->second;
- const int geomObjDepth = 3;
-
// treat multiply published object
if ( theObjectData._pyName.IsEmpty() )
{
if ( data0._pyName.IsEmpty() ) return; // something wrong
theObjectData._pyName = theObjectData._name;
- healPyName( theObjectData._pyName, theObjectData._entry, theNameToEntry);
+ engine->healPyName( theObjectData._pyName, theObjectData._entry, theNameToEntry);
TCollection_AsciiString aCreationCommand("\n\t");
aCreationCommand += theObjectData._pyName + " = " + data0._pyName;
// store aCreationCommand before publishing commands
- int tag = theObjectData._entry.Token( ":", geomObjDepth ).IntegerValue();
- theEntryToCmdMap.insert( std::make_pair( tag + 2*theEntry2ObjData.size(), aCreationCommand ));
+ int tag = GetTag(theObjectData._entry);
+ theEntryToCmdMap.insert( std::make_pair( tag + -2*theEntry2ObjData.size(), aCreationCommand ));
}
// make a command
aCommand += theObjectData._pyName + ", '" + theObjectData._name + "' )";
// bind a command to the study entry
- int tag = theObjectData._entry.Token( ":", geomObjDepth ).IntegerValue();
+ int tag = GetTag(theObjectData._entry);
theEntryToCmdMap.insert( std::make_pair( tag, aCommand ));
theObjectData._studyEntry.Clear(); // not to publish any more
}
+//================================================================================
+/*!
+ * \brief Returns the string of publishing commands. Take into account that
+ * references should be published prior to the objects refer to them.
+ */
+//================================================================================
+TCollection_AsciiString GetPublishCommands
+ (const int theTag,
+ const std::map< int, TCollection_AsciiString > &theEntryToCmdMap,
+ const TIntToListIntMap &theMapRefs,
+ std::set< int > &thePublished)
+{
+ TCollection_AsciiString aResult;
+
+ if (!thePublished.count(theTag)) {
+ // This object is not published yet.
+ std::map< int, TCollection_AsciiString >::const_iterator anIt =
+ theEntryToCmdMap.find(theTag);
+
+ if (anIt != theEntryToCmdMap.end()) {
+ // There is a pubish cmd.
+ TIntToListIntMap::const_iterator aRefIt = theMapRefs.find(theTag);
+
+ if (aRefIt != theMapRefs.end()) {
+ // Recursively publish all references.
+ std::list< int >::const_iterator aRefTagIt = aRefIt->second.begin();
+
+ for(; aRefTagIt != aRefIt->second.end(); ++aRefTagIt) {
+ const TCollection_AsciiString aRefCmd = GetPublishCommands
+ (*aRefTagIt, theEntryToCmdMap, theMapRefs, thePublished);
+
+ aResult += aRefCmd;
+ }
+ }
+
+ // Add the object command.
+ aResult += anIt->second;
+ }
+
+ thePublished.insert(theTag);
+ }
+
+ return aResult;
+}
+
//================================================================================
/*!
* \brief Constructor