0024565: MgtBRep persistence bug
authorszy <szy@opencascade.com>
Thu, 27 Mar 2014 12:48:46 +0000 (16:48 +0400)
committerbugmaster <bugmaster@opencascade.com>
Fri, 28 Mar 2014 11:55:14 +0000 (15:55 +0400)
Fix of the persistence bug (exception with message "Persistant CurveRep is Null").
Creating new draw command for testing CR24565
Revert license header corruption
Correction for new draw command OCC24565
Test case for issue CR24565

src/MgtBRep/MgtBRep_TranslateTool.cxx
src/QABugs/QABugs_19.cxx
src/TKQADraw/EXTERNLIB
tests/bugs/caf/bug24565 [new file with mode: 0644]

index 5f12272..2b803e1 100644 (file)
@@ -69,6 +69,7 @@
 
 #include <Standard_NullObject.hxx>
 
+// szy 23.01.2014 (bug 24565) correction for edge which has null 3d curve representation
 
 // Used for testing DownCast time
 #define MgtBRepSpeedDownCast
@@ -904,13 +905,13 @@ MgtBRep_TranslateTool::UpdateEdge(const Handle(PTopoDS_HShape)& S1,
       }
       else if (PCR->IsCurve3D()) {
        Handle(PBRep_Curve3D)& PC3D = (Handle(PBRep_Curve3D)&) PCR;
-       if (! PC3D->Curve3D().IsNull()) {
-         Handle(BRep_Curve3D) C3D =
-           new BRep_Curve3D(MgtBRep_TranslateTool::Translate(PC3D->Curve3D(), aMap),
+
+// szy 23.01.2014: correction for edge which has null 3d curve representation
+       Handle(BRep_Curve3D) C3D =
+         new BRep_Curve3D(MgtBRep_TranslateTool::Translate(PC3D->Curve3D(), aMap),
                             MgtTopLoc::Translate(PC3D->Location(), aMap));
-         C3D->SetRange(PGC->First(), PGC->Last());
-         CR = C3D;
-       }
+       C3D->SetRange(PGC->First(), PGC->Last());
+       CR = C3D;
       }
     }
     else if (PCR->IsRegularity()) {
@@ -994,10 +995,8 @@ MgtBRep_TranslateTool::UpdateEdge(const Handle(PTopoDS_HShape)& S1,
     }
     
     Standard_NullObject_Raise_if (CR.IsNull(), "Persistant CurveRep is Null");
-
-    if(!CR.IsNull()) {
-      lcr.Prepend(CR); 
-    }
+    
+    lcr.Prepend(CR); 
     PCR = PCR->Next();
   }
   
index 62dbc8b..f017332 100755 (executable)
@@ -1785,6 +1785,232 @@ static Standard_Integer OCC24667 (Draw_Interpretor& di, Standard_Integer n, cons
   return 0;
 }
 
