]> OCCT Git - occt-copy.git/commitdiff
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 71a9bbd01122804a34c33d07f44cb2a51d619ba5..299e55c96bff24a0535f2956c9a325043c8efd5a 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 68a394d594cac454a2da3d21888b72ecef25ae1a..0c50acc45f1b81f95626c6cb46513914d7d1e765 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 58c9289f16f65537a28aacd43d439a64bdc735ea..d2c7a3784b16ebe8dd9adffa1cc3c20c1b0027bf 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