0

0

分享

【初级教程三】二维图形常用编辑操作

144 0
2024-10-28 10:19:41 天工开发者中心| 显示全部楼层 阅读模式
本帖最后由 天工开发者团队 于 2024-10-29 12:01 编辑

一、倒角
1.1 倒圆角
         倒圆角主要用到有两个方法Arcs2d::AddAsFilletNoTrim和Arcs2d::AddAsFillet,除了名字外它们的原型一致。
  1. Arc2dPtr Arcs2d::AddAsFilletNoTrim (IDispatch * Obj1,IDispatch * Obj2,double Radius, double xDirection,double yDirection );
复制代码
         Obj1,Obj2指示了参与倒角的对象。
         Radius指示了最终生成的圆的半径。
         xDirection,yDirection则构成一个方向点定义倒角区域。
  1. void DemoFillet(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
  5.     fwp::Arcs2dPtr pArcs2d = pProfile->GetArcs2d();

  6.     // 在原点处绘制两条交点在原点的直线,形成十字架
  7.     fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);  // 横线
  8.     fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);  // 竖线

  9.     // 两条线段形成'x'字形时,倒角可以有四种选择
  10.     // 通过指定方向点,其相对于交点的位置便可以确定倒角的区域
  11.     // 方向点(0.1,0.1)指示在第一象限倒角,0.05指示倒角半径,为演示其他象限,不修剪
  12.     fwp::Arc2dPtr pFilletFst = pArcs2d->AddAsFilletNoTrim(pLineHor, pLineVer, 0.05, 0.1, 0.1);

  13.     // 方向点(-0.1,-0.1)指示在第三象限处倒角,0.25指示倒角半径,并修剪
  14.     fwp::Arc2dPtr pFilletScd = pArcs2d->AddAsFillet(pLineHor, pLineVer, 0.25, -0.1, -0.1);
  15. }
复制代码
         上述代码演示了在二维草图中倒圆角的两个接口,运行效果如下,只要传入方向点定义倒角区域以及倒角半径即可。两个接口之间的差异只在于修剪不修剪倒角对象。
图片.png
1.2 斜角
         和圆角的情况相似,两条线段形成'X‘形时,有四个角区域可以进行倒角,输入一个方向点可以决定是在哪个区域倒角。倒斜角多了一个深度A、深度B的概念,如下两图所示:
企业微信截图_17158250619376.png
图片 (1).png
         方向点在角平线的哪侧,区分线一线二分别为倒角线和被倒角线,深度A为两线段交点距倒角线端点的距离,深度B为两线段交点距被倒角线端点的距离。
  1. void DemoChamfer(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();

  5.     // 在原点处绘制两条交点在原点的直线,形成十字架
  6.     fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);  // 横线
  7.     fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);  // 竖线

  8.     // 两条线段形成'x'字形时,倒角可以有四种选择
  9.     // 方向点(0.1,0.4)指示了倒角区域在第一象限,且倒角线为横线,被倒角线为竖线
  10.     fwp::Line2dPtr pChamHor2Ver = pLines2d->AddAsChamfer(pLineHor, pLineVer, 0.1, 0.4, 0.25, 0.15);

  11.     // 方向点(0.4,0.1)指示了倒角区域在第一象限,且倒角线为竖线,被倒角线为横线
  12.     fwp::Line2dPtr pChamVer2Hor = pLines2d->AddAsChamfer(pLineHor, pLineVer, 0.4, 0.1, 0.25, 0.15);
  13. }
复制代码
         上述代码演示了相同的倒角深度参数下,如何通过更改方向点使位于角平分线不同侧,以达到调整倒斜角效果的目的,运行效果如下。
图片 (2).png

二、修剪
2.1 修剪
         二维草图中的基本特征如线、弧、圆、椭圆、椭圆弧、样条曲线,都有裁剪功能,他们在接口中的原型都是一样的。
  1. HRESULT Trim (double x, double y,
  2. IDispatch * CutObj1,const _variant_t & CutObj2 = vtMissing )
