From 6cdd5c2ebfcc5a1e8e9601c1b03f243fe42fa25c Mon Sep 17 00:00:00 2001 From: azv Date: Fri, 9 Aug 2019 14:57:39 +0300 Subject: [PATCH] Task 2.5. Combination operations on Groups (issue #2935) Update user documentation. --- src/CollectionPlugin/doc/CollectionPlugin.rst | 3 ++ .../doc/TUI_groupAdditionFeature.rst | 11 +++++ .../doc/TUI_groupIntersectionFeature.rst | 11 +++++ .../doc/TUI_groupSubstractionFeature.rst | 11 +++++ .../doc/examples/group_addition.py | 14 ++++++ .../doc/examples/group_intersection.py | 19 +++++++++ .../doc/examples/group_substraction.py | 33 +++++++++++++++ .../doc/groupAdditionFeature.rst | 37 ++++++++++++++++ .../doc/groupIntersectionFeature.rst | 37 ++++++++++++++++ .../doc/groupSubstractionFeature.rst | 40 ++++++++++++++++++ .../doc/images/group_addition.png | Bin 0 -> 362 bytes .../images/group_addition_property_panel.png | Bin 0 -> 5049 bytes .../doc/images/group_intersection.png | Bin 0 -> 384 bytes .../group_intersection_property_panel.png | Bin 0 -> 5361 bytes .../doc/images/group_substraction.png | Bin 0 -> 369 bytes .../group_substraction_property_panel.png | Bin 0 -> 6017 bytes 16 files changed, 216 insertions(+) create mode 100644 src/CollectionPlugin/doc/TUI_groupAdditionFeature.rst create mode 100644 src/CollectionPlugin/doc/TUI_groupIntersectionFeature.rst create mode 100644 src/CollectionPlugin/doc/TUI_groupSubstractionFeature.rst create mode 100644 src/CollectionPlugin/doc/examples/group_addition.py create mode 100644 src/CollectionPlugin/doc/examples/group_intersection.py create mode 100644 src/CollectionPlugin/doc/examples/group_substraction.py create mode 100644 src/CollectionPlugin/doc/groupAdditionFeature.rst create mode 100644 src/CollectionPlugin/doc/groupIntersectionFeature.rst create mode 100644 src/CollectionPlugin/doc/groupSubstractionFeature.rst create mode 100644 src/CollectionPlugin/doc/images/group_addition.png create mode 100644 src/CollectionPlugin/doc/images/group_addition_property_panel.png create mode 100644 src/CollectionPlugin/doc/images/group_intersection.png create mode 100644 src/CollectionPlugin/doc/images/group_intersection_property_panel.png create mode 100644 src/CollectionPlugin/doc/images/group_substraction.png create mode 100644 src/CollectionPlugin/doc/images/group_substraction_property_panel.png diff --git a/src/CollectionPlugin/doc/CollectionPlugin.rst b/src/CollectionPlugin/doc/CollectionPlugin.rst index e31d77823..2b83ddd8c 100644 --- a/src/CollectionPlugin/doc/CollectionPlugin.rst +++ b/src/CollectionPlugin/doc/CollectionPlugin.rst @@ -13,3 +13,6 @@ Collection plug-in deals with groups of geometrical entities created by selectio fieldFeature.rst groupFeature.rst + groupAdditionFeature.rst + groupIntersectionFeature.rst + groupSubstractionFeature.rst diff --git a/src/CollectionPlugin/doc/TUI_groupAdditionFeature.rst b/src/CollectionPlugin/doc/TUI_groupAdditionFeature.rst new file mode 100644 index 000000000..ea9cbaf21 --- /dev/null +++ b/src/CollectionPlugin/doc/TUI_groupAdditionFeature.rst @@ -0,0 +1,11 @@ + + .. _tui_create_group_addition: + +Create Group Addition +===================== + +.. literalinclude:: examples/group_addition.py + :linenos: + :language: python + +:download:`Download this script ` diff --git a/src/CollectionPlugin/doc/TUI_groupIntersectionFeature.rst b/src/CollectionPlugin/doc/TUI_groupIntersectionFeature.rst new file mode 100644 index 000000000..37a7d8df7 --- /dev/null +++ b/src/CollectionPlugin/doc/TUI_groupIntersectionFeature.rst @@ -0,0 +1,11 @@ + + .. _tui_create_group_intersection: + +Create Group Intersection +========================= + +.. literalinclude:: examples/group_intersection.py + :linenos: + :language: python + +:download:`Download this script ` diff --git a/src/CollectionPlugin/doc/TUI_groupSubstractionFeature.rst b/src/CollectionPlugin/doc/TUI_groupSubstractionFeature.rst new file mode 100644 index 000000000..ca836f9f0 --- /dev/null +++ b/src/CollectionPlugin/doc/TUI_groupSubstractionFeature.rst @@ -0,0 +1,11 @@ + + .. _tui_create_group_substraction: + +Create Group Substraction +========================= + +.. literalinclude:: examples/group_substraction.py + :linenos: + :language: python + +:download:`Download this script ` diff --git a/src/CollectionPlugin/doc/examples/group_addition.py b/src/CollectionPlugin/doc/examples/group_addition.py new file mode 100644 index 000000000..20f80fce8 --- /dev/null +++ b/src/CollectionPlugin/doc/examples/group_addition.py @@ -0,0 +1,14 @@ +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() +Box_1 = model.addBox(Part_1_doc, 10, 10, 10) +Group_1 = model.addGroup(Part_1_doc, [model.selection("FACE", "Box_1_1/Top"), + model.selection("FACE", "Box_1_1/Left")]) +Group_2 = model.addGroup(Part_1_doc, [model.selection("FACE", "Box_1_1/Front"), + model.selection("FACE", "Box_1_1/Top")]) +GroupAddition_1 = model.addGroupAddition(Part_1_doc, [model.selection("COMPOUND", "Group_1"), + model.selection("COMPOUND", "Group_2")]) +model.end() diff --git a/src/CollectionPlugin/doc/examples/group_intersection.py b/src/CollectionPlugin/doc/examples/group_intersection.py new file mode 100644 index 000000000..84cb476e0 --- /dev/null +++ b/src/CollectionPlugin/doc/examples/group_intersection.py @@ -0,0 +1,19 @@ +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() +Box_1 = model.addBox(Part_1_doc, 10, 10, 10) +Group_1 = model.addGroup(Part_1_doc, [model.selection("FACE", "Box_1_1/Top"), + model.selection("FACE", "Box_1_1/Left")]) +Group_2 = model.addGroup(Part_1_doc, [model.selection("FACE", "Box_1_1/Front"), + model.selection("FACE", "Box_1_1/Top")]) +Group_3 = model.addGroup(Part_1_doc, [model.selection("FACE", "Box_1_1/Front"), + model.selection("FACE", "Box_1_1/Right"), + model.selection("FACE", "Box_1_1/Top")]) +GroupIntersection_1_objects = [model.selection("COMPOUND", "Group_1"), + model.selection("COMPOUND", "Group_2"), + model.selection("COMPOUND", "Group_3")] +GroupIntersection_1 = model.addGroupIntersection(Part_1_doc, GroupIntersection_1_objects) +model.end() diff --git a/src/CollectionPlugin/doc/examples/group_substraction.py b/src/CollectionPlugin/doc/examples/group_substraction.py new file mode 100644 index 000000000..75cf55690 --- /dev/null +++ b/src/CollectionPlugin/doc/examples/group_substraction.py @@ -0,0 +1,33 @@ +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() +Box_1 = model.addBox(Part_1_doc, 10, 10, 10) +Group_1_objects = [model.selection("EDGE", "[Box_1_1/Left][Box_1_1/Bottom]"), + model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Left]"), + model.selection("EDGE", "[Box_1_1/Left][Box_1_1/Top]"), + model.selection("EDGE", "[Box_1_1/Back][Box_1_1/Left]")] +Group_1 = model.addGroup(Part_1_doc, Group_1_objects) +Group_2_objects = [model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Left]"), + model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Bottom]"), + model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Right]"), + model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Top]")] +Group_2 = model.addGroup(Part_1_doc, Group_2_objects) +Group_3_objects = [model.selection("EDGE", "[Box_1_1/Left][Box_1_1/Top]"), + model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Top]"), + model.selection("EDGE", "[Box_1_1/Right][Box_1_1/Top]"), + model.selection("EDGE", "[Box_1_1/Back][Box_1_1/Top]")] +Group_3 = model.addGroup(Part_1_doc, Group_3_objects) +Group_4_objects = [model.selection("EDGE", "[Box_1_1/Back][Box_1_1/Bottom]"), + model.selection("EDGE", "[Box_1_1/Right][Box_1_1/Bottom]"), + model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Bottom]"), + model.selection("EDGE", "[Box_1_1/Left][Box_1_1/Bottom]")] +Group_4 = model.addGroup(Part_1_doc, Group_4_objects) +GroupSubstraction_1 = model.addGroupSubstraction(Part_1_doc, + [model.selection("COMPOUND", "Group_1"), + model.selection("COMPOUND", "Group_2")], + [model.selection("COMPOUND", "Group_3"), + model.selection("COMPOUND", "Group_4")]) +model.end() diff --git a/src/CollectionPlugin/doc/groupAdditionFeature.rst b/src/CollectionPlugin/doc/groupAdditionFeature.rst new file mode 100644 index 000000000..568ca10be --- /dev/null +++ b/src/CollectionPlugin/doc/groupAdditionFeature.rst @@ -0,0 +1,37 @@ +.. |group_addition.icon| image:: images/group_addition.png + +Group Addition +============== + +Group addition produces a union of all the elements of the selected groups. +To create a Group Addition in the active part: + +#. select in the Main Menu *Features - > Group Addition* item or +#. click |group_addition.icon| **Group Addition** button in the toolbar: + +The following property panel appears. + +.. image:: images/group_addition_property_panel.png + :align: center + +.. centered:: + Create a group addition operation + +Input fields: + +- **Name** defines the name of the group, by default, it is **GroupAddition_n**. +- The list of selected groups of the same type. Multiple selection can be done manually in OCC 3D Viewer by mouse click with Shift button pressed or by rectangle selection. To delete entities from the list, select them and call pop-up menu *Delete* item. + +Note, that operation is valid only for the groups of the same type. + +**TUI Command**: + +.. py:function:: model.addGroupAddition(Part_1_doc, + [model.selection("COMPOUND", "Group_1"), model.selection("COMPOUND", "Group_2")]) + + :param part: The current part object + :param list: A list of selected groups + :return: Created object. + + +**See Also** a sample TUI Script of :ref:`tui_create_group_addition` operation. diff --git a/src/CollectionPlugin/doc/groupIntersectionFeature.rst b/src/CollectionPlugin/doc/groupIntersectionFeature.rst new file mode 100644 index 000000000..dadbd4390 --- /dev/null +++ b/src/CollectionPlugin/doc/groupIntersectionFeature.rst @@ -0,0 +1,37 @@ +.. |group_intersection.icon| image:: images/group_intersection.png + +Group Intersection +================== + +Group intersection produces a group of elements present in all the selected groups. +To create a Group Intersection in the active part: + +#. select in the Main Menu *Features - > Group Intersection* item or +#. click |group_intersection.icon| **Group Intersection** button in the toolbar: + +The following property panel appears. + +.. image:: images/group_intersection_property_panel.png + :align: center + +.. centered:: + Create a group intersection operation + +Input fields: + +- **Name** defines the name of the group, by default, it is **GroupIntersection_n**. +- The list of selected groups of the same type. Multiple selection can be done manually in OCC 3D Viewer by mouse click with Shift button pressed or by rectangle selection. To delete entities from the list, select them and call pop-up menu *Delete* item. + +Note, that operation is valid only for the groups of the same type. + +**TUI Command**: + +.. py:function:: model.addGroupIntersection(Part_1_doc, + [model.selection("COMPOUND", "Group_1"), model.selection("COMPOUND", "Group_2")]) + + :param part: The current part object + :param list: A list of selected groups + :return: Created object. + + +**See Also** a sample TUI Script of :ref:`tui_create_group_intersection` operation. diff --git a/src/CollectionPlugin/doc/groupSubstractionFeature.rst b/src/CollectionPlugin/doc/groupSubstractionFeature.rst new file mode 100644 index 000000000..b6ac22789 --- /dev/null +++ b/src/CollectionPlugin/doc/groupSubstractionFeature.rst @@ -0,0 +1,40 @@ +.. |group_substraction.icon| image:: images/group_substraction.png + +Group Substraction +================== + +Group substraction produces a group containing all elements of the main groups but not present in the tool groups. +To create a Group Substraction in the active part: + +#. select in the Main Menu *Features - > Group Substraction* item or +#. click |group_substraction.icon| **Group Substraction** button in the toolbar: + +The following property panel appears. + +.. image:: images/group_substraction_property_panel.png + :align: center + +.. centered:: + Create a group substraction operation + +Input fields: + +- **Name** defines the name of the group, by default, it is **GroupSubstraction_n**. +- The list of main groups. Multiple selection can be done manually in OCC 3D Viewer by mouse click with Shift button pressed or by rectangle selection. To delete entities from the list, select them and call pop-up menu *Delete* item. +- The list of tool groups. Selection approaches are the same as for the main groups. + +Note, that operation is valid only if all the main groups and all the tool groups have the same type. + +**TUI Command**: + +.. py:function:: model.addGroupSubstraction(Part_1_doc, + [model.selection("COMPOUND", "Group_1"), model.selection("COMPOUND", "Group_2")], + [model.selection("COMPOUND", "Group_3"), model.selection("COMPOUND", "Group_4")]) + + :param part: The current part object + :param list: A list of main groups + :param list: A list of tool groups + :return: Created object. + + +**See Also** a sample TUI Script of :ref:`tui_create_group_substraction` operation. diff --git a/src/CollectionPlugin/doc/images/group_addition.png b/src/CollectionPlugin/doc/images/group_addition.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc76e0013df328eb982feb1f90b774443f17342 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4>q-B4O*xD_h1@0YGj^L1U5NKV{s(wMKX>Y3%iwM6$LluhBR5#?`&zHE;#aPm`j;{^ z(_U*Bw5`6f{MRz08TrZ6f3-dQ`0>M{i@j%44@#_?e08nX*Mxn&W$m@!f*5X{4Lfwz z`>6DfTMC^YCj1m;ZrF3i^+#-r(vtYU%FGQALbP0l+XkK D7k8A0 literal 0 HcmV?d00001 diff --git a/src/CollectionPlugin/doc/images/group_addition_property_panel.png b/src/CollectionPlugin/doc/images/group_addition_property_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..54904a13033aaa7ef8aec2e67b333b8b74d0934a GIT binary patch literal 5049 zcmc&&XHXMNw+_-H#fE}N6Hz)+1f>Yldy&waAfXcw0)apPMFd4!0MSsT3K0+pUBauN zAfbmMAfZD-htLu7#rNKMXYQZ--I@F2o1HUz_RP-gp0j74=j^^THP>UIhXG09HL+ z&4&O04J}o!GciytCj#}>)Q-W$Kt~fm`P1@RN>Zs7W`A9qKmg$E#Xmv=KxJ`Kjf_w| zBQ3@`CT3=?|S3V>O&ml!*1+C0-bMY8+prk}auJ zJ`Xo}(d`|RR9J$msc5RSZz zd*KKE1-ZxmsQ`WkKpaifclAc*sGM(JwRIs)c#^B@Ik|ndF(0LQwms|$a0cI$? z`SCQt*}K6MJuEtrSV6%28h5Vgg5T$^y$5`XWrPDt@MA==pJX{6n*%KSqKtYp>le(| zkhK6evF>_jhWAC;iv*SD zW~K`}<=18a2NW9E7<6+-ye(FhcW@@CEGH&d+LUu!EKcC$U-KK5yxaeb&7D+ot??bw z&WvoYsuDLn3oJUgVN`Yb!>6Ii5WfvO0tU)~35K`98)_e0Gy#EwcY3_i*I=#Q%KA*7 zPIFeqj^JlhoIwLQ$yrJa>r(TEaia-O_uA=6Wm&Un_`|m@pyCAlAb4__YkajUU^yqy z_YS?WmgE*&Y~6SoA_+$8BcmlOkv8kcV%~iz69_bDarXSIyi_4Bgn>7SxEWNZB_|g- z7?)IUaE_nDMy*WwtF){f+7)vUQKSdA$tRDrIeCJ+^9DXodZC(cxr&H{B^0G+{7c>1Bl%qI@mAPmLIGncz-(s@x)BM6#%FkA0DQ*Iw7@7KQXzp)e%>Fx^m_?EP=qG^SB ziE-)lTK&!<#m8!7j-B-79c(!Rb_#mOPAGxBBBb9);8rqbWQ+LT0%##L_nz71QBjMQ zGev@`_65fvb|V$ICfweq)wv39X(mRoBw-4v*4E5yvK=IhPX^Z`KbpwM;tET@ z@PphYc^Q4=&er>+9jVbiv)2C8HCxA_2Jf93Ei%=$Zwq2+tu6^UWy0ohg*C`GI!67I zCX$11;|6^BV(7>^sRbS00Z_6)FKV>TYv~w_q7W;0Z5EsnzcWlQGgWfy5)B?Lm}4%B zte=%fvb#s$ent+jsh)<`w2mFDizZ~RGJj#t2CWS!PDYS-$hHvb%7t2FuoL;?YUH6V zEvtq%`>Oc|=MN?tOfJyT>X@dZuDD={g2_JF5XmKWxI3l87KPQFLQq=dKV$T4l2i+w zRU6X6SR`%v!W(rIOkP|3nin~G46Zm0-)Ylsh4G+=mfY`K{EXt$L+)*e4F8_63ht~% z2tMzAGWsKVsE_*@T+bviH_u7j?n70I73O$*f+O0u`BiPXN7ACob_4cwkGni_CbS$e zPcx~w1*iJ=!C~C}lh;CMyU!qNYOQCVKH~Ufl(n@F?%wDE*}NtP9S(oL5<6Lli-rE0 zIALp;zmUzwY|%o(D8_5uI^G{Gie}6m1=ou)_(l4w$zCW%W3i6hj^U2zQ{OsB^OH0C zm+W^gpUl}JHVKY;NUh68pTWpC8^69)k|tI?`__wzrU7o1mynvOaK6|KLOO9^9!$KWE) z6~{ts^9HN;Rl>Y>t%lOPYkfKd#}7TR6ao*Un_B(*jw z=((?`)Vz5>%jmzMR!PQh$u5W<+NV1qDmrnML&Ptq*|R#|z_!OVJv`M}O*QVj$9HVt zd#NWq>W_FXismSo??}q=M1d8ACHb|6i+8%<76OT z{Br`jZXFY_*Yff4t=55)RNt%e2eCZZ*K@awJ^G_)fUKS;QH9Q&isn`&5eT~o=0NXC zTc1(sXa^~k4i&)W@|AI?nz@MKQXHp@hpB%UEMDjllOh-en4Z;O0m$Xv^cky;v7;jv z9ZXvQ3@-xC(E{250BL|4%m1dT>6~3F6{~|xDxNB-Fk(uGscz1PrTki8=2b?kDltQjWc(D>t3rwJ(Cx$`y) zmv;JvY_04_cNm9=Q}9@NW&WO|xUyDgs0fgKZ-?!rTh{8Y`hhC^b9B&Dff?%f2UB8$W{o*K}k`zW)Z{ zjspIAypXvNRt3_=^c9KirjTPv95Q#`+00_+4m3i-%Y9TwOmvywK8Dhh7GLS8uEJwoj zl>HoXEx5BWGiPPMp`+ZIdr#v@!HpQF@^_0HLZwG>q8QsPELp2(xXw3r+@Ep3cSfQ( zH2h)WVmqpBhH@|5D<8QU<8_B|vA_L0t|GvqDcqcHW5Z<*3=1g%8oe2~Yb%iz(Tg7H zQp}W+`r1X{o#dlU&>vjpn%IR`iO`u%+$s24A3L==_A^>KutqdoFdB7rcu0Jx(6XZ? z<<*{V9MDQXXF#a!k(F6QTQWhG(ND$#00*<&NYICaP)b%4SLMAn9GxBpZ3Rk zug2xAB(6R4(E7MIuUkrf#(6zfM|3=;%u3&o8>8Y_g`D><>-zkjT9xLT?iFepvBFA) zrv#e)IyZQVmA2#Oy)NCtgXtAp#xU)zyi4}(dAGi+p$cPS;<>efN!mRYX|RUY15;44 zV6>jCb(Iarmc|JqUv$U^8D$|8iod>4kYE>r%9N zsk~3bDr^5YIcwlFMXQZ4b=@Efl$DY1Z7so&ePI9jWca2|b){W>1=*>V*k!S;?1{Lg+|IZ|XOJPu zdL-1XOuO~WJl_zXTKU`QN7q6!L$8KMC3bH{qzl*FZ>ea>_2NCtdNUFGm;u1a1)U3L zR2wB$F`lEjZS-$|f{G;mPd#^qy2qqGcS+FMPy4X<-KS9N+thg8r4c$wQ?U`BM<_s^ z?|%aYfcS}1?uhdVp7DKfJ<^cUfubeOb2bE|UrVWM7p1tLzpSHh$nr&U>E!vM`j1`; z2k{kWLzX*`n*HMol+e_}-?#H(jV>ZTzVdi0eWQNUCXy}PZWMQ0<`Vh> zSi4Yke1B{4&k>#73#8%E??H})^_2{ThUf727r0Ds^6@d5{77}ar0}lfmdKMb7~4!4 zsL@dH<>sZL37!CkpeO;odn+xu$-j!pG{oPW&vis?7s^(*RWJtW3%}c?wuLK=&y+1`@^B^0Ga{ifuZkL8 zL_d2X+GjIG9H0+WmMIGW@h+WA#Dxo49`c4VS?M=91W#?CRK(vFdMqh#96sc5_%)ei z4Y*Rd7YPjXp~6MMLc&z1w=Meum&g|fypd8uQD|cwJd82uc7jNb$X!TTEib%yc)ATn=6RZ3nvkxKElx}&z z6ji~+wbQSlAQGxoIzY;&Rl8z*@$Vgo;)KHN3o_)%_O$#VZ&0YKg8fo8P9e42s>l}2 zcW=aP(Az&JXxA_JBfhB+mT(bMZH&{quy2 z;`|S(|3v-&#@YXt)c>CoAZPwV8?tX#@7rah0?D-H890prl{~-n0HQq4{Lf>`3!<>I Yy*@2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4R@_W7pGc&Vutd_8!sgBMWo;O=p_Uw5v>FnnJhj0G4 zvf+S5?&p91|NNf*P`u~AQ?XtCwIi(p!6wg*Q{)}5+FVuROtSEK@IJmRzSQ{N$Adp2 zg~k7U|NO;i`;h!2O8|9w+Qx1OVJjga_16!bpk->v+>deenZU!7U zbLK!>B7;uuVTaFe{?AYJ+^yOCQh3{$BL{%s({ug9{!iwxGuQt!`s0%JIEa~ne_q_` U9+#BKz<^-zboFyt=akR{0JyrKasU7T literal 0 HcmV?d00001 diff --git a/src/CollectionPlugin/doc/images/group_intersection_property_panel.png b/src/CollectionPlugin/doc/images/group_intersection_property_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..54db4935b52d461cb2408102c7469213834ff2f0 GIT binary patch literal 5361 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 a$TS=24lg(2dGmYnsHLIzsN&)CH~#?xk=367 literal 0 HcmV?d00001 diff --git a/src/CollectionPlugin/doc/images/group_substraction.png b/src/CollectionPlugin/doc/images/group_substraction.png new file mode 100644 index 0000000000000000000000000000000000000000..7db75ec264792e4d7860c88cb769b2946f244682 GIT binary patch literal 369 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 S0QUPP93-zUS0!Wl_J07oa$pkx literal 0 HcmV?d00001 -- 2.39.2