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