From 79374102fc5efa3b31dbd3e2a751bd665394c251 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me?= Date: Wed, 21 Oct 2020 15:12:18 +0200 Subject: [PATCH] Implemention feature to view basic prpoperties --- src/Config/Config_Keywords.h | 1 + src/FeaturesAPI/CMakeLists.txt | 2 + src/FeaturesAPI/FeaturesAPI.i | 1 + .../FeaturesAPI_GeometryCalculation.cpp | 45 ++++++++ .../FeaturesAPI_GeometryCalculation.h | 37 ++++++ src/FeaturesAPI/FeaturesAPI_swig.h | 1 + src/FeaturesPlugin/CMakeLists.txt | 23 +++- .../FeaturesPlugin_GeometryCalculation.cpp | 107 ++++++++++++++++++ .../FeaturesPlugin_GeometryCalculation.h | 101 +++++++++++++++++ src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp | 3 + .../GeometryCalculation_widget.xml | 13 +++ src/FeaturesPlugin/icons/basicproperties.png | Bin 0 -> 809 bytes src/FeaturesPlugin/plugin-Features.xml | 11 +- src/GeomAlgoAPI/CMakeLists.txt | 3 + .../GeomAlgoAPI_BasicProperties.cpp | 75 ++++++++++++ src/GeomAlgoAPI/GeomAlgoAPI_BasicProperties.h | 42 +++++++ src/ModelAPI/CMakeLists.txt | 8 +- src/ModuleBase/ModuleBase_WidgetLabel.cpp | 4 + src/PythonAPI/model/features/__init__.py | 1 + 19 files changed, 469 insertions(+), 9 deletions(-) create mode 100644 src/FeaturesAPI/FeaturesAPI_GeometryCalculation.cpp create mode 100644 src/FeaturesAPI/FeaturesAPI_GeometryCalculation.h create mode 100644 src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.cpp create mode 100644 src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.h create mode 100644 src/FeaturesPlugin/GeometryCalculation_widget.xml create mode 100644 src/FeaturesPlugin/icons/basicproperties.png create mode 100644 src/GeomAlgoAPI/GeomAlgoAPI_BasicProperties.cpp create mode 100644 src/GeomAlgoAPI/GeomAlgoAPI_BasicProperties.h diff --git a/src/Config/Config_Keywords.h b/src/Config/Config_Keywords.h index 5be23a997..28783fd69 100644 --- a/src/Config/Config_Keywords.h +++ b/src/Config/Config_Keywords.h @@ -100,6 +100,7 @@ MAYBE_UNUSED const static char* ATTR_TOOLTIP = FEATURE_TOOLTIP; MAYBE_UNUSED const static char* ATTR_ICON = FEATURE_ICON; MAYBE_UNUSED const static char* ATTR_LABEL = "label"; MAYBE_UNUSED const static char* ATTR_STYLE_SHEET = "styleSheet"; +MAYBE_UNUSED const static char* ATTR_IS_SELECTABLE = "isSelectable"; MAYBE_UNUSED const static char* ATTR_HTML_STYLE = "isHTML"; MAYBE_UNUSED const static char* ATTR_DEFAULT = "default"; MAYBE_UNUSED const static char* ATTR_INTERNAL = "internal"; diff --git a/src/FeaturesAPI/CMakeLists.txt b/src/FeaturesAPI/CMakeLists.txt index 0b8e3055c..093877f66 100644 --- a/src/FeaturesAPI/CMakeLists.txt +++ b/src/FeaturesAPI/CMakeLists.txt @@ -32,6 +32,7 @@ SET(PROJECT_HEADERS FeaturesAPI_Fillet.h FeaturesAPI_Intersection.h FeaturesAPI_Measurement.h + FeaturesAPI_GeometryCalculation.h FeaturesAPI_MultiRotation.h FeaturesAPI_MultiTranslation.h FeaturesAPI_Partition.h @@ -65,6 +66,7 @@ SET(PROJECT_SOURCES FeaturesAPI_Fillet.cpp FeaturesAPI_Intersection.cpp FeaturesAPI_Measurement.cpp + FeaturesAPI_GeometryCalculation.cpp FeaturesAPI_MultiRotation.cpp FeaturesAPI_MultiTranslation.cpp FeaturesAPI_Partition.cpp diff --git a/src/FeaturesAPI/FeaturesAPI.i b/src/FeaturesAPI/FeaturesAPI.i index b76fd2dc4..c2c0631d4 100644 --- a/src/FeaturesAPI/FeaturesAPI.i +++ b/src/FeaturesAPI/FeaturesAPI.i @@ -211,6 +211,7 @@ %include "FeaturesAPI_Fillet.h" %include "FeaturesAPI_Intersection.h" %include "FeaturesAPI_Measurement.h" +%include "FeaturesAPI_GeometryCalculation.h" %include "FeaturesAPI_MultiRotation.h" %include "FeaturesAPI_MultiTranslation.h" %include "FeaturesAPI_Partition.h" diff --git a/src/FeaturesAPI/FeaturesAPI_GeometryCalculation.cpp b/src/FeaturesAPI/FeaturesAPI_GeometryCalculation.cpp new file mode 100644 index 000000000..9bf0ae406 --- /dev/null +++ b/src/FeaturesAPI/FeaturesAPI_GeometryCalculation.cpp @@ -0,0 +1,45 @@ +// Copyright (C) 2018-2020 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "FeaturesAPI_GeometryCalculation.h" + +#include +#include +#include +#include + +std::list getBasicProperties(const std::shared_ptr& thePart, + const ModelHighAPI_Selection& theObject) +{ + FeaturePtr aPointCoodFeat = thePart->addFeature(FeaturesPlugin_GeometryCalculation::ID()); + + fillAttribute(theObject, aPointCoodFeat + ->selection(FeaturesPlugin_GeometryCalculation::OBJECT_SELECTED_ID())); + std::list res; + + // obtain result + AttributeDoubleArrayPtr aResult = std::dynamic_pointer_cast( + aPointCoodFeat->attribute(FeaturesPlugin_GeometryCalculation::RESULT_VALUES_ID())); + + for ( int i : {0, 1, 2}) + res.push_back( aResult->value(i)); + + return res; +} + diff --git a/src/FeaturesAPI/FeaturesAPI_GeometryCalculation.h b/src/FeaturesAPI/FeaturesAPI_GeometryCalculation.h new file mode 100644 index 000000000..abed69276 --- /dev/null +++ b/src/FeaturesAPI/FeaturesAPI_GeometryCalculation.h @@ -0,0 +1,37 @@ +// Copyright (C) 2018-2020 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef FeaturesAPI_GeometryCalculation_H_ +#define FeaturesAPI_GeometryCalculation_H_ + +#include "FeaturesAPI.h" + +#include +#include + +class ModelAPI_Document; +class ModelHighAPI_Selection; + +/// \ingroup CPPHighAPI +/// \brief get the basic properties (lenght, Surface area, volume) +FEATURESAPI_EXPORT +std::list getBasicProperties(const std::shared_ptr& thePart, + const ModelHighAPI_Selection& theObject); + +#endif // FeaturesAPI_GeometryCalculation_H_ \ No newline at end of file diff --git a/src/FeaturesAPI/FeaturesAPI_swig.h b/src/FeaturesAPI/FeaturesAPI_swig.h index 17ada7187..030fbaa26 100644 --- a/src/FeaturesAPI/FeaturesAPI_swig.h +++ b/src/FeaturesAPI/FeaturesAPI_swig.h @@ -35,6 +35,7 @@ #include "FeaturesAPI_Fillet.h" #include "FeaturesAPI_Intersection.h" #include "FeaturesAPI_Measurement.h" + #include "FeaturesAPI_GeometryCalculation.h" #include "FeaturesAPI_MultiRotation.h" #include "FeaturesAPI_MultiTranslation.h" #include "FeaturesAPI_Partition.h" diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index c93c66a17..8d7002a61 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -19,6 +19,17 @@ INCLUDE(Common) INCLUDE(UnitTest) +INCLUDE(UseQtExt) + +# additional include directories +INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/GeomDataAPI + ${PROJECT_SOURCE_DIR}/src/Locale + ${PROJECT_SOURCE_DIR}/src/PrimitivesPlugin + ${QT_INCLUDES}) + +# additional preprocessor / compiler flags +ADD_DEFINITIONS(${QT_DEFINITIONS}) + SET(PROJECT_HEADERS FeaturesPlugin.h @@ -59,6 +70,7 @@ SET(PROJECT_HEADERS FeaturesPlugin_Fillet.h FeaturesPlugin_Fillet1D.h FeaturesPlugin_Measurement.h + FeaturesPlugin_GeometryCalculation.h FeaturesPlugin_FusionFaces.h FeaturesPlugin_RemoveResults.h FeaturesPlugin_Chamfer.h @@ -106,6 +118,7 @@ SET(PROJECT_SOURCES FeaturesPlugin_Fillet.cpp FeaturesPlugin_Fillet1D.cpp FeaturesPlugin_Measurement.cpp + FeaturesPlugin_GeometryCalculation.cpp FeaturesPlugin_FusionFaces.cpp FeaturesPlugin_RemoveResults.cpp FeaturesPlugin_Chamfer.cpp @@ -144,6 +157,7 @@ SET(XML_RESOURCES fillet_widget.xml fillet1d_widget.xml measurement_widget.xml + GeometryCalculation_widget.xml fusion_faces_widget.xml chamfer_widget.xml copy_widget.xml @@ -166,6 +180,7 @@ INCLUDE_DIRECTORIES( ../GeomAPI ../GeomAlgoAPI ../GeomValidators + ../ModuleBase ../Events ../Config ${OpenCASCADE_INCLUDE_DIR} @@ -182,7 +197,11 @@ SET(PROJECT_LIBRARIES ) ADD_DEFINITIONS(-DFEATURESPLUGIN_EXPORTS) -ADD_LIBRARY(FeaturesPlugin MODULE ${PROJECT_SOURCES} ${PROJECT_HEADERS} ${XML_RESOURCES} ${TEXT_RESOURCES}) +ADD_LIBRARY(FeaturesPlugin MODULE + ${PROJECT_SOURCES} + ${PROJECT_HEADERS} + ${XML_RESOURCES} + ${TEXT_RESOURCES}) TARGET_LINK_LIBRARIES(FeaturesPlugin ${PROJECT_LIBRARIES}) INSTALL(TARGETS FeaturesPlugin DESTINATION ${SHAPER_INSTALL_PLUGIN_FILES}) @@ -682,6 +701,4 @@ ADD_UNIT_TESTS(TestExtrusion.py TestFillet1D_Wire_3.py TestFillet1D_Wire_4.py TestFillet1D_Wire_5.py - Test19931.py - Test20027.py ) diff --git a/src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.cpp b/src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.cpp new file mode 100644 index 000000000..c16bc78a3 --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.cpp @@ -0,0 +1,107 @@ +// Copyright (C) 2018-2020 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "FeaturesPlugin_GeometryCalculation.h" + +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + + +#include +#include + +FeaturesPlugin_GeometryCalculation::FeaturesPlugin_GeometryCalculation() +{ +} + +void FeaturesPlugin_GeometryCalculation::initAttributes() +{ + // attribute for point selected + data()->addAttribute(OBJECT_SELECTED_ID(), ModelAPI_AttributeSelection::typeId()); + // attributes for result message and values + data()->addAttribute(LENGHT_ID(), ModelAPI_AttributeString::typeId()); + data()->addAttribute(AREA_ID(), ModelAPI_AttributeString::typeId()); + data()->addAttribute(VOLUME_ID(), ModelAPI_AttributeString::typeId()); + + data()->addAttribute(RESULT_VALUES_ID(), ModelAPI_AttributeDoubleArray::typeId()); + + data()->realArray(RESULT_VALUES_ID())->setSize(3); + +} + +void FeaturesPlugin_GeometryCalculation::execute() +{ +} + +void FeaturesPlugin_GeometryCalculation::attributeChanged(const std::string& theID) +{ + if (theID == OBJECT_SELECTED_ID()) { + + AttributeSelectionPtr aSelection = selection(OBJECT_SELECTED_ID()); + AttributeDoubleArrayPtr aValues = + std::dynamic_pointer_cast(attribute(RESULT_VALUES_ID())); + std::stringstream streamL; + std::stringstream streamA; + std::stringstream streamV; + GeomShapePtr aShape; + + if (aSelection && aSelection->isInitialized()) { + aShape = aSelection->value(); + if (!aShape && aSelection->context()) + aShape = aSelection->context()->shape(); + } + if (aShape){ + double aTolerance = 0.0001; + double aLength; + double aSurfArea; + double aVolume; + std::string aError; + if( !GetBasicProperties( aShape, + aTolerance, + aLength, + aSurfArea, + aVolume, + aError) ) + setError("Error in Geometry calculation :" + aError); + + streamL << std::setprecision(14) << aLength; + aValues->setValue(0, aLength); + streamA << std::setprecision(14) << aSurfArea; + aValues->setValue(1, aSurfArea); + streamV << std::setprecision(14) << aVolume; + aValues->setValue(2, aVolume); + } + + string(LENGHT_ID() )->setValue( "Lenght = " + streamL.str() ); + string(AREA_ID() )->setValue( "Area = " + streamA.str() ); + string(VOLUME_ID() )->setValue( "Volume = " + streamV.str() ); + } +} + diff --git a/src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.h b/src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.h new file mode 100644 index 000000000..df95636d1 --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_GeometryCalculation.h @@ -0,0 +1,101 @@ +// Copyright (C) 2018-2020 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef FeaturesPlugin_GeometryCalculation_H_ +#define FeaturesPlugin_GeometryCalculation_H_ + +#include "FeaturesPlugin.h" +#include + +#include +#include + +/// \class FeaturesPlugin_GeometryCalculation +/// \ingroup Plugins +/// \brief Feature for geometry calculation. + +class FeaturesPlugin_GeometryCalculation : public ModelAPI_Feature +{ +public: + inline static const std::string& ID() + { + static const std::string MY_ID("GeometryCalculation"); + return MY_ID; + } + + /// \return the kind of a feature. + virtual const std::string& getKind() + { + return ID(); + } + + /// Attribute name for object selected. + inline static const std::string& OBJECT_SELECTED_ID() + { + static const std::string MY_OBJECT_SELECTED_ID("main_object"); + return MY_OBJECT_SELECTED_ID; + } + + /// Attribute name for lenght + inline static const std::string& LENGHT_ID() + { + static const std::string MY_LENGHT_ID("lenght"); + return MY_LENGHT_ID; + } + + /// Attribute name for area + inline static const std::string& AREA_ID() + { + static const std::string MY_AREA_ID("area"); + return MY_AREA_ID; + } + + /// Attribute name for volume. + inline static const std::string& VOLUME_ID() + { + static const std::string MY_VOLUME_ID("volume"); + return MY_VOLUME_ID; + } + + /// Attribute name for values of result. + inline static const std::string& RESULT_VALUES_ID() + { + static const std::string MY_RESULT_VALUES_ID("result_values"); + return MY_RESULT_VALUES_ID; + } + + /// Performs the algorithm and stores results it in the data structure. + FEATURESPLUGIN_EXPORT virtual void execute(); + + /// Request for initialization of data model of the feature: adding all attributes + FEATURESPLUGIN_EXPORT virtual void initAttributes(); + + /// Called on change of any argument-attribute of this object + /// \param theID identifier of changed attribute + FEATURESPLUGIN_EXPORT virtual void attributeChanged(const std::string& theID); + + /// Reimplemented from ModelAPI_Feature::isMacro(). Returns true. + virtual bool isMacro() const { return true; } + + /// Use plugin manager for features creation + FeaturesPlugin_GeometryCalculation(); + +}; + +#endif diff --git a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp index 0d49dfe08..d4f2f77a3 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -187,6 +188,8 @@ FeaturePtr FeaturesPlugin_Plugin::createFeature(std::string theFeatureID) return FeaturePtr(new FeaturesPlugin_Fillet1D); } else if (theFeatureID == FeaturesPlugin_Measurement::ID()) { return FeaturePtr(new FeaturesPlugin_Measurement); + } else if (theFeatureID == FeaturesPlugin_GeometryCalculation::ID()) { + return FeaturePtr(new FeaturesPlugin_GeometryCalculation); } else if (theFeatureID == FeaturesPlugin_RemoveResults::ID()) { return FeaturePtr(new FeaturesPlugin_RemoveResults); } else if (theFeatureID == FeaturesPlugin_Chamfer::ID()) { diff --git a/src/FeaturesPlugin/GeometryCalculation_widget.xml b/src/FeaturesPlugin/GeometryCalculation_widget.xml new file mode 100644 index 000000000..4b5913dc5 --- /dev/null +++ b/src/FeaturesPlugin/GeometryCalculation_widget.xml @@ -0,0 +1,13 @@ + + + + +