a5f7c5e197dc8098dbffbaf5a2ca0ab4581bb499
[occt.git] / src / BRepTest / BRepTest_DraftAngleCommands.cxx
1 // Created on: 1995-02-22
2 // Created by: Jacques GOUSSARD
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 #include <BRepTest.hxx>
18 #include <DBRep.hxx>
19 #include <DrawTrSurf.hxx>
20 #include <Draw_Appli.hxx>
21 #include <Draw_Interpretor.hxx>
22
23 #include <BRepOffsetAPI_DraftAngle.hxx>
24 #include <BRepOffsetAPI_MakeDraft.hxx>
25 #include <TopoDS.hxx>
26 #include <TopoDS_Face.hxx>
27 #include <gp_Pln.hxx>
28 #include <gp_Dir.hxx>
29
30 static void Print(Draw_Interpretor& di,
31                   const Draft_ErrorStatus St)
32 {
33   di << "  Error Status : ";
34   switch (St) {
35   case Draft_NoError:
36     di << "No error";
37     break;
38
39   case Draft_FaceRecomputation:
40     di << "Impossible face recomputation";
41     break;
42
43   case Draft_EdgeRecomputation:
44     di << "Impossible edge recomputation";
45     break;
46
47   case Draft_VertexRecomputation:
48     di << "Impossible vertex recomputation";
49     break;
50
51   }
52 }
53
54 static Standard_Integer DEP(Draw_Interpretor& theCommands,
55                             Standard_Integer narg, const char** a)
56 {
57   if ((narg<14)||(narg%8 != 6)) return 1;
58   TopoDS_Shape V = DBRep::Get(a[2]);
59   BRepOffsetAPI_DraftAngle drft(V);
60
61   gp_Dir Dirextract(Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]));
62
63   TopoDS_Face F;
64   Standard_Real Angle;
65   gp_Pnt Pax;
66   gp_Dir Dax;
67   for (Standard_Integer ii = 0; ii < (narg-6)/8; ii++){
68     TopoDS_Shape aLocalShape(DBRep::Get(a[8*ii+6],TopAbs_FACE));
69     F = TopoDS::Face(aLocalShape);
70 //    F = TopoDS::Face(DBRep::Get(a[8*ii+6],TopAbs_FACE));
71     Angle = Draw::Atof(a[8*ii+7])*M_PI/180.;
72     Pax.SetCoord(Draw::Atof(a[8*ii+8]),Draw::Atof(a[8*ii+9]),Draw::Atof(a[8*ii+10]));
73     Dax.SetCoord(Draw::Atof(a[8*ii+11]),Draw::Atof(a[8*ii+12]),Draw::Atof(a[8*ii+13]));
74     drft.Add(F,Dirextract,Angle,gp_Pln(Pax,Dax));
75     if (!drft.AddDone()) {
76       break;
77     }
78   }
79
80   if (!drft.AddDone()) {
81     DBRep::Set("bugdep",drft.ProblematicShape());
82     theCommands << "Bad shape in variable bugdep ";
83     Print(theCommands,drft.Status());
84     return 1;
85   }
86   drft.Build();
87   if (drft.IsDone()) {
88     DBRep::Set(a[1],drft);
89     return 0;
90   }
91   DBRep::Set("bugdep",drft.ProblematicShape());
92   theCommands << "Problem encountered during the reconstruction : ";
93   theCommands << "bad shape in variable bugdep; ";
94   Print(theCommands,drft.Status());
95   return 1;
96 }
97
98
99 static Standard_Integer NDEP(Draw_Interpretor& theCommands,
100                             Standard_Integer narg, const char** a)
101 {
102   if ((narg<15)||((narg)%9 != 6)) return 1;
103   TopoDS_Shape V = DBRep::Get(a[2]);
104   if ( V.IsNull()) {
105     //cout << a[2] << " is not a Shape" << endl;
106     theCommands << a[2] << " is not a Shape\n";
107     return 1;
108   }
109
110   BRepOffsetAPI_DraftAngle drft(V);
111
112   gp_Dir Dirextract(Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]));
113
114   TopoDS_Face F;
115   Standard_Real Angle;
116   gp_Pnt Pax;
117   gp_Dir Dax;
118   Standard_Boolean Flag;
119   for (Standard_Integer ii = 0; ii < (narg-6)/9; ii++){
120     TopoDS_Shape aLocalFace(DBRep::Get(a[9*ii+6],TopAbs_FACE));
121     F = TopoDS::Face(aLocalFace);
122 //    F = TopoDS::Face(DBRep::Get(a[9*ii+6],TopAbs_FACE));
123
124     if ( F.IsNull()) {
125       //cout << a[9*ii+6] << " is not a face" << endl;
126       theCommands << a[9*ii+6] << " is not a face\n";
127       return 1;
128     }
129
130 //#ifdef OCCT_DEBUG
131 //    Flag = Draw::Atof(a[9*ii+7]); // BUG?? Real -> Boolean ???
132 //#else
133     Flag = (Standard_Boolean ) Draw::Atof(a[9*ii+7]);
134 //#endif
135     Angle = Draw::Atof(a[9*ii+8])*M_PI/180.;
136     Pax.SetCoord(Draw::Atof(a[9*ii+9]),Draw::Atof(a[9*ii+10]),Draw::Atof(a[9*ii+11]));
137     Dax.SetCoord(Draw::Atof(a[9*ii+12]),Draw::Atof(a[9*ii+13]),Draw::Atof(a[9*ii+14]));
138     drft.Add(F,Dirextract,Angle,gp_Pln(Pax,Dax), Flag);
139     if (!drft.AddDone()) {
140       break;
141     }
142   }
143
144   if (!drft.AddDone()) {
145     DBRep::Set("bugdep",drft.ProblematicShape());
146     theCommands << "Bad shape in variable bugdep ";
147     Print(theCommands,drft.Status());
148     return 1;
149   }
150   drft.Build();
151   if (drft.IsDone()) {
152     DBRep::Set(a[1],drft);
153     return 0;
154   }
155   DBRep::Set("bugdep",drft.ProblematicShape());
156   theCommands << "Problem encountered during the reconstruction : ";
157   theCommands << "bad shape in variable bugdep; ";
158   Print(theCommands,drft.Status());
159   return 1;
160 }
161
162 static Standard_Integer draft (Draw_Interpretor& di,
163                                    Standard_Integer n, const char** a)
164 {
165   Standard_Integer Inside = -1;
166   Standard_Boolean Internal = Standard_False;
167   if (n < 8) return 1;
168
169   Standard_Real x, y ,z, teta;
170   TopoDS_Shape SInit = DBRep::Get(a[2]);//shape d'arret
171   
172   x = Draw::Atof(a[3]);   
173   y = Draw::Atof(a[4]);  // direction de depouille
174   z = Draw::Atof(a[5]);  
175   teta = Draw::Atof(a[6]); //angle de depouille (teta)
176
177   gp_Dir D(x,y,z);
178  
179
180
181   BRepOffsetAPI_MakeDraft MkDraft(SInit, D, teta);
182
183   if (n>8) {
184     Standard_Integer cur = 8;
185     if (!strcmp(a[cur],"-IN")) {
186      Inside = 1;
187      cur++;
188     }
189     else if (!strcmp(a[cur],"-OUT")) {
190       Inside = 0;
191      cur++; 
192     }
193
194     if (cur<n) {
195       if (!strcmp(a[cur],"-Ri")) {
196         MkDraft.SetOptions(BRepBuilderAPI_RightCorner);
197         cur++;
198       }
199       else if (!strcmp(a[cur],"-Ro")) {
200         MkDraft.SetOptions(BRepBuilderAPI_RoundCorner);
201         cur++;
202       }      
203     }
204     if (cur<n) {
205       if (!strcmp(a[cur],"-Internal")) {
206         Internal = Standard_True;
207         cur++;
208       }
209     }
210   }  
211
212   if (Internal) {
213     MkDraft.SetDraft(Internal);
214     di << "Internal Draft : \n";
215     //cout << "Internal Draft : " << endl;
216   }
217   else
218     di << "External Draft : \n";
219     //cout << "External Draft : " << endl;
220
221   TopoDS_Shape Stop = DBRep::Get(a[7]);//shape d'arret 
222   if (!Stop.IsNull()) {
223     Standard_Boolean KeepOutside = Standard_True;
224     if (Inside==0)  KeepOutside = Standard_False;
225     MkDraft.Perform(Stop,  KeepOutside);
226   }
227   else {
228     Handle(Geom_Surface) Surf = DrawTrSurf::GetSurface(a[7]); 
229     if (! Surf.IsNull()) { // surface d'arret
230       Standard_Boolean KeepInside = Standard_True;
231       if (Inside==1)  KeepInside = Standard_False;
232       MkDraft.Perform(Surf, KeepInside);
233     }
234     else {  // by Lenght
235       Standard_Real L = Draw::Atof(a[7]);
236       if (L > 1.e-7) {
237          MkDraft.Perform(L);
238       }
239       else  return 1;
240     }
241   }
242  
243   DBRep::Set(a[1], MkDraft.Shape());
244   DBRep::Set("DraftShell", MkDraft.Shell());
245
246   return 0;
247 }
248
249
250 //=======================================================================
251 //function : DraftAngleCommands
252 //purpose  : 
253 //=======================================================================
254
255 void  BRepTest::DraftAngleCommands(Draw_Interpretor& theCommands)
256 {
257   static Standard_Boolean done = Standard_False;
258   if (done) return;
259   done = Standard_True;
260
261   DBRep::BasicCommands(theCommands);
262
263   const char* g = "Draft angle modification commands";
264    
265   theCommands.Add("depouille", " Inclines faces of a shape, dep result shape dirx diry dirz face angle x y x dx dy dz [face angle...]",__FILE__,DEP,g);
266
267   theCommands.Add("ndepouille", " Inclines faces of a shape, dep result shape dirx diry dirz face 0/1 angle x y x dx dy dz [face 0/1 angle...]",__FILE__,NDEP,g);
268
269  theCommands.Add("draft"," Compute a draft surface along a shape, \n draft result shape dirx diry dirz  angle shape/surf/length [-IN/-OUT] [Ri/Ro] [-Internal]",
270                  __FILE__,draft,g);
271 }