Salome HOME
Debug of refactored Selector
authormpv <mpv@opencascade.com>
Mon, 19 Nov 2018 07:23:08 +0000 (10:23 +0300)
committermpv <mpv@opencascade.com>
Mon, 19 Nov 2018 08:45:52 +0000 (11:45 +0300)
src/Selector/Selector_Algo.cpp
src/Selector/Selector_Algo.h
src/Selector/Selector_Container.cpp
src/Selector/Selector_FilterByNeighbors.cpp
src/Selector/Selector_Intersect.cpp
src/Selector/Selector_Modify.cpp
src/Selector/Selector_Selector.cpp
test.models/CSWA.py

index c64e012d502de91b3852003f7d73efc221a7cadb..50e652a6366c2ba3895d3f7ff35b7688c0e4c1e7 100644 (file)
@@ -324,10 +324,10 @@ TopoDS_Shape Selector_Algo::value()
   return TopoDS_Shape(); // empty, error shape
 }
 
-Selector_Algo* Selector_Algo::restoreByLab(TDF_Label theLab)
+Selector_Algo* Selector_Algo::restoreByLab(TDF_Label theLab, TDF_Label theBaseDocLab)
 {
   Handle(TDataStd_Integer) aTypeAttr;
-  if (!myLab.FindAttribute(kSEL_TYPE, aTypeAttr))
+  if (!theLab.FindAttribute(kSEL_TYPE, aTypeAttr))
     return NULL;
   Selector_Type aType = Selector_Type(aTypeAttr->Get());
   Selector_Algo* aResult = NULL;
@@ -360,12 +360,9 @@ Selector_Algo* Selector_Algo::restoreByLab(TDF_Label theLab)
   }
   }
   if (aResult) {
-    bool aGeomNaming = myLab.IsAttribute(kGEOMETRICAL_NAMING);
     aResult->myLab = theLab;
-    aResult->myBaseDocumentLab = myBaseDocumentLab;
-    aResult->myGeometricalNaming = aGeomNaming;
-    aResult->myUseNeighbors = myUseNeighbors;
-    aResult->myUseIntersections = myUseIntersections;
+    aResult->myBaseDocumentLab = theBaseDocLab;
+    aResult->myGeometricalNaming = theLab.IsAttribute(kGEOMETRICAL_NAMING);
     if (!aResult->restore()) {
       delete aResult;
       aResult = NULL;
@@ -396,7 +393,8 @@ Selector_Algo* Selector_Algo::restoreByName(TDF_Label theLab, TDF_Label theBaseD
     }
   } else if (theName[0] == '(') { // filter by neighbors
     aResult = new Selector_FilterByNeighbors;
-  } if (theName.find(pureWeakNameID()) == 0) { // weak naming identifier
+  } else if (theName.find(pureWeakNameID()) == 0) { // weak naming identifier
+    aResult = new Selector_WeakName;
   } else if (theName.find('&') != std::string::npos) { // modification
     aResult = new Selector_Modify;
   } else { // primitive
index b58e99df0caff3b1e030e340ccdc097b64088f4d..f2149fe5e8746aa456bdbb854cf68f4a9bfb94cd 100644 (file)
@@ -94,7 +94,7 @@ public:
   /// Returns the current sub-shape value (null if can not resolve)
   SELECTOR_EXPORT TopoDS_Shape value();
   /// Restores sub-algorithm of a given type by the storage-label
-  SELECTOR_EXPORT Selector_Algo* restoreByLab(TDF_Label theLab);
+  SELECTOR_EXPORT static Selector_Algo* restoreByLab(TDF_Label theLab, TDF_Label theBaseDocLab);
   /// Restores the selected sub-algorithm by the naming name.
   /// Returns not empty label of the context.
   SELECTOR_EXPORT static Selector_Algo* restoreByName(
index 32d7134ee937b0a0b0505c54bb9ba3ab3d9b2523..f10fa46d68f6bd1c63c49e67a3a4e32e241ae475 100644 (file)
@@ -73,7 +73,7 @@ bool Selector_Container::restore()
   // restore sub-selectors
   bool aSubResult = true;
   for(TDF_ChildIterator aSub(label(), false); aSub.More(); aSub.Next()) {
-    Selector_Algo* aSubSel = restoreByLab(aSub.Value());
+    Selector_Algo* aSubSel = restoreByLab(aSub.Value(), baseDocument());
     if (!append(aSubSel, false)) {
       break; // some empty label left in the end
     }
@@ -99,7 +99,7 @@ TDF_Label Selector_Container::restoreByName(std::string theName,
       TDF_Label aSubContext;
       Selector_Algo* aSubSel =
         Selector_Algo::restoreByName(
-          label(), baseDocument(), aSubStr, aSubShapeType, theNameGenerator, aSubContext);
+          newSubLabel(), baseDocument(), aSubStr, aSubShapeType, theNameGenerator, aSubContext);
       if (!append(aSubSel))
         return TDF_Label();
 
index 43221ba64d776f06c1538cca23930a1e2d765570..440e65b334187ba751bcfb93fec8b5b6c0e6baa0 100644 (file)
@@ -125,7 +125,7 @@ static const TopoDS_Shape findNeighbor(const TopoDS_Shape theContext,
   if (aMatches.Extent() == 1)
     return aMatches.First(); // already found good candidate
   TopoDS_Compound aResultCompound; // in case of geometrical name and many candidates
-                                   // iterate all matches to find by other (higher level) neighbors the best candidate
+  // iterate all matches to find by other (higher level) neighbors the best candidate
   TopoDS_Shape aGoodCandidate;
   TopTools_MapOfShape aGoodCandidates; // already added good candidates to the map
   for(TopoDS_ListOfShape::Iterator aCandidate(aMatches); aCandidate.More(); aCandidate.Next()) {
@@ -254,7 +254,7 @@ bool Selector_FilterByNeighbors::restore()
   // restore sub-selectors
   bool aSubResult = true;
   for(TDF_ChildIterator aSub(label(), false); aSub.More(); aSub.Next()) {
-    Selector_Algo* aSubSel = restoreByLab(aSub.Value());
+    Selector_Algo* aSubSel = restoreByLab(aSub.Value(), baseDocument());
     if (!append(aSubSel, false)) {
       break; // some empty label left in the end
     }
@@ -275,7 +275,7 @@ TDF_Label Selector_FilterByNeighbors::restoreByName(std::string theName,
       TDF_Label aSubContext;
       Selector_Algo* aSubSel =
         Selector_Algo::restoreByName(
-          label(), baseDocument(), aSubStr, myShapeType, theNameGenerator, aSubContext);
+          newSubLabel(), baseDocument(), aSubStr, myShapeType, theNameGenerator, aSubContext);
       if (!append(aSubSel))
         return TDF_Label();
 
index 8d1a3de88798797548695429585c0d1c7d95c352..5d003a2a98d69723828b5ae22d3abff4f7f744cf 100644 (file)
@@ -168,7 +168,7 @@ bool Selector_Intersect::restore()
   // restore sub-selectors
   bool aSubResult = true;
   for(TDF_ChildIterator aSub(label(), false); aSub.More(); aSub.Next()) {
-    Selector_Algo* aSubSel = restoreByLab(aSub.Value());
+    Selector_Algo* aSubSel = restoreByLab(aSub.Value(), baseDocument());
     if (!append(aSubSel, false)) {
       break; // some empty label left in the end
     }
@@ -213,7 +213,7 @@ TDF_Label Selector_Intersect::restoreByName(std::string theName,
       TDF_Label aSubContext;
       Selector_Algo* aSubSel =
         Selector_Algo::restoreByName(
-          label(), baseDocument(), aSubStr, aSubShapeType, theNameGenerator, aSubContext);
+          newSubLabel(), baseDocument(), aSubStr, aSubShapeType, theNameGenerator, aSubContext);
       if (!append(aSubSel))
         return TDF_Label();
 
index f764e1d396706e71175e23b35f33bb218130fe1e..e17ae2d338a98c9219a6c17a8fbcbf5e575dd06b 100644 (file)
@@ -184,6 +184,8 @@ bool Selector_Modify::select(NCollection_List<Handle(TNaming_NamedShape)>& theMo
             return true;
           }
         }
+      } else if (aCommon.Extent() == 1) {
+        return true; // simple modification
       }
     }
     // weak naming case
index 62d1ad0cba9f24cd2f818bc5bd1016adb3affb7d..c04ceb79a4dcf5588844da77355e96b3d35ee663 100644 (file)
@@ -59,9 +59,9 @@ bool Selector_Selector::store(const TopoDS_Shape theContext)
 
 bool Selector_Selector::restore(const TopoDS_Shape theContext)
 {
-  if (myAlgo->restoreByLab(myLab)) {
-    myAlgo->solve(theContext); // to update the selection shape on the label
-    return true;
+  myAlgo = Selector_Algo::restoreByLab(myLab, myBaseDocumentLab);
+  if (myAlgo) {
+    return myAlgo->solve(theContext); // to update the selection shape on the label
   }
   return false;
 }
index 2885ff6c2a5335089aaf2afba17bd89424a4c1f3..45a0a6f609f4df4b6206711111457866f45b8d86 100644 (file)
@@ -127,8 +127,8 @@ SketchConstraintCoincidence_23 = Sketch_3.setCoincident(SketchArc_3.results()[1]
 SketchConstraintCoincidence_23.setName("SketchConstraintCoincidence_24")
 model.do()
 ExtrusionFuse_1 = model.addExtrusionFuse(Part_1_doc, [model.selection("FACE", "Sketch_3/Face-SketchArc_3_2f-SketchLine_12f-SketchArc_5_2r")], model.selection(), 5, 0, [model.selection("SOLID", "ExtrusionCut_1_1")])
-Sketch_4 = model.addSketch(Part_1_doc, model.selection("FACE", "(ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchArc_5_2)(ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchLine_12)(ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchArc_3_2)"))
-SketchPoint_4 = Sketch_4.addPoint(model.selection("VERTEX", "[ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchArc_5_2][ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchLine_12][(ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchArc_5_2)(ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchLine_12)(ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchArc_3_2)]"))
+Sketch_4 = model.addSketch(Part_1_doc, model.selection("FACE", "ExtrusionFuse_1_1/To_Face"))
+SketchPoint_4 = Sketch_4.addPoint(model.selection("VERTEX", "[ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchArc_5_2][ExtrusionFuse_1_1/Generated_Face&Sketch_3/SketchLine_12][ExtrusionFuse_1_1/To_Face]"))
 SketchCircle_2 = Sketch_4.addCircle(-15, 35.00000000000001, 5)
 SketchConstraintCoincidence_24 = Sketch_4.setCoincident(SketchPoint_4.result(), SketchCircle_2.center())
 SketchConstraintCoincidence_24.setName("SketchConstraintCoincidence_25")
@@ -140,7 +140,7 @@ SketchArc_6 = Sketch_5.addArc(model.selection("EDGE", "[ExtrusionCut_1_1/Modifie
 SketchArc_7 = Sketch_5.addArc(-45, 35, -45, 5, -25.41666666666737, 12.27351642784166, False)
 SketchConstraintCoincidence_25 = Sketch_5.setCoincident(SketchArc_6.result(), SketchArc_7.center())
 SketchConstraintCoincidence_25.setName("SketchConstraintCoincidence_26")
-SketchCircle_3 = Sketch_5.addCircle(model.selection("EDGE", "[ExtrusionFuse_2_1/Generated_Face&Sketch_4/SketchCircle_2_2][_weak_name_6_ExtrusionFuse_2_1]"))
+SketchCircle_3 = Sketch_5.addCircle(model.selection("EDGE", "[ExtrusionFuse_2_1/Generated_Face&Sketch_4/SketchCircle_2_2][ExtrusionFuse_2_1/To_Face]"))
 SketchArc_8 = Sketch_5.addArc(-15, 35.00000000000001, -25.41666666666737, 12.27351642784166, -30.00000000000075, 14.99999999999944, True)
 SketchConstraintCoincidence_26 = Sketch_5.setCoincident(SketchCircle_3.result(), SketchArc_8.center())
 SketchConstraintCoincidence_26.setName("SketchConstraintCoincidence_27")
@@ -173,7 +173,7 @@ SketchConstraintCoincidence_35 = Sketch_6.setCoincident(SketchLine_14.result(),
 SketchConstraintCoincidence_35.setName("SketchConstraintCoincidence_36")
 SketchLine_15 = Sketch_6.addLine(model.selection("EDGE", "[ExtrusionFuse_3_1/Modified_Face&Extrusion_1_1/To_Face][Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_4]"))
 SketchConstraintDistance_8 = Sketch_6.setDistance(SketchArc_10.center(), SketchLine_15.result(), 35, False)
-SketchLine_16 = Sketch_6.addLine(35, 35, 35, 48)
+SketchLine_16 = Sketch_6.addLine(35, 35, 35, 47.99999999999999)
 SketchConstraintCoincidence_36 = Sketch_6.setCoincident(SketchArc_10.endPoint(), SketchLine_16.startPoint())
 SketchConstraintCoincidence_36.setName("SketchConstraintCoincidence_37")
 SketchLine_17 = Sketch_6.addLine(model.selection("EDGE", "[ExtrusionFuse_3_1/Modified_Face&Extrusion_1_1/To_Face][Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_6]"))
@@ -182,26 +182,26 @@ SketchConstraintCoincidence_37.setName("SketchConstraintCoincidence_38")
 SketchConstraintVertical_6 = Sketch_6.setVertical(SketchLine_16.result())
 SketchConstraintTangent_4 = Sketch_6.setTangent(SketchLine_16.result(), SketchArc_10.results()[1])
 SketchConstraintRadius_5 = Sketch_6.setRadius(SketchArc_10.results()[1], 20)
-SketchLine_18 = Sketch_6.addLine(55, 15, 55, 48)
+SketchLine_18 = Sketch_6.addLine(55, 15, 55, 47.99999999999999)
 SketchConstraintCoincidence_38 = Sketch_6.setCoincident(SketchArc_10.startPoint(), SketchLine_18.startPoint())
 SketchConstraintCoincidence_38.setName("SketchConstraintCoincidence_39")
 SketchConstraintCoincidence_39 = Sketch_6.setCoincident(SketchLine_14.endPoint(), SketchLine_18.endPoint())
 SketchConstraintCoincidence_39.setName("SketchConstraintCoincidence_40")
-SketchLine_19 = Sketch_6.addLine(35, 48, 55, 48)
+SketchLine_19 = Sketch_6.addLine(35, 47.99999999999999, 55, 47.99999999999999)
 SketchConstraintCoincidence_40 = Sketch_6.setCoincident(SketchLine_16.endPoint(), SketchLine_19.startPoint())
 SketchConstraintCoincidence_40.setName("SketchConstraintCoincidence_41")
 SketchConstraintCoincidence_41 = Sketch_6.setCoincident(SketchLine_14.endPoint(), SketchLine_19.endPoint())
 SketchConstraintCoincidence_41.setName("SketchConstraintCoincidence_42")
 model.do()
 ExtrusionCut_2 = model.addExtrusionCut(Part_1_doc, [model.selection("WIRE", "Sketch_6/Face-SketchArc_10_2f-SketchLine_18f-SketchLine_19r-SketchLine_16r_wire")], model.selection(), 0, 9, [model.selection("SOLID", "ExtrusionFuse_3_1")])
-Sketch_7 = model.addSketch(Part_1_doc, model.selection("FACE", "_weak_name_30_ExtrusionCut_2_1"))
+Sketch_7 = model.addSketch(Part_1_doc, model.selection("FACE", "ExtrusionCut_2_1/From_Face"))
 SketchCircle_4 = Sketch_7.addCircle(45, -35, 5)
-SketchLine_20 = Sketch_7.addLine(model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Sketch_1/SketchLine_5][_weak_name_30_ExtrusionCut_2_1]"))
+SketchLine_20 = Sketch_7.addLine(model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Sketch_1/SketchLine_5][ExtrusionCut_2_1/From_Face]"))
 SketchConstraintDistance_9 = Sketch_7.setDistance(SketchCircle_4.center(), SketchLine_20.result(), 10, False)
 SketchConstraintRadius_6 = Sketch_7.setRadius(SketchCircle_4.results()[1], "10/2")
 SketchLine_21 = Sketch_7.addLine(35, -35, 45, -35)
 SketchLine_21.setAuxiliary(True)
-SketchPoint_5 = Sketch_7.addPoint(model.selection("VERTEX", "[ExtrusionCut_2_1/Generated_Face&Sketch_6/SketchLine_16][ExtrusionCut_2_1/Generated_Face&Sketch_6/SketchArc_10_2][_weak_name_30_ExtrusionCut_2_1]"))
+SketchPoint_5 = Sketch_7.addPoint(model.selection("VERTEX", "[ExtrusionCut_2_1/Generated_Face&Sketch_6/SketchLine_16][ExtrusionCut_2_1/Generated_Face&Sketch_6/SketchArc_10_2][ExtrusionCut_2_1/From_Face]"))
 SketchConstraintCoincidence_42 = Sketch_7.setCoincident(SketchLine_21.startPoint(), SketchPoint_5.result())
 SketchConstraintCoincidence_42.setName("SketchConstraintCoincidence_43")
 SketchConstraintCoincidence_43 = Sketch_7.setCoincident(SketchCircle_4.center(), SketchLine_21.endPoint())
@@ -238,16 +238,16 @@ SketchConstraintCoincidence_49.setName("SketchConstraintCoincidence_50")
 model.do()
 ExtrusionCut_4 = model.addExtrusionCut(Part_1_doc, [model.selection("FACE", "Sketch_8/Face-SketchLine_22r-SketchLine_23f-SketchLine_24f-SketchLine_25f")], model.selection(), model.selection(), 0, model.selection("FACE", "Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_4"), 0, [model.selection("SOLID", "ExtrusionCut_3_1")])
 Sketch_9 = model.addSketch(Part_1_doc, model.selection("FACE", "ExtrusionFuse_1_1/Modified_Face&Sketch_1/SketchLine_9"))
-SketchLine_28 = Sketch_9.addLine(25, -45, 18.44853578320836, -63)
+SketchLine_28 = Sketch_9.addLine(25, -45, 18.44853578320833, -63)
 SketchLine_29 = Sketch_9.addLine(model.selection("EDGE", "[ExtrusionFuse_1_1/Modified_Face&Sketch_1/SketchLine_9][ExtrusionCut_4_1/Modified_Face&Sketch_1/SketchLine_8]"))
 SketchConstraintCoincidence_50 = Sketch_9.setCoincident(SketchLine_28.endPoint(), SketchLine_29.result())
 SketchConstraintCoincidence_50.setName("SketchConstraintCoincidence_51")
 SketchLine_30 = Sketch_9.addLine(model.selection("EDGE", "[ExtrusionCut_4_1/Modified_Face&Extrusion_1_1/From_Face][ExtrusionFuse_1_1/Modified_Face&Sketch_1/SketchLine_9]"))
 SketchConstraintCoincidence_51 = Sketch_9.setCoincident(SketchLine_28.startPoint(), SketchLine_30.result())
 SketchConstraintCoincidence_51.setName("SketchConstraintCoincidence_52")
-SketchConstraintAngle_3 = Sketch_9.setAngle(SketchLine_28.result(), SketchLine_30.result(), 20)
-SketchConstraintDistance_10 = Sketch_9.setDistance(SketchLine_28.startPoint(), SketchLine_29.result(), 18)
-SketchLine_31 = Sketch_9.addLine(18.44853578320836, -63, 25, -63)
+SketchConstraintAngle_3 = Sketch_9.setAngle(SketchLine_28.result(), SketchLine_30.result(), 20.00000000000009)
+SketchConstraintDistance_10 = Sketch_9.setDistance(SketchLine_28.startPoint(), SketchLine_29.result(), 18, False)
+SketchLine_31 = Sketch_9.addLine(18.44853578320833, -63, 25, -63)
 SketchConstraintCoincidence_52 = Sketch_9.setCoincident(SketchLine_28.endPoint(), SketchLine_31.startPoint())
 SketchConstraintCoincidence_52.setName("SketchConstraintCoincidence_53")
 SketchConstraintCoincidence_53 = Sketch_9.setCoincident(SketchLine_29.startPoint(), SketchLine_31.endPoint())
@@ -262,9 +262,9 @@ ExtrusionCut_5 = model.addExtrusionCut(Part_1_doc, [model.selection("FACE", "Ske
 Sketch_10 = model.addSketch(Part_1_doc, model.selection("FACE", "ExtrusionCut_5_1/Modified_Face&Sketch_1/SketchLine_8"))
 SketchCircle_5 = Sketch_10.addCircle(-6.000000000000002, 4.999999999999997, 5)
 SketchLine_33 = Sketch_10.addLine(model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face][ExtrusionCut_5_1/Modified_Face&Sketch_1/SketchLine_8]"))
-SketchConstraintDistance_11 = Sketch_10.setDistance(SketchCircle_5.center(), SketchLine_33.result(), 30)
+SketchConstraintDistance_11 = Sketch_10.setDistance(SketchCircle_5.center(), SketchLine_33.result(), 30, False)
 SketchLine_34 = Sketch_10.addLine(model.selection("EDGE", "[ExtrusionCut_5_1/Modified_Face&Sketch_1/SketchLine_9][ExtrusionCut_5_1/Modified_Face&Sketch_1/SketchLine_8]"))
-SketchConstraintDistance_12 = Sketch_10.setDistance(SketchCircle_5.result(), SketchLine_34.result(), 9)
+SketchConstraintDistance_12 = Sketch_10.setDistance(SketchCircle_5.result(), SketchLine_34.result(), 9, False)
 SketchConstraintRadius_7 = Sketch_10.setRadius(SketchCircle_5.results()[1], "10/2")
 model.do()
 ExtrusionCut_6 = model.addExtrusionCut(Part_1_doc, [model.selection("FACE", "Sketch_10/Face-SketchCircle_5_2r")], model.selection(), model.selection(), 0, model.selection("FACE", "Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_1"), 0, [model.selection("SOLID", "ExtrusionCut_5_1")])