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); - }