]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Merge branch 'Dev_1.1.0' of newgeom:newgeom into Dev_1.1.0
authornds <natalia.donis@opencascade.com>
Fri, 27 Mar 2015 07:38:37 +0000 (10:38 +0300)
committernds <natalia.donis@opencascade.com>
Fri, 27 Mar 2015 07:38:37 +0000 (10:38 +0300)
Conflicts:
src/SketchPlugin/SketchPlugin_Validators.cpp

src/Config/Config_Common.cpp
src/Config/Config_Common.h
src/Config/Config_Keywords.h
src/Config/Config_ValidatorReader.cpp
src/Config/Config_ValidatorReader.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Validators.cpp
src/PartSet/PartSet_Validators.h
src/PartSet/icons/tangent.png
src/SketchPlugin/SketchPlugin_Plugin.cpp
src/SketchPlugin/plugin-Sketch.xml

index 8ffc9e126b6938135b3cde07239281aae9969115..8c8cde4270d7a27265c77d29be1c0f0e68fbdaf0 100644 (file)
@@ -69,7 +69,7 @@ bool isWidgetNode(xmlNodePtr theNode)
 {\r
   if(!isElementNode(theNode))\r
     return false;\r
-  // it's parent is "feature" or "source"\r
+  // it's parent is "feature" or "source" or a page ("box", "case")\r
   if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, \r
                          WDG_TOOLBOX_BOX, WDG_SWITCH_CASE, NULL))\r
     return false;\r
index 52fc1e1726fa0adbfedd95f72a7f3a930995c362..1850f8a7bd642373ed74ebdc4d262b443403410a 100644 (file)
@@ -43,6 +43,8 @@ CONFIG_EXPORT bool isElementNode(xmlNodePtr theNode);
  */
 CONFIG_EXPORT bool isNode(xmlNodePtr theNode, const char* theNodeName, ...);
 
