From 48c7741dc964045cde55ef1231e48f097e6374a1 Mon Sep 17 00:00:00 2001 From: skl Date: Tue, 1 Dec 2020 11:40:51 +0300 Subject: [PATCH] 0031481: Data Exchange - provide parser of STEP EXPRESS schema for generation of new STEP entities Next changes for correspondence generated files to OCCT Code Rules. --- src/Express/Express_Entity.cxx | 186 ++++++++++++++++++++------------- 1 file changed, 112 insertions(+), 74 deletions(-) diff --git a/src/Express/Express_Entity.cxx b/src/Express/Express_Entity.cxx index 20ec9f5b53..764116b5aa 100644 --- a/src/Express/Express_Entity.cxx +++ b/src/Express/Express_Entity.cxx @@ -275,7 +275,8 @@ Standard_Boolean Express_Entity::GenerateClass () const else { os << " Standard_EXPORT void Set" << field->Name()->ToCString() << " (const " - << field->Type()->CPPName()->ToCString() << " the" << field->Name()->ToCString() << ");" << std::endl; + << field->Type()->CPPName()->ToCString() << (field->Type()->IsSimple() ? "" : "&") + << " the" << field->Name()->ToCString() << ");" << std::endl; } if (field->IsOptional()) { @@ -396,7 +397,13 @@ Standard_Boolean Express_Entity::GenerateClass () const // close os.close(); - if (AbstractFlag()) return Standard_True; + + if (AbstractFlag()) + { + // generation of RW class is not needed + return Standard_True; + } + //=============================== // Step 3: generating HXX for Reader/Writer class @@ -446,20 +453,20 @@ Standard_Boolean Express_Entity::GenerateClass () const os << " Standard_EXPORT " << RWCPPName->ToCString() << "();" << std::endl << std::endl; // read step - os << " Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data," << std::endl; - os << " const Standard_Integer num," << std::endl; - os << " Handle(Interface_Check)& ach," << std::endl; - os << " const Handle(" << CPPName()->ToCString() << ")& ent) const;" + os << " Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& theData," << std::endl; + os << " const Standard_Integer theNum," << std::endl; + os << " Handle(Interface_Check)& theCheck," << std::endl; + os << " const Handle(" << CPPName()->ToCString() << ")& theEnt) const;" << std::endl << std::endl; // write step - os << " Standard_EXPORT void WriteStep(StepData_StepWriter& SW," << std::endl; - os << " const Handle(" << CPPName()->ToCString() << ")& ent) const;" + os << " Standard_EXPORT void WriteStep(StepData_StepWriter& theSW," << std::endl; + os << " const Handle(" << CPPName()->ToCString() << ")& theEnt) const;" << std::endl << std::endl; // share - os << " Standard_EXPORT void Share(const Handle(" << CPPName()->ToCString() << ")& ent," << std::endl; - os << " Interface_EntityIterator& iter) const;" << std::endl << std::endl; + os << " Standard_EXPORT void Share(const Handle(" << CPPName()->ToCString() << ")& theEnt," << std::endl; + os << " Interface_EntityIterator& theIter) const;" << std::endl << std::endl; // write end os << "};" << std::endl << std::endl; @@ -492,27 +499,27 @@ Standard_Boolean Express_Entity::GenerateClass () const Express::WriteMethodStamp(os, new TCollection_HAsciiString("ReadStep")); if (RWCPPName->Length() < 40) { - os << "void " << RWCPPName->ToCString() << "::ReadStep (const Handle(StepData_StepReaderData)& data," << std::endl; + os << "void " << RWCPPName->ToCString() << "::ReadStep (const Handle(StepData_StepReaderData)& theData," << std::endl; writeSpaces(os, 17 + RWCPPName->Length()); - os << "const Standard_Integer num," << std::endl; + os << "const Standard_Integer theNum," << std::endl; writeSpaces(os, 17 + RWCPPName->Length()); - os << "Handle(Interface_Check)& ach," << std::endl; + os << "Handle(Interface_Check)& theCheck," << std::endl; writeSpaces(os, 17 + RWCPPName->Length()); - os << "const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl; + os << "const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl; } else { os << "void " << RWCPPName->ToCString() << "::ReadStep(" << std::endl; - os << " const Handle(StepData_StepReaderData)& data," << std::endl; - os << " const Standard_Integer num," << std::endl; - os << " Handle(Interface_Check)& ach," << std::endl; - os << " const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl; + os << " const Handle(StepData_StepReaderData)& theData," << std::endl; + os << " const Standard_Integer theNum," << std::endl; + os << " Handle(Interface_Check)& theCheck," << std::endl; + os << " const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl; } os << "{" << std::endl; Standard_Integer nbFld = NbFields ( Standard_True ); os << " // Check number of parameters" << std::endl; - os << " if (!data->CheckNbParams(num, " << nbFld << ", ach, \"" << + os << " if (!theData->CheckNbParams(theNum, " << nbFld << ", theCheck, \"" << Express::ToStepName(Name())->ToCString() << "\"))" << std::endl; os << " {" << std::endl; os << " return;" << std::endl; @@ -520,23 +527,23 @@ Standard_Boolean Express_Entity::GenerateClass () const writeRWReadCode(os, 1, Standard_True); // write code for reading inherited and own fields os << std::endl; os << " // Initialize entity" << std::endl; - os << " ent->Init("; - makeInit(os, 12, Standard_True, 4); + os << " theEnt->Init("; + makeInit(os, 15, Standard_True, 4); os << ");\n}" << std::endl; // write method WriteStep Express::WriteMethodStamp(os, new TCollection_HAsciiString("WriteStep")); if (RWCPPName->Length() < 40) { - os << "void " << RWCPPName->ToCString() << "::WriteStep (StepData_StepWriter& SW," << std::endl; + os << "void " << RWCPPName->ToCString() << "::WriteStep (StepData_StepWriter& theSW," << std::endl; writeSpaces(os, 18 + RWCPPName->Length()); - os << "const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl; + os << "const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl; } else { os << "void " << RWCPPName->ToCString() << "::WriteStep(" << std::endl; - os << " StepData_StepWriter& SW," << std::endl; - os << " const Handle(" << CPPname->ToCString() << ")& ent) const" << std::endl; + os << " StepData_StepWriter& theSW," << std::endl; + os << " const Handle(" << CPPname->ToCString() << ")& theEnt) const" << std::endl; } os << "{" << std::endl; @@ -545,20 +552,41 @@ Standard_Boolean Express_Entity::GenerateClass () const // write method Share Express::WriteMethodStamp(os, new TCollection_HAsciiString("Share")); + std::ostringstream oos; + Standard_Integer nbF = writeRWShareCode(oos, 1, Standard_True); // write code for filling graph of references if (RWCPPName->Length() < 40) { - os << "void " << RWCPPName->ToCString() << "::Share (const Handle(" << CPPname->ToCString() << ")& ent," << std::endl; + os << "void " << RWCPPName->ToCString() << "::Share (const Handle(" << CPPname->ToCString() << ")&"; + os << ((nbF > 1) ? "theEnt," : ",") << std::endl; writeSpaces(os, 14 + RWCPPName->Length()); - os << "Interface_EntityIterator& iter) const" << std::endl; + if (nbF > 1) + { + os << "Interface_EntityIterator& theIter) const" << std::endl; + } + else + { + os << "Interface_EntityIterator&) const" << std::endl; + } } else { os << "void " << RWCPPName->ToCString() << "::Share(" << std::endl; - os << " const Handle(" << CPPname->ToCString() << ")& ent," << std::endl; - os << " Interface_EntityIterator& iter) const" << std::endl; + os << " const Handle(" << CPPname->ToCString() << ")&"; + os<< ((nbF > 1) ? "theEnt," : ",") << std::endl; + if (nbF > 1) + { + os << "Interface_EntityIterator& theIter) const" << std::endl; + } + else + { + os << "Interface_EntityIterator&) const" << std::endl; + } } os << "{" << std::endl; - writeRWShareCode ( os, 1, Standard_True ); // write code for filling graph of references + if (nbF > 1) + { + os << oos.str(); + } os << "}" << std::endl; if(CheckFlag()) { @@ -699,7 +727,7 @@ Standard_Boolean Express_Entity::writeIncludes( Standard_OStream& theOs, DataMapOfStringInteger& theDict) const { - for (Standard_Integer i = 1; i <= myInherit->Length(); i++) + for (Standard_Integer i = 2; i <= myInherit->Length(); i++) { Handle(Express_Entity) it = myInherit->Value(i); it->writeIncludes(theOs, theDict); @@ -812,9 +840,10 @@ static void writeRWReadField( level += 2; // name of variable identifying number of parameter in data - TCollection_AsciiString param("num"); + TCollection_AsciiString param("theNum"); if (lev > 0) { + param = TCollection_AsciiString("num"); param += TCollection_AsciiString(lev); } @@ -845,7 +874,7 @@ static void writeRWReadField( if (optional) { theOs << shift << "Standard_Boolean has" << varname << " = Standard_True;" << std::endl; - theOs << shift << "if (data->IsParamDefined(" << param << ", " << index << "))" << std::endl; + theOs << shift << "if (theData->IsParamDefined(" << param << ", " << index << "))" << std::endl; theOs << shift << "{" << std::endl; shift += " "; level++; @@ -857,20 +886,20 @@ static void writeRWReadField( Handle(Express_NamedType) named = Handle(Express_NamedType)::DownCast(type); if (named->Item()->IsKind(STANDARD_TYPE(Express_Entity))) { - theOs << shift << "data->ReadEntity(" << param << ", " << index << ", \"" << STEPName << "\", ach," << std::endl; + theOs << shift << "theData->ReadEntity(" << param << ", " << index << ", \"" << STEPName << "\", theCheck," << std::endl; theOs << shift << " STANDARD_TYPE(" << named->CPPName()->ToCString() << "), a" << varname << ");" << std::endl; } else if (named->Item()->IsKind(STANDARD_TYPE(Express_Select))) { - theOs << shift << "data->ReadEntity(" << param << ", " << index << ", \"" << STEPName << - "\", ach, a" << varname << ");" << std::endl; + theOs << shift << "theData->ReadEntity(" << param << ", " << index << ", \"" << STEPName << + "\", theCheck, a" << varname << ");" << std::endl; } else if (named->Item()->IsKind(STANDARD_TYPE(Express_Enum))) { - theOs << shift << "if (data->ParamType(" << param << ", " << + theOs << shift << "if (theData->ParamType(" << param << ", " << index << ") == Interface_ParamEnum)" << std::endl; theOs << shift << "{" << std::endl; - theOs << shift << " Standard_CString text = data->ParamCValue(" << + theOs << shift << " Standard_CString text = theData->ParamCValue(" << param << ", " << index << ");" << std::endl; Handle(Express_Enum) en = Handle(Express_Enum)::DownCast(named->Item()); Handle(TCollection_HAsciiString) prefix = Express::EnumPrefix(en->Name()); @@ -887,13 +916,13 @@ static void writeRWReadField( } theOs << shift << " else" << std::endl; theOs << shift << " {" << std::endl; - theOs << shift << " ach->AddFail(\"Parameter #" << index << " (" << STEPName + theOs << shift << " theCheck->AddFail(\"Parameter #" << index << " (" << STEPName << ") has not allowed value\");" << std::endl; theOs << shift << " }" << std::endl; theOs << shift << "}" << std::endl; theOs << shift << "else" << std::endl; theOs << shift << "{" << std::endl; - theOs << shift << " ach->AddFail(\"Parameter #" << index << " (" << STEPName + theOs << shift << " theCheck->AddFail(\"Parameter #" << index << " (" << STEPName << ") is not enumeration\");" << std::endl; theOs << shift << "}" << std::endl; //theOs << "!!! READING/WRITING ENUM NOT IMPLEMENTED !!!" << std::endl; @@ -905,10 +934,10 @@ static void writeRWReadField( { Handle(Express_ComplexType) complex = Handle(Express_ComplexType)::DownCast(type); theOs << shift << "Standard_Integer sub" << index << " = 0;" << std::endl; - theOs << shift << "if (data->ReadSubList(" << param << ", " << index << ", \"" << - STEPName << "\", ach, sub" << index << "))" << std::endl; + theOs << shift << "if (theData->ReadSubList(" << param << ", " << index << ", \"" << + STEPName << "\", theCheck, sub" << index << "))" << std::endl; theOs << shift << "{" << std::endl; - theOs << shift << " Standard_Integer nb" << lev << " = data->NbParams(sub" << index << ");" << std::endl; + theOs << shift << " Standard_Integer nb" << lev << " = theData->NbParams(sub" << index << ");" << std::endl; TCollection_AsciiString iter = lev; iter.Prepend("i"); TCollection_AsciiString var = lev; @@ -919,15 +948,15 @@ static void writeRWReadField( TCollection_AsciiString jter = lev; jter.Prepend("j"); theOs << shift << " Standard_Integer nbj" << lev << - " = data->NbParams(data->ParamNumber(sub" << index << ",1));" << std::endl; + " = theData->NbParams(theData->ParamNumber(sub" << index << ",1));" << std::endl; theOs << shift << " a" << varname << " = new " << type->CPPName()->ToCString() << "(1, nb" << lev << ", 1, nbj" << lev << ");" << std::endl; theOs << shift << " for (Standard_Integer " << iter << " = 1; " << iter << " <= nb" << lev << "; " << iter << "++)" << std::endl; theOs << shift << " {" << std::endl; theOs << shift << " Standard_Integer subj" << index << " = 0;" << std::endl; - theOs << shift << " if ( data->ReadSubList (sub" << index << ", " << iter << ", \"sub-part(" << - STEPName << ")\", ach, subj" << index << ") ) {" << std::endl; + theOs << shift << " if ( theData->ReadSubList (sub" << index << ", " << iter << ", \"sub-part(" << + STEPName << ")\", theCheck, subj" << index << ") ) {" << std::endl; theOs << shift << " Standard_Integer num" << level + 2 << " = subj" << index << ";" << std::endl; theOs << shift << " for (Standard_Integer " << jter << " = 1; " << jter << " <= nbj" << lev << "; " << jter << "++)" << std::endl; @@ -960,34 +989,35 @@ static void writeRWReadField( { if (strlen(STEPName) + strlen(varname) < 70) { - theOs << shift << "data->ReadString(" << param << ", " << index << ", \"" << STEPName << - "\", ach, a" << varname << ");" << std::endl; + theOs << shift << "theData->ReadString(" << param << ", " << index << ", \"" << STEPName + << "\", theCheck, a" << varname << ");" << std::endl; } else { - theOs << shift << "data->ReadString(" << param << ", " << index << ", \"" << STEPName << "\", ach," << std::endl; + theOs << shift << "theData->ReadString(" << param << ", " << index << ", \"" << STEPName + << "\", theCheck," << std::endl; theOs << shift << " a" << varname << ");" << std::endl; } } else if (type->IsKind(STANDARD_TYPE(Express_Logical))) { - theOs << shift << "data->ReadLogical(" << param << ", " << index << ", \"" << STEPName << - "\", ach, a" << varname << ");" << std::endl; + theOs << shift << "theData->ReadLogical(" << param << ", " << index << ", \"" << STEPName << + "\", theCheck, a" << varname << ");" << std::endl; } else if (type->IsKind(STANDARD_TYPE(Express_Boolean))) { - theOs << shift << "data->ReadBoolean(" << param << ", " << index << ", \"" << STEPName << - "\", ach, a" << varname << ");" << std::endl; + theOs << shift << "theData->ReadBoolean(" << param << ", " << index << ", \"" << STEPName << + "\", theCheck, a" << varname << ");" << std::endl; } else if (type->IsKind(STANDARD_TYPE(Express_Number)) || type->IsKind(STANDARD_TYPE(Express_Integer))) { - theOs << shift << "data->ReadInteger(" << param << ", " << index << ", \"" << STEPName << - "\", ach, a" << varname << ");" << std::endl; + theOs << shift << "theData->ReadInteger(" << param << ", " << index << ", \"" << STEPName << + "\", theCheck, a" << varname << ");" << std::endl; } else if (type->IsKind(STANDARD_TYPE(Express_Real))) { - theOs << shift << "data->ReadReal(" << param << ", " << index << ", \"" << STEPName << - "\", ach, a" << varname << ");" << std::endl; + theOs << shift << "theData->ReadReal(" << param << ", " << index << ", \"" << STEPName << + "\", theCheck, a" << varname << ");" << std::endl; } if (optional) @@ -1101,7 +1131,7 @@ static void writeRWWriteField( type = complex->Type(); TCollection_AsciiString var(lev); var.Prepend("Var"); - theOs << shift << "SW.OpenSub();" << std::endl; + theOs << shift << "theSW.OpenSub();" << std::endl; theOs << shift << "for (Standard_Integer i" << index << " = 1; i" << index << " <= "; if (type->IsKind(STANDARD_TYPE(Express_ComplexType))) { // array 2 @@ -1109,8 +1139,8 @@ static void writeRWWriteField( type = complex2->Type(); theOs << varname << "->RowLength(); i" << index << "++)" << std::endl; theOs << shift << "{" << std::endl; - theOs << shift << " SW.NewLine(Standard_False);" << std::endl; - theOs << shift << " SW.OpenSub();" << std::endl; + theOs << shift << " theSW.NewLine(Standard_False);" << std::endl; + theOs << shift << " theSW.OpenSub();" << std::endl; theOs << shift << " for (Standard_Integer j" << index << " = 1; j" << index << " <= " << varname << "->ColLength(); j" << index << "++)" << std::endl; theOs << shift << " {" << std::endl; @@ -1119,7 +1149,7 @@ static void writeRWWriteField( varname << "->Value(i" << index << ",j" << index << ");" << std::endl; writeRWWriteField(theOs, var.ToCString(), type, index + 1, level + 1); theOs << shift << " }" << std::endl; - theOs << shift << " SW.CloseSub();" << std::endl; + theOs << shift << " theSW.CloseSub();" << std::endl; } else { // simple array @@ -1131,15 +1161,15 @@ static void writeRWWriteField( writeRWWriteField(theOs, var.ToCString(), type, index + 1, level); } theOs << shift << "}" << std::endl; - theOs << shift << "SW.CloseSub();" << std::endl; + theOs << shift << "theSW.CloseSub();" << std::endl; } else if (type->IsKind(STANDARD_TYPE(Express_Boolean))) { - theOs << shift << "SW.SendBoolean(" << varname << ");" << std::endl; + theOs << shift << "theSW.SendBoolean(" << varname << ");" << std::endl; } else if (type->IsKind(STANDARD_TYPE(Express_Logical))) { - theOs << shift << "SW.SendLogical(" << varname << ");" << std::endl; + theOs << shift << "theSW.SendLogical(" << varname << ");" << std::endl; } else { @@ -1157,14 +1187,14 @@ static void writeRWWriteField( Handle(TCollection_HAsciiString) ename = Express::ToStepName(names->Value(i)); ename->UpperCase(); theOs << shift << " case " << enpack.ToCString() << "_" << prefix->ToCString() << - names->Value(i)->ToCString() << ": SW.SendEnum(\"." << + names->Value(i)->ToCString() << ": theSW.SendEnum(\"." << ename->ToCString() << ".\"); break;" << std::endl; } theOs << shift << "}" << std::endl; } else { - theOs << shift << "SW.Send(" << varname; + theOs << shift << "theSW.Send(" << varname; if (!named.IsNull() && named->Item()->IsKind(STANDARD_TYPE(Express_Select))) { theOs << ".Value()"; @@ -1211,13 +1241,13 @@ Standard_Integer Express_Entity::writeRWWriteCode( { // inherited base class implemented as field varName.Prepend ( Name()->Cat ( "()->" )->String() ); } - varName.Prepend ( "ent->" ); + varName.Prepend ( "theEnt->" ); varName.AssignCat ( "()" ); theOs << std::endl; if (field->IsOptional()) { - theOs << " if (ent->"; + theOs << " if (theEnt->"; if (!theOwn) { theOs << CPPName()->ToCString() << "::"; @@ -1235,7 +1265,7 @@ Standard_Integer Express_Entity::writeRWWriteCode( theOs << " }" << std::endl; theOs << " else" << std::endl; theOs << " {" << std::endl; - theOs << " SW.SendUndef();" << std::endl; + theOs << " theSW.SendUndef();" << std::endl; theOs << " }" << std::endl; } num++; @@ -1306,12 +1336,12 @@ static Standard_Boolean writeRWShareField( Handle(Express_NamedType) named = Handle(Express_NamedType)::DownCast(type); if (named->Item()->IsKind(STANDARD_TYPE(Express_Entity))) { - theOs << shift << "iter.AddItem(" << varname << ");" << std::endl; + theOs << shift << "theIter.AddItem(" << varname << ");" << std::endl; return Standard_True; } if (named->Item()->IsKind(STANDARD_TYPE(Express_Select))) { - theOs << shift << "iter.AddItem(" << varname << ".Value());" << std::endl; + theOs << shift << "theIter.AddItem(" << varname << ".Value());" << std::endl; return Standard_True; } } @@ -1355,7 +1385,7 @@ Standard_Integer Express_Entity::writeRWShareCode( { // inherited base class implemented as field varName.Prepend(Name()->Cat("()->")->String()); } - varName.Prepend("ent->"); + varName.Prepend("theEnt->"); varName.AssignCat("()"); std::ostringstream oos; @@ -1367,7 +1397,7 @@ Standard_Integer Express_Entity::writeRWShareCode( theOs << std::endl; if (field->IsOptional()) { - theOs << " if (ent->"; + theOs << " if (theEnt->"; if (!theOwn) theOs << CPPName()->ToCString() << "::"; else if (theOwn == -1) theOs << Name()->ToCString() << "()->"; theOs << "Has" << field->Name()->ToCString() << "())" << std::endl; @@ -1447,6 +1477,10 @@ Standard_Integer Express_Entity::makeInit (Standard_OStream &theOs, theOs << delim << space; } + else if (theMode == 4) + { + theOs << ", "; + } else { theOs << delim << "\n" << space; @@ -1467,10 +1501,14 @@ Standard_Integer Express_Entity::makeInit (Standard_OStream &theOs, { theOs << "const Standard_Boolean theHas" << varName->ToCString() << ",\n" << space; } - else if (theMode == 2 || theMode == 4) + else if (theMode == 2) { theOs << "has" << varName->ToCString() << ",\n" << space; } + else if (theMode == 4) + { + theOs << "has" << varName->ToCString() << ", "; + } } // write field -- 2.39.5