-// Copyright (C) 2014-2019 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2014-2023 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include "XAOPlugin_IImportExport.hxx"
// KERNEL includes
+#include <Basics_DirUtils.hxx>
#include <utilities.h>
#include <Utils_SALOME_Exception.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <TDataStd_Integer.hxx>
+#include <TopExp.hxx>
XAO::Dimension shapeEnumToDimension(const TopAbs_ShapeEnum& shape)
{
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:
group->add(index);
}
break;
+ default:
+ ;
}
}
return true;
void XAOPlugin_IOperations::exportFields( std::list<Handle(GEOM_Field)> fieldList,
XAO::Xao* xaoObject,
- XAO::BrepGeometry* geometry )
+ XAO::BrepGeometry* /*geometry*/ )
{
std::list<Handle(GEOM_Field)>::iterator fieldIterator = fieldList.begin();
while (fieldIterator != fieldList.end())
{
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++)
{
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());
case TopAbs_SOLID:
geometry->changeSolidName(subIndex, subObject->GetName().ToCString());
break;
+ default:
+ ;
}
}
}
// make a Python command
GEOM::TPythonDump pd(exportFunction);
+ std::string convFileName = Kernel_Utils::BackSlashToSlash(fileName);
pd << "exported = geompy.ExportXAO(" << shape;
// list of groups
}
}
pd << "], ";
- pd << "\"" << author << "\", \"" << fileName << "\", \"" << shapeFileName << "\")";
+ pd << "\"" << author << "\", \"" << convFileName.c_str() << "\", \"" << shapeFileName << "\")";
SetErrorCode(OK);
delete xaoObject;
// 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<int>::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<int>::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
pd << obj << ((i < nbFields) ? ", " : "");
}
}
+ std::string convFileName = Kernel_Utils::BackSlashToSlash( fileName );
pd << "]";
- pd << ") = geompy.ImportXAO(\"" << fileName << "\")";
+ pd << ") = geompy.ImportXAO(\"" << convFileName.c_str() << "\")";
delete xaoObject;
SetErrorCode(OK);