复制代码
         调用对象是被裁剪的,CutObj1、CutObj2是裁剪对象,其中CutObj2是可选的。x、y定义了方向点决定裁剪部分。
         下面以线的裁剪为例示例。
  1. void DemoTrim(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();

  5.     // 在原点处绘制两条交点在原点的直线,形成十字架
  6.     fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);  // 横线
  7.     fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);  // 竖线
  8.     fwp::Line2dPtr pLineInclined = pLines2d->AddBy2Points(0.4, 0, 0, 0.4);  // 斜线

  9.     // 用斜线裁剪横线,方向点(0.5,0.1)指示裁剪的右侧,裁剪后横线的终点为(0.4,0)
  10.     pLineHor->Trim(0.5, 0.1, pLineInclined);

  11.     // 用斜线、横线裁剪竖线,此两条线将竖线分为三段,
  12.     // 方向点(0,0.2)指示裁剪三段中的中间段
  13.     _variant_t pLineHorVar;
  14.     pLineHorVar.vt = VT_DISPATCH;
  15.     pLineHorVar.pdispVal = pLineHor;
  16.     pLineVer->Trim(0, 0.2, pLineInclined, pLineHorVar);
  17. }
复制代码
         上述代码运行效果如下,主要演示了一个被裁剪对象的两种裁剪情况,第一种情况是被一个对象裁剪,此时裁剪对象可将被裁剪对象分割为两个部分,方向点决定被裁剪的部分。第二种情况,被两个对象裁剪,此时裁剪对象可将被裁剪对象分割为三个部分,方向点决定被裁剪的部分
企业微信截图_1730094054950.png
2.2 修剪拐角
        二维草图中的基本特征如线、弧、椭圆弧、样条曲线、线串,都有修剪拐角功能,他们在接口中的原型都是一样的。
  1. HRESULT CornerTrim (double xKeep,double yKeep,IDispatch * TargetObj, double xTargetKeep,double yTargetKeep )
复制代码
         拐角由调用对象拐向目标对象TargetObj,这时可能有多种可能,xKeep、yKeep限定了调用对象侧的可能,xTargetKeep、yTargetKeep构成一点限定了目标对象侧的可能。
         下面以线的修剪拐角为例示例。
  1. void DemoCornerTrim(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();

  5.     // 在原点处绘制两条交点在原点的直线,形成十字架
  6.     fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);  // 横线
  7.     fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);  // 竖线

  8.     // 两条线段形成'x'字形时,修剪拐角可以有四种选择
  9.     // 通过指定两个保留点,可以确定最终的拐角形状
  10.     // 当两条线段无交点时,两条线段者会延伸至交点
  11.     // 同样要指定两个保留点,只是此时拐角只会是一个形状。

  12.     // 用竖线修剪横线,最终形成第三象限的拐角
  13.     // 修剪对象保留点(-0.1,0)指示横线保留左侧
  14.     // 修剪目标保留点(0,-0.1)指示竖线保留下侧
  15.     pLineHor->CornerTrim(-0.1, 0, pLineVer, 0, -0.1);
  16. }
复制代码
         上述代码演示了修剪拐角一般使用方法,运行效果如下,可以看到关键是传入两个保留点以决定最终拐角的形状。
01e1c7fa-c453-488c-b22c-c8a363396a53.png

三、延伸/分割
3.1 延伸
         二维草图中的基本特征如线、弧、椭圆弧、样条曲线,都有延伸功能,他们在接口中的原型都是一样的。
  1. HRESULT Extend (double x,double y,IDispatch * TargetObj )
复制代码
         延伸此动作是由调用对象延伸向目标对象,TargetObj即目标对象,x、y则指出是调用对象的哪一侧延伸向目标对象。
下面以线的延伸为例示例。
  1. void  DemoExtend(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();

  5.     // 待延伸的线段,原点往左0.4长度的横线
  6.     fwp::Line2dPtr pLineToExtend = pLines2d->AddBy2Points(-0.4, 0, 0, 0);  // 横线

  7.     // 要延伸到的目标线段,一条距离原点0.1的竖线
  8.     fwp::Line2dPtr pLineTarget = pLines2d->AddBy2Points(0.1, 0.1, 0.1, -0.1);

  9.     // 开放路径必有两个延伸方向,方向点(-0.1,0)指示延伸方向为右侧
  10.     // 开放路径会选择距离方向点更近的一侧延伸
  11.     pLineToExtend->Extend(-0.1, 0, pLineTarget);
  12. }
复制代码
         上述代码演示了延伸一条线段的一般过程,运行效果如下,可以看到关键是传入方向点决定开放路径的延伸方向。
图片 (3).png
        方向点更改为(-0.4,0)时。
图片 (4).png
3.2 分割
3.2.1 开放路径
        二维草图中的开放路径(如线段、弧、样条曲线、椭圆弧)都有分割功能,它们的原型都是一样的。
  1. HRESULT SplitAtPoint (double x,double y,VARIANT * OtherSplitElement )
