cd69e3d7dbcf2dac82b01cef8aa3196c037f8993
[occt.git] / src / HLRTest / HLRTest.cxx
1 // Created on: 1995-04-05
2 // Created by: Christophe MARION
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <DBRep.hxx>
19 #include <Draw.hxx>
20 #include <Draw_Appli.hxx>
21 #include <gp_Ax3.hxx>
22 #include <HLRAlgo_Projector.hxx>
23 #include <HLRAppli_ReflectLines.hxx>
24 #include <HLRBRep_Algo.hxx>
25 #include <HLRBRep_HLRToShape.hxx>
26 #include <HLRTest.hxx>
27 #include <HLRTest_OutLiner.hxx>
28 #include <HLRTest_Projector.hxx>
29 #include <HLRTopoBRep_OutLiner.hxx>
30 #include <TColStd_ListIteratorOfListOfInteger.hxx>
31 #include <TopoDS_Shape.hxx>
32
33 static Handle(HLRBRep_Algo) hider;
34 #ifdef _WIN32
35 Standard_IMPORT Draw_Viewer dout;
36 #endif
37
38 #include <BRepTopAdaptor_MapOfShapeTool.hxx>
39
40 //=======================================================================
41 //function : Set
42 //purpose  : 
43 //=======================================================================
44 void HLRTest::Set (const Standard_CString Name,
45                    const HLRAlgo_Projector& P)
46 {
47   Draw::Set(Name,new HLRTest_Projector(P));
48 }
49
50 //=======================================================================
51 //function : GetProjector
52 //purpose  : 
53 //=======================================================================
54 Standard_Boolean HLRTest::GetProjector (Standard_CString& Name,
55                                         HLRAlgo_Projector& P)
56 {
57   Handle(HLRTest_Projector) HP = 
58     Handle(HLRTest_Projector)::DownCast(Draw::Get(Name));
59   if (HP.IsNull()) return Standard_False;
60   P = HP->Projector();
61   return Standard_True;
62   
63 }
64
65 //=======================================================================
66 //function : Set
67 //purpose  : 
68 //=======================================================================
69
70 void HLRTest::Set (const Standard_CString Name,
71                    const TopoDS_Shape& S)
72 {
73   Draw::Set(Name,new HLRTest_OutLiner(S));
74 }
75
76 //=======================================================================
77 //function : GetOutLiner
78 //purpose  : 
79 //=======================================================================
80 Handle(HLRTopoBRep_OutLiner) HLRTest::GetOutLiner (Standard_CString& Name)
81 {
82   Handle(Draw_Drawable3D) D = Draw::Get(Name);
83   Handle(HLRTest_OutLiner) HS = Handle(HLRTest_OutLiner)::DownCast(D);
84   if (!HS.IsNull()) return HS->OutLiner();
85   Handle(HLRTopoBRep_OutLiner) HO;
86   return HO;
87 }
88
89 //=======================================================================
90 //function : hprj
91 //purpose  : 
92 //=======================================================================
93
94 static Standard_Integer
95 hprj (Draw_Interpretor& , Standard_Integer n, const char** a)
96 {
97   if (n < 2) return 1;
98   //
99   gp_Ax2 anAx2 = gp::XOY();
100   if (n == 11)
101   {
102     Standard_Real x = Draw::Atof(a[2]);
103     Standard_Real y = Draw::Atof(a[3]);
104     Standard_Real z = Draw::Atof(a[4]);
105
106     Standard_Real dx = Draw::Atof(a[5]);
107     Standard_Real dy = Draw::Atof(a[6]);
108     Standard_Real dz = Draw::Atof(a[7]);
109
110     Standard_Real dx1 = Draw::Atof(a[8]);
111     Standard_Real dy1 = Draw::Atof(a[9]);
112     Standard_Real dz1 = Draw::Atof(a[10]);
113
114     gp_Pnt anOrigin (x, y, z);
115     gp_Dir aNormal  (dx, dy, dz);
116     gp_Dir aDX      (dx1, dy1, dz1);
117     anAx2 = gp_Ax2(anOrigin, aNormal, aDX);
118   }
119   
120   HLRAlgo_Projector P(anAx2);
121   HLRTest::Set(a[1],P);
122   return 0;
123 }
124
125 //=======================================================================
126 //function : hout
127 //purpose  : 
128 //=======================================================================
129
130 static Standard_Integer
131 hout (Draw_Interpretor& di, Standard_Integer n, const char** a)
132 {
133   if (n < 2) return 1;
134   const char *name = a[2];
135   TopoDS_Shape S = DBRep::Get(name);
136   if (S.IsNull()) {
137     di << name << " is not a shape.\n";
138     return 1;
139   }
140   HLRTest::Set(a[1],S);
141   return 0;
142 }
143
144 //=======================================================================
145 //function : hfil
146 //purpose  : 
147 //=======================================================================
148
149 static Standard_Integer
150 hfil (Draw_Interpretor& di, Standard_Integer n, const char** a)
151 {
152   Standard_Integer nbIso = 0;
153   if (n < 3) return 1;
154   if (n > 3) nbIso = Draw::Atoi(a[3]);
155   const char *name1 = a[1];
156   Handle(HLRTopoBRep_OutLiner) HS = HLRTest::GetOutLiner(name1);
157   if (HS.IsNull()) {
158     di << name1 << " is not an OutLiner.\n";
159     return 1;
160   }
161   const char *name2 = a[2];
162   HLRAlgo_Projector P;
163   if (!HLRTest::GetProjector(name2,P)) {
164     di << name2 << " is not a projector.\n";
165     return 1;
166   }
167   BRepTopAdaptor_MapOfShapeTool MST;
168   HS->Fill(P,MST,nbIso);
169   return 0;
170 }
171
172 //=======================================================================
173 //function : sori
174 //purpose  : 
175 //=======================================================================
176
177 static Standard_Integer
178 sori (Draw_Interpretor& di, Standard_Integer n, const char** a)
179 {
180   if (n < 3) return 1;
181   const char *name1 = a[1];
182   const char *name2 = a[2];
183   Handle(HLRTopoBRep_OutLiner) HS = HLRTest::GetOutLiner(name2);
184   if (HS.IsNull()) {
185     di << name2 << " is not an OutLiner.\n";
186     return 1;
187   }
188   DBRep::Set(name1,HS->OriginalShape());
189   return 0;
190 }
191
192 //=======================================================================
193 //function : sout
194 //purpose  : 
195 //=======================================================================
196
197 static Standard_Integer
198 sout (Draw_Interpretor& di, Standard_Integer n, const char** a)
199 {
200   if (n < 3) return 1;
201   const char *name1 = a[1];
202   const char *name2 = a[2];
203   Handle(HLRTopoBRep_OutLiner) HS = HLRTest::GetOutLiner(name2);
204   if (HS.IsNull()) {
205     di << name2 << " is not an OutLiner.\n";
206     return 1;
207   }
208   if (HS->OutLinedShape().IsNull()) {
209     di << name2 << " has no OutLinedShape.\n";
210     return 1;
211   }
212   DBRep::Set(name1,HS->OutLinedShape());
213   return 0;
214 }
215
216 //=======================================================================
217 //function : hloa
218 //purpose  : 
219 //=======================================================================
220
221 static Standard_Integer
222 hloa (Draw_Interpretor& di, Standard_Integer n, const char** a)
223 {
224   if (n < 2) return 1;
225   const char *name1 = a[1];
226   Handle(HLRTopoBRep_OutLiner) HS = HLRTest::GetOutLiner(name1);
227   if (HS.IsNull()) {
228     di << name1 << " is not an OutLiner.\n";
229     return 1;
230   }
231   hider->Load(HS);
232   return 0;
233 }
234
235 //=======================================================================
236 //function : hrem
237 //purpose  : 
238 //=======================================================================
239
240 static Standard_Integer
241 hrem (Draw_Interpretor& di, Standard_Integer n, const char** a)
242 {
243   if (n > 1) {
244     const char *name = a[1];
245     Standard_Integer index;
246     Handle(HLRTopoBRep_OutLiner) HS = HLRTest::GetOutLiner(name);
247     if (HS.IsNull()) {
248       TopoDS_Shape S = DBRep::Get(name);
249       if (S.IsNull()) {
250         di << name << " is not an OutLiner and not a shape.\n";
251         return 1;
252       }
253       else {
254         index = hider->Index(S);
255         if (index == 0) {
256           di << name << " not loaded shape.\n";
257           return 1;
258         }
259       }
260     }
261     else {
262       index = hider->Index(HS->OriginalShape());
263       if (index == 0) {
264         di << name << " not loaded outliner.\n";
265         return 1;
266       }
267     }
268     hider->Remove(index);
269     di << name << " removed\n";
270   }
271   else {
272     while (hider->NbShapes() > 0) {
273       hider->Remove(1);
274     }
275     di << " all shapes removed\n";
276   }
277   return 0;
278 }
279
280 //=======================================================================
281 //function : sprj
282 //purpose  : 
283 //=======================================================================
284
285 static Standard_Integer
286 sprj (Draw_Interpretor& di, Standard_Integer n, const char** a)
287 {
288   if (n < 2) return 1;
289   const char *name = a[1];
290   HLRAlgo_Projector P;
291   if (!HLRTest::GetProjector(name,P)) {
292     di << name << " is not a projector.\n";
293     return 1;
294   }
295   hider->Projector(P);
296   return 0;
297 }
298
299 //=======================================================================
300 //function : upda
301 //purpose  : 
302 //=======================================================================
303
304 static Standard_Integer
305 upda (Draw_Interpretor& , Standard_Integer, const char**)
306 {
307   hider->Update();
308   return 0;
309 }
310
311 //=======================================================================
312 //function : hide
313 //purpose  : 
314 //=======================================================================
315
316 static Standard_Integer
317 hide (Draw_Interpretor& , Standard_Integer, const char**)
318 {
319   hider->Hide();
320   return 0;
321 }
322
323 //=======================================================================
324 //function : show
325 //purpose  : 
326 //=======================================================================
327
328 static Standard_Integer
329 show (Draw_Interpretor& , Standard_Integer, const char**)
330 {
331   hider->ShowAll();
332   return 0;
333 }
334
335 //=======================================================================
336 //function : hdbg
337 //purpose  : 
338 //=======================================================================
339
340 static Standard_Integer
341 hdbg (Draw_Interpretor& di, Standard_Integer, const char**)
342 {
343   hider->Debug(!hider->Debug());
344   if (hider->Debug())
345     di << "debug\n";
346   else
347     di << "no debug\n";
348   return 0;
349 }
350
351 //=======================================================================
352 //function : hnul
353 //purpose  : 
354 //=======================================================================
355
356 static Standard_Integer
357 hnul (Draw_Interpretor& , Standard_Integer, const char**)
358 {
359   hider->OutLinedShapeNullify();
360   return 0;
361 }
362
363 //=======================================================================
364 //function : hres
365 //purpose  : 
366 //=======================================================================
367
368 static Standard_Integer
369 hres (Draw_Interpretor& , Standard_Integer n, const char** a)
370 {
371   TopoDS_Shape S,V,V1,VN,VO,VI,H,H1,HN,HO,HI;
372   if (n > 1) {
373     const char *name = a[1];
374     S = DBRep::Get(name);
375   }
376   HLRBRep_HLRToShape HS(hider);
377
378   if (S.IsNull()) {
379     V  = HS.VCompound();
380     V1 = HS.Rg1LineVCompound();
381     VN = HS.RgNLineVCompound();
382     VO = HS.OutLineVCompound();
383     VI = HS.IsoLineVCompound();
384     H  = HS.HCompound();
385     H1 = HS.Rg1LineHCompound();
386     HN = HS.RgNLineHCompound();
387     HO = HS.OutLineHCompound();
388     HI = HS.IsoLineHCompound();
389   }
390   else {
391     V  = HS.VCompound(S);
392     V1 = HS.Rg1LineVCompound(S);
393     VN = HS.RgNLineVCompound(S);
394     VO = HS.OutLineVCompound(S);
395     VI = HS.IsoLineVCompound(S);
396     H  = HS.HCompound(S);
397     H1 = HS.Rg1LineHCompound(S);
398     HN = HS.RgNLineHCompound(S);
399     HO = HS.OutLineHCompound(S);
400     HI = HS.IsoLineHCompound(S);
401   }
402   if (!V .IsNull()) DBRep::Set("vl",V);
403   if (!V1.IsNull()) DBRep::Set("v1l",V1);
404   if (!VN.IsNull()) DBRep::Set("vnl",VN);
405   if (!VO.IsNull()) DBRep::Set("vol",VO);
406   if (!VI.IsNull()) DBRep::Set("vil",VI);
407   if (!H .IsNull()) DBRep::Set("hl",H);
408   if (!H1.IsNull()) DBRep::Set("h1l",H1);
409   if (!HN.IsNull()) DBRep::Set("hnl",HN);
410   if (!HO.IsNull()) DBRep::Set("hol",HO);
411   if (!HI.IsNull()) DBRep::Set("hil",HI);
412   return 0;
413 }
414
415 //=======================================================================
416 //function : reflectlines
417 //purpose  : 
418 //=======================================================================
419
420 static Standard_Integer reflectlines(Draw_Interpretor& , Standard_Integer n, const char** a)
421 {
422   if (n < 6)
423     return 1;
424
425   TopoDS_Shape aShape =  DBRep::Get(a[2]);
426   if (aShape.IsNull())
427     return 1;
428
429   Standard_Real anAISViewProjX = atof(a[3]);
430   Standard_Real anAISViewProjY = atof(a[4]);
431   Standard_Real anAISViewProjZ = atof(a[5]);
432   
433   gp_Pnt anOrigin(0.,0.,0.);
434   gp_Dir aNormal(anAISViewProjX, anAISViewProjY, anAISViewProjZ);
435   gp_Ax2 theAxes(anOrigin, aNormal);
436   gp_Dir aDX = theAxes.XDirection();
437
438   HLRAppli_ReflectLines Reflector(aShape);
439
440   Reflector.SetAxes(aNormal.X(), aNormal.Y(), aNormal.Z(),
441                     anOrigin.X(), anOrigin.Y(), anOrigin.Z(),
442                     aDX.X(), aDX.Y(), aDX.Z());
443
444   Reflector.Perform();
445
446   TopoDS_Shape Result = Reflector.GetResult();
447   DBRep::Set(a[1], Result);
448
449   return 0;
450 }
451
452 //=======================================================================
453 //function : Commands
454 //purpose  : 
455 //=======================================================================
456
457 void HLRTest::Commands (Draw_Interpretor& theCommands)
458 {
459   const char* g = "ADVALGOS HLR Commands";
460
461   theCommands.Add("hprj"     ,"hprj name [view-id = 1]"     ,__FILE__,hprj,g);
462   theCommands.Add("houtl"    ,"houtl name shape"            ,__FILE__,hout,g);
463   theCommands.Add("hfill"    ,"hfill name proj [nbIso]"     ,__FILE__,hfil,g);
464   theCommands.Add("hsin"     ,"hsin name outliner"          ,__FILE__,sori,g);
465   theCommands.Add("hsout"    ,"hsout name outliner"         ,__FILE__,sout,g);
466   theCommands.Add("hload"    ,"hload outliner"              ,__FILE__,hloa,g);
467   theCommands.Add("hremove"  ,"hremove [name]"              ,__FILE__,hrem,g);
468   theCommands.Add("hsetprj"  ,"hsetprj [name]"              ,__FILE__,sprj,g);
469   theCommands.Add("hupdate"  ,"hupdate"                     ,__FILE__,upda,g);
470   theCommands.Add("hhide"    ,"hhide"                       ,__FILE__,hide,g);
471   theCommands.Add("hshowall" ,"hshowall"                    ,__FILE__,show,g);
472   theCommands.Add("hdebug"   ,"hdebug"                      ,__FILE__,hdbg,g);
473   theCommands.Add("hnullify" ,"hnullify"                    ,__FILE__,hnul,g);
474   theCommands.Add("hres2d"   ,"hres2d"                      ,__FILE__,hres,g);
475
476   theCommands.Add("reflectlines",
477                   "reflectlines res shape proj_X proj_Y proj_Z",
478                   __FILE__, reflectlines, g);
479   
480   hider = new HLRBRep_Algo();
481 }
482
483 //=======================================================================
484 //function : save and restore projector
485 //purpose  : 
486 //=======================================================================
487
488 static Standard_Boolean stest(const Handle(Draw_Drawable3D)& d) 
489 {
490   return d->IsInstance(STANDARD_TYPE(HLRTest_Projector));
491 }
492
493 //=======================================================================
494 //function : ssave
495 //purpose  : 
496 //=======================================================================
497
498 static void ssave (const Handle(Draw_Drawable3D)&d, ostream& OS)
499 {
500   Handle(HLRTest_Projector) HP =
501     Handle(HLRTest_Projector)::DownCast(d);
502
503   const HLRAlgo_Projector& P = HP->Projector();
504   OS << (P.Perspective() ? "1" : "0") << "\n";
505   if (P.Perspective())
506     OS << P.Focus() << "\n";
507   
508   gp_Trsf T = P.Transformation();
509   gp_XYZ V = T.TranslationPart();
510   gp_Mat M = T.VectorialPart();
511
512   OS << M(1,1) << " ";
513   OS << M(1,2) << " ";
514   OS << M(1,3) << " ";
515   OS << V.Coord(1) << " ";
516   OS << "\n";
517   OS << M(2,1) << " ";
518   OS << M(2,2) << " ";
519   OS << M(2,3) << " ";
520   OS << V.Coord(2) << " ";
521   OS << "\n";
522   OS << M(3,1) << " ";
523   OS << M(3,2) << " ";
524   OS << M(3,3) << " ";
525   OS << V.Coord(3) << " ";
526   OS << "\n";
527
528 }
529
530 //=======================================================================
531 //function : srestore
532 //purpose  : 
533 //=======================================================================
534
535 static Handle(Draw_Drawable3D) srestore (istream& IS)
536 {
537   Standard_Boolean pers;
538   IS >> pers;
539   Standard_Real focus = 1;
540   if (pers) IS >> focus;
541   
542   gp_Trsf T;
543   Standard_Real V1[3],V2[3],V3[3];
544   Standard_Real V[3];
545
546   IS >> V1[0] >> V1[1] >> V1[2] >> V[0];
547   IS >> V2[0] >> V2[1] >> V2[2] >> V[1];
548   IS >> V3[0] >> V3[1] >> V3[2] >> V[2];
549
550   gp_Dir D1(V1[0],V1[1],V1[2]);
551   gp_Dir D2(V2[0],V2[1],V2[2]);
552   gp_Dir D3(V3[0],V3[1],V3[2]);
553   gp_Ax3 axes(gp_Pnt(0,0,0),D3,D1);
554   D3.Cross(D1);
555   if (D3.Dot(D2) < 0) axes.YReverse();
556   T.SetTransformation(axes);
557
558   T.SetTranslationPart(gp_Vec(V[0],V[1],V[2]));
559
560   HLRAlgo_Projector P(T,pers,focus);
561   Handle(HLRTest_Projector) HP = new HLRTest_Projector(P);
562   return HP;
563 }
564
565 //=======================================================================
566 //function : ssr
567 //purpose  : 
568 //=======================================================================
569
570 static Draw_SaveAndRestore ssr("HLRTest_Projector",stest,ssave,srestore);
571