1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-21 10:13:43 +03:00
occt/src/Geom/Geom_RectangularTrimmedSurface.cxx

698 lines
20 KiB
C++

// Created on: 1993-03-10
// Created by: JCV
// Copyright (c) 1993-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.
// *******************************************************************
// *******************************************************************
#include <ElCLib.hxx>
#include <Geom_BezierSurface.hxx>
#include <Geom_Curve.hxx>
#include <Geom_Geometry.hxx>
#include <Geom_OffsetSurface.hxx>
#include <Geom_RectangularTrimmedSurface.hxx>
#include <Geom_Surface.hxx>
#include <Geom_SurfaceOfLinearExtrusion.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <Geom_UndefinedDerivative.hxx>
#include <gp_GTrsf2d.hxx>
#include <gp_Pnt.hxx>
#include <gp_Trsf.hxx>
#include <gp_Vec.hxx>
#include <Precision.hxx>
#include <Standard_ConstructionError.hxx>
#include <Standard_RangeError.hxx>
#include <Standard_Type.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Geom_RectangularTrimmedSurface,Geom_BoundedSurface)
typedef Geom_RectangularTrimmedSurface RectangularTrimmedSurface;
typedef gp_Ax1 Ax1;
typedef gp_Ax2 Ax2;
typedef gp_Pnt Pnt;
typedef gp_Trsf Trsf;
typedef gp_Vec Vec;
//=======================================================================
//function : Copy
//purpose :
//=======================================================================
Handle(Geom_Geometry) Geom_RectangularTrimmedSurface::Copy () const {
Handle(Geom_RectangularTrimmedSurface) S;
if ( isutrimmed && isvtrimmed )
S = new RectangularTrimmedSurface (basisSurf,
utrim1 , utrim2,
vtrim1 , vtrim2,
Standard_True, Standard_True);
else if ( isutrimmed)
S = new RectangularTrimmedSurface (basisSurf,
utrim1 , utrim2,
Standard_True, Standard_True);
else if (isvtrimmed)
S = new RectangularTrimmedSurface (basisSurf,
vtrim1 , vtrim2,
Standard_False , Standard_True);
return S;
}
//=======================================================================
//function : Geom_RectangularTrimmedSurface
//purpose :
//=======================================================================
Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
const Handle(Geom_Surface)& S,
const Standard_Real U1,
const Standard_Real U2,
const Standard_Real V1,
const Standard_Real V2,
const Standard_Boolean USense,
const Standard_Boolean VSense)
: utrim1 (U1),
vtrim1(V1),
utrim2 (U2),
vtrim2 (V2),
isutrimmed (Standard_True),
isvtrimmed (Standard_True)
{
// kill trimmed basis surfaces
Handle(Geom_RectangularTrimmedSurface) T =
Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
if (!T.IsNull())
basisSurf = Handle(Geom_Surface)::DownCast(T->BasisSurface()->Copy());
else
basisSurf = Handle(Geom_Surface)::DownCast(S->Copy());
Handle(Geom_OffsetSurface) O =
Handle(Geom_OffsetSurface)::DownCast(basisSurf);
if (!O.IsNull())
{
Handle(Geom_RectangularTrimmedSurface) S2 =
new Geom_RectangularTrimmedSurface( O->BasisSurface(),U1,U2, V1, V2, USense, VSense);
basisSurf = new Geom_OffsetSurface(S2, O->Offset(), Standard_True);
}
SetTrim( U1, U2, V1, V2, USense, VSense);
}
//=======================================================================
//function : Geom_RectangularTrimmedSurface
//purpose :
//=======================================================================
Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
const Handle(Geom_Surface)& S,
const Standard_Real Param1,
const Standard_Real Param2,
const Standard_Boolean UTrim,
const Standard_Boolean Sense
) {
// kill trimmed basis surfaces
Handle(Geom_RectangularTrimmedSurface) T =
Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
if (!T.IsNull())
basisSurf = Handle(Geom_Surface)::DownCast(T->BasisSurface()->Copy());
else
basisSurf = Handle(Geom_Surface)::DownCast(S->Copy());
Handle(Geom_OffsetSurface) O =
Handle(Geom_OffsetSurface)::DownCast(basisSurf);
if (!O.IsNull())
{
Handle(Geom_RectangularTrimmedSurface) S2 =
new Geom_RectangularTrimmedSurface( O->BasisSurface(),Param1,Param2, UTrim, Sense);
basisSurf = new Geom_OffsetSurface(S2, O->Offset(), Standard_True);
}
if (!T.IsNull())
{
if (UTrim && T->isvtrimmed)
{
SetTrim(Param1, Param2, T->vtrim1, T->vtrim2, Sense, Standard_True);
return;
}
else if (!UTrim && T->isutrimmed)
{
SetTrim(T->utrim1, T->utrim2, Param1, Param2, Standard_True, Sense);
return;
}
}
SetTrim(Param1, Param2, UTrim, Sense);
}
//=======================================================================
//function : SetTrim
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::SetTrim (const Standard_Real U1,
const Standard_Real U2,
const Standard_Real V1,
const Standard_Real V2,
const Standard_Boolean USense,
const Standard_Boolean VSense ) {
SetTrim( U1, U2, V1, V2, Standard_True, Standard_True, USense, VSense);
}
//=======================================================================
//function : SetTrim
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::SetTrim (const Standard_Real Param1,
const Standard_Real Param2,
const Standard_Boolean UTrim,
const Standard_Boolean Sense ) {
// dummy arguments to call general SetTrim
Standard_Real dummy_a = 0.;
Standard_Real dummy_b = 0.;
Standard_Boolean dummy_Sense = Standard_True;
if ( UTrim) {
if (isvtrimmed)
{
SetTrim (Param1, Param2,
vtrim1, vtrim2,
Standard_True, Standard_True,
Sense, dummy_Sense);
}
else
{
SetTrim (Param1, Param2,
dummy_a, dummy_b,
Standard_True, Standard_False,
Sense, dummy_Sense);
}
}
else {
if (isutrimmed)
{
SetTrim (utrim1, utrim2,
Param1, Param2,
Standard_True, Standard_True,
dummy_Sense, Sense);
}
else
{
SetTrim (dummy_a, dummy_b,
Param1, Param2,
Standard_False, Standard_True,
dummy_Sense, Sense);
}
}
}
//=======================================================================
//function : SetTrim
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::SetTrim(const Standard_Real U1,
const Standard_Real U2,
const Standard_Real V1,
const Standard_Real V2,
const Standard_Boolean UTrim,
const Standard_Boolean VTrim,
const Standard_Boolean USense,
const Standard_Boolean VSense) {
Standard_Boolean UsameSense = Standard_True;
Standard_Boolean VsameSense = Standard_True;
Standard_Real Udeb, Ufin, Vdeb, Vfin;
basisSurf->Bounds(Udeb, Ufin, Vdeb, Vfin);
// Trimming the U-Direction
isutrimmed = UTrim;
if (!UTrim) {
utrim1 = Udeb;
utrim2 = Ufin;
}
else {
if ( U1 == U2)
throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::U1==U2");
if (basisSurf->IsUPeriodic()) {
UsameSense = USense;
// set uTrim1 in the range Udeb , Ufin
// set uTrim2 in the range uTrim1 , uTrim1 + Period()
utrim1 = U1;
utrim2 = U2;
ElCLib::AdjustPeriodic(Udeb, Ufin,
Min(Abs(utrim2-utrim1)/2,Precision::PConfusion()),
utrim1, utrim2);
}
else {
if (U1 < U2) {
UsameSense = USense;
utrim1 = U1;
utrim2 = U2;
}
else {
UsameSense = !USense;
utrim1 = U2;
utrim2 = U1;
}
if ((Udeb-utrim1 > Precision::PConfusion()) ||
(utrim2-Ufin > Precision::PConfusion()))
throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::U parameters out of range");
}
}
// Trimming the V-Direction
isvtrimmed = VTrim;
if (!VTrim) {
vtrim1 = Vdeb;
vtrim2 = Vfin;
}
else {
if ( V1 == V2)
throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::V1==V2");
if (basisSurf->IsVPeriodic()) {
VsameSense = VSense;
// set vTrim1 in the range Vdeb , Vfin
// set vTrim2 in the range vTrim1 , vTrim1 + Period()
vtrim1 = V1;
vtrim2 = V2;
ElCLib::AdjustPeriodic(Vdeb, Vfin,
Min(Abs(vtrim2-vtrim1)/2,Precision::PConfusion()),
vtrim1, vtrim2);
}
else {
if (V1 < V2) {
VsameSense = VSense;
vtrim1 = V1;
vtrim2 = V2;
}
else {
VsameSense = !VSense;
vtrim1 = V2;
vtrim2 = V1;
}
if ((Vdeb-vtrim1 > Precision::PConfusion()) ||
(vtrim2-Vfin > Precision::PConfusion()))
throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::V parameters out of range");
}
}
if (!UsameSense) UReverse();
if (!VsameSense) VReverse();
}
//=======================================================================
//function : UReverse
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::UReverse ()
{
Standard_Real U1 = basisSurf->UReversedParameter(utrim2);
Standard_Real U2 = basisSurf->UReversedParameter(utrim1);
basisSurf->UReverse();
SetTrim(U1,U2,vtrim1,vtrim2,
isutrimmed,isvtrimmed,
Standard_True,Standard_True);
}
//=======================================================================
//function : UReversedParameter
//purpose :
//=======================================================================
Standard_Real Geom_RectangularTrimmedSurface::UReversedParameter( const Standard_Real U) const {
return basisSurf->UReversedParameter(U);
}
//=======================================================================
//function : VReverse
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::VReverse ()
{
Standard_Real V1 = basisSurf->VReversedParameter(vtrim2);
Standard_Real V2 = basisSurf->VReversedParameter(vtrim1);
basisSurf->VReverse();
SetTrim(utrim1,utrim2,V1,V2,
isutrimmed,isvtrimmed,
Standard_True,Standard_True);
}
//=======================================================================
//function : VReversedParameter
//purpose :
//=======================================================================
Standard_Real Geom_RectangularTrimmedSurface::VReversedParameter( const Standard_Real V) const {
return basisSurf->VReversedParameter( V);
}
//=======================================================================
//function : BasisSurface
//purpose :
//=======================================================================
Handle(Geom_Surface) Geom_RectangularTrimmedSurface::BasisSurface () const
{
return basisSurf;
}
//=======================================================================
//function : Continuity
//purpose :
//=======================================================================
GeomAbs_Shape Geom_RectangularTrimmedSurface::Continuity () const {
return basisSurf->Continuity();
}
//=======================================================================
//function : D0
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::D0
(const Standard_Real U, const Standard_Real V,
Pnt& P ) const {
basisSurf->D0 (U, V, P);
}
//=======================================================================
//function : D1
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::D1
(const Standard_Real U, const Standard_Real V,
Pnt& P,
Vec& D1U, Vec& D1V) const {
basisSurf->D1 (U, V, P, D1U, D1V);
}
//=======================================================================
//function : D2
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::D2
(const Standard_Real U, const Standard_Real V,
Pnt& P,
Vec& D1U, Vec& D1V,
Vec& D2U, Vec& D2V, Vec& D2UV) const {
basisSurf->D2 (U, V, P, D1U, D1V, D2U, D2V, D2UV);
}
//=======================================================================
//function : D3
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::D3
(const Standard_Real U, const Standard_Real V,
Pnt& P,
Vec& D1U, Vec& D1V,
Vec& D2U, Vec& D2V, Vec& D2UV,
Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const {
basisSurf->D3 (U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
}
//=======================================================================
//function : DN
//purpose :
//=======================================================================
Vec Geom_RectangularTrimmedSurface::DN
(const Standard_Real U , const Standard_Real V,
const Standard_Integer Nu, const Standard_Integer Nv) const {
return basisSurf->DN (U, V, Nu, Nv);
}
//=======================================================================
//function : Bounds
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::Bounds (Standard_Real& U1,
Standard_Real& U2,
Standard_Real& V1,
Standard_Real& V2) const {
U1 = utrim1;
U2 = utrim2;
V1 = vtrim1;
V2 = vtrim2;
}
//=======================================================================
//function : UIso
//purpose :
//=======================================================================
Handle(Geom_Curve) Geom_RectangularTrimmedSurface::UIso (const Standard_Real U) const {
Handle(Geom_Curve) C = basisSurf->UIso (U);
if ( isvtrimmed) {
Handle(Geom_TrimmedCurve) Ct;
Ct = new Geom_TrimmedCurve (C, vtrim1, vtrim2, Standard_True);
return Ct;
}
else {
return C;
}
}
//=======================================================================
//function : VIso
//purpose :
//=======================================================================
Handle(Geom_Curve) Geom_RectangularTrimmedSurface::VIso (const Standard_Real V) const {
Handle(Geom_Curve) C = basisSurf->VIso (V);
if ( isutrimmed) {
Handle(Geom_TrimmedCurve) Ct;
Ct = new Geom_TrimmedCurve (C, utrim1, utrim2, Standard_True);
return Ct;
}
else {
return C;
}
}
//=======================================================================
//function : IsCNu
//purpose :
//=======================================================================
Standard_Boolean Geom_RectangularTrimmedSurface::IsCNu (const Standard_Integer N) const {
Standard_RangeError_Raise_if (N < 0," ");
return basisSurf->IsCNu (N);
}
//=======================================================================
//function : IsCNv
//purpose :
//=======================================================================
Standard_Boolean Geom_RectangularTrimmedSurface::IsCNv (const Standard_Integer N) const {
Standard_RangeError_Raise_if (N < 0," ");
return basisSurf->IsCNv (N);
}
//=======================================================================
//function : Transform
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::Transform (const Trsf& T)
{
basisSurf->Transform (T);
basisSurf->TransformParameters(utrim1,vtrim1,T);
basisSurf->TransformParameters(utrim2,vtrim2,T);
}
//=======================================================================
//function : IsUPeriodic
//purpose :
// 24/11/98: pmn : Compare la periode a la longeur de l'intervalle
//=======================================================================
Standard_Boolean Geom_RectangularTrimmedSurface::IsUPeriodic () const
{
if (basisSurf->IsUPeriodic() && !isutrimmed)
return Standard_True;
return Standard_False;
}
//=======================================================================
//function : UPeriod
//purpose :
//=======================================================================
Standard_Real Geom_RectangularTrimmedSurface::UPeriod() const
{
return basisSurf->UPeriod();
}
//=======================================================================
//function : IsVPeriodic
//purpose :
//=======================================================================
Standard_Boolean Geom_RectangularTrimmedSurface::IsVPeriodic () const
{
if (basisSurf->IsVPeriodic() && !isvtrimmed)
return Standard_True;
return Standard_False;
}
//=======================================================================
//function : VPeriod
//purpose :
//=======================================================================
Standard_Real Geom_RectangularTrimmedSurface::VPeriod() const
{
return basisSurf->VPeriod();
}
//=======================================================================
//function : IsUClosed
//purpose :
//=======================================================================
Standard_Boolean Geom_RectangularTrimmedSurface::IsUClosed () const {
if (isutrimmed)
return Standard_False;
else
return basisSurf->IsUClosed();
}
//=======================================================================
//function : IsVClosed
//purpose :
//=======================================================================
Standard_Boolean Geom_RectangularTrimmedSurface::IsVClosed () const {
if (isvtrimmed)
return Standard_False;
else
return basisSurf->IsVClosed();
}
//=======================================================================
//function : TransformParameters
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::TransformParameters(Standard_Real& U,
Standard_Real& V,
const gp_Trsf& T)
const
{
basisSurf->TransformParameters(U,V,T);
}
//=======================================================================
//function : ParametricTransformation
//purpose :
//=======================================================================
gp_GTrsf2d Geom_RectangularTrimmedSurface::ParametricTransformation
(const gp_Trsf& T) const
{
return basisSurf->ParametricTransformation(T);
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Geom_RectangularTrimmedSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_BoundedSurface)
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisSurf.get())
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, utrim1)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vtrim1)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, utrim2)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vtrim2)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, isutrimmed)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, isvtrimmed)
}