+//#define isNode(p) _isNode(p, NULL)
+
 /*!
  * Checks if the given node is attribute node.
  * Attribute node represents a widget, that is able to store/restore
index afb80188ba9ec666a6163136b8c751095a2f8149..bc115a764f1ee1e1f5603126505031e3be70452f 100644 (file)
@@ -19,6 +19,7 @@ const static char* NODE_FEATURE = "feature";
 const static char* NODE_SOURCE = "source";
 const static char* NODE_VALIDATOR = "validator";
 const static char* NODE_SELFILTER = "selection_filter";
+const static char* NODE_XMLPARENT = "libxml_parent";
 
 // Widgets
 const static char* WDG_INFO = "label";
index d03dff58d7d6784c5bc572fd25639a5dad93c1bc..ef969cd55c06483042d92b18588ae955ac454025 100644 (file)
@@ -42,11 +42,26 @@ void Config_ValidatorReader::processNode(xmlNodePtr theNode)
     processSelectionFilter(theNode);
   } else if (isNode(theNode, NODE_FEATURE, NULL)) {
     storeAttribute(theNode, _ID);
+  } else if (isWidgetNode(theNode)) {
+    storeAttribute(theNode, _ID);
+    // Store widget name to restore it's id on validator/selector processing
+    myCurrentWidget = getNodeName(theNode);
   }
   //Process SOURCE nodes.
   Config_XMLReader::processNode(theNode);
 }
 
+void Config_ValidatorReader::cleanup(xmlNodePtr theNode)
+{
+  if (isNode(theNode, NODE_FEATURE, NULL)) {
+    cleanupAttribute(theNode, _ID);
+  } else if (isWidgetNode(theNode)) {
+    cleanupAttribute(NODE_XMLPARENT, _ID);
+    // Cleanup widget name when leave the widget node.
+    myCurrentWidget = "";
+  }
+}
+
 bool Config_ValidatorReader::processChildren(xmlNodePtr aNode)
 {
   return true;
@@ -63,14 +78,12 @@ void Config_ValidatorReader::processValidator(xmlNodePtr theNode)
   getParametersInfo(theNode, aValidatorId, aParameters);
   aMessage->setValidatorId(aValidatorId);
   aMessage->setValidatorParameters(aParameters);
-  //TODO(sbh): update feature/attribute id restoring
-  // when "cleanup" technique will be available (v. >= 1.1.0)
-  xmlNodePtr aFeatureOrWdgNode = theNode->parent;
-  if (isNode(aFeatureOrWdgNode, NODE_FEATURE, NULL)) {
-    aMessage->setFeatureId(getProperty(aFeatureOrWdgNode, _ID));
-  } else {
-    aMessage->setAttributeId(getProperty(aFeatureOrWdgNode, _ID));
-    aMessage->setFeatureId(restoreAttribute(NODE_FEATURE, _ID));
+  std::string aFeatureId = restoreAttribute(NODE_FEATURE, _ID);
+  aMessage->setFeatureId(aFeatureId);
+  // parent is attribute (widget)
+  if (!myCurrentWidget.empty()) {
+    std::string aParentId = restoreAttribute(myCurrentWidget.c_str(), _ID);
+    aMessage->setAttributeId(aParentId);
   }
   aEvLoop->send(aMessage);
 }
@@ -86,13 +99,12 @@ void Config_ValidatorReader::processSelectionFilter(xmlNodePtr theNode)
   getParametersInfo(theNode, aSelectionFilterId, aParameters);
   aMessage->setSelectionFilterId(aSelectionFilterId);
   aMessage->setFilterParameters(aParameters);
-
-  xmlNodePtr aFeatureOrWdgNode = theNode->parent;
-  if (isNode(aFeatureOrWdgNode, NODE_FEATURE, NULL)) {
-    aMessage->setFeatureId(getProperty(aFeatureOrWdgNode, _ID));
-  } else {
-    aMessage->setAttributeId(getProperty(aFeatureOrWdgNode, _ID));
-    aMessage->setFeatureId(restoreAttribute(NODE_FEATURE, _ID));
+  std::string aFeatureId = restoreAttribute(NODE_FEATURE, _ID);
+  aMessage->setFeatureId(aFeatureId);
+  // parent is attribute (widget)
+  if (!myCurrentWidget.empty()) {
+    std::string aParentId = restoreAttribute(myCurrentWidget.c_str(), _ID);
+    aMessage->setAttributeId(aParentId);
   }
   aEvLoop->send(aMessage);
 }
index f2ac6293d20adbe1fe86fd23c3a84554d525231f..59f6acffb0fc9d63dc6ed0bc672166c3d22b96f5 100644 (file)
@@ -45,6 +45,11 @@ class Config_ValidatorReader : public Config_XMLReader
    */
   virtual bool processChildren(xmlNodePtr aNode);
 
+  /*!
+   * Cleans the cached information about parent feature or attribute (widget)
+   */
+  virtual void cleanup(xmlNodePtr theNode);
+
   /*!
    * \brief Retrieves all the necessary info from the validator node.
    * Sends ValidatorLoaded event
@@ -55,6 +60,9 @@ class Config_ValidatorReader : public Config_XMLReader
    * Sends SelectionFilterLoaded event
    */
   void processSelectionFilter(xmlNodePtr theNode);
+
+ private:
+  std::string myCurrentWidget;
 };
 
 #endif /* CONFIG_VALIDATORREADER_H_ */
index ad9296bc84645741f6bbe984554fc8624a0c81e3..20cd411016fc4806e4f402843ee6926f4f03479e 100644 (file)
@@ -142,6 +142,9 @@ void PartSet_Module::registerValidators()
 
   aFactory->registerValidator("PartSet_SketchEntityValidator",
                               new PartSet_SketchEntityValidator);
+
+  aFactory->registerValidator("PartSet_SameTypeAttr",
+                              new PartSet_SameTypeAttrValidator);
 }
 
 void PartSet_Module::registerFilters()
index be4ffafa81d8b37cb8275b03249195f74cec84cd..6d17784f78dbcfc44b31410e0f8fa386089a33f6 100644 (file)
@@ -20,6 +20,7 @@
 #include <ModelAPI_AttributeReference.h>
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_Object.h>
+#include <ModelAPI_Session.h>
 
 #include <SketchPlugin_Sketch.h>
 
