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

创建基本形状

基本形状包括方盒,圆柱,圆锥/圆台,球,圆环。

方盒

AMCAX::MakeBox 类提供创建方盒的功能。

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
Class of making a box
定义 MakeBox.hpp:18
Base class of shape, containing an underlying shape with a location and an orientation
定义 TopoShape.hpp:15
PointT< double, 3 > Point3
三维点
定义 PointT.hpp:459

圆柱

AMCAX::MakeCylinder 类提供创建圆柱的功能。

AMCAX::TopoShape cylinder = AMCAX::MakeCylinder(AMCAX::Frame3(AMCAX::Point3(0.0, 0.0, 0.0), AMCAX::Direction3(0.0, 0.0, 1.0)), 3.0, 5.0);
Class of making a cylinder
定义 MakeCylinder.hpp:16
DirectionT< double, 3 > Direction3
三维方向
定义 DirectionT.hpp:587
FrameT< double, 3 > Frame3
三维标架
定义 FrameT.hpp:885

圆锥/圆台

AMCAX::MakeCone 类提供创建圆锥/圆台的功能。

AMCAX::TopoShape cone = AMCAX::MakeCone(4.0, 0.0, 4.0);
Class of making a cone
定义 MakeCone.hpp:16

AMCAX::MakeSphere 类提供创建球的功能。

AMCAX::TopoShape sphere = AMCAX::MakeSphere(AMCAX::Point3(-3.0, 0.0, 0.0), 1.0);
Class of making a sphere
定义 MakeSphere.hpp:16

圆环

AMCAX::MakeTorus 类提供创建圆环的功能。

AMCAX::TopoShape torus = AMCAX::MakeTorus(AMCAX::Frame3(AMCAX::Point3(0.0, 0.0, 2.0), AMCAX::Direction3(1.0, 0.0, 0.0)), 4.0, 2.0);
Class of making a torus
定义 MakeTorus.hpp:19

布尔运算

布尔运算功能包括融合,求交,剪切,分割,计算截面线。

融合

AMCAX::BoolBRepFuse 类提供融合功能。

AMCAX::TopoShape shape1, shape2;
AMCAX::OCCTIO::OCCTTool::Read(shape1, "./data/part.brep");
AMCAX::OCCTIO::OCCTTool::Read(shape2, "./data/box.brep");
AMCAX::TopoShape fuse = AMCAX::BoolBRepFuse(shape1, shape2);
并集运算的类
定义 BoolBRepFuse.hpp:15
static AMCAX_API bool Read(TopoShape &s, std::istream &is)
Read a shape from a stream

求交

AMCAX::BoolBRepCommon 类提供求交功能。

AMCAX::TopoShape shape1, shape2;
AMCAX::OCCTIO::OCCTTool::Read(shape1, "./data/part.brep");
AMCAX::OCCTIO::OCCTTool::Read(shape2, "./data/box.brep");
AMCAX::TopoShape common = AMCAX::BoolBRepCommon(shape1, shape2);
交集运算的类
定义 BoolBRepCommon.hpp:14

剪切

AMCAX::BoolBRepCut 类提供剪切功能。

切割运算的类
定义 BoolBRepCut.hpp:16

分割

AMCAX::BoolBRepSplitter 类提供分割功能。

AMCAX::TopoShape shape1, shape2;
AMCAX::OCCTIO::OCCTTool::Read(shape1, "./data/part.brep");
AMCAX::OCCTIO::OCCTTool::Read(shape2, "./data/box.brep");
auto tool_shape = std::list{ shape1 };
auto tool_argument = std::list{ shape2 };
splitter.SetTools(tool_shape);
splitter.SetArguments(tool_argument);
AMCAX::TopoShape split = splitter.Shape();
分割操作的类
定义 BoolBRepSplitter.hpp:16
AMCAX_API void SetTools(const std::list< TopoShape > &ls)
设置工具形状
AMCAX_API void SetArguments(const std::list< TopoShape > &listargs)
设置要处理的形状
virtual AMCAX_API const TopoShape & Shape()
Get the resulting shape

计算截面线

AMCAX::BoolBRepSection 类提供计算截面线功能。

AMCAX::TopoShape section = AMCAX::BoolBRepSection(cone, sphere);
计算形状间交线运算的类
定义 BoolBRepSection.hpp:17

拉伸(扫掠)创建功能

AMCAX::MakePrism 类提供拉伸(扫掠)功能。

