From: apo Date: Thu, 12 Jul 2007 07:46:37 +0000 (+0000) Subject: Introduction of the first version of Persistent for MULTIPR extension in VISU functio... X-Git-Tag: T_MULTIPR_INDUS_Persistence~11 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=24b38090784fe599402f75398cc4ee4eaa8c55af;p=modules%2Fvisu.git Introduction of the first version of Persistent for MULTIPR extension in VISU functionality --- diff --git a/src/VISU_I/VISUConfig.cc b/src/VISU_I/VISUConfig.cc index 03eb5709..9b23b281 100644 --- a/src/VISU_I/VISUConfig.cc +++ b/src/VISU_I/VISUConfig.cc @@ -658,13 +658,13 @@ namespace VISU //--------------------------------------------------------------- QString - GenerateName(const string& theFmt, int theId) + GenerateName(const std::string& theFmt, int theId) { - static QString aName; + QString aName; if(theId > 0) - aName.sprintf("%s:%d",theFmt.c_str(),theId); + aName.sprintf("%s:%d", theFmt.c_str(), theId); else - aName.sprintf("%s",theFmt.c_str()); + aName.sprintf("%s", theFmt.c_str()); return aName; } diff --git a/src/VISU_I/VISU_GaussPoints_i.cc b/src/VISU_I/VISU_GaussPoints_i.cc index 1eebef21..3e8ea243 100644 --- a/src/VISU_I/VISU_GaussPoints_i.cc +++ b/src/VISU_I/VISU_GaussPoints_i.cc @@ -70,9 +70,12 @@ VISU::GaussPoints_i return aResult; try{ bool anIsEstimated = true; - VISU::Result_i::PInput anInput = theResult->GetInput(); + VISU::Result_i::PInput anInput = theResult->GetInput(theMeshName, + theEntity, + theFieldName, + theTimeStampNumber); size_t aSize = anInput->GetTimeStampOnGaussPtsSize(theMeshName, - (VISU::TEntity)theEntity, + VISU::TEntity(theEntity), theFieldName, theTimeStampNumber, anIsEstimated); diff --git a/src/VISU_I/VISU_Gen_i.cc b/src/VISU_I/VISU_Gen_i.cc index 426b4052..249561fe 100644 --- a/src/VISU_I/VISU_Gen_i.cc +++ b/src/VISU_I/VISU_Gen_i.cc @@ -367,10 +367,9 @@ namespace VISU bool theIsMultiFile) { if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - theURL = '"<GetStudy(); SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theComponent); @@ -382,8 +381,7 @@ namespace VISU theURL, theIsMultiFile, aFileNames, - aFullFileNames, - aTemporaryDirs); + aFullFileNames); } } @@ -406,17 +404,9 @@ namespace VISU SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile(0); if(theIsMultiFile) aStreamFile = SALOMEDS_Tool::PutFilesToStream(theURL, aListOfFullFileNames.in(), theIsMultiFile); - else{ + else aStreamFile = SALOMEDS_Tool::PutFilesToStream(aListOfFullFileNames.in(), aListOfFileNames.in()); - Result_i::TFileNames::const_iterator anIter = aTemporaryDirs.begin(); - for(; anIter != aTemporaryDirs.end(); anIter++){ - filesystem::path aDirName(*anIter); - if(filesystem::exists(aDirName)){ - filesystem::remove_all(aDirName); - if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aDirName ='"< #include -#include -#include -#include - #include #include @@ -60,6 +56,86 @@ static int MYTIMEDEBUG = 0; namespace VISU { + //--------------------------------------------------------------- + class TSubString: public std::string + { + public: + typedef std::string::size_type size_type; + + TSubString(std::string& theSource, + const std::string& theTarget): + mySource(theSource), + myPosition(theSource.find(theTarget)), + mySize(theTarget.length()) + {} + + TSubString& + operator = (const std::string& theTarget) + { + if(myPosition != std::string::npos) + mySource.replace(myPosition, mySize, theTarget); + return *this; + } + + private: + std::string& mySource; + size_type myPosition; + size_type mySize; + }; + + + //--------------------------------------------------------------- + inline + std::ostream& + operator<<(std::ostream& theStream, + const MultiResult_i::TPartInfo& thePartInfo) + { + theStream<<(thePartInfo.myMeshName)<<" "; + theStream<<(thePartInfo.myPartID)<<" "; + theStream<<(thePartInfo.myName)<<" "; + theStream<<(thePartInfo.myPath)<<" "; + theStream<<(thePartInfo.myFileName); + return theStream; + } + + + //--------------------------------------------------------------- + inline + std::istream& + operator>>(std::istream& theStream, + MultiResult_i::TPartInfo& thePartInfo) + { + theStream>>(thePartInfo.myMeshName); + theStream>>(thePartInfo.myPartID); + theStream>>(thePartInfo.myName); + theStream>>(thePartInfo.myPath); + theStream>>(thePartInfo.myFileName); + return theStream; + } + + + //--------------------------------------------------------------- + inline + MultiResult_i::TPartInfo + GetPartInfo(const std::string theInfoString) + { + MultiResult_i::TPartInfo aPartInfo; + std::istrstream anOutputStream(theInfoString.c_str()); + anOutputStream>>aPartInfo; + return aPartInfo; + } + + + //--------------------------------------------------------------- + inline + MultiResult_i::TPartInfo + GetPartInfo(multipr::Obj& theMultiprObj, + const MultiResult_i::TPartName& thePartName) + { + return GetPartInfo(theMultiprObj.getPartInfo(thePartName.c_str())); + } + + //--------------------------------------------------------------- inline std::string @@ -203,7 +279,8 @@ namespace VISU MultiResult_i::TMainPart2SubPartNames* theMainPart2SubPartNames, CORBA::Boolean* theIsDone, CORBA::Boolean theIsBuild, - _PTR(Study) theStudy) + _PTR(Study) theStudy, + bool thePublishInStudy) { if(!theIsBuild || *theIsDone) return; @@ -213,13 +290,14 @@ namespace VISU TTransactionManager aTransactionManager(theStudy); try { - multipr::Obj& aMultiprObj = *theMultiprObj; - const VISU::TMeshMap& aMeshMap = theInput->GetMeshMap(); - VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin(); - const VISU::PMesh& aMesh = aMeshMapIter->second; - - MultiResult_i::TPartNames aPartNames = aMultiprObj.getParts(); - + multipr::Obj& aMultiprObj = *theMultiprObj; + const VISU::TMeshMap& aMeshMap = theInput->GetMeshMap(); + VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin(); + const VISU::PMesh& aMesh = aMeshMapIter->second; + + MultiResult_i::TPartNames aPartNames = aMultiprObj.getParts(); + + if(thePublishInStudy){ QString aComment = "Sub-parts: #"; aComment += QString::number(aPartNames.size()); @@ -231,73 +309,69 @@ namespace VISU NO_PERFSITENT_REF, aComment.latin1(), false); + } + + MultiResult_i::TPartInfos& aPartInfos = *thePartInfos; + MultiResult_i::TPartName2FileName& aPartName2FileName = *thePartName2FileName; + MultiResult_i::TPartName2Resolution& aPartName2Resolution = *thePartName2Resolution; + + MultiResult_i::TMainPart2SubPartNames& aMainPart2SubPartNames = *theMainPart2SubPartNames; + + for (size_t aPartID = 0 ; aPartID < aPartNames.size() ; aPartID++) { + const MultiResult_i::TPartName& aPartName = aPartNames[aPartID]; + MultiResult_i::TPartName aMainPart = ExtractMainPart(aPartName); + aMainPart2SubPartNames[aMainPart].insert(aPartName); + } + + std::string aLastEntry; + for (size_t aPartID = 0 ; aPartID < aPartNames.size() ; aPartID++) { + const MultiResult_i::TPartName& aPartName = aPartNames[aPartID]; + MultiResult_i::TPartInfo aPartInfo = GetPartInfo(aMultiprObj, aPartName); + + QFileInfo aFileInfo(aPartInfo.myFileName.c_str()); + aPartInfos[aFileInfo.fileName()] = aPartInfo; - MultiResult_i::TPartInfos& aPartInfos = *thePartInfos; - MultiResult_i::TPartName2FileName& aPartName2FileName = *thePartName2FileName; - MultiResult_i::TPartName2Resolution& aPartName2Resolution = *thePartName2Resolution; - - MultiResult_i::TMainPart2SubPartNames& aMainPart2SubPartNames = *theMainPart2SubPartNames; + aPartName2FileName[aPartInfo.myName] = aPartInfo.myFileName; - for (size_t aPartID = 0 ; aPartID < aPartNames.size() ; aPartID++) { - const MultiResult_i::TPartName& aPartName = aPartNames[aPartID]; - MultiResult_i::TPartName aMainPart = ExtractMainPart(aPartName); - aMainPart2SubPartNames[aMainPart].insert(aPartName); - } + if(!thePublishInStudy) + continue; - std::string aLastEntry; - for (size_t aPartID = 0 ; aPartID < aPartNames.size() ; aPartID++) { - const MultiResult_i::TPartName& aPartName = aPartNames[aPartID]; - std::string aStringInfo = aMultiprObj.getPartInfo(aPartName.c_str()); - - MultiResult_i::TPartInfo aPartInfo; - std::istrstream anOutputStream(aStringInfo.c_str()); - anOutputStream>>(aPartInfo.myMeshName); - anOutputStream>>(aPartInfo.myPartID); - anOutputStream>>(aPartInfo.myName); - anOutputStream>>(aPartInfo.myPath); - anOutputStream>>(aPartInfo.myFileName); - - QFileInfo aFileInfo(aPartInfo.myFileName.c_str()); - aPartInfos[aFileInfo.fileName()] = aPartInfo; - - aPartName2FileName[aPartInfo.myName] = aPartInfo.myFileName; - - QString aComment = ""; - MultiResult_i::TResolutions aResoltutions = GetResolutions(aMainPart2SubPartNames, aPartInfo.myName); - std::string aResoltutionsString = Resolutions2String(aResoltutions); - if ( IsFullResolution(aPartInfo.myName) ) { - std::string anIconName = GetIconName(aMainPart2SubPartNames, aPartInfo.myName); - VISU::Result::Resolution aResolution = GetResolution(aMainPart2SubPartNames, aPartInfo.myName); - aComment.sprintf("myComment=PART;myMeshName=%s;myFile=%s;myResolutions=%s;myState=%c", - aPartInfo.myMeshName.c_str(), aPartInfo.myFileName.c_str(), aResoltutionsString.c_str(), aResolution); - aLastEntry = CreateAttributes(theStudy, - aMesh->myPartsEntry, - anIconName, - NO_IOR, - aPartInfo.myName, - NO_PERFSITENT_REF, - aComment.latin1(), - true); - aPartName2Resolution[aPartInfo.myName] = aResolution; - } else { - aComment.sprintf("myComment=PART;myMeshName=%s;myFile=%s;myResolutions=%s", - aPartInfo.myMeshName.c_str(), aPartInfo.myFileName.c_str(), aResoltutionsString.c_str()); - CreateAttributes(theStudy, - aLastEntry, - NO_ICON, - NO_IOR, - aPartInfo.myName, - NO_PERFSITENT_REF, - aComment.latin1(), - true); - } + QString aComment = ""; + MultiResult_i::TResolutions aResoltutions = GetResolutions(aMainPart2SubPartNames, aPartInfo.myName); + std::string aResoltutionsString = Resolutions2String(aResoltutions); + if ( IsFullResolution(aPartInfo.myName) ) { + std::string anIconName = GetIconName(aMainPart2SubPartNames, aPartInfo.myName); + VISU::Result::Resolution aResolution = GetResolution(aMainPart2SubPartNames, aPartInfo.myName); + aComment.sprintf("myComment=PART;myMeshName=%s;myName=%s;myResolutions=%s;myState=%d", + aPartInfo.myMeshName.c_str(), aPartInfo.myName.c_str(), aResoltutionsString.c_str(), aResolution); + aLastEntry = CreateAttributes(theStudy, + aMesh->myPartsEntry, + anIconName, + NO_IOR, + aPartInfo.myName, + NO_PERFSITENT_REF, + aComment.latin1(), + true); + aPartName2Resolution[aPartInfo.myName] = aResolution; + } else { + aComment.sprintf("myComment=PART;myMeshName=%s;myName=%s;myResolutions=%s", + aPartInfo.myMeshName.c_str(), aPartInfo.myName.c_str(), aResoltutionsString.c_str()); + CreateAttributes(theStudy, + aLastEntry, + NO_ICON, + NO_IOR, + aPartInfo.myName, + NO_PERFSITENT_REF, + aComment.latin1(), + true); } - - *theIsDone = true; + } + + *theIsDone = true; }catch(std::exception& exc){ - INFOS("Follow exception was occured :\n"<StudyId(), theIsDone)); @@ -317,6 +391,7 @@ namespace VISU CORBA::Boolean* myIsDone; CORBA::Boolean myIsBuild; _PTR(Study) myStudy; + bool myPublishInStudy; TBuildPartsArgs(Result_i* theResult, Result_i::PInput theInput, @@ -327,7 +402,8 @@ namespace VISU MultiResult_i::TMainPart2SubPartNames* theMainPart2SubPartNames, CORBA::Boolean* theIsDone, CORBA::Boolean theIsBuild, - _PTR(Study) theStudy): + _PTR(Study) theStudy, + bool thePublishInStudy): myResult(theResult), myInput(theInput), myMultiprObj(theMultiprObj), @@ -337,7 +413,8 @@ namespace VISU myMainPart2SubPartNames(theMainPart2SubPartNames), myIsDone(theIsDone), myIsBuild(theIsBuild), - myStudy(theStudy) + myStudy(theStudy), + myPublishInStudy(thePublishInStudy) {} }; @@ -355,7 +432,8 @@ namespace VISU theArgs.myMainPart2SubPartNames, theArgs.myIsDone, theArgs.myIsBuild, - theArgs.myStudy); + theArgs.myStudy, + theArgs.myPublishInStudy); } @@ -419,7 +497,8 @@ VISU::MultiResult_i &myMainPart2SubPartNames, &myIsPartsDone, myIsBuildParts, - myStudy); + myStudy, + true); } return this; @@ -450,7 +529,8 @@ VISU::MultiResult_i &myMainPart2SubPartNames, &myIsPartsDone, myIsBuildParts, - myStudy); + myStudy, + true); boost::thread aThread(boost::bind(&BuildParts, anArgs)); } @@ -503,52 +583,57 @@ VISU::MultiResult_i const std::string& theURL, bool theIsMultiFile, TFileNames& theFileNames, - TFileNames& theFullFileNames, - TFileNames& theTemporaryDirs) + TFileNames& theFullFileNames) { + INITMSG(MYDEBUG, "MultiResult_i::Save - this = "<first; - aPartNames<second; - aResolutions<first; + aPartNames<second; + aResolutions<>aMeshName; - if(aMeshName == theMeshName) + MultiResult_i::TPartInfo aPartInfo = GetPartInfo(myMultiprObj, aPartName); + if(aPartInfo.myMeshName == theMeshName) aMeshParts.push_back(aPartName); } @@ -669,12 +831,8 @@ VISU::MultiResult_i if(aMainPart != thePartName) continue; - std::string aStringInfo = myMultiprObj.getPartInfo(aPartName.c_str()); - std::istrstream anOutputStream(aStringInfo.c_str()); - - TMeshName aMeshName; - anOutputStream>>aMeshName; - if(aMeshName != theMeshName) + MultiResult_i::TPartInfo aPartInfo = GetPartInfo(myMultiprObj, aPartName); + if(aPartInfo.myMeshName != theMeshName) continue; MultiResult_i::TResolutions aResolutions = VISU::GetResolutions(myMainPart2SubPartNames, thePartName); @@ -724,26 +882,25 @@ VISU::MultiResult_i if(aResolution == theResolution) return; - TPartName2FileName::iterator aFileNameIter = myPartName2FileName.find(thePartName); - if(aFileNameIter == myPartName2FileName.end()) - return; - const TFileName& aFileName = aFileNameIter->second; - VISU::Storable::TRestoringMap aRestoringMap; aRestoringMap["myComment"] = "PART"; aRestoringMap["myMeshName"] = theMeshName; - aRestoringMap["myFile"] = aFileName; + aRestoringMap["myName"] = thePartName; const VISU::TMeshMap& aMeshMap = Result_i::GetInput()->GetMeshMap(); VISU::TMeshMap::const_iterator aMeshIter = aMeshMap.find(theMeshName); if(aMeshIter == aMeshMap.end()) return; - const VISU::PMesh& aMesh = aMeshIter->second; - std::string aFatherEntry = Storable::FindEntry(GetStudyDocument(), - aMesh->myPartsEntry, - aRestoringMap); - + std::string aFatherEntry; + const VISU::PMesh& aMesh = aMeshIter->second; + if(aMesh->myPartsEntry != "") + aFatherEntry = Storable::FindEntry(GetStudyDocument(), + aMesh->myPartsEntry, + aRestoringMap); + else + aFatherEntry = Result_i::GetEntry(aRestoringMap); + std::string anIconName = "ICON_MULTIPR_VIEW_HIDE"; if(theResolution == VISU::Result::FULL) anIconName = "ICON_MULTIPR_VIEW_FULL"; @@ -758,10 +915,11 @@ VISU::MultiResult_i std::ostrstream anOutputStream; anOutputStream<<"myComment=PART;"; - anOutputStream<<"myFile="<second; - std::string aFileName = anInput->GetName(); - if(MYDEBUG) MESSAGE("'"<second; + std::string aFileName = anInput->GetName(); + INITMSG(MYDEBUG, "RemoveFile - aFileName = '"< +#include +#include + #include #include #include +#include +#include +namespace filesystem = boost::filesystem; + #ifdef _DEBUG_ static int MYTIMEDEBUG = 0; #else @@ -144,6 +152,26 @@ namespace VISU } + //---------------------------------------------------------------------------- + bool + SplitName(const std::string& theName, + std::string& theBase, + std::string& theSuffix, + char theDelimeter) + { + size_t aPosition = theName.find(theDelimeter); + if(aPosition == std::string::npos){ + theBase = theName; + theSuffix = ""; + return false; + } + + theBase = theName.substr(0, aPosition); + theSuffix = theName.substr(aPosition); + return true; + } + + //---------------------------------------------------------------------------- QString GenerateFieldName (const string& theName, const string& theUnits) @@ -598,5 +626,20 @@ namespace VISU } + //---------------------------------------------------------------------------- + bool + RemoveFile(const std::string& theFileName, + bool theRemoveEmptyDir) + { + QFileInfo aFileInfo(theFileName); + QFile(aFileInfo.absFilePath()).remove(); + + if(theRemoveEmptyDir) + QDir().rmdir(aFileInfo.dirPath(TRUE)); + + return aFileInfo.exists(); + } + + //---------------------------------------------------------------------------- } diff --git a/src/VISU_I/VISU_ResultUtils.hh b/src/VISU_I/VISU_ResultUtils.hh index 1f93c7cf..335849f1 100644 --- a/src/VISU_I/VISU_ResultUtils.hh +++ b/src/VISU_I/VISU_ResultUtils.hh @@ -74,6 +74,14 @@ namespace VISU GenerateName(const std::string& theName); + //---------------------------------------------------------------------------- + bool + SplitName(const std::string& theName, + std::string& theBase, + std::string& theSuffix, + char theDelimeter = ':'); + + //---------------------------------------------------------------------------- void BuildEntities(Result_i* theResult, @@ -126,6 +134,11 @@ namespace VISU _PTR(Study) theStudy); //---------------------------------------------------------------------------- + bool + RemoveFile(const std::string& theFileName, + bool theRemoveEmptyDir = true); + + //---------------------------------------------------------------------------- } diff --git a/src/VISU_I/VISU_Result_i.cc b/src/VISU_I/VISU_Result_i.cc index ff1b63f8..f07256d4 100644 --- a/src/VISU_I/VISU_Result_i.cc +++ b/src/VISU_I/VISU_Result_i.cc @@ -172,7 +172,14 @@ VISU::Result_i //--------------------------------------------------------------- VISU::Result_i -::Result_i() +::Result_i(): + myIsEntitiesDone(false), + myIsFieldsDone(false), + myIsGroupsDone(false), + myIsMinMaxDone(false), + myIsAllDone(false), + myIsBuildParts(false), + myIsPartsDone(false) {} @@ -599,26 +606,38 @@ VISU::Result_i const std::string& theURL, bool theIsMultiFile, TFileNames& theFileNames, - TFileNames& theFullFileNames, - TFileNames& theTemporaryDirs) + TFileNames& theFullFileNames) { switch(GetCreationId()){ case Result_i::eImportFile: case Result_i::eCopyAndImportFile: { - filesystem::path aFileName = std::string("_") + GetName(); - filesystem::path aFilePath = GetFileInfo().filePath().latin1(); + std::string aPrefix; + if (theIsMultiFile) { + CORBA::String_var anURL = GetStudyDocument()->URL(); + aPrefix = SALOMEDS_Tool::GetNameFromPath(anURL.in()); + } + + std::string aFileName = aPrefix + "_" + GetName(); + std::string aFilePath = GetFileInfo().filePath().latin1(); + if(theIsMultiFile){ CORBA::String_var anURL = GetStudyDocument()->URL(); - aFilePath = SALOMEDS_Tool::GetNameFromPath(anURL.in()) + aFilePath.string(); + aFilePath = SALOMEDS_Tool::GetNameFromPath(anURL.in()) + aFilePath; + filesystem::path aPathToCopy = filesystem::path(theURL) / aFileName; filesystem::copy_file(aFilePath, aPathToCopy); if(!filesystem::exists(aPathToCopy)) return false; } - if(MYDEBUG) MESSAGE("Result_i::Save - aFileName ='"<GetFatherComponent(); myStudyDocument = theSObject->GetStudy(); + myStudy = VISU::GetStudy(myStudyDocument); myCreationId = ECreationId(Storable::FindValue(theMap, "myCreationId").toInt()); mySourceId = eRestoredFile; @@ -739,18 +759,16 @@ VISU::Result_i myIsBuildFields = Storable::FindValue(theMap, "myIsBuildFields", "1").toInt(); myIsBuildMinMax = Storable::FindValue(theMap, "myIsBuildMinMax", "1").toInt(); myIsBuildGroups = Storable::FindValue(theMap, "myIsBuildGroups", "1").toInt(); - myIsBuildParts = Storable::FindValue(theMap, "myIsBuildParts", "0").toInt(); myIsBuildImmediately = true; try { myName = VISU::Storable::FindValue(theMap, "myName").latin1(); + VISU::GenerateName(myName); // To register the name in global naming map SetFileName(VISU::Storable::FindValue(theMap, "myInitFileName").latin1()); SALOMEDS::SObject_var aRefSObj, aTargetRefSObj; - if (mySObject->FindSubObject(1, aRefSObj) && - aRefSObj->ReferencedObject(aTargetRefSObj)) - { + if (theSObject->FindSubObject(1, aRefSObj) && aRefSObj->ReferencedObject(aTargetRefSObj)) { if(MYDEBUG) MESSAGE("Result_i::GetInput - There is some reference."); SALOMEDS::SComponent_var aCompRefSObj = aTargetRefSObj->GetFatherComponent(); CORBA::String_var aDataType = aCompRefSObj->ComponentDataType(); @@ -782,9 +800,11 @@ VISU::Result_i } else { myFileInfo.setFile(thePrefix.c_str()); - string aStudyPrefix (""); - if (theIsMultiFile) - aStudyPrefix = SALOMEDS_Tool::GetNameFromPath(myStudyDocument->URL()); + std::string aStudyPrefix (""); + if (theIsMultiFile) { + CORBA::String_var anURL(GetStudyDocument()->URL()); + aStudyPrefix = SALOMEDS_Tool::GetNameFromPath(anURL.in()); + } if (!myFileInfo.isFile()) { string aFileName = thePrefix + aStudyPrefix + "_" + myName; myFileInfo.setFile(aFileName.c_str()); @@ -1324,7 +1344,6 @@ VISU::Result_i Storable::DataToStream(theStr,"myIsBuildFields", myIsFieldsDone); Storable::DataToStream(theStr,"myIsBuildMinMax", myIsMinMaxDone); Storable::DataToStream(theStr,"myIsBuildGroups", myIsGroupsDone); - Storable::DataToStream(theStr,"myIsBuildParts", myIsBuildParts); } @@ -1429,24 +1448,8 @@ VISU::Result_i ::~Result_i() { MESSAGE("Result_i::~Result_i() - this = "<