0025518: Colors are not written to IGES 5.3
authorink <ink@opencascade.com>
Thu, 4 Dec 2014 12:48:16 +0000 (15:48 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 4 Dec 2014 12:49:00 +0000 (15:49 +0300)
Writing of colors to IGES Face (510) and Solid (186) entities allowed since this is used by CAD systems (even if not allowed by IGES standard).
Color assigned to surface, face and solid entities to ensure that different CAD systems will recognize them.

Test-case for issue #25518

src/IGESCAFControl/IGESCAFControl_Writer.cxx
src/IGESSolid/IGESSolid_ToolFace.cxx
src/IGESSolid/IGESSolid_ToolManifoldSolid.cxx
tests/bugs/iges/bug25518 [new file with mode: 0644]

index 71a9bbd..299e55c 100644 (file)
@@ -41,6 +41,7 @@
 #include <TDF_ChildIterator.hxx>
 #include <TDataStd_Name.hxx>
 #include <IGESData_NameEntity.hxx>
+#include <IGESSolid_Face.hxx>
 #include <TopTools_SequenceOfShape.hxx>
 #include <TColStd_HSequenceOfExtendedString.hxx>
 #include <NCollection_DataMap.hxx>
@@ -262,7 +263,7 @@ void IGESCAFControl_Writer::MakeColors (const TopoDS_Shape &S,
   // analyze whether current entity should get a color 
   Standard_Boolean hasColor = Standard_False;
   Quantity_Color col;
-  if ( S.ShapeType() == TopAbs_FACE ) {
+  if ( S.ShapeType() == TopAbs_FACE  || S.ShapeType() == TopAbs_SOLID) {
     if ( style.IsSetColorSurf() ) {
       hasColor = Standard_True;
       col = style.GetColorSurf();
@@ -299,6 +300,12 @@ void IGESCAFControl_Writer::MakeColors (const TopoDS_Shape &S,
     Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
     if ( FP->FindTypedTransient ( mapper, STANDARD_TYPE(IGESData_IGESEntity), ent ) ) {
       ent->InitColor ( colent, rank );
+      Handle(IGESSolid_Face) ent_f = Handle(IGESSolid_Face)::DownCast(ent);
+      if (!ent_f.IsNull())
+      {
+        if (!ent_f->Surface().IsNull())
+          ent_f->Surface()->InitColor ( colent, rank );
+      }
     }
     else {
       // may be S was splited during shape process
@@ -313,7 +320,16 @@ void IGESCAFControl_Writer::MakeColors (const TopoDS_Shape &S,
          for (i=1; i<=nb; i++) {
            Handle(Standard_Transient) t = TransientListBinder->Transient(i);
            ent = Handle(IGESData_IGESEntity)::DownCast(t);
-           if (!ent.IsNull()) ent->InitColor ( colent, rank );
+           if (!ent.IsNull())
+      {
+        ent->InitColor ( colent, rank );
+        Handle(IGESSolid_Face) ent_f = Handle(IGESSolid_Face)::DownCast(ent);
+        if (!ent_f.IsNull())
+        {
+          if (!ent_f->Surface().IsNull())
+            ent_f->Surface()->InitColor ( colent, rank );
+        }
+      }
          }
        }
        /* // alternative: consider recursive mapping S -> compound -> entities
index 68a394d..0c50acc 100644 (file)
@@ -200,7 +200,7 @@ IGESData_DirChecker IGESSolid_ToolFace::DirChecker
   DC.Structure  (IGESData_DefVoid);
   DC.LineFont   (IGESData_DefVoid);
   DC.LineWeight (IGESData_DefVoid);
-  DC.Color      (IGESData_DefVoid);
+  DC.Color      (IGESData_DefAny);
 
   DC.SubordinateStatusRequired(1);
   return DC;
index 58c9289..d2c7a37 100644 (file)
@@ -183,7 +183,7 @@ IGESData_DirChecker  IGESSolid_ToolManifoldSolid::DirChecker
   DC.Structure  (IGESData_DefVoid);
   DC.LineFont   (IGESData_DefVoid);
   DC.LineWeight (IGESData_DefVoid);
-  DC.Color      (IGESData_DefVoid);
+  DC.Color      (IGESData_DefAny);
 
   return DC;
 }
diff --git a/tests/bugs/iges/bug25518 b/tests/bugs/iges/bug25518
new file mode 100644 (file)
index 0000000..9b595b4
--- /dev/null
@@ -0,0 +1,23 @@
+puts "========"
+puts "OCC25518"
+puts "========"
+puts ""
+######################################
+# Colors are not written to IGES 5.3
+######################################
+
+catch {exec rm ${imagedir}/OCC25518.igs}
+psphere s 10
+XNewDoc D
+XAddShape D s
+XSetColor D s 0 0 1
+param write.iges.brep.mode 1
+WriteIges D ${imagedir}/OCC25518.igs
+ReadIges T ${imagedir}/OCC25518.igs
+if {[string trim [XGetAllColors T]] != "BLUE1"} {
+  puts "ERROR: OCC25518 is reproduced. Color is lost."
+}
+XShow T
+vfit
+vsetdispmode 1
+set only_screen 1