mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-05-31 11:15:31 +03:00
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.
281 lines
9.2 KiB
C++
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;
|
|
}
|