AMCAX::MakeGeom3Ellipse makeEllipse(AMCAX::Frame3(), 3.0, 1.0);
std::shared_ptr<AMCAX::Geom3Curve> curve = makeEllipse.Value();
Class of making an edge
定义 MakeEdge.hpp:24
Class of making a face
定义 MakeFace.hpp:22
构造三维几何椭圆的类
定义 MakeGeom3Ellipse.hpp:13
Class of making a prism or an extrusion shape
定义 MakePrism.hpp:16
Class of making a wire
定义 MakeWire.hpp:17
Class of edge
定义 TopoEdge.hpp:12
Class of face
定义 TopoFace.hpp:12
Class of wire
定义 TopoWire.hpp:12
VectorT< double, 3 > Vector3
三维向量
定义 VectorT.hpp:707

旋转(扫掠)创建功能

AMCAX::MakeRevol 类提供旋转(扫掠)功能。

std::vector<AMCAX::Point3> poles{ AMCAX::Point3(1.0, 0.0, 0.0), AMCAX::Point3(0.8, 0.0, 0.5), AMCAX::Point3(1.0, 0.0, 1.0) };
auto bz = std::make_shared<AMCAX::Geom3BezierCurve>(poles);
static AMCAX_API const Axis3 & OZ() noexcept
获取三维中的 z 轴,包括原点和 z 轴方向
Class of making a revolved shape
定义 MakeRevol.hpp:18

pipe管道功能

通过指定脊线(线框-Wire)和轮廓(形状-Shape)来创建管道。可通过 AMCAX::MakePipeAMCAX::MakePipeShell 实现。MakePipe 为简单的管道算法,仅适用单个截面(平面形状)和光滑轨道。MakePipeShell 为更完备的管道算法,支持多个截面(平面形状),支持轨道不光滑。但路径必须和截面平面相交。需要注意的是:Add 只能是 TopoWire 或 TopoVertex。

double radius = 0.1;
AMCAX::Frame3 aFrame(AMCAX::Point3(0., 0., 0.), AMCAX::Direction3(-8.57143, 0., 4.));
AMCAX::Circle3 aCircle = AMCAX::Circle3(aFrame, radius);
std::vector<AMCAX::Point3> pointSet;
pointSet.push_back(AMCAX::Point3(0., 0., 0.));
pointSet.push_back(AMCAX::Point3(-1., 0., 1.));
pointSet.push_back(AMCAX::Point3(0., 0., 2.));
pointSet.push_back(AMCAX::Point3(1., 0., 3.));
pointSet.push_back(AMCAX::Point3(0., 0., 4.));
std::shared_ptr<AMCAX::Geom3BSplineCurve> aBSplineCurve = AMCAX::NURBSAPIInterpolate::InterpolatePoints(pointSet,
AMCAX::TopoEdge aSpineEdge = AMCAX::MakeEdge(aBSplineCurve);
AMCAX::TopoWire aSpineWire = AMCAX::MakeWire(aSpineEdge);
AMCAX::TopoShape aPipe = AMCAX::MakePipe(aSpineWire, aFace);
//MakePipeShell
AMCAX::MakePipeShell ps(aSpineWire);
ps.Add(aWire,false,false);
ps.Build();
Class of make pipe algorithm
定义 MakePipe.hpp:20
Class of making pipe shell algorithm
定义 MakePipeShell.hpp:35
static AMCAX_API std::shared_ptr< Geom3BSplineCurve > InterpolatePoints(const std::vector< Point3 > &points, int degree=3, bool isClosed=false, ApproxParameterizationType ptype=ApproxParameterizationType::ChordLength)
构造顺序通过数据点的插值曲线
CircleS< 3 > Circle3
三维圆
定义 CircleT.hpp:178
@ Centripetal
向心参数化:数据点的参数与它们之间距离的平方根成正比
定义 ApproxParameterizationType.hpp:17

放样操作

AMCAX::MakeLoft 类提供放样功能。添加若干 Wire,可以放样出 Shell 或 Solid。

AMCAX::Point3 aPoint1(1.0, 0.0, 0.0);
AMCAX::Point3 aPoint2(-0.5, std::sqrt(3.0) * 0.5, 0.0);
AMCAX::Point3 aPoint3(-0.5, -std::sqrt(3.0) * 0.5, 0.0);
AMCAX::MakePolygon aPolygon(aPoint1, aPoint2, aPoint3, true);
AMCAX::TopoWire bottomWire = aPolygon.Wire();
aTransform.SetTranslationPart(AMCAX::Vector3(0.0, 0.0, 3.0));
AMCAX::TopoWire topWire = AMCAX::TopoCast::Wire(AMCAX::TransformShape(bottomWire, aTransform));
AMCAX::MakeLoft aMakeLoft(true, true);
aMakeLoft.AddWire(bottomWire);
aMakeLoft.AddWire(topWire);
aMakeLoft.Build();
AMCAX::TopoShape loft = aMakeLoft.Shape();
Class of making a lofting shape
定义 MakeLoft.hpp:30
Class of making a polygon
定义 MakePolygon.hpp:18
static AMCAX_API const TopoWire & Wire(const TopoShape &s)
Cast shape to wire
Class of transforming a shape
定义 TransformShape.hpp:12
constexpr void SetTranslationPart(const VectorT< OtherScalar, DIM > &vec) noexcept
设置变换中的平移部分
定义 TransformationT.hpp:337
void SetRotation(const PointT< OtherScalar, DIM > &point, const OtherScalar2 &angle) noexcept
设置变换为二维中绕点旋转某一角度
定义 TransformationT.hpp:138
TransformationT< double, 3 > Transformation3
三维变换
定义 TransformationT.hpp:1102

圆角和倒角功能(支持可变半径)

圆角

圆角是取代锋利边缘的光滑面。 AMCAX::MakeFillet 类和 AMCAX::MakeFillet2d 类提供圆角的功能。

MakeFillet(圆角)

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, -5.0), AMCAX::Point3(5.0, 5.0, 5.0));
AMCAX::TopoExplorerTool::MapShapes(box, AMCAX::ShapeType::Edge, edges);
AMCAX::TopoShape e1 = edges[0];
mf.Add(1.0, AMCAX::TopoCast::Edge(e1));
mf.Build();
AMCAX::TopoShape box_fillet = mf.Shape();
索引集的模板类
定义 IndexSet.hpp:20
圆角类
定义 MakeFillet.hpp:23
static AMCAX_API const TopoEdge & Edge(const TopoShape &s)
Cast shape to edge
static AMCAX_API void MapShapes(const TopoShape &s, ShapeType t, IndexSet< TopoShape > &shapeSet)
Construct a set of sub-shapes of given type

