]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #995: Checkbox 'Make a copy' during translation and rotation operations
authornds <nds@opencascade.com>
Fri, 6 Nov 2015 08:42:03 +0000 (11:42 +0300)
committernds <nds@opencascade.com>
Fri, 6 Nov 2015 08:42:32 +0000 (11:42 +0300)
Correction from a list of improvements:
For compatibility with old GEOM, we must ask for the total number of objects, not the number of copies, as currently (for information, it's like that too in SolidWorks).

src/SketchPlugin/SketchPlugin_MultiRotation.cpp
src/SketchPlugin/SketchPlugin_MultiRotation.h
src/SketchPlugin/SketchPlugin_MultiTranslation.cpp
src/SketchPlugin/SketchPlugin_MultiTranslation.h
src/SketchPlugin/plugin-Sketch.xml
src/SketchSolver/SketchSolver_ConstraintMulti.cpp
src/SketchSolver/SketchSolver_ConstraintMulti.h
src/SketchSolver/SketchSolver_ConstraintMultiRotation.cpp
src/SketchSolver/SketchSolver_ConstraintMultiRotation.h
src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp
src/SketchSolver/SketchSolver_ConstraintMultiTranslation.h

index 726ffe4dd5e847feac88b6994b2baf7b182645fc..6f3c0c8c737223bf4c20d76d90cf045ba236e1bc 100755 (executable)
@@ -33,7 +33,7 @@ void SketchPlugin_MultiRotation::initAttributes()
 {
   data()->addAttribute(CENTER_ID(), GeomDataAPI_Point2D::typeId());
   data()->addAttribute(ANGLE_ID(), ModelAPI_AttributeDouble::typeId());
-  data()->addAttribute(NUMBER_OF_COPIES_ID(), ModelAPI_AttributeInteger::typeId());
+  data()->addAttribute(NUMBER_OF_OBJECTS_ID(), ModelAPI_AttributeInteger::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefList::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefList::typeId());
   data()->addAttribute(ROTATION_LIST_ID(), ModelAPI_AttributeRefList::typeId());
@@ -50,7 +50,9 @@ void SketchPlugin_MultiRotation::execute()
   }
 
   AttributeRefListPtr aRotationObjectRefs = reflist(ROTATION_LIST_ID());
-  int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value();
+  int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value() - 1;
+  if (aNbCopies <= 0)
+    return;
 
   // Obtain center and angle of rotation
   std::shared_ptr<GeomDataAPI_Point2D> aCenter = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
@@ -279,7 +281,10 @@ void SketchPlugin_MultiRotation::attributeChanged(const std::string& theID)
   if (theID == ROTATION_LIST_ID()) {
     AttributeRefListPtr aRotationObjectRefs = reflist(ROTATION_LIST_ID());
     if (aRotationObjectRefs->size() == 0) {
-      int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value();
+      int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value()-1;
+      if (aNbCopies <= 0)
+        return;
+
       // Clear list of objects
       AttributeRefListPtr aRefListOfRotated = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
           data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
index 245ffb980bc37de56e07cd4483de659950a771d1..7fd3cf14a333c3ee48f4980c27bb56ece585dfd2 100644 (file)
  *  SketchPlugin_Constraint::ENTITY_A() for initial list of objects and
  *  SketchPlugin_Constraint::ENTITY_B() for the list of created objects
  *
- *  The list of created objects contains a number of copies of each object given in
- *  the NUMBER_OF_COPIES_ID() attribute plus 1 (the initial objects are stored into this
- *  attribute too). At the start of the list, there are collected N copies
- *  of first object from initial list, then N copies of second object etc.
+ *  The list of created objects contains initial and copied objects of each object given. The
+ *  number copies is the NUMBER_OF_OBJECTS_ID() minus 1. At the start of the list, there are
+ * collected N copies of first object from initial list, then N copies of second object etc.
  */
 class SketchPlugin_MultiRotation : public SketchPlugin_ConstraintBase
 {
@@ -59,11 +58,11 @@ class SketchPlugin_MultiRotation : public SketchPlugin_ConstraintBase
     static const std::string MY_ANGLE_ID("MultiRotationAngle");
     return MY_ANGLE_ID;
   }
-  /// Number of translated objects
-  inline static const std::string& NUMBER_OF_COPIES_ID()
+  /// Total number of objects, initial and translated objects
+  inline static const std::string& NUMBER_OF_OBJECTS_ID()
   {
-    static const std::string MY_NUMBER_OF_COPIES_ID("MultiRotationCopies");
-    return MY_NUMBER_OF_COPIES_ID;
+    static const std::string MY_NUMBER_OF_OBJECTS_ID("MultiRotationObjects");
+    return MY_NUMBER_OF_OBJECTS_ID;
   }
 
   /// \brief Creates a new part document if needed
index 3e6a702b6ae1ee350584a72fbaf2997206785781..0db1082a168502602b4da20b81295c9e7846f48c 100755 (executable)
@@ -27,7 +27,7 @@ void SketchPlugin_MultiTranslation::initAttributes()
 {
   data()->addAttribute(START_POINT_ID(), GeomDataAPI_Point2D::typeId());
   data()->addAttribute(END_POINT_ID(), GeomDataAPI_Point2D::typeId());
-  data()->addAttribute(NUMBER_OF_COPIES_ID(), ModelAPI_AttributeInteger::typeId());
+  data()->addAttribute(NUMBER_OF_OBJECTS_ID(), ModelAPI_AttributeInteger::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefList::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefList::typeId());
   data()->addAttribute(TRANSLATION_LIST_ID(), ModelAPI_AttributeRefList::typeId());
@@ -44,7 +44,9 @@ void SketchPlugin_MultiTranslation::execute()
   }
 
   AttributeRefListPtr aTranslationObjectRefs = reflist(TRANSLATION_LIST_ID());
-  int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value();
+  int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value()-1;
+  if (aNbCopies <= 0)
+    return;
 
   // Calculate shift vector
   std::shared_ptr<GeomDataAPI_Point2D> aStart = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
@@ -222,7 +224,9 @@ void SketchPlugin_MultiTranslation::attributeChanged(const std::string& theID)
   if (theID == TRANSLATION_LIST_ID()) {
     AttributeRefListPtr aTranslationObjectRefs = reflist(TRANSLATION_LIST_ID());
     if (aTranslationObjectRefs->size() == 0) {
-      int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value();
+      int aNbCopies = integer(NUMBER_OF_OBJECTS_ID())->value()-1;
+      if (aNbCopies <= 0)
+        return;
       // Clear list of objects
       AttributeRefListPtr aRefListOfTranslated = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
           data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
index 5bebd18825b6a04e5a4d511c70cc74981417b33e..967c60d186e0b951abb4aeae8d0495a2fc0b3472 100644 (file)
  *  SketchPlugin_Constraint::ENTITY_A() for initial list of objects and
  *  SketchPlugin_Constraint::ENTITY_B() for the list of created objects
  *
- *  The list of created objects contains a number of copies of each object given in
- *  the NUMBER_OF_COPIES_ID() attribute plus 1 (the initial objects are stored into this
- *  attribute too). At the start of the list, there are collected N copies
- *  of first object from initial list, then N copies of second object etc.
+ *  The list of created objects contains initial and copied objects of each object given. The
+ *  number copies is the NUMBER_OF_OBJECTS_ID() minus 1. At the start of the list, there are
+ *  collected N copies of first object from initial list, then N copies of second object etc.
  */
 class SketchPlugin_MultiTranslation : public SketchPlugin_ConstraintBase
 {
@@ -59,11 +58,11 @@ class SketchPlugin_MultiTranslation : public SketchPlugin_ConstraintBase
     static const std::string MY_END_POINT_ID("MultiTranslationEndPoint");
     return MY_END_POINT_ID;
   }
-  /// Number of translated objects
-  inline static const std::string& NUMBER_OF_COPIES_ID()
+  /// Total number of objects, initial and translated objects
+  inline static const std::string& NUMBER_OF_OBJECTS_ID()
   {
-    static const std::string MY_NUMBER_OF_COPIES_ID("MultiTranslationCopies");
-    return MY_NUMBER_OF_COPIES_ID;
+    static const std::string MY_NUMBER_OF_OBJECTS_ID("MultiTranslationObjects");
+    return MY_NUMBER_OF_OBJECTS_ID;
   }
 
   /// \brief Creates a new part document if needed
index 3891315ef09cb141d9000fe39864c018da3bee43..d8c4ede48e67a5657f3edd503ab44ce6fb4905da 100644 (file)
               title="End point"
               tooltip="Final point of translation"/>
         </groupbox>
-        <integervalue id="MultiTranslationCopies"
-            label="Number of copies"
-            tooltip="Number of copies" 
-            default="1" min="1" use_reset="false">
+        <integervalue id="MultiTranslationObjects"
+            label="Total number of objects"
+            tooltip="Total number of objects" 
+            default="2" min="2" use_reset="false">
           <validator id="GeomValidators_Positive"/>
         </integervalue>
       </feature>
                          icon=":icons/angle.png"
                          tooltip="Rotation angle"
                          default="90"/>
-        <integervalue id="MultiRotationCopies"
-            label="Number of copies"
-            tooltip="Number of copies" 
-            default="1" min="1" use_reset="false">
+        <integervalue id="MultiRotationObjects"
+            label="Total number of objects"
+            tooltip="Total number of objects" 
+            default="2" min="2" use_reset="false">
           <validator id="GeomValidators_Positive"/>
         </integervalue>
       </feature>
index b1de57dc2be113102af4cd23996fe4b35382a1dd..5be0d2fe596ce718db4c4217312f6c009b6d74f9 100644 (file)
@@ -64,8 +64,8 @@ void SketchSolver_ConstraintMulti::update(ConstraintPtr theConstraint)
   if (!theConstraint || theConstraint == myBaseConstraint) {
     AttributeRefListPtr anInitialRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
         myBaseConstraint->attribute(SketchPlugin_Constraint::ENTITY_A()));
-    AttributeIntegerPtr aNbCopies = myBaseConstraint->integer(nameNbCopies());
-    if (anInitialRefList->size() != myNumberOfObjects || aNbCopies->value() != myNumberOfCopies) {
+    AttributeIntegerPtr aNbObjects = myBaseConstraint->integer(nameNbObjects());
+    if (anInitialRefList->size() != myNumberOfObjects || aNbObjects->value()-1 != myNumberOfCopies) {
       remove(myBaseConstraint);
       process();
       return;
index 8d30da0e630a580b67fae2a6dcb5e736a9c69693..4786ee430436040987a5dfe405366e9d8eff4892 100644 (file)
@@ -72,8 +72,8 @@ protected:
   virtual void updateLocal() = 0;
 
   /// \brief Returns name of NUMBER_OF_COPIES parameter for corresponding feature
-  virtual const std::string& nameNbCopies() = 0;
-
+  virtual const std::string& nameNbObjects() = 0;
+  
 protected:
   /// \brief Convert absolute coordinates to relative coordinates
   virtual void getRelative(double theAbsX, double theAbsY, double& theRelX, double& theRelY) = 0;
index ed1550d41e10ba1c740b3678f8e4956467aa3d11..7608460c47d37f5bdcb2261f02843b2e92b8d08a 100644 (file)
@@ -40,7 +40,9 @@ void SketchSolver_ConstraintMultiRotation::getAttributes(
   AttributeRefListPtr anInitialRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
       aData->attribute(SketchPlugin_Constraint::ENTITY_A()));
   myNumberOfObjects = anInitialRefList->size();
-  myNumberOfCopies = (size_t) aData->integer(SketchPlugin_MultiRotation::NUMBER_OF_COPIES_ID())->value();
+  myNumberOfCopies = (size_t) aData->integer(SketchPlugin_MultiRotation::NUMBER_OF_OBJECTS_ID())->value() - 1;
+  if (myNumberOfCopies <= 0)
+    return;
   AttributeRefListPtr aRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
       myBaseConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()));
   if (!aRefList) {
@@ -205,7 +207,7 @@ void SketchSolver_ConstraintMultiRotation::transformRelative(double& theX, doubl
   theX = aTemp;
 }
 
-const std::string& SketchSolver_ConstraintMultiRotation::nameNbCopies()
+const std::string& SketchSolver_ConstraintMultiRotation::nameNbObjects()
 {
-  return SketchPlugin_MultiRotation::NUMBER_OF_COPIES_ID();
+  return SketchPlugin_MultiRotation::NUMBER_OF_OBJECTS_ID();
 }
index 5206c6b9f0fc74e40d579a39484dd05b1e003fa2..86966e522110d56d67cc83212aa824b9c77779be 100644 (file)
@@ -54,7 +54,7 @@ private:
 
 private:
   /// \brief Returns name of NUMBER_OF_COPIES parameter for corresponding feature
-  virtual const std::string& nameNbCopies();
+  virtual const std::string& nameNbObjects();
 
 private:
   Slvs_hEntity myRotationCenter; ///< ID of center of rotation
index 381c8641b71770392680a17696b53140416e1c85..02b872c6e549527f2bbdd56cb85c4a87707b5e9a 100644 (file)
@@ -46,7 +46,10 @@ void SketchSolver_ConstraintMultiTranslation::getAttributes(
   AttributeRefListPtr anInitialRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
       aData->attribute(SketchPlugin_Constraint::ENTITY_A()));
   myNumberOfObjects = anInitialRefList->size();
-  myNumberOfCopies = (size_t) aData->integer(SketchPlugin_MultiTranslation::NUMBER_OF_COPIES_ID())->value();
+  myNumberOfCopies = (size_t) aData->integer(SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID())->value() - 1;
+  if (myNumberOfCopies <= 0)
+    return;
+
   AttributeRefListPtr aRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
       myBaseConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()));
   if (!aRefList) {
@@ -199,7 +202,7 @@ void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, do
   theY += myDelta[1];
 }
 
-const std::string& SketchSolver_ConstraintMultiTranslation::nameNbCopies()
+const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
 {
-  return SketchPlugin_MultiTranslation::NUMBER_OF_COPIES_ID();
+  return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
 }
index c3188afa30ee70f781da06ce862b3ec148fca708..c9f10147def434dcc90e67d1937686b2e1bcf17b 100644 (file)
@@ -56,7 +56,7 @@ private:
 
 private:
   /// \brief Returns name of NUMBER_OF_COPIES parameter for corresponding feature
-  virtual const std::string& nameNbCopies();
+  virtual const std::string& nameNbObjects();
 
 private:
   Slvs_hEntity myTranslationLine; ///< ID of translation line