0030024: Data Exchange - STEP, IGES export support of BRep shapes based on tessellated geometry

Support of reading and writing tessellated geometry is added for the following STEP entities:
- triangulated face
- complex triangulated face
- tessellated shell
- tessellated solid
- tessellated shape representation

Models without BRep geometry (mesh formats like STL, OBJ and so on) are supported for writing to STEP.

New parameters are added to enable/disable tessellated geometry reading and writing:
- read.step.tessellated (On/Off/OnNoBRep) (On by default)
- write.step.tessellated (On/Off/OnNoBRep) (OnNoBRep by default)

OnNoBRep - tessellation is read/written only for entities for which there is no BRep representation.

Faces with poly triangulation are written in STEP as triangulated face entities with one coordinates list per face.
Only one poly triangulation per face (returned by BRep_Tool::Triangulation) is written to STEP.
This commit is contained in:
snn
2022-04-04 18:08:34 +03:00
committed by afokin
parent e9c43fee29
commit cec41bb93d
128 changed files with 9920 additions and 403 deletions

View File

@@ -88,6 +88,10 @@
#include <StepShape_ShapeDefinitionRepresentation.hxx>
#include <StepShape_ShapeRepresentation.hxx>
#include <StepShape_ShellBasedSurfaceModel.hxx>
#include <StepVisual_TriangulatedFace.hxx>
#include <StepVisual_TessellatedShell.hxx>
#include <StepVisual_TessellatedShapeRepresentation.hxx>
#include <StepVisual_TessellatedSolid.hxx>
#include <StepToGeom.hxx>
#include <StepToTopoDS_Builder.hxx>
#include <StepToTopoDS_DataMapOfTRI.hxx>
@@ -95,6 +99,7 @@
#include <StepToTopoDS_Tool.hxx>
#include <StepToTopoDS_TranslateFace.hxx>
#include <TColStd_HSequenceOfTransient.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Compound.hxx>
@@ -103,6 +108,7 @@
#include <TopoDS_Shape.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Solid.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_MapOfShape.hxx>
@@ -209,6 +215,7 @@ STEPControl_ActorRead::STEPControl_ActorRead()
myMaxTol(0.0)
{
}
// ============================================================================
// Method : STEPControl_ActorRead::Recognize
// Purpose : tells if an entity is valid for transfer by this Actor
@@ -236,6 +243,8 @@ Standard_Boolean STEPControl_ActorRead::Recognize
return Standard_False;
}
const Standard_Boolean aCanReadTessGeom = (Interface_Static::IVal("read.step.tessellated") != 0);
if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrep))) return Standard_True;
if (start->IsKind(STANDARD_TYPE(StepShape_BrepWithVoids))) return Standard_True;
if (start->IsKind(STANDARD_TYPE(StepShape_ManifoldSolidBrep))) return Standard_True;
@@ -246,6 +255,10 @@ Standard_Boolean STEPControl_ActorRead::Recognize
if (start->IsKind(STANDARD_TYPE(StepShape_FaceSurface))) return Standard_True;
if (start->IsKind(STANDARD_TYPE(StepShape_EdgeBasedWireframeModel))) return Standard_True;
if (start->IsKind(STANDARD_TYPE(StepShape_FaceBasedSurfaceModel))) return Standard_True;
if (aCanReadTessGeom && start->IsKind(STANDARD_TYPE(StepVisual_TessellatedFace))) return Standard_True;
if (aCanReadTessGeom && start->IsKind(STANDARD_TYPE(StepVisual_TessellatedShell))) return Standard_True;
if (aCanReadTessGeom && start->IsKind(STANDARD_TYPE(StepVisual_TessellatedSolid))) return Standard_True;
if (aCanReadTessGeom && start->IsKind(STANDARD_TYPE(StepVisual_TessellatedShapeRepresentation))) return Standard_True;
// REPRESENTATION_RELATIONSHIP et consorts : on regarde le contenu ...
@@ -859,6 +872,7 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(
gp_Trsf aTrsf;
Message_ProgressScope aPSRoot(theProgress, "Sub-assembly", isManifold ? 1 : 2);
Message_ProgressScope aPS (aPSRoot.Next(), "Transfer", nb);
TopTools_IndexedMapOfShape aCompoundedShapes;
for (Standard_Integer i = 1; i <= nb && aPS.More(); i ++)
{
Message_ProgressRange aRange = aPS.Next();
@@ -915,8 +929,13 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(
TopoDS_Shape theResult = TransferBRep::ShapeResult (binder);
if (!theResult.IsNull()) {
OneResult = theResult;
B.Add(comp, theResult);
nsh ++;
if (!aCompoundedShapes.Contains(theResult))
{
aCompoundedShapes.Add(theResult);
TopExp::MapShapes(theResult, aCompoundedShapes, Standard_False, Standard_False);
B.Add(comp, theResult);
nsh++;
}
}
}
@@ -1396,6 +1415,8 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity
// Start progress scope (no need to check if progress exists -- it is safe)
Message_ProgressScope aPS(theProgress, "Transfer stage", isManifold ? 2 : 1);
const Standard_Boolean aReadTessellatedWhenNoBRepOnly = (Interface_Static::IVal("read.step.tessellated") == 2);
Standard_Boolean aHasGeom = Standard_True;
try {
OCC_CATCH_SIGNALS
Message_ProgressRange aRange = aPS.Next();
@@ -1431,6 +1452,27 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity
myShapeBuilder.Init(GetCasted(StepShape_FaceBasedSurfaceModel, start), TP);
found = Standard_True;
}
// TODO: Normally, StepVisual_Tessellated* entities should be processed after
// StepShape_* entities in order to resolve links to BRep topological objects.
// Currently it is not guaranteed and might require changes in the processing order.
else if (start->IsKind(STANDARD_TYPE(StepVisual_TessellatedSolid)))
{
myShapeBuilder.Init(GetCasted(StepVisual_TessellatedSolid, start), TP,
aReadTessellatedWhenNoBRepOnly, aHasGeom, aRange);
found = Standard_True;
}
else if (start->IsKind(STANDARD_TYPE(StepVisual_TessellatedShell)))
{
myShapeBuilder.Init(GetCasted(StepVisual_TessellatedShell, start), TP,
aReadTessellatedWhenNoBRepOnly, aHasGeom, aRange);
found = Standard_True;
}
else if (start->IsKind(STANDARD_TYPE(StepVisual_TessellatedFace)))
{
myShapeBuilder.Init(GetCasted(StepVisual_TessellatedFace, start), TP,
aReadTessellatedWhenNoBRepOnly, aHasGeom);
found = Standard_True;
}
}
catch(Standard_Failure const&) {
TP->AddFail(start,"Exception is raised. Entity was not translated.");
@@ -1444,7 +1486,8 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity
if (found && myShapeBuilder.IsDone()) {
mappedShape = myShapeBuilder.Value();
// Apply ShapeFix (on manifold shapes only. Non-manifold topology is processed separately: ssv; 13.11.2010)
if (isManifold) {
if (isManifold && aHasGeom)
{
Handle(Standard_Transient) info;
mappedShape =
XSAlgo::AlgoContainer()->ProcessShape( mappedShape, myPrecision, myMaxTol,

View File

@@ -19,6 +19,7 @@
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRep_TEdge.hxx>
#include <BRepTools_Modifier.hxx>
#include <Geom_Curve.hxx>
#include <Geom_Line.hxx>
@@ -71,6 +72,9 @@
#include <StepShape_ShellBasedSurfaceModel.hxx>
#include <StepShape_TopologicalRepresentationItem.hxx>
#include <StepShape_VertexPoint.hxx>
#include <StepVisual_TessellatedItem.hxx>
#include <StepVisual_TessellatedShapeRepresentation.hxx>
#include <StepVisual_TessellatedSolid.hxx>
#include <TCollection_HAsciiString.hxx>
#include <TColStd_HSequenceOfTransient.hxx>
#include <TopExp.hxx>
@@ -81,7 +85,6 @@
#include <TopoDS_Shape.hxx>
#include <TopoDS_Solid.hxx>
#include <TopoDSToStep.hxx>
#include <TopoDSToStep_Builder.hxx>
#include <TopoDSToStep_FacetedTool.hxx>
#include <TopoDSToStep_MakeBrepWithVoids.hxx>
#include <TopoDSToStep_MakeFacetedBrep.hxx>
@@ -170,6 +173,58 @@ static void DumpWhatIs(const TopoDS_Shape& S) {
}
#endif
static Standard_Boolean hasGeometry(const TopoDS_Shape& theShape)
{
TopAbs_ShapeEnum aType = theShape.ShapeType();
if (aType == TopAbs_VERTEX)
{
return Standard_True;
}
else if (aType == TopAbs_EDGE)
{
Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(theShape.TShape());
BRep_ListIteratorOfListOfCurveRepresentation itrc(TE->Curves());
while (itrc.More())
{
const Handle(BRep_CurveRepresentation)& CR = itrc.Value();
Standard_Boolean aHasGeometry = (CR->IsCurve3D() && !CR->Curve3D().IsNull())
|| CR->IsCurveOnSurface()
|| CR->IsRegularity()
|| (CR->IsPolygon3D() && !CR->Polygon3D().IsNull())
|| CR->IsPolygonOnTriangulation()
|| CR->IsPolygonOnSurface();
if (!aHasGeometry)
return Standard_False;
itrc.Next();
}
return Standard_True;
}
else if (aType == TopAbs_FACE)
{
Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(theShape.TShape());
if (!TF->Surface().IsNull())
{
return Standard_True;
}
}
else
{
TopoDS_Iterator anIt(theShape, Standard_False, Standard_False);
for (; anIt.More(); anIt.Next())
{
const TopoDS_Shape& aShape = anIt.Value();
Standard_Boolean aHasGeometry = hasGeometry(aShape);
if (!aHasGeometry)
return Standard_False;
}
return Standard_True;
}
return Standard_False;
}
//=======================================================================
// Function : IsManifoldShape
// Purpose : Used to define whether the passed shape has manifold
@@ -906,25 +961,30 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
// BRepTools_Modifier DMT(aShape,DM);
// if ( DMT.IsDone() ) aShape = DMT.ModifiedShape ( aShape );
//// aShape = TopoDSToStep::DirectFaces(xShape);
Message_ProgressScope aPS1(aPS.Next(), NULL, 2);
TopoDS_Shape aShape = xShape;
Handle(Standard_Transient) info;
Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val");
Message_ProgressScope aPS1 (aPS.Next(), NULL, 2);
if (hasGeometry(aShape))
{
Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val");
TopoDS_Shape aShape;
aShape = XSAlgo::AlgoContainer()->ProcessShape(xShape, Tol, maxTol,
"write.step.resource.name",
"write.step.sequence", info,
aPS1.Next());
if (aPS1.UserBreak())
return Handle(Transfer_Binder)();
aShape = XSAlgo::AlgoContainer()->ProcessShape(xShape, Tol, maxTol,
"write.step.resource.name",
"write.step.sequence", info,
aPS1.Next());
if (aPS1.UserBreak())
return Handle(Transfer_Binder)();
}
if (!isManifold) {
if (!isManifold)
{
mergeInfoForNM(FP, info);
}
// create a STEP entity corresponding to shape
Handle(StepGeom_GeometricRepresentationItem) item;
Handle(StepGeom_GeometricRepresentationItem) item, itemTess;
switch (trmode)
{
case STEPControl_ManifoldSolidBrep:
@@ -940,28 +1000,33 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
if ( nbShells >1 ) {
TopoDSToStep_MakeBrepWithVoids MkBRepWithVoids(aSolid,FP, aPS1.Next());
MkBRepWithVoids.Tolerance() = Tol;
if (MkBRepWithVoids.IsDone()) {
if (MkBRepWithVoids.IsDone())
{
item = MkBRepWithVoids.Value();
}
else nbShells = 1; //smth went wrong; let it will be just Manifold
itemTess = MkBRepWithVoids.TessellatedValue();
}
else nbShells = 1; //smth went wrong; let it will be just Manifold
}
if ( nbShells ==1 ) {
TopoDSToStep_MakeManifoldSolidBrep MkManifoldSolidBrep(aSolid,FP, aPS1.Next());
TopoDSToStep_MakeManifoldSolidBrep MkManifoldSolidBrep(aSolid,FP, aPS1.Next());
MkManifoldSolidBrep.Tolerance() = Tol;
if (MkManifoldSolidBrep.IsDone()) {
if (MkManifoldSolidBrep.IsDone())
{
item = MkManifoldSolidBrep.Value();
}
}
itemTess = MkManifoldSolidBrep.TessellatedValue();
}
}
}
else if (aShape.ShapeType() == TopAbs_SHELL) {
TopoDS_Shell aShell = TopoDS::Shell(aShape);
TopoDSToStep_MakeManifoldSolidBrep MkManifoldSolidBrep(aShell,FP, aPS1.Next());
MkManifoldSolidBrep.Tolerance() = Tol;
if (MkManifoldSolidBrep.IsDone()) {
if (MkManifoldSolidBrep.IsDone())
{
item = MkManifoldSolidBrep.Value();
}
}
itemTess = MkManifoldSolidBrep.TessellatedValue();
}
}
break;
}
case STEPControl_BrepWithVoids:
@@ -970,8 +1035,10 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
TopoDS_Solid aSolid = TopoDS::Solid(aShape);
TopoDSToStep_MakeBrepWithVoids MkBRepWithVoids(aSolid,FP, aPS1.Next());
MkBRepWithVoids.Tolerance() = Tol;
if (MkBRepWithVoids.IsDone()) {
if (MkBRepWithVoids.IsDone())
{
item = MkBRepWithVoids.Value();
itemTess = MkBRepWithVoids.TessellatedValue();
}
}
break;
@@ -993,9 +1060,11 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
TopoDS_Solid aSolid = TopoDS::Solid(aShape);
TopoDSToStep_MakeFacetedBrep MkFacetedBrep(aSolid,FP, aPS1.Next());
MkFacetedBrep.Tolerance() = Tol;
if (MkFacetedBrep.IsDone()) {
if (MkFacetedBrep.IsDone())
{
item = MkFacetedBrep.Value();
}
itemTess = MkFacetedBrep.TessellatedValue();
}
}
break;
}
@@ -1017,9 +1086,11 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
TopoDSToStep_MakeFacetedBrepAndBrepWithVoids
MkFacetedBrepAndBrepWithVoids(aSolid,FP, aPS1.Next());
MkFacetedBrepAndBrepWithVoids.Tolerance() = Tol;
if (MkFacetedBrepAndBrepWithVoids.IsDone()) {
if (MkFacetedBrepAndBrepWithVoids.IsDone())
{
item = MkFacetedBrepAndBrepWithVoids.Value();
}
itemTess = MkFacetedBrepAndBrepWithVoids.TessellatedValue();
}
}
break;
}
@@ -1030,28 +1101,34 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
TopoDSToStep_MakeShellBasedSurfaceModel
MkShellBasedSurfaceModel(aSolid, FP, aPS1.Next());
MkShellBasedSurfaceModel.Tolerance() = Tol;
if (MkShellBasedSurfaceModel.IsDone()) {
if (MkShellBasedSurfaceModel.IsDone())
{
item = MkShellBasedSurfaceModel.Value();
}
itemTess = MkShellBasedSurfaceModel.TessellatedValue();
}
}
else if (aShape.ShapeType() == TopAbs_SHELL) {
TopoDS_Shell aShell = TopoDS::Shell(aShape);
// Non-manifold topology is stored via NMSSR containing series of SBSM (ssv; 13.11.2010)
TopoDSToStep_MakeShellBasedSurfaceModel MkShellBasedSurfaceModel(aShell, FP, aPS1.Next());
MkShellBasedSurfaceModel.Tolerance() = Tol;
if (MkShellBasedSurfaceModel.IsDone()) {
if (MkShellBasedSurfaceModel.IsDone())
{
item = MkShellBasedSurfaceModel.Value();
itemTess = MkShellBasedSurfaceModel.TessellatedValue();
}
}
else if (aShape.ShapeType() == TopAbs_FACE) {
TopoDS_Face aFace = TopoDS::Face(aShape);
TopoDSToStep_MakeShellBasedSurfaceModel
TopoDSToStep_MakeShellBasedSurfaceModel
MkShellBasedSurfaceModel(aFace, FP, aPS1.Next());
MkShellBasedSurfaceModel.Tolerance() = Tol;
if (MkShellBasedSurfaceModel.IsDone()) {
if (MkShellBasedSurfaceModel.IsDone())
{
item = MkShellBasedSurfaceModel.Value();
}
}
itemTess = MkShellBasedSurfaceModel.TessellatedValue();
}
}
break;
}
case STEPControl_GeometricCurveSet:
@@ -1099,24 +1176,48 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
}
default: break;
}
if ( item.IsNull() ) continue;
if ( item.IsNull() && itemTess.IsNull() ) continue;
// add resulting item to the FP
ItemSeq->Append(item);
Handle(TransferBRep_ShapeMapper) submapper;
if ( xShape.IsSame ( mapper->Value() ) )
submapper = Handle(TransferBRep_ShapeMapper)::DownCast ( start );
if ( submapper.IsNull() ) submapper = TransferBRep::ShapeMapper (FP,xShape);
Handle(Transfer_Binder) subbind = FP->Find ( submapper );
if ( subbind.IsNull() ) {
subbind = TransientResult ( item );
FP->Bind ( submapper, subbind );
if (!item.IsNull())
{
ItemSeq->Append(item);
Handle(TransferBRep_ShapeMapper) submapper;
if (xShape.IsSame(mapper->Value()))
submapper = Handle(TransferBRep_ShapeMapper)::DownCast(start);
if (submapper.IsNull())
submapper = TransferBRep::ShapeMapper(FP, xShape);
Handle(Transfer_Binder) subbind = FP->Find(submapper);
if (subbind.IsNull())
{
subbind = TransientResult(item);
FP->Bind(submapper, subbind);
}
else
subbind->AddResult(TransientResult(item));
}
if (!itemTess.IsNull())
{
ItemSeq->Append(itemTess);
Handle(TransferBRep_ShapeMapper) submapper;
if (xShape.IsSame(mapper->Value()))
submapper = Handle(TransferBRep_ShapeMapper)::DownCast(start);
if (submapper.IsNull())
submapper = TransferBRep::ShapeMapper(FP, xShape);
Handle(Transfer_Binder) subbind = FP->Find(submapper);
if (subbind.IsNull())
{
subbind = TransientResult(itemTess);
FP->Bind(submapper, subbind);
}
else
subbind->AddResult(TransientResult(itemTess));
}
else subbind->AddResult ( TransientResult ( item ) );
//:abv 24Jan99 CAX-IF TRJ3: Update FinderProcess map to take into account shape processing
// UpdateMap ( xShape, CSMT, DMT, FP );
XSAlgo::AlgoContainer()->MergeTransferInfo(FP, info);
if (!info.IsNull())
XSAlgo::AlgoContainer()->MergeTransferInfo(FP, info);
}
// - Make Shape Representation
@@ -1212,6 +1313,8 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
ShapeRepr1 = new StepShape_GeometricallyBoundedWireframeShapeRepresentation;
else if (items->Value(j)->IsKind(STANDARD_TYPE(StepShape_FacetedBrep)))
ShapeRepr1 = new StepShape_FacetedBrepShapeRepresentation;
else if (items->Value(j)->IsKind(STANDARD_TYPE(StepVisual_TessellatedItem)))
ShapeRepr1 = new StepVisual_TessellatedShapeRepresentation;
else ShapeRepr1 = new StepShape_ShapeRepresentation;
Handle(StepRepr_HArray1OfRepresentationItem) repr1 = new StepRepr_HArray1OfRepresentationItem(1,2);
@@ -1235,6 +1338,33 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
}
}
else {
Standard_Integer nC = 0;
for (Standard_Integer i = 1; i <= items->Length(); i++)
{
if (!items->Value(i)->IsKind(STANDARD_TYPE(StepVisual_TessellatedItem)))
continue;
++nC;
}
if (nC > 0)
{
Handle(StepRepr_HArray1OfRepresentationItem) itemsTess = new StepRepr_HArray1OfRepresentationItem(1, nC);
Standard_Integer i = 1;
for (Standard_Integer j = 1; j <= items->Length(); j++)
{
if (!items->Value(j)->IsKind(STANDARD_TYPE(StepVisual_TessellatedItem)))
continue;
itemsTess->SetValue(i++, items->Value(j));
}
Handle(StepShape_ShapeRepresentation) shapeTessRepr = new StepVisual_TessellatedShapeRepresentation;
shapeTessRepr->SetItems(itemsTess);
STEPConstruct_UnitContext mk1;
mk1.Init(Tol);
shapeTessRepr->SetContextOfItems(mk1.Value());
shapeTessRepr->SetName(new TCollection_HAsciiString(""));
aSeqBindRelation.Append(TransientResult(shapeTessRepr));
}
if (!useExistingNMSSR)
shapeRep->SetItems(items);
else {
@@ -1243,8 +1373,8 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape
Handle(StepRepr_HArray1OfRepresentationItem) newItems =
new StepRepr_HArray1OfRepresentationItem(1, oldItems->Length() + 1);
Standard_Integer el = 1;
for (Standard_Integer i = 1; i <= oldItems->Length(); i++)
newItems->SetValue(el++, oldItems->Value(i));
for (Standard_Integer i = 1; i <= oldItems->Length(); i++)
newItems->SetValue( el++, oldItems->Value(i) );
newItems->SetValue( el, items->Value( items->Length() ) );
shapeRep->SetItems(newItems);
}

View File

@@ -248,6 +248,22 @@ STEPControl_Controller::STEPControl_Controller ()
Interface_Static::Init("step", "read.step.codepage", '&', "eval CP850"); // Resource_FormatType_CP850
Interface_Static::SetCVal("read.step.codepage", "UTF8");
// Tessellated geometry reading: Off by default
Interface_Static::Init("step", "read.step.tessellated", 'e', "");
Interface_Static::Init("step", "read.step.tessellated", '&', "enum 0");
Interface_Static::Init("step", "read.step.tessellated", '&', "eval Off"); // 0
Interface_Static::Init("step", "read.step.tessellated", '&', "eval On"); // 1
Interface_Static::Init("step", "read.step.tessellated", '&', "eval OnNoBRep"); // 2
Interface_Static::SetCVal("read.step.tessellated", "On");
// Tessellated geometry writing: Off by default
Interface_Static::Init("step", "write.step.tessellated", 'e', "");
Interface_Static::Init("step", "write.step.tessellated", '&', "enum 0");
Interface_Static::Init("step", "write.step.tessellated", '&', "eval Off"); // 0
Interface_Static::Init("step", "write.step.tessellated", '&', "eval On"); // 1
Interface_Static::Init("step", "write.step.tessellated", '&', "eval OnNoBRep"); // 2
Interface_Static::SetCVal("write.step.tessellated", "OnNoBRep");
Standard_STATIC_ASSERT((int)Resource_FormatType_CP850 - (int)Resource_FormatType_CP1250 == 18); // "Error: Invalid Codepage Enumeration"
init = Standard_True;