69d613f7f317ddb4ee4574bc3565d3c7a23dbdaa
[occt.git] / src / QADraw / QADraw.cxx
1 // Created on: 2002-02-04
2 // Created by: QA Admin
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <QADraw.hxx>
17 #include <Draw_Interpretor.hxx>
18 #include <Image_AlienPixMap.hxx>
19 #include <V3d_View.hxx>
20 #include <ViewerTest.hxx>
21 #include <ViewerTest_EventManager.hxx>
22 #include <TColStd_StackOfInteger.hxx>
23 #include <TColStd_ListOfInteger.hxx>
24 #include <TColStd_ListIteratorOfListOfInteger.hxx>
25 #include <TColStd_HSequenceOfReal.hxx>
26 #include <AIS_InteractiveContext.hxx>
27 #include <Draw.hxx>
28 #include <Draw_Window.hxx>
29 #include <Draw_Viewer.hxx>
30 #include <Aspect_WindowDriver.hxx>
31 #include <stdio.h>
32 #include <Aspect_DisplayConnection.hxx>
33 #include <Graphic3d.hxx>
34 #include <Aspect_Window.hxx>
35
36 #if defined(_WIN32) || defined(__WIN32__)
37 #  include <windows.h>
38 #  include <io.h>
39 #else
40 #  include <unistd.h>
41 #endif
42
43 #include <Draw_PluginMacro.hxx>
44
45 Handle(TColStd_HSequenceOfReal) GetColorOfPixel (const Image_PixMap&    theImage,
46                                                  const Standard_Integer theCoordinateX,
47                                                  const Standard_Integer theCoordinateY,
48                                                  const Standard_Integer theRadius)
49 {
50   Handle(TColStd_HSequenceOfReal) aSeq = new TColStd_HSequenceOfReal();
51   if (theImage.IsEmpty()) {
52     std::cerr << "The image is null.\n";
53     return aSeq;
54   }
55   Standard_Integer aWidth   = (Standard_Integer )theImage.SizeX();
56   Standard_Integer anHeight = (Standard_Integer )theImage.SizeY();
57
58   Quantity_Color aColorTmp;
59   for (Standard_Integer anXIter = theCoordinateX - theRadius;
60        anXIter <= theCoordinateX + theRadius; ++anXIter)
61   {
62     if (anXIter < 0 || anXIter >= aWidth)
63     {
64       continue;
65     }
66     for (Standard_Integer anYIter = theCoordinateY - theRadius;
67          anYIter <= theCoordinateY + theRadius; ++anYIter)
68     {
69       if (anYIter < 0 || anYIter >= anHeight)
70       {
71         continue;
72       }
73       // Image_PixMap stores image upside-down in memory!
74       aColorTmp = theImage.PixelColor (anXIter, anYIter);
75       aSeq->Append (aColorTmp.Red());
76       aSeq->Append (aColorTmp.Green());
77       aSeq->Append (aColorTmp.Blue());
78     }
79   }
80   return aSeq;
81 }
82
83 static Standard_Integer QAAISGetPixelColor (Draw_Interpretor& theDi,
84                                             Standard_Integer  theArgsNb,
85                                             const char**      theArgs)
86 {
87   if (theArgsNb != 3 && theArgsNb != 6)
88   {
89     theDi << "Usage : " << theArgs[0] << " coordinate_X coordinate_Y [color_R color_G color_B]" << "\n";
90     return 1; // TCL_ERROR
91   }
92
93   Handle(V3d_View) aView3d = ViewerTest::CurrentView();
94   if (aView3d.IsNull())
95   {
96     theDi << "You must initialize AISViewer before this command.\n";
97     return 1; // TCL_ERROR
98   }
99
100   const Handle(Aspect_Window) anAISWindow = aView3d->Window();
101   Standard_Integer aWindowSizeX = 0;
102   Standard_Integer aWindowSizeY = 0;
103   anAISWindow->Size (aWindowSizeX, aWindowSizeY);
104
105   Standard_Integer anArgIter = 1;
106   const Standard_Integer aPickCoordX = Draw::Atoi (theArgs[anArgIter++]);
107   const Standard_Integer aPickCoordY = Draw::Atoi (theArgs[anArgIter++]);
108   const Standard_Integer aRadius = (theArgsNb == 3) ? 0 : 1;
109
110   Image_ColorRGBF aColorInput = {{ 0.0f, 0.0f, 0.0f }};
111   if (theArgsNb == 6)
112   {
113     aColorInput.r() = (Standard_ShortReal )Draw::Atof (theArgs[anArgIter++]);
114     aColorInput.g() = (Standard_ShortReal )Draw::Atof (theArgs[anArgIter++]);
115     aColorInput.b() = (Standard_ShortReal )Draw::Atof (theArgs[anArgIter++]);
116   }
117
118   Image_PixMap anImage;
119   aView3d->ToPixMap (anImage, aWindowSizeX, aWindowSizeY);
120   const Handle(TColStd_HSequenceOfReal) aSeq = GetColorOfPixel (anImage, aPickCoordX, aPickCoordY, aRadius);
121   cout << "Length = " << aSeq->Length() << endl;
122
123   Image_ColorRGBF aColorPicked = {{ 0.0f, 0.0f, 0.0f }};
124   Standard_Boolean isNotEqual = Standard_True;
125   for (Standard_Integer i = 1; i <= aSeq->Length(); i += 3)
126   {
127     aColorPicked.r() = (Standard_ShortReal )aSeq->Value (i + 0);
128     aColorPicked.g() = (Standard_ShortReal )aSeq->Value (i + 1);
129     aColorPicked.b() = (Standard_ShortReal )aSeq->Value (i + 2);
130
131     if (theArgsNb == 3 ||
132         ((Abs (aColorPicked.r() - aColorInput.r()) <= Precision::Confusion())
133       && (Abs (aColorPicked.g() - aColorInput.g()) <= Precision::Confusion())
134       && (Abs (aColorPicked.b() - aColorInput.b()) <= Precision::Confusion())))
135     {
136       isNotEqual = Standard_False;
137       break;
138     }
139   }
140
141   theDi << "RED :   " << aColorPicked.r() << " "
142         << "GREEN : " << aColorPicked.g() << " "
143         << "BLUE :  " << aColorPicked.b() << "\n";
144
145   if (theArgsNb == 6)
146   {
147     theDi << "User color: \n"
148           << "RED :   " << aColorInput.r() << " "
149           << "GREEN : " << aColorInput.g() << " "
150           << "BLUE :  " << aColorInput.b() << "\n";
151   }
152
153   if (isNotEqual)
154   {
155     theDi << "Faulty : colors are not equal.\n";
156     return 1; // TCL_ERROR
157   }
158   return 0;
159 }
160
161 //=======================================================================
162 #if ! defined(WNT)
163 extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
164 extern Handle(AIS_InteractiveContext)& TheAISContext();
165 #else
166 Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
167 Standard_EXPORT Handle(AIS_InteractiveContext)& TheAISContext();
168 #endif
169 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
170 #include <AIS_Trihedron.hxx>
171 #include <AIS_Axis.hxx>
172 #include <Geom_Line.hxx>
173 #include <AIS_Line.hxx>
174
175 //==============================================================================
176 // function : VTrihedronOrigins
177 // author   : ota
178 // purpose  : draws triheron axis origin lines.
179 // Draw arg : vtri_orig trihedron_name
180 //==============================================================================
181 static int VTrihedronOrigins(Draw_Interpretor& di,
182                               Standard_Integer argc,
183                               const char ** argv)
184 {
185   if(argc != 2){
186     di <<"Usage : vtri_orig tri_name"<<"\n";
187     return 1;
188   }
189
190   if(TheAISContext().IsNull()){
191     di<<"Make 'vinit' before this method call"<<"\n";
192     return 1;
193   }
194
195   //get trihedron from AIS map.
196   TCollection_AsciiString aName(argv[1]);
197   if(!GetMapOfAIS().IsBound2(aName)){
198     di<<"No object named '"<<argv[1]<<"'"<<"\n";
199     return 1;
200   }
201
202   Handle(AIS_Trihedron) aTrih =
203     Handle(AIS_Trihedron)::DownCast(GetMapOfAIS().Find2(aName));
204   if(aTrih.IsNull()){
205     di<<"Trihedron is not found, try another name"<<"\n";
206     return 1;
207   }
208
209   //get axis
210   Handle(AIS_Axis) XAxis = aTrih->XAxis();
211   Handle(AIS_Axis) YAxis = aTrih->YAxis();
212   Handle(AIS_Axis) ZAxis = aTrih->Axis();
213
214   //get geometrical lines
215   Handle(Geom_Line) XGLine = XAxis->Component();
216   Handle(Geom_Line) YGLine = YAxis->Component();
217   Handle(Geom_Line) ZGLine = ZAxis->Component();
218
219   //make AIS_Lines
220   Handle(AIS_Line) XLine = new AIS_Line(XGLine);
221   Handle(AIS_Line) YLine = new AIS_Line(YGLine);
222   Handle(AIS_Line) ZLine = new AIS_Line(ZGLine);
223
224   //put them into AIS map:
225   GetMapOfAIS().Bind(XLine,aName+"_X");
226   GetMapOfAIS().Bind(YLine,aName+"_Y");
227   GetMapOfAIS().Bind(ZLine,aName+"_Z");
228   //print names of created objects:
229   di<<argv[1]<<"_X  "<<argv[1]<<"_Y  "<<argv[1]<<"_Z"<<"\n";
230
231   //try to draw them:
232   TheAISContext()->Display(XLine);
233   TheAISContext()->Display(YLine);
234   TheAISContext()->Display(ZLine);
235
236   return 0;
237 }
238
239 void QADraw::CommonCommands(Draw_Interpretor& theCommands)
240 {
241   const char* group = "QA_Commands";
242
243   theCommands.Add("QAGetPixelColor", "QAGetPixelColor coordinate_X coordinate_Y [color_R color_G color_B]", __FILE__,QAAISGetPixelColor, group);
244   theCommands.Add("vtri_orig",
245                   "vtri_orig         : vtri_orig trihedron_name  -  draws axis origin lines",
246                   __FILE__,VTrihedronOrigins,group);
247
248 // adding commands "rename" leads to the fact that QA commands doesn't work properly OCC23410, use function "renamevar"
249 // theCommands.Add("rename","rename name1 toname1 name2 toname2 ...",__FILE__,QArename,group);
250 }
251
252 //==============================================================================
253 // QADraw::Factory
254 //==============================================================================
255 void QADraw::Factory(Draw_Interpretor& theCommands)
256 {
257   // definition of QA Command
258   QADraw::CommonCommands(theCommands);
259   QADraw::AdditionalCommands(theCommands);
260 }
261
262 // Declare entry point PLUGINFACTORY
263 DPLUGIN(QADraw)