BRepOffsetAPI部分用法及坐标系变换


@版权声明:本文为版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
本文链接https://www.jianshu.com/p/7b5a3f96b3ea
如有问题, 可邮件([email protected])咨询。


关键字:OpenCascade、BrepOffsetAPI_MakePipeShell、BrepOffsetAPI_MakePipe、坐标系变换

一个截面沿着路径扫掠可以使用BrepOffsetAPI_MakePipeShell和BrepOffsetAPI_MakePipe,

BrepOffsetAPI_MakePipeShell

由一个TopoDS_Wire沿着一条路径TopoDS_Wire进行扫掠,最终形成一个TopoDS_Shell

BrepOffsetAPI_MakePipeShell pipeMaker(pathWire);//pathWire为路径 类型为TopoDS_Wire
pipeMaker.Add(profileWire,Standard_True,Standard_True);//profileWire为路径起点处截面 该面法线必须与路径起点切线一致
pipeMaker.SetMode(Standard_True);//必须设置该项
pipeMaker.Bulider();

BrepOffsetAPI_MakePipe

由一个TopoDS_Face或一个TopoDS_Wire沿着一条路径TopoDS_Wire进行扫了,前者形成TopoDS_Shell
,后者形成一个TopoDS_Solid

BrepOffsetAPI_MakePipe pipeMaker(pathWire,profileWire,GeomFill_Trihedron::GeomFill_isFrenet,Standard_False);
//注意这里第三个参数必须设置为GeomFill_Trihedron::GeomFill_isFrenet
//与BrepOffsetAPI_MakePipeShell中SetMode(Standard_True);表示同一个意思,截面法线将沿着路径进行调整

关于截面设置的问题

但以上两种都需要我们的给定的起始截面的法线与路径在该处的切线一致。
可以通过坐标系变换来做到。
比如目前有一条路径TopoDS_Edge aHelixEdge
求出该路径起点的切线

Standard_Real firstParam;//记录起点参数
Standard_Real secondParam;//极了终点参数
Handle(Geom_Curve) curve = BRep::Tool::Curve(aHelixEdge,firstParam,secondParam);//BRep::Tool获取其基础类型并返回起点和终点参数

//求曲线在起点处的一阶导数
gp_Pnt normalLocation;//记录曲线起点坐标点
gp_Vec dires;//记录曲线在起点的切线方向
curve->D1(firstParam,normalLocation,dires);//获取起点处的坐标点和切线方向

则该切线方向就是我们新坐标系z轴
新坐标系的x轴方向为 gp_Vec newXVec(location,normalLocation)
新坐标新的原点为normalLocation

//模型坐标系为
gp_Ax3 ori(gp::Origin,gp::DZ(),gp::DX());
//构造新的坐标系
gp_Ax3 newLocation(normalLocation,gp_Dir(dires),newXVec);

现在要求一个矩阵 目的是将模型坐标系ori转化为新的坐标系

gp_Trsf trsf;
trsf.SetTransformation(ori,newLocation);//新坐标系用模型坐标系表达,也就是该矩阵可以将新坐标系转化为模型坐标系
//下面求trsf的逆矩阵就好了
gp_Trsf trsfOldToNew = trsf.Inverted();//求逆矩阵,将模型坐标系转化为了新的坐标系

//下面就简单了,只用在模型坐标系中xy平面中建立一个面,在通过trsfOldToNew ,就能将该面移动到新的坐标系位置。

//例如:
gp_Pnt pos1(-10,10,0);//模型坐标系中梯形左上角点
gp_Pnt pos2(-10,-10,0);//模型坐标系中梯形左下角点
gp_Pnt pos3(10,-5,0);//模型坐标系中梯形右下角点
gp_Pnt pos4(10,5,0);//模型坐标系中梯形右下角点
TopoDS_Edge edget1 = BRepBuliderAPI_MakeEdge(pos1,pos2);
TopoDS_Edge edget2 = BRepBuliderAPI_MakeEdge(pos2,pos3);
TopoDS_Edge edget3 = BRepBuliderAPI_MakeEdge(pos3,pos4);
TopoDS_Edge edget4 = BRepBuliderAPI_MakeEdge(pos4,pos1);
ToopDS_Wire wiret = BRepBuliderAPI_MakeWire(edget1,edget2,edget3,edget4);//模型坐标系中网格

//下面将模型坐标系中网格转化为新坐标系中网格
BRepBuliderAPI_Transform aBRepTrsf(wiret ,trsfOldToNew);
TopoDS_Shape aTrasdShape;
if(aBrepTrsf.isDone())
{
   aTrasdShape = aBRepTrsf.Shape();
}
TopoDs_Wire aTransdWire = TopoDS::Wire(aTrasdShape );

以上变换主要在于理解清楚以下5个方面:

1.目标:要将一个坐标系中的点变换为另一个坐标系的点。

  1. 坐标系的变换只是坐标系的基变换
  2. 我们可以找到一个矩阵,可以将后一个坐标系的基用前一个坐标系的基来表达,如上面trsf.SetTransformation(ori,newLocation);
  3. 以上trsf就可以将后一个坐标系中的点变换为前一个坐标系的点
  4. 再求逆矩阵即可

你可能感兴趣的:(BRepOffsetAPI部分用法及坐标系变换)