Bug 0020065: EDF 876 GEOM : Deleting an object leads to unusable dump. Refix.

This commit is contained in:
jfa 2008-12-24 14:12:47 +00:00
parent 40825729d5
commit cdcb403725

View File

@ -36,6 +36,7 @@
#include <TDF_Tool.hxx> #include <TDF_Tool.hxx>
#include <TDF_Data.hxx> #include <TDF_Data.hxx>
#include <TDF_Reference.hxx>
#include <TDF_LabelSequence.hxx> #include <TDF_LabelSequence.hxx>
#include <TDataStd_Integer.hxx> #include <TDataStd_Integer.hxx>
#include <TDataStd_ChildNodeIterator.hxx> #include <TDataStd_ChildNodeIterator.hxx>
@ -54,6 +55,7 @@
#include <Interface_DataMapIteratorOfDataMapOfIntegerTransient.hxx> #include <Interface_DataMapIteratorOfDataMapOfIntegerTransient.hxx>
#include <Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx> #include <Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx>
#include <set>
#include <map> #include <map>
#include <string> #include <string>
@ -84,9 +86,10 @@ static Standard_Integer ExtractDocID(TCollection_AsciiString& theID)
return aDocID.IntegerValue(); return aDocID.IntegerValue();
} }
void ProcessFunction(Handle(GEOM_Function)& theFunction, void ProcessFunction(Handle(GEOM_Function)& theFunction,
TCollection_AsciiString& theScript, TCollection_AsciiString& theScript,
TColStd_MapOfTransient& theProcessed); TDF_LabelMap& theProcessed,
std::set<std::string>& theDumpedObjs);
Handle(TColStd_HSequenceOfInteger) FindEntries(TCollection_AsciiString& theString); Handle(TColStd_HSequenceOfInteger) FindEntries(TCollection_AsciiString& theString);
@ -97,7 +100,6 @@ Handle(TColStd_HSequenceOfInteger) FindEntries(TCollection_AsciiString& theStrin
//============================================================================= //=============================================================================
GEOM_Engine* GEOM_Engine::GetEngine() { return TheEngine; } GEOM_Engine* GEOM_Engine::GetEngine() { return TheEngine; }
//============================================================================= //=============================================================================
/*! /*!
* SetEngine * SetEngine
@ -429,7 +431,7 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID,
TCollection_AsciiString aScript; TCollection_AsciiString aScript;
Handle(TDocStd_Document) aDoc = GetDocument(theDocID); Handle(TDocStd_Document) aDoc = GetDocument(theDocID);
if(aDoc.IsNull()) return TCollection_AsciiString("def RebuildData(theStudy): pass\n"); if (aDoc.IsNull()) return TCollection_AsciiString("def RebuildData(theStudy): pass\n");
aScript = "import geompy\n"; aScript = "import geompy\n";
aScript += "import math\n"; aScript += "import math\n";
@ -441,18 +443,19 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID,
Handle(TDataStd_TreeNode) aNode, aRoot; Handle(TDataStd_TreeNode) aNode, aRoot;
Handle(GEOM_Function) aFunction; Handle(GEOM_Function) aFunction;
TColStd_MapOfTransient aMap; TDF_LabelMap aFuncMap;
std::set<std::string> anObjMap;
if(aDoc->Main().FindAttribute(GEOM_Function::GetFunctionTreeID(), aRoot)) { if (aDoc->Main().FindAttribute(GEOM_Function::GetFunctionTreeID(), aRoot)) {
TDataStd_ChildNodeIterator Itr(aRoot); TDataStd_ChildNodeIterator Itr(aRoot);
for(; Itr.More(); Itr.Next()) { for (; Itr.More(); Itr.Next()) {
aNode = Itr.Value(); aNode = Itr.Value();
aFunction = GEOM_Function::GetFunction(aNode->Label()); aFunction = GEOM_Function::GetFunction(aNode->Label());
if(aFunction.IsNull()) { if (aFunction.IsNull()) {
MESSAGE ( "Null function !!!!" ); MESSAGE ( "Null function !!!!" );
continue; continue;
} }
ProcessFunction(aFunction, aScript, aMap); ProcessFunction(aFunction, aScript, aFuncMap, anObjMap);
} }
} }
@ -484,12 +487,12 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID,
//Replace entries by the names //Replace entries by the names
TCollection_AsciiString anUpdatedScript, anEntry, aName, aBaseName("geomObj_"), TCollection_AsciiString anUpdatedScript, anEntry, aName, aBaseName("geomObj_"),
allowedChars ("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_"); allowedChars ("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_");
if(aLen == 0) anUpdatedScript = aScript; if (aLen == 0) anUpdatedScript = aScript;
for(Standard_Integer i = 1; i <= aLen; i+=2) { for (Standard_Integer i = 1; i <= aLen; i+=2) {
anUpdatedScript += aScript.SubString(aStart, aSeq->Value(i)-1); anUpdatedScript += aScript.SubString(aStart, aSeq->Value(i)-1);
anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i+1)); anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i+1));
if(theObjectNames.IsBound(anEntry)) { if (theObjectNames.IsBound(anEntry)) {
aName = theObjectNames.Find(anEntry); aName = theObjectNames.Find(anEntry);
// check validity of aName // check validity of aName
bool isValidName = true; bool isValidName = true;
@ -579,6 +582,8 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID,
{ {
const TCollection_AsciiString& aEntry = anEntryToNameIt.Key(); const TCollection_AsciiString& aEntry = anEntryToNameIt.Key();
const TCollection_AsciiString& aName = anEntryToNameIt.Value(); const TCollection_AsciiString& aName = anEntryToNameIt.Value();
if (!anObjMap.count(aEntry.ToCString()))
continue; // was not dumped
if ( !aEntry2StEntry.IsBound( aEntry )) if ( !aEntry2StEntry.IsBound( aEntry ))
continue; // was not published continue; // was not published
TCollection_AsciiString aCommand("\n\tgeompy."), aFatherEntry; TCollection_AsciiString aCommand("\n\tgeompy."), aFatherEntry;
@ -674,11 +679,13 @@ Handle(TColStd_HSequenceOfAsciiString) GEOM_Engine::GetAllDumpNames() const
//=========================================================================== //===========================================================================
// Internal functions // Internal functions
//=========================================================================== //===========================================================================
void ProcessFunction(Handle(GEOM_Function)& theFunction, void ProcessFunction(Handle(GEOM_Function)& theFunction,
TCollection_AsciiString& theScript, TCollection_AsciiString& theScript,
TColStd_MapOfTransient& theProcessed) TDF_LabelMap& theProcessed,
std::set<std::string>& theDumpedObjs)
{ {
if(theFunction.IsNull() || theProcessed.Contains(theFunction)) return; if (theFunction.IsNull()) return;
if (theProcessed.Contains(theFunction->GetEntry())) return;
/* /*
TDF_LabelSequence aSeq; TDF_LabelSequence aSeq;
@ -692,19 +699,38 @@ void ProcessFunction(Handle(GEOM_Function)& theFunction,
*/ */
// pass functions, that depends on nonexisting ones // pass functions, that depends on nonexisting ones
//jfa:test//bool doComment = false; bool doNotProcess = false;
TDF_LabelSequence aSeq; TDF_LabelSequence aSeq;
theFunction->GetDependency(aSeq); theFunction->GetDependency(aSeq);
Standard_Integer aLen = aSeq.Length(); Standard_Integer aLen = aSeq.Length();
//jfa:test//for (Standard_Integer i = 1; i <= aLen && !doComment; i++) { for (Standard_Integer i = 1; i <= aLen && !doNotProcess; i++) {
for (Standard_Integer i = 1; i <= aLen; i++) { TDF_Label aRefLabel = aSeq.Value(i);
Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(aSeq.Value(i)); Handle(TDF_Reference) aRef;
//jfa:test//if (aFunction.IsNull()) doComment = true; if (!aRefLabel.FindAttribute(TDF_Reference::GetID(), aRef)) {
//jfa:test//else if (!theProcessed.Contains(aFunction)) doComment = true; doNotProcess = true;
if (aFunction.IsNull()) return; }
if (!theProcessed.Contains(aFunction)) return; else {
if (aRef.IsNull() || aRef->Get().IsNull()) {
doNotProcess = true;
}
else {
Handle(TDataStd_TreeNode) aT;
if (!TDataStd_TreeNode::Find(aRef->Get(), aT)) {
doNotProcess = true;
}
else {
TDF_Label aDepLabel = aT->Label();
Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(aDepLabel);
if (aFunction.IsNull()) doNotProcess = true;
else if (!theProcessed.Contains(aDepLabel)) doNotProcess = true;
}
}
}
} }
if (doNotProcess) return;
TCollection_AsciiString aDescr = theFunction->GetDescription(); TCollection_AsciiString aDescr = theFunction->GetDescription();
if(aDescr.Length() == 0) { if(aDescr.Length() == 0) {
//cout << "Warning: the function has no description" << endl; //cout << "Warning: the function has no description" << endl;
@ -715,10 +741,13 @@ void ProcessFunction(Handle(GEOM_Function)& theFunction,
if(aDescr == "None") return; if(aDescr == "None") return;
theScript += "\n\t"; theScript += "\n\t";
//jfa:test//if (doComment) theScript += "#";
theScript += aDescr; theScript += aDescr;
theProcessed.Add(theFunction); theProcessed.Add(theFunction->GetEntry());
TCollection_AsciiString anObjEntry;
TDF_Tool::Entry(theFunction->GetOwnerEntry(), anObjEntry);
theDumpedObjs.insert(anObjEntry.ToCString());
} }
//============================================================================= //=============================================================================