X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXAOPlugin%2FXAOPlugin_IOperations.cxx;h=ec9b8e487ef70c6c9458bd3674683bed9e288b25;hb=3bfb88115e12b64d01e3e5606e4b84184deaceb2;hp=a6f094194cd7edbc01b88b41698a0043ce0f5a44;hpb=29dfaa447450872cc5f5fbb57419e83aa9fd2cff;p=modules%2Fgeom.git diff --git a/src/XAOPlugin/XAOPlugin_IOperations.cxx b/src/XAOPlugin/XAOPlugin_IOperations.cxx index a6f094194..ec9b8e487 100644 --- a/src/XAOPlugin/XAOPlugin_IOperations.cxx +++ b/src/XAOPlugin/XAOPlugin_IOperations.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2014-2024 CEA, EDF, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -23,16 +23,19 @@ #include "XAOPlugin_IImportExport.hxx" // KERNEL includes +#include #include #include // GEOM includes -#include "GEOM_PythonDump.hxx" -#include "GEOMImpl_Types.hxx" -#include "GEOMImpl_IGroupOperations.hxx" -#include "GEOMImpl_IShapesOperations.hxx" -#include "GEOMImpl_IFieldOperations.hxx" -#include "GEOM_ISubShape.hxx" +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -53,6 +56,9 @@ #include #include +#include + +#include XAO::Dimension shapeEnumToDimension(const TopAbs_ShapeEnum& shape) { @@ -97,8 +103,8 @@ TopAbs_ShapeEnum getGroupDimension(XAO::Group* group) * Constructor */ //============================================================================= -XAOPlugin_IOperations::XAOPlugin_IOperations( GEOM_Engine* theEngine, int theDocID ) -: GEOMImpl_IBaseIEOperations( theEngine, theDocID ) +XAOPlugin_IOperations::XAOPlugin_IOperations( GEOM_Engine* theEngine ) +: GEOMImpl_IBaseIEOperations( theEngine ) { MESSAGE( "XAOPlugin_IOperations::XAOPlugin_IOperations" ); } @@ -132,6 +138,9 @@ bool XAOPlugin_IOperations::exportGroups( std::list groupLi XAO::Dimension dim = shapeEnumToDimension(shapeGroup); XAO::Group* group = xaoObject->addGroup(dim, currGroup->GetName().ToCString()); + // Group can be empty + if (groupIds.IsNull()) continue; + switch (shapeGroup) { case TopAbs_VERTEX: @@ -166,6 +175,8 @@ bool XAOPlugin_IOperations::exportGroups( std::list groupLi group->add(index); } break; + default: + ; } } return true; @@ -173,7 +184,7 @@ bool XAOPlugin_IOperations::exportGroups( std::list groupLi void XAOPlugin_IOperations::exportFields( std::list fieldList, XAO::Xao* xaoObject, - XAO::BrepGeometry* geometry ) + XAO::BrepGeometry* /*geometry*/ ) { std::list::iterator fieldIterator = fieldList.begin(); while (fieldIterator != fieldList.end()) @@ -265,6 +276,13 @@ void XAOPlugin_IOperations::exportSubshapes( const Handle(GEOM_Object)& shape, X { Handle(TColStd_HSequenceOfTransient) subObjects = myShapesOperations->GetExistingSubObjects( shape, GEOMImpl_IShapesOperations::SubShapes ); int nbSubObjects = subObjects->Length(); + if (!nbSubObjects) return; + + TopoDS_Shape aMainShape = shape->GetValue(); + if (aMainShape.IsNull()) return; + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aMainShape, anIndices); + // set the names of the sub shapes for (int i = 1; i <= nbSubObjects; i++) { @@ -275,8 +293,16 @@ void XAOPlugin_IOperations::exportSubshapes( const Handle(GEOM_Object)& shape, X Handle(GEOM_Object) subObject = Handle(GEOM_Object)::DownCast( transientSubObject ); if (subObject->GetType() != GEOM_GROUP) { - int subIndex = myShapesOperations->GetSubShapeIndex( shape, subObject ); - switch (subObject->GetValue().ShapeType()) + TopoDS_Shape aSubShape = subObject->GetValue(); + if (aSubShape.IsNull()) continue; + + // Do not call GEOMImpl_IShapesOperations::GetSubShapeIndex() here + // for time optimization reason (it invokes TopExp::MapShapes()) + //int subIndex = myShapesOperations->GetSubShapeIndex( shape, subObject ); + int subIndex = anIndices.FindIndex(aSubShape); + if (!subIndex) continue; + + switch (aSubShape.ShapeType()) { case TopAbs_VERTEX: geometry->changeVertexName(subIndex, subObject->GetName().ToCString()); @@ -290,6 +316,8 @@ void XAOPlugin_IOperations::exportSubshapes( const Handle(GEOM_Object)& shape, X case TopAbs_SOLID: geometry->changeSolidName(subIndex, subObject->GetName().ToCString()); break; + default: + ; } } } @@ -297,35 +325,83 @@ 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, std::list groupList, std::list fieldList, const char* author, - const char* fileName ) + const char* fileName, + const char* shapeFileName ) +{ + if (!fileName || !strlen(fileName)) { + SetErrorCode("Empty file name"); + 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 false; + 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(GetDocID(), GEOM_IMPORT); + 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(); @@ -342,15 +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); + 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); - 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 << ", ["; @@ -376,12 +473,24 @@ bool XAOPlugin_IOperations::ExportXAO( Handle(GEOM_Object) shape, } } pd << "], "; - pd << "\"" << author << "\", \"" << fileName << "\")"; + + // 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, @@ -406,13 +515,16 @@ void XAOPlugin_IOperations::importSubShapes( XAO::Geometry* xaoGeometry, anArray = new TColStd_HArray1OfInteger(1, 1); anArray->SetValue(1, iref); - subShape = GetEngine()->AddObject(GetDocID(), GEOM_SUBSHAPE); + subShape = GetEngine()->AddObject(GEOM_SUBSHAPE); Handle(GEOM_Function) aFunction = subShape->AddFunction(GEOM_Object::GetSubShapeID(), 1); if (aFunction.IsNull()) 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); @@ -428,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, @@ -442,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) { @@ -470,12 +635,19 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, } // create the shape - shape = GetEngine()->AddObject(GetDocID(), GEOM_IMPORT); + shape = GetEngine()->AddObject(GEOM_IMPORT); Handle(GEOM_Function) function = shape->AddFunction(XAOPlugin_Driver::GetID(), IMPORT_SHAPE); 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) @@ -506,13 +678,19 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, // build an array with the indexes of the sub shapes int nbElt = xaoGroup->count(); - Handle(TColStd_HArray1OfInteger) array = new TColStd_HArray1OfInteger(1, nbElt); - int j = 0; - for (std::set::iterator it = xaoGroup->begin(); it != xaoGroup->end(); ++it) - { - int index = (*it); - std::string ref = xaoGeometry->getElementReference(xaoGroup->getDimension(), index); - array->SetValue(++j, XAO::XaoUtils::stringToInt(ref)); + Handle(TColStd_HArray1OfInteger) array; + if (nbElt > 0) { + array = new TColStd_HArray1OfInteger(1, nbElt); + int j = 0; + for (std::set::iterator it = xaoGroup->begin(); it != xaoGroup->end(); ++it) { + int index = (*it); + std::string ref = xaoGeometry->getElementReference(xaoGroup->getDimension(), index); + array->SetValue(++j, XAO::XaoUtils::stringToInt(ref)); + } + } + else { // empty group + array = new TColStd_HArray1OfInteger(1, 1); + array->SetValue(1, -1); } // create the group with the array of sub shapes indexes @@ -524,8 +702,6 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, TDF_Label freeLabel = group->GetFreeLabel(); TDataStd_Integer::Set(freeLabel, (Standard_Integer) getGroupDimension(xaoGroup)); groups->Append(group); - - function = group->GetLastFunction(); } // create the fields @@ -626,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 @@ -663,8 +838,21 @@ bool XAOPlugin_IOperations::ImportXAO( const char* fileName, pd << obj << ((i < nbFields) ? ", " : ""); } } - pd << "]"; - pd << ") = geompy.ImportXAO(\"" << fileName << "\")"; + 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);