From 1e6d06f174b0a164e7345301fb913ec474a29a72 Mon Sep 17 00:00:00 2001 From: jfa Date: Thu, 1 Jun 2023 16:50:36 +0100 Subject: [PATCH] Implementation of [bos #35140] [EDF] (2023-T1) Memory communication between SHAPER and GEOM --- doc/salome/examples/import_export.py | 6 + doc/salome/gui/GEOM/input/import_export.doc | 18 +- .../GEOM/input/tui_importexport_geom_objs.doc | 21 -- idl/XAOPlugin.idl | 28 +++ src/GEOM_SWIG/XAOPluginBuilder.py | 104 +++++++- src/XAO/XAO_XaoExporter.cxx | 4 +- src/XAOPlugin/XAOPlugin_IOperations.cxx | 223 +++++++++++++++--- src/XAOPlugin/XAOPlugin_IOperations.hxx | 25 +- src/XAOPlugin/XAOPlugin_IOperations_i.cc | 140 ++++++++++- src/XAOPlugin/XAOPlugin_IOperations_i.hh | 28 +++ 10 files changed, 523 insertions(+), 74 deletions(-) delete mode 100644 doc/salome/gui/GEOM/input/tui_importexport_geom_objs.doc diff --git a/doc/salome/examples/import_export.py b/doc/salome/examples/import_export.py index e01203890..85e31d1db 100644 --- a/doc/salome/examples/import_export.py +++ b/doc/salome/examples/import_export.py @@ -45,6 +45,9 @@ geompy.ExportVTK(sphere, f_vtk2, 0.1) f_xao = os.path.join(tmpdir, "sphere.xao") geompy.ExportXAO(sphere, [], [], "author", f_xao) +# export sphere to XAO format memory buffer (bytes array) +buff_xao = geompy.ExportXAOMem(sphere, [], [], "author") + # import BREP file sphere_brep = geompy.ImportBREP(f_brep) @@ -64,6 +67,9 @@ sphere_stl2 = geompy.ImportSTL(f_stl2) # import XAO file ok, sphere_xao, sub_shapes, groups, fields = geompy.ImportXAO(f_xao) +# import XAO data from memory buffer (bytes array) +ok_mem, sphere_xao_mem, sub_shapes_mem, groups_mem, fields_mem = geompy.ImportXAOMem(buff_xao) + # clean up for f in f_brep, f_iges, f_step, f_stl1, f_stl2, f_vtk1, f_vtk2, f_xao: os.remove(f) diff --git a/doc/salome/gui/GEOM/input/import_export.doc b/doc/salome/gui/GEOM/input/import_export.doc index 7e79e38d6..57c96e57d 100644 --- a/doc/salome/gui/GEOM/input/import_export.doc +++ b/doc/salome/gui/GEOM/input/import_export.doc @@ -88,6 +88,16 @@ In the \b File menu select Import/XAO. \par +It is possible to import a shape from XAO file using the TUI Command: + +ok, Shape, Sub_Shapes, Groups, Fields = geompy.ImportXAO(FileName) + +It is also possible to import a shape from XAO format memory buffer (bytes array) using the TUI Command: + +ok, Shape, Sub_Shapes, Groups, Fields = geompy.ImportXAOMem(aBuffer) + +\par + To export a shape in the \b XAO format: \par @@ -104,6 +114,12 @@ In this dialog: - Select the \b Fields of the chosen shape to be exported. - Press "Apply" or "Apply & Close" button to get the result. -It is also possible to export a shape using the TUI Command: geompy.ExportXAO(Shape, Groups, Fields, Author, FileName, ShapeFileName) +It is possible to export a shape in XAO file using the TUI Command: + +geompy.ExportXAO(Shape, Groups, Fields, Author, FileName, ShapeFileName) + +It is also possible to export a shape in XAO format memory buffer (bytes array) using the TUI Command: + +aBuffer = geompy.ExportXAOMem(Shape, Groups, Fields, Author) */ diff --git a/doc/salome/gui/GEOM/input/tui_importexport_geom_objs.doc b/doc/salome/gui/GEOM/input/tui_importexport_geom_objs.doc deleted file mode 100644 index 12c30a1ee..000000000 --- a/doc/salome/gui/GEOM/input/tui_importexport_geom_objs.doc +++ /dev/null @@ -1,21 +0,0 @@ -\anchor tui_creation_exportxao -

Creation of ExportXAO

- -\code -import salome -import GEOM -from salome.geom import geomBuilder -geompy = geomBuilder.New() - -gg = salome.ImportComponentGUI("GEOM") - -# create ExportXAO object -exportxao = geompy.ExportXAO([value], [value], [value], [value]) - -# add object in the study -id_exportxao = geompy.addToStudy(exportxao,"ExportXAO") - -# display exportxao -gg.createAndDisplayGO(id_exportxao) -\endcode - diff --git a/idl/XAOPlugin.idl b/idl/XAOPlugin.idl index 08e81fc54..75a44f94a 100644 --- a/idl/XAOPlugin.idl +++ b/idl/XAOPlugin.idl @@ -46,6 +46,19 @@ module GEOM in string fileName, in string shapeFileName ); + /*! + * Export a shape to XAO format in a byte array + * \param shape The shape to export + * \param groups The list of groups to export + * \param fields The list of fields to export + * \param author The author of the export + * \return Byte array with exported data. + */ + SALOMEDS::TMPFile ExportXAOMem( in GEOM::GEOM_Object shape, + in GEOM::ListOfGO groups, + in GEOM::ListOfFields fields, + in string author ); + /*! * Import a shape from XAO format * \param fileName The name of the file to import @@ -60,6 +73,21 @@ module GEOM out GEOM::ListOfGO subShapes, out GEOM::ListOfGO groups, out GEOM::ListOfFields fields ); + + /*! + * Import a shape from XAO format byte array + * \param theBuff The byte array with data in XAO format + * \param shape The imported shape + * \param subShapes The list of imported subShapes + * \param groups The list of imported groups + * \param fields The list of imported fields + * \return boolean indicating if import was successful. + */ + boolean ImportXAOMem( in SALOMEDS::TMPFile theBuff, + out GEOM::GEOM_Object shape, + out GEOM::ListOfGO subShapes, + out GEOM::ListOfGO groups, + out GEOM::ListOfFields fields ); }; }; diff --git a/src/GEOM_SWIG/XAOPluginBuilder.py b/src/GEOM_SWIG/XAOPluginBuilder.py index 4d560113c..14b9b1e89 100644 --- a/src/GEOM_SWIG/XAOPluginBuilder.py +++ b/src/GEOM_SWIG/XAOPluginBuilder.py @@ -18,6 +18,7 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +import GEOM from GEOM import IXAOOperations # Engine Library Name @@ -57,6 +58,32 @@ def ExportXAO(self, shape, groups, fields, author, fileName, shapeFileName = "") RaiseIfFailed("ExportXAO", anOp) return res +## Export a shape to XAO format in byte array +# @param shape The shape to export +# @param groups The list of groups to export +# @param fields The list of fields to export +# @param author The author of the file +# @return Byte array with exported data +# +# @ingroup l2_import_export +def ExportXAOMem(self, shape, groups, fields, author): + """ + Export a shape to XAO format in byte array + + Parameters: + shape The shape to export + groups The list of groups to export + fields The list of fields to export + + Returns: + Byte array with exported data + """ + from salome.geom.geomBuilder import RaiseIfFailed + anOp = GetXAOPluginOperations(self) + res = anOp.ExportXAOMem(shape, groups, fields, author) + RaiseIfFailed("ExportXAOMem", anOp) + return res + ## Import a shape from XAO format # @param fileName The name of the file to import # @param theName Object name; when specified, this parameter is used @@ -91,7 +118,78 @@ def ImportXAO(self, fileName, theName=None): """ from salome.geom.geomBuilder import RaiseIfFailed anOp = GetXAOPluginOperations(self) - res = anOp.ImportXAO(fileName) + (res, shape, subShapes, groups, fields) = anOp.ImportXAO(fileName) RaiseIfFailed("ImportXAO", anOp) - self._autoPublish(res[1], theName, "imported") - return res + if res: + # publish imported shape + self._autoPublish(shape, theName, "imported") + # publish imported sub shapes, groups and fields + if theName or self.myMaxNbSubShapesAllowed: + for ss in (subShapes + groups + fields): + self.addToStudyInFather(shape, ss, ss.GetName()) + if isinstance( ss, GEOM._objref_GEOM_Field ): + listStepIDs = ss.GetSteps() + for stepID in listStepIDs: + step = ss.GetStep(stepID) + self.addToStudyInFather(ss, step, step.GetName()) + pass + pass + pass + pass + pass + return (res, shape, subShapes, groups, fields) + +## Import a shape from XAO format byte array +# @param byteArray byte array with XAO data +# @param theName Object name; when specified, this parameter is used +# for result publication in the study. Otherwise, if automatic +# publication is switched on, default value is used for result name. +# +# @return tuple (\a res, \a shape, \a subShapes, \a groups, \a fields) +# \a res Flag indicating if the import was successful +# \a shape The imported shape +# \a subShapes The list of imported subShapes +# \a groups The list of imported groups +# \a fields The list of imported fields +# +# @ingroup l2_import_export +def ImportXAOMem(self, byteArray, theName=None): + """ + Import a shape from XAO format byte array + + Parameters: + byteArray byte array with XAO data + theName Object name; when specified, this parameter is used + for result publication in the study. Otherwise, if automatic + publication is switched on, default value is used for result name. + + Returns: + A tuple (res, shape, subShapes, groups, fields): + - res: Flag indicating if the import was successful + - shape: The imported shape + - subShapes: The list of imported subShapes + - groups: The list of imported groups + - fields: The list of imported fields + """ + from salome.geom.geomBuilder import RaiseIfFailed + anOp = GetXAOPluginOperations(self) + (res, shape, subShapes, groups, fields) = anOp.ImportXAOMem(byteArray) + RaiseIfFailed("ImportXAOMem", anOp) + if res: + # publish imported shape + self._autoPublish(shape, theName, "imported") + # publish imported sub shapes, groups and fields + if theName or self.myMaxNbSubShapesAllowed: + for ss in (subShapes + groups + fields): + self.addToStudyInFather(shape, ss, ss.GetName()) + if isinstance( ss, GEOM._objref_GEOM_Field ): + listStepIDs = ss.GetSteps() + for stepID in listStepIDs: + step = ss.GetStep(stepID) + self.addToStudyInFather(ss, step, step.GetName()) + pass + pass + pass + pass + pass + return (res, shape, subShapes, groups, fields) diff --git a/src/XAO/XAO_XaoExporter.cxx b/src/XAO/XAO_XaoExporter.cxx index 9f3991967..3e95671b4 100644 --- a/src/XAO/XAO_XaoExporter.cxx +++ b/src/XAO/XAO_XaoExporter.cxx @@ -655,7 +655,9 @@ const std::string XaoExporter::saveToXml(Xao* xaoObject) xmlChar *xmlbuff; int buffersize; - xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); // format = 1 for node indentation + //xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); // format = 1 for node indentation + // save with encoding to correspond to "saveToFile" and provide the same file size + xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, "UTF-8", 1); // format = 1 for node indentation xmlFreeDoc(doc); xmlCleanupGlobals(); diff --git a/src/XAOPlugin/XAOPlugin_IOperations.cxx b/src/XAOPlugin/XAOPlugin_IOperations.cxx index de2b1b9d2..53d216151 100644 --- a/src/XAOPlugin/XAOPlugin_IOperations.cxx +++ b/src/XAOPlugin/XAOPlugin_IOperations.cxx @@ -58,6 +58,8 @@ #include +#include + XAO::Dimension shapeEnumToDimension(const TopAbs_ShapeEnum& shape) { XAO::Dimension dim; @@ -323,12 +325,13 @@ void XAOPlugin_IOperations::exportSubshapes( const Handle(GEOM_Object)& shape, X //============================================================================= /*! - * Export a shape to XAO format - * \param shape The shape to export - * \param groups The list of groups to export - * \param fields The list of fields to export - * \param fileName The name of the file to exported - * \return boolean indicating if export was succeful. + * Export a shape to XAO format file. + * \param shape The shape to export. + * \param groups The list of groups to export. + * \param fields The list of fields to export. + * \param fileName The name of the file to be exported. + * \param shapeFileName The name of the file for shape, if it should be exported separately. + * \return boolean indicating if export was successful. */ //============================================================================= bool XAOPlugin_IOperations::ExportXAO( Handle(GEOM_Object) shape, @@ -338,21 +341,67 @@ bool XAOPlugin_IOperations::ExportXAO( Handle(GEOM_Object) shape, const char* fileName, const char* shapeFileName ) { - SetErrorCode(KO); + if (!fileName || !strlen(fileName)) { + SetErrorCode("Empty file name"); + return false; + } - if (shape.IsNull()) return false; + exportXAO( shape, groupList, fieldList, author, fileName, shapeFileName ); + return IsDone(); +} + +//============================================================================= +/*! + * Export a shape to XAO format string. + * \param shape The shape to export. + * \param groups The list of groups to export. + * \param fields The list of fields to export. + * \return The exported string. + */ +//============================================================================= +std::string XAOPlugin_IOperations::ExportXAOMem( Handle(GEOM_Object) shape, + std::list groupList, + std::list fieldList, + const char* author ) +{ + std::string anXML = exportXAO( shape, groupList, fieldList, author, NULL, NULL ); + return anXML; +} + +//============================================================================= +/*! + * Export a shape to XAO format file or string. + * \param shape The shape to export. + * \param groups The list of groups to export. + * \param fields The list of fields to export. + * \param fileName The name of the file to be exported. If empty, export to string. + * \param shapeFileName The name of the file for shape, if it should be exported separately. + * \return The exported string, if fileName is empty, or empty string. + */ +//============================================================================= +std::string XAOPlugin_IOperations::exportXAO( Handle(GEOM_Object) shape, + std::list groupList, + std::list fieldList, + const char* author, + const char* fileName, + const char* shapeFileName ) +{ + SetErrorCode(KO); + std::string anXML (""); + + if (shape.IsNull()) return anXML; // add a new shape function with parameters Handle(GEOM_Function) lastFunction = shape->GetLastFunction(); - if (lastFunction.IsNull()) return false; + if (lastFunction.IsNull()) return anXML; // add a new result object Handle(GEOM_Object) result = GetEngine()->AddObject(GEOM_IMPORT); // add an Export function Handle(GEOM_Function) exportFunction = result->AddFunction(XAOPlugin_Driver::GetID(), EXPORT_SHAPE); - if (exportFunction.IsNull()) return false; - if (exportFunction->GetDriverGUID() != XAOPlugin_Driver::GetID()) return false; + if (exportFunction.IsNull()) return anXML; + if (exportFunction->GetDriverGUID() != XAOPlugin_Driver::GetID()) return anXML; // create the XAO object XAO::Xao* xaoObject = new XAO::Xao(); @@ -369,16 +418,36 @@ bool XAOPlugin_IOperations::ExportXAO( Handle(GEOM_Object) shape, exportSubshapes(shape, geometry); xaoObject->setGeometry(geometry); - if (!exportGroups(groupList, xaoObject, geometry)) return false; + if (!exportGroups(groupList, xaoObject, geometry)) return anXML; exportFields(fieldList, xaoObject, geometry); - // export the XAO to the file - xaoObject->exportXAO(fileName, shapeFileName); + bool isFile = (fileName && strlen(fileName)); + if (isFile) { + // export the XAO to the file + xaoObject->exportXAO(fileName, shapeFileName); + } + else { + // export the XAO to the string + anXML = xaoObject->getXML(); + } // make a Python command - GEOM::TPythonDump pd(exportFunction); - std::string convFileName = Kernel_Utils::BackSlashToSlash(fileName); - pd << "exported = geompy.ExportXAO(" << shape; + GEOM::TPythonDump pd (exportFunction); + if (isFile) { + pd << "exported = geompy.ExportXAO("; + } + else { + if (!shape->GetName().IsEmpty()) { + std::string aGeometryNamePy (shape->GetName().ToCString()); + std::replace(aGeometryNamePy.begin(), aGeometryNamePy.end(), ' ', '_'); + pd << "aXAOBuff_" << aGeometryNamePy.c_str() << " = geompy.ExportXAOMem("; + } + else + pd << "aXAOBuff = geompy.ExportXAOMem("; + } + + // shape + pd << shape; // list of groups pd << ", ["; @@ -404,12 +473,24 @@ bool XAOPlugin_IOperations::ExportXAO( Handle(GEOM_Object) shape, } } pd << "], "; - pd << "\"" << author << "\", \"" << convFileName.c_str() << "\", \"" << shapeFileName << "\")"; + + // author + pd << "\"" << author << "\""; + + // files + if (isFile) { + std::string convFileName = Kernel_Utils::BackSlashToSlash(fileName); + std::string convShapeFileName; + if (shapeFileName && strlen(shapeFileName)) + convShapeFileName = Kernel_Utils::BackSlashToSlash(shapeFileName); + pd << ", \"" << convFileName.c_str() << "\", \"" << convShapeFileName.c_str() << "\""; + } + pd << ")"; SetErrorCode(OK); delete xaoObject; - return true; + return anXML; } void XAOPlugin_IOperations::importSubShapes( XAO::Geometry* xaoGeometry, @@ -440,7 +521,10 @@ void XAOPlugin_IOperations::importSubShapes( XAO::Geometry* xaoGeometry, return; subShape->SetName(name.c_str()); - subShape->SetType(shapeType); + + // commented out, as it prevents correct operation information filling + // type should be a GEOM_SUBSHAPE + //subShape->SetType(shapeType); GEOM_ISubShape aSSI(aFunction); aSSI.SetMainShape(function); @@ -456,13 +540,13 @@ void XAOPlugin_IOperations::importSubShapes( XAO::Geometry* xaoGeometry, //============================================================================= /*! - * Import a shape from XAO format - * \param fileName The name of the file to import - * \param shape The imported shape - * \param subShapes The list of imported groups - * \param groups The list of imported groups - * \param fields The list of imported fields - * \return boolean indicating if import was succeful. + * Import a shape from XAO format file. + * \param fileName The name of the file to import. + * \param shape The imported shape. + * \param subShapes The list of imported sub-shapes. + * \param groups The list of imported groups. + * \param fields The list of imported fields. + * \return boolean indicating if import was successful. */ //============================================================================= bool XAOPlugin_IOperations::ImportXAO( const char* fileName, @@ -470,17 +554,70 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, Handle(TColStd_HSequenceOfTransient)& subShapes, Handle(TColStd_HSequenceOfTransient)& groups, Handle(TColStd_HSequenceOfTransient)& fields ) +{ + if (fileName == NULL || !strlen(fileName)) { + SetErrorCode("Empty file name"); + } + + importXAO( fileName, "", shape, subShapes, groups, fields ); + return IsDone(); +} + +//============================================================================= +/*! + * Import a shape from XAO format string. + * \param theXML The input buffer. + * \param shape The imported shape. + * \param subShapes The list of imported sub-shapes. + * \param groups The list of imported groups. + * \param fields The list of imported fields. + * \return boolean indicating if import was successful. + */ +//============================================================================= +bool XAOPlugin_IOperations::ImportXAOMem( const std::string& theXML, + Handle(GEOM_Object)& shape, + Handle(TColStd_HSequenceOfTransient)& subShapes, + Handle(TColStd_HSequenceOfTransient)& groups, + Handle(TColStd_HSequenceOfTransient)& fields ) +{ + importXAO( NULL, theXML, shape, subShapes, groups, fields ); + return IsDone(); +} + +//============================================================================= +/*! + * Import a shape from XAO format file. + * \param fileName The name of the file to import. + * \param shape The imported shape. + * \param subShapes The list of imported sub-shapes. + * \param groups The list of imported groups. + * \param fields The list of imported fields. + * \return boolean indicating if import was successful. + */ +//============================================================================= +bool XAOPlugin_IOperations::importXAO( const char* fileName, + const std::string& theXML, + Handle(GEOM_Object)& shape, + Handle(TColStd_HSequenceOfTransient)& subShapes, + Handle(TColStd_HSequenceOfTransient)& groups, + Handle(TColStd_HSequenceOfTransient)& fields ) { SetErrorCode(KO); - if (fileName == NULL || groups.IsNull() || fields.IsNull()) + if (groups.IsNull() || fields.IsNull()) return false; + bool isFile = (fileName && strlen(fileName)); + // Read the XAO XAO::Xao* xaoObject = new XAO::Xao(); try { - xaoObject->importXAO(fileName); + if (isFile) + xaoObject->importXAO(fileName); + else { + xaoObject->setXML(theXML); + } } catch (XAO::XAO_Exception& exc) { @@ -503,7 +640,14 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, if (function.IsNull()) return false; if (function->GetDriverGUID() != XAOPlugin_Driver::GetID()) return false; - function->SetString( XAOPlugin_Driver::GetFileNameTag(), fileName ); + // Initialize python dimp here to prevent dumping of sub shapes, groups and fields + GEOM::TPythonDump pd(function); + + if (isFile) + function->SetString( XAOPlugin_Driver::GetFileNameTag(), fileName ); + else { + function->SetString( XAOPlugin_Driver::GetFileNameTag(), "NO, imported from byte array" ); + } // set the geometry if (xaoGeometry->getFormat() == XAO::BREP) @@ -658,7 +802,6 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, } // make a Python command - GEOM::TPythonDump pd(function); pd << "(imported, " << shape << ", "; // list of sub shapes @@ -695,9 +838,21 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, pd << obj << ((i < nbFields) ? ", " : ""); } } - std::string convFileName = Kernel_Utils::BackSlashToSlash( fileName ); - pd << "]"; - pd << ") = geompy.ImportXAO(\"" << convFileName.c_str() << "\")"; + pd << "]) = geompy."; + + if (isFile) { + std::string convFileName = Kernel_Utils::BackSlashToSlash( fileName ); + pd << "ImportXAO(\"" << convFileName.c_str() << "\")"; + } + else { + if (!shape->GetName().IsEmpty()) { + std::string aGeometryNamePy (shape->GetName().ToCString()); + std::replace(aGeometryNamePy.begin(), aGeometryNamePy.end(), ' ', '_'); + pd << "ImportXAOMem(aXAOBuff_" << aGeometryNamePy.c_str() << ")"; + } + else + pd << "ImportXAOMem(aXAOBuff)"; + } delete xaoObject; SetErrorCode(OK); diff --git a/src/XAOPlugin/XAOPlugin_IOperations.hxx b/src/XAOPlugin/XAOPlugin_IOperations.hxx index 1e8bdcb45..20f63b9e6 100644 --- a/src/XAOPlugin/XAOPlugin_IOperations.hxx +++ b/src/XAOPlugin/XAOPlugin_IOperations.hxx @@ -49,14 +49,37 @@ public: const char* author, const char* fileName, const char* shapeFileName ); - + + std::string ExportXAOMem( Handle(GEOM_Object) shape, + std::list groupList, + std::list fieldList, + const char* author ); + bool ImportXAO( const char* fileName, Handle(GEOM_Object)& shape, Handle(TColStd_HSequenceOfTransient)& subShapes, Handle(TColStd_HSequenceOfTransient)& groups, Handle(TColStd_HSequenceOfTransient)& fields ); + bool ImportXAOMem( const std::string& theXML, + Handle(GEOM_Object)& shape, + Handle(TColStd_HSequenceOfTransient)& subShapes, + Handle(TColStd_HSequenceOfTransient)& groups, + Handle(TColStd_HSequenceOfTransient)& fields ); + private: + std::string exportXAO( Handle(GEOM_Object) shape, + std::list groupList, + std::list fieldList, + const char* author, + const char* fileName, + const char* shapeFileName ); + bool importXAO( const char* fileName, + const std::string& theXML, + Handle(GEOM_Object)& shape, + Handle(TColStd_HSequenceOfTransient)& subShapes, + Handle(TColStd_HSequenceOfTransient)& groups, + Handle(TColStd_HSequenceOfTransient)& fields ); void importSubShapes( XAO::Geometry* xaoGeometry, Handle(GEOM_Function) function, int shapeType, diff --git a/src/XAOPlugin/XAOPlugin_IOperations_i.cc b/src/XAOPlugin/XAOPlugin_IOperations_i.cc index a80107d60..f9b489be6 100644 --- a/src/XAOPlugin/XAOPlugin_IOperations_i.cc +++ b/src/XAOPlugin/XAOPlugin_IOperations_i.cc @@ -49,14 +49,14 @@ XAOPlugin_IOperations_i::~XAOPlugin_IOperations_i() //============================================================================= /*! - * Export a shape to XAO format + * Export a shape to XAO format file * \param shape The shape to export * \param groups The list of groups to export * \param fields The list of fields to export * \param author The author of the export * \param fileName The name of the exported file - * \param shapeFileName If not empty, save to shape to this external file - * \return boolean indicating if export was succeful. + * \param shapeFileName If not empty, save the BREP shape to this external file + * \return boolean indicating if export was successful. */ //============================================================================= CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape, @@ -66,12 +66,63 @@ CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape, const char* fileName, const char* shapeFileName) { - bool isGood = false; + exportXAO( shape, groups, fields, author, true, fileName, shapeFileName ); + return IsDone(); +} + +//============================================================================= +/*! + * Export a shape to XAO format buffer + * \param shape The shape to export + * \param groups The list of groups to export + * \param fields The list of fields to export + * \param author The author of the export + * \return The output buffer + */ +//============================================================================= +SALOMEDS::TMPFile* XAOPlugin_IOperations_i::ExportXAOMem( GEOM::GEOM_Object_ptr shape, + const GEOM::ListOfGO& groups, + const GEOM::ListOfFields& fields, + const char* author ) +{ + std::string anXMLBuf = exportXAO( shape, groups, fields, author, false, "", "" ); + + int size = anXMLBuf.size(); + CORBA::Octet* OctetBuf = SALOMEDS::TMPFile::allocbuf(size); + memcpy(OctetBuf, anXMLBuf.c_str(), size); + SALOMEDS::TMPFile_var SeqFile = new SALOMEDS::TMPFile (size,size,OctetBuf,1); + return SeqFile._retn(); +} + +//============================================================================= +/*! + * Export a shape to XAO format + * \param shape The shape to export + * \param groups The list of groups to export + * \param fields The list of fields to export + * \param author The author of the export + * \param toFile Export to file if true, otherwise export to memory buffer (the returned string) + * \param fileName The name of the exported file + * \param shapeFileName If not empty, save the BREP shape to this external file + * \return string The exported buffer if toFile=false, otherwise an empty string + */ +//============================================================================= +std::string XAOPlugin_IOperations_i::exportXAO( GEOM::GEOM_Object_ptr shape, + const GEOM::ListOfGO& groups, + const GEOM::ListOfFields& fields, + const char* author, + const bool toFile, + const char* fileName, + const char* shapeFileName) +{ + std::string anXMLBuff; // Set a not done flag GetOperations()->SetNotDone(); // Get the reference shape Handle(GEOM_Object) reference = GetObjectImpl( shape ); + if( reference.IsNull() ) + return anXMLBuff; // Get the reference groups CORBA::ULong ind = 0; @@ -79,7 +130,7 @@ CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape, for (; ind < groups.length(); ind++) { Handle(GEOM_Object) gobj = GetObjectImpl( groups[ind] ); - if (gobj.IsNull()) return false; + if (gobj.IsNull()) return anXMLBuff; groupsObj.push_back(gobj); } @@ -89,17 +140,21 @@ CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape, for( ; ind < fields.length(); ind++ ) { Handle(GEOM_Field) fobj = Handle(GEOM_Field)::DownCast( GetBaseObjectImpl( fields[ind] ) ); - if( fobj.IsNull() ) return false; + if( fobj.IsNull() ) return anXMLBuff; fieldsObj.push_back(fobj); } - if( !reference.IsNull() ) + if ( toFile ) { // Export XAO - isGood = GetOperations()->ExportXAO( reference, groupsObj, fieldsObj, author, fileName, shapeFileName ); + GetOperations()->ExportXAO( reference, groupsObj, fieldsObj, author, fileName, shapeFileName ); + } + else + { + anXMLBuff = GetOperations()->ExportXAOMem( reference, groupsObj, fieldsObj, author ); } - return isGood; + return anXMLBuff; } //============================================================================= @@ -110,7 +165,7 @@ CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape, * \param subShapes The list of imported subShapes * \param groups The list of imported groups * \param fields The list of imported fields - * \return boolean indicating if import was succeful. + * \return boolean indicating if import was successful. */ //============================================================================= CORBA::Boolean XAOPlugin_IOperations_i::ImportXAO( const char* fileName, @@ -118,6 +173,53 @@ CORBA::Boolean XAOPlugin_IOperations_i::ImportXAO( const char* fileName, GEOM::ListOfGO_out subShapes, GEOM::ListOfGO_out groups, GEOM::ListOfFields_out fields) +{ + SALOMEDS::TMPFile_var aBuff; + importXAO( true, fileName, aBuff, shape, subShapes, groups, fields); + return IsDone(); +} + +//============================================================================= +/*! + * Import a shape from XAO format memory buffer + * \param fileName The name of the file to import + * \param shape The imported shape + * \param subShapes The list of imported subShapes + * \param groups The list of imported groups + * \param fields The list of imported fields + * \return boolean indicating if import was successful. + */ +//============================================================================= +CORBA::Boolean XAOPlugin_IOperations_i::ImportXAOMem( const SALOMEDS::TMPFile& theBuff, + GEOM::GEOM_Object_out shape, + GEOM::ListOfGO_out subShapes, + GEOM::ListOfGO_out groups, + GEOM::ListOfFields_out fields) +{ + importXAO( false, NULL, theBuff, shape, subShapes, groups, fields); + return IsDone(); +} + +//============================================================================= +/*! + * Import a shape from XAO format + * \param isFile Boolean flag to switch between import from file or from buffer + * \param fileName The name of the file to import from if isFile=true + * \param theBuff The buffer to import from if isFile=false + * \param shape The imported shape + * \param subShapes The list of imported subShapes + * \param groups The list of imported groups + * \param fields The list of imported fields + * \return boolean indicating if import was successful. + */ +//============================================================================= +CORBA::Boolean XAOPlugin_IOperations_i::importXAO( const bool isFile, + const char* fileName, + const SALOMEDS::TMPFile& theBuff, + GEOM::GEOM_Object_out shape, + GEOM::ListOfGO_out subShapes, + GEOM::ListOfGO_out groups, + GEOM::ListOfFields_out fields) { GEOM::GEOM_Object_var vshape; shape = vshape._retn(); @@ -133,9 +235,21 @@ CORBA::Boolean XAOPlugin_IOperations_i::ImportXAO( const char* fileName, Handle(TColStd_HSequenceOfTransient) importedGroups = new TColStd_HSequenceOfTransient(); Handle(TColStd_HSequenceOfTransient) importedFields = new TColStd_HSequenceOfTransient(); Handle(GEOM_Object) hshape; - bool res = GetOperations()->ImportXAO( fileName, hshape, importedSubShapes, importedGroups, importedFields ); - if( !GetOperations()->IsDone() || !res ) + if (isFile) { + GetOperations()->ImportXAO( fileName, hshape, importedSubShapes, importedGroups, importedFields ); + } + else { + if (theBuff.length() < 1) + return false; + + char* buf = (char*)theBuff.NP_data(); + //std::string anXMLBuff (buf); // works wrongly + std::string anXMLBuff (buf, theBuff.length()); + GetOperations()->ImportXAOMem( anXMLBuff, hshape, importedSubShapes, importedGroups, importedFields ); + } + + if( !GetOperations()->IsDone() ) return false; // parse fields @@ -165,7 +279,7 @@ CORBA::Boolean XAOPlugin_IOperations_i::ImportXAO( const char* fileName, shape = GetObject( hshape ); - return res; + return IsDone(); } XAOPlugin_IOperations* XAOPlugin_IOperations_i::GetOperations() diff --git a/src/XAOPlugin/XAOPlugin_IOperations_i.hh b/src/XAOPlugin/XAOPlugin_IOperations_i.hh index eb5bd721f..a34b00913 100644 --- a/src/XAOPlugin/XAOPlugin_IOperations_i.hh +++ b/src/XAOPlugin/XAOPlugin_IOperations_i.hh @@ -50,13 +50,41 @@ public: const char* fileName, const char* shapeFileName ); + SALOMEDS::TMPFile* ExportXAOMem( GEOM::GEOM_Object_ptr shape, + const GEOM::ListOfGO& groups, + const GEOM::ListOfFields& fields, + const char* author ); + CORBA::Boolean ImportXAO( const char* fileName, GEOM::GEOM_Object_out shape, GEOM::ListOfGO_out subShapes, GEOM::ListOfGO_out groups, GEOM::ListOfFields_out fields ); + CORBA::Boolean ImportXAOMem( const SALOMEDS::TMPFile& theBuff, + GEOM::GEOM_Object_out shape, + GEOM::ListOfGO_out subShapes, + GEOM::ListOfGO_out groups, + GEOM::ListOfFields_out fields ); + XAOPlugin_IOperations* GetOperations(); + +private: + std::string exportXAO( GEOM::GEOM_Object_ptr shape, + const GEOM::ListOfGO& groups, + const GEOM::ListOfFields& fields, + const char* author, + const bool toFile, + const char* fileName, + const char* shapeFileName ); + + CORBA::Boolean importXAO( const bool isFile, + const char* fileName, + const SALOMEDS::TMPFile& theBuff, + GEOM::GEOM_Object_out shape, + GEOM::ListOfGO_out subShapes, + GEOM::ListOfGO_out groups, + GEOM::ListOfFields_out fields ); }; #endif