This option allows to see the number of sub-shapes counting the same sub-shapes with different location as different sub-shapes.
Adding test cases for this fix
return 0;
}
+//=======================================================================
+// function : DumpExtent
+// purpose : Dumps the number of sub-shapes in <aStr>.
+//=======================================================================
+static void DumpExtent(const TopoDS_Shape& aS,
+ TCollection_AsciiString& aStr)
+{
+ const int aNbTypes=8;
+ const char *pNames[aNbTypes+1]={
+ " SHAPE : ",
+ " COMPOUND : ",
+ " COMPSOLID : ",
+ " SOLID : ",
+ " SHELL : ",
+ " FACE : ",
+ " WIRE : ",
+ " EDGE : ",
+ " VERTEX : "
+ };
+ Standard_Integer i, aNb, aNbSh;
+ TopAbs_ShapeEnum aType;
+ TopTools_IndexedMapOfShape aM;
+ //
+ aNbSh=0;
+ //
+ for (i=aNbTypes-1; i>=0; --i) {
+ aM.Clear();
+ aType=(TopAbs_ShapeEnum)i;
+ TopExp::MapShapes(aS, aType, aM);
+ aNb=aM.Extent();
+ aStr=aStr+pNames[i+1]+TCollection_AsciiString(aNb)+"\n";
+ aNbSh+=aNb;
+ }
+ aStr=aStr+pNames[0]+TCollection_AsciiString(aNbSh)+"\n";
+}
+
//=======================================================================
// nbshapes
//=======================================================================
static Standard_Integer nbshapes(Draw_Interpretor& di,
- Standard_Integer n, const char** a)
+ Standard_Integer n, const char** a)
{
if (n < 2) return 1;
Standard_Integer i;
+ Standard_Boolean aTotal;
TopExp_Explorer ex;
+ //
+ aTotal = !strcmp(a[n-1], "-t") ? Standard_True : Standard_False;
+ //
for (i = 1; i < n; i++) {
TopoDS_Shape S = DBRep::Get(a[i]);
if (!S.IsNull()) {
- BRepTools_ShapeSet BS;
- BS.Add(S);
di<<"Number of shapes in "<<a[i]<<"\n";
TCollection_AsciiString Astr;
- BS.DumpExtent(Astr);
+ if (aTotal) {
+ DumpExtent(S, Astr);
+ } else {
+ BRepTools_ShapeSet BS;
+ BS.Add(S);
+ BS.DumpExtent(Astr);
+ }
di<<Astr.ToCString();
}
}
theCommands.Add("complement","complement name1 name2 ...",__FILE__,orientation,g);
theCommands.Add("invert","invert name, reverse subshapes",__FILE__,invert,g);
theCommands.Add("normals","normals s (length = 10), disp normals",__FILE__,normals,g);
- theCommands.Add("nbshapes","nbshapes s; size of shape",__FILE__,nbshapes,g);
+ theCommands.Add("nbshapes",
+ "\n nbshapes s - shows the number of sub-shapes in <s>;\n nbshapes s -t - shows the number of sub-shapes in <s> counting the same sub-shapes with different location as different sub-shapes.",
+ __FILE__,nbshapes,g);
theCommands.Add("numshapes","numshapes s; size of shape",__FILE__,numshapes,g);
theCommands.Add("countshapes","countshapes s; count of shape",__FILE__,countshapes,g);
--- /dev/null
+puts "============"
+puts "CR23562"
+puts "============"
+puts ""
+##########################################################################################################
+# nbshapes command works incorrect with the attached shapes
+##########################################################################################################
+
+restore [locate_data_file bug23562_V3.brep] result
+set nb_info [nbshapes result]
+
+set nb_v_good 25
+set nb_e_good 45
+set nb_w_good 15
+set nb_f_good 15
+set nb_sh_good 1
+set nb_sol_good 1
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 103
--- /dev/null
+puts "============"
+puts "CR23562"
+puts "============"
+puts ""
+##########################################################################################################
+# nbshapes command works incorrect with the attached shapes
+##########################################################################################################
+
+restore [locate_data_file bug23562_V4.brep] result
+set nb_info [nbshapes result]
+
+set nb_v_good 24
+set nb_e_good 43
+set nb_w_good 20
+set nb_f_good 20
+set nb_sh_good 1
+set nb_sol_good 1
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 110
--- /dev/null
+puts "============"
+puts "CR23562"
+puts "============"
+puts ""
+##########################################################################################################
+# nbshapes command works incorrect with the attached shapes
+##########################################################################################################
+
+restore [locate_data_file bug23562_V3.brep] result
+set nb_info [nbshapes result -t]
+
+set nb_v_good 31
+set nb_e_good 51
+set nb_w_good 16
+set nb_f_good 16
+set nb_sh_good 1
+set nb_sol_good 1
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 117
--- /dev/null
+puts "============"
+puts "CR23562"
+puts "============"
+puts ""
+##########################################################################################################
+# nbshapes command works incorrect with the attached shapes
+##########################################################################################################
+
+restore [locate_data_file bug23562_V4.brep] result
+set nb_info [nbshapes result -t]
+
+set nb_v_good 30
+set nb_e_good 49
+set nb_w_good 21
+set nb_f_good 21
+set nb_sh_good 1
+set nb_sol_good 1
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 124
--- /dev/null
+puts "============"
+puts "CR23562"
+puts "============"
+puts ""
+##########################################################################################################
+# nbshapes command works incorrect with the attached shapes
+##########################################################################################################
+
+restore [locate_data_file bug23562_V3.brep] a
+explode a f
+compound a_1 a_16 result
+set nb_info [nbshapes result]
+
+set nb_v_good 6
+set nb_e_good 6
+set nb_w_good 1
+set nb_f_good 1
+set nb_sh_good 0
+set nb_sol_good 0
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 15
--- /dev/null
+puts "============"
+puts "CR23562"
+puts "============"
+puts ""
+##########################################################################################################
+# nbshapes command works incorrect with the attached shapes
+##########################################################################################################
+
+restore [locate_data_file bug23562_V3.brep] a
+explode a f
+compound a_1 a_16 result
+set nb_info [nbshapes result -t]
+
+set nb_v_good 12
+set nb_e_good 12
+set nb_w_good 2
+set nb_f_good 2
+set nb_sh_good 0
+set nb_sol_good 0
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 29
--- /dev/null
+if { [isdraw result] } {
+
+ if { [info exists square] } {
+ set prop "square"
+ set mass $square
+ regexp {Mass +: +([-0-9.+eE]+)} [sprops result] full m
+ }
+ if { [info exists length] } {
+ set prop "length"
+ set mass $length
+ regexp {Mass +: +([-0-9.+eE]+)} [lprops result] full m
+ }
+ if { [info exists mass] } {
+ #if mass (length or square) is empty in test case then result should be an empty shape.
+ if { [string compare "$mass" "empty"] != 0 } {
+ if { $m == 0 } {
+ puts "Error : The $command is not valid. The $prop is 0."
+ }
+ if { $mass > 0 } {
+ puts "The expected $prop is $mass"
+ }
+ #check of change of square is < 1%
+ if { ($mass != 0 && [expr 1.*abs($mass - $m)/$mass] > 0.01) || ($mass == 0 && $m != 0) } {
+ puts "Error : The $prop of result shape is $m"
+ }
+ } else {
+ if { $m != 0 } {
+ puts "Error : The $command is not valid. The $prop is $m"
+ }
+ }
+ }
+
+ if { [info exists nb_v_good] } {
+ regexp {VERTEX +: +([-0-9.+eE]+)} $nb_info full nb_v
+ if { ${nb_v} != ${nb_v_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_v_good} vertexes instead of ${nb_v}"
+ } else {
+ puts "Result shape contains ${nb_v} vertexes"
+ }
+ }
+
+ if { [info exists nb_e_good] } {
+ regexp {EDGE +: +([-0-9.+eE]+)} $nb_info full nb_e
+ if { ${nb_e} != ${nb_e_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_e_good} edges instead of ${nb_e}"
+ } else {
+ puts "Result shape contains ${nb_e} edges"
+ }
+ }
+
+ if { [info exists nb_w_good] } {
+ regexp {WIRE +: +([-0-9.+eE]+)} $nb_info full nb_w
+ if { ${nb_w} != ${nb_w_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_w_good} wires instead of ${nb_w}"
+ } else {
+ puts "Result shape contains ${nb_w} wires"
+ }
+ }
+
+ if { [info exists nb_f_good] } {
+ regexp {FACE +: +([-0-9.+eE]+)} $nb_info full nb_f
+ if { ${nb_f} != ${nb_f_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_f_good} faces instead of ${nb_f}"
+ } else {
+ puts "Result shape contains ${nb_f} faces"
+ }
+ }
+
+ if { [info exists nb_sh_good] } {
+ regexp {SHELL +: +([-0-9.+eE]+)} $nb_info full nb_sh
+ if { ${nb_sh} != ${nb_sh_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_sh_good} shells instead of ${nb_sh}"
+ } else {
+ puts "Result shape contains ${nb_sh} shells"
+ }
+ }
+
+ if { [info exists nb_sol_good] } {
+ regexp {SOLID +: +([-0-9.+eE]+)} $nb_info full nb_sol
+ if { ${nb_sol} != ${nb_sol_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_sol_good} solids instead of ${nb_sol}"
+ } else {
+ puts "Result shape contains ${nb_sol} solids"
+ }
+ }
+
+ if { [info exists nb_compsol_good] } {
+ regexp {COMPSOLID +: +([-0-9.+eE]+)} $nb_info full nb_compsol
+ if { ${nb_compsol} != ${nb_compsol_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_compsol_good} compsolids instead of ${nb_compsol}"
+ } else {
+ puts "Result shape contains ${nb_compsol} compsolids"
+ }
+ }
+
+ if { [info exists nb_compound_good] } {
+ regexp {COMPOUND +: +([-0-9.+eE]+)} $nb_info full nb_compound
+ if { ${nb_compound} != ${nb_compound_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_compound_good} compounds instead of ${nb_compound}"
+ } else {
+ puts "Result shape contains ${nb_compound} compounds"
+ }
+ }
+
+ if { [info exists nb_shape_good] } {
+ regexp {SHAPE +: +([-0-9.+eE]+)} $nb_info full nb_shape
+ if { ${nb_shape} != ${nb_shape_good} } {
+ puts "Error : Result shape is WRONG because it must contains ${nb_shape_good} shapes instead of ${nb_shape}"
+ } else {
+ puts "Result shape contains ${nb_shape} shapes"
+ }
+ }
+
+}