0032079: Coding Rules - rename AIS_KindOfInteractive enumeration values with fully...
[occt.git] / src / QABugs / QABugs_1.cxx
1 // Created on: 2002-05-21
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 <QABugs.hxx>
17
18 #include <Draw_Interpretor.hxx>
19 #include <DBRep.hxx>
20 #include <DrawTrSurf.hxx>
21 #include <AIS_InteractiveContext.hxx>
22 #include <ViewerTest.hxx>
23 #include <AIS_Shape.hxx>
24 #include <TopoDS_Shape.hxx>
25
26 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
27 #include <TColStd_ListIteratorOfListOfInteger.hxx>
28 #include <TColStd_MapOfInteger.hxx>
29
30 #include <TDocStd_Document.hxx>
31 #include <TDocStd_Application.hxx>
32 #include <DDocStd.hxx>
33 #include <TDocStd_Owner.hxx>
34 #include <TDF_Label.hxx>
35 #include <DDF.hxx>
36 #include <TPrsStd_AISViewer.hxx>
37 #include <TPrsStd_AISPresentation.hxx>
38
39 #include <Draw_Viewer.hxx>
40 #include <Draw.hxx>
41
42 #ifndef _WIN32
43 extern Draw_Viewer dout;
44 #else
45 Standard_IMPORT Draw_Viewer dout;
46 #endif
47
48 #include <BRep_Builder.hxx>
49 #include <BRepTools.hxx>
50 #include <TopoDS_Wire.hxx>
51 #include <BRepBuilderAPI_MakeFace.hxx>
52 #include <TopoDS.hxx>
53
54 #if ! defined(_WIN32)
55 extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
56 #else
57 Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
58 #endif
59
60 #include <AIS_PlaneTrihedron.hxx>
61 #include <TopoDS_Face.hxx>
62 #include <TopExp_Explorer.hxx>
63 #include <TopoDS_Edge.hxx>
64 #include <BRepAdaptor_Curve.hxx>
65 #include <GC_MakePlane.hxx>
66
67 static Standard_Integer OCC159bug (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
68 {
69   if ( argc != 2) {
70     di << "ERROR : Usage : " << argv[0] << " Doc\n";
71     return 1;
72   }
73   
74   Handle(TDocStd_Document) D;    
75   if (!DDocStd::GetDocument(argv[1],D)) return 1; 
76
77   Standard_Integer DocRefCount1 = D->GetRefCount();
78   di << "DocRefCount1 = " << DocRefCount1 << "\n";
79
80   Handle(TDocStd_Owner) Owner;
81   if (!D->Main().Root().FindAttribute(TDocStd_Owner::GetID(),Owner)) return 1; 
82
83   Handle(TDocStd_Document) OwnerD1 = Owner->GetDocument();    
84   if (OwnerD1.IsNull()) {
85     di << "DocOwner1 = NULL\n";
86   } else {
87     di << "DocOwner1 = NOTNULL\n";
88   }
89   OwnerD1.Nullify();
90  
91   Handle(TDocStd_Application) A = DDocStd::GetApplication();
92   A->Close(D); 
93
94   if (Handle(Draw_Drawable3D) DD = Draw::GetExisting (argv[1]))
95   {
96     dout.RemoveDrawable (DD);
97   }
98
99   Handle(TDocStd_Document) OwnerD2 = Owner->GetDocument();    
100   if (OwnerD2.IsNull()) {
101     di << "DocOwner2 = NULL\n";
102   } else {
103     di << "DocOwner2 = NOTNULL\n";
104   }
105
106   Standard_Integer DocRefCount2 = D->GetRefCount();
107   di << "DocRefCount2 = " << DocRefCount2 << "\n";
108
109   return 0;
110 }
111
112 static Standard_Integer OCC145bug (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
113 {
114   if ( argc != 3) {
115     di << "ERROR : Usage : " << argv[0] << " Shape MaxNbr\n";
116     return 1;
117   }
118
119   TCollection_AsciiString aFileName = argv[1];
120   Standard_Integer aMaxNbr = Draw::Atoi(argv[2]);
121
122   BRep_Builder aBld;
123   TopoDS_Shape aShape;
124
125   if (!BRepTools::Read(aShape, aFileName.ToCString(), aBld)) {
126     di << "ERROR :Could not read a shape!!!\n";
127     return 1;
128   }
129
130   Standard_Integer i;
131   TopoDS_Wire      aWire   = TopoDS::Wire(aShape);
132   
133   for (i = 1; i <= aMaxNbr; i++) {
134     BRepBuilderAPI_MakeFace aMF(aWire);
135     if (!aMF.IsDone()) {
136       di << "ERROR : Could not make a face\n";
137       return 1;
138     }
139   }
140
141   return 0;
142 }
143
144 static Standard_Integer OCC73_SelectionMode (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
145 {
146   if ( argc < 3) {
147     di << "ERROR : Usage : " << argv[0] << " DOC entry [SelectionMode]\n";
148     return 1;
149   }
150
151   Handle(TDocStd_Document) D;
152   //std::cout << "OCC73_SelectionMode  1" << std::endl;
153   if (!DDocStd::GetDocument(argv[1],D)) return 1;  
154   TDF_Label L;
155   //std::cout << "OCC73_SelectionMode  2" << std::endl;
156   if (!DDF::FindLabel(D->GetData(),argv[2],L)) return 1;  
157
158   Handle(TPrsStd_AISViewer) viewer;
159   //std::cout << "OCC73_SelectionMode  3" << std::endl;
160   if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1;  
161
162   Handle(TPrsStd_AISPresentation) prs;
163   //std::cout << "OCC73_SelectionMode  4" << std::endl;
164   if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) {   
165     if( argc == 4 ) {
166       prs->SetSelectionMode((Standard_Integer)Draw::Atoi(argv[3]));
167       TPrsStd_AISViewer::Update(L);
168     }
169     else {
170       Standard_Integer SelectionMode = prs->SelectionMode();
171       //std::cout << "SelectionMode = " << SelectionMode << std::endl;
172       di<<SelectionMode;
173     }
174   }
175   //std::cout << "OCC73_SelectionMode  5" << std::endl;
176
177   return 0;
178 }
179
180 static Standard_Integer OCC10bug (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
181 {
182   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
183   if(aContext.IsNull()) { 
184     di << "use 'vinit' command before " << argv[0] << "\n";
185     return 1;
186   }
187
188   if(argc != 4) {
189     di << "Usage : " << argv[0] << " name plane Length\n";
190     return 1;
191   }
192
193   TopoDS_Shape S = DBRep::Get( argv[2] );
194   if ( S.IsNull() ) {
195     di << "Shape is empty\n";
196     return 1;
197   }
198
199   TCollection_AsciiString name(argv[1]);
200   Standard_Real Length = Draw::Atof(argv[3]);
201   
202   // Construction de l'AIS_PlaneTrihedron
203   Handle(AIS_PlaneTrihedron) theAISPlaneTri;
204
205   Standard_Boolean IsBound = GetMapOfAIS().IsBound2(name);
206   if (IsBound) {
207     // on recupere la shape dans la map des objets displayes
208     Handle(AIS_InteractiveObject) aShape = GetMapOfAIS().Find2(name);
209       
210     // On verifie que l'AIS InteraciveObject est bien 
211     // un AIS_PlaneTrihedron
212     if (aShape->Type() == AIS_KindOfInteractive_Datum
213      && aShape->Signature() == 4)
214     {
215       // On downcast aShape de AIS_InteractiveObject a AIS_PlaneTrihedron
216       theAISPlaneTri = Handle(AIS_PlaneTrihedron)::DownCast (aShape);
217
218       theAISPlaneTri->SetLength(Length);
219   
220       aContext->Redisplay(theAISPlaneTri, Standard_False);
221       aContext->UpdateCurrentViewer();
222     }
223   } else {
224     TopoDS_Face  FaceB=TopoDS::Face(S);
225   
226     // Construction du Plane
227     // recuperation des edges des faces.
228     TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
229   
230     TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
231     // declarations 
232     gp_Pnt A,B,C;
233   
234     // si il y a plusieurs edges
235     if (FaceExpB.More() ) {
236       FaceExpB.Next();
237       TopoDS_Edge EdgeC=TopoDS::Edge(FaceExpB.Current() );
238       BRepAdaptor_Curve theCurveB(EdgeB);
239       BRepAdaptor_Curve theCurveC(EdgeC);
240       A=theCurveC.Value(0.1);
241       B=theCurveC.Value(0.9);
242       C=theCurveB.Value(0.5);
243     }
244     else {
245       // FaceB a 1 unique edge courbe
246       BRepAdaptor_Curve theCurveB(EdgeB);
247       A=theCurveB.Value(0.1);
248       B=theCurveB.Value(0.9);
249       C=theCurveB.Value(0.5);
250     }
251     // Construction du Geom_Plane
252     GC_MakePlane MkPlane(A,B,C);
253     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
254     
255     // on le display & bind
256     theAISPlaneTri= new AIS_PlaneTrihedron(theGeomPlane );
257     
258     theAISPlaneTri->SetLength(Length);
259     
260     GetMapOfAIS().Bind ( theAISPlaneTri, name);
261     aContext->Display (theAISPlaneTri, Standard_True);
262   }
263
264   Standard_Real getLength = theAISPlaneTri->GetLength();
265   di << "Length = " << Length << "\n";
266   di << "getLength = " << getLength << "\n";
267
268   if (getLength == Length) {
269     di << "OCC10: OK\n";
270   } else {
271     di << "OCC10: ERROR\n";
272   }
273
274   return 0;
275 }
276
277 static Standard_Integer OCC74bug_set (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
278 {
279   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
280   if(aContext.IsNull()) { 
281     di << argv[0] << "ERROR : use 'vinit' command before \n";
282     return 1;
283   }
284
285   if ( argc != 3) {
286     di << "ERROR : Usage : " << argv[0] << " shape mode; set selection mode\n";
287     return 1;
288   }
289   
290   Standard_Boolean updateviewer = Standard_True;
291
292   ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
293   
294   TCollection_AsciiString aName(argv[1]);
295   Handle(AIS_InteractiveObject) AISObj;
296
297   Standard_Integer SelectMode = Draw::Atoi(argv[2]);
298   if (!aMap.Find2 (aName, AISObj)
299     || AISObj.IsNull())
300   {
301     di << "Use 'vdisplay' before\n";
302     return 1;
303   }
304
305   aContext->Erase(AISObj, updateviewer);
306   aContext->UpdateCurrentViewer();
307   aContext->SetAutoActivateSelection (Standard_False);
308   aContext->Display(AISObj, updateviewer);
309   aContext->Activate (AISObj, SelectMode);
310   aContext->UpdateCurrentViewer();
311   return 0;
312 }
313
314 static Standard_Integer OCC74bug_get (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
315 {
316   Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
317   if(aContext.IsNull()) { 
318     di << argv[0] << "ERROR : use 'vinit' command before \n";
319     return 1;
320   }
321
322   if ( argc != 2) {
323     di << "ERROR : Usage : " << argv[0] << " shape; get selection mode\n";
324     return 1;
325   }
326
327   ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
328   
329   TCollection_AsciiString aName(argv[1]);
330   Handle(AIS_InteractiveObject) AISObj;
331   if (!aMap.Find2(aName, AISObj)
332    || AISObj.IsNull())
333   {
334     di << "Use 'vdisplay' before\n";
335     return 1;
336   }
337
338   TColStd_ListOfInteger anActivatedModes;
339   aContext->ActivatedModes (AISObj, anActivatedModes);
340   Standard_Integer aMode = anActivatedModes.IsEmpty() ? -1 : anActivatedModes.Last();
341   di << aMode << "\n";
342   return 0;
343 }
344
345 #include <BRepPrimAPI_MakeBox.hxx>
346 #include <TDF_Data.hxx>
347 #include <TNaming_Builder.hxx>
348 #include <TNaming_NamedShape.hxx>
349 #include <AIS_InteractiveObject.hxx>
350
351 static Standard_Integer OCC361bug (Draw_Interpretor& di, Standard_Integer nb, const char ** a)
352 {
353   if ( nb != 2) {
354     di << "ERROR : Usage : " << a[0] << " Doc\n";
355     di << "-1\n";
356     return -1;
357   }
358
359   Handle(TDocStd_Document) D;    
360   if (!DDocStd::GetDocument(a[1],D)) {
361     di << "-2\n";
362     return 1;  
363   }
364
365   BRepPrimAPI_MakeBox aBox(gp_Pnt(0, 0, 0), 100, 100, 100);
366   TopoDS_Shape aTBox = aBox.Shape();
367   aTBox.Orientation(TopAbs_FORWARD);
368
369   TDF_Label aTestLabel = D->Main();
370   
371   TNaming_Builder aBuilder(aTestLabel);
372   aBuilder.Generated(aTBox);
373     
374   TopoDS_Shape aTBox1 = aTBox;
375   aTBox1.Orientation(TopAbs_REVERSED);
376   aTestLabel.ForgetAllAttributes();
377
378   TNaming_Builder aBuilder2(aTestLabel);
379   aBuilder2.Generated( aTBox1);
380
381   aTBox = aBuilder2.NamedShape()->Get();
382   if(aTBox.Orientation() != TopAbs_REVERSED) {
383     di << "1\n";
384   } else {
385     di << "0\n";
386   }
387   return 0;
388 }
389
390 #include <Graphic3d_Texture2Dmanual.hxx>
391 #include <Image_AlienPixMap.hxx>
392 #include <OSD_OpenFile.hxx>
393 #include <Prs3d_ShadingAspect.hxx>
394 #include <Standard_ArrayStreamBuffer.hxx>
395 //=======================================================================
396 //function : OCC30182
397 //purpose  : Testing different interfaces of Image_AlienPixMap::Load()
398 //=======================================================================
399 static Standard_Integer OCC30182 (Draw_Interpretor& , Standard_Integer theNbArgs, const char** theArgVec)
400 {
401   if (ViewerTest::CurrentView().IsNull())
402   {
403     std::cout << "Error: no active view\n";
404     return 1;
405   }
406
407   TCollection_AsciiString aPrsName, anImgPath;
408   Standard_Integer anOffset = 0;
409   Standard_Integer aSrc = 0; // 0 - file name, 1 - file stream, 2 - memory buffer
410   for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
411   {
412     TCollection_AsciiString anArg (theArgVec[anArgIter]);
413     anArg.LowerCase();
414     if (anArg == "-offset"
415      && anArgIter + 1 < theNbArgs)
416     {
417       anOffset = Draw::Atoi (theArgVec[++anArgIter]);
418     }
419     else if (anArg == "-filename")
420     {
421       aSrc = 0;
422     }
423     else if (anArg == "-stream")
424     {
425       aSrc = 1;
426     }
427     else if (anArg == "-mem"
428           || anArg == "-memory")
429     {
430       aSrc = 2;
431     }
432     else if (aPrsName.IsEmpty())
433     {
434       aPrsName = theArgVec[anArgIter];
435     }
436     else if (anImgPath.IsEmpty())
437     {
438       anImgPath = theArgVec[anArgIter];
439     }
440     else
441     {
442       std::cout << "Syntax error at '" << anArg << "'\n";
443       return 1;
444     }
445   }
446   if (anImgPath.IsEmpty())
447   {
448     std::cout << "Syntax error: wrong number of arguments\n";
449     return 1;
450   }
451
452   Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap();
453   if (aSrc == 0)
454   {
455     if (!anImage->Load (anImgPath))
456     {
457       return 0;
458     }
459   }
460   else
461   {
462     std::ifstream aFile;
463     OSD_OpenStream (aFile, anImgPath.ToCString(), std::ios::in | std::ios::binary);
464     if (!aFile.is_open())
465     {
466       std::cout << "Syntax error: image file '" << anImgPath << "' cannot be found\n";
467       return 1;
468     }
469     if (anOffset != 0)
470     {
471       aFile.seekg (anOffset);
472     }
473
474     if (aSrc == 2)
475     {
476       aFile.seekg (0, std::ios::end);
477       Standard_Integer aLen = (Standard_Integer )aFile.tellg() - anOffset;
478       aFile.seekg (anOffset);
479       if (aLen <= 0)
480       {
481         std::cout << "Syntax error: wrong offset\n";
482         return 1;
483       }
484       NCollection_Array1<Standard_Byte> aBuff (1, aLen);
485       if (!aFile.read ((char* )&aBuff.ChangeFirst(), aBuff.Size()))
486       {
487         std::cout << "Error: unable to read file\n";
488         return 1;
489       }
490       aFile.close();
491       if (!anImage->Load (&aBuff.ChangeFirst(), aBuff.Size(), anImgPath))
492       {
493         return 0;
494       }
495     }
496     else
497     {
498       if (!anImage->Load (aFile, anImgPath))
499       {
500         return 0;
501       }
502     }
503   }
504
505   TopoDS_Shape aShape = BRepPrimAPI_MakeBox (100.0 * anImage->Ratio(), 100.0, 1.0).Shape();
506   Handle(AIS_Shape) aPrs = new AIS_Shape (aShape);
507   aPrs->SetDisplayMode (AIS_Shaded);
508   aPrs->Attributes()->SetupOwnShadingAspect();
509   const Handle(Graphic3d_AspectFillArea3d)& anAspect = aPrs->Attributes()->ShadingAspect()->Aspect();
510   anAspect->SetShadingModel (Graphic3d_TOSM_UNLIT);
511   anAspect->SetTextureMapOn (true);
512   anAspect->SetTextureMap (new Graphic3d_Texture2Dmanual (anImage));
513   if (anImage->IsTopDown())
514   {
515     anAspect->TextureMap()->GetParams()->SetTranslation(Graphic3d_Vec2 (0.0f, -1.0f));
516     anAspect->TextureMap()->GetParams()->SetScale      (Graphic3d_Vec2 (1.0f, -1.0f));
517   }
518
519   ViewerTest::Display (aPrsName, aPrs, true, true);
520   return 0;
521 }
522
523 void QABugs::Commands_1(Draw_Interpretor& theCommands) {
524   const char *group = "QABugs";
525
526   theCommands.Add ("OCC159", "OCC159 Doc", __FILE__, OCC159bug, group);
527   theCommands.Add ("OCC145", "OCC145 Shape MaxNbr", __FILE__, OCC145bug, group);
528
529   theCommands.Add ("OCC73_SelectionMode", "OCC73_SelectionMode DOC entry [SelectionMode]", __FILE__, OCC73_SelectionMode, group);
530
531   theCommands.Add ("OCC10", "OCC10 Shape MaxNbr", __FILE__, OCC10bug, group);
532
533   theCommands.Add ("OCC74_set", "OCC74_set shape mode;   set selection mode", __FILE__, OCC74bug_set, group);
534   theCommands.Add ("OCC74_get", "OCC74_get shape;   get selection mode", __FILE__, OCC74bug_get, group);
535
536   theCommands.Add ("OCC361", "OCC361 Doc ", __FILE__, OCC361bug, group);
537   theCommands.Add ("OCC30182",
538                    "OCC30182 name image [-offset Start] [-fileName] [-stream] [-memory]\n"
539                    "Decodes image either by passing file name, file stream or memory stream", __FILE__, OCC30182, group);
540   return;
541 }