mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-04 13:13:25 +03:00
Integration of OCCT 6.5.0 from SVN
This commit is contained in:
315
samples/mfc/occtdemo/Validate/Validate_Presentation.cpp
Executable file
315
samples/mfc/occtdemo/Validate/Validate_Presentation.cpp
Executable file
@@ -0,0 +1,315 @@
|
||||
// Validate_Presentation.cpp: implementation of the Validate_Presentation class.
|
||||
// Checking validity of shapes
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "Validate_Presentation.h"
|
||||
|
||||
#include <BRep_Builder.hxx>
|
||||
#include <BRepTools.hxx>
|
||||
#include <BRepCheck_Analyzer.hxx>
|
||||
#include <BRepCheck_ListOfStatus.hxx>
|
||||
#include <BRepCheck_Result.hxx>
|
||||
#include <BRepCheck_ListIteratorOfListOfStatus.hxx>
|
||||
#include <TopAbs_ShapeEnum.hxx>
|
||||
#include <TopTools_SequenceOfShape.hxx>
|
||||
#include <TopTools_MapOfShape.hxx>
|
||||
#include <TopExp_Explorer.hxx>
|
||||
|
||||
|
||||
// Initialization of global variable with an instance of this class
|
||||
OCCDemo_Presentation* OCCDemo_Presentation::Current = new Validate_Presentation;
|
||||
|
||||
// Initialization of array of samples
|
||||
Standard_CString Validate_Presentation::myFileNames[] =
|
||||
{
|
||||
"wedge_ok.brep",
|
||||
"wedge_bad.brep",
|
||||
"shape2_bad.brep",
|
||||
0
|
||||
};
|
||||
|
||||
#ifdef WNT
|
||||
#define EOL "\r\n"
|
||||
#else
|
||||
#define EOL "\n"
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
Validate_Presentation::Validate_Presentation()
|
||||
{
|
||||
FitMode=true;
|
||||
for (myNbSamples = 0; myFileNames[myNbSamples]; myNbSamples++)
|
||||
;
|
||||
setName ("Checking validity of shapes");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Sample execution
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Validate_Presentation::DoSample()
|
||||
{
|
||||
getAISContext()->EraseAll();
|
||||
if (myIndex >=0 && myIndex < myNbSamples)
|
||||
sample (myFileNames[myIndex]);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Sample functions
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Validate_Presentation::checkShape(const TopoDS_Shape& aShape)
|
||||
{
|
||||
setResultTitle ("Validate shape");
|
||||
TCollection_AsciiString aText;
|
||||
|
||||
aText = aText +
|
||||
" // Input shape" EOL
|
||||
" TopoDS_Shape aShape;" EOL
|
||||
" // Initializing aShape" EOL
|
||||
" // ...." EOL EOL
|
||||
|
||||
" // Checking" EOL
|
||||
" BRepCheck_Analyzer aChecker(aShape);" EOL
|
||||
" if (!aChecker.IsValid())" EOL
|
||||
" {" EOL
|
||||
" // Initialize sequence of subshapes" EOL
|
||||
" TopTools_SequenceOfShape aShapes;" EOL
|
||||
" TopTools_MapOfShape aMap;" EOL
|
||||
" TopAbs_ShapeEnum aTypes[] = {TopAbs_VERTEX, TopAbs_EDGE, " EOL
|
||||
" TopAbs_WIRE, TopAbs_FACE, TopAbs_SHELL};" EOL
|
||||
" TopExp_Explorer ex;" EOL
|
||||
" for (int i=0; i < 5; i++)" EOL
|
||||
" for (ex.Init(aShape, aTypes[i]); ex.More(); ex.Next())" EOL
|
||||
" if (!aMap.Contains(ex.Current()))" EOL
|
||||
" {" EOL
|
||||
" aShapes.Append(ex.Current());" EOL
|
||||
" aMap.Add(ex.Current());" EOL
|
||||
" }" EOL EOL
|
||||
|
||||
" for (i=1; i <= aShapes.Length(); i++)" EOL
|
||||
" {" EOL
|
||||
" const TopoDS_Shape& aSubShape = aShapes(i);" EOL
|
||||
" Handle(BRepCheck_Result) aResult = aChecker.Result(aSubShape);" EOL
|
||||
" if (!aResult.IsNull())" EOL
|
||||
" {" EOL
|
||||
" BRepCheck_ListOfStatus aLstStatus;" EOL
|
||||
" // get statuses for a subshape" EOL
|
||||
" aLstStatus = aResult->Status();" EOL
|
||||
" // get statuses for a subshape in context" EOL
|
||||
" aResult->InitContextIterator();" EOL
|
||||
" while (aResult->MoreShapeInContext())" EOL
|
||||
" {" EOL
|
||||
" BRepCheck_ListOfStatus aLst1;" EOL
|
||||
" aLst1 = aResult->StatusOnShape();" EOL
|
||||
" aLstStatus.Append(aLst1);" EOL
|
||||
" aResult->NextShapeInContext();" EOL
|
||||
" }" EOL
|
||||
" BRepCheck_ListIteratorOfListOfStatus itl(aLstStatus);" EOL
|
||||
" for (; itl.More(); itl.Next())" EOL
|
||||
" {" EOL
|
||||
" BRepCheck_Status aStatus = itl.Value();" EOL
|
||||
" if (aStatus == BRepCheck_NoError)" EOL
|
||||
" continue;" EOL EOL
|
||||
|
||||
" Standard_CString aError;" EOL
|
||||
" switch (aStatus)" EOL
|
||||
" {" EOL
|
||||
" // for vertices" EOL
|
||||
" case BRepCheck_InvalidPointOnCurve: aError = \"InvalidPointOnCurve\"; break;" EOL
|
||||
" case BRepCheck_InvalidPointOnCurveOnSurface: aError = \"InvalidPointOnCurveOnSurface\"; break;" EOL
|
||||
" case BRepCheck_InvalidPointOnSurface: aError = \"InvalidPointOnSurface\"; break;" EOL
|
||||
" // for edges" EOL
|
||||
" case BRepCheck_No3DCurve: aError = \"No3DCurve\"; break;" EOL
|
||||
" case BRepCheck_Multiple3DCurve: aError = \"Multiple3DCurve\"; break;" EOL
|
||||
" case BRepCheck_Invalid3DCurve: aError = \"Invalid3DCurve\"; break;" EOL
|
||||
" case BRepCheck_NoCurveOnSurface: aError = \"NoCurveOnSurface\"; break;" EOL
|
||||
" case BRepCheck_InvalidCurveOnSurface: aError = \"InvalidCurveOnSurface\"; break;" EOL
|
||||
" case BRepCheck_InvalidCurveOnClosedSurface: aError = \"InvalidCurveOnClosedSurface\"; break;" EOL
|
||||
" case BRepCheck_InvalidSameRangeFlag: aError = \"InvalidSameRangeFlag\"; break;" EOL
|
||||
" case BRepCheck_InvalidSameParameterFlag: aError = \"InvalidSameParameterFlag\"; break;" EOL
|
||||
" case BRepCheck_InvalidDegeneratedFlag: aError = \"InvalidDegeneratedFlag\"; break;" EOL
|
||||
" case BRepCheck_FreeEdge: aError = \"FreeEdge\"; break;" EOL
|
||||
" case BRepCheck_InvalidMultiConnexity: aError = \"InvalidMultiConnexity\"; break;" EOL
|
||||
" case BRepCheck_InvalidRange: aError = \"InvalidRange\"; break;" EOL
|
||||
" // for wires" EOL
|
||||
" case BRepCheck_EmptyWire: aError = \"EmptyWire\"; break;" EOL
|
||||
" case BRepCheck_RedundantEdge: aError = \"RedundantEdge\"; break;" EOL
|
||||
" case BRepCheck_SelfIntersectingWire: aError = \"SelfIntersectingWire\"; break;" EOL
|
||||
" // for faces" EOL
|
||||
" case BRepCheck_NoSurface: aError = \"NoSurface\"; break;" EOL
|
||||
" case BRepCheck_InvalidWire: aError = \"InvalidWire\"; break;" EOL
|
||||
" case BRepCheck_RedundantWire: aError = \"RedundantWire\"; break;" EOL
|
||||
" case BRepCheck_IntersectingWires: aError = \"IntersectingWires\"; break;" EOL
|
||||
" case BRepCheck_InvalidImbricationOfWires: aError = \"InvalidImbricationOfWires\"; break;" EOL
|
||||
" // for shells" EOL
|
||||
" case BRepCheck_EmptyShell: aError = \"EmptyShell\"; break;" EOL
|
||||
" case BRepCheck_RedundantFace: aError = \"RedundantFace\"; break;" EOL
|
||||
" // for shapes" EOL
|
||||
" case BRepCheck_UnorientableShape: aError = \"UnorientableShape\"; break;" EOL
|
||||
" case BRepCheck_NotClosed: aError = \"NotClosed\"; break;" EOL
|
||||
" case BRepCheck_NotConnected: aError = \"NotConnected\"; break;" EOL
|
||||
" case BRepCheck_SubshapeNotInShape: aError = \"SubshapeNotInShape\"; break;" EOL
|
||||
" case BRepCheck_BadOrientation: aError = \"BadOrientation\"; break;" EOL
|
||||
" case BRepCheck_BadOrientationOfSubshape: aError = \"BadOrientationOfSubshape\"; break;" EOL
|
||||
" case BRepCheck_InvalidToleranceValue: aError = \"InvalidToleranceValue\"; break;" EOL
|
||||
" default : aError = \"Undefined error\";" EOL
|
||||
" }" EOL
|
||||
" }" EOL
|
||||
" }" EOL
|
||||
" }" EOL
|
||||
" }" EOL
|
||||
" else" EOL
|
||||
" {" EOL
|
||||
" // aShape is a valid shape" EOL
|
||||
" }" EOL EOL
|
||||
|
||||
"//==========================================" EOL EOL;
|
||||
setResultText (aText.ToCString());
|
||||
getAISContext()->IsoOnPlane(Standard_False);
|
||||
drawShape (aShape);
|
||||
if (WAIT_A_SECOND) return;
|
||||
|
||||
// Checking
|
||||
BRepCheck_Analyzer aChecker(aShape);
|
||||
if (!aChecker.IsValid())
|
||||
{
|
||||
// Initialize sequence of subshapes
|
||||
TopTools_SequenceOfShape aShapes;
|
||||
TopTools_MapOfShape aMap;
|
||||
TopAbs_ShapeEnum aTypes[] = {TopAbs_VERTEX, TopAbs_EDGE,
|
||||
TopAbs_WIRE, TopAbs_FACE, TopAbs_SHELL};
|
||||
TopExp_Explorer ex;
|
||||
for (int i=0; i < 5; i++)
|
||||
for (ex.Init(aShape, aTypes[i]); ex.More(); ex.Next())
|
||||
if (!aMap.Contains(ex.Current()))
|
||||
{
|
||||
aShapes.Append(ex.Current());
|
||||
aMap.Add(ex.Current());
|
||||
}
|
||||
|
||||
for (i=1; i <= aShapes.Length(); i++)
|
||||
{
|
||||
const TopoDS_Shape& aSubShape = aShapes(i);
|
||||
Handle(BRepCheck_Result) aResult = aChecker.Result(aSubShape);
|
||||
if (!aResult.IsNull())
|
||||
{
|
||||
BRepCheck_ListOfStatus aLstStatus;
|
||||
// get statuses for a subshape
|
||||
aLstStatus = aResult->Status();
|
||||
// get statuses for a subshape in context
|
||||
aResult->InitContextIterator();
|
||||
while (aResult->MoreShapeInContext())
|
||||
{
|
||||
BRepCheck_ListOfStatus aLst1;
|
||||
aLst1 = aResult->StatusOnShape();
|
||||
aLstStatus.Append(aLst1);
|
||||
aResult->NextShapeInContext();
|
||||
}
|
||||
BRepCheck_ListIteratorOfListOfStatus itl(aLstStatus);
|
||||
for (; itl.More(); itl.Next())
|
||||
{
|
||||
BRepCheck_Status aStatus = itl.Value();
|
||||
// use aStatus as you need
|
||||
// ...
|
||||
|
||||
if (aStatus == BRepCheck_NoError)
|
||||
continue;
|
||||
|
||||
TopAbs_ShapeEnum aType = aSubShape.ShapeType();
|
||||
Standard_CString aTypeName;
|
||||
switch (aType)
|
||||
{
|
||||
case TopAbs_SHELL: aTypeName = "SHELL"; break;
|
||||
case TopAbs_FACE: aTypeName = "FACE"; break;
|
||||
case TopAbs_WIRE: aTypeName = "WIRE"; break;
|
||||
case TopAbs_EDGE: aTypeName = "EDGE"; break;
|
||||
case TopAbs_VERTEX: aTypeName = "VERTEX"; break;
|
||||
}
|
||||
|
||||
Standard_CString aError;
|
||||
switch (aStatus)
|
||||
{
|
||||
// for vertices
|
||||
case BRepCheck_InvalidPointOnCurve: aError = "InvalidPointOnCurve"; break;
|
||||
case BRepCheck_InvalidPointOnCurveOnSurface: aError = "InvalidPointOnCurveOnSurface"; break;
|
||||
case BRepCheck_InvalidPointOnSurface: aError = "InvalidPointOnSurface"; break;
|
||||
// for edges
|
||||
case BRepCheck_No3DCurve: aError = "No3DCurve"; break;
|
||||
case BRepCheck_Multiple3DCurve: aError = "Multiple3DCurve"; break;
|
||||
case BRepCheck_Invalid3DCurve: aError = "Invalid3DCurve"; break;
|
||||
case BRepCheck_NoCurveOnSurface: aError = "NoCurveOnSurface"; break;
|
||||
case BRepCheck_InvalidCurveOnSurface: aError = "InvalidCurveOnSurface"; break;
|
||||
case BRepCheck_InvalidCurveOnClosedSurface: aError = "InvalidCurveOnClosedSurface"; break;
|
||||
case BRepCheck_InvalidSameRangeFlag: aError = "InvalidSameRangeFlag"; break;
|
||||
case BRepCheck_InvalidSameParameterFlag: aError = "InvalidSameParameterFlag"; break;
|
||||
case BRepCheck_InvalidDegeneratedFlag: aError = "InvalidDegeneratedFlag"; break;
|
||||
case BRepCheck_FreeEdge: aError = "FreeEdge"; break;
|
||||
case BRepCheck_InvalidMultiConnexity: aError = "InvalidMultiConnexity"; break;
|
||||
case BRepCheck_InvalidRange: aError = "InvalidRange"; break;
|
||||
// for wires
|
||||
case BRepCheck_EmptyWire: aError = "EmptyWire"; break;
|
||||
case BRepCheck_RedundantEdge: aError = "RedundantEdge"; break;
|
||||
case BRepCheck_SelfIntersectingWire: aError = "SelfIntersectingWire"; break;
|
||||
// for faces
|
||||
case BRepCheck_NoSurface: aError = "NoSurface"; break;
|
||||
case BRepCheck_InvalidWire: aError = "InvalidWire"; break;
|
||||
case BRepCheck_RedundantWire: aError = "RedundantWire"; break;
|
||||
case BRepCheck_IntersectingWires: aError = "IntersectingWires"; break;
|
||||
case BRepCheck_InvalidImbricationOfWires: aError = "InvalidImbricationOfWires"; break;
|
||||
// for shells
|
||||
case BRepCheck_EmptyShell: aError = "EmptyShell"; break;
|
||||
case BRepCheck_RedundantFace: aError = "RedundantFace"; break;
|
||||
// for shapes
|
||||
case BRepCheck_UnorientableShape: aError = "UnorientableShape"; break;
|
||||
case BRepCheck_NotClosed: aError = "NotClosed"; break;
|
||||
case BRepCheck_NotConnected: aError = "NotConnected"; break;
|
||||
case BRepCheck_SubshapeNotInShape: aError = "SubshapeNotInShape"; break;
|
||||
case BRepCheck_BadOrientation: aError = "BadOrientation"; break;
|
||||
case BRepCheck_BadOrientationOfSubshape: aError = "BadOrientationOfSubshape"; break;
|
||||
case BRepCheck_InvalidToleranceValue: aError = "InvalidToleranceValue"; break;
|
||||
default : aError = "Undefined error";
|
||||
}
|
||||
|
||||
aText = aText + aTypeName + " : " + aError + EOL;
|
||||
setResultText (aText.ToCString());
|
||||
getAISContext()->IsoOnPlane(Standard_True);
|
||||
Handle(AIS_InteractiveObject) obj = drawShape (aSubShape, Quantity_NOC_RED, Standard_False);
|
||||
getAISContext()->SetDisplayMode(obj,AIS_WireFrame);
|
||||
getAISContext()->Display(obj);
|
||||
if (WAIT_A_SECOND) return;
|
||||
getAISContext()->IsoOnPlane(Standard_False);
|
||||
getAISContext()->Erase (obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
aText = aText + "No errors in shape" + EOL;
|
||||
}
|
||||
|
||||
setResultText (aText.ToCString());
|
||||
}
|
||||
|
||||
void Validate_Presentation::sample(const Standard_CString aFileName)
|
||||
{
|
||||
TCollection_AsciiString aPath(GetDataDir());
|
||||
aPath = aPath + "\\" + aFileName;
|
||||
|
||||
TopoDS_Shape aShape;
|
||||
BRep_Builder aBld;
|
||||
Standard_Boolean isRead = BRepTools::Read (aShape, aPath.ToCString(), aBld);
|
||||
if (!isRead)
|
||||
{
|
||||
aPath += " was not found. The sample can not be shown.";
|
||||
setResultText(aPath.ToCString());
|
||||
return;
|
||||
}
|
||||
|
||||
checkShape (aShape);
|
||||
}
|
Reference in New Issue
Block a user