From a89558c81a23675f6d05b63fa5a03002a60c5c64 Mon Sep 17 00:00:00 2001 From: Nicolas RECHATIN Date: Fri, 6 Jan 2023 14:17:40 +0100 Subject: [PATCH] feat : Cylinder + Refacto and Clean --- .../ExchangePlugin_ExportFeature.cpp | 1245 +++++++++-------- .../ExchangePlugin_ExportRoot.cpp | 141 +- .../ExchangePlugin_ExportRoot.h | 3 +- src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.cpp | 169 ++- src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.h | 44 +- 5 files changed, 876 insertions(+), 726 deletions(-) diff --git a/src/ExchangePlugin/ExchangePlugin_ExportFeature.cpp b/src/ExchangePlugin/ExchangePlugin_ExportFeature.cpp index fea4b3219..95ac37d45 100644 --- a/src/ExchangePlugin/ExchangePlugin_ExportFeature.cpp +++ b/src/ExchangePlugin/ExchangePlugin_ExportFeature.cpp @@ -76,9 +76,9 @@ #include #ifdef WIN32 -# define _separator_ '\\' +#define _separator_ '\\' #else -# define _separator_ '/' +#define _separator_ '/' #endif ExchangePlugin_ExportFeature::ExchangePlugin_ExportFeature() @@ -87,7 +87,7 @@ ExchangePlugin_ExportFeature::ExchangePlugin_ExportFeature() ExchangePlugin_ExportFeature::~ExchangePlugin_ExportFeature() { - // TODO Auto-generated destructor stub + // TODO Auto-generated destructor stub } /* @@ -95,91 +95,92 @@ ExchangePlugin_ExportFeature::~ExchangePlugin_ExportFeature() */ void ExchangePlugin_ExportFeature::initAttributes() { - data()->addAttribute(ExchangePlugin_ExportFeature::EXPORT_TYPE_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::FILE_PATH_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::FILE_FORMAT_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::SELECTION_LIST_ID(), - ModelAPI_AttributeSelectionList::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID(), - ModelAPI_AttributeSelectionList::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::STL_OBJECT_SELECTED(), - ModelAPI_AttributeSelection::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::STL_RELATIVE(), - ModelAPI_AttributeDouble::typeId()); - - double defelection = Config_PropManager::real("Visualization", "body_deflection"); - real(ExchangePlugin_ExportFeature::STL_RELATIVE())->setValue(defelection); - - data()->addAttribute(ExchangePlugin_ExportFeature::STL_ABSOLUTE(), - ModelAPI_AttributeDouble::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_TYPE(), - ModelAPI_AttributeString::typeId()); - - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), - ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), - ExchangePlugin_ExportFeature::STL_FILE_PATH_ID()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), - ExchangePlugin_ExportFeature::XAO_AUTHOR_ID()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), - ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), - ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID()); - - data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_NAME_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_TITLE_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::EXP_NAME_FILE_ID(), - ModelAPI_AttributeString::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::MAIN_OBJECT_ID(), - ModelAPI_AttributeSelection::typeId()); - data()->addAttribute(ExchangePlugin_ExportFeature::MAT_FILE_ID(), - ModelAPI_AttributeString::typeId()); - - // to support previous version of document, move the selection list - // if the type of export operation is XAO - AttributeStringPtr aTypeAttr = string(EXPORT_TYPE_ID()); - if (aTypeAttr->isInitialized() && aTypeAttr->value() == "XAO") { - bool aWasBlocked = data()->blockSendAttributeUpdated(true, false); - AttributeSelectionListPtr aSelList = selectionList(SELECTION_LIST_ID()); - AttributeSelectionListPtr aXAOSelList = selectionList(XAO_SELECTION_LIST_ID()); - if (aSelList->size() > 0 && aXAOSelList->size() == 0) - aSelList->copyTo(aXAOSelList); - aSelList->clear(); - data()->blockSendAttributeUpdated(aWasBlocked, false); - } + data()->addAttribute(ExchangePlugin_ExportFeature::EXPORT_TYPE_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::FILE_PATH_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::FILE_FORMAT_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::SELECTION_LIST_ID(), + ModelAPI_AttributeSelectionList::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID(), + ModelAPI_AttributeSelectionList::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::STL_OBJECT_SELECTED(), + ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::STL_RELATIVE(), + ModelAPI_AttributeDouble::typeId()); + + double defelection = Config_PropManager::real("Visualization", "body_deflection"); + real(ExchangePlugin_ExportFeature::STL_RELATIVE())->setValue(defelection); + + data()->addAttribute(ExchangePlugin_ExportFeature::STL_ABSOLUTE(), + ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_TYPE(), + ModelAPI_AttributeString::typeId()); + + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), + ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), + ExchangePlugin_ExportFeature::STL_FILE_PATH_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), + ExchangePlugin_ExportFeature::XAO_AUTHOR_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), + ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), + ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID()); + + data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_NAME_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_TITLE_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::EXP_NAME_FILE_ID(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::MAIN_OBJECT_ID(), + ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(ExchangePlugin_ExportFeature::MAT_FILE_ID(), + ModelAPI_AttributeString::typeId()); + + // to support previous version of document, move the selection list + // if the type of export operation is XAO + AttributeStringPtr aTypeAttr = string(EXPORT_TYPE_ID()); + if (aTypeAttr->isInitialized() && aTypeAttr->value() == "XAO") + { + bool aWasBlocked = data()->blockSendAttributeUpdated(true, false); + AttributeSelectionListPtr aSelList = selectionList(SELECTION_LIST_ID()); + AttributeSelectionListPtr aXAOSelList = selectionList(XAO_SELECTION_LIST_ID()); + if (aSelList->size() > 0 && aXAOSelList->size() == 0) + aSelList->copyTo(aXAOSelList); + aSelList->clear(); + data()->blockSendAttributeUpdated(aWasBlocked, false); + } } -void ExchangePlugin_ExportFeature::attributeChanged(const std::string& theID) +void ExchangePlugin_ExportFeature::attributeChanged(const std::string &theID) { - if (theID == XAO_FILE_PATH_ID()) { - string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue( - string(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID())->value()); - } - else if (theID == STL_FILE_PATH_ID()) { - string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue( - string(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID())->value()); - } - else if (theID == ROOT_FILE_PATH_ID()) { - string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue( - string(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID())->value()); - } + if (theID == XAO_FILE_PATH_ID()) + { + string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID())->value()); + } + else if (theID == STL_FILE_PATH_ID()) + { + string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID())->value()); + } + else if (theID == ROOT_FILE_PATH_ID()) + { + string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID())->value()); + } } /* @@ -187,551 +188,631 @@ void ExchangePlugin_ExportFeature::attributeChanged(const std::string& theID) */ void ExchangePlugin_ExportFeature::execute() { - AttributeStringPtr aFormatAttr = - this->string(ExchangePlugin_ExportFeature::FILE_FORMAT_ID()); - std::string aFormat = aFormatAttr->value(); + AttributeStringPtr aFormatAttr = + this->string(ExchangePlugin_ExportFeature::FILE_FORMAT_ID()); + std::string aFormat = aFormatAttr->value(); - AttributeStringPtr aFilePathAttr = - this->string(ExchangePlugin_ExportFeature::FILE_PATH_ID()); + AttributeStringPtr aFilePathAttr = + this->string(ExchangePlugin_ExportFeature::FILE_PATH_ID()); - std::string aFilePath = aFilePathAttr->value(); - if (aFilePath.empty()) - return; + std::string aFilePath = aFilePathAttr->value(); + if (aFilePath.empty()) + return; - exportFile(aFilePath, aFormat); + exportFile(aFilePath, aFormat); } -void ExchangePlugin_ExportFeature::exportFile(const std::string& theFileName, - const std::string& theFormat) +void ExchangePlugin_ExportFeature::exportFile(const std::string &theFileName, + const std::string &theFormat) { - std::string aFormatName = theFormat; - - if (aFormatName.empty()) { // get default format for the extension - // ".brep" -> "BREP" - std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName); - if (anExtension == "BREP" || anExtension == "BRP") { - aFormatName = "BREP"; - } else if (anExtension == "STEP" || anExtension == "STP") { - aFormatName = "STEP"; - } else if (anExtension == "IGES" || anExtension == "IGS") { - aFormatName = "IGES-5.1"; - } else if (anExtension == "C") { - aFormatName = "ROOT"; - } else { - aFormatName = anExtension; + std::string aFormatName = theFormat; + + if (aFormatName.empty()) + { // get default format for the extension + // ".brep" -> "BREP" + std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName); + if (anExtension == "BREP" || anExtension == "BRP") + { + aFormatName = "BREP"; + } + else if (anExtension == "STEP" || anExtension == "STP") + { + aFormatName = "STEP"; + } + else if (anExtension == "IGES" || anExtension == "IGS") + { + aFormatName = "IGES-5.1"; + } + else if (anExtension == "C") + { + aFormatName = "ROOT"; + } + else + { + aFormatName = anExtension; + } + } + + if (aFormatName == "XAO") + { + exportXAO(theFileName); + return; } - } - - if (aFormatName == "XAO") { - exportXAO(theFileName); - return; - } else if (aFormatName == "STL") { - exportSTL(theFileName); - return; - } else if (aFormatName == "ROOT") { - exportROOT(theFileName); - return; - } - - // make shape for export from selected shapes - AttributeSelectionListPtr aSelectionListAttr = - this->selectionList(ExchangePlugin_ExportFeature::SELECTION_LIST_ID()); - std::list aShapes; - std::list aContexts; - for (int i = 0, aSize = aSelectionListAttr->size(); i < aSize; ++i) { - AttributeSelectionPtr anAttrSelection = aSelectionListAttr->value(i); - - /// do not export pictures - ResultPtr aBodyContext = - std::dynamic_pointer_cast(anAttrSelection->context()); - if (aBodyContext.get() && aBodyContext->hasTexture()) - continue; - - std::shared_ptr aCurShape = anAttrSelection->value(); - if (aCurShape.get() == NULL) - aCurShape = anAttrSelection->context()->shape(); - if (aCurShape.get() != NULL) + else if (aFormatName == "STL") { - aShapes.push_back(aCurShape); - aContexts.push_back(anAttrSelection->context()); + exportSTL(theFileName); + return; + } + else if (aFormatName == "ROOT") + { + exportROOT(theFileName); + return; + } + + // make shape for export from selected shapes + AttributeSelectionListPtr aSelectionListAttr = + this->selectionList(ExchangePlugin_ExportFeature::SELECTION_LIST_ID()); + std::list aShapes; + std::list aContexts; + for (int i = 0, aSize = aSelectionListAttr->size(); i < aSize; ++i) + { + AttributeSelectionPtr anAttrSelection = aSelectionListAttr->value(i); + + /// do not export pictures + ResultPtr aBodyContext = + std::dynamic_pointer_cast(anAttrSelection->context()); + if (aBodyContext.get() && aBodyContext->hasTexture()) + continue; + + std::shared_ptr aCurShape = anAttrSelection->value(); + if (aCurShape.get() == NULL) + aCurShape = anAttrSelection->context()->shape(); + if (aCurShape.get() != NULL) + { + aShapes.push_back(aCurShape); + aContexts.push_back(anAttrSelection->context()); + } + } + + // Store compound if we have more than one shape. + std::shared_ptr aShape = + aShapes.size() == 1 ? aShapes.front() : GeomAlgoAPI_CompoundBuilder::compound(aShapes); + + // Perform the export + std::string anError; + bool aResult = false; + if (aFormatName == "BREP") + { + aResult = BREPExport(theFileName, aFormatName, aShape, anError); + } + else if (aFormatName == "STEP") + { + aResult = STEPExport(theFileName, aShapes, aContexts, anError); + } + else if (aFormatName.substr(0, 4) == "IGES") + { + aResult = IGESExport(theFileName, aFormatName, aShape, anError); + } + else + { + anError = "Unsupported format: " + aFormatName; + } + + if (!aResult || !anError.empty()) + { + setError("An error occurred while exporting " + theFileName + ": " + anError); + return; } - } - - // Store compound if we have more than one shape. - std::shared_ptr aShape = - aShapes.size() == 1 ? aShapes.front() : GeomAlgoAPI_CompoundBuilder::compound(aShapes); - - // Perform the export - std::string anError; - bool aResult = false; - if (aFormatName == "BREP") { - aResult = BREPExport(theFileName, aFormatName, aShape, anError); - } else if (aFormatName == "STEP") { - aResult = STEPExport(theFileName, aShapes, aContexts, anError); - } else if (aFormatName.substr(0, 4) == "IGES") { - aResult = IGESExport(theFileName, aFormatName, aShape, anError); - } else { - anError = "Unsupported format: " + aFormatName; - } - - if (!aResult || !anError.empty()) { - setError("An error occurred while exporting " + theFileName + ": " + anError); - return; - } } /// Returns XAO string by the value from the table -static std::string valToString(const ModelAPI_AttributeTables::Value& theVal, - const ModelAPI_AttributeTables::ValueType& theType) { - std::ostringstream aStr; // the resulting string value - switch(theType) { - case ModelAPI_AttributeTables::BOOLEAN: - aStr<<(theVal.myBool ? "true" : "false"); - break; - case ModelAPI_AttributeTables::INTEGER: - aStr<value(); - if (!aShape.get()) { - aShape = aSelection->context()->shape(); - } - - // Get relative value and percent flag. - double aValue; - bool anIsRelative = false; - bool anIsASCII = false; - - if (string(STL_DEFLECTION_TYPE())->value() == STL_DEFLECTION_TYPE_RELATIVE()) { - aValue = real(STL_RELATIVE())->value(); - anIsRelative = true; - } else { - aValue = real(STL_ABSOLUTE())->value(); - } - - if (string(STL_FILE_TYPE())->value() == STL_FILE_TYPE_ASCII()) { - anIsASCII = true; - } - // Perform the export - std::string anError; - bool aResult = false; - - aResult = STLExport(theFileName, - aShape, - aValue, - anIsRelative, - anIsASCII, - anError); - - if (!aResult || !anError.empty()) { - setError("An error occurred while exporting " + theFileName + ": " + anError); - return; - } -} + // Get shape. + AttributeSelectionPtr aSelection = selection(STL_OBJECT_SELECTED()); + GeomShapePtr aShape = aSelection->value(); + if (!aShape.get()) + { + aShape = aSelection->context()->shape(); + } + // Get relative value and percent flag. + double aValue; + bool anIsRelative = false; + bool anIsASCII = false; -void ExchangePlugin_ExportFeature::exportXAO(const std::string& theFileName) + if (string(STL_DEFLECTION_TYPE())->value() == STL_DEFLECTION_TYPE_RELATIVE()) + { + aValue = real(STL_RELATIVE())->value(); + anIsRelative = true; + } + else + { + aValue = real(STL_ABSOLUTE())->value(); + } + + if (string(STL_FILE_TYPE())->value() == STL_FILE_TYPE_ASCII()) + { + anIsASCII = true; + } + // Perform the export + std::string anError; + bool aResult = false; + + aResult = STLExport(theFileName, + aShape, + aValue, + anIsRelative, + anIsASCII, + anError); + + if (!aResult || !anError.empty()) + { + setError("An error occurred while exporting " + theFileName + ": " + anError); + return; + } +} + +void ExchangePlugin_ExportFeature::exportXAO(const std::string &theFileName) { - try { - - std::string anError; - XAO::Xao aXao; - - // author - - std::string anAuthor = string(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID())->value(); - aXao.setAuthor(anAuthor); - - // make shape for export from all results - std::list aShapes; - std::list aResults; - std::list aDocuments; /// documents of Parts selected and used in export - std::map aDocTrsf; /// translation of the part - - bool anExCludedIsImage = false; - AttributeSelectionListPtr aSelection = selectionList(XAO_SELECTION_LIST_ID()); - bool aIsSelection = aSelection->isInitialized() && aSelection->size() > 0; - if (aIsSelection) { // a mode for export to geom result by result - for (int a = 0; a < aSelection->size(); a++) { - AttributeSelectionPtr anAttr = aSelection->value(a); - ResultPtr aBodyContext = - std::dynamic_pointer_cast(anAttr->context()); - if (aBodyContext.get() && !aBodyContext->isDisabled() && aBodyContext->shape().get()) { - /// do not export pictures - if (aBodyContext->hasTexture()){ - anExCludedIsImage = true; - continue; - } - aResults.push_back(aBodyContext); - GeomShapePtr aShape = anAttr->value(); - if (!aShape.get()) - aShape = aBodyContext->shape(); - aShapes.push_back(aShape); - if (aBodyContext->groupName() == ModelAPI_ResultPart::group()) { - ResultPartPtr aResPart = std::dynamic_pointer_cast(aBodyContext); - DocumentPtr aPartDoc = aResPart->partDoc(); - if (!aPartDoc.get() || !aPartDoc->isOpened()) { // document is not accessible - std::string msg = "Can not export XAO for not loaded part"; - Events_InfoMessage("ExportFeature", msg, this).send(); + try + { + + std::string anError; + XAO::Xao aXao; + + // author + + std::string anAuthor = string(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID())->value(); + aXao.setAuthor(anAuthor); + + // make shape for export from all results + std::list aShapes; + std::list aResults; + std::list aDocuments; /// documents of Parts selected and used in export + std::map aDocTrsf; /// translation of the part + + bool anExCludedIsImage = false; + AttributeSelectionListPtr aSelection = selectionList(XAO_SELECTION_LIST_ID()); + bool aIsSelection = aSelection->isInitialized() && aSelection->size() > 0; + if (aIsSelection) + { // a mode for export to geom result by result + for (int a = 0; a < aSelection->size(); a++) + { + AttributeSelectionPtr anAttr = aSelection->value(a); + ResultPtr aBodyContext = + std::dynamic_pointer_cast(anAttr->context()); + if (aBodyContext.get() && !aBodyContext->isDisabled() && aBodyContext->shape().get()) + { + /// do not export pictures + if (aBodyContext->hasTexture()) + { + anExCludedIsImage = true; + continue; + } + aResults.push_back(aBodyContext); + GeomShapePtr aShape = anAttr->value(); + if (!aShape.get()) + aShape = aBodyContext->shape(); + aShapes.push_back(aShape); + if (aBodyContext->groupName() == ModelAPI_ResultPart::group()) + { + ResultPartPtr aResPart = std::dynamic_pointer_cast(aBodyContext); + DocumentPtr aPartDoc = aResPart->partDoc(); + if (!aPartDoc.get() || !aPartDoc->isOpened()) + { // document is not accessible + std::string msg = "Can not export XAO for not loaded part"; + Events_InfoMessage("ExportFeature", msg, this).send(); + return; + } + else + { + aDocuments.push_back(aPartDoc); + aDocTrsf[aPartDoc] = aResPart->summaryTrsf(); + } + } + } + } + } + else + { + int aBodyCount = document()->size(ModelAPI_ResultBody::group()); + for (int aBodyIndex = 0; aBodyIndex < aBodyCount; ++aBodyIndex) + { + ResultBodyPtr aResultBody = + std::dynamic_pointer_cast( + document()->object(ModelAPI_ResultBody::group(), aBodyIndex)); + if (!aResultBody.get()) + continue; + aShapes.push_back(aResultBody->shape()); + aResults.push_back(aResultBody); + } + } + if (aShapes.empty()) + { + if (!anExCludedIsImage) + setError("No shapes to export"); return; - } else { - aDocuments.push_back(aPartDoc); - aDocTrsf[aPartDoc] = aResPart->summaryTrsf(); - } } - } - } - } else { - int aBodyCount = document()->size(ModelAPI_ResultBody::group()); - for (int aBodyIndex = 0; aBodyIndex < aBodyCount; ++aBodyIndex) { - ResultBodyPtr aResultBody = - std::dynamic_pointer_cast( - document()->object(ModelAPI_ResultBody::group(), aBodyIndex)); - if (!aResultBody.get()) - continue; - aShapes.push_back(aResultBody->shape()); - aResults.push_back(aResultBody); - } - } - if (aShapes.empty()) { - if(!anExCludedIsImage) - setError("No shapes to export"); - return; - } - - - GeomShapePtr aShape = (aShapes.size() == 1) - ? *aShapes.begin() - : GeomAlgoAPI_CompoundBuilder::compound(aShapes); - - SetShapeToXAO(aShape, &aXao, anError); - - if (!anError.empty()) { - setError("An error occurred while exporting " + theFileName + ": " + anError); - return; - } - - // geometry name - std::string aGeometryName = string(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID())->value(); - if (aGeometryName.empty() && aResults.size() == 1) { - // get the name from the first result - ResultPtr aResultBody = *aResults.begin(); - aGeometryName = Locale::Convert::toString(aResultBody->data()->name()); - } - - aXao.getGeometry()->setName(aGeometryName); - - std::set allResultsCashed; // cash to speed up searching in all results selected - - // iterate all documents used - if (aDocuments.empty()) - aDocuments.push_back(document()); - std::list::iterator aDoc = aDocuments.begin(); - for(; aDoc != aDocuments.end(); aDoc++) { - // groups - int aGroupCount = (*aDoc)->size(ModelAPI_ResultGroup::group()); - for (int aGroupIndex = 0; aGroupIndex < aGroupCount; ++aGroupIndex) { - ResultGroupPtr aResultGroup = std::dynamic_pointer_cast( - (*aDoc)->object(ModelAPI_ResultGroup::group(), aGroupIndex)); - if (!aResultGroup.get() || !aResultGroup->shape().get()) - continue; - - FeaturePtr aGroupFeature = (*aDoc)->feature(aResultGroup); - - AttributeSelectionListPtr aSelectionList = - aGroupFeature->selectionList("group_list"); - if (!ModelAPI_Tools::isInResults(aSelectionList, - aResults, - allResultsCashed))// skip group not used in result - continue; - - // conversion of dimension - std::string aSelectionType = aSelectionList->selectionType(); - GeomAPI_Shape::ShapeType aSelType = GeomAPI_Shape::shapeTypeByStr(aSelectionType); - std::string aDimensionString = - ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType); - XAO::Dimension aGroupDimension = XAO::XaoUtils::stringToDimension(aDimensionString); - - XAO::Group* aXaoGroup = aXao.addGroup(aGroupDimension, - Locale::Convert::toString(aResultGroup->data()->name())); - - try { - GeomAPI_ShapeExplorer aGroupResExplorer(aResultGroup->shape(), aSelType); - for(; aGroupResExplorer.more(); aGroupResExplorer.next()) { - GeomShapePtr aGroupShape = aGroupResExplorer.current(); - if (aDocTrsf.find(*aDoc) != aDocTrsf.end()) - aGroupShape->move(aDocTrsf[*aDoc]); - int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aGroupShape); - if (aReferenceID == 0) // selected value does not found in the exported shape - continue; - std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID); - int anElementID = - aXao.getGeometry()->getElementIndexByReference(aGroupDimension, aReferenceString); - aXaoGroup->add(anElementID); + + GeomShapePtr aShape = (aShapes.size() == 1) + ? *aShapes.begin() + : GeomAlgoAPI_CompoundBuilder::compound(aShapes); + + SetShapeToXAO(aShape, &aXao, anError); + + if (!anError.empty()) + { + setError("An error occurred while exporting " + theFileName + ": " + anError); + return; } - } catch (XAO::XAO_Exception& e) { - // LCOV_EXCL_START - std::string msg = "An error occurred while exporting group " + - Locale::Convert::toString(aResultGroup->data()->name()); - msg += ".\n"; - msg += e.what(); - msg += "\n"; - msg += "=> skipping this group from XAO export."; - Events_InfoMessage("ExportFeature", msg, this).send(); - aXao.removeGroup(aXaoGroup); - // LCOV_EXCL_STOP - } - } - // fields - int aFieldCount = (*aDoc)->size(ModelAPI_ResultField::group()); - for (int aFieldIndex = 0; aFieldIndex < aFieldCount; ++aFieldIndex) { - ResultFieldPtr aResultField = std::dynamic_pointer_cast( - (*aDoc)->object(ModelAPI_ResultField::group(), aFieldIndex)); - - FeaturePtr aFieldFeature = (*aDoc)->feature(aResultField); - - AttributeSelectionListPtr aSelectionList = - aFieldFeature->selectionList("selected"); - std::string aSelectionType = aSelectionList->selectionType(); - bool isWholePart = aSelectionType == "part"; - // skip field not used in results - if (!isWholePart && - !ModelAPI_Tools::isInResults(aSelectionList, aResults, allResultsCashed)) - continue; - - // conversion of dimension - std::string aDimensionString = - ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType); - XAO::Dimension aFieldDimension = XAO::XaoUtils::stringToDimension(aDimensionString); - // get tables and their type - std::shared_ptr aTables = aFieldFeature->tables("values"); - std::string aTypeString = ExchangePlugin_Tools::valuesType2xaoType(aTables->type()); - XAO::Type aFieldType = XAO::XaoUtils::stringToFieldType(aTypeString); - - XAO::Field* aXaoField = aXao.addField(aFieldType, aFieldDimension, aTables->columns(), - Locale::Convert::toString(aResultField->data()->name())); - - - try { - // set components names - AttributeStringArrayPtr aComponents = aFieldFeature->stringArray("components_names"); - for(int aComp = 0; aComp < aComponents->size(); aComp++) { - std::string aName = aComponents->value(aComp); - aXaoField->setComponentName(aComp, aName); + // geometry name + std::string aGeometryName = string(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID())->value(); + if (aGeometryName.empty() && aResults.size() == 1) + { + // get the name from the first result + ResultPtr aResultBody = *aResults.begin(); + aGeometryName = Locale::Convert::toString(aResultBody->data()->name()); } - AttributeIntArrayPtr aStamps = aFieldFeature->intArray("stamps"); - for (int aStepIndex = 0; aStepIndex < aTables->tables(); aStepIndex++) { - XAO::Step* aStep = aXaoField->addNewStep(aStepIndex + 1); - aStep->setStep(aStepIndex + 1); - int aStampIndex = aStamps->value(aStepIndex); - aStep->setStamp(aStampIndex); - int aNumElements = isWholePart ? aXaoField->countElements() : aTables->rows(); - int aNumComps = aTables->columns(); - std::set aFilledIDs; // to fill the rest by defaults - // omit default values first row - for(int aRow = isWholePart ? 0 : 1; aRow < aNumElements; aRow++) { - for(int aCol = 0; aCol < aNumComps; aCol++) { - int anElementID = 0; - if (!isWholePart) { - // element index actually is the ID of the selection - AttributeSelectionPtr aSel = aSelectionList->value(aRow - 1); - int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aSel->value()); - if (aReferenceID == 0) // selected value does not found in the exported shape - continue; - - std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID); - anElementID = aXao.getGeometry()-> - getElementIndexByReference(aFieldDimension, aReferenceString); - } - - ModelAPI_AttributeTables::Value aVal = aTables->value( - isWholePart ? 0 : aRow, aCol, aStepIndex); - std::string aStrVal = valToString(aVal, aTables->type()); - aStep->setStringValue(isWholePart ? aRow : anElementID, aCol, aStrVal); - aFilledIDs.insert(anElementID); + aXao.getGeometry()->setName(aGeometryName); + + std::set allResultsCashed; // cash to speed up searching in all results selected + + // iterate all documents used + if (aDocuments.empty()) + aDocuments.push_back(document()); + std::list::iterator aDoc = aDocuments.begin(); + for (; aDoc != aDocuments.end(); aDoc++) + { + // groups + int aGroupCount = (*aDoc)->size(ModelAPI_ResultGroup::group()); + for (int aGroupIndex = 0; aGroupIndex < aGroupCount; ++aGroupIndex) + { + ResultGroupPtr aResultGroup = std::dynamic_pointer_cast( + (*aDoc)->object(ModelAPI_ResultGroup::group(), aGroupIndex)); + if (!aResultGroup.get() || !aResultGroup->shape().get()) + continue; + + FeaturePtr aGroupFeature = (*aDoc)->feature(aResultGroup); + + AttributeSelectionListPtr aSelectionList = + aGroupFeature->selectionList("group_list"); + if (!ModelAPI_Tools::isInResults(aSelectionList, + aResults, + allResultsCashed)) // skip group not used in result + continue; + + // conversion of dimension + std::string aSelectionType = aSelectionList->selectionType(); + GeomAPI_Shape::ShapeType aSelType = GeomAPI_Shape::shapeTypeByStr(aSelectionType); + std::string aDimensionString = + ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType); + XAO::Dimension aGroupDimension = XAO::XaoUtils::stringToDimension(aDimensionString); + + XAO::Group *aXaoGroup = aXao.addGroup(aGroupDimension, + Locale::Convert::toString(aResultGroup->data()->name())); + + try + { + GeomAPI_ShapeExplorer aGroupResExplorer(aResultGroup->shape(), aSelType); + for (; aGroupResExplorer.more(); aGroupResExplorer.next()) + { + GeomShapePtr aGroupShape = aGroupResExplorer.current(); + if (aDocTrsf.find(*aDoc) != aDocTrsf.end()) + aGroupShape->move(aDocTrsf[*aDoc]); + int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aGroupShape); + if (aReferenceID == 0) // selected value does not found in the exported shape + continue; + std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID); + int anElementID = + aXao.getGeometry()->getElementIndexByReference(aGroupDimension, aReferenceString); + aXaoGroup->add(anElementID); + } + } + catch (XAO::XAO_Exception &e) + { + // LCOV_EXCL_START + std::string msg = "An error occurred while exporting group " + + Locale::Convert::toString(aResultGroup->data()->name()); + msg += ".\n"; + msg += e.what(); + msg += "\n"; + msg += "=> skipping this group from XAO export."; + Events_InfoMessage("ExportFeature", msg, this).send(); + aXao.removeGroup(aXaoGroup); + // LCOV_EXCL_STOP + } } - } - if (!isWholePart) { // fill the rest values by default ones - XAO::GeometricElementList::iterator allElem = - aXao.getGeometry()->begin(aFieldDimension); - for(; allElem != aXao.getGeometry()->end(aFieldDimension); allElem++) { - if (aFilledIDs.find(allElem->first) != aFilledIDs.end()) - continue; - for(int aCol = 0; aCol < aNumComps; aCol++) { - // default value - ModelAPI_AttributeTables::Value aVal = aTables->value(0, aCol, aStepIndex); - std::string aStrVal = valToString(aVal, aTables->type()); - aStep->setStringValue(allElem->first, aCol, aStrVal); - } + + // fields + int aFieldCount = (*aDoc)->size(ModelAPI_ResultField::group()); + for (int aFieldIndex = 0; aFieldIndex < aFieldCount; ++aFieldIndex) + { + ResultFieldPtr aResultField = std::dynamic_pointer_cast( + (*aDoc)->object(ModelAPI_ResultField::group(), aFieldIndex)); + + FeaturePtr aFieldFeature = (*aDoc)->feature(aResultField); + + AttributeSelectionListPtr aSelectionList = + aFieldFeature->selectionList("selected"); + std::string aSelectionType = aSelectionList->selectionType(); + bool isWholePart = aSelectionType == "part"; + // skip field not used in results + if (!isWholePart && + !ModelAPI_Tools::isInResults(aSelectionList, aResults, allResultsCashed)) + continue; + + // conversion of dimension + std::string aDimensionString = + ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType); + XAO::Dimension aFieldDimension = XAO::XaoUtils::stringToDimension(aDimensionString); + // get tables and their type + std::shared_ptr aTables = aFieldFeature->tables("values"); + std::string aTypeString = ExchangePlugin_Tools::valuesType2xaoType(aTables->type()); + XAO::Type aFieldType = XAO::XaoUtils::stringToFieldType(aTypeString); + + XAO::Field *aXaoField = aXao.addField(aFieldType, aFieldDimension, aTables->columns(), + Locale::Convert::toString(aResultField->data()->name())); + + try + { + // set components names + AttributeStringArrayPtr aComponents = aFieldFeature->stringArray("components_names"); + for (int aComp = 0; aComp < aComponents->size(); aComp++) + { + std::string aName = aComponents->value(aComp); + aXaoField->setComponentName(aComp, aName); + } + + AttributeIntArrayPtr aStamps = aFieldFeature->intArray("stamps"); + for (int aStepIndex = 0; aStepIndex < aTables->tables(); aStepIndex++) + { + XAO::Step *aStep = aXaoField->addNewStep(aStepIndex + 1); + aStep->setStep(aStepIndex + 1); + int aStampIndex = aStamps->value(aStepIndex); + aStep->setStamp(aStampIndex); + int aNumElements = isWholePart ? aXaoField->countElements() : aTables->rows(); + int aNumComps = aTables->columns(); + std::set aFilledIDs; // to fill the rest by defaults + // omit default values first row + for (int aRow = isWholePart ? 0 : 1; aRow < aNumElements; aRow++) + { + for (int aCol = 0; aCol < aNumComps; aCol++) + { + int anElementID = 0; + if (!isWholePart) + { + // element index actually is the ID of the selection + AttributeSelectionPtr aSel = aSelectionList->value(aRow - 1); + int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aSel->value()); + if (aReferenceID == 0) // selected value does not found in the exported shape + continue; + + std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID); + anElementID = aXao.getGeometry()->getElementIndexByReference(aFieldDimension, aReferenceString); + } + + ModelAPI_AttributeTables::Value aVal = aTables->value( + isWholePart ? 0 : aRow, aCol, aStepIndex); + std::string aStrVal = valToString(aVal, aTables->type()); + aStep->setStringValue(isWholePart ? aRow : anElementID, aCol, aStrVal); + aFilledIDs.insert(anElementID); + } + } + if (!isWholePart) + { // fill the rest values by default ones + XAO::GeometricElementList::iterator allElem = + aXao.getGeometry()->begin(aFieldDimension); + for (; allElem != aXao.getGeometry()->end(aFieldDimension); allElem++) + { + if (aFilledIDs.find(allElem->first) != aFilledIDs.end()) + continue; + for (int aCol = 0; aCol < aNumComps; aCol++) + { + // default value + ModelAPI_AttributeTables::Value aVal = aTables->value(0, aCol, aStepIndex); + std::string aStrVal = valToString(aVal, aTables->type()); + aStep->setStringValue(allElem->first, aCol, aStrVal); + } + } + } + } + } + catch (XAO::XAO_Exception &e) + { + // LCOV_EXCL_START + std::string msg = "An error occurred while exporting field " + + Locale::Convert::toString(aResultField->data()->name()); + msg += ".\n"; + msg += e.what(); + msg += "\n"; + msg += "=> skipping this field from XAO export."; + Events_InfoMessage("ExportFeature", msg, this).send(); + aXao.removeField(aXaoField); + // LCOV_EXCL_STOP + } } - } } - } catch (XAO::XAO_Exception& e) { + + // exporting + XAOExport(theFileName, &aXao, anError); + + if (!anError.empty()) + { + setError("An error occurred while exporting " + theFileName + ": " + anError); + return; + } + // LCOV_EXCL_START - std::string msg = "An error occurred while exporting field " + - Locale::Convert::toString(aResultField->data()->name()); - msg += ".\n"; - msg += e.what(); - msg += "\n"; - msg += "=> skipping this field from XAO export."; - Events_InfoMessage("ExportFeature", msg, this).send(); - aXao.removeField(aXaoField); - // LCOV_EXCL_STOP - } } - } - - // exporting - XAOExport(theFileName, &aXao, anError); - - if (!anError.empty()) { - setError("An error occurred while exporting " + theFileName + ": " + anError); - return; - } - -// LCOV_EXCL_START - } catch (XAO::XAO_Exception& e) { - std::string anError = e.what(); - setError("An error occurred while exporting " + theFileName + ": " + anError); - return; - } -// LCOV_EXCL_STOP + catch (XAO::XAO_Exception &e) + { + std::string anError = e.what(); + setError("An error occurred while exporting " + theFileName + ": " + anError); + return; + } + // LCOV_EXCL_STOP } -void ExchangePlugin_ExportFeature::exportROOT(const std::string& theFileName) +void ExchangePlugin_ExportFeature::exportROOT(const std::string &theFileName) { - std::string aName = string(ExchangePlugin_ExportFeature::ROOT_MANAGER_NAME_ID())->value(); - std::string aTitle = string(ExchangePlugin_ExportFeature::ROOT_MANAGER_TITLE_ID())->value(); - std::string aFileMat = string(ExchangePlugin_ExportFeature::MAT_FILE_ID())->value(); - - FeaturePtr aFeature; - - std::shared_ptr anAlgo(new GeomAlgoAPI_ROOTExport(theFileName)); - - std::list listNames = ExchangePlugin_Tools::split(theFileName, _separator_); - listNames = ExchangePlugin_Tools::split(listNames.back(), '.'); - - // Create the head of file - anAlgo->buildHead(listNames.front(), aName, aTitle); - - // Materials and mediums - std::map > aMaterials; - std::map > aMedias; - readFileMat(aFileMat, aMaterials, aMedias); - anAlgo->buildMaterialsMedias(aMaterials, aMedias); - - // Create the end of files - std::string aExportFileName = string(ExchangePlugin_ExportFeature::EXP_NAME_FILE_ID())->value(); - AttributeSelectionPtr anObjectAttr = selection(MAIN_OBJECT_ID()); - aFeature = anObjectAttr->contextFeature(); - std::string aNameShape =""; - if (aFeature.get()) { - aNameShape = Locale::Convert::toString(aFeature->firstResult()->data()->name()); - } else { - ObjectPtr anObject = anObjectAttr->contextObject(); - aNameShape = Locale::Convert::toString(anObject->data()->name()); - } - - // Add feature in the file - std::list aFeatures = document()->allFeatures(); - std::list::iterator itFeature = aFeatures.begin(); - std::vector aListNamesOfFeatures; - std::map aMapFeauturesObject; - for(; itFeature != aFeatures.end(); ++itFeature) - { - aFeature = *itFeature; - if (aFeature->getKind() == "Box") + // Get data from feature + std::string aName = string(ExchangePlugin_ExportFeature::ROOT_MANAGER_NAME_ID())->value(); + std::string aTitle = string(ExchangePlugin_ExportFeature::ROOT_MANAGER_TITLE_ID())->value(); + std::string aFileMat = string(ExchangePlugin_ExportFeature::MAT_FILE_ID())->value(); + + FeaturePtr aFeature; + + std::shared_ptr anAlgo(new GeomAlgoAPI_ROOTExport(theFileName)); + + std::list listNames = ExchangePlugin_Tools::split(theFileName, _separator_); + listNames = ExchangePlugin_Tools::split(listNames.back(), '.'); + + // Create the head of file + anAlgo->buildHead(listNames.front(), aName, aTitle); + + // // Materials and mediums + // std::map > aMaterials; + // std::map > aMedias; + // readFileMat(aFileMat, aMaterials, aMedias); + // anAlgo->buildMaterialsMedias(aMaterials, aMedias); + + // Add feature in the file + std::list aFeatures = document()->allFeatures(); + std::list::iterator itFeature = aFeatures.begin(); + std::vector aListNamesOfFeatures; + std::map aMapFeauturesObject; + for (; itFeature != aFeatures.end(); ++itFeature) { - std::vector aCenterDims; - aCenterDims = ExchangePlugin_ExportRoot::computeBox(aFeature); - std::wstring anObjectName = aFeature->firstResult()->data()->name(); - anAlgo->buildBox(anObjectName, aCenterDims); - aListNamesOfFeatures.push_back(anObjectName); - aListNamesOfFeatures.push_back(aFeature->data()->name()); + aFeature = *itFeature; + std::map aFeatureDimensions; + if (aFeature->getKind() == "Box") + { + aFeatureDimensions = ExchangePlugin_ExportRoot::computeBox(aFeature); + std::wstring anObjectName = aFeature->firstResult()->data()->name(); + anAlgo->buildBox(anObjectName, aFeatureDimensions); + aListNamesOfFeatures.push_back(anObjectName); + aListNamesOfFeatures.push_back(aFeature->data()->name()); + } + else if (aFeature->getKind() == "Cylinder") + { + aFeatureDimensions = ExchangePlugin_ExportRoot::computeCylinder(aFeature); + std::wstring anObjectName = aFeature->firstResult()->data()->name(); + anAlgo->buildTube(anObjectName, aFeatureDimensions); + aListNamesOfFeatures.push_back(anObjectName); + aListNamesOfFeatures.push_back(aFeature->data()->name()); + } + } + + // Create the end of files + std::string aExportFileName = string(ExchangePlugin_ExportFeature::EXP_NAME_FILE_ID())->value(); + AttributeSelectionPtr anObjectAttr = selection(MAIN_OBJECT_ID()); + aFeature = anObjectAttr->contextFeature(); + std::string aNameShape = ""; + if (aFeature.get()) + { + aNameShape = Locale::Convert::toString(aFeature->firstResult()->data()->name()); + } + else + { + ObjectPtr anObject = anObjectAttr->contextObject(); + aNameShape = Locale::Convert::toString(anObject->data()->name()); } - } - // Create the end of file - anAlgo->buildEnd(aNameShape, aExportFileName); + // Create the end of file + anAlgo->buildEnd(aNameShape, aExportFileName); - // Create the file with the content - anAlgo->write(); + // Create the file with the content + anAlgo->write(); } bool ExchangePlugin_ExportFeature::isMacro() const { - if (!data().get() || !data()->isValid()) - return false; - ExchangePlugin_ExportFeature* aThis = ((ExchangePlugin_ExportFeature*)(this)); - AttributeStringPtr aFormatAttr = aThis->string(FILE_FORMAT_ID()); - std::string aFormat(aFormatAttr.get() ? aFormatAttr->value() : ""); - - if (aFormat.empty()) { // get default format for the extension - AttributeStringPtr aFilePathAttr = aThis->string(FILE_PATH_ID()); - std::string aFilePath = aFilePathAttr->value(); - if (!aFilePath.empty()) { - std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(aFilePath); - aFormat = anExtension; + if (!data().get() || !data()->isValid()) + return false; + ExchangePlugin_ExportFeature *aThis = ((ExchangePlugin_ExportFeature *)(this)); + AttributeStringPtr aFormatAttr = aThis->string(FILE_FORMAT_ID()); + std::string aFormat(aFormatAttr.get() ? aFormatAttr->value() : ""); + + if (aFormat.empty()) + { // get default format for the extension + AttributeStringPtr aFilePathAttr = aThis->string(FILE_PATH_ID()); + std::string aFilePath = aFilePathAttr->value(); + if (!aFilePath.empty()) + { + std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(aFilePath); + aFormat = anExtension; + } } - } - - if (aFormat == "XAO") { // on export to GEOM the selection attribute is filled - this is - // an exceptional case where export to XAO feature must be kept - AttributeSelectionListPtr aList = aThis->selectionList(XAO_SELECTION_LIST_ID()); - return !aList->isInitialized() || aList->size() == 0; - } - return true; -} + if (aFormat == "XAO") + { // on export to GEOM the selection attribute is filled - this is + // an exceptional case where export to XAO feature must be kept + AttributeSelectionListPtr aList = aThis->selectionList(XAO_SELECTION_LIST_ID()); + return !aList->isInitialized() || aList->size() == 0; + } + return true; +} //================================================================================================= void ExchangePlugin_ExportFeature::readFileMat(const std::string theFileMat, - std::map >& theMaterials, - std::map >& theMedias) + std::map> &theMaterials, + std::map> &theMedias) { - std::string aLine; - std::ifstream aFile(theFileMat); - if (aFile.is_open()) - { - while(getline(aFile, aLine)) + std::string aLine; + std::ifstream aFile(theFileMat); + if (aFile.is_open()) { - std::list aList = ExchangePlugin_Tools::split(aLine, ' '); - std::list::iterator itList = aList.begin(); - - bool isFirst = true; - std::string aName; - std::vector aData; - for (; itList != aList.end(); ++itList) - { - std::string anElem = *itList; - if (isFirst) + while (getline(aFile, aLine)) { - aName = anElem; - isFirst = false; - } else { - aData.push_back(anElem); + std::list aList = ExchangePlugin_Tools::split(aLine, ' '); + std::list::iterator itList = aList.begin(); + + bool isFirst = true; + std::string aName; + std::vector aData; + for (; itList != aList.end(); ++itList) + { + std::string anElem = *itList; + if (isFirst) + { + aName = anElem; + isFirst = false; + } + else + { + aData.push_back(anElem); + } + } + if (aName == "mat") + theMaterials[aData[0]] = aData; + else if (aName == "medium") + theMedias[aData[0]] = aData; } - } - if (aName == "mat") - theMaterials[aData[0]] = aData; - else if (aName == "medium") - theMedias[aData[0]] = aData; + aFile.close(); } - aFile.close(); - } } diff --git a/src/ExchangePlugin/ExchangePlugin_ExportRoot.cpp b/src/ExchangePlugin/ExchangePlugin_ExportRoot.cpp index 721f3632b..65f7b3010 100644 --- a/src/ExchangePlugin/ExchangePlugin_ExportRoot.cpp +++ b/src/ExchangePlugin/ExchangePlugin_ExportRoot.cpp @@ -18,6 +18,7 @@ // #include +#include #include @@ -32,67 +33,91 @@ namespace ExchangePlugin_ExportRoot { - //=============================================================================================== - std::vector computeBox(FeaturePtr theFeature) - { - std::string aMethodName = - theFeature->data()->string(PrimitivesPlugin_Box::CREATION_METHOD())->value(); - - double OX, OY, OZ; - double DX, DY, DZ; - - if (aMethodName == "BoxByDimensions") { - DX = (theFeature->data()->real(PrimitivesPlugin_Box::DX_ID())->value())/2; - DY = (theFeature->data()->real(PrimitivesPlugin_Box::DY_ID())->value())/2; - DZ = (theFeature->data()->real(PrimitivesPlugin_Box::DZ_ID())->value())/2; - OX = DX; - OY = DY; - OZ = DZ; - } else if (aMethodName == "BoxByTwoPoints") { - // Get the first point - AttributeSelectionPtr aRef1 = - theFeature->data()->selection(PrimitivesPlugin_Box::POINT_FIRST_ID()); - GeomShapePtr aShape1 = aRef1->value(); - if (!aShape1.get()) - aShape1 = aRef1->context()->shape(); - std::shared_ptr aFirstPoint = GeomAlgoAPI_PointBuilder::point(aShape1); - // Get the second point - AttributeSelectionPtr aRef2 = - theFeature->data()->selection(PrimitivesPlugin_Box::POINT_SECOND_ID()); - GeomShapePtr aShape2 = aRef2->value(); - if (!aShape2.get()) - aShape2 = aRef2->context()->shape(); - std::shared_ptr aSecondPoint = GeomAlgoAPI_PointBuilder::point(aShape2); - DX = fabs(aSecondPoint->x() - aFirstPoint->x())/2; - DY = fabs(aSecondPoint->y() - aFirstPoint->y())/2; - DZ = fabs(aSecondPoint->z() - aFirstPoint->z())/2; - OX = fmin(aFirstPoint->x(), aSecondPoint->x()) + DX; - OY = fmin(aFirstPoint->y(), aSecondPoint->y()) + DY; - OZ = fmin(aFirstPoint->z(), aSecondPoint->z()) + DZ; - } else if (aMethodName == "BoxByOnePointAndDims") { - OX = theFeature->data()->real(PrimitivesPlugin_Box::OX_ID())->value(); - OY = theFeature->data()->real(PrimitivesPlugin_Box::OY_ID())->value(); - OZ = theFeature->data()->real(PrimitivesPlugin_Box::OZ_ID())->value(); - DX = theFeature->data()->real(PrimitivesPlugin_Box::HALF_DX_ID())->value(); - DY = theFeature->data()->real(PrimitivesPlugin_Box::HALF_DY_ID())->value(); - DZ = theFeature->data()->real(PrimitivesPlugin_Box::HALF_DZ_ID())->value(); - } else { - // ToDo error - return; + //=============================================================================================== + std::map computeBox(FeaturePtr theFeature) + { + std::string aMethodName = + theFeature->data()->string(PrimitivesPlugin_Box::CREATION_METHOD())->value(); + + double OX, OY, OZ; + double DX, DY, DZ; + + if (aMethodName == "BoxByDimensions") + { + DX = (theFeature->data()->real(PrimitivesPlugin_Box::DX_ID())->value()) / 2; + DY = (theFeature->data()->real(PrimitivesPlugin_Box::DY_ID())->value()) / 2; + DZ = (theFeature->data()->real(PrimitivesPlugin_Box::DZ_ID())->value()) / 2; + OX = DX; + OY = DY; + OZ = DZ; + } + else if (aMethodName == "BoxByTwoPoints") + { + // Get the first point + AttributeSelectionPtr aRef1 = + theFeature->data()->selection(PrimitivesPlugin_Box::POINT_FIRST_ID()); + GeomShapePtr aShape1 = aRef1->value(); + if (!aShape1.get()) + aShape1 = aRef1->context()->shape(); + std::shared_ptr aFirstPoint = GeomAlgoAPI_PointBuilder::point(aShape1); + // Get the second point + AttributeSelectionPtr aRef2 = + theFeature->data()->selection(PrimitivesPlugin_Box::POINT_SECOND_ID()); + GeomShapePtr aShape2 = aRef2->value(); + if (!aShape2.get()) + aShape2 = aRef2->context()->shape(); + std::shared_ptr aSecondPoint = GeomAlgoAPI_PointBuilder::point(aShape2); + DX = fabs(aSecondPoint->x() - aFirstPoint->x()) / 2; + DY = fabs(aSecondPoint->y() - aFirstPoint->y()) / 2; + DZ = fabs(aSecondPoint->z() - aFirstPoint->z()) / 2; + OX = fmin(aFirstPoint->x(), aSecondPoint->x()) + DX; + OY = fmin(aFirstPoint->y(), aSecondPoint->y()) + DY; + OZ = fmin(aFirstPoint->z(), aSecondPoint->z()) + DZ; + } + else if (aMethodName == "BoxByOnePointAndDims") + { + OX = theFeature->data()->real(PrimitivesPlugin_Box::OX_ID())->value(); + OY = theFeature->data()->real(PrimitivesPlugin_Box::OY_ID())->value(); + OZ = theFeature->data()->real(PrimitivesPlugin_Box::OZ_ID())->value(); + DX = theFeature->data()->real(PrimitivesPlugin_Box::HALF_DX_ID())->value(); + DY = theFeature->data()->real(PrimitivesPlugin_Box::HALF_DY_ID())->value(); + DZ = theFeature->data()->real(PrimitivesPlugin_Box::HALF_DZ_ID())->value(); + } + else + return; + + //Prepare data to return + std::map aFeatureDim; + + // Put the center + aFeatureDim["OX"] = OX; + aFeatureDim["OY"] = OY; + aFeatureDim["OZ"] = OZ; + + // Put the dimensions + aFeatureDim["DX"] = DX; + aFeatureDim["DY"] = DY; + aFeatureDim["DZ"] = DZ; + + return aFeatureDim; } - std::vector aCenterDims; - // Put the center - aCenterDims.push_back(OX); - aCenterDims.push_back(OY); - aCenterDims.push_back(OZ); + //=============================================================================================== + std::map computeCylinder(FeaturePtr theFeature) + { + std::string aMethodName = + theFeature->data()->string(PrimitivesPlugin_Cylinder::CREATION_METHOD())->value(); - // Put the dimensions - aCenterDims.push_back(DX); - aCenterDims.push_back(DY); - aCenterDims.push_back(DZ); + double radius, halfdz; + radius = (theFeature->data()->real(PrimitivesPlugin_Cylinder::RADIUS_ID())->value()); + halfdz = (theFeature->data()->real(PrimitivesPlugin_Cylinder::HEIGHT_ID())->value()) / 2; - return aCenterDims; + std::map aFeatureDim; + // Put the center + aFeatureDim["radius"] = radius; + aFeatureDim["halfdz"] = halfdz; + + return aFeatureDim; + } - } } // namespace ExchangePlugin_ExportRoot diff --git a/src/ExchangePlugin/ExchangePlugin_ExportRoot.h b/src/ExchangePlugin/ExchangePlugin_ExportRoot.h index 73b6b7dda..c35a2d9ff 100644 --- a/src/ExchangePlugin/ExchangePlugin_ExportRoot.h +++ b/src/ExchangePlugin/ExchangePlugin_ExportRoot.h @@ -26,7 +26,8 @@ namespace ExchangePlugin_ExportRoot /// \param[in] theFeature a feature to obtain AttributeRefAttr /// \param[out] theCenter coordinates of the center of the box /// \param[out] theDimensions dimensions of the box - EXCHANGEPLUGIN_EXPORT std::vector computeBox(FeaturePtr theFeature); + EXCHANGEPLUGIN_EXPORT std::map computeBox(FeaturePtr theFeature); + EXCHANGEPLUGIN_EXPORT std::map computeCylinder(FeaturePtr theFeature); } #endif /* EXCHANGEPLUGIN_EXPORTROOT_H_ */ diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.cpp index de4214ab7..7b670bb8d 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.cpp @@ -28,95 +28,134 @@ #include //================================================================================================= -static std::string doubleToString(const double& theValue) +static std::string doubleToString(const double &theValue) { - std::ostringstream str; - str << theValue; - return str.str(); + std::ostringstream str; + str << theValue; + return str.str(); } //================================================================================================= -GeomAlgoAPI_ROOTExport::GeomAlgoAPI_ROOTExport(const std::string& theFileName) +GeomAlgoAPI_ROOTExport::GeomAlgoAPI_ROOTExport(const std::string &theFileName) { - myFileName = theFileName; + myFileName = theFileName; } //================================================================================================= -void GeomAlgoAPI_ROOTExport::buildHead(const std::string& theMethodName, const std::string& theName, - const std::string& theTitle) +void GeomAlgoAPI_ROOTExport::buildHead(const std::string &theMethodName, const std::string &theName, + const std::string &theTitle) { - myContent << "void " << theMethodName << "() {" << std::endl; - myContent << "gSystem->Load(\"libGeom\");" << std::endl; - myContent << "TGeoManager *geom = new TGeoManager(\"" << theName; - myContent << "\",\"" << theTitle << "\");" << std::endl; - myContent << std::endl; + myContent << "void " << theMethodName << "()" << std::endl + << "{" << std::endl + << std::endl; + + myContent << "\t" + << "TGeoManager *geom = new TGeoManager(\"" + << theName << "\",\"" + << theTitle << "\");" << std::endl; + + myContent << "\t" + << "// ####################################" << std::endl; } //================================================================================================= -void GeomAlgoAPI_ROOTExport::buildEnd(const std::string theSolidName, - const std::string theExportName) +void GeomAlgoAPI_ROOTExport::buildBox(const std::wstring &theObjectName, + const std::map theFeatureDim) { - myContent << "// ####################################" << std::endl; - myContent << "geom->SetTopVolume(" << theSolidName << ");" << std::endl; - myContent << "geom->CloseGeometry();" << std::endl; - myContent << theSolidName + "->SetVisContainers(kTRUE);" << std::endl; - myContent << "geom->SetTopVisible(kTRUE);" << std::endl; - myContent << "geom->Export(\"" + theExportName + "\");" << std::endl; - myContent << "geom->CheckOverlaps(0.0001);" << std::endl; - myContent << "geom->PrintOverlaps();" << std::endl; - myContent << theSolidName + "->Draw();" << std::endl; - myContent << "}" << std::endl; + std::string anObjectName(theObjectName.begin(), theObjectName.end()); + + myContent << "\t" + << "//Exporting " << anObjectName << std::endl; + + myContent << "\t" + << "Double_t point_" << anObjectName << "[3] = {" + << doubleToString(theFeatureDim["OX"]) << "," + << doubleToString(theFeatureDim["OY"]) << "," + << doubleToString(theFeatureDim["OZ"]) << "}" << std::endl; + + myContent << "\t" + << "TGeoBBox *" << anObjectName << " = new TGeoBBox(\"" + << anObjectName << "\"," + << doubleToString(theFeatureDim["DX"]) << "," + << doubleToString(theFeatureDim["DY"]) << "," + << doubleToString(theFeatureDim["DZ"]) << "," + << "point_" << anObjectName << ");" << std::endl + << std::endl; } //================================================================================================= -void GeomAlgoAPI_ROOTExport::buildMaterialsMedias( - const std::map > theMaterials, - const std::map > theMedias) +void GeomAlgoAPI_ROOTExport::buildTube(const std::wstring &theObjectName, + const std::map theFeatureDim) { - const std::map >::const_iterator - anItMat = theMaterials.begin(), aLastMat = theMaterials.end(); - for(; anItMat != aLastMat; anItMat++) { - std::vector aValues = anItMat->second; - myContent << "TGeoMaterial *" << anItMat->first << " = new TGeoMaterial(\"" << aValues[1] << - "\"," << aValues[2] << "," << aValues[3] << "," << aValues[4] << ");" << std::endl; - } - - const std::map >::const_iterator - anItMed = theMedias.begin(), aLastMed = theMedias.end(); - for(; anItMed != aLastMed; anItMed++) { - std::vector aValues = anItMed->second; - myContent << "TGeoMedium *" << anItMed->first << " = new TGeoMedium(\"" << aValues[1] << - "\"," << aValues[2] << "," << aValues[3] << ");" << std::endl; - } - myContent << std::endl; + // TGeoTube * fuelShape = new TGeoTube("fuelShape",0.,fuelRadius,halfdz); + std::string anObjectName(theObjectName.begin(), theObjectName.end()); + + myContent << "\t" + << "//Exporting " << anObjectName << std::endl; + + myContent << "\t" + << "TGeoTube *" << anObjectName << " = new TGeoTube(\"" + << anObjectName << "\"," + << "0." + << "," + << doubleToString(theFeatureDim["radius"]) << "," + << doubleToString(theFeatureDim["halfdz"]) << ");" + << std::endl + << std::endl; } //================================================================================================= -void GeomAlgoAPI_ROOTExport::buildBox(const std::wstring& theObjectName, - const std::vector theCenterDims) +void GeomAlgoAPI_ROOTExport::buildEnd(const std::string theSolidName, + const std::string theExportName) { - std::string anObjectName(theObjectName.begin(), theObjectName.end()); - - myContent << "Double_t point_" << anObjectName << "[3] = {"; - myContent << doubleToString(theCenterDims[0]) << "," << doubleToString(theCenterDims[1]) << ","; - myContent << (theCenterDims[2]) << "};" << std::endl; - - myContent << "TGeoBBox *" << anObjectName << " = new TGeoBBox(\""; - myContent << anObjectName << "\","; - myContent << doubleToString(theCenterDims[3]) << "," << doubleToString(theCenterDims[4]) << ","; - myContent << doubleToString(theCenterDims[5]) << ",point_"; - myContent << anObjectName << ");" << std::endl << std::endl; + myContent << "\t" + << "// ####################################" << std::endl; + myContent << "\t" + << "geom->SetTopVolume(" << theSolidName << ");" << std::endl; + myContent << "\t" + << "geom->CloseGeometry();" << std::endl; + myContent << "\t" + << "geom->Export(\"" + theExportName + "\");" << std::endl; + myContent << "\t" + << "geom->SetTopVisible();" << std::endl; + myContent << "\t" + << "geom->CheckOverlaps(1.e-6);" << std::endl; + myContent << std::endl + << "}" << std::endl; } //================================================================================================= bool GeomAlgoAPI_ROOTExport::write() { - std::ofstream aFile; - OSD_OpenStream(aFile, myFileName.c_str(), std::ofstream::out); - if (!aFile.is_open()) - return false; - - aFile << myContent.str() << std::endl; - aFile.close(); - return true; + std::ofstream aFile; + OSD_OpenStream(aFile, myFileName.c_str(), std::ofstream::out); + if (!aFile.is_open()) + return false; + + aFile << myContent.str() << std::endl; + aFile.close(); + return true; } + +// //================================================================================================= +// void GeomAlgoAPI_ROOTExport::buildMaterialsMedias( +// const std::map > theMaterials, +// const std::map > theMedias) +// { +// const std::map >::const_iterator +// anItMat = theMaterials.begin(), aLastMat = theMaterials.end(); +// for(; anItMat != aLastMat; anItMat++) { +// std::vector aValues = anItMat->second; +// myContent << "TGeoMaterial *" << anItMat->first << " = new TGeoMaterial(\"" << aValues[1] << +// "\"," << aValues[2] << "," << aValues[3] << "," << aValues[4] << ");" << std::endl; +// } + +// const std::map >::const_iterator +// anItMed = theMedias.begin(), aLastMed = theMedias.end(); +// for(; anItMed != aLastMed; anItMed++) { +// std::vector aValues = anItMed->second; +// myContent << "TGeoMedium *" << anItMed->first << " = new TGeoMedium(\"" << aValues[1] << +// "\"," << aValues[2] << "," << aValues[3] << ");" << std::endl; +// } +// myContent << std::endl; +// } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.h b/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.h index f300e9e01..1e3d8bf39 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ROOTExport.h @@ -33,32 +33,36 @@ */ class GeomAlgoAPI_ROOTExport { - public: - GEOMALGOAPI_EXPORT GeomAlgoAPI_ROOTExport(const std::string& theFileName); +public: + GEOMALGOAPI_EXPORT GeomAlgoAPI_ROOTExport(const std::string &theFileName); - /// Build the head of file - GEOMALGOAPI_EXPORT void buildHead(const std::string& theMethodName, const std::string& theName, - const std::string& theTitle); + /// Build the head of file + GEOMALGOAPI_EXPORT void buildHead(const std::string &theMethodName, const std::string &theName, + const std::string &theTitle); - /// Build the end of file - GEOMALGOAPI_EXPORT void buildEnd(const std::string theSolidName, - const std::string theExportName); + /// Build the end of file + GEOMALGOAPI_EXPORT void buildEnd(const std::string theSolidName, + const std::string theExportName); - /// Build the materials ans mediums - GEOMALGOAPI_EXPORT void buildMaterialsMedias( - const std::map > theMaterials, - const std::map > theMedias); + // /// Build the materials ans mediums + // GEOMALGOAPI_EXPORT void buildMaterialsMedias( + // const std::map > theMaterials, + // const std::map > theMedias); - /// Build box - GEOMALGOAPI_EXPORT void buildBox(const std::wstring& theObjectName, - const std::vector theCenterDims); + /// Build box + GEOMALGOAPI_EXPORT void buildBox(const std::wstring &theObjectName, + const std::map theFeatureDim); - /// Write the file - GEOMALGOAPI_EXPORT bool write(); + /// Build Tube + GEOMALGOAPI_EXPORT void buildTube(const std::wstring &theObjectName, + const std::map theFeatureDim); - private: - std::string myFileName; /// File name for materials and medias - std::ostringstream myContent; /// X coordinate of the center to create a box. + /// Write the file + GEOMALGOAPI_EXPORT bool write(); + +private: + std::string myFileName; /// File name for materials and medias + std::ostringstream myContent; /// X coordinate of the center to create a box. }; #endif // GEOMALGOAPI_ROOTEXPORT_H_ -- 2.39.2