复制代码
         由原型可知,x、y提供了一个分割点;OtherSplitElement则为出参,表示分割出来的部分,不关心结果时也可以传入nullptr。
  1. void DemoOpenPathSplit(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
  5.     fwp::Line2dPtr  pLineToSplit = pLines2d->AddBy2Points(-0.4, 0, 0.4, 0);  // 横线

  6.     // 指定分割点(0,0)将线段分割为两段
  7.     // 从分割点到路径终点的部分,被分割出来作为一个新的特征
  8.     // 从路径起点到分割点的部分,保留在原路径上
  9.     _variant_t splitRes; // 分割结果,也可以不关心
  10.     splitRes.vt = VT_DISPATCH;
  11.     pLineToSplit->SplitAtPoint(0, 0, &splitRes);

  12.     // 将分割出来的线段角度设为45度
  13.     fwp::Line2dPtr pLineSplitRes = fwp::Line2dPtr(splitRes.pdispVal);
  14.     pLineSplitRes->PutAngle(45 * M_PI / 180.0);
  15. }
复制代码
         上述代码以线段为例示例分割的一般过程,运行效果如下,分割只需要传入分割点即可,另外值得注意的是保留在原对象和被分割部分之间的区分。
图片 (5).png
3.2.2 闭合路径
         同理,二维草图的闭合路径(如圆、椭圆、闭合样条曲线)也都有分割功能,他们的原型都是一样的。
  1. HRESULT SplitAtPoints (double x1,double y1,double x2,double y2,
  2. VARIANT * SplitElement1 = &vtMissing,VARIANT * SplitElement2 = &vtMissing )
复制代码
         此原型与开放路径时分割所用方法SplitAtPoint相似,x1、y1、x2、y2定义了两个分割点。SplitElement1、SplitElement2则为分割出来的两个部分。下述代码以圆为例演示了闭合路径分割的一般过程,
  1. void  DemoClosedPathSplit(TGPart::ProfilePtr const& pProfile)
  2. {
  3.       namespace fwp = TGFrameworkSupport;
  4.     fwp::Circles2dPtr pCirs = pProfile->GetCircles2d();
  5.     // 中心在原点,半径为0.5的圆
  6.     fwp::Circle2dPtr pCircleToSplit = pCirs->AddByCenterRadius(0, 0, 0.5);  // 圆

  7.     _variant_t pSplitResFst, pSplitResScd; // 分割结果,也可以不关心
  8.     pSplitResFst.vt = VT_DISPATCH;
  9.     pSplitResScd.vt = VT_DISPATCH;

  10.     // 由两个分割点(0.5,0)(-0.5,0)定义了一段参数区间,
  11.     // 区间内的部分被分割出来作为第一个新的特征
  12.     // 区间外的部分被分割出来作为第二个新的特征
  13.     pCircleToSplit->SplitAtPoints(0.5, 0.0, -0.5, 0, &pSplitResFst, &pSplitResScd);
  14.     // 运行到此pCircleToSplit已经无效,因为已经被分割成两个新的特征

  15.     // 分割点区间内,因为参考平面是XOY平面,所以从(0.5,0)到(-0.5,0)的圆弧是上半部分
  16.     fwp::Arc2dPtr pArcTop = fwp::Arc2dPtr(pSplitResFst.pdispVal);
  17.     pArcTop->PutRadius(pArcTop->GetRadius() * 2);

  18.     // 分割点区间外
  19.     fwp::Arc2dPtr pArcBot = fwp::Arc2dPtr(pSplitResScd.pdispVal);
  20.     pArcBot->PutRadius(pArcBot->GetRadius() * 4);
  21. }
复制代码
          运行效果如下,与开放路径分割不同之处在于需要两个分割点,而且分割成了两个新的特征,注意这两个新特征与传入分割点之间的关系即可。
图片 (6).png

四、复制/移动/旋转
         二维草图的所有可编辑特征都可以复制、移动、旋转,只需要调用各个特征的Duplicate/Move/Rotate方法即可,且他们的原型都是一样的。
         复制的原型如下:
  1. IDispatchPtr Duplicate (const _variant_t & XDistance = vtMissing,const _variant_t & YDistance = vtMissing )
复制代码
         默认原位复制,也允许位移复制。
         移动的原型如下:
  1. HRESULT Move (double XFrom,double YFrom,double XTo,double YTo )
复制代码
         旋转的原型如下:
  1. HRESULT Rotate (double Angle,double x,double y );
