1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-31 11:15:31 +03:00
occt/src/StepToTopoDS/StepToTopoDS_TranslateCompositeCurve.cxx
abv 0797d9d30a 0025418: Debug output to be limited to OCC development environment
Macros ending on "DEB" are replaced by OCCT_DEBUG across OCCT code; new macros described in documentation.
Macros starting with DEB are changed to start with "OCCT_DEBUG_".
Some code cleaned.
2014-11-05 16:55:24 +03:00

281 lines
9.2 KiB
C++

// Created on: 1999-02-12
// Created by: Andrey BETENEV
// Copyright (c) 1999-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
//:o3 abv 17.02.99: r0301_db.stp #57082: apply FixReorder to composite curve
//:s5 abv 22.04.99 Adding debug printouts in catch {} blocks
#include <StepToTopoDS_TranslateCompositeCurve.ixx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include <Interface_Static.hxx>
#include <Precision.hxx>
#include <Geom_Curve.hxx>
#include <Geom2d_Curve.hxx>
#include <StepGeom_Pcurve.hxx>
#include <StepGeom_SurfaceCurve.hxx>
#include <StepGeom_PcurveOrSurface.hxx>
#include <StepGeom_CompositeCurveSegment.hxx>
#include <StepToGeom_MakeCurve.hxx>
#include <StepToTopoDS_TranslateEdge.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRep_Builder.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Iterator.hxx>
#include <ShapeExtend_WireData.hxx>
#include <ShapeFix_Wire.hxx>
//=======================================================================
//function : Create
//purpose :
//=======================================================================
StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve () {}
//=======================================================================
//function : Create
//purpose :
//=======================================================================
StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve (
const Handle(StepGeom_CompositeCurve) &CC,
const Handle(Transfer_TransientProcess) &TP)
{
Init ( CC, TP );
}
//=======================================================================
//function : Create
//purpose :
//=======================================================================
StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve (
const Handle(StepGeom_CompositeCurve) &CC,
const Handle(Transfer_TransientProcess) &TP,
const Handle(StepGeom_Surface) &S,
const Handle(Geom_Surface) &Surf)
{
Init ( CC, TP, S, Surf );
}
//=======================================================================
//function : Init
//purpose :
//=======================================================================
Standard_Boolean StepToTopoDS_TranslateCompositeCurve::Init (const Handle(StepGeom_CompositeCurve) &CC,
const Handle(Transfer_TransientProcess) &TP)
{
Handle(StepGeom_Surface) S;
Handle(Geom_Surface) Surf;
return Init ( CC, TP, S, Surf );
}
//=======================================================================
//function : Init
//purpose :
//=======================================================================
Standard_Boolean StepToTopoDS_TranslateCompositeCurve::Init (const Handle(StepGeom_CompositeCurve) &CC,
const Handle(Transfer_TransientProcess) &TP,
const Handle(StepGeom_Surface) &S,
const Handle(Geom_Surface) &Surf)
{
myWire.Nullify();
myInfiniteSegment = Standard_False;
if ( CC.IsNull() ) return Standard_False;
Standard_Boolean SurfMode = ( ! S.IsNull() && ! Surf.IsNull() );
Standard_Boolean isClosed = Standard_False;
if ( SurfMode ) {
Standard_Integer modepcurve = Interface_Static::IVal("read.surfacecurve.mode");
if ( modepcurve ==-3 ) SurfMode = Standard_False;
}
Handle(ShapeExtend_WireData) sbwd = new ShapeExtend_WireData;
Standard_Integer nbs = CC->NbSegments();
for ( Standard_Integer i=1; i <= nbs; i++ ) {
Handle(StepGeom_CompositeCurveSegment) ccs = CC->SegmentsValue ( i );
if ( ccs.IsNull() ) {
TP->AddFail ( CC, "Null segment" );
return Standard_False;
}
Handle(StepGeom_Curve) crv = ccs->ParentCurve();
if ( crv.IsNull() ) {
TP->AddFail ( CC, "Segment has null parent curve" );
return Standard_False;
}
isClosed = ( ccs->Transition() != StepGeom_tcDiscontinuous );
// if segment is itself a composite_curve, translate recursively
if ( crv->IsKind(STANDARD_TYPE(StepGeom_CompositeCurve)) ) {
if ( crv == CC ) { // cyclic reference protection
TP->AddFail (ccs, "Cyclic reference; segment dropped" );
continue;
}
Handle(StepGeom_CompositeCurve) cc = Handle(StepGeom_CompositeCurve)::DownCast ( crv );
if ( ! Init ( cc, TP, S, Surf ) || myWire.IsNull() ) continue;
Standard_Integer nb = sbwd->NbEdges() + 1;
for ( TopoDS_Iterator it ( myWire ); it.More(); it.Next() ) {
TopoDS_Edge edge = TopoDS::Edge ( it.Value() );
if ( ccs->SameSense() ) sbwd->Add ( edge );
else {
edge.Reverse();
sbwd->Add ( edge, nb > sbwd->NbEdges() ? 0 : nb );
}
}
myWire.Nullify();
continue;
}
// ordinary segment
// detect pcurve and 3d curve
Handle(StepGeom_Pcurve) pcurve = Handle(StepGeom_Pcurve)::DownCast ( crv );
if ( pcurve.IsNull() ) {
Handle(StepGeom_SurfaceCurve) sc = Handle(StepGeom_SurfaceCurve)::DownCast ( crv );
if ( ! sc.IsNull() ) {
crv = sc->Curve3d();
if ( SurfMode ) { // find proper pcurve
for ( Standard_Integer j=1; j <= sc->NbAssociatedGeometry(); j++ ) {
StepGeom_PcurveOrSurface PCorS = sc->AssociatedGeometryValue ( j );
Handle(StepGeom_Pcurve) pc = PCorS.Pcurve();
if ( pc.IsNull() || pc->BasisSurface() != S ) continue;
pcurve = pc;
if ( ccs->SameSense() ) break;
}
}
}
}
else {
if ( ! SurfMode || pcurve->BasisSurface() != S ) pcurve.Nullify();
crv.Nullify();
}
// prepare edge
TopoDS_Edge edge;
// translate 3d curve, if present
if ( ! crv.IsNull() ) {
try {
OCC_CATCH_SIGNALS
Handle(Geom_Curve) c3d;
if (StepToGeom_MakeCurve::Convert(crv,c3d)) {
BRepBuilderAPI_MakeEdge MkEdge ( c3d, c3d->FirstParameter(), c3d->LastParameter() );
if (MkEdge.IsDone())
{
if (Precision::IsNegativeInfinite (c3d->FirstParameter()) || Precision::IsPositiveInfinite (c3d->LastParameter()))
{
myInfiniteSegment = Standard_True;
TP->AddWarning (CC, "Segment with infinite parameters");
}
edge = MkEdge.Edge();
}
}
}
catch(Standard_Failure) {
#ifdef OCCT_DEBUG
cout << "Warning: StepToTopoDS_TranslateCompositeCurve: Exception: ";
Standard_Failure::Caught()->Print(cout); cout << endl;
#endif
}
}
// translate pcurve, if available
if ( ! pcurve.IsNull() ) {
try {
OCC_CATCH_SIGNALS
StepToTopoDS_TranslateEdge TrE;
Handle(Geom2d_Curve) c2d = TrE.MakePCurve ( pcurve, Surf );
if ( ! c2d.IsNull() ) {
if ( edge.IsNull() ) {
BRepBuilderAPI_MakeEdge MkEdge ( c2d, Surf, c2d->FirstParameter(), c2d->LastParameter() );
if (MkEdge.IsDone())
{
if (Precision::IsNegativeInfinite (c2d->FirstParameter()) || Precision::IsPositiveInfinite (c2d->LastParameter()))
{
myInfiniteSegment = Standard_True;
TP->AddWarning (CC, "Segment with infinite parameters");
}
edge = MkEdge.Edge();
}
}
else {
BRep_Builder B;
TopLoc_Location L;
B.UpdateEdge ( edge, c2d, Surf, L, 0. );
B.Range ( edge, Surf, L, c2d->FirstParameter(), c2d->LastParameter() );
B.SameRange ( edge, Standard_False );
B.SameParameter ( edge, Standard_False );
}
}
}
catch(Standard_Failure) {
#ifdef OCCT_DEBUG
cout << "Warning: StepToTopoDS_TranslateCompositeCurve: Exception: ";
Standard_Failure::Caught()->Print(cout); cout << endl;
#endif
}
}
if ( edge.IsNull() ) {
TP->AddFail ( crv, "Curve can not be translated");
continue;
}
if ( ! ccs->SameSense() ) edge.Reverse();
sbwd->Add ( edge );
}
if ( sbwd->NbEdges() <=0 ) {
TP->AddFail ( CC, "Translation gives no result" );
return Standard_False;
}
// connect wire; all other fixes are left for caller
Standard_Real preci = Precision();
Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
sfw->Load ( sbwd );
sfw->SetPrecision ( preci );
sfw->ClosedWireMode() = isClosed;
sfw->FixReorder(); //:o3 abv 17 Feb 99: r0301_db.stp #57082
if ( sfw->StatusReorder ( ShapeExtend_DONE ) ) {
TP->AddWarning ( CC, "Segments were disordered; fixed" );
}
sfw->FixConnected ( preci );
if ( sfw->StatusConnected ( ShapeExtend_FAIL ) ) {
TP->AddWarning ( CC, "Segments are not connected" );
}
myWire = sbwd->Wire();
done = ( sbwd->NbEdges() >0 );
return Standard_True;
}
//=======================================================================
//function : Value
//purpose : return resulting wire
//=======================================================================
const TopoDS_Wire& StepToTopoDS_TranslateCompositeCurve::Value () const
{
return myWire;
}