]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Provide On Plane filter and reading of validators for filters GUI definition
authorvsv <vsv@opencascade.com>
Fri, 7 Jun 2019 08:34:03 +0000 (11:34 +0300)
committervsv <vsv@opencascade.com>
Fri, 7 Jun 2019 08:34:03 +0000 (11:34 +0300)
15 files changed:
src/Config/Config_Common.cpp
src/Config/Config_Keywords.h
src/Config/Config_ValidatorReader.cpp
src/Config/Config_ValidatorReader.h
src/Config/Config_XMLReader.cpp
src/Config/Config_XMLReader.h
src/FiltersPlugin/CMakeLists.txt
src/FiltersPlugin/FiltersPlugin_BelongsTo.cpp
src/FiltersPlugin/FiltersPlugin_BelongsTo.h
src/FiltersPlugin/FiltersPlugin_OnPlane.cpp [new file with mode: 0644]
src/FiltersPlugin/FiltersPlugin_OnPlane.h [new file with mode: 0644]
src/FiltersPlugin/FiltersPlugin_Plugin.cpp
src/FiltersPlugin/FiltersPlugin_VerticalFace.cpp
src/GeomValidators/GeomValidators_ShapeType.cpp
src/ModuleBase/ModuleBase_WidgetSelectionFilter.cpp

index b071546e64e99522a194ce8d1822194373c5a40d..33abc6a3e72141a959261957ce50d85f209224fe 100644 (file)
@@ -86,7 +86,7 @@ bool isWidgetNode(xmlNodePtr theNode)
     return false;
   // it's parent is "feature" or "source" or a page ("box", "case")
   if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, WDG_GROUP, WDG_OPTIONALBOX,
-    WDG_TOOLBOX_BOX, WDG_RADIOBOX_ITEM, WDG_SWITCH_CASE, NULL))
+    WDG_TOOLBOX_BOX, WDG_RADIOBOX_ITEM, WDG_SWITCH_CASE, WDG_FILTER, NULL))
     return false;
 
   //it should not be a "source" or a "validator" node
index ff7ee5c75da7acecbb48fa3d67f02b44a658c0fc..0a8f4aba4f06bbc7a154385ca958a818146a6951 100644 (file)
@@ -63,6 +63,8 @@ const static char* WDG_RADIOBOX_ITEM = "radio";
 const static char* WDG_TOOLBOX_BOX = "box";
 const static char* WDG_SWITCH = "switch";
 const static char* WDG_SWITCH_CASE = "case";
+const static char* WDG_FILTER = "filter";
+
 // Common properties (xml attributes of nodes)
 const static char* _ID = "id";
 // NODE_WORKBENCH properties
index e6b802a59efce057518a2c97b903e1494ca68cc6..ffa0256128d99a50c51849e818a1b64e38cfc5cc 100644 (file)
@@ -33,8 +33,8 @@
 #include <iostream>
 #endif
 
-Config_ValidatorReader::Config_ValidatorReader(const std::string& theXmlFileName)
-: Config_XMLReader(theXmlFileName)
+Config_ValidatorReader::Config_ValidatorReader(const std::string& theXmlFileName, bool isXMLContent)
+: Config_XMLReader(theXmlFileName, isXMLContent)
 {
 }
 
@@ -85,6 +85,8 @@ void Config_ValidatorReader::processValidator(xmlNodePtr theNode)
   aMessage->setValidatorId(aValidatorId);
   aMessage->setValidatorParameters(aParameters);
   std::string aFeatureId = restoreAttribute(NODE_FEATURE, _ID);
