- MESSAGE("SMESH_Gen_i::SAVE");
- SALOMEDS::Study_var Study = theComponent->GetStudy();
- int studyId;
-
- // Declare a byte stream
- SALOMEDS::TMPFile_var aStreamFile;
-
- // Obtain a temporary dir
- TCollection_AsciiString tmpDir =
- (isMultiFile) ? TCollection_AsciiString((char *)theURL) :
- SALOMEDS_Tool::GetTmpDir();
-
- // Create a sequence of files processed
- SALOMEDS::ListOfFileNames_var aFileSeq = new SALOMEDS::ListOfFileNames;
- aFileSeq->length(NUM_TMP_FILES);
-
- TCollection_AsciiString aStudyName("");
-
- if (isMultiFile)
- aStudyName =
- (SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL()));
-
- // Set names of temporary files
- TCollection_AsciiString filename =
- aStudyName + TCollection_AsciiString("_SMESH.hdf");
- TCollection_AsciiString hypofile =
- aStudyName + TCollection_AsciiString("_SMESH_Hypo.txt");
- TCollection_AsciiString algofile =
- aStudyName + TCollection_AsciiString("_SMESH_Algo.txt");
- TCollection_AsciiString meshfile =
- aStudyName + TCollection_AsciiString("_SMESH_Mesh.med");
- aFileSeq[0] = CORBA::string_dup(filename.ToCString());
- aFileSeq[1] = CORBA::string_dup(hypofile.ToCString());
- aFileSeq[2] = CORBA::string_dup(algofile.ToCString());
- aFileSeq[3] = CORBA::string_dup(meshfile.ToCString());
- filename = tmpDir + filename;
- hypofile = tmpDir + hypofile;
- algofile = tmpDir + algofile;
- meshfile = tmpDir + meshfile;
-
- HDFfile *hdf_file;
- map < int, HDFgroup * >hdf_group, hdf_subgroup;
- map < int, HDFdataset * >hdf_dataset;
- FILE *destFile;
-
- SALOMEDS::ChildIterator_var itBig, it, itSM;
- SALOMEDS::SObject_var mySObject, myBranch, mySObjectChild;
- hdf_size size[1];
- int longueur, cmpt_ds = 0, cmpt_it;
- char *name_group, name_dataset[30], name_meshgroup[30];
- bool ok, _found;
- int cmpt_sm = 0, myTag;
-
-//************* HDF file creation
- hdf_file = new HDFfile(filename.ToCString());
- hdf_file->CreateOnDisk();
-//****************************
-
- itBig = Study->NewChildIterator(theComponent);
- SCRUTE(Tag_HypothesisRoot);
- SCRUTE(Tag_AlgorithmsRoot);
- for (; itBig->More(); itBig->Next())
- {
- SALOMEDS::SObject_var gotBranch = itBig->Value();
- SCRUTE(gotBranch->Name());
- SCRUTE(gotBranch->Tag());
- SCRUTE(gotBranch->GetID());
-
-//************branch 1 : hypothesis
- if (gotBranch->Tag() == Tag_HypothesisRoot)
- { //hypothesis = tag 1
- double length, maxElementsArea, maxElementsVolume;
- int numberOfSegments;
-
- destFile = fopen(hypofile.ToCString(), "w");
- it = Study->NewChildIterator(gotBranch);
- for (; it->More(); it->Next())
- {
- mySObject = it->Value();
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeIOR_var anIOR;
- if (mySObject->FindAttribute(anAttr, "AttributeIOR"))
- {
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-
- SMESH::SMESH_Hypothesis_var myHyp =
- SMESH::SMESH_Hypothesis::_narrow(_orb->
- string_to_object(anIOR->Value()));
- SCRUTE(myHyp->GetName());
- fprintf(destFile, "%li\n", myHyp->GetId());
- fprintf(destFile, "%s\n", myHyp->GetName());
- if (strcmp(myHyp->GetName(), "LocalLength") == 0)
- {
- SMESH::SMESH_LocalLength_var LL =
- SMESH::SMESH_LocalLength::_narrow(myHyp);
- length = LL->GetLength();
- fprintf(destFile, "%f\n", length);
- }
- else if (strcmp(myHyp->GetName(), "NumberOfSegments") == 0)
- {
- SMESH::SMESH_NumberOfSegments_var NOS =
- SMESH::SMESH_NumberOfSegments::_narrow(myHyp);
- numberOfSegments = NOS->GetNumberOfSegments();
- fprintf(destFile, "%d\n", numberOfSegments);
- }
- else if (strcmp(myHyp->GetName(), "MaxElementArea") == 0)
- {
- SMESH::SMESH_MaxElementArea_var MEA =
- SMESH::SMESH_MaxElementArea::_narrow(myHyp);
- maxElementsArea = MEA->GetMaxElementArea();
- fprintf(destFile, "%f\n", maxElementsArea);
- }
- else if (strcmp(myHyp->GetName(), "MaxElementVolume") == 0)
- {
- SMESH::SMESH_MaxElementVolume_var MEV =
- SMESH::SMESH_MaxElementVolume::_narrow(myHyp);
- maxElementsVolume = MEV->GetMaxElementVolume();
- fprintf(destFile, "%f\n", maxElementsVolume);
- }
- }
- }
- fclose(destFile);
-
-//writes the file name in the hdf file
- longueur = hypofile.Length() + 1;
- name_group = "Hypothesis";
- //SCRUTE(name_group);
-
- size[0] = longueur;
- hdf_group[1] = new HDFgroup(name_group, hdf_file);
- hdf_group[1]->CreateOnDisk();
-
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_group, hdf_group[1], HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->WriteOnDisk(hypofile.ToCString());
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- cmpt_ds++;
-
- hdf_group[1]->CloseOnDisk();
- MESSAGE("End of Hypothesis Save");
-
- }
-//************branch 2 : algorithms
- else if (gotBranch->Tag() == Tag_AlgorithmsRoot)
- { //algos = tag 2
- destFile = fopen(algofile.ToCString(), "w");
- it = Study->NewChildIterator(gotBranch);
- for (; it->More(); it->Next())
- {
- mySObject = it->Value();
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeIOR_var anIOR;
- if (mySObject->FindAttribute(anAttr, "AttributeIOR"))
- {
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
- SMESH::SMESH_Algo_var myAlgo =
- SMESH::SMESH_Algo::_narrow(_orb->
- string_to_object(anIOR->Value()));
- SCRUTE(anIOR->Value());
- SCRUTE(myAlgo->_is_nil());
- fprintf(destFile, "%li\n", myAlgo->GetId());
- fprintf(destFile, "%s\n", myAlgo->GetName());
- }
- }
-
- fclose(destFile);
-
-//writes the file name in the hdf file
- longueur = algofile.Length() + 1;
- name_group = "Algorithms";
- //SCRUTE(name_group);
-
- size[0] = longueur;
- hdf_group[2] = new HDFgroup(name_group, hdf_file);
- hdf_group[2]->CreateOnDisk();
-
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_group, hdf_group[2], HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->WriteOnDisk(algofile.ToCString());
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- cmpt_ds++;
-
- hdf_group[2]->CloseOnDisk();
- MESSAGE("End of Algos Save");
-
- }
-//************branch 3 : meshes
- else if (gotBranch->Tag() >= 3)
- { //meshes = tag > 3
-
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeIOR_var anIOR;
- if (gotBranch->FindAttribute(anAttr, "AttributeIOR"))
- {
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-
- SMESH::SMESH_Mesh_var myMesh =
- SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->
- Value()));
- studyId = myMesh->GetStudyId();
- SCRUTE(studyId);
-
- StudyContext_iStruct *myStudyContext =
- _mapStudyContext_i[studyId];
- int meshId = myMesh->GetId();
- SMESH_Mesh_i *meshServant = myStudyContext->mapMesh_i[meshId];
- ::SMESH_Mesh & myLocMesh = meshServant->GetImpl();
- SMESHDS_Mesh *mySMESHDSMesh = myLocMesh.GetMeshDS();
-
- SCRUTE(mySMESHDSMesh->NbNodes());
- if (mySMESHDSMesh->NbNodes() > 0)
- {
- //checks if the mesh is not empty
- Mesh_Writer *myWriter = SMESHDriver::GetMeshWriter("MED");
- myWriter->SetFile(meshfile.ToCString());
- myWriter->SetMesh(mySMESHDSMesh);
- myWriter->SetMeshId(gotBranch->Tag());
- myWriter->Add();
- }
- else
- meshfile = "No data";
-
- //********** opening of the HDF group
- sprintf(name_meshgroup, "Mesh %d", meshId);
- SCRUTE(name_meshgroup);
- hdf_group[gotBranch->Tag()] =
- new HDFgroup(name_meshgroup, hdf_file);
- hdf_group[gotBranch->Tag()]->CreateOnDisk();
- //**********
-
- //********** file where the data are stored
- longueur = strlen(meshfile.ToCString()) + 1;
- size[0] = longueur;
- strcpy(name_dataset, "Mesh data");
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_dataset, hdf_group[gotBranch->Tag()],
- HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->WriteOnDisk(meshfile.ToCString());
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- cmpt_ds++;
- //**********
-
- //********** ref on shape
- Standard_CString myRefOnObject = "";
- SALOMEDS::SObject_var myRef, myShape;
- _found = gotBranch->FindSubObject(Tag_RefOnShape, myRef);
- if (_found)
- {
- ok = myRef->ReferencedObject(myShape);
- myRefOnObject = myShape->GetID();
- SCRUTE(myRefOnObject);
-
- longueur = strlen(myRefOnObject) + 1;
- if (longueur > 1)
- {
- size[0] = longueur;
- strcpy(name_dataset, "Ref on shape");
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_dataset,
- hdf_group[gotBranch->Tag()], HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject);
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- cmpt_ds++;
-
- }
- }
- //**********
-
- //********** ref on applied hypothesis
- _found =
- gotBranch->FindSubObject(Tag_RefOnAppliedHypothesis,
- myBranch);
- if (_found)
- {
-
- strcpy(name_meshgroup, "Applied Hypothesis");
- hdf_subgroup[Tag_RefOnAppliedHypothesis] =
- new HDFgroup(name_meshgroup,
- hdf_group[gotBranch->Tag()]);
- hdf_subgroup[Tag_RefOnAppliedHypothesis]->CreateOnDisk();
-
- it = Study->NewChildIterator(myBranch);
- cmpt_it = 0;
- for (; it->More(); it->Next())
- {
- mySObject = it->Value();
- ok = mySObject->ReferencedObject(myRef);
- myRefOnObject = myRef->GetID();
-
- longueur = strlen(myRefOnObject) + 1;
- if (longueur > 1)
- {
- size[0] = longueur;
- sprintf(name_dataset, "Hyp %d", cmpt_it);
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_dataset,
- hdf_subgroup[Tag_RefOnAppliedHypothesis],
- HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject);
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- }
- cmpt_ds++;
- cmpt_it++;
- }
- hdf_subgroup[Tag_RefOnAppliedHypothesis]->CloseOnDisk();
- }
- //**********
-
- //********** ref on applied algorithms
- _found =
- gotBranch->FindSubObject(Tag_RefOnAppliedAlgorithms,
- myBranch);
- if (_found)
- {
-
- strcpy(name_meshgroup, "Applied Algorithms");
- hdf_subgroup[Tag_RefOnAppliedAlgorithms] =
- new HDFgroup(name_meshgroup,
- hdf_group[gotBranch->Tag()]);
- hdf_subgroup[Tag_RefOnAppliedAlgorithms]->CreateOnDisk();
-
- it = Study->NewChildIterator(myBranch);
- cmpt_it = 0;
- for (; it->More(); it->Next())
- {
- mySObject = it->Value();
- ok = mySObject->ReferencedObject(myRef);
- myRefOnObject = myRef->GetID();
-
- longueur = strlen(myRefOnObject) + 1;
- if (longueur > 1)
- {
- size[0] = longueur;
- sprintf(name_dataset, "Algo %d", cmpt_it);
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_dataset,
- hdf_subgroup[Tag_RefOnAppliedAlgorithms],
- HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject);
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- }
- cmpt_ds++;
- cmpt_it++;
- }
- hdf_subgroup[Tag_RefOnAppliedAlgorithms]->CloseOnDisk();
- }
- MESSAGE("end of algo applied");
- //**********
-
- //********** submeshes on subshapes
- int myLevel1Tag;
- for (int i = Tag_SubMeshOnVertex; i <= Tag_SubMeshOnCompound;
- i++)
- {
- _found = gotBranch->FindSubObject(i, myBranch);
- if (_found)
- {
- if (i == Tag_SubMeshOnVertex)
- strcpy(name_meshgroup, "SubMeshes On Vertex");
- else if (i == Tag_SubMeshOnEdge)
- strcpy(name_meshgroup, "SubMeshes On Edge");
- else if (i == Tag_SubMeshOnFace)
- strcpy(name_meshgroup, "SubMeshes On Face");
- else if (i == Tag_SubMeshOnSolid)
- strcpy(name_meshgroup, "SubMeshes On Solid");
- else if (i == Tag_SubMeshOnCompound)
- strcpy(name_meshgroup, "SubMeshes On Compound");
-
- cmpt_sm++;
- myLevel1Tag = 10 + cmpt_sm;
- hdf_subgroup[myLevel1Tag] =
- new HDFgroup(name_meshgroup,
- hdf_group[gotBranch->Tag()]);
- hdf_subgroup[myLevel1Tag]->CreateOnDisk();
-
- itSM = Study->NewChildIterator(myBranch);
- for (; itSM->More(); itSM->Next())
- { //Loop on all submeshes
- mySObject = itSM->Value();
- cmpt_sm++;
- myTag = 10 + cmpt_sm;
- mySObject->FindAttribute(anAttr, "AttributeIOR");
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
- SMESH::SMESH_subMesh_var mySubMesh =
- SMESH::SMESH_subMesh::_narrow(_orb->
- string_to_object(anIOR->Value()));
-
- //sprintf(name_meshgroup,"SubMesh %d",myTag);
- sprintf(name_meshgroup, "SubMesh %ld",
- mySubMesh->GetId());
- SCRUTE(name_meshgroup);
-
- hdf_subgroup[myTag] =
- new HDFgroup(name_meshgroup,
- hdf_subgroup[myLevel1Tag]);
- hdf_subgroup[myTag]->CreateOnDisk();
-
- //********** ref on shape
- Standard_CString myRefOnObject = "";
- SALOMEDS::SObject_var myRef, myShape;
- bool _found2;
- _found2 =
- mySObject->FindSubObject(Tag_RefOnShape, myRef);
- if (_found2)
- {
- ok = myRef->ReferencedObject(myShape);
- myRefOnObject = myShape->GetID();
- SCRUTE(myRefOnObject);
-
- longueur = strlen(myRefOnObject) + 1;
- if (longueur > 1)
- {
- size[0] = longueur;
- strcpy(name_dataset, "Ref on shape");
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_dataset,
- hdf_subgroup[myTag], HDF_STRING, size,
- 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->
- WriteOnDisk(myRefOnObject);
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- cmpt_ds++;
- }
- }
- //**********
-
- //********** ref on applied hypothesis
- _found2 =
- mySObject->
- FindSubObject(Tag_RefOnAppliedHypothesis,
- myBranch);
- if (_found2)
- {
-
- strcpy(name_meshgroup, "Applied Hypothesis");
- cmpt_sm++;
- hdf_subgroup[10 + cmpt_sm] =
- new HDFgroup(name_meshgroup,
- hdf_subgroup[myTag]);
- hdf_subgroup[10 + cmpt_sm]->CreateOnDisk();
-
- it = Study->NewChildIterator(myBranch);
- cmpt_it = 0;
- for (; it->More(); it->Next())
- {
- mySObjectChild = it->Value();
- ok = mySObjectChild->
- ReferencedObject(myRef);
- myRefOnObject = myRef->GetID();
-
- longueur = strlen(myRefOnObject) + 1;
- if (longueur > 1)
- {
- size[0] = longueur;
- sprintf(name_dataset, "Hyp %d",
- cmpt_it);
- SCRUTE(cmpt_it);
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_dataset,
- hdf_subgroup[10 + cmpt_sm],
- HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->
- WriteOnDisk(myRefOnObject);
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- }
- cmpt_ds++;
- cmpt_it++;
- }
- hdf_subgroup[10 + cmpt_sm]->CloseOnDisk();
- }
- //**********
-
- //********** ref on applied algorithms
- _found2 =
- mySObject->
- FindSubObject(Tag_RefOnAppliedAlgorithms,
- myBranch);
- SCRUTE(_found2);
- if (_found2)
- {
-
- strcpy(name_meshgroup, "Applied Algorithms");
- cmpt_sm++;
- hdf_subgroup[10 + cmpt_sm] =
- new HDFgroup(name_meshgroup,
- hdf_subgroup[myTag]);
- hdf_subgroup[10 + cmpt_sm]->CreateOnDisk();
-
- it = Study->NewChildIterator(myBranch);
- cmpt_it = 0;
- for (; it->More(); it->Next())
- {
- mySObjectChild = it->Value();
- ok = mySObjectChild->
- ReferencedObject(myRef);
- myRefOnObject = myRef->GetID();
-
- longueur = strlen(myRefOnObject) + 1;
- if (longueur > 1)
- {
- size[0] = longueur;
- sprintf(name_dataset, "Algo %d",
- cmpt_it);
- hdf_dataset[cmpt_ds] =
- new HDFdataset(name_dataset,
- hdf_subgroup[10 + cmpt_sm],
- HDF_STRING, size, 1);
- hdf_dataset[cmpt_ds]->CreateOnDisk();
- hdf_dataset[cmpt_ds]->
- WriteOnDisk(myRefOnObject);
- hdf_dataset[cmpt_ds]->CloseOnDisk();
- }
- cmpt_ds++;
- cmpt_it++;
- }
- hdf_subgroup[10 + cmpt_sm]->CloseOnDisk();
- }
- //MESSAGE("end of algo applied");
- //**********
-
- hdf_subgroup[myTag]->CloseOnDisk();
- }
-
- hdf_subgroup[myLevel1Tag]->CloseOnDisk();
- }
-
- }
- //**********
-
- //********** closing of the HDF group
- hdf_group[gotBranch->Tag()]->CloseOnDisk();
- MESSAGE("End of Mesh Save");
- //**********
- }
- }
- MESSAGE("End of Meshes Save");
- }
-
- MESSAGE("hdf_file->CloseOnDisk()");
- hdf_file->CloseOnDisk();
-
- MESSAGE("delete hdf_file");
- delete hdf_file;
- hdf_file = 0;
-
- // Convert temporary files to stream
- MESSAGE("Convert temporary files to stream");
- aStreamFile =
- SALOMEDS_Tool::PutFilesToStream(tmpDir.ToCString(), aFileSeq.in(),
- isMultiFile);
-
- // Remove temporary files and directory
- MESSAGE("Remove temporary files and directory");
- if (!isMultiFile)
- SALOMEDS_Tool::RemoveTemporaryFiles(tmpDir.ToCString(), aFileSeq.in(),
- true);