From cdb5b7e24e24d5f7f2d98ab28b01603fdb7508f4 Mon Sep 17 00:00:00 2001 From: skl Date: Wed, 2 Dec 2020 10:36:38 +0300 Subject: [PATCH] 0031481: Data Exchange - provide parser of STEP EXPRESS schema for generation of new STEP entities Add generation hxx files with declaration of arrays. If field is a HArray1 method for get length of array and method for get element of array by its index are generated. --- src/Express/Express.cxx | 2 +- src/Express/Express_Entity.cxx | 192 +++++++++++++++++++++++++++++++-- 2 files changed, 185 insertions(+), 9 deletions(-) diff --git a/src/Express/Express.cxx b/src/Express/Express.cxx index 56470b66ee..ffd71a9ea3 100644 --- a/src/Express/Express.cxx +++ b/src/Express/Express.cxx @@ -84,7 +84,7 @@ void Express::WriteMethodStamp(Standard_OStream &theOS, const Handle(TCollection theOS << std::endl; theOS << "//=======================================================================" << std::endl; theOS << "//function : " << theName->ToCString() << std::endl; - theOS << "//purptheOSe : " << std::endl; + theOS << "//purpose : " << std::endl; theOS << "//=======================================================================" << std::endl; theOS << std::endl; } diff --git a/src/Express/Express_Entity.cxx b/src/Express/Express_Entity.cxx index 764116b5aa..564eae151a 100644 --- a/src/Express/Express_Entity.cxx +++ b/src/Express/Express_Entity.cxx @@ -146,7 +146,7 @@ static void writeSetMethod( Handle(TCollection_HAsciiString) method = new TCollection_HAsciiString("Set"); method->AssignCat(field); Express::WriteMethodStamp(os, method); - os << "void " << name->ToCString() << "::" << method->ToCString() << " (const " << + os << "void " << name->ToCString() << "::" << method->ToCString() << "(const " << (isHandle ? "Handle(" : "") << type->ToCString() << (isHandle ? ")" : "") << (isSimple ? "" : "&") << " the" << field->ToCString() << ")" << std::endl; os << "{" << std::endl << " my" << field->ToCString() << " = the" << field->ToCString() << ";\n}" << std::endl; @@ -266,6 +266,7 @@ Standard_Boolean Express_Entity::GenerateClass () const os << " Standard_EXPORT " << field->Type()->CPPName()->ToCString() << " " << field->Name()->ToCString() << "() const;" << std::endl; } + os << std::endl; os << " //! Sets field " << field->Name()->ToCString() << std::endl; if (field->Type()->IsHandle()) { @@ -280,10 +281,63 @@ Standard_Boolean Express_Entity::GenerateClass () const } if (field->IsOptional()) { + os << std::endl; os << " //! Returns True if optional field " << field->Name()->ToCString() << " is defined" << std::endl; os << " Standard_EXPORT Standard_Boolean Has" << field->Name()->ToCString() << "() const;" << std::endl; } os << std::endl; + + // prepare additional methods for HArray1 field (NbField() and FieldValue(int num)) + TCollection_AsciiString aTName = field->Type()->CPPName()->String(); + Standard_Integer ns = aTName.Search("_HArray"); + if (ns > -1) + { + TCollection_AsciiString namePack = aTName.SubString(1, ns); + TCollection_AsciiString nameClass(""); + if (namePack.IsEqual("TColStd_")) + { + Standard_Integer ns2 = aTName.Search("Integer"); + if (ns2 > -1) + { + nameClass = "Standard_Integer"; + } + else + { + ns2 = aTName.Search("Real"); + if (ns2 > -1) + { + nameClass = "Standard_Real"; + } + else + { + nameClass = "Standard_Boolean"; + } + } + } + else + { + if (namePack.IsEqual("Interface_")) + { + nameClass = "Handle(TCollection_HAsciiString)"; + } + else + { + //nameClass = namePack; + nameClass = "Handle("; + nameClass.AssignCat(namePack); + nameClass.AssignCat(aTName.SubString(ns + 10, aTName.Length())); + nameClass.AssignCat(")"); + } + } + os << " //! Returns number of " << field->Name()->ToCString() << std::endl; + os << " Standard_EXPORT Standard_Integer Nb" << field->Name()->ToCString() << "() const;" << std::endl; + os << std::endl; + os << " //! Returns value of " << field->Name()->ToCString() << " by its num" << std::endl; + os << " Standard_EXPORT "<< nameClass.ToCString() << " "<< field->Name()->ToCString() + << "Value(const Standard_Integer theNum) const;" << std::endl; + os << std::endl; + } + } os << " DEFINE_STANDARD_RTTIEXT(" << CPPname->ToCString() << ", " << InheritName->ToCString() << ")" << std::endl; @@ -384,15 +438,83 @@ Standard_Boolean Express_Entity::GenerateClass () const Handle(Express_Type) type = field->Type(); writeGetMethod(os, CPPname, field->Name(), type->CPPName(), type->IsHandle(), type->IsSimple()); writeSetMethod(os, CPPname, field->Name(), type->CPPName(), type->IsHandle(), type->IsSimple()); - if (!field->IsOptional()) + if (field->IsOptional()) { - continue; + Handle(TCollection_HAsciiString) method = new TCollection_HAsciiString("Has"); + method->AssignCat(field->Name()); + Express::WriteMethodStamp(os, method); + os << "Standard_Boolean " << CPPname->ToCString() << "::" << method->ToCString() << " () const" << std::endl; + os << "{" << std::endl << " return myHas" << field->Name()->ToCString() << ";\n}" << std::endl; } - Handle(TCollection_HAsciiString) method = new TCollection_HAsciiString("Has"); - method->AssignCat(field->Name()); - Express::WriteMethodStamp(os, method); - os << "Standard_Boolean " << CPPname->ToCString() << "::" << method->ToCString() << " () const" << std::endl; - os << "{" << std::endl << " return myHas" << field->Name()->ToCString() << ";\n}" << std::endl; + + // prepare additional methods for HArray1 field + TCollection_AsciiString aTName = field->Type()->CPPName()->String(); + Standard_Integer ns = aTName.Search("_HArray1"); + if (ns > -1) + { + TCollection_AsciiString namePack = aTName.SubString(1, ns); + TCollection_AsciiString nameClass(""); + if (namePack.IsEqual("TColStd_")) + { + Standard_Integer ns2 = aTName.Search("Integer"); + if (ns2 > -1) + { + nameClass = "Standard_Integer"; + } + else + { + ns2 = aTName.Search("Real"); + if (ns2 > -1) + { + nameClass = "Standard_Real"; + } + else + { + nameClass = "Standard_Boolean"; + } + } + } + else + { + if (namePack.IsEqual("Interface_")) + { + nameClass = "Handle(TCollection_HAsciiString)"; + } + else + { + //nameClass = namePack; + nameClass = "Handle("; + nameClass.AssignCat(namePack); + nameClass.AssignCat(aTName.SubString(ns + 10, aTName.Length())); + nameClass.AssignCat(")"); + } + } + // write method ::NbField() + os << std::endl; + Handle(TCollection_HAsciiString) aMethodName = new TCollection_HAsciiString("Nb"); + aMethodName->AssignCat(field->Name()); + Express::WriteMethodStamp(os, aMethodName); + os << "Standard_Integer " << CPPname->ToCString() << "::Nb" << field->Name()->ToCString() + << "() const;" << std::endl; + os << "{" << std::endl; + os << " if (my" << field->Name()->ToCString() << ".IsNull())" << std::endl; + os << " {" << std::endl; + os << " return 0;" << std::endl; + os << " }" << std::endl; + os << " return my" << field->Name()->ToCString() << "->Length();" << std::endl; + os << "}" << std::endl; + // write method ::FieldValue(num) + os << std::endl; + aMethodName = new TCollection_HAsciiString(field->Name()); + aMethodName->AssignCat("Value"); + Express::WriteMethodStamp(os, aMethodName); + os << nameClass.ToCString() << " " << CPPname->ToCString() << "::" << field->Name()->ToCString() + << "Value(const Standard_Integer theNum) const;" << std::endl; + os << "{" << std::endl; + os << " return my" << field->Name()->ToCString() << "->Value(theNum);" << std::endl; + os << "}" << std::endl; + } + } // close @@ -758,6 +880,60 @@ Standard_Boolean Express_Entity::writeIncludes( continue; } theOs << "#include <" << type->CPPName()->ToCString() << ".hxx>" << std::endl; + // check that last include is for array + TCollection_AsciiString namePack = GetPackageName()->String(); + TCollection_AsciiString aStrForSearch = namePack; + aStrForSearch.AssignCat("_HArray"); + Standard_Integer ns = type->CPPName()->Search(aStrForSearch.ToCString()); + if (ns > -1) + { + // create hxx files for Array1 and HArray1 + // prepare file names + ns = namePack.Length(); + TCollection_AsciiString nameHA = type->CPPName()->String(); + TCollection_AsciiString nameA = nameHA.SubString(1, ns + 1); + nameA.AssignCat(nameHA.SubString(ns + 3, nameHA.Length())); + TCollection_AsciiString nameClass = nameHA.SubString(ns + 11, nameHA.Length()); + // Open HXX file + TCollection_AsciiString fnameA = namePack; + fnameA.AssignCat("/"); + fnameA.AssignCat(nameA); + std::ofstream osa(fnameA.Cat(".hxx").ToCString()); + // write header + Express::WriteFileStamp(osa); + osa << std::endl; + osa << "#ifndef " << nameA.ToCString() << "_HeaderFile" << std::endl; + osa << "#define " << nameA.ToCString() << "_HeaderFile" << std::endl; + osa << std::endl; + osa << "#include <" << namePack.ToCString() << "_" << nameClass.ToCString() << ".hxx>" << std::endl; + osa << "#include " << std::endl; + osa << std::endl; + osa << "typedef NCollection_" << nameHA.SubString(ns + 3, ns + 8) << " " << nameA.ToCString() << ";" << std::endl; + osa << std::endl; + osa << "#endif" << std::endl; + osa.close(); + // Open HXX file + TCollection_AsciiString fnameHA = namePack; + fnameHA.AssignCat("/"); + fnameHA.AssignCat(nameHA); + std::ofstream osha(fnameHA.Cat(".hxx").ToCString()); + // write header + Express::WriteFileStamp(osha); + osha << std::endl; + osha << "#ifndef " << nameHA.ToCString() << "_HeaderFile" << std::endl; + osha << "#define " << nameHA.ToCString() << "_HeaderFile" << std::endl; + osha << std::endl; + osha << "#include <" << nameA << ".hxx>" << std::endl; + osha << "#include " << std::endl; + osha << std::endl; + osha << "DEFINE_HARRAY"<< nameHA.SubString(ns + 8, ns + 8) <<"(" << nameHA.ToCString() + << ", " << nameA.ToCString() << ");" << std::endl; + osha << std::endl; + osha << "#endif" << std::endl; + osha.close(); + } + } return Standard_True; } -- 2.39.5