]> OCCT Git - occt-copy.git/commitdiff
0031481: Data Exchange - provide parser of STEP EXPRESS schema for generation of...
authorskl <skl@opencascade.com>
Wed, 2 Dec 2020 07:36:38 +0000 (10:36 +0300)
committerskl <skl@opencascade.com>
Mon, 7 Dec 2020 09:01:23 +0000 (12:01 +0300)
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
src/Express/Express_Entity.cxx

index 56470b66ee36c7a7dc0e0dbf03708ecc4104908d..ffd71a9ea3148a43d49093a88313c1bfe4b110e3 100644 (file)
@@ -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;
 }
index 764116b5aa7d2c84072755f3211d55a4ac9e8dd4..564eae151a7efe489c7ee48acd957691deb62e6c 100644 (file)
@@ -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 <field_elem> 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 <NCollection_" << nameHA.SubString(ns + 3, ns + 8) << ".hxx>" << std::endl;
+      osa << std::endl;
+      osa << "typedef NCollection_" << nameHA.SubString(ns + 3, ns + 8) << "<Handle("
+        << namePack.ToCString() << "_" << nameClass.ToCString() << ")> " << 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 <NCollection_" << nameHA.SubString(ns + 2, ns + 8) << ".hxx>" << 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;
 }