MakeFillet2d(平面圆角)

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, -5.0), AMCAX::Point3(5.0, 5.0, 5.0));
AMCAX::TopoExplorerTool::MapShapes(box, AMCAX::ShapeType::Face, faces);
AMCAX::TopoShape f = faces[0];
AMCAX::TopoExplorerTool::MapShapes(f1, AMCAX::ShapeType::Vertex, vertex);
AMCAX::TopoShape v1 = vertex[0];
mf2d.AddFillet(AMCAX::TopoCast::Vertex(v1), 1.0);
mf2d.Build();
AMCAX::TopoShape box_fillet2d = mf2d.Shape();
在平面顶点上构造圆角和倒角的类
定义 MakeFillet2d.hpp:20
static AMCAX_API const TopoVertex & Vertex(const TopoShape &s)
Cast shape to vertex
static AMCAX_API const TopoFace & Face(const TopoShape &s)
Cast shape to face

倒角

AMCAX::MakeChamfer 类提供倒角功能。

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, -5.0), AMCAX::Point3(5.0, 5.0, 5.0));
AMCAX::TopoExplorerTool::MapShapes(box, AMCAX::ShapeType::Edge, edges);
AMCAX::TopoShape e1 = edges[0];
mc.Add(1.0, AMCAX::TopoCast::Edge(e1));
mc.Build();
AMCAX::TopoShape box_chamfer = mc.Shape();
倒角类
定义 MakeChamfer.hpp:20

形状偏移功能

AMCAX::MakeOffset 类和 AMCAX::MakeOffsetShape 类提供对形状偏移的功能。

MakeOffset(2D形状的偏移)

输入wire进行offset,输入Face则对其边界进行offset,最后返回offset后的wire。

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, -5.0), AMCAX::Point3(5.0, 5.0, 5.0));
AMCAX::TopoExplorerTool::MapShapes(box, AMCAX::ShapeType::Face, faces);
AMCAX::TopoShape f = faces[0];
AMCAX::TopoExplorerTool::MapShapes(f, AMCAX::ShapeType::Wire, wire);
//wire
double offset = 1.5;
bool isOpenResult = false;
AMCAX::MakeOffset MakeOffset(w, theJoin, isOpenResult);
MakeOffset.Perform(offset);
AMCAX::TopoShape offset1 = MakeOffset.Shape();
//face
AMCAX::MakeOffset MakeOffset2(f1, theJoin, isOpenResult);
MakeOffset2.Perform(offset);
AMCAX::TopoShape offset2 = MakeOffset2.Shape();
Class of making offset wires
定义 MakeOffset.hpp:19
static AMCAX_API bool Write(const TopoShape &s, std::ostream &os, int format=3)
Write a shape to a stream
JoinType
连接类型
定义 GeometryMacros.hpp:74
@ Arc
构建圆弧过渡
定义 GeometryMacros.hpp:76

