mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-05-15 05:28:47 +08:00
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:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user