From 41ed42878d1fc0e6b7f00e0e3a79e3bc747033a9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me?= Date: Tue, 8 Dec 2020 18:05:14 +0100 Subject: [PATCH] #20441 Visualization of faces found --- src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp | 27 ++-- src/FeaturesAPI/FeaturesAPI_SharedFaces.h | 19 +-- src/FeaturesPlugin/CMakeLists.txt | 8 +- .../FeaturesPlugin_CommonSharedFaces.cpp | 122 +++++++++++++++ .../FeaturesPlugin_CommonSharedFaces.h | 63 ++++++++ .../FeaturesPlugin_GroupSharedFaces.cpp | 125 +++++++++++++++ .../FeaturesPlugin_GroupSharedFaces.h | 105 +++++++++++++ src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp | 3 + .../FeaturesPlugin_SharedFaces.cpp | 146 +++++++++--------- .../FeaturesPlugin_SharedFaces.h | 35 +++-- src/FeaturesPlugin/plugin-Features.xml | 8 +- .../shared_Faces_macro_widget.xml | 34 ++++ src/FeaturesPlugin/shared_Faces_widget.xml | 31 ++++ 13 files changed, 608 insertions(+), 118 deletions(-) create mode 100644 src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.cpp create mode 100644 src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.h create mode 100644 src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.cpp create mode 100644 src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.h create mode 100644 src/FeaturesPlugin/shared_Faces_macro_widget.xml create mode 100644 src/FeaturesPlugin/shared_Faces_widget.xml diff --git a/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp b/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp index a0ebb84dc..92b09330e 100644 --- a/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp +++ b/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp @@ -19,8 +19,7 @@ #include "FeaturesAPI_SharedFaces.h" -#include -#include +#include #include #include @@ -37,20 +36,17 @@ FeaturesAPI_SharedFaces:: } //================================================================================================= -FeaturesAPI_SharedFaces::FeaturesAPI_SharedFaces(const std::shared_ptr& theFeature, +FeaturesAPI_SharedFaces::FeaturesAPI_SharedFaces( + const std::shared_ptr& theFeature, const ModelHighAPI_Selection& theobject, - const double theTransparency, + const ModelHighAPI_Integer& theTransparency, const std::string & theNameGroup) :ModelHighAPI_Interface(theFeature) { if (initialize()) { fillAttribute(theobject, myobjectselected); fillAttribute(theTransparency, mytransparency); - if (theNameGroup != "") { - fillAttribute(true, - feature()->boolean(FeaturesPlugin_SharedFaces::CREATE_GROUP_ID())); - fillAttribute(theNameGroup, mygroupname); - } + fillAttribute(theNameGroup, mygroupname); execute(); } } @@ -67,25 +63,22 @@ void FeaturesAPI_SharedFaces::dump(ModelHighAPI_Dumper& theDumper) const const std::string& aDocName = theDumper.name(aBase->document()); AttributeSelectionPtr anAttrObject; - anAttrObject = aBase->selection(FeaturesPlugin_SharedFaces::OBJECT_ID()); + anAttrObject = aBase->selection(FeaturesPlugin_GroupSharedFaces::OBJECT_ID()); theDumper << aBase << " = model.getSharedFaces(" << aDocName << ", " << anAttrObject; - theDumper << ", " << aBase->integer(FeaturesPlugin_SharedFaces::TRANSPARENCY_ID()); - - if (aBase->boolean(FeaturesPlugin_SharedFaces::CREATE_GROUP_ID())->value()) - theDumper << ", " << aBase->string(FeaturesPlugin_SharedFaces::GROUP_NAME_ID()); - + theDumper << ", " << aBase->integer(FeaturesPlugin_GroupSharedFaces::TRANSPARENCY_ID()); + theDumper << ", " << aBase->string(FeaturesPlugin_GroupSharedFaces::GROUP_NAME_ID()); theDumper << ")" << std::endl; } //================================================================================================= SharedFacesPtr getSharedFaces(const std::shared_ptr& thePart, const ModelHighAPI_Selection& theobject, - const double theTransparency, + const ModelHighAPI_Integer& theTransparency, const std::string & theNameGroup) { - FeaturePtr aFeature = thePart->addFeature(FeaturesPlugin_SharedFaces::ID()); + FeaturePtr aFeature = thePart->addFeature(FeaturesPlugin_GroupSharedFaces::ID()); SharedFacesPtr aSharedFaces; diff --git a/src/FeaturesAPI/FeaturesAPI_SharedFaces.h b/src/FeaturesAPI/FeaturesAPI_SharedFaces.h index e97f8e35f..001a1cbc3 100644 --- a/src/FeaturesAPI/FeaturesAPI_SharedFaces.h +++ b/src/FeaturesAPI/FeaturesAPI_SharedFaces.h @@ -22,8 +22,9 @@ #include "FeaturesAPI.h" -#include "FeaturesPlugin_SharedFaces.h" +#include "FeaturesPlugin_GroupSharedFaces.h" +#include #include #include @@ -45,21 +46,21 @@ public: FEATURESAPI_EXPORT explicit FeaturesAPI_SharedFaces(const std::shared_ptr& theFeature, const ModelHighAPI_Selection& theobject, - const double theTransparency, - const std::string & theNameGroup); + const ModelHighAPI_Integer& theTransparency, + const std::string & theNameGroup); /// Destructor. FEATURESAPI_EXPORT virtual ~FeaturesAPI_SharedFaces(); - INTERFACE_3(FeaturesPlugin_SharedFaces::ID(), - objectselected, FeaturesPlugin_SharedFaces::OBJECT_ID(), + INTERFACE_3(FeaturesPlugin_GroupSharedFaces::ID(), + objectselected, FeaturesPlugin_GroupSharedFaces::OBJECT_ID(), ModelAPI_AttributeSelection, /** object selected*/, - transparency, FeaturesPlugin_SharedFaces::TRANSPARENCY_ID(), + transparency, FeaturesPlugin_GroupSharedFaces::TRANSPARENCY_ID(), ModelAPI_AttributeInteger, /** transparency*/, - groupname, FeaturesPlugin_SharedFaces::GROUP_NAME_ID(), + groupname, FeaturesPlugin_GroupSharedFaces::GROUP_NAME_ID(), ModelAPI_AttributeString, /** group name*/) @@ -79,7 +80,7 @@ typedef std::shared_ptr SharedFacesPtr; FEATURESAPI_EXPORT SharedFacesPtr getSharedFaces(const std::shared_ptr& thePart, const ModelHighAPI_Selection& theObject, - const double theTransparency = 0.0, - const std::string & theNameGroup = ""); + const ModelHighAPI_Integer& theTransparency, + const std::string & theNameGroup); #endif // FeaturesAPI_SharedFaces_H_ diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index 3ab09b9b5..c94d57e7d 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -24,7 +24,6 @@ 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 @@ -71,6 +70,8 @@ SET(PROJECT_HEADERS FeaturesPlugin_Fillet1D.h FeaturesPlugin_Measurement.h FeaturesPlugin_SharedFaces.h + FeaturesPlugin_CommonSharedFaces.h + FeaturesPlugin_GroupSharedFaces.h FeaturesPlugin_FusionFaces.h FeaturesPlugin_RemoveResults.h FeaturesPlugin_Chamfer.h @@ -120,6 +121,8 @@ SET(PROJECT_SOURCES FeaturesPlugin_Fillet1D.cpp FeaturesPlugin_Measurement.cpp FeaturesPlugin_SharedFaces.cpp + FeaturesPlugin_CommonSharedFaces.cpp + FeaturesPlugin_GroupSharedFaces.cpp FeaturesPlugin_FusionFaces.cpp FeaturesPlugin_RemoveResults.cpp FeaturesPlugin_Chamfer.cpp @@ -158,7 +161,8 @@ SET(XML_RESOURCES fillet_widget.xml fillet1d_widget.xml measurement_widget.xml - sharedFaces_widget.xml + shared_Faces_widget.xml + shared_Faces_macro_widget.xml fusion_faces_widget.xml chamfer_widget.xml copy_widget.xml diff --git a/src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.cpp b/src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.cpp new file mode 100644 index 000000000..0cd9bc0df --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.cpp @@ -0,0 +1,122 @@ +// 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_CommonSharedFaces.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include + + +//================================================================================================= +void FeaturesPlugin_CommonSharedFaces::updateFaces() +{ + AttributeSelectionPtr ancompSolidAttr = + std::dynamic_pointer_cast(attributObject()); + + AttributeSelectionListPtr aFacesListAttr = + std::dynamic_pointer_cast + (attributListFaces()); + + if (aFacesListAttr->isInitialized()) + aFacesListAttr->clear(); + + GeomShapePtr aShape = ancompSolidAttr->value(); + if (aShape.get() && ancompSolidAttr->context().get()) { + + aShape = ancompSolidAttr->context()->shape(); + if (aShape) { + std::string anError; + ListOfShape aFaces; + ListOfShape theShapes; + + theShapes.push_back(aShape); + if (!GetSharedFaces(theShapes, + aFaces, + false, + anError)) + setError("Error in GetSharedFaces calculation :" + anError); + + aFacesListAttr->setSelectionType("face"); + + ListOfShape::const_iterator anIt = aFaces.cbegin(); + for(; anIt != aFaces.cend(); ++anIt) { + + GeomShapePtr aFacePtr = *anIt; + + if (!aFacePtr.get()) { + setError("GetSharedFaces : An invalid face found " + anError); + } + aFacesListAttr->append( ancompSolidAttr->context(), aFacePtr); + } + std::stringstream alabel; + alabel << "Number of shared faces : " << aFacesListAttr->size(); + AttributeStringPtr aNumberFacesAttr = + std::dynamic_pointer_cast + (attributNumberFaces()); + aNumberFacesAttr->setValue( alabel.str() ); + + } + } +} + +//================================================================================================= +void FeaturesPlugin_CommonSharedFaces::setFacesGroup(const std::wstring& theName ) +{ + std::vector aColor; + ResultGroupPtr aGroup = document()->createGroup(data()); + // clean the result of the operation + aGroup->data()->setName(theName); + aGroup->store(GeomShapePtr()); + + // shapes containing in group + ListOfShape aFaces; + AttributeSelectionListPtr aFacesListAttr = + std::dynamic_pointer_cast + (attributListFaces()); + + for (int anI =0; anI< aFacesListAttr->size(); anI++) { + AttributeSelectionPtr aAtt = aFacesListAttr->value(anI); + aFaces.push_back( aAtt->value() ); + } + GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces); + + aGroup->store(aCompound); + aColor = {255,0,0}; + setResult(aGroup); + ModelAPI_Tools::setColor( lastResult(),aColor); +} + diff --git a/src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.h b/src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.h new file mode 100644 index 000000000..dabe7c706 --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_CommonSharedFaces.h @@ -0,0 +1,63 @@ +// 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_CommonSharedFaces_H_ +#define FeaturesPlugin_CommonSharedFaces_H_ + +#include "FeaturesPlugin.h" +#include +#include +#include + +#include +#include + + +/// \class FeaturesPlugin_CommonSharedFaces +/// \ingroup Plugins +/// \brief Feature to check the shared faces of solid + +class FeaturesPlugin_CommonSharedFaces : public ModelAPI_Feature +{ +public: + + /// Performs the algorithm and stores results it in the data structure. + FEATURESPLUGIN_EXPORT virtual void execute(){}; + + /// Return Attribut values of result. + virtual AttributePtr attributObject() = 0; + + /// Return Attribut values of result. + virtual AttributePtr attributListFaces() = 0; + + /// Return Attribut values of result. + virtual AttributePtr attributNumberFaces() = 0; + + protected: + FeaturesPlugin_CommonSharedFaces() {} + + //Set group of faces + void setFacesGroup(const std::wstring& theName ); + + // Update the list of faces + void updateFaces(); + +}; + +#endif diff --git a/src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.cpp b/src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.cpp new file mode 100644 index 000000000..53b576e1f --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.cpp @@ -0,0 +1,125 @@ +// 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_GroupSharedFaces.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +//================================================================================================= +FeaturesPlugin_GroupSharedFaces::FeaturesPlugin_GroupSharedFaces() +{ +} + +//================================================================================================= +void FeaturesPlugin_GroupSharedFaces::initAttributes() +{ + // attribute for object selected + data()->addAttribute(OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + AttributeSelectionListPtr aList = std::dynamic_pointer_cast( + data()->addAttribute(LIST_FACES_ID(), ModelAPI_AttributeSelectionList::typeId())); + + data()->addAttribute(NUMBER_FACES_ID(), ModelAPI_AttributeString::typeId()); + data()->addAttribute(TRANSPARENCY_ID(), ModelAPI_AttributeInteger::typeId()); + data()->addAttribute(GROUP_NAME_ID(), ModelAPI_AttributeString::typeId()); + +} + + +//================================================================================================= +AttributePtr FeaturesPlugin_GroupSharedFaces::attributObject() +{ + return attribute(OBJECT_ID()); +} + +//================================================================================================= +AttributePtr FeaturesPlugin_GroupSharedFaces::attributListFaces() +{ + return attribute(LIST_FACES_ID()); +} + +//================================================================================================= +AttributePtr FeaturesPlugin_GroupSharedFaces::attributNumberFaces() +{ + return attribute(NUMBER_FACES_ID()); +} + +//================================================================================================= +void FeaturesPlugin_GroupSharedFaces::execute() +{ + if ( selectionList(LIST_FACES_ID())->isInitialized() + && string(GROUP_NAME_ID())->value() != "") { + AttributeStringPtr aNameAtt = string( GROUP_NAME_ID() ) ; + std::wstring aNameFace = aNameAtt->isUValue() ? + Locale::Convert::toWString(aNameAtt->valueU()) : + Locale::Convert::toWString(aNameAtt->value()); + + if (lastResult().get()) + eraseResultFromList(lastResult()); + setFacesGroup(aNameFace); + + } else { + if (lastResult().get()) { + eraseResultFromList(lastResult()); + } + + } + if (selection(OBJECT_ID())->isInitialized()) { + AttributeSelectionPtr ancompSolidAttr = selection(OBJECT_ID()); + ResultPtr aResult = ancompSolidAttr->context(); + + double aTranparency = integer(TRANSPARENCY_ID())->value()/100.0; + ModelAPI_Tools::setTransparency(aResult, aTranparency); + + ResultBodyPtr aResultBody = std::dynamic_pointer_cast(aResult); + std::list allRes; + ModelAPI_Tools::allSubs(aResultBody, allRes); + std::list::iterator aRes; + for(aRes = allRes.begin(); aRes != allRes.end(); aRes++) { + ModelAPI_Tools::setTransparency(*aRes, aTranparency); + } + } +} + +//================================================================================================= +void FeaturesPlugin_GroupSharedFaces::attributeChanged(const std::string& theID) +{ + if (theID == OBJECT_ID()) { + updateFaces(); + } +} \ No newline at end of file diff --git a/src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.h b/src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.h new file mode 100644 index 000000000..ff7273ec4 --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_GroupSharedFaces.h @@ -0,0 +1,105 @@ +// 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_GroupSharedFaces_H_ +#define FeaturesPlugin_GroupSharedFaces_H_ + +#include + +/// \class FeaturesPlugin_GroupSharedFaces +/// \ingroup Plugins +/// \brief Feature to check the shared faces of solid + +class FeaturesPlugin_GroupSharedFaces : public FeaturesPlugin_CommonSharedFaces +{ +public: + inline static const std::string& ID() + { + static const std::string MY_ID("Shared_faces"); + 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_ID() + { + static const std::string MY_OBJECT_ID("main_object"); + return MY_OBJECT_ID; + } + + /// Attribute name for number of faces. + inline static const std::string& NUMBER_FACES_ID() + { + static const std::string MY_NUMBER_FACES_ID("number_shared_faces"); + return MY_NUMBER_FACES_ID; + } + + /// Attribute name for z coodinate. + inline static const std::string& LIST_FACES_ID() + { + static const std::string MY_LIST_FACES_ID("faces"); + return MY_LIST_FACES_ID; + } + + /// Attribute name for transparency. + inline static const std::string& TRANSPARENCY_ID() + { + static const std::string MY_TRANSPARENCY_ID("transparency"); + return MY_TRANSPARENCY_ID; + } + + /// Attribute name for group name. + inline static const std::string& GROUP_NAME_ID() + { + static const std::string MY_GROUP_NAME_ID("group_name"); + return MY_GROUP_NAME_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); + + /// Use plugin manager for features creation + FeaturesPlugin_GroupSharedFaces(); + + private: + + /// Return Attribut values of object. + virtual AttributePtr attributObject(); + + /// Return Attribut values of list of faces. + virtual AttributePtr attributListFaces(); + + /// Return Attribut values of number of faces. + virtual AttributePtr attributNumberFaces(); + +}; + +#endif diff --git a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp index 7f6ef48f3..7926794c4 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -190,6 +191,8 @@ FeaturePtr FeaturesPlugin_Plugin::createFeature(std::string theFeatureID) return FeaturePtr(new FeaturesPlugin_Measurement); } else if (theFeatureID == FeaturesPlugin_SharedFaces::ID()) { return FeaturePtr(new FeaturesPlugin_SharedFaces); + } else if (theFeatureID == FeaturesPlugin_GroupSharedFaces::ID()) { + return FeaturePtr(new FeaturesPlugin_GroupSharedFaces); } else if (theFeatureID == FeaturesPlugin_RemoveResults::ID()) { return FeaturePtr(new FeaturesPlugin_RemoveResults); } else if (theFeatureID == FeaturesPlugin_Chamfer::ID()) { diff --git a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp index 718b16356..e80ecf1a3 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp @@ -19,6 +19,7 @@ #include "FeaturesPlugin_SharedFaces.h" +#include #include #include #include @@ -63,28 +64,59 @@ void FeaturesPlugin_SharedFaces::initAttributes() ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), GROUP_NAME_ID()); } + +//================================================================================================= +AttributePtr FeaturesPlugin_SharedFaces::attributObject() +{ + return attribute(OBJECT_ID()); +} + +//================================================================================================= +AttributePtr FeaturesPlugin_SharedFaces::attributListFaces() +{ + return attribute(LIST_FACES_ID()); +} + +//================================================================================================= +AttributePtr FeaturesPlugin_SharedFaces::attributNumberFaces() +{ + return attribute(NUMBER_FACES_ID()); +} + //================================================================================================= void FeaturesPlugin_SharedFaces::execute() { - if (boolean(CREATE_GROUP_ID())->value() - && selectionList(LIST_FACES_ID())->isInitialized() - && string(GROUP_NAME_ID())->value() != "") { - AttributeStringPtr aNameAtt = string( GROUP_NAME_ID() ) ; - std::wstring aNameFace = aNameAtt->isUValue() ? - Locale::Convert::toWString(aNameAtt->valueU()) : - Locale::Convert::toWString(aNameAtt->value()); - - if (myGroup.get()) - eraseResults(); - setFacesGroup(aNameFace); + if (boolean(CREATE_GROUP_ID())->value()) { - } else { - if (myGroup.get()) { - eraseResults(); - myGroup.reset(); + if ( string(GROUP_NAME_ID())->value() != "" + && selectionList(LIST_FACES_ID())->isInitialized()) { + + if (lastResult().get()) { + eraseResultFromList(lastResult()); + } + + if (!myCreateGroupFeature.get()) + createGroup(); + updateGroup(); } + } else { + if (selectionList(LIST_FACES_ID())->isInitialized()) { + + if (myCreateGroupFeature.get()) { + myCreateGroupFeature->eraseResults(); + SessionPtr aSession = ModelAPI_Session::get(); + DocumentPtr aDoc = aSession->activeDocument(); + aDoc->removeFeature(myCreateGroupFeature); + myCreateGroupFeature.reset(); + } + + if (lastResult().get()) + eraseResultFromList(lastResult()); + setFacesGroup(L"Group_SharedFaces"); + } } + if (selection(OBJECT_ID())->isInitialized()) { AttributeSelectionPtr ancompSolidAttr = selection(OBJECT_ID()); ResultPtr aResult = ancompSolidAttr->context(); @@ -106,76 +138,38 @@ void FeaturesPlugin_SharedFaces::execute() void FeaturesPlugin_SharedFaces::attributeChanged(const std::string& theID) { if (theID == OBJECT_ID()) { - AttributeSelectionPtr ancompSolidAttr = selection(OBJECT_ID()); - - GeomShapePtr aShape = ancompSolidAttr->value(); - if (aShape.get() && ancompSolidAttr->context().get()) { - - aShape = ancompSolidAttr->context()->shape(); - if (aShape) { - std::string anError; - ListOfShape aFaces; - ListOfShape theShapes; - - theShapes.push_back(aShape); - if (!GetSharedFaces(theShapes, - aFaces, - false, - anError)) - setError("Error in GetSharedFaces calculation :" + anError); - - AttributeSelectionListPtr aFacesListAttr = - std::dynamic_pointer_cast - (attribute(LIST_FACES_ID())); - - if (aFacesListAttr->isInitialized()) - aFacesListAttr->clear(); - aFacesListAttr->setSelectionType("face"); + updateFaces(); + if (myCreateGroupFeature.get()) + updateGroup(); + } +} - ListOfShape::const_iterator anIt = aFaces.cbegin(); - for(; anIt != aFaces.cend(); ++anIt) { - GeomShapePtr aFacePtr = *anIt; +//================================================================================================= +void FeaturesPlugin_SharedFaces::createGroup() +{ + SessionPtr aSession = ModelAPI_Session::get(); - if (!aFacePtr.get()) { - setError("GetSharedFaces : An invalid face found " + anError); - } - aFacesListAttr->append( ancompSolidAttr->context(), aFacePtr); - } - std::stringstream alabel; - alabel << "Number of shared faces : " << aFacesListAttr->size(); - string(NUMBER_FACES_ID() )->setValue( alabel.str() ); + DocumentPtr aDoc = aSession->activeDocument(); - } - } + if (aDoc.get()) { + myCreateGroupFeature = aDoc->addFeature(FeaturesPlugin_GroupSharedFaces::ID()); } } //================================================================================================= -void FeaturesPlugin_SharedFaces::setFacesGroup(const std::wstring& theName ) +void FeaturesPlugin_SharedFaces::updateGroup() { - std::vector aColor; - myGroup = document()->createGroup(data()); - // clean the result of the operation - myGroup->data()->setName(theName); - myGroup->store(GeomShapePtr()); - - // shapes containing in group - ListOfShape aFaces; - AttributeSelectionListPtr aFacesListAttr = - std::dynamic_pointer_cast - (attribute(LIST_FACES_ID())); - - for (int anI =0; anI< aFacesListAttr->size(); anI++) { - AttributeSelectionPtr aAtt = aFacesListAttr->value(anI); - aFaces.push_back( aAtt->value() ); - } - GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces); - myGroup->store(aCompound); - aColor = {255,0,0}; - setResult(myGroup); - ModelAPI_Tools::setColor( lastResult(),aColor); + myCreateGroupFeature->string(FeaturesPlugin_GroupSharedFaces::GROUP_NAME_ID()) + ->setValue( string(GROUP_NAME_ID())->value()); -} + myCreateGroupFeature->selection(FeaturesPlugin_GroupSharedFaces::OBJECT_ID()) + ->setValue( selection(OBJECT_ID())->context() , + selection(OBJECT_ID())->value() ); + + myCreateGroupFeature->integer(FeaturesPlugin_GroupSharedFaces::TRANSPARENCY_ID()) + ->setValue( integer(TRANSPARENCY_ID())->value()); + myCreateGroupFeature->execute(); +} \ No newline at end of file diff --git a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h index 7c865445e..995ef7790 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h +++ b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h @@ -20,24 +20,18 @@ #ifndef FeaturesPlugin_SharedFaces_H_ #define FeaturesPlugin_SharedFaces_H_ -#include "FeaturesPlugin.h" -#include -#include - -#include -#include -#include +#include /// \class FeaturesPlugin_SharedFaces /// \ingroup Plugins /// \brief Feature to check the shared faces of solid -class FeaturesPlugin_SharedFaces : public ModelAPI_Feature +class FeaturesPlugin_SharedFaces : public FeaturesPlugin_CommonSharedFaces { public: inline static const std::string& ID() { - static const std::string MY_ID("Shared_faces"); + static const std::string MY_ID("Shared_faces_macro"); return MY_ID; } @@ -99,15 +93,32 @@ public: /// \param theID identifier of changed attribute FEATURESPLUGIN_EXPORT virtual void attributeChanged(const std::string& theID); + /// Reimplemented from ModelAPI_Feature::isMacro(). Returns true. + FEATURESPLUGIN_EXPORT virtual bool isMacro() const { return true; } + /// Use plugin manager for features creation FeaturesPlugin_SharedFaces(); private: - //Set group of faces - void setFacesGroup(const std::wstring& theName ); + /// Return Attribut values of object. + virtual AttributePtr attributObject(); + + /// Return Attribut values of list of faces. + virtual AttributePtr attributListFaces(); + + /// Return Attribut values of number of faces. + virtual AttributePtr attributNumberFaces(); + + /// Create group + void createGroup(); + + /// Update group + void updateGroup(); + + /// Feature to create group + FeaturePtr myCreateGroupFeature; - ResultGroupPtr myGroup; }; #endif diff --git a/src/FeaturesPlugin/plugin-Features.xml b/src/FeaturesPlugin/plugin-Features.xml index 0d01b0659..808e7b9b3 100644 --- a/src/FeaturesPlugin/plugin-Features.xml +++ b/src/FeaturesPlugin/plugin-Features.xml @@ -179,9 +179,13 @@ - - + + + + diff --git a/src/FeaturesPlugin/shared_Faces_macro_widget.xml b/src/FeaturesPlugin/shared_Faces_macro_widget.xml new file mode 100644 index 000000000..960c960c6 --- /dev/null +++ b/src/FeaturesPlugin/shared_Faces_macro_widget.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + diff --git a/src/FeaturesPlugin/shared_Faces_widget.xml b/src/FeaturesPlugin/shared_Faces_widget.xml new file mode 100644 index 000000000..97d8b7d7b --- /dev/null +++ b/src/FeaturesPlugin/shared_Faces_widget.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + -- 2.39.2