From 1be6afdf88358a1f6823078e65e7d42574c10b8b Mon Sep 17 00:00:00 2001 From: dbv Date: Tue, 19 Apr 2016 16:41:52 +0300 Subject: [PATCH] Issue #1369: Feature "Edge" for Build plug-in --- src/BuildPlugin/BuildPlugin_Edge.cpp | 82 +++++++++++++++++++++ src/BuildPlugin/BuildPlugin_Edge.h | 51 +++++++++++++ src/BuildPlugin/BuildPlugin_Plugin.cpp | 3 + src/BuildPlugin/BuildPlugin_Validators.cpp | 18 ++--- src/BuildPlugin/CMakeLists.txt | 3 + src/BuildPlugin/edge_widget.xml | 10 +++ src/BuildPlugin/icons/feature_edge.png | Bin 0 -> 284 bytes src/BuildPlugin/plugin-Build.xml | 3 + 8 files changed, 161 insertions(+), 9 deletions(-) create mode 100644 src/BuildPlugin/BuildPlugin_Edge.cpp create mode 100644 src/BuildPlugin/BuildPlugin_Edge.h create mode 100644 src/BuildPlugin/edge_widget.xml create mode 100644 src/BuildPlugin/icons/feature_edge.png diff --git a/src/BuildPlugin/BuildPlugin_Edge.cpp b/src/BuildPlugin/BuildPlugin_Edge.cpp new file mode 100644 index 000000000..0ae8accdd --- /dev/null +++ b/src/BuildPlugin/BuildPlugin_Edge.cpp @@ -0,0 +1,82 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: BuildPlugin_Edge.cpp +// Created: 18 April 2016 +// Author: Dmitry Bobylev + +#include "BuildPlugin_Edge.h" + +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include + +//================================================================================================= +BuildPlugin_Edge::BuildPlugin_Edge() +{ +} + +//================================================================================================= +void BuildPlugin_Edge::initAttributes() +{ + data()->addAttribute(BASE_OBJECTS_ID(), ModelAPI_AttributeSelectionList::typeId()); +} + +//================================================================================================= +void BuildPlugin_Edge::execute() +{ + // Get base objects list. + AttributeSelectionListPtr aSelectionList = selectionList(BASE_OBJECTS_ID()); + if(!aSelectionList.get()) { + setError("Error: Could not get selection list."); + return; + } + if(aSelectionList->size() == 0) { + setError("Error: Empty selection list."); + return; + } + + // Collect base shapes. + ListOfShape aListOfShapes; + int aResultIndex = 0; + for(int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) { + AttributeSelectionPtr aSelection = aSelectionList->value(anIndex); + GeomShapePtr aShape = aSelection->value(); + if(!aShape.get()) { + ResultPtr aContext = aSelection->context(); + if(!aContext.get()) { + setError("Error: Attribute has empty context."); + return; + } + + aShape = aContext->shape(); + } + if(!aShape.get()) { + setError("Error: Empty shape selected."); + return; + } + + if(aShape->shapeType() != GeomAPI_Shape::EDGE) { + setError("Error: Selected shape has wrong type. Only edges acceptable."); + return; + } + + // Store result. + ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); + aResultBody->store(aShape); + setResult(aResultBody, aResultIndex); + ++aResultIndex; + } + + removeResults(aResultIndex); +} diff --git a/src/BuildPlugin/BuildPlugin_Edge.h b/src/BuildPlugin/BuildPlugin_Edge.h new file mode 100644 index 000000000..bbe34674a --- /dev/null +++ b/src/BuildPlugin/BuildPlugin_Edge.h @@ -0,0 +1,51 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: BuildPlugin_Edge.h +// Created: 18 April 2016 +// Author: Dmitry Bobylev + +#ifndef BuildPlugin_Edge_H_ +#define BuildPlugin_Edge_H_ + +#include "BuildPlugin.h" + +#include + +/// \class BuildPlugin_Edge +/// \ingroup Plugins +/// \brief Feature for creation of edge from sketch edge or existing edges. +class BuildPlugin_Edge: public ModelAPI_Feature +{ +public: + /// Use plugin manager for features creation + BuildPlugin_Edge(); + + /// Feature kind. + inline static const std::string& ID() + { + static const std::string MY_ID("Edge"); + return MY_ID; + } + + /// Attribute name of base objects. + inline static const std::string& BASE_OBJECTS_ID() + { + static const std::string MY_BASE_OBJECTS_ID("base_objects"); + return MY_BASE_OBJECTS_ID; + } + + /// \return the kind of a feature. + BUILDPLUGIN_EXPORT virtual const std::string& getKind() + { + static std::string MY_KIND = BuildPlugin_Edge::ID(); + return MY_KIND; + } + + /// Request for initialization of data model of the feature: adding all attributes. + BUILDPLUGIN_EXPORT virtual void initAttributes(); + + /// Creates a new part document if needed. + BUILDPLUGIN_EXPORT virtual void execute(); +}; + +#endif diff --git a/src/BuildPlugin/BuildPlugin_Plugin.cpp b/src/BuildPlugin/BuildPlugin_Plugin.cpp index 3433f3b9e..f26c60ace 100644 --- a/src/BuildPlugin/BuildPlugin_Plugin.cpp +++ b/src/BuildPlugin/BuildPlugin_Plugin.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -36,6 +37,8 @@ FeaturePtr BuildPlugin_Plugin::createFeature(std::string theFeatureID) { if(theFeatureID == BuildPlugin_Vertex::ID()) { return FeaturePtr(new BuildPlugin_Vertex()); + } else if(theFeatureID == BuildPlugin_Edge::ID()) { + return FeaturePtr(new BuildPlugin_Edge()); } else if(theFeatureID == BuildPlugin_Wire::ID()) { return FeaturePtr(new BuildPlugin_Wire()); } diff --git a/src/BuildPlugin/BuildPlugin_Validators.cpp b/src/BuildPlugin/BuildPlugin_Validators.cpp index 7706fe77a..9aa7c8acd 100644 --- a/src/BuildPlugin/BuildPlugin_Validators.cpp +++ b/src/BuildPlugin/BuildPlugin_Validators.cpp @@ -76,17 +76,17 @@ bool BuildPlugin_ValidatorBaseForBuild::isValid(const AttributePtr& theAttribute } std::shared_ptr anEdges = std::dynamic_pointer_cast(aContextShape); - if(anEdges.get() && !aShape->isEqual(aContextShape)) { - // It is local selection on sketch. Ok. - return true; + if(anEdges.get()) { + if(aShape->isEqual(aContextShape)) { + // It is whole sketch. + return false; + } + } else if(!aShape->isEqual(aContextShape)) { + // Local selection on body does not allowed. + theError = "Selected shape is in the local selection. Only global selection is allowed."; + return false; } } - - if(!aShape->isEqual(aContextShape)) { - // Local selection on body does not allowed. - theError = "Selected shape is in the local selection. Only global selection is allowed."; - return false; - } } return true; diff --git a/src/BuildPlugin/CMakeLists.txt b/src/BuildPlugin/CMakeLists.txt index 39e728f77..3c159e8d6 100644 --- a/src/BuildPlugin/CMakeLists.txt +++ b/src/BuildPlugin/CMakeLists.txt @@ -15,6 +15,7 @@ SET(PROJECT_HEADERS BuildPlugin.h BuildPlugin_Plugin.h BuildPlugin_Vertex.h + BuildPlugin_Edge.h BuildPlugin_Wire.h BuildPlugin_Validators.h ) @@ -22,6 +23,7 @@ SET(PROJECT_HEADERS SET(PROJECT_SOURCES BuildPlugin_Plugin.cpp BuildPlugin_Vertex.cpp + BuildPlugin_Edge.cpp BuildPlugin_Wire.cpp BuildPlugin_Validators.cpp ) @@ -29,6 +31,7 @@ SET(PROJECT_SOURCES SET(XML_RESOURCES plugin-Build.xml vertex_widget.xml + edge_widget.xml wire_widget.xml ) diff --git a/src/BuildPlugin/edge_widget.xml b/src/BuildPlugin/edge_widget.xml new file mode 100644 index 000000000..e02f2721e --- /dev/null +++ b/src/BuildPlugin/edge_widget.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/src/BuildPlugin/icons/feature_edge.png b/src/BuildPlugin/icons/feature_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..4970612868bbc3266c743328c7357307d98bda2e GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=fts&@Fyn;$$~izmi4xa{lHmNblJdl&REC1Y%)Ao4ywnl}6Fmbx zvp+q__kn79JzX3_Ec~ZVy35&Mz|&&gaQ=}4--WrYO~Mu)>>Zpcm*#Vu@yl;Le%D>z z=l4wQV#6gdE>pq;4<BVkI;iXMSR+rMdtCcQhfSXpak(+ZY0 zK~A35(32ut)_CmVe&l~?s%^uP8|E?!J8Zn397*Mu>#>*Ct9lXeLuJDYMP}JmD%ZtN XJTD2oy=8?U&|wUou6{1-oD!M + + + -- 2.39.2