]> OCCT Git - occt.git/commitdiff
0031685: Data Exchange, STEPCAFControl_Reader - NULL dereference on translating PLACE...
authordpasukhi <dpasukhi@opencascade.com>
Sun, 13 Sep 2020 18:13:49 +0000 (21:13 +0300)
committerbugmaster <bugmaster@opencascade.com>
Mon, 28 Sep 2020 07:46:02 +0000 (10:46 +0300)
- Fix incorrect sharing DatumTargetType_Area
- Add check for null object

src/STEPCAFControl/STEPCAFControl_Reader.cxx
tests/bugs/step/bug31685_1 [new file with mode: 0644]
tests/bugs/step/bug31685_2 [new file with mode: 0644]
tests/bugs/step/bug31685_3 [new file with mode: 0644]

index 37fc818ddabf2e32ac9079028a58af776c18f05b..eb88fd3f55f1930931b4f55ba09c5ffce675b2c0 100644 (file)
@@ -2400,7 +2400,10 @@ Standard_Boolean STEPCAFControl_Reader::setDatumToXCAF(const Handle(StepDimTol_D
     Handle(XCAFDimTolObjects_DatumObject) aDatTargetObj = new XCAFDimTolObjects_DatumObject();
     XCAFDimTolObjects_DatumTargetType aType;
     if (!STEPCAFControl_GDTProperty::GetDatumTargetType(aDT->Description(), aType))
+    {
+      aTP->AddWarning(aDT, "Unknown datum target type");
       continue;
+    }
     aDatTargetObj->SetDatumTargetType(aType);
     Standard_Boolean isValidDT = Standard_False;
 
@@ -2446,13 +2449,16 @@ Standard_Boolean STEPCAFControl_Reader::setDatumToXCAF(const Handle(StepDimTol_D
 
     if (aType == XCAFDimTolObjects_DatumTargetType_Area) {
       // Area datum target
-      Interface_EntityIterator anIterDTF = aGraph.Shareds(aDT);
+      if (aRelationship.IsNull())
+        continue;
+      Handle(StepRepr_ShapeAspect) aSA = aRelationship->RelatingShapeAspect();
+      Interface_EntityIterator aSAIter = aGraph.Sharings(aSA);
       Handle(StepAP242_GeometricItemSpecificUsage) aGISU;
-      for (; anIterDTF.More() && aGISU.IsNull(); anIterDTF.Next()) {
-        aGISU = Handle(StepAP242_GeometricItemSpecificUsage)::DownCast(anIterDTF.Value());
+      for (; aSAIter.More() && aGISU.IsNull(); aSAIter.Next()) {
+        aGISU = Handle(StepAP242_GeometricItemSpecificUsage)::DownCast(aSAIter.Value());
       }
       Handle(StepRepr_RepresentationItem) anItem;
-      if (aGISU->NbIdentifiedItem() > 0)
+      if (!aGISU.IsNull() && aGISU->NbIdentifiedItem() > 0)
         anItem = aGISU->IdentifiedItemValue(1);
       if (anItem.IsNull())
         continue;
diff --git a/tests/bugs/step/bug31685_1 b/tests/bugs/step/bug31685_1
new file mode 100644 (file)
index 0000000..0b789b5
--- /dev/null
@@ -0,0 +1,44 @@
+puts "==================================================="
+puts " 0031685: Data Exchange, STEPCAFControl_Reader - NULL dereference on translating PLACED_DATUM_TARGET_FEATURE "
+puts "==================================================="
+puts ""
+
+pload DCAF
+
+# Read file
+ReadStep D [locate_data_file bug31685_1.stp]
+XGetOneShape res D
+
+# Checking
+checkshape res f
+set dump [XDumpNbDGTs D f]
+set info "
+
+ NbOfDimensions          : 14
+  NbOfDimensionalSize    : 7
+  NbOfDimensionalLocation: 0
+  NbOfAngular            : 0
+  NbOfWithPath           : 0
+  NbOfCommonLabels       : 0
+ NbOfTolerances          : 22
+  NbOfGTWithModifiers    : 4
+  NbOfGTWithMaxTolerance : 0
+  NbOfGTWithDatums       : 20
+ NbOfDatumFeature        : 13
+ NbOfAttachedDatum       : 70
+ NbOfDatumTarget         : 57
+"
+set isOK 1;
+set nb_ref [llength $dump]
+for { set i 0 } { $i < $nb_ref } { incr i } {
+  set refstr [lindex $info $i]
+  set curstr [lindex $dump $i]
+  if {[string equal $refstr $curstr] == 0} {
+    set isOK 0
+  }
+}
+if {$isOK == 0} {
+  puts "Error: wrong translate DGT"
+}
+
+Close D
\ No newline at end of file
diff --git a/tests/bugs/step/bug31685_2 b/tests/bugs/step/bug31685_2
new file mode 100644 (file)
index 0000000..a36efa9
--- /dev/null
@@ -0,0 +1,44 @@
+puts "==================================================="
+puts " 0031685: Data Exchange, STEPCAFControl_Reader - NULL dereference on translating PLACED_DATUM_TARGET_FEATURE "
+puts "==================================================="
+puts ""
+
+pload DCAF
+
+# Read file
+ReadStep D [locate_data_file bug31685_2.stp] 
+XGetOneShape res D
+
+# Checking
+checkshape res f
+set dump [XDumpNbDGTs D f]
+set info "
+
+ NbOfDimensions          : 52
+  NbOfDimensionalSize    : 17
+  NbOfDimensionalLocation: 4
+  NbOfAngular            : 0
+  NbOfWithPath           : 0
+  NbOfCommonLabels       : 1
+ NbOfTolerances          : 26
+  NbOfGTWithModifiers    : 3
+  NbOfGTWithMaxTolerance : 0
+  NbOfGTWithDatums       : 23
+ NbOfDatumFeature        : 16
+ NbOfAttachedDatum       : 72
+ NbOfDatumTarget         : 1
+"
+set isOK 1;
+set nb_ref [llength $dump]
+for { set i 0 } { $i < $nb_ref } { incr i } {
+  set refstr [lindex $info $i]
+  set curstr [lindex $dump $i]
+  if {[string equal $refstr $curstr] == 0} {
+    set isOK 0
+  }
+}
+if {$isOK == 0} {
+  puts "Error: wrong translate DGT"
+}
+
+Close D
\ No newline at end of file
diff --git a/tests/bugs/step/bug31685_3 b/tests/bugs/step/bug31685_3
new file mode 100644 (file)
index 0000000..97ed381
--- /dev/null
@@ -0,0 +1,44 @@
+puts "==================================================="
+puts " 0031685: Data Exchange, STEPCAFControl_Reader - NULL dereference on translating PLACED_DATUM_TARGET_FEATURE "
+puts "==================================================="
+puts ""
+
+pload DCAF
+
+# Read file
+ReadStep D [locate_data_file bug31685_3.stp] 
+XGetOneShape res D
+
+# Checking
+checkshape res f
+set dump [XDumpNbDGTs D f]
+set info "
+
+ NbOfDimensions          : 60
+  NbOfDimensionalSize    : 20
+  NbOfDimensionalLocation: 2
+  NbOfAngular            : 0
+  NbOfWithPath           : 0
+  NbOfCommonLabels       : 1
+ NbOfTolerances          : 38
+  NbOfGTWithModifiers    : 3
+  NbOfGTWithMaxTolerance : 0
+  NbOfGTWithDatums       : 35
+ NbOfDatumFeature        : 15
+ NbOfAttachedDatum       : 109
+ NbOfDatumTarget         : 4
+"
+set isOK 1;
+set nb_ref [llength $dump]
+for { set i 0 } { $i < $nb_ref } { incr i } {
+  set refstr [lindex $info $i]
+  set curstr [lindex $dump $i]
+  if {[string equal $refstr $curstr] == 0} {
+    set isOK 0
+  }
+}
+if {$isOK == 0} {
+  puts "Error: wrong translate DGT"
+}
+
+Close D
\ No newline at end of file