1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-06-30 12:14:08 +03:00
occt/src/IGESToBRep/IGESToBRep_CurveAndSurface.cxx
dpasukhi a5a7b3185b Coding - Apply .clang-format formatting #286
Update empty method guards to new style with regex (see PR).
Used clang-format 18.1.8.
New actions to validate code formatting is added.
Update .clang-format with disabling of include sorting.
  It is temporary changes, then include will be sorted.
Apply formatting for /src and /tools folder.
The files with .hxx,.cxx,.lxx,.h,.pxx,.hpp,*.cpp extensions.
2025-01-26 00:43:57 +00:00

660 lines
19 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.
// 22.12.98 dce S3767
// 21.12.98 rln, gka S4054
// #74 rln,pdn 11.03.99 S4135: Setting minimum and maximum tolerances according to static parameters
// sln 13.06.2002 OCC448 : Correction in method TransferGeometry to avoid transferring invisible
// sub entities
#include <BRep_Builder.hxx>
#include <BRepLib.hxx>
#include <Geom_Surface.hxx>
#include <GeomAdaptor_Surface.hxx>
#include <gp_GTrsf.hxx>
#include <gp_Trsf.hxx>
#include <gp_Vec.hxx>
#include <IGESBasic_GroupWithoutBackP.hxx>
#include <IGESBasic_SingularSubfigure.hxx>
#include <IGESBasic_SubfigureDef.hxx>
#include <IGESData_IGESEntity.hxx>
#include <IGESData_IGESModel.hxx>
#include <IGESData_ToolLocation.hxx>
#include <IGESToBRep.hxx>
#include <IGESToBRep_BRepEntity.hxx>
#include <IGESToBRep_CurveAndSurface.hxx>
#include <IGESToBRep_TopoCurve.hxx>
#include <IGESToBRep_TopoSurface.hxx>
#include <Interface_Macros.hxx>
#include <Interface_Static.hxx>
#include <Message_Messenger.hxx>
#include <Message_Msg.hxx>
#include <Message_ProgressScope.hxx>
#include <Precision.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include <TopLoc_Location.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Shape.hxx>
#include <Transfer_TransientProcess.hxx>
#include <TransferBRep_ShapeBinder.hxx>
#include <TransferBRep_ShapeListBinder.hxx>
#include <stdio.h>
//=================================================================================================
IGESToBRep_CurveAndSurface::IGESToBRep_CurveAndSurface()
: myEps(1.e-04),
myEpsCoeff(1.e-06),
myEpsGeom(1.e-04),
myMinTol(-1.0),
myMaxTol(-1.0),
myModeIsTopo(Standard_True),
myModeApprox(Standard_False),
myContIsOpti(Standard_False),
myUnitFactor(1.0),
mySurfaceCurve(0),
myContinuity(0),
myUVResolution(0.0),
myIsResolCom(Standard_False),
myTP(new Transfer_TransientProcess())
{
UpdateMinMaxTol();
}
//=================================================================================================
IGESToBRep_CurveAndSurface::IGESToBRep_CurveAndSurface(const Standard_Real eps,
const Standard_Real epsCoeff,
const Standard_Real epsGeom,
const Standard_Boolean mode,
const Standard_Boolean modeapprox,
const Standard_Boolean optimized)
: myEps(eps),
myEpsCoeff(epsCoeff),
myEpsGeom(epsGeom),
myMinTol(-1.0),
myMaxTol(-1.0),
myModeIsTopo(mode),
myModeApprox(modeapprox),
myContIsOpti(optimized),
myUnitFactor(1.0),
mySurfaceCurve(0),
myContinuity(0),
myUVResolution(0.0),
myIsResolCom(Standard_False),
myTP(new Transfer_TransientProcess())
{
UpdateMinMaxTol();
}
//=================================================================================================
void IGESToBRep_CurveAndSurface::Init()
{
myEps = 1.E-04;
myEpsCoeff = 1.E-06;
myEpsGeom = 1.E-04;
myModeIsTopo = Standard_True;
myModeApprox = Standard_False;
myContIsOpti = Standard_False;
myUnitFactor = 1.;
mySurfaceCurve = 0;
myContinuity = 0;
myTP = new Transfer_TransientProcess();
mySurface.Nullify();
myIsResolCom = Standard_False;
myUVResolution = 0.;
UpdateMinMaxTol();
}
//=================================================================================================
void IGESToBRep_CurveAndSurface::SetEpsGeom(const Standard_Real eps)
{
myEpsGeom = eps;
UpdateMinMaxTol();
}
//=================================================================================================
void IGESToBRep_CurveAndSurface::UpdateMinMaxTol()
{
// #74 rln 11.03.99 S4135: Setting maximum tolerances according to
// static parameter
myMaxTol = Max(Interface_Static::RVal("read.maxprecision.val"), myEpsGeom * myUnitFactor);
myMinTol = Precision::Confusion();
}
//=================================================================================================
void IGESToBRep_CurveAndSurface::SetModel(const Handle(IGESData_IGESModel)& model)
{
myModel = model;
Standard_Real unitfactor = myModel->GlobalSection().UnitValue();
if (unitfactor != 1.)
{
if (myTP->TraceLevel() > 2)
myTP->Messenger()->SendInfo() << "UnitFactor = " << unitfactor << std::endl;
myUnitFactor = unitfactor;
}
UpdateMinMaxTol();
}
//=================================================================================================
TopoDS_Shape IGESToBRep_CurveAndSurface::TransferCurveAndSurface(
const Handle(IGESData_IGESEntity)& start,
const Message_ProgressRange& theProgress)
{
TopoDS_Shape res;
if (start.IsNull())
{
Message_Msg msg1005("IGES_1005");
SendFail(start, msg1005);
return res;
}
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
// Standard_Integer typeNumber = start->TypeNumber();
if (IGESToBRep::IsTopoCurve(start))
{
IGESToBRep_TopoCurve TC(*this);
res = TC.TransferTopoCurve(start);
}
else if (IGESToBRep::IsTopoSurface(start))
{
IGESToBRep_TopoSurface TS(*this);
res = TS.TransferTopoSurface(start);
}
else if (IGESToBRep::IsBRepEntity(start))
{
IGESToBRep_BRepEntity TS(*this);
res = TS.TransferBRepEntity(start, theProgress);
}
else
{
Message_Msg msg1015("IGES_1015");
SendFail(start, msg1015);
// AddFail(start, "The IGESEntity is not a curve a Surface or a BRep Entity.");
}
// mjm le 12/09/96
/*
if (!res.IsNull()) {
try {
OCC_CATCH_SIGNALS
Standard_Real Eps = GetEpsGeom()*GetUnitFactor();
BRepLib::SameParameter(res,Eps);
}
catch(Standard_Failure) {
Message_Msg msg1010("IGES_1010");
SendWarning (start,msg1010);
}
}
*/
return res;
}
//=================================================================================================
TopoDS_Shape IGESToBRep_CurveAndSurface::TransferGeometry(const Handle(IGESData_IGESEntity)& start,
const Message_ProgressRange& theProgress)
{
// Declaration of messages//
// DCE 22/12/98
// Message_Msg msg1005("IGES_1005"); // Software error : start IsNull.
// Message_Msg msg1015("IGES_1015"); // invalid type or exception raising (software error).
// Message_Msg msg1010("IGES_1010"); // Not sameparameter.
// Message_Msg msg1015("IGES_1015");
// Message_Msg msg210 ("XSTEP_210");
// Message_Msg msg202 ("XSTEP_202");
////////////////////////////
TopoDS_Shape res;
gp_Trsf T408;
if (start.IsNull())
{
Message_Msg msg1005("IGES_1005"); // Software error : start IsNull.
SendFail(start, msg1005);
return res;
}
// Read of the DE number and the type number of the entity
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
// Standard_Integer typeNumber = start->TypeNumber();
// sln 13.06.2002 OCC448: Avoid transferring invisible sub entities which
// logically depend on the one
Standard_Integer onlyvisible = Interface_Static::IVal("read.iges.onlyvisible");
if (IGESToBRep::IsCurveAndSurface(start))
{
if (onlyvisible && start->BlankStatus() == 1)
return res;
try
{
OCC_CATCH_SIGNALS
res = TransferCurveAndSurface(start, theProgress);
}
catch (Standard_Failure const&)
{
Message_Msg msg1015("IGES_1015");
SendFail(start, msg1015);
}
return res;
}
// 408 : SingularSubfigure
if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure)))
{
if (onlyvisible && start->BlankStatus() == 1)
return res;
DeclareAndCast(IGESBasic_SingularSubfigure, st408, start);
Handle(IGESBasic_SubfigureDef) stsub = st408->Subfigure();
gp_XYZ trans = st408->Translation();
gp_Vec vectr(trans);
Standard_Real scunit = GetUnitFactor();
vectr.Multiply(scunit);
T408.SetTranslation(vectr);
if (st408->HasScaleFactor())
{
Standard_Real scalef = st408->ScaleFactor();
T408.SetScaleFactor(scalef);
}
if (HasShapeResult(stsub))
{
res = GetShapeResult(stsub);
}
else
{
try
{
OCC_CATCH_SIGNALS
res = TransferGeometry(stsub, theProgress);
}
catch (Standard_Failure const&)
{
res.Nullify();
Message_Msg msg1015("IGES_1015");
SendFail(st408, msg1015);
}
if (!res.IsNull())
{
SetShapeResult(stsub, res);
}
}
}
// 308 : SubfigureDefinition
else if (start->IsKind(STANDARD_TYPE(IGESBasic_SubfigureDef)))
{
DeclareAndCast(IGESBasic_SubfigureDef, st308, start);
TopoDS_Compound group;
BRep_Builder B;
B.MakeCompound(group);
if (st308->NbEntities() < 1)
{
Message_Msg msg210("XSTEP_210");
SendFail(st308, msg210);
return res;
}
Message_ProgressScope PS(theProgress, "Subfigure item", st308->NbEntities());
for (Standard_Integer i = 1; i <= st308->NbEntities() && PS.More(); i++)
{
Message_ProgressRange aRange = PS.Next();
TopoDS_Shape item;
if (st308->AssociatedEntity(i).IsNull())
{
Message_Msg msg1020("IGES_1020");
msg1020.Arg(i);
SendWarning(st308, msg1020);
continue;
}
if (onlyvisible && st308->AssociatedEntity(i)->BlankStatus() == 1)
continue;
if (HasShapeResult(st308->AssociatedEntity(i)))
{
item = GetShapeResult(st308->AssociatedEntity(i));
}
else
{
try
{
OCC_CATCH_SIGNALS
item = TransferGeometry(st308->AssociatedEntity(i), aRange);
}
catch (Standard_Failure const&)
{
item.Nullify();
Message_Msg msg1015("IGES_1015");
SendFail(st308->AssociatedEntity(i), msg1015);
}
}
if (item.IsNull())
{
Message_Msg msg1025("IGES_1025");
msg1025.Arg(i);
SendWarning(start, msg1025);
}
else
{
B.Add(group, item);
SetShapeResult(st308->AssociatedEntity(i), item);
}
}
res = group;
}
else if (start->IsKind(STANDARD_TYPE(IGESBasic_Group)))
{
if (onlyvisible && start->BlankStatus() == 1)
return res;
DeclareAndCast(IGESBasic_Group, st402f1, start);
TopoDS_Compound group;
BRep_Builder B;
B.MakeCompound(group);
if (st402f1->NbEntities() < 1)
{
Message_Msg msg202("XSTEP_202");
msg202.Arg(st402f1->FormNumber());
SendFail(st402f1, msg202);
return res;
}
Message_ProgressScope PS(theProgress, "Group item", st402f1->NbEntities());
Standard_Boolean ProblemInGroup = Standard_False;
for (Standard_Integer i = 1; i <= st402f1->NbEntities() && PS.More(); i++)
{
Message_ProgressRange aRange = PS.Next();
TopoDS_Shape item;
if (st402f1->Entity(i).IsNull())
{
Message_Msg msg1020("IGES_1020");
msg1020.Arg(i);
SendFail(st402f1, msg1020);
continue;
}
if (onlyvisible && st402f1->Entity(i)->BlankStatus() == 1)
continue;
if (HasShapeResult(st402f1->Entity(i)))
{
item = GetShapeResult(st402f1->Entity(i));
}
else
{
try
{
OCC_CATCH_SIGNALS
item = TransferGeometry(st402f1->Entity(i), aRange);
}
catch (Standard_Failure const&)
{
item.Nullify();
Message_Msg msg1015("IGES_1015");
SendFail(st402f1->Entity(i), msg1015);
}
}
if (item.IsNull())
{
// Message_Msg msg1030("IGES_1030");
// msg1030.Arg(st402f1->FormNumber());
// msg1030.Arg(i);
// SendWarning (st402f1,msg1030);
ProblemInGroup = Standard_True;
}
else
{
B.Add(group, item);
SetShapeResult(st402f1->Entity(i), item);
}
}
res = group;
if (ProblemInGroup)
{
Message_Msg msg1030("IGES_1030");
msg1030.Arg(st402f1->FormNumber());
SendWarning(st402f1, msg1030);
}
}
else if (start->IsKind(STANDARD_TYPE(IGESBasic_GroupWithoutBackP)))
{
if (onlyvisible && start->BlankStatus() == 1)
return res;
DeclareAndCast(IGESBasic_GroupWithoutBackP, st402f7, start);
TopoDS_Compound group;
// unused Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(st402f7);
BRep_Builder B;
B.MakeCompound(group);
if (st402f7->NbEntities() < 1)
{
Message_Msg msg202("XSTEP_202");
msg202.Arg(st402f7->FormNumber());
SendFail(st402f7, msg202);
return res;
}
Message_ProgressScope PS(theProgress, "Group item", st402f7->NbEntities());
Standard_Boolean ProblemInGroup = Standard_False;
for (Standard_Integer i = 1; i <= st402f7->NbEntities() && PS.More(); i++)
{
Message_ProgressRange aRange = PS.Next();
TopoDS_Shape item;
if (st402f7->Entity(i).IsNull())
{
Message_Msg msg1020("IGES_1020");
msg1020.Arg(i);
SendFail(st402f7, msg1020);
continue;
}
if (onlyvisible && st402f7->Entity(i)->BlankStatus() == 1)
continue;
if (HasShapeResult(st402f7->Entity(i)))
{
item = GetShapeResult(st402f7->Entity(i));
}
else
{
try
{
OCC_CATCH_SIGNALS
item = TransferGeometry(st402f7->Entity(i), aRange);
}
catch (Standard_Failure const&)
{
item.Nullify();
Message_Msg msg1015("IGES_1015");
SendFail(st402f7->Entity(i), msg1015);
}
}
if (item.IsNull())
{
// Message_Msg msg1030("IGES_1030");
// msg1030.Arg(st402f7->FormNumber());
// msg1030.Arg(i);
// SendWarning (st402f7,msg1030);
ProblemInGroup = Standard_True;
}
else
{
B.Add(group, item);
SetShapeResult(st402f7->Entity(i), item);
}
}
res = group;
if (ProblemInGroup)
{
Message_Msg msg1030("IGES_1030");
msg1030.Arg(st402f7->FormNumber());
SendWarning(st402f7, msg1030);
}
}
else
{
Message_Msg msg1001("IGES_1001");
msg1001.Arg(start->FormNumber());
SendFail(start, msg1001);
return res;
}
if (start->HasTransf())
{
gp_Trsf T;
SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation(GetEpsilon(),
start->CompoundLocation(),
T,
GetUnitFactor()))
{
if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure)))
{
gp_XYZ tra = T.TranslationPart();
gp_XYZ trans = T408.TranslationPart();
tra.Add(trans);
T.SetTranslationPart(tra);
Standard_Real sc = T.ScaleFactor();
Standard_Real scalef = T408.ScaleFactor();
sc = sc * scalef;
T.SetScaleFactor(sc);
}
TopLoc_Location L(T);
res.Move(L, Standard_False);
}
else
{
Message_Msg msg1035("IGES_1035");
SendWarning(start, msg1035);
}
}
else
{
if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure)))
{
TopLoc_Location L(T408);
res.Move(L);
}
}
return res;
}
//=================================================================================================
Standard_Boolean IGESToBRep_CurveAndSurface::HasShapeResult(
const Handle(IGESData_IGESEntity)& start) const
{
DeclareAndCast(TransferBRep_ShapeBinder, binder, myTP->Find(start));
if (binder.IsNull())
return Standard_False;
return binder->HasResult();
}
//=================================================================================================
TopoDS_Shape IGESToBRep_CurveAndSurface::GetShapeResult(
const Handle(IGESData_IGESEntity)& start) const
{
TopoDS_Shape res;
DeclareAndCast(TransferBRep_ShapeBinder, binder, myTP->Find(start));
if (binder.IsNull())
return res;
if (binder->HasResult())
res = binder->Result();
return res;
}
//=================================================================================================
void IGESToBRep_CurveAndSurface::SetShapeResult(const Handle(IGESData_IGESEntity)& start,
const TopoDS_Shape& result)
{
Handle(TransferBRep_ShapeBinder) binder = new TransferBRep_ShapeBinder;
myTP->Bind(start, binder);
binder->SetResult(result);
}
//=================================================================================================
Standard_Integer IGESToBRep_CurveAndSurface::NbShapeResult(
const Handle(IGESData_IGESEntity)& start) const
{
Standard_Integer nbres = 0;
DeclareAndCast(TransferBRep_ShapeListBinder, binder, myTP->Find(start));
if (binder.IsNull())
return nbres;
nbres = binder->NbShapes();
return nbres;
}
//=================================================================================================
TopoDS_Shape IGESToBRep_CurveAndSurface::GetShapeResult(const Handle(IGESData_IGESEntity)& start,
const Standard_Integer num) const
{
TopoDS_Shape res;
DeclareAndCast(TransferBRep_ShapeListBinder, binder, myTP->Find(start));
if (binder.IsNull())
return res;
if (num <= binder->NbShapes())
res = binder->Shape(num);
return res;
}
//=================================================================================================
void IGESToBRep_CurveAndSurface::AddShapeResult(const Handle(IGESData_IGESEntity)& start,
const TopoDS_Shape& result)
{
DeclareAndCast(TransferBRep_ShapeListBinder, binder, myTP->Find(start));
if (binder.IsNull())
{
binder = new TransferBRep_ShapeListBinder;
myTP->Bind(start, binder);
}
binder->AddResult(result);
}
void IGESToBRep_CurveAndSurface::SetSurface(const Handle(Geom_Surface)& theSurface)
{
if (mySurface != theSurface)
{
mySurface = theSurface;
myIsResolCom = Standard_False;
myUVResolution = 0.;
}
}
Handle(Geom_Surface) IGESToBRep_CurveAndSurface::Surface() const
{
return mySurface;
}
Standard_Real IGESToBRep_CurveAndSurface::GetUVResolution()
{
if (!myIsResolCom && !mySurface.IsNull())
{
myIsResolCom = Standard_True;
GeomAdaptor_Surface aGAS(mySurface);
myUVResolution = Min(aGAS.UResolution(1.), aGAS.VResolution(1.));
}
return myUVResolution;
}