+  if (aFeatureId.length() == 0)
+    aFeatureId = myExtFeatureId;
   aMessage->setFeatureId(aFeatureId);
   // parent is attribute (widget)
   if (!myCurrentWidget.empty()) {
index d4cdd39407069f4719e9fc8bd500c0718f1fd639..dac03e09086e2990071eae7c1d60f5d0ca44d72f 100644 (file)
@@ -39,9 +39,13 @@ class Config_ValidatorReader : public Config_XMLReader
    * Constructor
    * \param theXmlFile - full path to the xml file which will be processed by the reader
    */
-  CONFIG_EXPORT Config_ValidatorReader(const std::string& theXmlFile);
+  CONFIG_EXPORT Config_ValidatorReader(const std::string& theXmlFile, bool isXMLContent = false);
   CONFIG_EXPORT virtual ~Config_ValidatorReader();
 
+
+  /// Set feature ID for cases when XML for validators is parsed from memory
+  CONFIG_EXPORT void setFeatureId(const std::string& theId) { myExtFeatureId = theId; }
+
  protected:
   /*!
    * \brief Allows to customize reader's behavior for a node. Virtual.
@@ -67,6 +71,7 @@ class Config_ValidatorReader : public Config_XMLReader
 
  private:
   std::string myCurrentWidget;
+  std::string myExtFeatureId;
 };
 
 #endif /* CONFIG_VALIDATORREADER_H_ */
index 1d7de9c6badf7991aa510e618bec1af51394e483..a47496eb88c690c7d3f3ebcfefb292cfb61c0a4b 100644 (file)
     static const char FSEP = '/';
 #endif
 
-Config_XMLReader::Config_XMLReader(const std::string& theXmlFileName)
+Config_XMLReader::Config_XMLReader(const std::string& theXmlFileName, bool isXMLContent)
     : myXmlDoc(NULL), myRootFileName(theXmlFileName)
 {
-  myDocumentPath = findConfigFile(theXmlFileName);
-  if (myDocumentPath.empty()) {
-    Events_InfoMessage("Config_XMLReader", "Unable to open %1").arg(theXmlFileName).send();
+  isFromMemory = isXMLContent;
+  if (!isXMLContent) {
+    myDocumentPath = findConfigFile(theXmlFileName);
+    if (myDocumentPath.empty()) {
+      Events_InfoMessage("Config_XMLReader", "Unable to open %1").arg(theXmlFileName).send();
+    }
   }
 }
 
@@ -157,6 +160,13 @@ std::string Config_XMLReader::findConfigFile(const std::string theFileName, cons
 
 void Config_XMLReader::readAll()
 {
+  if (isFromMemory) {
+    myXmlDoc = xmlParseMemory(myRootFileName.c_str(), myRootFileName.length());
+    xmlNodePtr aRoot = xmlDocGetRootElement(myXmlDoc);
+    readRecursively(aRoot);
+    return;
+  }
+
   // to load external modules dependencies (like GEOM for Connector Feature)
   Config_ModuleReader::loadScript("salome.shaper.initConfig", false);
 
index 13b3a8b20908c073434c53443e6ad29c0f4a4d46..ad9a2d5f5535c81d129af2ab35a9476d3cf1707e 100644 (file)
@@ -51,7 +51,7 @@ class Config_XMLReader
    * Constructor
    * \param theXmlFile - full path to the xml file which will be processed by the reader
    */
-  CONFIG_EXPORT Config_XMLReader(const std::string& theXmlFile);
+  CONFIG_EXPORT Config_XMLReader(const std::string& theXmlFile, bool isXMLContent = false);
   CONFIG_EXPORT virtual ~Config_XMLReader();
   /*!
    * Returns a path to resource files (created from ROOT_DIR environment variable)
@@ -130,6 +130,8 @@ class Config_XMLReader
   /// A map to store all parent's attributes.
   /// The key has from "Node_Name:Node_Attribute"
   std::map<std::string, std::string> myCachedAttributes;
+
+  bool isFromMemory;
 };
 
 #endif /* CONFIG_XMLREADER_H_ */
index 17303eda7fe566d63a02fb02a5dec36f975f10ec..9cb138019cc8bd89d5a5dbbf6b25010ae9710120 100644 (file)
@@ -26,6 +26,7 @@ SET(PROJECT_HEADERS
     FiltersPlugin_HorizontalFace.h
     FiltersPlugin_VerticalFace.h
        FiltersPlugin_BelongsTo.h
+       FiltersPlugin_OnPlane.h
 )
 
 SET(PROJECT_SOURCES
@@ -34,6 +35,7 @@ SET(PROJECT_SOURCES
     FiltersPlugin_HorizontalFace.cpp
     FiltersPlugin_VerticalFace.cpp
        FiltersPlugin_BelongsTo.cpp
+       FiltersPlugin_OnPlane.cpp
 )
 
 SET(PROJECT_LIBRARIES
index 45a045e0a3ee367782bad358f61b453c1560b15a..b03093e0ff05dc3454cbb66bee49878ce17ae7a5 100644 (file)
@@ -46,9 +46,9 @@ bool FiltersPlugin_BelongsTo::isOk(const GeomShapePtr& theShape,
 static std::string XMLRepresentation =
 "<filter id = \"BelongsTo\">"
 " <multi_selector id=\"BelongsTo__BelongsTo\""
-"   label = \"Objects:\""
-"   tooltip = \"Select objects to limit selection.\""
-"   type_choice = \"objects\">"
+"   label=\"Objects:\""
+"   tooltip=\"Select objects to limit selection.\""
+"   type_choice=\"objects\">"
 " </multi_selector>"
 "</filter>";
 
index f270103af3de3a1ae24aa02f2f41d6cb9d2d0c8b..7e0b6bb6ee12e1f7cf598e53240a28deb0d7d5ca 100644 (file)
@@ -24,9 +24,9 @@
 
 #include <ModelAPI_Filter.h>
 
-/**\class FiltersPlugin_HorizontalFace
+/**\class FiltersPlugin_BelongsTo
 * \ingroup DataModel
-* \brief Filter for horizontal faces only
+* \brief Filter for objects which are part of specified objects
 */
 class FiltersPlugin_BelongsTo : public ModelAPI_Filter
 {
diff --git a/src/FiltersPlugin/FiltersPlugin_OnPlane.cpp b/src/FiltersPlugin/FiltersPlugin_OnPlane.cpp
new file mode 100644 (file)
index 0000000..f2771a8
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright (C) 2014-2019  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 "FiltersPlugin_OnPlane.h"
+
+#include <ModelAPI_AttributeSelectionList.h>
+
+bool FiltersPlugin_OnPlane::isSupported(GeomAPI_Shape::ShapeType theType) const
+{
+  switch (theType) {
+  case GeomAPI_Shape::SHELL:
+  case GeomAPI_Shape::FACE:
+  case GeomAPI_Shape::WIRE:
+  case GeomAPI_Shape::EDGE:
+  case GeomAPI_Shape::VERTEX:
+    return true;
+  }
+  return false;
+}
+
+bool FiltersPlugin_OnPlane::isOk(const GeomShapePtr& theShape,
+  const ModelAPI_FiltersArgs& theArgs) const
+{
+  AttributePtr aAttr = theArgs.argument("OnPlane");
+  AttributeSelectionListPtr aList =
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aAttr);
+  if (!aList.get())
+    return false;
+  // ToDo
+  return false;
+}
+
+static std::string XMLRepresentation =
+"<filter id = \"OnPlane\">"
+" <multi_selector id=\"OnPlane__OnPlane\""
+"   label=\"Planes:\""
+"   tooltip=\"Select planes or planar faces.\""
+"   type_choice=\"faces\">"
+"   <validator id=\"GeomValidators_ShapeType\" parameters=\"plane\"/>"
+" </multi_selector>"
+"</filter>";
+
+
+std::string FiltersPlugin_OnPlane::xmlRepresentation() const
+{
+  return XMLRepresentation;
+}
+
+void FiltersPlugin_OnPlane::initAttributes(ModelAPI_FiltersArgs& theArguments)
+{
+  theArguments.initAttribute("OnPlane", ModelAPI_AttributeSelectionList::typeId());
+}
diff --git a/src/FiltersPlugin/FiltersPlugin_OnPlane.h b/src/FiltersPlugin/FiltersPlugin_OnPlane.h
new file mode 100644 (file)
index 0000000..e496d9f
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright (C) 2014-2019  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 FILTERSPLUGIN_ONPLANE_H_
+#define FILTERSPLUGIN_ONPLANE_H_
+
+#include "FiltersPlugin.h"
+
+#include <ModelAPI_Filter.h>
+
+/**\class FiltersPlugin_OnPlane
+* \ingroup DataModel
+* \brief Filter for objects which belong to selected planes
+*/
+class FiltersPlugin_OnPlane : public ModelAPI_Filter
+{
+public:
+  FiltersPlugin_OnPlane() : ModelAPI_Filter() {}
+
+  virtual const std::string& name() const {
+    static const std::string kName("On plane");
+    return kName;
+  }
+
+  /// Returns true for any type because it supports all selection types
+  virtual bool isSupported(GeomAPI_Shape::ShapeType theType) const override;
+
+  /// This method should contain the filter logic. It returns true if the given shape
+  /// is accepted by the filter.
+  /// \param theShape the given shape
+  virtual bool isOk(const GeomShapePtr& theShape,
+    const ModelAPI_FiltersArgs& theArgs) const override;
+
+  /// Returns XML string which represents GUI of the filter
+  virtual std::string xmlRepresentation() const override;
+
+  /// Initializes arguments of a filter.
+  virtual void initAttributes(ModelAPI_FiltersArgs& theArguments) override;
+};
+
+#endif
\ No newline at end of file
index d1e5f1063b7543789732837068e61faef6e009a2..92ff9b1a1676735a7c0dedaeb846baae1cbb1c5c 100644 (file)
@@ -22,6 +22,7 @@
 #include "FiltersPlugin_HorizontalFace.h"
 #include "FiltersPlugin_VerticalFace.h"
 #include "FiltersPlugin_BelongsTo.h"
+#include "FiltersPlugin_OnPlane.h"
 
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Filter.h>
@@ -37,6 +38,7 @@ FiltersPlugin_Plugin::FiltersPlugin_Plugin()
   aFactory->registerFilter("HorizontalFaces", new FiltersPlugin_HorizontalFace);
   aFactory->registerFilter("VerticalFaces", new FiltersPlugin_VerticalFace);
   aFactory->registerFilter("BelongsTo", new FiltersPlugin_BelongsTo);
+  aFactory->registerFilter("OnPlane", new FiltersPlugin_OnPlane);
 
   ModelAPI_Session::get()->registerPlugin(this);
 }
index 8af64f014a895b972e2ef8a6c7fe8171e2a05100..97235249f66144c888292877208d6bacecd3fb71 100644 (file)
@@ -21,6 +21,9 @@
 
 #include <GeomAPI_Face.h>
 #include <GeomAPI_Pln.h>
+#include <GeomAPI_Solid.h>
+#include <GeomAPI_Shell.h>
+#include <GeomAPI_Cylinder.h>
 
 bool FiltersPlugin_VerticalFace::isSupported(GeomAPI_Shape::ShapeType theType) const
 {
@@ -30,11 +33,14 @@ bool FiltersPlugin_VerticalFace::isSupported(GeomAPI_Shape::ShapeType theType) c
 bool FiltersPlugin_VerticalFace::isOk(
   const GeomShapePtr& theShape, const ModelAPI_FiltersArgs& theArgs) const
 {
-  if (!theShape->isPlanar())
+  if (!theShape->isFace())
     return false;
-  GeomFacePtr aFace(new GeomAPI_Face(theShape));
+  if (theShape->isPlanar()) {
+    GeomFacePtr aFace(new GeomAPI_Face(theShape));
 
-  GeomPlanePtr aPlane = aFace->getPlane();
-  GeomDirPtr aDir = aPlane->direction();
-  return fabs(aDir->z()) <= 1.e-7;
+    GeomPlanePtr aPlane = aFace->getPlane();
+    GeomDirPtr aDir = aPlane->direction();
+    return fabs(aDir->z()) <= 1.e-7;
+  }
+  return false;
 }
index 44d9fe27f3730a391fdfc9ba1609d46cc8084bb8..963f53c9a12cc8851eae20fac69e1af0cd8aba68 100644 (file)
@@ -293,6 +293,9 @@ bool GeomValidators_ShapeType::isValidShape(const GeomShapePtr theShape,
     case Shell:
       aValid = theShape->shapeType() == GeomAPI_Shape::SHELL;
       break;
+    case Plane:
+      aValid = theShape->isPlanar();
+      break;
     case Solid:
       aValid = theShape->isSolid() || theShape->isCompSolid() ||
                theShape->isCompoundOfSolids();
index 9f6136b7dfee2225131e979c9a77f264d6d5d59e..7eec4bec5bd699c42d788f8d7e48258c94786dc2 100644 (file)
@@ -35,6 +35,7 @@
 #include <GeomAPI_ShapeExplorer.h>
 
 #include <Events_Loop.h>
+#include <Config_ValidatorReader.h>
 
 #include <AIS_InteractiveContext.hxx>
 #include <StdSelect_BRepOwner.hxx>
@@ -144,6 +145,10 @@ ModuleBase_FilterItem::ModuleBase_FilterItem(
     addItemRow(this);
   else {
     ModuleBase_WidgetFactory aFactory(aXmlString, theParent->workshop());
+    Config_ValidatorReader aValidatorReader(aXmlString, true);
+    aValidatorReader.setFeatureId(mySelection->getKind());
+    aValidatorReader.readAll();
+
     QVBoxLayout* aLayout = new QVBoxLayout(this);
     ModuleBase_Tools::zeroMargins(aLayout);
 
@@ -208,7 +213,7 @@ void ModuleBase_FilterItem::onDelete()
   emit deleteItem(this);
 }
 
-QList<QWidget*>  ModuleBase_FilterItem::getControls() const
+QList<QWidget*> ModuleBase_FilterItem::getControls() const
 {
   QList<QWidget*> aWidgetsList;
   foreach(ModuleBase_ModelWidget* aWgt, myWidgets) {
@@ -221,7 +226,6 @@ QList<QWidget*>  ModuleBase_FilterItem::getControls() const
 }
 
 
-
 //*****************************************************************************
 //*****************************************************************************
 //*****************************************************************************