欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OCCT中的裁剪平面(Geom_RectangularTrimmedSurface)

程序员文章站 2022-04-15 18:45:13
...

    裁剪平面(Geom_RectangularTrimmedSurface)是基础平面的一部分,它在基础平面的u方向上用两个值限制范围,在基础平面的v方向上也用两个值限制范围。裁剪平面的区域一定位于基础平面的区域内,它的定义如下:

  •    基础面
  •    u方向和v方向的参数值(umin, umax) 和(vmin, vmax)。裁剪平面是在基础面的一份拷贝上做裁剪,因此,当基础面改变时,裁剪平面不变。另外,裁剪平面的方向可以和基础平面不同(默认情况下,两者是相同的)。

    在OCCT中,构造一个裁剪平面的方法如下:

Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
  const Handle(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(Surface)::DownCast(T->BasisSurface()->Copy());
  else
    basisSurf = Handle(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);
    Handle(Geom_OffsetSurface) OS = new Geom_OffsetSurface(S2, O->Offset());
    basisSurf = Handle(Surface)::DownCast(OS);
  }  

  SetTrim( U1, U2, V1, V2, USense, VSense);
}

    裁剪面在u方向上的范围是[u1,u2],在v方向上的范围是[v1,v2]。这两个方向可以推导出面的法向量。如果面是非周期性的,z则不使用USense 和VSense 。如果面是周期性的,则使用USense 和VSense。默认情况下,裁剪面和和基础面的方向相同,且非闭合、非周期性。

     在下列情况下,构造时会有异常:

  •     基础面在U方向上不是周期性,但u1或者u2超出了基础面的边界。
  •     基础面在V方向上不是周期性,但v1或者v2超出了基础面的边界。
  •     u1 = u2
  •     v1 = v2
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(Surface)::DownCast(T->BasisSurface()->Copy());
  else
    basisSurf = Handle(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);
    Handle(Geom_OffsetSurface) OS = new Geom_OffsetSurface(S2, O->Offset());
    basisSurf = Handle(Surface)::DownCast(OS);
  }  

  SetTrim(Param1, Param2, UTrim, Sense);
}

    基础面仅在一个参数方向上裁剪。如果UTrim = True,则在U方向上裁剪,否则在V方向上裁剪。在裁剪方向上,面的范围从Param1到Param2。如果基础面是周期性的,则Sense给出了面的可用部分。默认情况下,裁剪面与基础面的方向(在考虑的裁剪方向上)相同。 

     在下列情况下,构造时会有异常:

  •     基础面在裁剪方向上不是周期性,但Param1或者Param2超出了基础面的边界。
  •     Param1 = Parram2