MakeOffsetShape(3D形状的偏移)

输入face进行offset,输入shell则对其整个solid进行offset,最后返回offset后的face或solid。

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, -5.0), AMCAX::Point3(5.0, 5.0, 5.0));
AMCAX::TopoExplorerTool::MapShapes(box, AMCAX::ShapeType::Face, faces);
AMCAX::TopoShape f = faces[0];
//face
AMCAX::MakeOffsetShape MakeOffsetShape;
double offsetvalue = 1.2;
MakeOffsetShape.PerformBySimple(f, offsetvalue);
MakeOffsetShape.Build();
AMCAX::TopoShape offsetshape1 = MakeOffsetShape.Shape();
AMCAX::OCCTIO::OCCTTool::Write(offsetshape1, "MakeOffsetShape-face.brep");
//shell
AMCAX::MakeOffsetShape MakeOffsetShape2;
AMCAX::TopoExplorerTool::MapShapes(box, AMCAX::ShapeType::Shell, shell);
AMCAX::TopoShape s = shell[0];
MakeOffsetShape2.PerformBySimple(s, offsetvalue);
MakeOffsetShape2.Build();
AMCAX::TopoShape offsetshape2 = MakeOffsetShape2.Shape();
Class of build a shell out of a shape algorithm
定义 MakeOffsetShape.hpp:18
AMCAX_API void PerformBySimple(const TopoShape &s, double offsetValue)
Construct an offset shape using the simple algorithm without intersections computation
AMCAX_API void Build() override
Perform the algorithm

形状加厚

AMCAX::MakeThickSolid 类提供形状加厚的功能。

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, -5.0), AMCAX::Point3(5.0, 5.0, 5.0));
AMCAX::TopoExplorerTool::MapShapes(box, AMCAX::ShapeType::Face, faces);
AMCAX::TopoShape f = faces[0];
double offsetvalue=1.5;
ts.MakeThickBySimple(f,offsetvalue);
ts.Build();
AMCAX::TopoShape thicksolid = ts.Shape();
Class of making a thick solid shape
定义 MakeThickSolid.hpp:12
AMCAX_API void Build() override
Perform the algorithm
AMCAX_API void MakeThickBySimple(const TopoShape &s, double offsetValue)
Make a thick solid using simple algorithm, only for a non-closed single face or shell which contain t...

替换面

AMCAX::BoolBRepReplaceFace 类提供替换面的功能。即选择实体中的一个面,将其替换成另一个曲面。基本逻辑是将被替换的面周围的面进行延伸,与新的曲面进行相交并重构拓扑。但如果曲面不能覆盖被替换的面,替换会失败。

AMCAX::TopoExplorerTool::MapShapes(cylinder, AMCAX::ShapeType::Face, shapeFaces);
AMCAX::TopoFace upface = static_cast<const AMCAX::TopoFace&>(shapeFaces[1]);
AMCAX::Plane plane(AMCAX::Point3(0., 0., 12.), AMCAX::Direction3(0.2, 0.2, 1.0));
std::shared_ptr<AMCAX::Geom3Plane> surf = std::make_shared<AMCAX::Geom3Plane>(plane);
rf.SetShape(cylinder);
rf.AddFaceToReplace(upface);
rf.Build();
if (rf.IsDone())
{
AMCAX::TopoShape result = rf.Shape();
AMCAX::OCCTIO::OCCTTool::Write(result, "BoolBRepReplaceFace.brep");
}
使用一个曲面替换实体中特征面的的类,输入曲面必须足够大以包含特征面
定义 BoolBRepReplaceFace.hpp:17
AMCAX_API void SetReplaceSurface(const std::shared_ptr< Geom3Surface > &surface)
设置用于替换特征面的曲面
AMCAX_API void AddFaceToReplace(const TopoShape &face)
添加一个输入形状中要被替换的面
AMCAX_API void SetShape(const TopoShape &shape)
设置需要执行替换特征面的实体形状
AMCAX_API void Build() override
执行算法
virtual AMCAX_API bool IsDone() const
Is the construction algorithm done
平面类
定义 Plane.hpp:13

薄板样条曲线插值

在插值时,不难发现通过这些点的曲线并不唯一。

通常来说,蓝色的曲线比绿色的曲线更符合CAD的设计意图。我们将曲线的长度不要太长、弯曲程度不要变化太过剧烈作为目标,可以构建薄板能量用来度量曲线的合格程度:

