diff --git a/src/BinMXCAFDoc/BinMXCAFDoc_ColorDriver.cxx b/src/BinMXCAFDoc/BinMXCAFDoc_ColorDriver.cxx index 0d2d34f837..57a34206bf 100644 --- a/src/BinMXCAFDoc/BinMXCAFDoc_ColorDriver.cxx +++ b/src/BinMXCAFDoc/BinMXCAFDoc_ColorDriver.cxx @@ -49,9 +49,13 @@ Standard_Boolean BinMXCAFDoc_ColorDriver::Paste(const BinObjMgt_Persistent& theS { Handle(XCAFDoc_Color) anAtt = Handle(XCAFDoc_Color)::DownCast(theTarget); Standard_Real R, G, B; + Standard_ShortReal alpha; Standard_Boolean isOk = theSource >> R >> G >> B; if(isOk) { - anAtt->Set(R, G, B); + Standard_Boolean isRGBA = theSource >> alpha; + if (!isRGBA) + alpha = 1.0; + anAtt->Set(R, G, B, alpha); } return isOk; } @@ -66,7 +70,9 @@ void BinMXCAFDoc_ColorDriver::Paste(const Handle(TDF_Attribute)& theSource, { Handle(XCAFDoc_Color) anAtt = Handle(XCAFDoc_Color)::DownCast(theSource); Standard_Real R, G, B; + Standard_ShortReal alpha; anAtt->GetRGB(R, G, B); - theTarget << R << G << B; + alpha = anAtt->GetAlpha(); + theTarget << R << G << B << alpha; } diff --git a/src/XCAFDoc/XCAFDoc_Color.cxx b/src/XCAFDoc/XCAFDoc_Color.cxx index d9c5511f58..e1f1ad91e2 100644 --- a/src/XCAFDoc/XCAFDoc_Color.cxx +++ b/src/XCAFDoc/XCAFDoc_Color.cxx @@ -15,6 +15,7 @@ #include +#include #include #include #include @@ -60,6 +61,23 @@ const Standard_GUID& XCAFDoc_Color::GetID() return A; } + //======================================================================= + //function : Set + //purpose : + //======================================================================= + + Handle(XCAFDoc_Color) XCAFDoc_Color::Set(const TDF_Label& L, + const Quantity_ColorRGBA& C) + { + Handle(XCAFDoc_Color) A; + if (!L.FindAttribute(XCAFDoc_Color::GetID(), A)) { + A = new XCAFDoc_Color(); + L.AddAttribute(A); + } + A->Set(C); + return A; + } + //======================================================================= //function : Set //purpose : @@ -83,16 +101,17 @@ const Standard_GUID& XCAFDoc_Color::GetID() //======================================================================= Handle(XCAFDoc_Color) XCAFDoc_Color::Set(const TDF_Label& L, - const Standard_Real R, - const Standard_Real G, - const Standard_Real B) + const Standard_Real R, + const Standard_Real G, + const Standard_Real B, + const Standard_Real alpha) { Handle(XCAFDoc_Color) A; if (!L.FindAttribute (XCAFDoc_Color::GetID(), A)) { A = new XCAFDoc_Color (); L.AddAttribute(A); } - A->Set (R,G,B); + A->Set (R,G,B, alpha); return A; } @@ -102,6 +121,17 @@ Handle(XCAFDoc_Color) XCAFDoc_Color::Set(const TDF_Label& L, //======================================================================= void XCAFDoc_Color::Set(const Quantity_Color& C) +{ + Backup(); + myColor.SetRGB(C); +} + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +void XCAFDoc_Color::Set(const Quantity_ColorRGBA& C) { Backup(); myColor = C; @@ -115,7 +145,7 @@ void XCAFDoc_Color::Set(const Quantity_Color& C) void XCAFDoc_Color::Set(const Quantity_NameOfColor C) { Backup(); - myColor.SetValues(C); + myColor.SetRGB(C); } //======================================================================= @@ -124,11 +154,15 @@ void XCAFDoc_Color::Set(const Quantity_Color& C) //======================================================================= void XCAFDoc_Color::Set(const Standard_Real R, - const Standard_Real G, - const Standard_Real B) + const Standard_Real G, + const Standard_Real B, + const Standard_Real alpha) { Backup(); - myColor.SetValues(R,G,B, Quantity_TOC_RGB); + Quantity_Color aColor; + aColor.SetValues(R, G, B, Quantity_TOC_RGB); + myColor.SetRGB(aColor); + myColor.SetAlpha((Standard_ShortReal)alpha); } //======================================================================= @@ -137,6 +171,16 @@ void XCAFDoc_Color::Set(const Quantity_Color& C) //======================================================================= const Quantity_Color& XCAFDoc_Color::GetColor() const +{ + return myColor.GetRGB(); +} + +//======================================================================= +//function : GetColorRGBA +//purpose : +//======================================================================= + +const Quantity_ColorRGBA& XCAFDoc_Color::GetColorRGBA() const { return myColor; } @@ -148,7 +192,7 @@ const Quantity_Color& XCAFDoc_Color::GetColor() const Quantity_NameOfColor XCAFDoc_Color::GetNOC() const { - return myColor.Name(); + return myColor.GetRGB().Name(); } //======================================================================= @@ -160,8 +204,18 @@ const Quantity_Color& XCAFDoc_Color::GetColor() const Standard_Real& G, Standard_Real& B) const { - myColor.Values(R,G,B, Quantity_TOC_RGB); + myColor.GetRGB().Values(R,G,B, Quantity_TOC_RGB); } + + //======================================================================= + //function : GetRGBA + //purpose : + //======================================================================= + + Standard_ShortReal XCAFDoc_Color::GetAlpha() const + { + return myColor.Alpha(); + } //======================================================================= //function : ID //purpose : @@ -179,7 +233,7 @@ const Standard_GUID& XCAFDoc_Color::ID() const void XCAFDoc_Color::Restore(const Handle(TDF_Attribute)& With) { - myColor = Handle(XCAFDoc_Color)::DownCast(With)->GetColor(); + myColor = Handle(XCAFDoc_Color)::DownCast(With)->GetColorRGBA(); } //======================================================================= diff --git a/src/XCAFDoc/XCAFDoc_Color.hxx b/src/XCAFDoc/XCAFDoc_Color.hxx index 110cc34a86..db94e724f6 100644 --- a/src/XCAFDoc/XCAFDoc_Color.hxx +++ b/src/XCAFDoc/XCAFDoc_Color.hxx @@ -20,12 +20,14 @@ #include #include +#include #include #include #include class Standard_GUID; class TDF_Label; class Quantity_Color; +class Quantity_ColorRGBA; class TDF_Attribute; class TDF_RelocationTable; @@ -45,25 +47,32 @@ public: Standard_EXPORT static const Standard_GUID& GetID(); Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Quantity_Color& C); + + Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Quantity_ColorRGBA& C); Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Quantity_NameOfColor C); //! Find, or create, a Color attribute and set it's value //! the Color attribute is returned. - Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Standard_Real R, const Standard_Real G, const Standard_Real B); + Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Standard_Real R, const Standard_Real G, const Standard_Real B, const Standard_Real alpha = 1.0); Standard_EXPORT void Set (const Quantity_Color& C); + + Standard_EXPORT void Set (const Quantity_ColorRGBA& C); Standard_EXPORT void Set (const Quantity_NameOfColor C); - Standard_EXPORT void Set (const Standard_Real R, const Standard_Real G, const Standard_Real B); + Standard_EXPORT void Set (const Standard_Real R, const Standard_Real G, const Standard_Real B, const Standard_Real alpha = 1.0); Standard_EXPORT const Quantity_Color& GetColor() const; + + Standard_EXPORT const Quantity_ColorRGBA& GetColorRGBA() const; Standard_EXPORT Quantity_NameOfColor GetNOC() const; - //! Returns True if there is a reference on the same label Standard_EXPORT void GetRGB (Standard_Real& R, Standard_Real& G, Standard_Real& B) const; + + Standard_EXPORT Standard_ShortReal GetAlpha() const; Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE; @@ -86,7 +95,7 @@ protected: private: - Quantity_Color myColor; + Quantity_ColorRGBA myColor; }; diff --git a/src/XCAFDoc/XCAFDoc_ColorTool.cxx b/src/XCAFDoc/XCAFDoc_ColorTool.cxx index 0354e1c75a..6e6402e707 100644 --- a/src/XCAFDoc/XCAFDoc_ColorTool.cxx +++ b/src/XCAFDoc/XCAFDoc_ColorTool.cxx @@ -76,14 +76,29 @@ Standard_Boolean XCAFDoc_ColorTool::IsColor (const TDF_Label& lab) const Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab, Quantity_Color& col) const { - if ( lab.Father() != Label() ) return Standard_False; - + Quantity_ColorRGBA aCol; + Standard_Boolean isDone = GetColor(lab, aCol); + if (isDone) + col = aCol.GetRGB(); + return isDone; +} + +//======================================================================= +//function : GetColor +//purpose : +//======================================================================= + +Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& lab, + Quantity_ColorRGBA& col) const +{ + if (lab.Father() != Label()) return Standard_False; + Handle(XCAFDoc_Color) ColorAttribute; - if ( ! lab.FindAttribute ( XCAFDoc_Color::GetID(), ColorAttribute )) + if (!lab.FindAttribute(XCAFDoc_Color::GetID(), ColorAttribute)) return Standard_False; - - col = ColorAttribute->GetColor(); - + + col = ColorAttribute->GetColorRGBA(); + return Standard_True; } @@ -94,12 +109,24 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab, Standard_Boolean XCAFDoc_ColorTool::FindColor (const Quantity_Color& col, TDF_Label& lab) const { - TDF_ChildIDIterator it(Label(),XCAFDoc_Color::GetID()); + Quantity_ColorRGBA aCol; + aCol.SetRGB(col); + return FindColor(aCol, lab); +} + +//======================================================================= +//function : FindColor +//purpose : +//======================================================================= + +Standard_Boolean XCAFDoc_ColorTool::FindColor(const Quantity_ColorRGBA& col, TDF_Label& lab) const +{ + TDF_ChildIDIterator it(Label(), XCAFDoc_Color::GetID()); for (; it.More(); it.Next()) { TDF_Label aLabel = it.Value()->Label(); - Quantity_Color C; - if ( ! GetColor ( aLabel, C ) ) continue; - if ( C.IsEqual ( col ) ) { + Quantity_ColorRGBA C; + if (!GetColor(aLabel, C)) continue; + if (C.IsEqual(col)) { lab = aLabel; return Standard_True; } @@ -112,44 +139,71 @@ Standard_Boolean XCAFDoc_ColorTool::FindColor (const Quantity_Color& col, TDF_La //purpose : //======================================================================= -TDF_Label XCAFDoc_ColorTool::FindColor (const Quantity_Color& col) const +TDF_Label XCAFDoc_ColorTool::FindColor (const Quantity_ColorRGBA& col) const { TDF_Label L; FindColor ( col, L ); return L; } +//======================================================================= +//function : FindColor +//purpose : +//======================================================================= + +TDF_Label XCAFDoc_ColorTool::FindColor(const Quantity_Color& col) const +{ + TDF_Label L; + FindColor(col, L); + return L; +} + //======================================================================= //function : AddColor //purpose : //======================================================================= TDF_Label XCAFDoc_ColorTool::AddColor (const Quantity_Color& col) const +{ + Quantity_ColorRGBA aCol; + aCol.SetRGB(col); + return AddColor(aCol); +} + +//======================================================================= +//function : AddColor +//purpose : +//======================================================================= + +TDF_Label XCAFDoc_ColorTool::AddColor(const Quantity_ColorRGBA& col) const { TDF_Label L; - if ( FindColor ( col, L ) ) return L; + if (FindColor(col, L)) return L; // create a new color entry - + TDF_TagSource aTag; - L = aTag.NewChild ( Label() ); + L = aTag.NewChild(Label()); XCAFDoc_Color::Set(L, col); - + #ifdef AUTONAMING // set name according to color value TCollection_AsciiString str; - str += col.StringName ( col.Name() ); + Quantity_Color aColor = col.GetRGB(); + str += aColor.StringName(aColor.Name()); str += " ("; - str += TCollection_AsciiString ( col.Red() ); + str += TCollection_AsciiString(aColor.Red()); str += ","; - str += TCollection_AsciiString ( col.Green() ); + str += TCollection_AsciiString(aColor.Green()); str += ","; - str += TCollection_AsciiString ( col.Blue() ); + str += TCollection_AsciiString(aColor.Blue()); + str += ","; + str += TCollection_AsciiString(col.Alpha()); str += ")"; - TDataStd_Name::Set ( L, str ); + TDataStd_Name::Set(L, str); #endif - + return L; } @@ -209,6 +263,19 @@ void XCAFDoc_ColorTool::SetColor (const TDF_Label& L, SetColor ( L, colorL, type ); } +//======================================================================= +//function : SetColor +//purpose : +//======================================================================= + +void XCAFDoc_ColorTool::SetColor(const TDF_Label& L, + const Quantity_ColorRGBA& Color, + const XCAFDoc_ColorType type) const +{ + TDF_Label colorL = AddColor(Color); + SetColor(L, colorL, type); +} + //======================================================================= //function : UnSetColor //purpose : @@ -260,6 +327,20 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& L, return GetColor ( colorL, color ); } +//======================================================================= +//function : GetColor +//purpose : +//======================================================================= + +Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& L, + const XCAFDoc_ColorType type, + Quantity_ColorRGBA& color) +{ + TDF_Label colorL; + if (!GetColor(L, type, colorL)) return Standard_False; + return GetColor(colorL, color); +} + //======================================================================= //function : SetColor //purpose : @@ -288,6 +369,19 @@ Standard_Boolean XCAFDoc_ColorTool::SetColor (const TopoDS_Shape& S, return SetColor ( S, colorL, type ); } +//======================================================================= +//function : SetColor +//purpose : +//======================================================================= + +Standard_Boolean XCAFDoc_ColorTool::SetColor(const TopoDS_Shape& S, + const Quantity_ColorRGBA& Color, + const XCAFDoc_ColorType type) +{ + TDF_Label colorL = AddColor(Color); + return SetColor(S, colorL, type); +} + //======================================================================= //function : UnSetColor //purpose : @@ -343,6 +437,20 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TopoDS_Shape& S, return GetColor ( colorL, color ); } +//======================================================================= +//function : GetColor +//purpose : +//======================================================================= + +Standard_Boolean XCAFDoc_ColorTool::GetColor(const TopoDS_Shape& S, + const XCAFDoc_ColorType type, + Quantity_ColorRGBA& color) +{ + TDF_Label colorL; + if (!GetColor(S, type, colorL)) return Standard_False; + return GetColor(colorL, color); +} + //======================================================================= //function : GetID //purpose : @@ -459,28 +567,44 @@ Standard_Boolean XCAFDoc_ColorTool::SetInstanceColor (const TopoDS_Shape& theSha const XCAFDoc_ColorType type, const Quantity_Color& color, const Standard_Boolean IsCreateSHUO) +{ + Quantity_ColorRGBA aCol; + aCol.SetRGB(color); + return SetInstanceColor(theShape, type, aCol, IsCreateSHUO); +} + +//======================================================================= +//function : SetInstanceColor +//purpose : +//======================================================================= + +Standard_Boolean XCAFDoc_ColorTool::SetInstanceColor(const TopoDS_Shape& theShape, + const XCAFDoc_ColorType type, + const Quantity_ColorRGBA& color, + const Standard_Boolean IsCreateSHUO) { // find shuo label structure TDF_LabelSequence aLabels; - if ( !ShapeTool()->FindComponent( theShape, aLabels ) ) + if (!ShapeTool()->FindComponent(theShape, aLabels)) return Standard_False; Handle(XCAFDoc_GraphNode) aSHUO; // set the SHUO structure for this component if it is not exist - if ( !ShapeTool()->FindSHUO( aLabels, aSHUO ) ) { + if (!ShapeTool()->FindSHUO(aLabels, aSHUO)) { if (aLabels.Length() == 1) { // set color directly for component as NAUO SetColor(aLabels.Value(1), color, type); return Standard_True; } - else if ( !IsCreateSHUO || !ShapeTool()->SetSHUO( aLabels, aSHUO ) ) { + else if (!IsCreateSHUO || !ShapeTool()->SetSHUO(aLabels, aSHUO)) { return Standard_False; } } TDF_Label aSHUOLabel = aSHUO->Label(); - SetColor( aSHUOLabel, color, type ); + SetColor(aSHUOLabel, color, type); return Standard_True; } + //======================================================================= //function : GetInstanceColor //purpose : @@ -489,39 +613,56 @@ Standard_Boolean XCAFDoc_ColorTool::SetInstanceColor (const TopoDS_Shape& theSha Standard_Boolean XCAFDoc_ColorTool::GetInstanceColor (const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, Quantity_Color& color) +{ + Quantity_ColorRGBA aCol; + Standard_Boolean isDone = GetInstanceColor(theShape, type, aCol); + if (isDone) + color = aCol.GetRGB(); + return isDone; +} + +//======================================================================= +//function : GetInstanceColor +//purpose : +//======================================================================= + +Standard_Boolean XCAFDoc_ColorTool::GetInstanceColor(const TopoDS_Shape& theShape, + const XCAFDoc_ColorType type, + Quantity_ColorRGBA& color) { // find shuo label structure TDF_LabelSequence aLabels; - if ( !ShapeTool()->FindComponent( theShape, aLabels ) ) + if (!ShapeTool()->FindComponent(theShape, aLabels)) return Standard_False; Handle(XCAFDoc_GraphNode) aSHUO; // get shuo from document by label structure TDF_Label aCompLab = aLabels.Value(aLabels.Length()); while (aLabels.Length() > 1) { - if ( !ShapeTool()->FindSHUO( aLabels, aSHUO ) ) { + if (!ShapeTool()->FindSHUO(aLabels, aSHUO)) { // try to find other shuo aLabels.Remove(aLabels.Length()); continue; - } else { + } + else { TDF_Label aSHUOLabel = aSHUO->Label(); - if (GetColor ( aSHUOLabel, type, color ) ) + if (GetColor(aSHUOLabel, type, color)) return Standard_True; - else + else // try to find other shuo aLabels.Remove(aLabels.Length()); } } // attempt to get color exactly of component - if (GetColor( aCompLab, type, color )) + if (GetColor(aCompLab, type, color)) return Standard_True; - + // attempt to get color of solid TopLoc_Location aLoc; TopoDS_Shape S0 = theShape; - S0.Location( aLoc ); - TDF_Label aRefLab = ShapeTool()->FindShape( S0 ); + S0.Location(aLoc); + TDF_Label aRefLab = ShapeTool()->FindShape(S0); if (!aRefLab.IsNull()) - return GetColor( aRefLab, type, color ); + return GetColor(aRefLab, type, color); // no color assigned return Standard_False; } diff --git a/src/XCAFDoc/XCAFDoc_ColorTool.hxx b/src/XCAFDoc/XCAFDoc_ColorTool.hxx index 87a226fa2b..0ef9cee73e 100644 --- a/src/XCAFDoc/XCAFDoc_ColorTool.hxx +++ b/src/XCAFDoc/XCAFDoc_ColorTool.hxx @@ -27,6 +27,7 @@ class XCAFDoc_ShapeTool; class TDF_Label; class Standard_GUID; class Quantity_Color; +class Quantity_ColorRGBA; class TopoDS_Shape; class TDF_Attribute; class TDF_RelocationTable; @@ -67,20 +68,39 @@ public: //! Returns False if the label is not in colortable //! or does not define a color Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col) const; + + //! Returns color defined by label lab + //! Returns False if the label is not in colortable + //! or does not define a color + Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col) const; //! Finds a color definition in a colortable and returns //! its label if found //! Returns False if color is not found in colortable Standard_EXPORT Standard_Boolean FindColor (const Quantity_Color& col, TDF_Label& lab) const; + + //! Finds a color definition in a colortable and returns + //! its label if found + //! Returns False if color is not found in colortable + Standard_EXPORT Standard_Boolean FindColor(const Quantity_ColorRGBA& col, TDF_Label& lab) const; //! Finds a color definition in a colortable and returns //! its label if found (or Null label else) Standard_EXPORT TDF_Label FindColor (const Quantity_Color& col) const; + + //! Finds a color definition in a colortable and returns + //! its label if found (or Null label else) + Standard_EXPORT TDF_Label FindColor(const Quantity_ColorRGBA& col) const; //! Adds a color definition to a colortable and returns //! its label (returns existing label if the same color //! is already defined) Standard_EXPORT TDF_Label AddColor (const Quantity_Color& col) const; + + //! Adds a color definition to a colortable and returns + //! its label (returns existing label if the same color + //! is already defined) + Standard_EXPORT TDF_Label AddColor(const Quantity_ColorRGBA& col) const; //! Removes color from the colortable Standard_EXPORT void RemoveColor (const TDF_Label& lab) const; @@ -104,6 +124,12 @@ public: //! in the colortable //! Adds a color as necessary Standard_EXPORT void SetColor (const TDF_Label& L, const Quantity_Color& Color, const XCAFDoc_ColorType type) const; + + //! Sets a link with GUID defined by (see + //! XCAFDoc::ColorRefGUID()) from label to color + //! in the colortable + //! Adds a color as necessary + Standard_EXPORT void SetColor(const TDF_Label& L, const Quantity_ColorRGBA& Color, const XCAFDoc_ColorType type) const; //! Removes a link with GUID defined by (see //! XCAFDoc::ColorRefGUID()) from label to color @@ -120,6 +146,10 @@ public: //! Returns color assigned to as //! Returns False if no such color is assigned Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color); + + //! Returns color assigned to as + //! Returns False if no such color is assigned + Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color); //! Sets a link with GUID defined by (see //! XCAFDoc::ColorRefGUID()) from label to color @@ -133,6 +163,13 @@ public: //! Adds a color as necessary //! Returns False if cannot find a label for shape S Standard_EXPORT Standard_Boolean SetColor (const TopoDS_Shape& S, const Quantity_Color& Color, const XCAFDoc_ColorType type); + + //! Sets a link with GUID defined by (see + //! XCAFDoc::ColorRefGUID()) from label to color + //! in the colortable + //! Adds a color as necessary + //! Returns False if cannot find a label for shape S + Standard_EXPORT Standard_Boolean SetColor(const TopoDS_Shape& S, const Quantity_ColorRGBA& Color, const XCAFDoc_ColorType type); //! Removes a link with GUID defined by (see //! XCAFDoc::ColorRefGUID()) from label to color @@ -150,6 +187,10 @@ public: //! Returns color assigned to as //! Returns False if no such color is assigned Standard_EXPORT Standard_Boolean GetColor (const TopoDS_Shape& S, const XCAFDoc_ColorType type, Quantity_Color& color); + + //! Returns color assigned to as + //! Returns False if no such color is assigned + Standard_EXPORT Standard_Boolean GetColor(const TopoDS_Shape& S, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color); //! Return TRUE if object on this label is visible, FALSE if invisible. Standard_EXPORT Standard_Boolean IsVisible (const TDF_Label& L) const; @@ -163,9 +204,18 @@ public: //! NOTE: create SHUO structeure if it is necessary and if Standard_EXPORT Standard_Boolean SetInstanceColor (const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, const Quantity_Color& color, const Standard_Boolean isCreateSHUO = Standard_True); + //! Sets the color of component that styled with SHUO structure + //! Returns FALSE if no sush component found + //! NOTE: create SHUO structeure if it is necessary and if + Standard_EXPORT Standard_Boolean SetInstanceColor(const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, const Quantity_ColorRGBA& color, const Standard_Boolean isCreateSHUO = Standard_True); + //! Gets the color of component that styled with SHUO structure //! Returns FALSE if no sush component or color type Standard_EXPORT Standard_Boolean GetInstanceColor (const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, Quantity_Color& color); + + //! Gets the color of component that styled with SHUO structure + //! Returns FALSE if no sush component or color type + Standard_EXPORT Standard_Boolean GetInstanceColor(const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color); //! Gets the visibility status of component that styled with SHUO structure //! Returns FALSE if no sush component diff --git a/src/XDEDRAW/XDEDRAW.cxx b/src/XDEDRAW/XDEDRAW.cxx index 34a0d28076..0a8ece6f76 100644 --- a/src/XDEDRAW/XDEDRAW.cxx +++ b/src/XDEDRAW/XDEDRAW.cxx @@ -303,7 +303,7 @@ static void StatAssembly(const TDF_Label L, NbAreaProp++; } Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool(aDoc->Main()); - Quantity_Color col; + Quantity_ColorRGBA col; Standard_Boolean IsColor = Standard_False; if(CTool->GetColor(L,XCAFDoc_ColorGen,col)) IsColor = Standard_True; @@ -313,8 +313,8 @@ static void StatAssembly(const TDF_Label L, IsColor = Standard_True; if(IsColor) { TCollection_AsciiString Entry1; - Entry1 = col.StringName(col.Name()); - if(PrintStructMode) di<<"Color("<Main()); @@ -723,10 +723,10 @@ static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer } else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_Color)) ) { Handle(XCAFDoc_Color) val = Handle(XCAFDoc_Color)::DownCast ( att ); - Quantity_Color C = val->GetColor(); + Quantity_ColorRGBA C = val->GetColorRGBA(); char string[260]; - Sprintf ( string, "%s (%g, %g, %g)", C.StringName ( C.Name() ), - C.Red(), C.Green(), C.Blue() ); + Sprintf ( string, "%s (%g, %g, %g, %g)", C.GetRGB().StringName ( C.GetRGB().Name() ), + C.GetRGB().Red(), C.GetRGB().Green(), C.GetRGB().Blue(), C.Alpha()); di << string; } else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_DimTol)) ) { diff --git a/src/XDEDRAW/XDEDRAW_Colors.cxx b/src/XDEDRAW/XDEDRAW_Colors.cxx index 669032413f..985bfdbc82 100644 --- a/src/XDEDRAW/XDEDRAW_Colors.cxx +++ b/src/XDEDRAW/XDEDRAW_Colors.cxx @@ -1,4 +1,4 @@ -// Created on: 2000-08-04 +// Created on: 2000-08-04 // Created by: Pavel TELKOV // Copyright (c) 2000-2014 OPEN CASCADE SAS // @@ -17,7 +17,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -35,7 +37,7 @@ static Standard_Integer setColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { if (argc < 6) { - di<<"Use: "<GetData(), argv[2], aLabel); Quantity_Color Col ( Draw::Atof(argv[3]), Draw::Atof(argv[4]), Draw::Atof(argv[5]), Quantity_TOC_RGB ); + + Quantity_ColorRGBA aColRGBA; + aColRGBA.SetRGB(Col); + if (argc > 6 && (argv[6][0] != 's' && argv[6][0] != 'c')) { + aColRGBA.SetAlpha((Standard_ShortReal)(Draw::Atof(argv[6]))); + } Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); - const XCAFDoc_ColorType ctype = ( argc <= 6 ? XCAFDoc_ColorGen : ( argv[6][0] == 's' ? XCAFDoc_ColorSurf : XCAFDoc_ColorCurv ) ); + XCAFDoc_ColorType ctype = XCAFDoc_ColorGen; + if (argc > 6) { + if (argv[argc - 1][0] == 's') + ctype = XCAFDoc_ColorSurf; + else if (argv[argc - 1][0] == 'c') + ctype = XCAFDoc_ColorCurv; + } + if ( !aLabel.IsNull() ) { - myColors->SetColor ( aLabel, Col, ctype ); + myColors->SetColor(aLabel, aColRGBA, ctype); } else { TopoDS_Shape aShape= DBRep::Get(argv[2]); if ( !aShape.IsNull() ) { - myColors->SetColor ( aShape, Col, ctype ); + myColors->SetColor(aShape, aColRGBA, ctype); } } return 0; @@ -73,10 +88,13 @@ static Standard_Integer getColor (Draw_Interpretor& di, Standard_Integer argc, c TDF_Label aLabel; TDF_Tool::Label(Doc->GetData(), argv[2], aLabel); Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); - Quantity_Color col; + Quantity_ColorRGBA col; if ( !myColors->GetColor(aLabel, col) ) return 0; - di << col.StringName ( col.Name() ); + if ((1 - col.Alpha()) < Precision::Confusion()) + di << col.GetRGB().StringName(col.GetRGB().Name()); + else + di << col.GetRGB().StringName ( col.GetRGB().Name() ) << " (" << col.Alpha() << ")"; return 0; } @@ -101,12 +119,13 @@ static Standard_Integer getShapeColor (Draw_Interpretor& di, Standard_Integer ar Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); const XCAFDoc_ColorType ctype = ( argc <= 3 ? XCAFDoc_ColorGen : ( argv[3][0] == 's' ? XCAFDoc_ColorSurf : XCAFDoc_ColorCurv ) ); - Quantity_Color col; + Quantity_ColorRGBA col; if ( !myColors->GetColor(aLabel, ctype, col) ) return 0; - TCollection_AsciiString Entry; - Entry = col.StringName ( col.Name() ); - di << Entry.ToCString(); + if ((1 - col.Alpha()) < Precision::Confusion()) + di << col.GetRGB().StringName(col.GetRGB().Name()); + else + di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")"; return 0; } @@ -123,14 +142,17 @@ static Standard_Integer getAllColors (Draw_Interpretor& di, Standard_Integer arg TDF_Label aLabel; Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); - Quantity_Color col; + Quantity_ColorRGBA col; TDF_LabelSequence Labels; myColors->GetColors(Labels); if (Labels.Length() >= 1) { for ( Standard_Integer i = 1; i<= Labels.Length(); i++) { aLabel = Labels.Value(i); if ( !myColors->GetColor(aLabel, col) ) continue; - di << col.StringName ( col.Name() ); + if ((1 - col.Alpha()) < Precision::Confusion()) + di << col.GetRGB().StringName(col.GetRGB().Name()); + else + di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")"; di << " "; } } @@ -140,8 +162,8 @@ static Standard_Integer getAllColors (Draw_Interpretor& di, Standard_Integer arg static Standard_Integer addColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc!=5) { - di<<"Use: "<Main()); Quantity_Color Col ( Draw::Atof(argv[2]), Draw::Atof(argv[3]), Draw::Atof(argv[4]), Quantity_TOC_RGB ); - aLabel = myColors->AddColor(Col); + if (argc == 6) { + Quantity_ColorRGBA aColRGBA(Col); + aColRGBA.SetAlpha((Standard_ShortReal)(Draw::Atof(argv[5]))); + aLabel = myColors->AddColor(aColRGBA); + } + else + aLabel = myColors->AddColor(Col); TCollection_AsciiString Entry; TDF_Tool::Entry(aLabel, Entry); @@ -180,8 +208,8 @@ static Standard_Integer removeColor (Draw_Interpretor& di, Standard_Integer argc static Standard_Integer findColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc!=5) { - di<<"Use: "<Main()); - - Quantity_Color Col ( Draw::Atof(argv[2]), Draw::Atof(argv[3]), Draw::Atof(argv[4]), Quantity_TOC_RGB ); - TCollection_AsciiString Entry; - TDF_Tool::Entry(myColors->FindColor(Col), Entry); + Quantity_Color Col(Draw::Atof(argv[2]), Draw::Atof(argv[3]), Draw::Atof(argv[4]), Quantity_TOC_RGB); + if (argc == 5) { + TDF_Tool::Entry(myColors->FindColor(Col), Entry); + } + else { + Quantity_ColorRGBA aColRGBA(Col); + aColRGBA.SetAlpha((Standard_ShortReal)Draw::Atof(argv[5])); + TDF_Tool::Entry(myColors->FindColor(aColRGBA), Entry); + } di << Entry.ToCString(); return 0; } @@ -308,7 +341,7 @@ static Standard_Integer getStyledcolor (Draw_Interpretor& di, Standard_Integer a TopoDS_Shape aShape; aShape = DBRep::Get(argv[2]); - Quantity_Color col; + Quantity_ColorRGBA col; XCAFDoc_ColorType type; if ( argv[3] && argv[3][0] == 's' ) type = XCAFDoc_ColorSurf; @@ -319,9 +352,10 @@ static Standard_Integer getStyledcolor (Draw_Interpretor& di, Standard_Integer a Handle(XCAFDoc_ColorTool) localTool = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); if (localTool->GetInstanceColor( aShape, type, col) ) { - TCollection_AsciiString Entry; - Entry = col.StringName ( col.Name() ); - di << Entry.ToCString(); + if ((1 - col.Alpha()) < Precision::Confusion()) + di << col.GetRGB().StringName(col.GetRGB().Name()); + else + di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")"; } return 0; } @@ -329,7 +363,7 @@ static Standard_Integer getStyledcolor (Draw_Interpretor& di, Standard_Integer a static Standard_Integer setStyledcolor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { if (argc<6) { - di<<"Use: "< 6 && (argv[6][0] != 's' && argv[6][0] != 'c')) { + aColRGBA.SetAlpha((Standard_ShortReal)(Draw::Atof(argv[6]))); + } + + Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); + XCAFDoc_ColorType ctype = XCAFDoc_ColorGen; + if (argc > 6) { + if (argv[argc - 1][0] == 's') + ctype = XCAFDoc_ColorSurf; + else if (argv[argc - 1][0] == 'c') + ctype = XCAFDoc_ColorCurv; + } Handle(XCAFDoc_ColorTool) localTool = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); - if (!localTool->SetInstanceColor( aShape, type, col) ) + if (!localTool->SetInstanceColor(aShape, ctype, aColRGBA)) { di << "cannot set color for the indicated component\n"; return 1; @@ -372,7 +413,7 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di) Standard_CString g = "XDE color's commands"; - di.Add ("XSetColor","Doc {Label|Shape} R G B [c|s]\t: Set color [R G B] to shape given by Label, " + di.Add ("XSetColor","Doc {Label|Shape} R G B [alpha] [c|s]\t: Set color [R G B] to shape given by Label, " "type of color 's' - for surface, 'c' - for curve (default generic)", __FILE__, setColor, g); @@ -385,13 +426,13 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di) di.Add ("XGetAllColors","Doc \t: Print all colors that defined in document", __FILE__, getAllColors, g); - di.Add ("XAddColor","Doc R G B \t: Add color in document to color table", + di.Add ("XAddColor","Doc R G B [alpha]\t: Add color in document to color table", __FILE__, addColor, g); di.Add ("XRemoveColor","Doc Label \t: Remove color in document from color table", __FILE__, removeColor, g); - di.Add ("XFindColor","Doc R G B \t: Find label where indicated color is situated", + di.Add ("XFindColor","Doc R G B [alpha]\t: Find label where indicated color is situated", __FILE__, findColor, g); di.Add ("XUnsetColor","Doc {Label|Shape} ColorType \t: Unset color ", @@ -409,7 +450,7 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di) di.Add ("XGetInstanceColor","Doc Shape \t: Return the color of component shape ", __FILE__, getStyledcolor, g); - di.Add ("XSetInstanceColor","Doc Shape color type \t: sets color for component of shape if SHUO structure exists already ", + di.Add ("XSetInstanceColor","Doc Shape R G B [alpha] type \t: sets color for component of shape if SHUO structure exists already ", __FILE__, setStyledcolor, g); } diff --git a/tests/bugs/xde/bug28641 b/tests/bugs/xde/bug28641 new file mode 100644 index 0000000000..c6a4ddcf6b --- /dev/null +++ b/tests/bugs/xde/bug28641 @@ -0,0 +1,76 @@ +puts "========" +puts "OCC28641" +puts "========" +puts "" +#################################################### +# Data Exchange - Support alpha-channel of color +#################################################### + +pload OCAF + +# Create document with View +NewDocument D_First BinXCAF +box b 1 1 1 +explode b e +explode b f +XAddShape D_First b +XSetColor D_First b_1 1 0 0 s +XSetColor D_First b_2 1 1 0 0.3 s +XSetColor D_First b_11 1 1 1 0.2 c +XSetColor D_First b_10 0 1 1 c +XAddColor D_First 0.5 0.5 1 0.1 + +# Write file +SaveAs D_First ${imagedir}/bug28521.xbf +Close D_First +# Read document +XOpen ${imagedir}/bug28521.xbf D_Second + +# Results validation +set isOK 1 +set color "" +set alpha "" +set prec 1e-7 +#0:1:2:1 +set res [XGetColor D_Second 0:1:2:1] +if {$res != "RED"} { + set isOK 0 +} +#0:1:2:2 +set res [XGetColor D_Second 0:1:2:2] +regexp {([A-Z0-9]+) \(([0-9.+eE]+)\)} $res full color alpha +if {$color != "YELLOW"} { + set isOK 0 +} +if {[expr abs(0.3 - $alpha)] > $prec} { + set isOK 0 +} +#0:1:2:3 +set res [XGetColor D_Second 0:1:2:3] +regexp {([A-Z0-9]+) \(([0-9.+eE]+)\)} $res full color alpha +if {$color != "WHITE"} { + set isOK 0 +} +if {[expr abs(0.2 - $alpha)] > $prec} { + set isOK 0 +} +#0:1:2:4 +set res [XGetColor D_Second 0:1:2:4] +if {$res != "CYAN1"} { + set isOK 0 +} +#0:1:2:5 +set res [XGetColor D_Second 0:1:2:5] +regexp {([A-Z0-9]+) \(([0-9.+eE]+)\)} $res full color alpha +if {$color != "LIGHTSLATEBLUE"} { + set isOK 0 +} +if {[expr abs(0.1 - $alpha)] > $prec} { + set isOK 0 +} + +if {$isOK == 0} { + puts "Error: wrong color." +} + +Close D_Second