@@ -266,3 +267,32 @@ bool PartSet_SketchEntityValidator::isValid(const AttributePtr& theAttribute,
 
   return isSketchEntities;
 }
+
+
+
+bool PartSet_SameTypeAttrValidator::isValid(
+  const AttributePtr& theAttribute, const std::list<std::string>& theArguments ) const
+{
+  // there is a check whether the feature contains a point and a linear edge or two point values
+  std::string aParamA = theArguments.front();
+  SessionPtr aMgr = ModelAPI_Session::get();
+  ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
+
+  FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+  AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+  if (!aRefAttr)
+    return false;
+
+  bool isObject = aRefAttr->isObject();
+  ObjectPtr anObject = aRefAttr->object();
+  if (isObject && anObject) {
+    FeaturePtr aRefFea = ModelAPI_Feature::feature(anObject);
+
+    AttributeRefAttrPtr aOtherAttr = aFeature->data()->refattr(aParamA);
+    ObjectPtr aOtherObject = aOtherAttr->object();
+    FeaturePtr aOtherFea = ModelAPI_Feature::feature(aOtherObject);
+    return aRefFea->getKind() == aOtherFea->getKind();
+  }
+  return false;
+}
+
index eb9f8a06bd010532257cbcbe62c7c6a2454f53d5..7a7f2333c04bc740469e930e2f939843579a854d 100644 (file)
@@ -99,4 +99,21 @@ class PartSet_SketchEntityValidator : public ModelAPI_AttributeValidator
                        const std::list<std::string>& theArguments) const;
 };
 
+/**\class PartSet_SameTypeAttrValidator
+ * \ingroup Validators
+ * \brief Validator for the tangent constraint input.
+ *
+ * It just checks that distance is greater than zero.
+ */
+class PartSet_SameTypeAttrValidator : public ModelAPI_AttributeValidator
+{
+ public:
+  //! returns true if attribute is valid
+  //! \param theAttribute the checked attribute
+  //! \param theArguments arguments of the attribute
+  virtual bool isValid(const AttributePtr& theAttribute,
+                       const std::list<std::string>& theArguments) const;
+};
+
+
 #endif
index 4ca486e87c9a76f65b3061579dbc94a98ff77567..971e919d20d89067acd7429afb31d97cd48be709 100644 (file)
Binary files a/src/PartSet/icons/tangent.png and b/src/PartSet/icons/tangent.png differ
index 68302fee1541fe700c648e15a9875c25297a213c..c7ee95fcc32070a00d6564cbb37effd8ad1f9870 100644 (file)
@@ -53,6 +53,8 @@ SketchPlugin_Plugin::SketchPlugin_Plugin()
                               new SketchPlugin_DistanceAttrValidator);  
   aFactory->registerValidator("SketchPlugin_ExternalValidator",
                               new SketchPlugin_ExternalValidator);
+  aFactory->registerValidator("SketchPlugin_TangentAttr",
+                              new SketchPlugin_TangentAttrValidator);
 
   // register this plugin
   ModelAPI_Session::get()->registerPlugin(this);
index 67ae5e124831b11a83e6a434597afde5ac233b20..c6c0ef2012519bad65b082bc6b31d19a34ab25ae 100644 (file)
         
         <sketch_constraint_shape_selector id="ConstraintEntityB"
             label="Last object" tooltip="Select line, circle or arc" shape_types="edge">
+          <validator id="PartSet_SameTypeAttr" parameters="ConstraintEntityA"/>
+          <validator id="PartSet_DifferentObjects"/>
         </sketch_constraint_shape_selector>
       </feature>
       
         
         <sketch_constraint_shape_selector id="ConstraintEntityB"
             label="Last object" tooltip="Select line or arc" shape_types="edge">
+        <validator id="SketchPlugin_TangentAttr" parameters="ConstraintEntityA"/>
         </sketch_constraint_shape_selector>
       </feature>