E1用来控制曲线的长度,E2用来控制曲线的变化速度。alpha越大,曲线的长度越短。beta越大,曲线的形状变化越平滑。AMCAX::NURBSAPIInterpolate 类提供薄板样条曲线插值的功能。具体如下:
AMCAX::NURBSAPIInterpolate::InterpolatePointsThinPlate:输入数据点的坐标和对应曲线的参数(可选)以及插值曲线的一些信息(周期性,薄板能量权重),构造通过每一个数据点,并尽可能满足薄板能量的 NURBS 曲线。
AMCAX::NURBSAPIInterpolate::InterpolateNodesThinPlate:输入数据点的坐标和各阶梯度(可选)和对应曲线的参数(可选)以及插值曲线的一些信息(周期性,薄板能量权重),构造通过每一个数据点,并尽可能满足薄板能量的 NURBS 曲线。

std::vector<AMCAX::Point3> points;
points.push_back(AMCAX::Point3(0.0, 0.0, 0.0));
points.push_back(AMCAX::Point3(-0.1, 1.0, -0.2));
points.push_back(AMCAX::Point3(0.1, 2.0, -0.1));
points.push_back(AMCAX::Point3(0.2, 3.0, 0.1));
points.push_back(AMCAX::Point3(0.1, 4.0, 0.0));
points.push_back(AMCAX::Point3(0.0, 5.0, -0.1));
bool isClosed = false;
double alpha = 1e-2;
double beta = 1e-2;
std::vector< double > parameterization = { 0.0,0.1,0.2,0.3,0.4,0.5 };
std::vector<AMCAX::InterpolationNode> nodes;
AMCAX::Point3 p1(0., 0., 0.);
AMCAX::Point3 p2(1., 1., 1.);
AMCAX::Vector3 v1(2.,0.,0.), v2;
nodes.push_back({ p1,true,v1,false,v2 });
nodes.push_back({ p2,true,v1,false,v2 });
std::vector<double> parameterization1{ 0.0,0.5 };
auto thinplate1 = AMCAX::NURBSAPIInterpolate::InterpolatePointsThinPlate(points, isClosed, ptype, alpha, beta);
auto thinplate2 = AMCAX::NURBSAPIInterpolate::InterpolatePointsThinPlate(points, parameterization, isClosed, alpha, beta);
auto thinplate3 = AMCAX::NURBSAPIInterpolate::InterpolateNodesThinPlate(nodes, isClosed, ptype,alpha, beta);
auto thinplate4 = AMCAX::NURBSAPIInterpolate::InterpolateNodesThinPlate(nodes, parameterization1, isClosed, alpha, beta);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(thinplate1), "InterpolatePointsThinPlate1.brep");
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(thinplate2), "InterpolatePointsThinPlate2.brep");
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(thinplate3), "InterpolatePointsThinPlate3.brep");
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(thinplate4), "InterpolatePointsThinPlate4.brep");
常值法则函数的类
定义 LawConstant.hpp:12
static AMCAX_API std::shared_ptr< Geom3BSplineCurve > InterpolateNodesThinPlate(const std::vector< InterpolationNode > &nodes, bool isClosed=false, ApproxParameterizationType ptype=ApproxParameterizationType::ChordLength, double alpha=1e-3, double beta=1e-3)
构造符合薄板能量且顺序通过数据点的插值曲线
static AMCAX_API std::shared_ptr< Geom3BSplineCurve > InterpolatePointsThinPlate(const std::vector< Point3 > &points, bool isClosed, ApproxParameterizationType ptype, double alpha, double beta)
构造符合薄板能量且顺序通过数据点的 B 样条曲线
ApproxParameterizationType
曲线拟合中参数化类型的枚举类
定义 ApproxParameterizationType.hpp:12
@ ChordLength
弦长参数化:数据点的参数与它们之间的距离成正比
定义 ApproxParameterizationType.hpp:14

将法则曲线转成三维几何曲线

使用 AMCAX::LawFunction::ToCurve()可将法则曲线转成三维几何曲线。
以常值函数为例,r 对应是 y 的值,pf 和 pl 是 x 的起始参数和终止参数。

double r = 5.0;
double pr = 1.0;
double pl = 10.0;
law.Set(r, pr, pl);
auto e1 = law.ToCurve();
AMCAX_API void Set(double r, double pf, double pl)
设置参数
AMCAX_API std::shared_ptr< Geom3Curve > ToCurve() const override
将法则函数转换为曲线

部分图片来源: https://dev.opencascade.org/doc/overview/html/index.html ,版权归其所有。