0031445: Advanced wrappers, C# wrapper - provide device info in About dialog of WPF...
[occt.git] / samples / mfc / occtdemo / Validate / Validate_Presentation.cpp
CommitLineData
7fd59977 1// Validate_Presentation.cpp: implementation of the Validate_Presentation class.
2// Checking validity of shapes
3//////////////////////////////////////////////////////////////////////
4
5#include "stdafx.h"
6#include "Validate_Presentation.h"
7
8#include <BRep_Builder.hxx>
9#include <BRepTools.hxx>
10#include <BRepCheck_Analyzer.hxx>
11#include <BRepCheck_ListOfStatus.hxx>
12#include <BRepCheck_Result.hxx>
13#include <BRepCheck_ListIteratorOfListOfStatus.hxx>
14#include <TopAbs_ShapeEnum.hxx>
15#include <TopTools_SequenceOfShape.hxx>
16#include <TopTools_MapOfShape.hxx>
17#include <TopExp_Explorer.hxx>
18
19
20// Initialization of global variable with an instance of this class
21OCCDemo_Presentation* OCCDemo_Presentation::Current = new Validate_Presentation;
22
23// Initialization of array of samples
24Standard_CString Validate_Presentation::myFileNames[] =
25{
26 "wedge_ok.brep",
27 "wedge_bad.brep",
28 "shape2_bad.brep",
29 0
30};
31
32#ifdef WNT
33 #define EOL "\r\n"
34#else
35 #define EOL "\n"
36#endif
37
38//////////////////////////////////////////////////////////////////////
39// Construction/Destruction
40//////////////////////////////////////////////////////////////////////
41
42Validate_Presentation::Validate_Presentation()
43{
44 FitMode=true;
45 for (myNbSamples = 0; myFileNames[myNbSamples]; myNbSamples++)
46 ;
47 setName ("Checking validity of shapes");
48}
49
50//////////////////////////////////////////////////////////////////////
51// Sample execution
52//////////////////////////////////////////////////////////////////////
53
54void Validate_Presentation::DoSample()
55{
56 getAISContext()->EraseAll();
57 if (myIndex >=0 && myIndex < myNbSamples)
58 sample (myFileNames[myIndex]);
59}
60
61//////////////////////////////////////////////////////////////////////
62// Sample functions
63//////////////////////////////////////////////////////////////////////
64
65void Validate_Presentation::checkShape(const TopoDS_Shape& aShape)
66{
67 setResultTitle ("Validate shape");
68 TCollection_AsciiString aText;
69
70 aText = aText +
71 " // Input shape" EOL
72 " TopoDS_Shape aShape;" EOL
73 " // Initializing aShape" EOL
74 " // ...." EOL EOL
75
76 " // Checking" EOL
77 " BRepCheck_Analyzer aChecker(aShape);" EOL
78 " if (!aChecker.IsValid())" EOL
79 " {" EOL
80 " // Initialize sequence of subshapes" EOL
81 " TopTools_SequenceOfShape aShapes;" EOL
82 " TopTools_MapOfShape aMap;" EOL
83 " TopAbs_ShapeEnum aTypes[] = {TopAbs_VERTEX, TopAbs_EDGE, " EOL
84 " TopAbs_WIRE, TopAbs_FACE, TopAbs_SHELL};" EOL
85 " TopExp_Explorer ex;" EOL
86 " for (int i=0; i < 5; i++)" EOL
87 " for (ex.Init(aShape, aTypes[i]); ex.More(); ex.Next())" EOL
88 " if (!aMap.Contains(ex.Current()))" EOL
89 " {" EOL
90 " aShapes.Append(ex.Current());" EOL
91 " aMap.Add(ex.Current());" EOL
92 " }" EOL EOL
93
94 " for (i=1; i <= aShapes.Length(); i++)" EOL
95 " {" EOL
96 " const TopoDS_Shape& aSubShape = aShapes(i);" EOL
97 " Handle(BRepCheck_Result) aResult = aChecker.Result(aSubShape);" EOL
98 " if (!aResult.IsNull())" EOL
99 " {" EOL
100 " BRepCheck_ListOfStatus aLstStatus;" EOL
101 " // get statuses for a subshape" EOL
102 " aLstStatus = aResult->Status();" EOL
103 " // get statuses for a subshape in context" EOL
104 " aResult->InitContextIterator();" EOL
105 " while (aResult->MoreShapeInContext())" EOL
106 " {" EOL
107 " BRepCheck_ListOfStatus aLst1;" EOL
108 " aLst1 = aResult->StatusOnShape();" EOL
109 " aLstStatus.Append(aLst1);" EOL
110 " aResult->NextShapeInContext();" EOL
111 " }" EOL
112 " BRepCheck_ListIteratorOfListOfStatus itl(aLstStatus);" EOL
113 " for (; itl.More(); itl.Next())" EOL
114 " {" EOL
115 " BRepCheck_Status aStatus = itl.Value();" EOL
116 " if (aStatus == BRepCheck_NoError)" EOL
117 " continue;" EOL EOL
118
119 " Standard_CString aError;" EOL
120 " switch (aStatus)" EOL
121 " {" EOL
122 " // for vertices" EOL
123 " case BRepCheck_InvalidPointOnCurve: aError = \"InvalidPointOnCurve\"; break;" EOL
124 " case BRepCheck_InvalidPointOnCurveOnSurface: aError = \"InvalidPointOnCurveOnSurface\"; break;" EOL
125 " case BRepCheck_InvalidPointOnSurface: aError = \"InvalidPointOnSurface\"; break;" EOL
126 " // for edges" EOL
127 " case BRepCheck_No3DCurve: aError = \"No3DCurve\"; break;" EOL
128 " case BRepCheck_Multiple3DCurve: aError = \"Multiple3DCurve\"; break;" EOL
129 " case BRepCheck_Invalid3DCurve: aError = \"Invalid3DCurve\"; break;" EOL
130 " case BRepCheck_NoCurveOnSurface: aError = \"NoCurveOnSurface\"; break;" EOL
131 " case BRepCheck_InvalidCurveOnSurface: aError = \"InvalidCurveOnSurface\"; break;" EOL
132 " case BRepCheck_InvalidCurveOnClosedSurface: aError = \"InvalidCurveOnClosedSurface\"; break;" EOL
133 " case BRepCheck_InvalidSameRangeFlag: aError = \"InvalidSameRangeFlag\"; break;" EOL
134 " case BRepCheck_InvalidSameParameterFlag: aError = \"InvalidSameParameterFlag\"; break;" EOL
135 " case BRepCheck_InvalidDegeneratedFlag: aError = \"InvalidDegeneratedFlag\"; break;" EOL
136 " case BRepCheck_FreeEdge: aError = \"FreeEdge\"; break;" EOL
137 " case BRepCheck_InvalidMultiConnexity: aError = \"InvalidMultiConnexity\"; break;" EOL
138 " case BRepCheck_InvalidRange: aError = \"InvalidRange\"; break;" EOL
139 " // for wires" EOL
140 " case BRepCheck_EmptyWire: aError = \"EmptyWire\"; break;" EOL
141 " case BRepCheck_RedundantEdge: aError = \"RedundantEdge\"; break;" EOL
142 " case BRepCheck_SelfIntersectingWire: aError = \"SelfIntersectingWire\"; break;" EOL
143 " // for faces" EOL
144 " case BRepCheck_NoSurface: aError = \"NoSurface\"; break;" EOL
145 " case BRepCheck_InvalidWire: aError = \"InvalidWire\"; break;" EOL
146 " case BRepCheck_RedundantWire: aError = \"RedundantWire\"; break;" EOL
147 " case BRepCheck_IntersectingWires: aError = \"IntersectingWires\"; break;" EOL
148 " case BRepCheck_InvalidImbricationOfWires: aError = \"InvalidImbricationOfWires\"; break;" EOL
149 " // for shells" EOL
150 " case BRepCheck_EmptyShell: aError = \"EmptyShell\"; break;" EOL
151 " case BRepCheck_RedundantFace: aError = \"RedundantFace\"; break;" EOL
152 " // for shapes" EOL
153 " case BRepCheck_UnorientableShape: aError = \"UnorientableShape\"; break;" EOL
154 " case BRepCheck_NotClosed: aError = \"NotClosed\"; break;" EOL
155 " case BRepCheck_NotConnected: aError = \"NotConnected\"; break;" EOL
156 " case BRepCheck_SubshapeNotInShape: aError = \"SubshapeNotInShape\"; break;" EOL
157 " case BRepCheck_BadOrientation: aError = \"BadOrientation\"; break;" EOL
158 " case BRepCheck_BadOrientationOfSubshape: aError = \"BadOrientationOfSubshape\"; break;" EOL
159 " case BRepCheck_InvalidToleranceValue: aError = \"InvalidToleranceValue\"; break;" EOL
160 " default : aError = \"Undefined error\";" EOL
161 " }" EOL
162 " }" EOL
163 " }" EOL
164 " }" EOL
165 " }" EOL
166 " else" EOL
167 " {" EOL
168 " // aShape is a valid shape" EOL
169 " }" EOL EOL
170
171 "//==========================================" EOL EOL;
172 setResultText (aText.ToCString());
173 getAISContext()->IsoOnPlane(Standard_False);
174 drawShape (aShape);
175 if (WAIT_A_SECOND) return;
176
177 // Checking
178 BRepCheck_Analyzer aChecker(aShape);
179 if (!aChecker.IsValid())
180 {
181 // Initialize sequence of subshapes
182 TopTools_SequenceOfShape aShapes;
183 TopTools_MapOfShape aMap;
184 TopAbs_ShapeEnum aTypes[] = {TopAbs_VERTEX, TopAbs_EDGE,
185 TopAbs_WIRE, TopAbs_FACE, TopAbs_SHELL};
186 TopExp_Explorer ex;
187 for (int i=0; i < 5; i++)
188 for (ex.Init(aShape, aTypes[i]); ex.More(); ex.Next())
189 if (!aMap.Contains(ex.Current()))
190 {
191 aShapes.Append(ex.Current());
192 aMap.Add(ex.Current());
193 }
194
195 for (i=1; i <= aShapes.Length(); i++)
196 {
197 const TopoDS_Shape& aSubShape = aShapes(i);
198 Handle(BRepCheck_Result) aResult = aChecker.Result(aSubShape);
199 if (!aResult.IsNull())
200 {
201 BRepCheck_ListOfStatus aLstStatus;
202 // get statuses for a subshape
203 aLstStatus = aResult->Status();
204 // get statuses for a subshape in context
205 aResult->InitContextIterator();
206 while (aResult->MoreShapeInContext())
207 {
208 BRepCheck_ListOfStatus aLst1;
209 aLst1 = aResult->StatusOnShape();
210 aLstStatus.Append(aLst1);
211 aResult->NextShapeInContext();
212 }
213 BRepCheck_ListIteratorOfListOfStatus itl(aLstStatus);
214 for (; itl.More(); itl.Next())
215 {
216 BRepCheck_Status aStatus = itl.Value();
217 // use aStatus as you need
218 // ...
219
220 if (aStatus == BRepCheck_NoError)
221 continue;
222
223 TopAbs_ShapeEnum aType = aSubShape.ShapeType();
224 Standard_CString aTypeName;
225 switch (aType)
226 {
227 case TopAbs_SHELL: aTypeName = "SHELL"; break;
228 case TopAbs_FACE: aTypeName = "FACE"; break;
229 case TopAbs_WIRE: aTypeName = "WIRE"; break;
230 case TopAbs_EDGE: aTypeName = "EDGE"; break;
231 case TopAbs_VERTEX: aTypeName = "VERTEX"; break;
232 }
233
234 Standard_CString aError;
235 switch (aStatus)
236 {
237 // for vertices
238 case BRepCheck_InvalidPointOnCurve: aError = "InvalidPointOnCurve"; break;
239 case BRepCheck_InvalidPointOnCurveOnSurface: aError = "InvalidPointOnCurveOnSurface"; break;
240 case BRepCheck_InvalidPointOnSurface: aError = "InvalidPointOnSurface"; break;
241 // for edges
242 case BRepCheck_No3DCurve: aError = "No3DCurve"; break;
243 case BRepCheck_Multiple3DCurve: aError = "Multiple3DCurve"; break;
244 case BRepCheck_Invalid3DCurve: aError = "Invalid3DCurve"; break;
245 case BRepCheck_NoCurveOnSurface: aError = "NoCurveOnSurface"; break;
246 case BRepCheck_InvalidCurveOnSurface: aError = "InvalidCurveOnSurface"; break;
247 case BRepCheck_InvalidCurveOnClosedSurface: aError = "InvalidCurveOnClosedSurface"; break;
248 case BRepCheck_InvalidSameRangeFlag: aError = "InvalidSameRangeFlag"; break;
249 case BRepCheck_InvalidSameParameterFlag: aError = "InvalidSameParameterFlag"; break;
250 case BRepCheck_InvalidDegeneratedFlag: aError = "InvalidDegeneratedFlag"; break;
251 case BRepCheck_FreeEdge: aError = "FreeEdge"; break;
252 case BRepCheck_InvalidMultiConnexity: aError = "InvalidMultiConnexity"; break;
253 case BRepCheck_InvalidRange: aError = "InvalidRange"; break;
254 // for wires
255 case BRepCheck_EmptyWire: aError = "EmptyWire"; break;
256 case BRepCheck_RedundantEdge: aError = "RedundantEdge"; break;
257 case BRepCheck_SelfIntersectingWire: aError = "SelfIntersectingWire"; break;
258 // for faces
259 case BRepCheck_NoSurface: aError = "NoSurface"; break;
260 case BRepCheck_InvalidWire: aError = "InvalidWire"; break;
261 case BRepCheck_RedundantWire: aError = "RedundantWire"; break;
262 case BRepCheck_IntersectingWires: aError = "IntersectingWires"; break;
263 case BRepCheck_InvalidImbricationOfWires: aError = "InvalidImbricationOfWires"; break;
264 // for shells
265 case BRepCheck_EmptyShell: aError = "EmptyShell"; break;
266 case BRepCheck_RedundantFace: aError = "RedundantFace"; break;
267 // for shapes
268 case BRepCheck_UnorientableShape: aError = "UnorientableShape"; break;
269 case BRepCheck_NotClosed: aError = "NotClosed"; break;
270 case BRepCheck_NotConnected: aError = "NotConnected"; break;
271 case BRepCheck_SubshapeNotInShape: aError = "SubshapeNotInShape"; break;
272 case BRepCheck_BadOrientation: aError = "BadOrientation"; break;
273 case BRepCheck_BadOrientationOfSubshape: aError = "BadOrientationOfSubshape"; break;
274 case BRepCheck_InvalidToleranceValue: aError = "InvalidToleranceValue"; break;
275 default : aError = "Undefined error";
276 }
277
278 aText = aText + aTypeName + " : " + aError + EOL;
279 setResultText (aText.ToCString());
280 getAISContext()->IsoOnPlane(Standard_True);
281 Handle(AIS_InteractiveObject) obj = drawShape (aSubShape, Quantity_NOC_RED, Standard_False);
282 getAISContext()->SetDisplayMode(obj,AIS_WireFrame);
283 getAISContext()->Display(obj);
284 if (WAIT_A_SECOND) return;
285 getAISContext()->IsoOnPlane(Standard_False);
286 getAISContext()->Erase (obj);
287 }
288 }
289 }
290 }
291 else
292 {
293 aText = aText + "No errors in shape" + EOL;
294 }
295
296 setResultText (aText.ToCString());
297}
298
299void Validate_Presentation::sample(const Standard_CString aFileName)
300{
301 TCollection_AsciiString aPath(GetDataDir());
302 aPath = aPath + "\\" + aFileName;
303
304 TopoDS_Shape aShape;
305 BRep_Builder aBld;
306 Standard_Boolean isRead = BRepTools::Read (aShape, aPath.ToCString(), aBld);
307 if (!isRead)
308 {
309 aPath += " was not found. The sample can not be shown.";
310 setResultText(aPath.ToCString());
311 return;
312 }
313
314 checkShape (aShape);
315}