From 9196ea9d5ad4190294cff17c67ccdfdba3ee6f1b Mon Sep 17 00:00:00 2001 From: kgv Date: Sat, 21 Sep 2019 17:10:23 +0300 Subject: [PATCH] 0030991: Draw Harness - ViewerTest::ParseColor() defines out-of-range alpha component ViewerTest::ParseColor() - fixed alpha component defined as 255 for RGB-only input. Quantity_Color::ColorToHex() now rounds-up float values to closest integer. Quantity_ColorRGBA::ColorToHex() - added method formatting color into hex with alpha component consistent to Quantity_Color::ColorToHex() for RGB. vdrawtext command now uses ViewerTest::ParseColor() for parsing color argument, so that it accepts hex. vreadpixel command now has been extended with -hex argument for printing color in hex format. Commands XSetColor, XGetColor, XGetShapeColor, XGetAllColors, XAddColor, XRemoveColor, XFindColor, XUnsetColor, XGetInstanceColor, XSetInstanceColor have been corrected to properly report syntax input errors and to accept color names and hex (by reusing ViewerTest::ParseColor()). --- samples/tcl/materials.tcl | 1 + samples/tcl/pathtrace_ball.tcl | 2 +- samples/tcl/pathtrace_cube.tcl | 2 +- samples/tcl/pathtrace_materials.tcl | 2 +- src/Image/Image_AlienPixMap.cxx | 4 + src/Quantity/Quantity_Color.hxx | 8 +- src/Quantity/Quantity_ColorRGBA.hxx | 12 + src/ViewerTest/ViewerTest.cxx | 19 +- src/ViewerTest/ViewerTest_ObjectCommands.cxx | 82 +-- src/ViewerTest/ViewerTest_ViewerCommands.cxx | 22 +- src/XDEDRAW/XDEDRAW_Colors.cxx | 707 ++++++++++++------- 11 files changed, 540 insertions(+), 321 deletions(-) diff --git a/samples/tcl/materials.tcl b/samples/tcl/materials.tcl index 2ea7a7ae91..e377752465 100644 --- a/samples/tcl/materials.tcl +++ b/samples/tcl/materials.tcl @@ -86,3 +86,4 @@ drawObjects 0 "" drawObjects 1 red drawObjects 2 green drawObjects 3 blue1 +vrepaint diff --git a/samples/tcl/pathtrace_ball.tcl b/samples/tcl/pathtrace_ball.tcl index 186bbccadf..b065eaab66 100644 --- a/samples/tcl/pathtrace_ball.tcl +++ b/samples/tcl/pathtrace_ball.tcl @@ -75,4 +75,4 @@ vrenderparams -ray -gi -rayDepth 10 puts "Make several path tracing iterations to refine the picture, please wait..." vfps 100 puts "Done. To improve the image further, or after view manipulations, give command:" -puts "vfps \[nb_iteratons\]" +puts "vfps \[nb_iteratons\] or vrepaint -continuous" diff --git a/samples/tcl/pathtrace_cube.tcl b/samples/tcl/pathtrace_cube.tcl index 6cd321efdc..ad7c88ac04 100644 --- a/samples/tcl/pathtrace_cube.tcl +++ b/samples/tcl/pathtrace_cube.tcl @@ -85,4 +85,4 @@ vrenderparams -ray -gi -rayDepth 8 puts "Make several path tracing iterations to refine the picture, please wait..." vfps 100 puts "Done. To improve the image further, or after view manipulations, give command:" -puts "vfps \[nb_iteratons\]" +puts "vfps \[nb_iteratons\] or vrepaint -continuous" diff --git a/samples/tcl/pathtrace_materials.tcl b/samples/tcl/pathtrace_materials.tcl index 8f7d10ce82..e22344d5f3 100644 --- a/samples/tcl/pathtrace_materials.tcl +++ b/samples/tcl/pathtrace_materials.tcl @@ -223,4 +223,4 @@ vrenderparams -ray -gi -rayDepth 10 puts "Make several path tracing iterations to refine the picture, please wait..." vfps 512 puts "Done. To improve the image further, or after view manipulations, give command:" -puts "vfps \[nb_iteratons\]" +puts "vfps \[nb_iteratons\] or vrepaint -continuous" diff --git a/src/Image/Image_AlienPixMap.cxx b/src/Image/Image_AlienPixMap.cxx index b38190195a..5d4d8a9b62 100644 --- a/src/Image/Image_AlienPixMap.cxx +++ b/src/Image/Image_AlienPixMap.cxx @@ -31,6 +31,10 @@ #include #undef min #undef max + + #ifdef _MSC_VER + #pragma comment(lib, "Ole32.lib") + #endif #endif #include diff --git a/src/Quantity/Quantity_Color.hxx b/src/Quantity/Quantity_Color.hxx index b221dabdb5..a5b3ef34d0 100644 --- a/src/Quantity/Quantity_Color.hxx +++ b/src/Quantity/Quantity_Color.hxx @@ -244,12 +244,14 @@ Standard_Boolean operator == (const Quantity_Color& Other) const Standard_EXPORT static bool ColorFromHex (const Standard_CString theHexColorString, Quantity_Color& theColor); //! Returns hex sRGB string in format "#FFAAFF". - static TCollection_AsciiString ColorToHex (const Quantity_Color& theColor) + static TCollection_AsciiString ColorToHex (const Quantity_Color& theColor, + const bool theToPrefixHash = true) { NCollection_Vec3 anSRgb = (NCollection_Vec3 )theColor; - NCollection_Vec3 anSRgbInt (anSRgb * 255.0f); + NCollection_Vec3 anSRgbInt (anSRgb * 255.0f + NCollection_Vec3 (0.5f)); char aBuff[10]; - Sprintf (aBuff, "#%02X%02X%02X", anSRgbInt.r(), anSRgbInt.g(), anSRgbInt.b()); + Sprintf (aBuff, theToPrefixHash ? "#%02X%02X%02X" : "%02X%02X%02X", + anSRgbInt.r(), anSRgbInt.g(), anSRgbInt.b()); return aBuff; } diff --git a/src/Quantity/Quantity_ColorRGBA.hxx b/src/Quantity/Quantity_ColorRGBA.hxx index a1e0709626..cffdbaea23 100644 --- a/src/Quantity/Quantity_ColorRGBA.hxx +++ b/src/Quantity/Quantity_ColorRGBA.hxx @@ -121,6 +121,18 @@ public: Quantity_ColorRGBA& theColor, const bool theAlphaComponentIsOff = false); + //! Returns hex sRGBA string in format "#RRGGBBAA". + static TCollection_AsciiString ColorToHex (const Quantity_ColorRGBA& theColor, + const bool theToPrefixHash = true) + { + NCollection_Vec4 anSRgb = (NCollection_Vec4 )theColor; + NCollection_Vec4 anSRgbInt (anSRgb * 255.0f + NCollection_Vec4 (0.5f)); + char aBuff[12]; + Sprintf (aBuff, theToPrefixHash ? "#%02X%02X%02X%02X" : "%02X%02X%02X%02X", + anSRgbInt.r(), anSRgbInt.g(), anSRgbInt.b(), anSRgbInt.a()); + return aBuff; + } + //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; diff --git a/src/ViewerTest/ViewerTest.cxx b/src/ViewerTest/ViewerTest.cxx index 7e36331147..2c169417ef 100644 --- a/src/ViewerTest/ViewerTest.cxx +++ b/src/ViewerTest/ViewerTest.cxx @@ -202,22 +202,17 @@ namespace { const Standard_Integer THE_COLOR_COMPONENT_NOT_PARSED = -1; Graphic3d_Vec4i anIntegerColor (THE_COLOR_COMPONENT_NOT_PARSED); - if (!parseNumericalColor (theNumberOfColorComponents, theColorComponentStrings, anIntegerColor)) + if (!parseNumericalColor (theNumberOfColorComponents, theColorComponentStrings, anIntegerColor) + || anIntegerColor.maxComp() <= 1) { return false; } - - const bool hasColorComponentGreaterThanOne = (anIntegerColor.maxComp() > 1); if (anIntegerColor.a() == THE_COLOR_COMPONENT_NOT_PARSED) { anIntegerColor.a() = THE_MAX_INTEGER_COLOR_COMPONENT; } - Graphic3d_Vec4 aRealColor (anIntegerColor); - if (hasColorComponentGreaterThanOne) - { - aRealColor /= static_cast (THE_MAX_INTEGER_COLOR_COMPONENT); - } + const Graphic3d_Vec4 aRealColor = Graphic3d_Vec4 (anIntegerColor) / static_cast (THE_MAX_INTEGER_COLOR_COMPONENT); theColor = Quantity_ColorRGBA (aRealColor); return true; } @@ -284,11 +279,12 @@ Standard_Integer ViewerTest::parseColor (const Standard_Integer theArgNb, if (theArgNb >= 3) { const Standard_Integer aNumberOfColorComponentsToParse = Min (theArgNb, theToParseAlpha ? 4 : 3); - Standard_Integer aNumberOfColorComponentsParsed = aNumberOfColorComponentsToParse; + Standard_Integer aNumberOfColorComponentsParsed = aNumberOfColorComponentsToParse; if (parseIntegerColor (aNumberOfColorComponentsParsed, theArgVec, theColor)) { return aNumberOfColorComponentsParsed; } + aNumberOfColorComponentsParsed = aNumberOfColorComponentsToParse; if (parseRealColor (aNumberOfColorComponentsParsed, theArgVec, theColor)) { return aNumberOfColorComponentsParsed; @@ -2369,6 +2365,11 @@ static Standard_Integer VAspects (Draw_Interpretor& theDI, aNames.Remove (aNames.Length()); isOk = Standard_True; } + else if (Quantity_Color::ColorFromHex (aNames.Last().ToCString(), aChangeSet->Color)) + { + aNames.Remove (aNames.Length()); + isOk = Standard_True; + } else if (aNames.Length() >= 3) { const char* anArgVec[3] = diff --git a/src/ViewerTest/ViewerTest_ObjectCommands.cxx b/src/ViewerTest/ViewerTest_ObjectCommands.cxx index 653acdbef5..12c90ad24e 100644 --- a/src/ViewerTest/ViewerTest_ObjectCommands.cxx +++ b/src/ViewerTest/ViewerTest_ObjectCommands.cxx @@ -2388,42 +2388,17 @@ static int VDrawText (Draw_Interpretor& theDI, } else if (aParam == "-color") { - if (anArgIt + 1 >= theArgsNb) + Quantity_Color aColor; + Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgsNb - anArgIt - 1, + theArgVec + anArgIt + 1, + aColor); + if (aNbParsed == 0) { - std::cout << "Error: wrong number of values for parameter '" << aParam.ToCString() << "'.\n"; + std::cout << "Syntax error at '" << aParam << "'\n"; return 1; } - - TCollection_AsciiString aColor (theArgVec[anArgIt + 1]); - Quantity_NameOfColor aNameOfColor = Quantity_NOC_BLACK; - if (Quantity_Color::ColorFromName (aColor.ToCString(), aNameOfColor)) - { - anArgIt += 1; - aTextPrs->SetColor (aNameOfColor); - continue; - } - else if (anArgIt + 3 >= theArgsNb) - { - std::cout << "Error: wrong number of values for parameter '" << aParam.ToCString() << "'.\n"; - return 1; - } - - TCollection_AsciiString aGreen (theArgVec[anArgIt + 2]); - TCollection_AsciiString aBlue (theArgVec[anArgIt + 3]); - if (!aColor.IsRealValue() - || !aGreen.IsRealValue() - || !aBlue.IsRealValue()) - { - std::cout << "Error: wrong syntax at '" << aParam.ToCString() << "'.\n"; - return 1; - } - - const Graphic3d_Vec3d anRGB (aColor.RealValue(), - aGreen.RealValue(), - aBlue.RealValue()); - - aTextPrs->SetColor (Quantity_Color (anRGB.r(), anRGB.g(), anRGB.b(), Quantity_TOC_RGB)); - anArgIt += 3; + anArgIt += aNbParsed; + aTextPrs->SetColor (aColor); } else if (aParam == "-halign") { @@ -2598,42 +2573,17 @@ static int VDrawText (Draw_Interpretor& theDI, else if (aParam == "-subcolor" || aParam == "-subtitlecolor") { - if (anArgIt + 1 >= theArgsNb) + Quantity_Color aColor; + Standard_Integer aNbParsed = ViewerTest::ParseColor (theArgsNb - anArgIt - 1, + theArgVec + anArgIt + 1, + aColor); + if (aNbParsed == 0) { - std::cout << "Error: wrong number of values for parameter '" << aParam.ToCString() << "'.\n"; + std::cout << "Syntax error at '" << aParam << "'\n"; return 1; } - - TCollection_AsciiString aColor (theArgVec[anArgIt + 1]); - Quantity_NameOfColor aNameOfColor = Quantity_NOC_BLACK; - if (Quantity_Color::ColorFromName (aColor.ToCString(), aNameOfColor)) - { - anArgIt += 1; - aTextPrs->SetColorSubTitle (aNameOfColor); - continue; - } - else if (anArgIt + 3 >= theArgsNb) - { - std::cout << "Error: wrong number of values for parameter '" << aParam.ToCString() << "'.\n"; - return 1; - } - - TCollection_AsciiString aGreen (theArgVec[anArgIt + 2]); - TCollection_AsciiString aBlue (theArgVec[anArgIt + 3]); - if (!aColor.IsRealValue() - || !aGreen.IsRealValue() - || !aBlue.IsRealValue()) - { - std::cout << "Error: wrong syntax at '" << aParam.ToCString() << "'.\n"; - return 1; - } - - const Graphic3d_Vec3d anRGB (aColor.RealValue(), - aGreen.RealValue(), - aBlue.RealValue()); - - aTextPrs->SetColorSubTitle (Quantity_Color (anRGB.r(), anRGB.g(), anRGB.b(), Quantity_TOC_RGB)); - anArgIt += 3; + anArgIt += aNbParsed; + aTextPrs->SetColorSubTitle (aColor); } else if (aParam == "-2d") { diff --git a/src/ViewerTest/ViewerTest_ViewerCommands.cxx b/src/ViewerTest/ViewerTest_ViewerCommands.cxx index a53c8dcfa1..336ecbd331 100644 --- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx +++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx @@ -7042,8 +7042,7 @@ static int VReadPixel (Draw_Interpretor& theDI, return 1; } - Standard_Boolean toShowName = Standard_False; - Standard_Boolean toShowHls = Standard_False; + bool toShowName = false, toShowHls = false, toShowHex = false; for (Standard_Integer anIter = 3; anIter < theArgNb; ++anIter) { TCollection_AsciiString aParam (theArgVec[anIter]); @@ -7090,9 +7089,15 @@ static int VReadPixel (Draw_Interpretor& theDI, { toShowName = Standard_True; } + else if (aParam == "-hex" + || aParam == "hex") + { + toShowHex = Standard_True; + } else { std::cout << "Syntax error at '" << aParam << "'\n"; + return 1; } } @@ -7130,6 +7135,17 @@ static int VReadPixel (Draw_Interpretor& theDI, theDI << Quantity_Color::StringName (aColor.GetRGB().Name()); } } + else if (toShowHex) + { + if (aBufferType == Graphic3d_BT_RGBA) + { + theDI << Quantity_ColorRGBA::ColorToHex (aColor); + } + else + { + theDI << Quantity_Color::ColorToHex (aColor.GetRGB()); + } + } else { switch (aBufferType) @@ -13900,7 +13916,7 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands) " with f option returns free memory in bytes", __FILE__, VMemGpu, group); theCommands.Add ("vreadpixel", - "vreadpixel xPixel yPixel [{rgb|rgba|depth|hls|rgbf|rgbaf}=rgba] [-name]" + "vreadpixel xPixel yPixel [{rgb|rgba|depth|hls|rgbf|rgbaf}=rgba] [-name|-hex]" " : Read pixel value for active view", __FILE__, VReadPixel, group); theCommands.Add("diffimage", diff --git a/src/XDEDRAW/XDEDRAW_Colors.cxx b/src/XDEDRAW/XDEDRAW_Colors.cxx index 548789950b..228f666fa1 100644 --- a/src/XDEDRAW/XDEDRAW_Colors.cxx +++ b/src/XDEDRAW/XDEDRAW_Colors.cxx @@ -26,133 +26,241 @@ #include #include #include +#include #include #include #include #include +//! Parse XCAFDoc_ColorType enumeration argument. +static bool parseXDocColorType (const TCollection_AsciiString& theArg, + XCAFDoc_ColorType& theType) +{ + TCollection_AsciiString anArgCase (theArg); + anArgCase.LowerCase(); + if (anArgCase == "surf" + || anArgCase == "surface" + || anArgCase == "s") + { + theType = XCAFDoc_ColorSurf; + return true; + } + else if (anArgCase == "curve" + || anArgCase == "c") + { + theType = XCAFDoc_ColorCurv; + return true; + } + else if (anArgCase == "gen" + || anArgCase == "generic") + { + theType = XCAFDoc_ColorGen; + return true; + } + return false; +} + //======================================================================= // Section: Work with colors //======================================================================= -static Standard_Integer setColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) +static Standard_Integer setColor (Draw_Interpretor& , 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()); - 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, aColRGBA, ctype); - } - else { - TopoDS_Shape aShape= DBRep::Get(argv[2]); - if ( !aShape.IsNull() ) { - myColors->SetColor(aShape, aColRGBA, ctype); + TopoDS_Shape aShape; + TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel); + if (aLabel.IsNull()) + { + aShape = DBRep::Get (argv[2]); + if (aShape.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " is not a label nor shape\n"; + return 1; } } + + Quantity_ColorRGBA aColor; + bool isColorDefined = false; + XCAFDoc_ColorType aColType = XCAFDoc_ColorGen; + for (Standard_Integer anArgIter = 3; anArgIter < argc; ++anArgIter) + { + if (parseXDocColorType (argv[anArgIter], aColType)) + { + // + } + else if (!isColorDefined) + { + isColorDefined = true; + Standard_Integer aNbParsed = ViewerTest::ParseColor (argc - anArgIter, + argv + anArgIter, + aColor); + if (aNbParsed == 0) + { + std::cout << "Syntax error at '" << argv[anArgIter] << "'\n"; + return 1; + } + anArgIter += aNbParsed - 1; + } + else + { + std::cout << "Syntax error at '" << argv[anArgIter] << "'\n"; + return 1; + } + } + if (!isColorDefined) + { + std::cout << "Syntax error: wrong number of arguments\n"; + return 1; + } + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + if (!aLabel.IsNull()) + { + aColorTool->SetColor (aLabel, aColor, aColType); + } + else if (!aColorTool->SetColor (aShape, aColor, aColType)) + { + std::cout << "Syntax error: " << argv[2] << " is not a label nor shape\n"; + return 1; + } return 0; } static Standard_Integer getColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc!=3) { - di<<"Use: "<GetData(), argv[2], aLabel); - Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); - Quantity_ColorRGBA col; - if ( !myColors->GetColor(aLabel, col) ) return 0; - - if ((1 - col.Alpha()) < Precision::Confusion()) - di << col.GetRGB().StringName(col.GetRGB().Name()); + TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel); + Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + Quantity_ColorRGBA aColor; + if (!myColors->GetColor (aLabel, aColor)) + { + return 0; + } + + if ((1.0 - aColor.Alpha()) < Precision::Confusion()) + { + di << aColor.GetRGB().StringName (aColor.GetRGB().Name()); + } else - di << col.GetRGB().StringName ( col.GetRGB().Name() ) << " (" << col.Alpha() << ")"; - + { + di << aColor.GetRGB().StringName (aColor.GetRGB().Name()) << " (" << aColor.Alpha() << ")"; + } return 0; } static Standard_Integer getShapeColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc < 3) { - di<<"Use: "<GetData(), argv[2], aLabel); - if ( aLabel.IsNull() ) { - di << " no such label in document\n"; + TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel); + if (aLabel.IsNull()) + { + std::cout << "Syntax error: '" << argv[2] << "' label is not found in the document\n"; return 1; } - 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 ) ); + Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + XCAFDoc_ColorType aColType = XCAFDoc_ColorGen; + if (argc > 3 && !parseXDocColorType (argv[3], aColType)) + { + std::cout << "Syntax error: unknown color type '" << argv[3] << "'\n"; + return 1; + } - Quantity_ColorRGBA col; - if ( !myColors->GetColor(aLabel, ctype, col) ) return 0; + Quantity_ColorRGBA aColor; + if (!myColors->GetColor (aLabel, aColType, aColor)) + { + return 0; + } - if ((1 - col.Alpha()) < Precision::Confusion()) - di << col.GetRGB().StringName(col.GetRGB().Name()); + if ((1.0 - aColor.Alpha()) < Precision::Confusion()) + { + di << aColor.GetRGB().StringName(aColor.GetRGB().Name()); + } else - di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")"; + { + di << aColor.GetRGB().StringName(aColor.GetRGB().Name()) << " (" << aColor.Alpha() << ")"; + } return 0; } static Standard_Integer getAllColors (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc!=2) { - di<<"Use: "<Main()); - 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; - if ((1 - col.Alpha()) < Precision::Confusion()) - di << col.GetRGB().StringName(col.GetRGB().Name()); + Handle(TDocStd_Document) aDoc; + DDocStd::GetDocument (argv[1], aDoc); + if (aDoc.IsNull()) + { + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; + } + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + TDF_LabelSequence aLabels; + aColorTool->GetColors (aLabels); + if (aLabels.Length() >= 1) + { + for (TDF_LabelSequence::Iterator aLabIter (aLabels); aLabIter.More(); aLabIter.Next()) + { + Quantity_ColorRGBA aColor; + if (!aColorTool->GetColor (aLabIter.Value(), aColor)) + { + continue; + } + if ((1.0 - aColor.Alpha()) < Precision::Confusion()) + { + di << aColor.GetRGB().StringName (aColor.GetRGB().Name()); + } else - di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")"; + { + di << aColor.GetRGB().StringName (aColor.GetRGB().Name()) << " (" << aColor.Alpha() << ")"; + } di << " "; } } @@ -162,235 +270,351 @@ 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 ); - if (argc == 6) { - Quantity_ColorRGBA aColRGBA(Col); - aColRGBA.SetAlpha((Standard_ShortReal)(Draw::Atof(argv[5]))); - aLabel = myColors->AddColor(aColRGBA); + Handle(TDocStd_Document) aDoc; + DDocStd::GetDocument (argv[1], aDoc); + if (aDoc.IsNull()) + { + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; } - else - aLabel = myColors->AddColor(Col); - - TCollection_AsciiString Entry; - TDF_Tool::Entry(aLabel, Entry); - di << Entry.ToCString(); + + Quantity_ColorRGBA aColRGBA; + Standard_Integer aNbParsed = ViewerTest::ParseColor (argc - 2, argv + 2, aColRGBA); + if (aNbParsed != argc - 2) + { + std::cout << "Syntax error at '" << argv[2] << "'\n"; + return 1; + } + + TCollection_AsciiString anEntry; + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + TDF_Label aLabel = aColorTool->AddColor (aColRGBA); + TDF_Tool::Entry (aLabel, anEntry); + di << anEntry; return 0; } -static Standard_Integer removeColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) +static Standard_Integer removeColor (Draw_Interpretor& , Standard_Integer argc, const char** argv) { - if (argc!=3) { - di<<"Use: "<GetData(), argv[2], aLabel); - Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); - myColors->RemoveColor(aLabel); - + DDocStd::GetDocument (argv[1], aDoc); + if (aDoc.IsNull()) + { + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; + } + TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel); + if (aLabel.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " label is not found in the document\n"; + return 1; + } + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + aColorTool->RemoveColor (aLabel); return 0; } static Standard_Integer findColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc < 5) { - di<<"Use: "<Main()); - TCollection_AsciiString 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); + Handle(TDocStd_Document) aDoc; + DDocStd::GetDocument (argv[1], aDoc); + if (aDoc.IsNull()) + { + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; } - else { - Quantity_ColorRGBA aColRGBA(Col); - aColRGBA.SetAlpha((Standard_ShortReal)Draw::Atof(argv[5])); - TDF_Tool::Entry(myColors->FindColor(aColRGBA), Entry); + + Quantity_ColorRGBA aColRGBA; + Standard_Integer aNbParsed = ViewerTest::ParseColor (argc - 2, argv + 2, aColRGBA); + if (aNbParsed != argc - 2) + { + std::cout << "Syntax error at '" << argv[2] << "'\n"; + return 1; } - di << Entry.ToCString(); + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + TCollection_AsciiString anEntry; + TDF_Tool::Entry (aColorTool->FindColor (aColRGBA), anEntry); + di << anEntry; return 0; } -static Standard_Integer unsetColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) +static Standard_Integer unsetColor (Draw_Interpretor& , Standard_Integer argc, const char** argv) { - if (argc!=4) { - di<<"Use: "<GetData(), argv[2], aLabel); - Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main()); - if ( !aLabel.IsNull() ) { - myColors->UnSetColor(aLabel, argv[3][0] == 's' ? XCAFDoc_ColorSurf : XCAFDoc_ColorCurv); + TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel); + Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + if (!aLabel.IsNull()) + { + myColors->UnSetColor (aLabel, aColType); + return 0; } - TopoDS_Shape aShape= DBRep::Get(argv[2]); - if ( !aShape.IsNull() ) { - myColors->UnSetColor(aShape, argv[3][0] == 's' ? XCAFDoc_ColorSurf : XCAFDoc_ColorCurv); + + TopoDS_Shape aShape = DBRep::Get (argv[2]); + if (aShape.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " is not a label nor shape\n"; + return 1; } + myColors->UnSetColor (aShape, aColType); return 0; } -static Standard_Integer setVisibility (Draw_Interpretor& di, Standard_Integer argc, const char** argv) +static Standard_Integer setVisibility (Draw_Interpretor& , Standard_Integer argc, const char** argv) { - if (argc<3) { - di<<"Use: "<Main()); - Standard_Boolean isvisible = Standard_False; - if ( (argc==4) && (Draw::Atoi(argv[3])==1) ) isvisible = Standard_True; - + + Handle(TDocStd_Document) aDoc; TDF_Label aLabel; - TDF_Tool::Label(Doc->GetData(), argv[2], aLabel); - if ( aLabel.IsNull() ) { + DDocStd::GetDocument (argv[1], aDoc); + if (aDoc.IsNull()) + { + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; + } + + TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel); + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + if (aLabel.IsNull()) + { // get label by shape - TopoDS_Shape aShape= DBRep::Get(argv[2]); - if ( !aShape.IsNull() ) { - aLabel = localTool->ShapeTool()->FindShape( aShape, Standard_True ); + TopoDS_Shape aShape = DBRep::Get (argv[2]); + if (!aShape.IsNull()) + { + aLabel = aColorTool->ShapeTool()->FindShape (aShape, Standard_True); } } - if ( aLabel.IsNull() ) { - di << " cannot find indicated label in document\n"; + if (aLabel.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " is not a label not shape\n"; return 1; } - localTool->SetVisibility( aLabel, isvisible ); + + Standard_Boolean isVisible = Standard_False; + if (argc == 4) + { + TCollection_AsciiString aVisArg (argv[3]); + if (aVisArg == "1") + { + isVisible = Standard_True; + } + else if (aVisArg == "0") + { + isVisible = Standard_False; + } + else + { + std::cout << "Syntax error: unknown argument '" << argv[3] << "'\n"; + return 1; + } + } + aColorTool->SetVisibility (aLabel, isVisible); return 0; } static Standard_Integer getVisibility (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc<3) { - di<<"Use: "<Main()); + + Handle(TDocStd_Document) aDoc; + DDocStd::GetDocument (argv[1], aDoc); + if (aDoc.IsNull()) + { + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; + } + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); TDF_Label aLabel; - TDF_Tool::Label(Doc->GetData(), argv[2], aLabel); - if ( aLabel.IsNull() ) { + TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel); + if (aLabel.IsNull()) + { // get label by shape - TopoDS_Shape aShape= DBRep::Get(argv[2]); - if ( !aShape.IsNull() ) { - aLabel = localTool->ShapeTool()->FindShape( aShape, Standard_True ); + TopoDS_Shape aShape = DBRep::Get (argv[2]); + if (!aShape.IsNull()) + { + aLabel = aColorTool->ShapeTool()->FindShape (aShape, Standard_True); } } - if ( aLabel.IsNull() ) { - di << " cannot find indicated label in document\n"; + if (aLabel.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " is not a label not shape\n"; return 1; } - if (localTool->IsVisible( aLabel) ) di << 1; - else di << 0; + + di << (aColorTool->IsVisible (aLabel) ? 1 : 0); return 0; } static Standard_Integer getStyledVisibility (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc<3) { - di<<"Use: "<Main()); - TopoDS_Shape aShape; - aShape = DBRep::Get(argv[2]); - if (localTool->IsInstanceVisible( aShape) ) di << 1; - else di << 0; + + Handle(TDocStd_Document) aDoc; + DDocStd::GetDocument (argv[1], aDoc); + TopoDS_Shape aShape = DBRep::Get(argv[2]); + if (aDoc.IsNull()) + { + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; + } + if (aShape.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " is not a shape\n"; + return 1; + } + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + di << (aColorTool->IsInstanceVisible (aShape) ? 1 : 0); return 0; } static Standard_Integer getStyledcolor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { - if (argc<3) { - di<<"Use: "<Main()); - if (localTool->GetInstanceColor( aShape, type, col) ) + Handle(TDocStd_Document) aDoc; + XCAFDoc_ColorType aColType = XCAFDoc_ColorGen; + DDocStd::GetDocument (argv[1], aDoc); + TopoDS_Shape aShape = DBRep::Get (argv[2]); + if (aDoc.IsNull()) { - if ((1 - col.Alpha()) < Precision::Confusion()) - di << col.GetRGB().StringName(col.GetRGB().Name()); + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; + } + if (aShape.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " is not a shape\n"; + return 1; + } + if (argc > 3 && !parseXDocColorType (argv[3], aColType)) + { + std::cout << "Syntax error: unknown color type '" << argv[3] << "'\n"; + return 1; + } + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + Quantity_ColorRGBA aColor; + if (aColorTool->GetInstanceColor (aShape, aColType, aColor)) + { + if ((1.0 - aColor.Alpha()) < Precision::Confusion()) + { + di << aColor.GetRGB().StringName (aColor.GetRGB().Name()); + } else - di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")"; + { + di << aColor.GetRGB().StringName (aColor.GetRGB().Name()) << " (" << aColor.Alpha() << ")"; + } } return 0; } -static Standard_Integer setStyledcolor (Draw_Interpretor& di, Standard_Integer argc, const char** argv) +static Standard_Integer setStyledcolor (Draw_Interpretor& , 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, ctype, aColRGBA)) + Handle(TDocStd_Document) aDoc; + DDocStd::GetDocument (argv[1], aDoc); + if (aDoc.IsNull()) { - di << "cannot set color for the indicated component\n"; + std::cout << "Syntax error: " << argv[1] << " is not a document\n"; + return 1; + } + + TopoDS_Shape aShape = DBRep::Get (argv[2]); + if (aShape.IsNull()) + { + std::cout << "Syntax error: " << argv[2] << " is not a shape\n"; + return 1; + } + + XCAFDoc_ColorType aColorType = XCAFDoc_ColorGen; + Quantity_ColorRGBA aColRGBA; + for (Standard_Integer anArgIter = 3; anArgIter < argc; ++anArgIter) + { + if (parseXDocColorType (argv[anArgIter], aColorType)) + { + // + } + else + { + Standard_Integer aNbParsed = ViewerTest::ParseColor (argc - anArgIter, + argv + anArgIter, + aColRGBA); + if (aNbParsed == 0) + { + std::cout << "Syntax error at '" << argv[anArgIter] << "'\n"; + return 1; + } + anArgIter += aNbParsed - 1; + } + } + + Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (aDoc->Main()); + if (!aColorTool->SetInstanceColor (aShape, aColorType, aColRGBA)) + { + std::cout << "Error: cannot set color for the indicated component\n"; return 1; } return 0; @@ -415,30 +639,38 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di) //===================================== Standard_CString g = "XDE color's commands"; - - di.Add ("XSetColor","Doc {Label|Shape} R G B [alpha] [c|s]\t: Set color [R G B] to shape given by Label, " + + di.Add ("XSetColor","Doc {Label|Shape} R G B [alpha] [{generic|surface|curve}=gen]" + "\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); - di.Add ("XGetColor","Doc label \t: Return color defined on label in colortable", + di.Add ("XGetColor","Doc label" + "\t: Return color defined on label in colortable", __FILE__, getColor, g); - di.Add ("XGetShapeColor","Doc Label ColorType \t: Returns color defined by label", + di.Add ("XGetShapeColor","Doc Label {generic|surface|curve}" + "\t: Returns color defined by label", __FILE__, getShapeColor, g); - - di.Add ("XGetAllColors","Doc \t: Print all colors that defined in document", + + di.Add ("XGetAllColors","Doc" + "\t: Print all colors that defined in document", __FILE__, getAllColors, g); - di.Add ("XAddColor","Doc R G B [alpha]\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", + di.Add ("XRemoveColor","Doc Label" + "\t: Remove color in document from color table", __FILE__, removeColor, g); - di.Add ("XFindColor","Doc R G B [alpha]\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 ", + di.Add ("XUnsetColor","Doc {Label|Shape} {generic|surface|curve}" + "\t: Unset color", __FILE__, unsetColor, g); di.Add ("XSetObjVisibility","Doc {Label|Shape} (0\1) \t: Set the visibility of shape ", @@ -450,10 +682,11 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di) di.Add ("XGetInstanceVisible","Doc Shape \t: Return the visibility of shape ", __FILE__, getStyledVisibility, g); - di.Add ("XGetInstanceColor","Doc Shape \t: Return the color of component shape ", + di.Add ("XGetInstanceColor","Doc Shape [{generic|surface|curve}=gen]" + "\t: Return the color of component shape", __FILE__, getStyledcolor, g); - di.Add ("XSetInstanceColor","Doc Shape R G B [alpha] type \t: sets color for component of shape if SHUO structure exists already ", + di.Add ("XSetInstanceColor","Doc Shape R G B [alpha] [{generic|surface|curve}=gen]" + "\t: sets color for component of shape if SHUO structure exists already", __FILE__, setStyledcolor, g); - }