+#include <IGESControl_Reader.hxx>
+#include <IGESControl_Controller.hxx>
+#include <IGESData_IGESEntity.hxx>
+#include <BRepCheck_Analyzer.hxx>
+#include <PTColStd_TransientPersistentMap.hxx>
+#include <PTopoDS_HShape.hxx>
+#include <Storage_Data.hxx>
+#include <TopExp_Explorer.hxx>
+#include <MgtBRep.hxx>
+#include <FSD_File.hxx>
+#include <ShapeSchema.hxx>
+#include <TColStd_HSequenceOfTransient.hxx>
+#include <PTColStd_PersistentTransientMap.hxx>
+#include <Storage_Root.hxx>
+
+static Standard_Integer OCC24565 (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc != 3) {
+    di << "Usage : " << argv[0] << " FileNameIGS FileNameSTOR";
+    return 1;
+  }
+
+  Standard_CString sFileNameIGS = argv[1];
+  Standard_CString sFileNameSTOR = argv[2];
+
+  IGESControl_Reader ICReader;
+
+  /* * * * * * *
+   * Read the IGES file and make sure it is valid
+   *
+   * * * * * * */
+  IGESControl_Controller::Init();
+
+  if (!ICReader.ReadFile(sFileNameIGS)) {
+    printf("%s:%d - Error reading '%s'\n",__FUNCTION__,__LINE__,sFileNameIGS);fflush(stdout);
+    return -1;
+  }
+
+  int nbShapes = ICReader.NbShapes();
+
+  printf("%s:%d - nbShapes = '%d'\n",__FUNCTION__,__LINE__,nbShapes);fflush(stdout);
+
+  TopoDS_Shape Shape;
+  if(nbShapes == 0)
+    {
+      Handle(TColStd_HSequenceOfTransient) faces=ICReader.GiveList("iges-faces");
+      Handle(TColStd_HSequenceOfTransient) surfaceList=ICReader.GiveList("xst-transferrable-roots",faces);
+
+      if (surfaceList.IsNull())
+       {
+         printf("%s:%d - surfaceList.IsNull()\n",__FUNCTION__,__LINE__);fflush(stdout);
+         return -1;
+       }
+      BRep_Builder builder;
+      TopoDS_Compound* pC = new TopoDS_Compound();
+      builder.MakeCompound(*pC);
+
+      for (int j=1;j<=surfaceList->Length();j++)
+       {
+         Handle(IGESData_IGESEntity) igesEntity=Handle(IGESData_IGESEntity)::DownCast(surfaceList->Value(j));
+         if (igesEntity.IsNull()) continue;
+         ICReader.ClearShapes();
+         Standard_Boolean rv;
+         try {
+           rv=ICReader.TransferEntity(igesEntity);
+         }
+         catch (...) {
+           rv=Standard_False;
+         }
+         if (!rv) {
+           printf("%s:%d - Error transferring IGES entity\n",__FUNCTION__,__LINE__);fflush(stdout);
+           printf("%s:%d - FormNumber = %d, TypeNumber = %d\n",__FUNCTION__,__LINE__,igesEntity->FormNumber(),igesEntity->TypeNumber());fflush(stdout);
+           return -1;
+         }
+
+         TopoDS_Shape S;
+         try {
+           S=ICReader.Shape();
+         }
+         catch(...) {
+           printf("%s:%d - Error reading IGES entity\n",__FUNCTION__,__LINE__);fflush(stdout);
+           printf("%s:%d - FormNumber = %d, TypeNumber = %d\n",__FUNCTION__,__LINE__,igesEntity->FormNumber(),igesEntity->TypeNumber());fflush(stdout);
+           return -1;
+         }
+         if (S.IsNull()) {
+           printf("%s:%d - NULL Surface encountered\n",__FUNCTION__,__LINE__);
+           return -1;
+         }
+
+         try
+           {
+             builder.Add(*pC,S);
+           }
+         catch(...)
+           {
+             printf("%s: Exception adding face.\n",__FUNCTION__);
+           }
+       }
+      Shape = TopoDS_Shape(*pC);
+    }
+  else
+    {
+      Shape = ICReader.OneShape();
+    }
+  {
+    BRepCheck_Analyzer brca(Shape);
+
+    if(!brca.IsValid())
+      {
+       printf("%s: Invalid shape after reading IGES file.\n",__FUNCTION__);
+      }
+  }
+
+  /* * * * * * *
+   * Write the contents of the Shape to a STOR file
+   *
+   * * * * * * */
+  PTColStd_TransientPersistentMap aMapTP;
+  Handle(PTopoDS_HShape) aPShape_write;
+  Handle(Storage_Data) d_write=new Storage_Data;
+  char Name[32];
+
+  TopExp_Explorer Ex;
+  int i;
+  int max_i = 0;
+
+  for (i=0,Ex.Init(Shape,TopAbs_FACE);Ex.More();i++,Ex.Next())
+    {
+
+      max_i = i;
+      try {
+       aPShape_write=MgtBRep::Translate(Ex.Current(),aMapTP,MgtBRep_WithoutTriangle);
+      }
+      catch (...) {
+       printf("%s: Error translating surface '%d'\n",__FUNCTION__,i);
+      }
+               
+      sprintf(Name,"S%010d",i);
+               
+      {
+       BRepCheck_Analyzer brca(Ex.Current());
+       if(!brca.IsValid())
+         {
+           printf("INVALID face '%s' in the shape, which will be written to the STOR file.\n",Name);
+         }
+      }
+      try {
+       d_write->AddRoot(Name,aPShape_write);
+      }
+      catch (...) {
+       printf("%s: Error adding surface '%d', RootName = '%s'\n",__FUNCTION__,i,Name);
+      }
+    }
+  printf("%s: Going to write %d surfaces.\n",__FUNCTION__,max_i+1);
+
+  FSD_File f_write;
+  if(f_write.Open(sFileNameSTOR, Storage_VSWrite)!=Storage_VSOk)
+    {
+      printf("%s: Error opening file: %s\n", __FUNCTION__,sFileNameSTOR);
+      return -1;
+    }
+  Handle(ShapeSchema) s_write=new ShapeSchema;
+  s_write->Write(f_write,d_write);
+  f_write.Close();
+  printf("%s: Wrote to the STOR file.\n",__FUNCTION__);
+
+  /* * * * * * *
+   * Read the contents of the Shape from a STOR file
+   *
+   * * * * * * */
+  FSD_File f_read;
+  if(f_read.Open(sFileNameSTOR, Storage_VSRead)!=Storage_VSOk)
+    {
+      printf("%s: Error opening file: %s\n", __FUNCTION__,sFileNameSTOR);
+      return -1;
+    }
+  Handle(ShapeSchema) s_read=new ShapeSchema;
+  Handle(Storage_Data) d_read=s_read->Read(f_read);
+
+  Handle(Standard_Persistent) p;
+  Handle(Storage_Root) r;
+  Handle(PTopoDS_HShape) aPShape_read;
+  PTColStd_PersistentTransientMap aMapPT;
+  TopoDS_Shape S_read;
+
+  printf("%s: Extracting %d faces from the STOR file.\n",__FUNCTION__,max_i+1);
+  for(int i = 0; i <= max_i; ++i)
+    {
+      sprintf(Name,"S%010d",i);
+      r=d_read->Find(Name);
+      if(r.IsNull())
+       {
+         printf("%s:%d '%s' IsNull().\n",__FUNCTION__,__LINE__,Name);fflush(stdout);
+         continue;
+       }
+      p=r->Object();
+      aPShape_read = Handle(PTopoDS_HShape)::DownCast(p);
+      try {
+       MgtBRep::Translate(aPShape_read,aMapPT,S_read,MgtBRep_WithoutTriangle);
+      }
+      catch (Standard_Failure) {
+       Handle(Standard_Failure) E=Standard_Failure::Caught();
+       std::string str;
+       str="Exception: ";
+       str+=E->DynamicType()->Name();
+       str+=" => ";
+       str+=E->GetMessageString();
+       printf("%s(1): %s: %s\n",__FUNCTION__,Name,str.c_str());fflush(stdout);
+      }
+      catch (...) {
+       printf("%s(1): Unhandled exception in MgtBRep::Translate\n",__FUNCTION__);
+      }
+
+      BRepCheck_Analyzer brca(S_read);
+
+      if(!brca.IsValid())
+       {
+         printf("%s: Read INVALID face (%s)!\n",__FUNCTION__,Name);
+       }
+    }
+
+  printf("Completed.\n");fflush(stdout);
+
+  return 0;
+}
+
 void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   const char *group = "QABugs";
 