复制代码
         注意其中Angle应为弧度制。
         下述代码以线段为例演示复制、 移动、旋转的一般用法。
  1. void DemoDuplicateMoveRotate(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
  5.     // 原始线段:起点为(-0.5, -0.5)终点为(0, 0)
  6.     fwp::Line2dPtr pLine = pLines2d->AddBy2Points(-0.5, -0.5, 0, 0);

  7.     // 位移(0.5,0.5)
  8.     fwp::Line2dPtr pLinePreMove = pLine->Duplicate(); // 位移前复制一份
  9.     pLine->Move(0, 0, 0.5, 0.5);

  10.     // 新的起点已为(-0.5, -0.5) + (0.5, 0.5) = (0, 0)
  11.     double startXNew, startYNew;
  12.     pLine->GetStartPoint(&startXNew, &startYNew);
  13.     assert(startXNew == 0 && startYNew == 0);

  14.     // 绕起点旋转45度,此时线已是竖直的
  15.     fwp::Line2dPtr pLinePreRotate = pLine->Duplicate(); // 未旋转前复制一份
  16.     pLine->Rotate(45 * M_PI / 180.0, startXNew, startYNew);
  17. }
复制代码
         运行效果如下,移动方法由两点定义了位移矢量,旋转方法则只要提供旋转中心和旋转角度即可,至于复制,其实也可以传入两个值以定义一个位移矢量,什么都不传时就是原位复制。
图片 (7).png

五、镜像/缩放/伸展
5.1 镜像
         二维草图特征都可以镜像,调用相应类的Mirror方法即可,而且他们的原型都一致。
  1. IDispatchPtr Mirror (double x1,double y1,double x2,double y2,
复制代码
        下述代码以线段为例演示了镜像的常规用法示例:
  1. void DemoMirror(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();

  5.     //  原始线段位于一象限
  6.     fwp::Line2dPtr pCurLine = pLines2d->AddBy2Points(0, 0, 0.1, 0.1);

  7.     // 镜像到二象限,(0,0),(0,1)两点使y轴成为镜像轴
  8.     pCurLine = pCurLine->Mirror(0, 0, 0, 1, VARIANT_TRUE);

  9.     // 镜像到三象限,(0,0),(1,0)两点使x轴成为镜像轴
  10.     pCurLine = pCurLine->Mirror(0, 0, 1, 0, VARIANT_TRUE);

  11.     // 镜像到四象限,(0,0),(0,1)两点使x轴成为镜像轴
  12.     pCurLine = pCurLine->Mirror(0, 0, 0, 1, VARIANT_TRUE);
  13. }
复制代码
       运行效果如下。Mirror方法的前四个参数构造了两个点,两点构成镜像轴。最后一个参数,则控制返回的对象是源对象还是镜像后的对象,true时返回的是镜像后的对象。
图片 (8).png

六、偏置(偏移)
         二维草图都可偏移,不过是在剖面层次上进行,因为偏移不仅可只针对单个元素,还可以针对链。使用到的方法为Profile::Offset2d,其原型如下。
  1. HRESULT Profile::Offset2d (double offsetSideX,double offsetSideY,double offsetDistance )
复制代码
        下述代码演示了偏移的常规用法:
  1. void DemoOffset(TGPart::ProfilePtr const& pProfile)
  2. {
  3.     namespace fwp = TGFrameworkSupport;
  4.     fwp::Arcs2dPtr pArcs2d = pProfile->GetArcs2d();
  5.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();

  6.     // 构造一条弧和连接此弧起终点的直线
  7.     fwp::Arc2dPtr pArc = pArcs2d->AddByCenterStartEnd(0, 0, 0.5, 0, -0.5, 0);
  8.     fwp::Line2dPtr pLine = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);
  9.    
  10.       // 清空之前的选择集
  11.     fw::SelectSetPtr pSsSet = SEAPP->GetActiveSelectSet();
  12.     pSsSet->RemoveAll();
  13.     // 偏移以剖面为单位
  14.     // 前提是将想要偏移的单个特征或链加入到当前选择集中
  15.     pSsSet->Add(pArc);  // 只偏移弧时
  16.     //pProfile->ChainLocate(0, 0.5);  //偏移链时
  17.     //朝(0,1)点方向偏移,偏移距离为0.1
  18.     pProfile->Offset2d(0, 1, 0.1);
  19.     //朝(0,1)点方向偏移,偏移距离为0.1
  20.     pProfile->Offset2d(0, 1, 0.1);
  21. <font face="微软雅黑">}</font>
复制代码
         偏移对象确定后,关键是传入方向点定义偏移方向,偏移距离也是必须的。只偏移弧时运行效果如下:
图片 (9).png
         偏移链时运行效果如下。
企业微信截图_1715852401572.png

评论(0)

您需要登录后才可以回复 登录

客服 意见反馈
返回顶部
快速回复 返回顶部 返回列表