AMCAX Kernel
Geometry kernel for CAD/CAE/CAM
九韶内核 1.0.0.0
载入中...
搜索中...
未找到
NURBS建模示例

概述

本教程提供了 AMCAX NURBS模组对管道模型进行建模的基本用法。

模型预览

本教程使用管道模型来展示 AMCAX NURBS模组中的一些主要建模功能。模型如下图所示:

管道模型

该模型由三个NURBS曲面组成:

  1. 左侧的管道。
  2. 中间过渡管道。
  3. 右侧圆形截面管道。

我们将逐步介绍这些结构,并尽可能详细地提供解释。

构建左侧管道

创建椭圆截面曲线

第一步是使用 AMCAX::Geom3Ellipse 类创建一个椭圆。

std::shared_ptr<AMCAX::Geom3Ellipse> gellipse = std::make_shared<AMCAX::Geom3Ellipse>(AMCAX::Frame3(), 0.7, 0.5);
gellipse->Translate(AMCAX::Vector3(3.0, 0.0, 0.0));
VectorT< double, 3 > Vector3
三维向量
定义 VectorT.hpp:707
FrameT< double, 3 > Frame3
三维标架
定义 FrameT.hpp:885

创建B样条截面曲线

第二步是使用 AMCAX::NURBSAPIBuildCurve 类创建一个B样条曲线。

std::vector<AMCAX::Point3> sectionPoles;
sectionPoles.push_back(AMCAX::Point3(0.5, 0.5, 1.5));
sectionPoles.push_back(AMCAX::Point3(0.5, -0.25, 1.5));
sectionPoles.push_back(AMCAX::Point3(0.5, -0.75, 2.0));
sectionPoles.push_back(AMCAX::Point3(0.5, -0.25, 2.5));
sectionPoles.push_back(AMCAX::Point3(0.5, 0.5, 2.5));
sectionPoles.push_back(AMCAX::Point3(0.5, 0.0, 2.0));
std::shared_ptr<AMCAX::Geom3BSplineCurve> endingProfileCurve = AMCAX::NURBSAPIBuildCurve::BuildCurve(sectionPoles, 3, true);
static AMCAX_API std::shared_ptr< Geom3BSplineCurve > BuildCurve(const std::vector< Point3 > &poles, int degree, bool isPeriodic)
Build BSpline curve
PointT< double, 3 > Point3
三维点
定义 PointT.hpp:459

创建引导曲线

第三步是使用 AMCAX::NURBSAPIBuildCurve 类创建两个B样条曲线作为引导曲线。

std::vector<AMCAX::Point3> guidePoles;
guidePoles.push_back(AMCAX::Point3(3.0, 0.5, 0.0));
guidePoles.push_back(AMCAX::Point3(3.0, 0.5, 2.0));
guidePoles.push_back(AMCAX::Point3(0.5, 0.5, 2.0));
std::shared_ptr<AMCAX::Geom3BSplineCurve> guide = AMCAX::NURBSAPIBuildCurve::BuildCurve(guidePoles, 2, false);

应用 单轨扫掠

然后,使用 AMCAX::NURBSAPISweep 类创建扫掠曲面。

std::vector<std::pair<int, double>> guideCorrParams;
std::vector<AMCAX::NURBSCurveSection> profiles;
profiles.push_back(AMCAX::NURBSCurveSection(gellipse));
profiles.push_back(AMCAX::NURBSCurveSection(endingProfileCurve));
auto sweptSurfaces = AMCAX::NURBSAPISweep::SweepOneRail(profiles, guide, 0.0, guideCorrParams, false, true);
std::shared_ptr<AMCAX::Geom3BSplineSurface> complexPipe = sweptSurfaces.front();
static AMCAX_API std::vector< std::shared_ptr< Geom3BSplineSurface > > SweepOneRail(const std::shared_ptr< Geom3BSplineCurve > &profile, const std::shared_ptr< Geom3BSplineCurve > &spine, bool isParallel)
Sweep a profile along a spine
Class of curve section
定义 NURBSCurveSection.hpp:17

