1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-06 18:26:22 +03:00
occt/src/IGESToBRep/IGESToBRep_TopoCurve.cxx
abv 42cf5bc1ca 0024002: Overall code and build procedure refactoring -- automatic
Automatic upgrade of OCCT code by command "occt_upgrade . -nocdl":
- WOK-generated header files from inc and sources from drv are moved to src
- CDL files removed
- All packages are converted to nocdlpack
2015-07-12 07:42:38 +03:00

1468 lines
47 KiB
C++

// 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.
//=======================================================================
//purpose : Members to transfert any IGES Curves into TopoDS_Shape
//=======================================================================
// modif mjm du 23/09/97 : appel a ShapeTool en remplacement a PCurveLib
// 21.12.98 rln, gka S4054
//%11 12.01.99 pdn CTS22023 reversing direction when reading offset curves
//:q5 abv 19.03.99 unnecessary includes removed
//%14 03.03.99 pdn USA60022 do not insert lacking edge before fix missing seam
// pdn 10.03.99 S4135 Creating vertices using minimal tolerance.
//S4181 pdn 17.04.99 Inplementing of reading IGES elementary surfaces. Transform
//pcurves using gp_Trsf2d that depends on type of pair (IGES surface, resulting
//CAS.CADE surface)
//szv#9:PRO19565:04Oct99 missing location for standalone vertices corrected
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepLib_MakeFace.hxx>
#include <BRepTools.hxx>
#include <Geom2d_BSplineCurve.hxx>
#include <Geom2d_Curve.hxx>
#include <Geom2d_OffsetCurve.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <Geom_BSplineCurve.hxx>
#include <Geom_Curve.hxx>
#include <Geom_OffsetCurve.hxx>
#include <Geom_Plane.hxx>
#include <Geom_Surface.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <gp.hxx>
#include <gp_Dir.hxx>
#include <gp_GTrsf.hxx>
#include <gp_Pnt.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Trsf2d.hxx>
#include <gp_XY.hxx>
#include <IGESData_HArray1OfIGESEntity.hxx>
#include <IGESData_IGESEntity.hxx>
#include <IGESData_IGESModel.hxx>
#include <IGESData_ToolLocation.hxx>
#include <IGESGeom_Boundary.hxx>
#include <IGESGeom_CircularArc.hxx>
#include <IGESGeom_CompositeCurve.hxx>
#include <IGESGeom_CurveOnSurface.hxx>
#include <IGESGeom_OffsetCurve.hxx>
#include <IGESGeom_Point.hxx>
#include <IGESGeom_SplineCurve.hxx>
#include <IGESToBRep.hxx>
#include <IGESToBRep_AlgoContainer.hxx>
#include <IGESToBRep_BasicCurve.hxx>
#include <IGESToBRep_BasicSurface.hxx>
#include <IGESToBRep_CurveAndSurface.hxx>
#include <IGESToBRep_IGESBoundary.hxx>
#include <IGESToBRep_ToolContainer.hxx>
#include <IGESToBRep_TopoCurve.hxx>
#include <IGESToBRep_TopoSurface.hxx>
#include <Interface_Macros.hxx>
#include <Message_Msg.hxx>
#include <Precision.hxx>
#include <ShapeAlgo.hxx>
#include <ShapeAlgo_AlgoContainer.hxx>
#include <ShapeBuild_Edge.hxx>
#include <ShapeExtend_WireData.hxx>
#include <ShapeFix_Wire.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include <TColGeom2d_HSequenceOfBoundedCurve.hxx>
#include <TColGeom_HSequenceOfBoundedCurve.hxx>
#include <TColgp_Array1OfPnt.hxx>
#include <TColgp_Array1OfPnt2d.hxx>
#include <TCollection_HAsciiString.hxx>
#include <TopAbs.hxx>
#include <TopLoc_Location.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
#include <stdio.h>
//added by rln 32/12/97
//#include <TColStd_Array1OfInteger.hxx>
//#include <TColStd_Array1OfReal.hxx>
//#include <TColStd_HSequenceOfTransient.hxx>
//=======================================================================
//function : IGESToBRep_TopoCurve
//purpose :
//=======================================================================
IGESToBRep_TopoCurve::IGESToBRep_TopoCurve()
:IGESToBRep_CurveAndSurface()
{
}
//=======================================================================
//function : IGESToBRep_TopoCurve
//purpose :
//=======================================================================
IGESToBRep_TopoCurve::IGESToBRep_TopoCurve (const IGESToBRep_TopoCurve& other)
:IGESToBRep_CurveAndSurface (other)
{
TheCurves.Assign(other.TheCurves);
TheCurves2d.Assign(other.TheCurves2d);
}
//=======================================================================
//function : IGESToBRep_TopoCurve
//purpose :
//=======================================================================
IGESToBRep_TopoCurve::IGESToBRep_TopoCurve
(const IGESToBRep_CurveAndSurface& CS)
:IGESToBRep_CurveAndSurface(CS)
{
}
//=======================================================================
//function : IGESToBRep_TopoCurve
//purpose :
//=======================================================================
IGESToBRep_TopoCurve::IGESToBRep_TopoCurve
(const Standard_Real eps,
const Standard_Real epsCoeff,
const Standard_Real epsGeom,
const Standard_Boolean mode,
const Standard_Boolean modeapprox,
const Standard_Boolean optimized)
:IGESToBRep_CurveAndSurface(eps, epsCoeff, epsGeom, mode, modeapprox,
optimized)
{
}
//=======================================================================
//function : TransferPoint
//purpose :
//=======================================================================
TopoDS_Vertex IGESToBRep_TopoCurve::TransferPoint
(const Handle(IGESGeom_Point)& start)
{
TopoDS_Vertex V1;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005");
SendFail(start, Msg1005); //"Point Transfer Error : Null IGESEntity"
//AddFail(start, "Point Transfer Error : Null IGESEntity");
return V1;
}
BRep_Builder B;
gp_Pnt point;
if (!GetModeTransfer() && start->HasTransf())
point = start->TransformedValue();
else
point = start->Value();
point.Scale(gp_Pnt(0,0,0),GetUnitFactor());
B.MakeVertex(V1, point, Precision::Confusion());//S4135: GetEpsGeom()*GetUnitFactor()
//szv#9:PRO19565:04Oct99
if (GetModeTransfer() && start->HasTransf()) {
gp_Trsf T;
SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation
(GetEpsilon(),start->CompoundLocation(),T,GetUnitFactor())) {
TopLoc_Location L(T);
V1.Move(L);
}
}
return V1;
}
//=======================================================================
//function : Transfer2dPoint
//purpose :
//=======================================================================
TopoDS_Vertex IGESToBRep_TopoCurve::Transfer2dPoint
(const Handle(IGESGeom_Point)& start)
{
TopoDS_Vertex V1;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005");//"2D Point Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
// AddFail(start, "2D Point Transfer Error : Null IGESEntity");
return V1;
}
BRep_Builder B;
gp_Pnt point;
if (!GetModeTransfer() && start->HasTransf())
point = gp_Pnt(start->TransformedValue().X(),
start->TransformedValue().Y(),
0.);
else
point = gp_Pnt(start->Value().X(),
start->Value().Y(),
0.);
B.MakeVertex(V1, point, Precision::Confusion());//S4135: GetEpsCoeff()
return V1;
}
//=======================================================================
//function : TransferCompositeCurveGeneral
//purpose : General transfer for both 2d and 3d cases
//=======================================================================
//:13 by abv 13 Nov 97: common part of two methods (see below)
TopoDS_Shape IGESToBRep_TopoCurve::TransferCompositeCurveGeneral(const Handle(IGESGeom_CompositeCurve)& start,
const Standard_Boolean is2d,
const TopoDS_Face& face,
const gp_Trsf2d& trans,
const Standard_Real uFact)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"CompositeCurve Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
// AddFail(start, "CompositeCurve Transfer Error : Null IGESEntity");
return res;
}
Standard_Real precision = GetEpsGeom() * GetUnitFactor(), maxtol = GetMaxTol();
Handle(ShapeExtend_WireData) sewd = new ShapeExtend_WireData();
Handle(ShapeAnalysis_Wire) saw = new ShapeAnalysis_Wire;
saw->Load (sewd);
saw->SetPrecision (precision);
for (Standard_Integer i=1; i<= start->NbCurves(); i++) {
Handle(IGESData_IGESEntity) IgesEnt = start->Curve(i);
//added by rln 26/12/97 CSR# UKI60028 entity 3117
if (i > 1 && IgesEnt == start->Curve (i-1)) {
// char mess[80];
Message_Msg Msg1045("IGES_1045"); //"The entities of the CompositeCurve are the same: %d & %d"
Msg1045.Arg(i);
SendWarning(start,Msg1045);
//sprintf (mess, "The entities of the CompositeCurve are the same: %d & %d", i-1, i);
//AddWarning (start, mess);
continue;
}
if (IgesEnt.IsNull()) {
Message_Msg Msg1040("IGES_1040");//"Curve%dd is a null object : number %d"
Msg1040.Arg(i);
SendFail(start,Msg1040);
return res;
}
if (is2d && (IgesEnt->IsKind(STANDARD_TYPE(IGESGeom_Boundary)) ||
IgesEnt->IsKind(STANDARD_TYPE(IGESGeom_CurveOnSurface)) ) ) {
//AddWarning(start, "Entity cannot be built from a boundary.");
Message_Msg Msg1040("IGES_1040");//"Entity cannot be built from a boundary."
Msg1040.Arg(i);
SendFail(start,Msg1040);
return res;
}
else if (IGESToBRep::IsTopoCurve(IgesEnt)) {
TopoDS_Shape shape; //:13 = TransferTopoCurve(IgesEnt);
if ( is2d ) shape = Transfer2dTopoCurve ( IgesEnt, face, trans, uFact ); //:13
else shape = TransferTopoCurve ( IgesEnt ); //:13
if (!shape.IsNull()){
if (shape.ShapeType() == TopAbs_VERTEX) continue;
Handle(ShapeExtend_WireData) nextsewd = new ShapeExtend_WireData;
nextsewd->Add (shape);
Standard_Real distmin;
Standard_Boolean revsewd, revnextsewd;
Standard_Boolean isConnected = ShapeAlgo::AlgoContainer()->ConnectNextWire (saw, nextsewd, maxtol, distmin,
revsewd, revnextsewd);
if (isConnected) {
if (revsewd) {
Message_Msg Msg1051("IGES_1051"); //"All curvAll curves %dd before rank %d have been to be reversed."
Msg1051.Arg((is2d ? 2 : 3));
Msg1051.Arg(i);
SendWarning(start,Msg1051);
}
if (revnextsewd) {
Message_Msg Msg1050("IGES_1050"); //"Curve %dd needs to be reversed : %d"
Msg1050.Arg((is2d ? 2 : 3));
Msg1050.Arg(i);
SendWarning(start,Msg1050);
// sprintf(mess, "Curve %dd needs to be reversed : %d", ( is2d ? 2 : 3 ), i);//:13
// AddWarning(start, mess);
}
if (distmin > precision) {
Message_Msg Msg1055("IGES_1055");
Msg1055.Arg((is2d ? 2 : 3));
Msg1055.Arg(i);
SendWarning(start,Msg1055);
}
}
else {
Message_Msg Msg1060("IGES_1060"); //"Curves %dd are too much disconnected : %d & %d"
Msg1060.Arg((is2d ? 2 : 3));
Msg1060.Arg(i);
SendFail(start,Msg1060);
return res;
}
}
}
}
Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
sfw->Load (sewd);
sfw->ClosedWireMode() = Standard_False;//closing of face boundaries will be later
sfw->FixConnected (maxtol);
sfw->FixConnected (1, precision);//10.12.98 CTS18953 entity 14 (Plane+CompositeCurve)
res = sewd->Wire();
SetShapeResult (start, res);
return res;
}
//=======================================================================
//function : TransferCompositeCurve
//purpose : Implementation for 3d case
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferCompositeCurve
(const Handle(IGESGeom_CompositeCurve)& start)
{
TopoDS_Shape res;
TopoDS_Face f;
gp_Trsf trans;
res = TransferCompositeCurveGeneral ( start, Standard_False, f, trans, 1.);
if ( ! res.IsNull() && start->HasTransf()) {
gp_Trsf T;
SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation
(GetEpsilon(),start->CompoundLocation(),T,GetUnitFactor())) {
TopLoc_Location L(T);
res.Move(L);
}
else {
Message_Msg Msg1035("IGES_1035");
SendWarning(start,Msg1035);
}
// AddWarning(start, "Transformation skipped (not a similarity)");
}
return res;
}
//=======================================================================
//function : Transfer2dCompositeCurve
//purpose : Implementation for 2d case
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::Transfer2dCompositeCurve
(const Handle(IGESGeom_CompositeCurve)& start,
const TopoDS_Face& face,
const gp_Trsf2d& trans,
const Standard_Real uFact)
{
TopoDS_Shape res;
res = TransferCompositeCurveGeneral ( start, Standard_True, face, trans, uFact);
// Message occur if needed in TransferCompositeCurveGeneral
//if (start->HasTransf()) {
// Message_Msg Msg1036("IGES_1036"); //"The Trsf cannot be applied to the entity."
// SendWarning(start,Msg1036);
// AddWarning(start, "The Trsf cannot be applied to the entity.");
//}
return res;
}
//=======================================================================
//function : TransferCurveOnSurface
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferCurveOnSurface
(const Handle(IGESGeom_CurveOnSurface)& start)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005");
SendFail(start,Msg1005);
// AddFail(start, "CurveOnSurface Transfer Error : Null IGESEntity");
return res;
}
TopoDS_Face face;
Handle (IGESData_IGESEntity) igesSurface = start->Surface();
if (igesSurface.IsNull() || !IGESToBRep::IsTopoSurface(igesSurface)) {
Message_Msg Msg131("XSTEP_131"); //"BasicSurface Transfer Error : Null IGESEntity"
SendFail(start,Msg131);
//AddFail(start, "BasicSurface Transfer Error : Null IGESEntity");
return res;
}
TopAbs_ShapeEnum shapeEnum;
IGESToBRep_TopoSurface TS(*this);
gp_Trsf2d trans;
Standard_Real uFact;
TopoDS_Shape myshape = TS.ParamSurface (igesSurface, trans, uFact);
if (!myshape.IsNull()) {
shapeEnum = myshape.ShapeType();
switch (shapeEnum) {
case TopAbs_FACE :
{
face = TopoDS::Face(myshape);
break;
}
case TopAbs_SHELL :
{
TopoDS_Iterator IT(myshape);
Standard_Integer nbfaces = 0;
for (; IT.More(); IT.Next()) {
nbfaces++;
face = TopoDS::Face(IT.Value());
}
//szv#4:S4163:12Mar99 optimized
if (nbfaces != 1) {
if (!start->Curve3D().IsNull()) {
if (IGESToBRep::IsTopoCurve(start->Curve3D())) {
TopoDS_Shape Sh = TransferTopoCurve(start->Curve3D());
if (!Sh.IsNull()) {
Message_Msg Msg1062("IGES_1062");
//CurveOnSurface on Composite Surface case not implemented : 3D representation returned.
SendWarning(start,Msg1062);
res = Sh;
}
}
}
else {
Message_Msg Msg1061("IGES_1061");
Msg1061.Arg("CurveOnSurface");
SendFail(start,Msg1061);
}
return res;
}
}
break;
default:
{
if (!start->Curve3D().IsNull()) {
if (IGESToBRep::IsTopoCurve(start->Curve3D())) {
TopoDS_Shape Sh = TransferTopoCurve(start->Curve3D());
if (!Sh.IsNull()) {
Message_Msg Msg1062("IGES_1062"); //"Basis Surface Error : 3dCurve returned"
SendWarning(start,Msg1062);
// AddWarning(start,"Basis Surface Error : 3dCurve returned");
res = Sh;
}
}
}
else {
Message_Msg Msg1061("IGES_1061");
Msg1061.Arg("CurveOnSurface");
SendFail(start,Msg1061);
}
// AddFail(start, "Basis Surface Error.");
return res;
}
}
}
face.EmptyCopy();
res = TransferCurveOnFace (face, start, trans, uFact, Standard_True);
return res;
}
//=======================================================================
//function : TransferCurveOnFace
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferCurveOnFace(TopoDS_Face& face,
const Handle(IGESGeom_CurveOnSurface)& start,
const gp_Trsf2d& trans,
const Standard_Real uFact,
const Standard_Boolean isCurveOnSurf)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"CurveOnFace Transfer Error : Null IGESEntity"
SendFail(start,Msg1005);
return res;
}
Standard_Boolean okCurve = Standard_True, okCurve3d = Standard_True, okCurve2d = Standard_True;
Standard_Integer filepreference = 0;
if (start->PreferenceMode() == 1) filepreference = 2;
else if (start->PreferenceMode() == 2) filepreference = 3;
Handle(IGESData_HArray1OfIGESEntity) Curves2d = new IGESData_HArray1OfIGESEntity (1, 1);
Curves2d->SetValue (1, start->CurveUV());
Handle(IGESToBRep_IGESBoundary) IB = IGESToBRep::AlgoContainer()->ToolContainer()->IGESBoundary();
IB->Init (*this, start, face, trans, uFact, filepreference);
Standard_Boolean Result = IB->Transfer (okCurve, okCurve3d, okCurve2d,
start->Curve3D(), Standard_False,
Curves2d, 1);
IB->Check(Result, !isCurveOnSurf, okCurve3d, okCurve2d);
Handle(ShapeExtend_WireData) sewd = IB->WireData();
if (sewd->NbEdges() == 0) {
Message_Msg Msg1095("IGES_1095");//"Both 2d and 3d representations are invalid"
SendFail(start,Msg1095);
return res;
}
//%14 pdn 03.03.99
//IB.Fix (sewd, Standard_True, !isCurveOnSurf, Standard_False, Standard_False, Standard_False);
TopoDS_Wire mywire = sewd->Wire();
if (start->HasTransf()) {
gp_Trsf T;
SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation
(GetEpsilon(),start->CompoundLocation(),T)) {
TopLoc_Location L(T);
mywire.Move(L);
}
else {
Message_Msg Msg1035("IGES_1035"); //"Transformation skipped (not a similarity)"
SendWarning(start,Msg1035);
}
}
BRepLib_MakeFace MF(face);
MF.Add(mywire);
face = MF.Face();
SetShapeResult (start, mywire);
return mywire;
}
//=======================================================================
//function : TransferOffsetCurve
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferOffsetCurve
(const Handle(IGESGeom_OffsetCurve)& start)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"Offset Curve Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
//AddFail(start, "OffsetCurve Transfer Error : Null IGESEntity");
return res;
}
if (start->OffsetType() != 1) {
Message_Msg Msg1100("IGES_1100"); //"Offset distance flag different from 1 not treated"
SendFail(start,Msg1100);
//AddFail(start, "Offset distance flag different from 1 not treated");
return res;
}
Standard_Real Offset = start->FirstOffsetDistance();
gp_Dir NrmDir;
if (start->HasTransf())
NrmDir = start->TransformedNormalVector();
else
NrmDir = start->NormalVector();
//%11 pdn 12.01.99 CTS22023
NrmDir.Reverse();
Handle(IGESData_IGESEntity) BaseCrv = start->BaseCurve();
while (BaseCrv->IsKind(STANDARD_TYPE(IGESGeom_OffsetCurve))) {
DeclareAndCast(IGESGeom_OffsetCurve, OffCrv, BaseCrv);
if (OffCrv->OffsetType() != 1) {
Message_Msg Msg1100("IGES_1100"); //"Offset distance flag different from 1 not treated"
SendFail(start,Msg1100);
return res;
}
BaseCrv = OffCrv->BaseCurve();
Offset = Offset + OffCrv->FirstOffsetDistance();
}
if (!IGESToBRep::IsTopoCurve(BaseCrv)) {
Message_Msg Msg110("XSTEP_110");
SendFail(start,Msg110);
return res;
}
Handle(Geom_Curve) Crv;
Handle(Geom_OffsetCurve) OffCrv;
IGESToBRep_TopoCurve TC(*this);
TopoDS_Shape Sh = TC.TransferTopoCurve(BaseCrv);
if (Sh.IsNull() || ! ((Sh.ShapeType() == TopAbs_EDGE) || (Sh.ShapeType() == TopAbs_WIRE)) ) {
Message_Msg Msg1156("IGES_1156");
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(BaseCrv);
Msg1156.Arg("basis curve");
Msg1156.Arg(label);
SendFail(start,Msg1156);
//AddFail(start, "Edge or wire expected from TransferTopoCurve");
return res;
}
if (Sh.ShapeType() == TopAbs_EDGE) {
TopLoc_Location aLoc;
Standard_Real a, b;
Crv = BRep_Tool::Curve(TopoDS::Edge(Sh), aLoc, a, b);
OffCrv = new Geom_OffsetCurve(Crv,Offset,NrmDir);
BRepBuilderAPI_MakeEdge ME(OffCrv,start->StartParameter(),start->EndParameter());
if (!ME.IsDone()) {
Message_Msg Msg1005("IGES_1005"); //"Edge construction error"
SendFail(start,Msg1005);
//AddFail(start, "Edge construction error");
return res;
}
TopoDS_Edge anEdge = ME.Edge();
anEdge.Move(aLoc);
res = anEdge;
}
else if (Sh.ShapeType() == TopAbs_WIRE) {
Handle(ShapeExtend_WireData) sewd = new ShapeExtend_WireData;
TopoDS_Wire aWire = TopoDS::Wire(Sh);
Standard_Boolean begin = Standard_True;
Standard_Real length = 0.0;
Standard_Real staPar = start->StartParameter();
Standard_Real endPar = start->EndParameter();
for (TopoDS_Iterator Iter(aWire); Iter.More(); Iter.Next()) {
TopoDS_Edge anEdge = TopoDS::Edge(Iter.Value());
TopLoc_Location aLoc;
Standard_Real first, last;
Crv = BRep_Tool::Curve(anEdge, aLoc, first, last);
if ((length + last - first) <= staPar) continue;
if (length >= endPar) {
if (begin) {
Message_Msg Msg1105("IGES_1105"); //"Cannot build a ruled surface from these curves."
SendFail(start,Msg1105);
//AddFail(start, "Cannot build a ruled surface from these curves.");
return res;
}
break;
}
OffCrv = new Geom_OffsetCurve(Crv,Offset,NrmDir);
BRepBuilderAPI_MakeEdge ME(OffCrv, staPar - length, endPar - length);
if (!ME.IsDone()) {
Message_Msg Msg1005("IGES_1005"); //"Edge construction error"
SendFail(start,Msg1005);
//AddFail(start, "Edge construction error");
return res;
}
TopoDS_Edge anotherEdge = ME.Edge();
anotherEdge.Move(aLoc);
begin = Standard_False;
length += last - first;
sewd->Add (anotherEdge);
}
Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
sfw->Load (sewd);
//pdn S4135 10.03.99
//sfw.FixConnected (GetEpsGeom() * GetUnitFactor());
sfw->FixConnected ();
res = sfw->Wire();
}
if (start->HasTransf()) {
gp_Trsf T;
SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation
(GetEpsilon(),start->CompoundLocation(),T,GetUnitFactor())) {
TopLoc_Location L(T);
res.Move(L);
}
else {
Message_Msg Msg1035("IGES_1035");
SendWarning(start,Msg1035);
}
//AddWarning(start, "Transformation skipped (not a similarity)");
}
return res;
}
//=======================================================================
//function : Transfer2dOffsetCurve
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::Transfer2dOffsetCurve
(const Handle(IGESGeom_OffsetCurve)& start,
const TopoDS_Face& face,
const gp_Trsf2d& trans,
const Standard_Real uFact)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"Offset Curve Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
//AddFail(start, "2D OffsetCurve Transfer Error : Null IGESEntity");
return res;
}
if (start->OffsetType() != 1) {
Message_Msg Msg1100("IGES_1100"); //"Offset distance flag different from 1 not treated"
SendFail(start,Msg1100);
}
// AddWarning(start, "Offset distance flag different from 1 not properly treated");
Standard_Real Offset = start->FirstOffsetDistance();
Handle(IGESData_IGESEntity) BaseCrv = start->BaseCurve();
Handle(Geom2d_Curve) Crv;
Handle(Geom2d_OffsetCurve) OffCrv;
if (IGESToBRep::IsTopoCurve(BaseCrv)) {
IGESToBRep_TopoCurve TC(*this);
TC.SetModeTransfer(Standard_False);
TopoDS_Shape Sh = TC.Transfer2dTopoCurve(BaseCrv, face, trans, uFact);
if (Sh.IsNull() || !( (Sh.ShapeType()==TopAbs_EDGE) ||(Sh.ShapeType()==TopAbs_WIRE)) ) {
Message_Msg Msg1156("IGES_1156"); //"Edge or wire expected from TransferTopoCurve"
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(BaseCrv);
Msg1156.Arg("2D basis curve");
Msg1156.Arg(label);
SendFail(start,Msg1156);
return res;
}
if (Sh.ShapeType()==TopAbs_EDGE) {
Handle(Geom_Surface) Srf;
TopLoc_Location aLoc;
Standard_Real a, b;
BRep_Tool::CurveOnSurface(TopoDS::Edge(Sh), Crv, Srf, aLoc, a, b);
OffCrv = new Geom2d_OffsetCurve(Crv,Offset * uFact);
TopoDS_Edge anEdge;
ShapeBuild_Edge().MakeEdge (anEdge, OffCrv, face, start->StartParameter(), start->EndParameter());
if (anEdge.IsNull()/*!ME.IsDone()*/) {
Message_Msg Msg1005("IGES_1005"); //"Edge construction error"
SendFail(start,Msg1005);
return res;
}
res = anEdge;
}
else if (Sh.ShapeType()==TopAbs_WIRE) {
TopoDS_Wire aWire = TopoDS::Wire(Sh);
Handle(ShapeExtend_WireData) sewd = new ShapeExtend_WireData;
for (TopoDS_Iterator Iter(aWire); Iter.More(); Iter.Next()) {
TopoDS_Edge anEdge = TopoDS::Edge(Iter.Value());
Handle(Geom_Surface) Srf;
TopLoc_Location aLoc;
Standard_Real a, b;
BRep_Tool::CurveOnSurface(anEdge, Crv, Srf, aLoc, a, b);
OffCrv = new Geom2d_OffsetCurve(Crv,Offset * uFact);
TopoDS_Edge anotherEdge;
ShapeBuild_Edge().MakeEdge (anotherEdge, OffCrv, face, start->StartParameter(), start->EndParameter());
if (anotherEdge.IsNull()/*!ME.IsDone()*/) {
Message_Msg Msg1005("IGES_1005"); //"Edge construction error"
SendFail(start,Msg1005);
return res;
}
sewd->Add (anotherEdge);
}
Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
sfw->Load (sewd);
//pdn 10.03.99
//sfw.FixConnected (GetEpsGeom() * GetUnitFactor());
sfw->FixConnected ();
res = sfw->Wire();
}
}
return res;
}
//=======================================================================
//function : TransferTopoCurve
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferTopoCurve
(const Handle(IGESData_IGESEntity)& start)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"TopoCurve Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
//AddFail(start, "TopoCurve Transfer Error : Null IGESEntity");
return res;
}
//S4054
if (IGESToBRep::IsBasicCurve(start)) {
res = TransferTopoBasicCurve(start);
}
else if (start->IsKind(STANDARD_TYPE(IGESGeom_CompositeCurve))) {
DeclareAndCast(IGESGeom_CompositeCurve, st102, start);
res = TransferCompositeCurve(st102);
}
else if (start->IsKind(STANDARD_TYPE(IGESGeom_CurveOnSurface))) {
DeclareAndCast(IGESGeom_CurveOnSurface, st142, start);
res = TransferCurveOnSurface(st142);
}
else if (start->IsKind(STANDARD_TYPE(IGESGeom_Boundary))) {
DeclareAndCast(IGESGeom_Boundary, st141, start);
res = TransferBoundary(st141);
}
else if (start->IsKind(STANDARD_TYPE(IGESGeom_Point))) {
DeclareAndCast(IGESGeom_Point, st116, start);
res = TransferPoint(st116);
}
else if (start->IsKind(STANDARD_TYPE(IGESGeom_OffsetCurve))) {
DeclareAndCast(IGESGeom_OffsetCurve, st130, start);
res = TransferOffsetCurve(st130);
}
else {
// This message can not occur.
//"Improper type provided to TransferTopoCurve"
}
return res;
}
//=======================================================================
//function : Transfer2dTopoCurve
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::Transfer2dTopoCurve(const Handle(IGESData_IGESEntity)& start,
const TopoDS_Face& face,
const gp_Trsf2d& trans,
const Standard_Real uFact)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"2d TopoCurve Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
// AddFail(start, "2D TopoCurve Transfer Error : Null IGESEntity");
return res;
}
//S4054
if (IGESToBRep::IsBasicCurve(start))
res = Transfer2dTopoBasicCurve(start, face, trans, uFact);
else if (start->IsKind(STANDARD_TYPE(IGESGeom_CompositeCurve))) {
DeclareAndCast(IGESGeom_CompositeCurve, st102, start);
res = Transfer2dCompositeCurve(st102, face, trans, uFact);
}
else if (start->IsKind(STANDARD_TYPE(IGESGeom_Point))) {
DeclareAndCast(IGESGeom_Point, st116, start);
res = Transfer2dPoint(st116);
}
else if (start->IsKind(STANDARD_TYPE(IGESGeom_OffsetCurve))) {
DeclareAndCast(IGESGeom_OffsetCurve, st130, start);
res = Transfer2dOffsetCurve(st130, face, trans, uFact);
}
return res;
}
//=======================================================================
//function : TransferTopoBasicCurve
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferTopoBasicCurve
(const Handle(IGESData_IGESEntity)& start)
{
TopoDS_Shape myshape;
TopoDS_Edge myedge;
// TopoDS_Vertex V1,V2;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"TopoBasicCurve Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
//AddFail(start, "TopoBasicCurve Transfer Error : Null IGESEntity");
return myshape;
}
IGESToBRep_BasicCurve BC(*this);
// 14.05.2009 skl for OCC21131
BC.SetModeTransfer(Standard_False);
Handle(Geom_Curve) C = BC.TransferBasicCurve(start);
if (C.IsNull()) {
// A message has been thrown in TransferBasicCurve
return myshape;
}
// si la courbe est une BSpline de degre 1, et si l`utilisateur
// le souhaite, on approxime
TheCurves.Clear();
if ((C->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))&& GetModeApprox()) {
Handle(Geom_BSplineCurve) BSplineC = Handle(Geom_BSplineCurve)::DownCast(C);
if (BSplineC->Degree() == 1)
ApproxBSplineCurve(BSplineC);
else
TheCurves.Append(C);
}
else
TheCurves.Append(C);
// Si la courbe est une BSpline, il ne faut pas qu`elle soit C0.
// sinon inutilisable dans les algos de topologie ...
// on construit un wire avec des morceaux de courbes C1.
Standard_Integer nbcurves = NbCurves();
if ( nbcurves == 0 ) {
Message_Msg Msg1156("IGES_1156"); //"TopoBasicCurve Transfer Error : Null Entity"
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
Msg1156.Arg("Geom_Curve");
Msg1156.Arg(label);
SendFail(start,Msg1156);
return myshape;
}
// Standard_Real epsgeom = GetEpsGeom()*GetUnitFactor();
Handle(ShapeExtend_WireData) sewd = new ShapeExtend_WireData;
for (Standard_Integer icurve = 1; icurve <= nbcurves; icurve++) {
Handle(Geom_Curve) mycurve = Curve(icurve);
if ((mycurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
&& (mycurve->Continuity() < GeomAbs_C1)
&& GetContinuity() >= 1) {
Handle(Geom_BSplineCurve) BSplineC =
Handle(Geom_BSplineCurve)::DownCast(mycurve);
Handle(TColGeom_HSequenceOfBoundedCurve) seqBS;
ShapeAlgo::AlgoContainer()->C0BSplineToSequenceOfC1BSplineCurve (BSplineC, seqBS);
Standard_Integer NbC0 = seqBS->Length();
for (Standard_Integer i = 1; i <= NbC0; i++) {
BRepBuilderAPI_MakeEdge ME (seqBS->Value (i));
if (!ME.IsDone()) {
Message_Msg Msg1005("IGES_1005");
SendFail(start,Msg1005);
// AddFail(start, "Edge construction error");
return myshape;
}
myedge = ME.Edge();
sewd->Add (myedge);
}
}
else {
Standard_Real a = mycurve->FirstParameter(), b = mycurve->LastParameter();
if (mycurve->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) {
Handle(Geom_TrimmedCurve) tmp = Handle(Geom_TrimmedCurve)::DownCast (mycurve);
mycurve = tmp->BasisCurve();
}
BRepBuilderAPI_MakeEdge ME (mycurve, a, b);
if (!ME.IsDone() || (Precision::IsInfinite(a) || Precision::IsInfinite(b))) {
Message_Msg Msg1005("IGES_1005");
SendFail(start,Msg1005);
//AddFail(start, "Edge construction error");
return myshape;
}
myedge = ME.Edge();
sewd->Add (myedge);
}
}
Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
sfw->Load (sewd);
//pdn 10.03.99 S4135 Using mintol
//sfw.FixConnected (epsgeom);
sfw->FixConnected ();
myshape = sewd->Wire();
//S4054 PRO11414-1.igs entities 56, 80 (self-intersection is hidden only when
//tolerance of vertices is resolution of IGES file)
// ShapeAnalysis::FindBounds (myshape, V1, V2);
// BRep_Builder B;
// B.UpdateVertex (V1, epsgeom);
// B.UpdateVertex (V2, epsgeom);
// 14.05.2009 skl for OCC21131
// 15.03.2011 emv for OCC22294 begin
Standard_Boolean bIsNeedTransf = start->IsKind(STANDARD_TYPE(IGESGeom_SplineCurve));
if (start->HasTransf() && bIsNeedTransf) {
gp_Trsf T;
SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation
(GetEpsilon(),start->CompoundLocation(),T, GetUnitFactor())) {
TopLoc_Location L(T);
myshape.Move(L);
}
else {
Message_Msg Msg1035("IGES_1035");
SendWarning(start,Msg1035);
}
//AddWarning(start, "Transformation skipped (not a similarity)");
}
//15.03.2011 emv for OCC22294 end
// debug mjm du 26/07/96 en attendant developpement meilleur
// sur traitement des Wire et non des Edge dans les programmes appelant
if (sewd->NbEdges() != 1) {
//S4054 TheBadCase = Standard_True; //:27
Message_Msg Msg1120("IGES_1120");// "Wire not always implemented."
SendWarning(start,Msg1120);
// AddWarning(start, "Wire not always implemented.");
return myshape;
}
else
myedge = TopoDS::Edge (TopoDS_Iterator (myshape).Value());
//added by rln 23/12/97 CSR# UKI60155 entity 208 (CircularArc)
//if Starting and Terminating point are the same this can be caused by either error in the file
//(curve with null length) or normal situation (period 2*PI). It is better to look at
// 2d representation
if (start->IsKind(STANDARD_TYPE(IGESGeom_CircularArc)) &&
Handle(IGESGeom_CircularArc)::DownCast (start)->IsClosed())
TheBadCase = Standard_True;
return myedge;
}
//=======================================================================
//function : Transfer2dTopoBasicCurve
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::Transfer2dTopoBasicCurve
(const Handle(IGESData_IGESEntity)& start,
const TopoDS_Face& face,
const gp_Trsf2d& trans,
const Standard_Real uFact)
{
TopoDS_Edge edge, myedge;
TopoDS_Shape myshape;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"2D TopoBasicCurve Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
// AddFail(start, "2D TopoBasicCurve Transfer Error : Null IGESEntity");
return edge;
}
TopLoc_Location L;
Handle(Geom_Surface) mysurf = BRep_Tool::Surface(face, L);
IGESToBRep_BasicCurve BC(*this);
BC.SetModeTransfer(Standard_False);
// The Trsf must be applied to the Curve2d.
Handle(Geom2d_Curve) C2d = BC.Transfer2dBasicCurve(start);
if (C2d.IsNull()) {
// A message has been thrown in Transfer2dBasicCurve
//AddFail(start, "Conversion error");
return edge;
}
// si la courbe est une BSpline de degre 1, on approxime
TheCurves2d.Clear();
if ((C2d->IsKind(STANDARD_TYPE(Geom2d_BSplineCurve)))&& GetModeApprox()){
Handle(Geom2d_BSplineCurve) BSplineC2d =
Handle(Geom2d_BSplineCurve)::DownCast(C2d);
if (BSplineC2d->Degree() == 1)
Approx2dBSplineCurve(BSplineC2d);
else
TheCurves2d.Append(C2d);
}
else
TheCurves2d.Append(C2d);
// Si la courbe est une BSpline, il ne faut pas qu`elle soit C0.
// on construit un wire avec des morceaux de courbes C1.
Standard_Integer nbcurves = NbCurves2d();
if ( nbcurves == 0 ) {
Message_Msg Msg1156("IGES_1156"); //"2dTopoBasicCurve Transfer Error : Null Entity"
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
Msg1156.Arg("Geom2d_Curve");
Msg1156.Arg(label);
SendFail(start,Msg1156);
//AddFail(start, "2dTopoBasicCurve Transfer Error : Null Entity");
return myshape;
}
// Standard_Real epsgeom = GetEpsGeom()*GetUnitFactor();
//S4054 Standard_Real epscoeff = GetEpsCoeff();
Handle(ShapeExtend_WireData) sewd = new ShapeExtend_WireData;
for (Standard_Integer icurve = 1; icurve <= nbcurves; icurve++) {
Handle(Geom2d_Curve) mycurve2d = Curve2d(icurve);
//S4054 November 98 Transformation of pcurve in a single place
//(taken from Compute2d3d and Compute2d)
/* if (isrev) {
//#30 rln 19.10.98 transformation of pcurves for IGES Surface of Revolution
mycurve2d ->Translate (gp_Vec2d (0, -2 * M_PI));
mycurve2d->Mirror (gp::OX2d());
mycurve2d->Mirror (gp_Ax2d (gp::Origin2d(), gp_Dir2d (1.,1.)));
gp_Trsf2d TR;
TR.SetTranslation (gp_Pnt2d (0.,0.),gp_Pnt2d (-paramu,0.));
mycurve2d->Transform (TR);
}
if (paramv != 0.) {
gp_Trsf2d TR;
TR.SetTranslation (gp_Pnt2d (0.,0.), gp_Pnt2d (0.,paramv));
mycurve2d->Transform (TR);
}*/
if(trans.Form()!=gp_Identity)
mycurve2d->Transform (trans);
gp_Trsf2d ntrsf;
if(mysurf->IsKind(STANDARD_TYPE(Geom_Plane)))
ntrsf.SetScale(gp_Pnt2d(0,0),GetUnitFactor());
Standard_Real a = mycurve2d->FirstParameter(), b = mycurve2d->LastParameter();
ShapeBuild_Edge sbe;
mycurve2d = sbe.TransformPCurve (mycurve2d, ntrsf, uFact, a, b);
if ((mycurve2d->IsKind(STANDARD_TYPE(Geom2d_BSplineCurve)))
&& (mycurve2d->Continuity() < GeomAbs_C1)
&& GetContinuity() >= 1) {
Handle(Geom2d_BSplineCurve) BSplineC2d =
Handle(Geom2d_BSplineCurve)::DownCast(mycurve2d);
Handle(TColGeom2d_HSequenceOfBoundedCurve) seqBS;
ShapeAlgo::AlgoContainer()->C0BSplineToSequenceOfC1BSplineCurve (BSplineC2d, seqBS);
Standard_Integer NbC0 = seqBS->Length();
for (Standard_Integer i = 1; i <= NbC0; i++) {
ShapeBuild_Edge().MakeEdge (myedge, seqBS->Value (i), face);
// BRepBuilderAPI_MakeEdge ME (seqBS->Value (i), mysurf);
if (myedge.IsNull()/*!ME.IsDone()*/) {
Message_Msg Msg1005("IGES_1005"); //"Edge construction error"
SendFail(start,Msg1005);
//AddFail(start, "Edge construction error");
return myshape;
}
// myedge = ME.Edge();
// ShapeBuild_Edge().RemovePCurve (myedge, mysurf);
// B.UpdateEdge (myedge, seqBS->Value (i), face, 0);
sewd->Add (myedge);
}
}
else {
if (mycurve2d->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve))) {
Handle(Geom2d_TrimmedCurve) tmp = Handle(Geom2d_TrimmedCurve)::DownCast (mycurve2d);
mycurve2d = tmp->BasisCurve();
}
ShapeBuild_Edge().MakeEdge (myedge, mycurve2d, face, a, b);
// BRepBuilderAPI_MakeEdge ME (mycurve2d, mysurf);
if (myedge.IsNull()/*!ME.IsDone()*/) {
Message_Msg Msg1005("IGES_1005"); //"Edge construction error"
SendFail(start,Msg1005);
return myshape;
}
// myedge = ME.Edge();
// ShapeBuild_Edge().RemovePCurve (myedge, mysurf);
// B.UpdateEdge (myedge, mycurve2d, face, 0);
sewd->Add (myedge);
}
}
Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
sfw->Load (sewd);
//pdn 10.03.99 S4135
//sfw.FixConnected (epsgeom);
sfw->FixConnected ();
myshape = sewd->Wire();
// TopoDS_Vertex V1,V2;
// ShapeAnalysis::FindBounds (myshape, V1, V2);
// B.UpdateVertex (V1, epsgeom);
// B.UpdateVertex (V2, epsgeom);
// debug mjm du 26/07/96 en attendant developpement meilleur
// sur traitement des Wire et non des Edge dans les programmes appelant
if (sewd->NbEdges() != 1) {
//S4054 TheBadCase = Standard_True; //:27
Message_Msg Msg1120("IGES_1120");// "Wire not always implemented."
SendWarning(start,Msg1120);
// AddWarning(start, "Wire not always implemented.");
return myshape;
}
//the same modifications as in TransferBasicCurve()
if (start->IsKind(STANDARD_TYPE(IGESGeom_CircularArc)) &&
Handle(IGESGeom_CircularArc)::DownCast (start)->IsClosed())
TheBadCase = Standard_True;
return myedge;
}
//=======================================================================
//function : TransferBoundary
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferBoundary
(const Handle(IGESGeom_Boundary)& start)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"Boundary Transfer Error : Null IGESEntity"
SendFail(start, Msg1005);
//AddFail(start, "Boundary Transfer Error : Null IGESEntity");
return res;
}
if (start->BoundaryType()==0) {
Message_Msg Msg1125("IGES_1125"); //"Model space representation not implemented"
SendFail(start,Msg1125);
//AddFail(start, "Model space representation not implemented");
return res;
}
// Transfer of the unbounded surface
// =================================
Handle (IGESData_IGESEntity) igesSurface = start->Surface();
if (igesSurface.IsNull() || !IGESToBRep::IsTopoSurface(igesSurface) ) {
Message_Msg Msg124("XSTEP_124"); //"BasicSurface Transfer Error : Null IGESEntity"
SendFail(start,Msg124);
// AddFail(start, "BasicSurface Transfer Error : Null IGESEntity");
return res;
}
TopoDS_Face face;
TopAbs_ShapeEnum shapeEnum;
IGESToBRep_TopoSurface TS(*this);
gp_Trsf2d trans;
Standard_Real uFact;
TopoDS_Shape myshape = TS.ParamSurface(igesSurface, trans, uFact);
if (!myshape.IsNull()) {
shapeEnum = myshape.ShapeType();
switch (shapeEnum) {
case TopAbs_FACE :
{
face = TopoDS::Face(myshape);
break;
}
case TopAbs_SHELL :
{
TopoDS_Iterator IT(myshape);
Standard_Integer nbfaces = 0;
for (; IT.More(); IT.Next()) {
nbfaces++;
face = TopoDS::Face(IT.Value());
}
//szv#4:S4163:12Mar99 optimized
if (nbfaces != 1) {
Message_Msg Msg1061("IGES_1061"); //"Not Implemented Trimmed Composite Surface."
SendFail(start,Msg1061);
//AddFail(start,"Not Implemented Trimmed Composite Surface.");
return res;
}
}
break;
default:
{
Message_Msg Msg1156("IGES_1156"); //"Basis Surface Error." ?? Msg1066
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesSurface);
Msg1156.Arg("basic surface");
Msg1156.Arg(label);
SendFail(start,Msg1156);
// AddFail(start, "Basis Surface Error.");
return res;
}
}
}
face.EmptyCopy();
res = TransferBoundaryOnFace(face, start, trans, uFact);
return res;
}
//=======================================================================
//function : TransferBoundaryOnFace
//purpose :
//=======================================================================
TopoDS_Shape IGESToBRep_TopoCurve::TransferBoundaryOnFace(TopoDS_Face& face,
const Handle(IGESGeom_Boundary)& start,
const gp_Trsf2d& trans,
const Standard_Real uFact)
{
TopoDS_Shape res;
if (start.IsNull()) {
Message_Msg Msg1005("IGES_1005"); //"BoundaryOnFace Transfer Error : Null IGESEntity"
SendFail(start,Msg1005);
return res;
}
Standard_Boolean okCurve = Standard_True, okCurve3d = Standard_True, okCurve2d = Standard_True;
Standard_Integer filepreference = 0;
if (start->PreferenceType() == 2) filepreference = 2;
else if (start->PreferenceType() == 1) filepreference = 3;
Standard_Boolean Result = Standard_True;
Handle(IGESToBRep_IGESBoundary) IB = IGESToBRep::AlgoContainer()->ToolContainer()->IGESBoundary();
IB->Init (*this, start, face, trans, uFact, filepreference);
for (Standard_Integer i = 1; i <= start->NbModelSpaceCurves(); i++) {
Handle(IGESData_HArray1OfIGESEntity) Curves2d;
if (start->NbParameterCurves(i) == 0 && start->BoundaryType() == 1) {
Message_Msg Msg1135("IGES_1135");
Msg1135.Arg(2);
Msg1135.Arg(3);
SendWarning(start,Msg1135);
}
else
Curves2d = start->ParameterCurves(i);
Result = Result & IB->Transfer (okCurve, okCurve3d, okCurve2d,
start->ModelSpaceCurve(i), start->Sense(i) == 2,
Curves2d, i);
}
IB->Check(Result, Standard_True, okCurve3d, okCurve2d);
Handle(ShapeExtend_WireData) sewd = IB->WireData();
if (sewd->NbEdges() == 0) {
Message_Msg Msg1095("IGES_1095");//"Both 2d and 3d representations are invalid"
SendFail(start,Msg1095);
return res;
}
//#20 rln 14/05/98 buc40130 entity 16977
//first wire should be outer, all other are inner
//%14 pdn 03.03.99
// IB.Fix (sewd, Standard_True, Standard_True, Standard_False, Standard_False, Standard_False);
TopoDS_Wire mywire = sewd->Wire();
if (start->HasTransf()) {
gp_Trsf T;
SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation
(GetEpsilon(), start->CompoundLocation(),T)) {
TopLoc_Location L(T);
mywire.Move(L);
}
else {
Message_Msg Msg1035("IGES_1035"); //"Transformation skipped (not a similarity)"
SendWarning(start,Msg1035);
}
}
BRep_Builder B;
B.Add(face,mywire);
SetShapeResult (start, mywire);
return mywire;
}
//=======================================================================
//function : ApproxBSplineCurve
//purpose :
//=======================================================================
void IGESToBRep_TopoCurve::ApproxBSplineCurve
(const Handle(Geom_BSplineCurve)& start)
{
ShapeAlgo::AlgoContainer()->ApproxBSplineCurve (start, TheCurves);
}
//=======================================================================
//function : NbCurves
//purpose : Returns the count of produced Curves
//=======================================================================
Standard_Integer IGESToBRep_TopoCurve::NbCurves () const
{
return TheCurves.Length();
}
//=======================================================================
//function : Curve
//purpose : Returns a Curvee given its rank
//=======================================================================
Handle(Geom_Curve) IGESToBRep_TopoCurve::Curve (const Standard_Integer num) const
{
Handle(Geom_Curve) res;
if (num > 0 && num <= TheCurves.Length()) res = TheCurves.Value(num);
return res;
}
//=======================================================================
//function : Approx2dBSplineCurve
//purpose :
//=======================================================================
void IGESToBRep_TopoCurve::Approx2dBSplineCurve
(const Handle(Geom2d_BSplineCurve)& start)
{
ShapeAlgo::AlgoContainer()->ApproxBSplineCurve (start, TheCurves2d);
}
//=======================================================================
//function : NbCurves2d
//purpose : Returns the count of produced Curves
//=======================================================================
Standard_Integer IGESToBRep_TopoCurve::NbCurves2d () const
{
return TheCurves2d.Length();
}
//=======================================================================
//function : Curve2d
//purpose : Returns a Curve given its rank
//=======================================================================
Handle(Geom2d_Curve) IGESToBRep_TopoCurve::Curve2d (const Standard_Integer num) const
{
Handle(Geom2d_Curve) res;
if (num > 0 && num <= TheCurves2d.Length()) res = TheCurves2d.Value(num);
return res;
}
//=======================================================================
//function : SetBadCase
//purpose :
//=======================================================================
void IGESToBRep_TopoCurve::SetBadCase (const Standard_Boolean value)
{
TheBadCase = value;
}
//=======================================================================
//function : BadCase
//purpose :
//=======================================================================
Standard_Boolean IGESToBRep_TopoCurve::BadCase () const
{
return TheBadCase;
}