]> OCCT Git - occt.git/commitdiff
0033327: Data Exchange, IGES Import - SubfigureDef can't read string CR0-WEEK-12 IR-2023-03-24
authordpasukhi <dpasukhi@opencascade.com>
Thu, 9 Mar 2023 17:08:39 +0000 (17:08 +0000)
committervglukhik <vglukhik@opencascade.com>
Mon, 20 Mar 2023 23:11:36 +0000 (23:11 +0000)
Fixed problem with texted types
Added checking for null string for subfigure via XCAF transferring

src/IGESCAFControl/IGESCAFControl_Reader.cxx
src/IGESData/IGESData_ParamReader.cxx
src/IGESData/IGESData_ParamReader.hxx
tests/bugs/iges/bug33327 [new file with mode: 0644]

index 40ae06eb63a1e23f39223888130adad27a4ad29f..86b083fe8346433ca94f0f6b5a0b70d108f7a095 100644 (file)
@@ -322,7 +322,8 @@ Standard_Boolean IGESCAFControl_Reader::Transfer (const Handle(TDocStd_Document)
 
     //Checks that current entity is a subfigure
     Handle(IGESBasic_SubfigureDef) aSubfigure = Handle(IGESBasic_SubfigureDef)::DownCast (ent);
-    if (GetNameMode() && !aSubfigure.IsNull() && STool->Search (S, L, Standard_True, Standard_True))
+    if (GetNameMode() && !aSubfigure.IsNull() && !aSubfigure->Name().IsNull() &&
+        STool->Search(S, L, Standard_True, Standard_True))
     {
       //In this case we attach subfigure name to the label, instead of default "COMPOUND"
       Handle(TCollection_HAsciiString) aName = aSubfigure->Name();
index 84e675ba353fba812b8f0128071fc0ee0ea6a7bf..6e15ca77f5ff259c6b353230d0840f877aaae21d 100644 (file)
@@ -633,34 +633,55 @@ Standard_Boolean IGESData_ParamReader::ReadXYZ
 
 //=======================================================================
 //function : ReadText
-//purpose  : 
+//purpose  :
 //=======================================================================
-
-Standard_Boolean IGESData_ParamReader::ReadText
-  (const IGESData_ParamCursor& PC, const Message_Msg& amsg,
-   Handle(TCollection_HAsciiString)& val)
+Standard_Boolean IGESData_ParamReader::ReadText(const IGESData_ParamCursor& thePC,
+                                                const Message_Msg& theMsg,
+                                                Handle(TCollection_HAsciiString)& theVal)
 {
-  if (!PrepareRead(PC,Standard_False)) return Standard_False;
-  const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
-  if (FP.ParamType() != Interface_ParamText) {
-    if (FP.ParamType() == Interface_ParamVoid) {
-      val = new TCollection_HAsciiString("");
+  if (!PrepareRead(thePC, Standard_False))
+  {
+    return Standard_False;
+  }
+  const Interface_FileParameter& aFP = theparams->Value(theindex + thebase);
+  if (aFP.ParamType() != Interface_ParamText)
+  {
+    theVal = new TCollection_HAsciiString("");
+    if (aFP.ParamType() == Interface_ParamVoid)
+    {
       return Standard_True;
     }
-    SendFail (amsg);
+    SendFail(theMsg);
     return Standard_False;
   }
-  Handle(TCollection_HAsciiString) tval = new TCollection_HAsciiString (FP.CValue());
-  Standard_Integer lnt = tval->Length();
-  Standard_Integer lnh = tval->Location(1,'H',1,lnt);
-  if (lnh <= 1 || lnh >= lnt) {
-    SendFail (amsg);
+  const Handle(TCollection_HAsciiString) aBaseValue = new TCollection_HAsciiString(aFP.CValue());
+  const Standard_Integer aBaseLength = aBaseValue->Length();
+  const Standard_Integer aSymbolLocation = aBaseValue->Location(1, 'H', 1, aBaseLength);
+  if (aSymbolLocation <= 1 || aSymbolLocation > aBaseLength)
+  {
+    theVal = new TCollection_HAsciiString("");
+    SendFail(theMsg);
     return Standard_False;
-  } else {
-    Standard_Integer hol = atoi (tval->SubString(1,lnh-1)->ToCString());
-    if (hol != (lnt-lnh)) SendWarning (amsg);
   }
-  val = new TCollection_HAsciiString(tval->SubString(lnh+1,lnt)->ToCString());
+  const TCollection_AsciiString aSpecialSubString = aBaseValue->String().SubString(1, aSymbolLocation - 1);
+  if (!aSpecialSubString.IsIntegerValue())
+  {
+    theVal = new TCollection_HAsciiString("");
+    SendFail(theMsg);
+    return Standard_False;
+  }
+  Standard_Integer aResLength = aSpecialSubString.IntegerValue();
+  if (aResLength != (aBaseLength - aSymbolLocation))
+  {
+    SendWarning(theMsg);
+    aResLength = aBaseLength - aSymbolLocation;
+  }
+  TCollection_AsciiString aResString;
+  if (aResLength > 0)
+  {
+    aResString = aBaseValue->String().SubString(aSymbolLocation + 1, aBaseLength);
+  }
+  theVal = new TCollection_HAsciiString(aResString);
   return Standard_True;
 }
 
index de5f6fa95103880bee366f5c7600eb1779c7c5c7..70988b2f255cdbacc4ee7c9ce92b3c22a4382145 100644 (file)
@@ -200,7 +200,7 @@ public:
   //! For Message
   Standard_EXPORT Standard_Boolean ReadXYZ (const IGESData_ParamCursor& PC, const Standard_CString mess, gp_XYZ& val);
   
-  Standard_EXPORT Standard_Boolean ReadText (const IGESData_ParamCursor& PC, const Message_Msg& amsg, Handle(TCollection_HAsciiString)& val);
+  Standard_EXPORT Standard_Boolean ReadText (const IGESData_ParamCursor& thePC, const Message_Msg& theMsg, Handle(TCollection_HAsciiString)& theVal);
   
   //! Reads a Text value from parameter "num", as a String from
   //! Collection, that is, Hollerith text without leading "nnnH"
diff --git a/tests/bugs/iges/bug33327 b/tests/bugs/iges/bug33327
new file mode 100644 (file)
index 0000000..5a17a77
--- /dev/null
@@ -0,0 +1,16 @@
+puts "============"
+puts "0033327: Data Exchange, IGES Import - SubfigureDef can't read string"
+puts "============"
+
+pload DCAF
+
+Close D -silent
+
+ReadIges D [locate_data_file "bug33327.igs"]
+vclear
+vinit View1
+XDisplay -dispMode 1 D
+vfit
+vdump "$imagedir/${casename}_src.png"
+
+Close D