点击这里example01可获得以上示例完整源码,大家根据学习需要自行下载。

构建右侧圆形截面管道

构建扫掠路径

扫掠路径是一个形状接近于四分之一椭圆的路径。

std::vector<AMCAX::Point3> centerCurvePoles;
centerCurvePoles.push_back(AMCAX::Point3(-3.0, 0.0, 0.0));
centerCurvePoles.push_back(AMCAX::Point3(-3.0, 0.0, 2.0));
centerCurvePoles.push_back(AMCAX::Point3(-1.0, 0.0, 2.0));
std::shared_ptr<AMCAX::Geom3BSplineCurve> centerCurve = AMCAX::NURBSAPIBuildCurve::BuildCurve(centerCurvePoles, 2, false);

设置扫掠脊线

这里我们将脊线简单地设置为扫掠路径。

std::shared_ptr<AMCAX::Geom3BSplineCurve> spine = centerCurve;
double spineLeftBound = spine->FirstParameter();
double spineRightBound = spine->LastParameter();

构建圆形截面半径

这里我们将圆形截面的半径简单地设置为固定值0.5。

radiusLaw.Set(0.5, 0.0, 1.0);
常值法则函数的类
定义 LawConstant.hpp:12
AMCAX_API void Set(double r, double pf, double pl)
设置参数

创建扫掠面

接下来,我们使用 AMCAX::NURBSAPICircularSweep 类生成扫掠面。

auto [status, circlePipe] = AMCAX::NURBSAPICircularSweep::SweepWithCenterAndRadius(centerCurve, radiusLaw, spine, spineLeftBound, spineRightBound);
if (status != AMCAX::NURBSSweepStatus::Success || !circlePipe)
{
return;
}
static AMCAX_API std::pair< NURBSSweepStatus, std::shared_ptr< Geom3BSplineSurface > > SweepWithCenterAndRadius(const std::shared_ptr< Geom3BSplineCurve > &centerCurve, const LawFunction &radiusLaw, const std::shared_ptr< Geom3BSplineCurve > &spine, double spineLeftBound, double spineRightBound)
根据中心曲线和半径构造圆弧截面扫掠曲面

点击这里example02可获得以上示例完整源码,大家根据学习需要自行下载。

构建中间过渡曲面

最后,我们中间的过渡曲面。

设置过渡曲面参数

std::vector<double> parameters1 = {1.0, 1.0};
std::vector<double> parameters2 = {1.0, 1.0};
std::vector<double> tol = {0.001, 0.1 * M_PI / 180.0, 0.05};

构建过渡曲面

std::shared_ptr<AMCAX::Geom3BSplineSurface> blendSurface = AMCAX::NURBSAPIBlend::BlendSurfaces(circlePipe, false, false, AMCAX::ContinuityType::G2, parameters1, complexPipe, false, false, AMCAX::ContinuityType::G2, parameters2, true, true, tol);
static AMCAX_API std::shared_ptr< Geom3BSplineSurface > BlendSurfaces(const std::shared_ptr< Geom3BSplineSurface > &surf1, bool isUIso1, bool isFront1, ContinuityType cont1, std::vector< double > &parameters1, const std::shared_ptr< Geom3BSplineSurface > &surf2, bool isUIso2, bool isFront2, ContinuityType cont2, std::vector< double > &parameters2, bool autoReverse, bool isPrecise, const std::vector< double > &tol)
给定两个曲面,构造两个曲面的混接曲面

点击这里example03可获得NURBS建模示例完整源码,大家根据学习需要自行下载。

附录

下面列出了此示例的完整代码:

