diff --git a/src/IGESCAFControl/IGESCAFControl_Reader.cxx b/src/IGESCAFControl/IGESCAFControl_Reader.cxx index 40ae06eb63..86b083fe83 100644 --- a/src/IGESCAFControl/IGESCAFControl_Reader.cxx +++ b/src/IGESCAFControl/IGESCAFControl_Reader.cxx @@ -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(); diff --git a/src/IGESData/IGESData_ParamReader.cxx b/src/IGESData/IGESData_ParamReader.cxx index 84e675ba35..6e15ca77f5 100644 --- a/src/IGESData/IGESData_ParamReader.cxx +++ b/src/IGESData/IGESData_ParamReader.cxx @@ -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; } diff --git a/src/IGESData/IGESData_ParamReader.hxx b/src/IGESData/IGESData_ParamReader.hxx index de5f6fa951..70988b2f25 100644 --- a/src/IGESData/IGESData_ParamReader.hxx +++ b/src/IGESData/IGESData_ParamReader.hxx @@ -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 index 0000000000..5a17a77bf4 --- /dev/null +++ b/tests/bugs/iges/bug33327 @@ -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