@@ -1822,5 +2048,6 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   theCommands.Add ("OCC24086", "OCC24086 face wire", __FILE__, OCC24086, group);
   theCommands.Add ("OCC24622", "OCC24622 texture={1D|2D}\n Tests sourcing of 1D/2D pixmaps for AIS_TexturedShape", __FILE__, OCC24622, group);
   theCommands.Add ("OCC24667", "OCC24667 result Wire_spine Profile [Mode [Approx]], no args to get help", __FILE__, OCC24667, group);
+  theCommands.Add ("OCC24565", "OCC24565 FileNameIGS FileNameSTOR", __FILE__, OCC24565, group);
   return;
 }
index 63ae4ad..bcc87e1 100755 (executable)
@@ -34,6 +34,8 @@ TKXSDRAW
 TKSTL
 TKAdvTools
 TKVoxel
+TKShapeSchema
+TKPShape
 CSF_gdi32
 CSF_advapi32
 CSF_user32
diff --git a/tests/bugs/caf/bug24565 b/tests/bugs/caf/bug24565
new file mode 100644 (file)
index 0000000..402129b
--- /dev/null
@@ -0,0 +1,25 @@
+puts "=========="
+puts "OCC24565"
+puts "=========="
+puts ""
+###################################################
+# MgtBRep persistence bug
+###################################################
+
+pload QAcommands
+
+set igs_file [locate_data_file bug24565_N60E.igs]
+
+set output_file ${imagedir}/bug24565_output.stor
+catch { file delete ${output_file} }
+
+dlog reset
+dlog on
+OCC24565 ${igs_file} ${output_file}
+set info [dlog get]
+
+if { [regexp "Exception" ${info} ] != 1 } {
+    puts "OK : persistence is good"
+} else {
+    puts "Error : persistence is bad"
+}