#include <memory>
#include <vector>
void TestPipe()
{
// build a complex pipe
// build section curves
std::shared_ptr<AMCAX::Geom3Ellipse> gellipse = std::make_shared<AMCAX::Geom3Ellipse>(AMCAX::Frame3(), 0.7, 0.5);
gellipse->Translate(AMCAX::Vector3(3.0, 0.0, 0.0));
std::vector<AMCAX::Point3> sectionPoles;
sectionPoles.push_back(AMCAX::Point3(0.5, 0.5, 1.5));
sectionPoles.push_back(AMCAX::Point3(0.5, -0.25, 1.5));
sectionPoles.push_back(AMCAX::Point3(0.5, -0.75, 2.0));
sectionPoles.push_back(AMCAX::Point3(0.5, -0.25, 2.5));
sectionPoles.push_back(AMCAX::Point3(0.5, 0.5, 2.5));
sectionPoles.push_back(AMCAX::Point3(0.5, 0.0, 2.0));
std::shared_ptr<AMCAX::Geom3BSplineCurve> endingProfileCurve = AMCAX::NURBSAPIBuildCurve::BuildCurve(sectionPoles, 3, true);
// build guide curves
std::vector<AMCAX::Point3> guidePoles;
guidePoles.push_back(AMCAX::Point3(3.0, 0.5, 0.0));
guidePoles.push_back(AMCAX::Point3(3.0, 0.5, 2.0));
guidePoles.push_back(AMCAX::Point3(0.5, 0.5, 2.0));
std::shared_ptr<AMCAX::Geom3BSplineCurve> guide = AMCAX::NURBSAPIBuildCurve::BuildCurve(guidePoles, 2, false);
// sweeping to build surface
std::vector<std::pair<int, double>> guideCorrParams;
std::vector<AMCAX::NURBSCurveSection> profiles;
profiles.push_back(AMCAX::NURBSCurveSection(gellipse));
profiles.push_back(AMCAX::NURBSCurveSection(endingProfileCurve));
auto sweptSurfaces = AMCAX::NURBSAPISweep::SweepOneRail(profiles, guide, 0.0, guideCorrParams, false, true);
std::shared_ptr<AMCAX::Geom3BSplineSurface> complexPipe = sweptSurfaces.front();
// build a circle section pipe
// build the pipe center curve
std::vector<AMCAX::Point3> centerCurvePoles;
centerCurvePoles.push_back(AMCAX::Point3(-3.0, 0.0, 0.0));
centerCurvePoles.push_back(AMCAX::Point3(-3.0, 0.0, 2.0));
centerCurvePoles.push_back(AMCAX::Point3(-1.0, 0.0, 2.0));
std::shared_ptr<AMCAX::Geom3BSplineCurve> centerCurve = AMCAX::NURBSAPIBuildCurve::BuildCurve(centerCurvePoles, 2, false);
// set the center curve as the spine
std::shared_ptr<AMCAX::Geom3BSplineCurve> spine = centerCurve;
double spineLeftBound = spine->FirstParameter();
double spineRightBound = spine->LastParameter();
// set the radius
AMCAX::LawConstant radiusLaw;
radiusLaw.Set(0.5, 0.0, 1.0);
// sweep to make the circle section pipe
auto [status, circlePipe] = AMCAX::NURBSAPICircularSweep::SweepWithCenterAndRadius(centerCurve, radiusLaw, spine, spineLeftBound, spineRightBound);
if (status != AMCAX::NURBSSweepStatus::Success || !circlePipe)
{
return;
}
// set the parameters
std::vector<double> parameters1 = {1.0, 1.0};
std::vector<double> parameters2 = {1.0, 1.0};
std::vector<double> tol = {0.001, 0.1 * M_PI / 180.0, 0.05};
std::shared_ptr<AMCAX::Geom3BSplineSurface> blendSurface = AMCAX::NURBSAPIBlend::BlendSurfaces(circlePipe, false, false, AMCAX::ContinuityType::G2, parameters1, complexPipe, false, false, AMCAX::ContinuityType::G2, parameters2, true, true, tol);
}
三维 B 样条曲线的类
三维 B 样条曲面的类
三维圆的类
三维椭圆的类
常值法则函数的类
混接操作的类
Class of NURBS curve building
NURBS 圆弧截面扫掠曲面的类
The class of one-rail sweeping
点的类