7090e70047b7fc371bc10c1aa6439f0ac426b60a
[occt.git] / src / BRepTest / BRepTest_ChamferCommands.cxx
1 // Created on: 1995-09-25
2 // Created by: Stagiaire Flore Lautheanne
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
9 // under the terms of the GNU Lesser General Public 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 #ifdef HAVE_CONFIG_H
18 # include <config.h>
19 #endif
20
21 #include <Draw_Interpretor.hxx>
22 #include <BRepTest.hxx>
23 #include <Draw.hxx>
24 #include <DBRep.hxx>
25 #include <BRepFilletAPI_MakeChamfer.hxx>
26 #include <TopAbs_ShapeEnum.hxx>
27 #include <TopoDS.hxx>
28 #include <TopoDS_Face.hxx>
29 #include <TopoDS_Edge.hxx>
30 #include <TopoDS_Vertex.hxx>
31 #include <TopoDS_Shape.hxx>
32
33 #include <Precision.hxx>
34 #ifdef HAVE_STRINGS_H
35 # include <strings.h>
36 #endif
37
38
39
40 //=========================================================================
41 // function : chamfer
42 // purpose  : command to construct chamfers on several edges
43 //            Here the chamfer is propagated on tangential edges to the 
44 //            required edge
45 //=========================================================================
46  
47 static Standard_Integer chamfer(Draw_Interpretor& di,
48                                 Standard_Integer narg, 
49                                 const char** a)
50      
51 {
52   // check the argument number of the command
53   if (narg == 1) {
54     //cout <<" help for chamf : "<< endl;
55     //cout <<"   Construction by equal distances from edge          :  chamf newname shape edge face S dist"<< endl;
56     //cout <<"   Construction by two distances from edge            :  chamf newname shape edge face dist1 dist2"<< endl;
57     //cout <<"   Construction by distance from edge and given angle :  chamf newname shape edge face A dist angle"<< endl;
58     di <<" help for chamf : "<< "\n";
59     di <<"   Construction by equal distances from edge          :  chamf newname shape edge face S dist"<< "\n";
60     di <<"   Construction by two distances from edge            :  chamf newname shape edge face dist1 dist2"<< "\n";
61     di <<"   Construction by distance from edge and given angle :  chamf newname shape edge face A dist angle"<< "\n";
62   }
63   else {
64     if (narg < 7) return 1;
65   
66     TopoDS_Shape S = DBRep::Get(a[2]);
67     if (S.IsNull()) return 1;
68
69     TopoDS_Edge E;
70     TopoDS_Face F;
71     Standard_Real d1,d2, angle;
72     Standard_Integer i      = 3;
73     Standard_Integer Method = 1;
74     Standard_Integer NbArg  = 3;
75
76     BRepFilletAPI_MakeChamfer aMCh(S);
77
78     if (!strcasecmp(a[i + 2], "S") ) Method = 0;
79
80     if (Method != 0) {
81       if (!strcasecmp(a[i + 2], "A")) {
82         Method = 2;
83         NbArg++;
84       }
85     }
86
87     while (i + NbArg < narg) {
88       TopoDS_Shape aLocalEdge(DBRep::Get(a[i], TopAbs_EDGE));
89       E = TopoDS::Edge(aLocalEdge);
90       TopoDS_Shape aLocalFace(DBRep::Get(a[i + 1], TopAbs_FACE));
91       F = TopoDS::Face(aLocalFace);
92 //      E = TopoDS::Edge(DBRep::Get(a[i], TopAbs_EDGE));
93 //      F = TopoDS::Face(DBRep::Get(a[i + 1], TopAbs_FACE));
94       if (Method == 0) {
95         if (!E.IsNull() && !F.IsNull() && (aMCh.Contour(E) == 0) )  {
96           d1 = Draw::Atof(a[i + 3]);
97
98           if ( d1 > Precision::Confusion()) 
99             aMCh.Add(d1,E ,F);
100         }
101         i += 4;
102       }
103       else if (Method == 1) {
104         if (!E.IsNull() && !F.IsNull() && (aMCh.Contour(E) == 0) )  {
105           d1 = Draw::Atof(a[i + 2]);
106           d2 = Draw::Atof(a[i + 3]);
107       
108           if (   (d1 > Precision::Confusion())
109               && (d2 > Precision::Confusion()) )
110             aMCh.Add(d1,d2,E,F);
111         }
112         i += 4;
113       }
114       else {
115         if (!E.IsNull() && !F.IsNull() && (aMCh.Contour(E) == 0) )  {
116           d1     = Draw::Atof(a[i + 3]);
117           angle  = Draw::Atof(a[i + 4]);
118           angle *= M_PI / 180.;
119       
120           if (   (d1 > Precision::Confusion())
121               && (angle > Precision::Confusion())
122               && (M_PI /  2.-  angle > Precision::Confusion()) )
123             aMCh.AddDA(d1, angle, E, F);
124         }
125         i += 5;
126       }
127
128       if ( i < narg) {
129         Method = 1;
130         NbArg  = 3;
131         if (!strcasecmp(a[i + 2], "S") ) Method = 0;
132
133         if (Method != 0) {
134           if (!strcasecmp(a[i + 2], "A")) {
135             Method = 2;
136             NbArg++;
137           }
138         }
139
140       }
141     }
142
143     // compute the chamfer and display the result
144     if (aMCh.NbContours() == 0 )
145       {
146         //cout<<"No suitable edges to chamfer"<<endl;
147         di<<"No suitable edges to chamfer"<<"\n";
148         return 1;
149       }
150     else aMCh.Build();
151
152     if (aMCh.IsDone()){
153       DBRep::Set(a[1],aMCh);
154       return 0;
155     }
156     else {
157       //cout<<"compute of chamfer failed"<<endl;
158       di<<"compute of chamfer failed"<<"\n";
159       return 1;
160     }
161   }
162       return 0;
163
164 }
165
166
167
168 //=======================================================================
169 //function : ChamferCommands
170 //purpose  : 
171 //=======================================================================
172
173 void  BRepTest::ChamferCommands(Draw_Interpretor& theCommands)
174 {
175   static Standard_Boolean done = Standard_False;
176   if (done) return;
177   done = Standard_True;
178
179   DBRep::BasicCommands(theCommands);
180
181   const char* g = "TOPOLOGY Fillet construction commands";
182
183 //  theCommands.Add("chamf",
184 //                "chamf newname shape edge1 face1 dist1_1 dist1_2 edge2 face2 dist2_1 dist2_2 ... ",__FILE__,chamfer,g);
185
186   theCommands.Add("chamf",
187                   "for help call chamf without arguments",__FILE__,chamfer,g);
188
189 }