【初级教程三】二维图形常用编辑操作
本帖最后由 天工开发者团队 于 2024-10-29 12:01 编辑一、倒角
1.1 倒圆角
倒圆角主要用到有两个方法Arcs2d::AddAsFilletNoTrim和Arcs2d::AddAsFillet,除了名字外它们的原型一致。
Arc2dPtr Arcs2d::AddAsFilletNoTrim (IDispatch * Obj1,IDispatch * Obj2,double Radius, double xDirection,double yDirection ); Obj1,Obj2指示了参与倒角的对象。
Radius指示了最终生成的圆的半径。
xDirection,yDirection则构成一个方向点定义倒角区域。
void DemoFillet(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
fwp::Arcs2dPtr pArcs2d = pProfile->GetArcs2d();
// 在原点处绘制两条交点在原点的直线,形成十字架
fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);// 横线
fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);// 竖线
// 两条线段形成'x'字形时,倒角可以有四种选择
// 通过指定方向点,其相对于交点的位置便可以确定倒角的区域
// 方向点(0.1,0.1)指示在第一象限倒角,0.05指示倒角半径,为演示其他象限,不修剪
fwp::Arc2dPtr pFilletFst = pArcs2d->AddAsFilletNoTrim(pLineHor, pLineVer, 0.05, 0.1, 0.1);
// 方向点(-0.1,-0.1)指示在第三象限处倒角,0.25指示倒角半径,并修剪
fwp::Arc2dPtr pFilletScd = pArcs2d->AddAsFillet(pLineHor, pLineVer, 0.25, -0.1, -0.1);
} 上述代码演示了在二维草图中倒圆角的两个接口,运行效果如下,只要传入方向点定义倒角区域以及倒角半径即可。两个接口之间的差异只在于修剪不修剪倒角对象。
1.2 斜角
和圆角的情况相似,两条线段形成'X‘形时,有四个角区域可以进行倒角,输入一个方向点可以决定是在哪个区域倒角。倒斜角多了一个深度A、深度B的概念,如下两图所示:
方向点在角平线的哪侧,区分线一线二分别为倒角线和被倒角线,深度A为两线段交点距倒角线端点的距离,深度B为两线段交点距被倒角线端点的距离。
void DemoChamfer(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
// 在原点处绘制两条交点在原点的直线,形成十字架
fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);// 横线
fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);// 竖线
// 两条线段形成'x'字形时,倒角可以有四种选择
// 方向点(0.1,0.4)指示了倒角区域在第一象限,且倒角线为横线,被倒角线为竖线
fwp::Line2dPtr pChamHor2Ver = pLines2d->AddAsChamfer(pLineHor, pLineVer, 0.1, 0.4, 0.25, 0.15);
// 方向点(0.4,0.1)指示了倒角区域在第一象限,且倒角线为竖线,被倒角线为横线
fwp::Line2dPtr pChamVer2Hor = pLines2d->AddAsChamfer(pLineHor, pLineVer, 0.4, 0.1, 0.25, 0.15);
} 上述代码演示了相同的倒角深度参数下,如何通过更改方向点使位于角平分线不同侧,以达到调整倒斜角效果的目的,运行效果如下。
二、修剪
2.1 修剪
二维草图中的基本特征如线、弧、圆、椭圆、椭圆弧、样条曲线,都有裁剪功能,他们在接口中的原型都是一样的。
HRESULT Trim (double x, double y,
IDispatch * CutObj1,const _variant_t & CutObj2 = vtMissing ) 调用对象是被裁剪的,CutObj1、CutObj2是裁剪对象,其中CutObj2是可选的。x、y定义了方向点决定裁剪部分。
下面以线的裁剪为例示例。
void DemoTrim(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
// 在原点处绘制两条交点在原点的直线,形成十字架
fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);// 横线
fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);// 竖线
fwp::Line2dPtr pLineInclined = pLines2d->AddBy2Points(0.4, 0, 0, 0.4);// 斜线
// 用斜线裁剪横线,方向点(0.5,0.1)指示裁剪的右侧,裁剪后横线的终点为(0.4,0)
pLineHor->Trim(0.5, 0.1, pLineInclined);
// 用斜线、横线裁剪竖线,此两条线将竖线分为三段,
// 方向点(0,0.2)指示裁剪三段中的中间段
_variant_t pLineHorVar;
pLineHorVar.vt = VT_DISPATCH;
pLineHorVar.pdispVal = pLineHor;
pLineVer->Trim(0, 0.2, pLineInclined, pLineHorVar);
} 上述代码运行效果如下,主要演示了一个被裁剪对象的两种裁剪情况,第一种情况是被一个对象裁剪,此时裁剪对象可将被裁剪对象分割为两个部分,方向点决定被裁剪的部分。第二种情况,被两个对象裁剪,此时裁剪对象可将被裁剪对象分割为三个部分,方向点决定被裁剪的部分。
2.2 修剪拐角
二维草图中的基本特征如线、弧、椭圆弧、样条曲线、线串,都有修剪拐角功能,他们在接口中的原型都是一样的。
HRESULT CornerTrim (double xKeep,double yKeep,IDispatch * TargetObj, double xTargetKeep,double yTargetKeep ) 拐角由调用对象拐向目标对象TargetObj,这时可能有多种可能,xKeep、yKeep限定了调用对象侧的可能,xTargetKeep、yTargetKeep构成一点限定了目标对象侧的可能。
下面以线的修剪拐角为例示例。
void DemoCornerTrim(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
// 在原点处绘制两条交点在原点的直线,形成十字架
fwp::Line2dPtr pLineHor = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);// 横线
fwp::Line2dPtr pLineVer = pLines2d->AddBy2Points(0, -0.5, 0, 0.5);// 竖线
// 两条线段形成'x'字形时,修剪拐角可以有四种选择
// 通过指定两个保留点,可以确定最终的拐角形状
// 当两条线段无交点时,两条线段者会延伸至交点
// 同样要指定两个保留点,只是此时拐角只会是一个形状。
// 用竖线修剪横线,最终形成第三象限的拐角
// 修剪对象保留点(-0.1,0)指示横线保留左侧
// 修剪目标保留点(0,-0.1)指示竖线保留下侧
pLineHor->CornerTrim(-0.1, 0, pLineVer, 0, -0.1);
} 上述代码演示了修剪拐角一般使用方法,运行效果如下,可以看到关键是传入两个保留点以决定最终拐角的形状。
三、延伸/分割
3.1 延伸
二维草图中的基本特征如线、弧、椭圆弧、样条曲线,都有延伸功能,他们在接口中的原型都是一样的。
HRESULT Extend (double x,double y,IDispatch * TargetObj ) 延伸此动作是由调用对象延伸向目标对象,TargetObj即目标对象,x、y则指出是调用对象的哪一侧延伸向目标对象。
下面以线的延伸为例示例。
voidDemoExtend(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
// 待延伸的线段,原点往左0.4长度的横线
fwp::Line2dPtr pLineToExtend = pLines2d->AddBy2Points(-0.4, 0, 0, 0);// 横线
// 要延伸到的目标线段,一条距离原点0.1的竖线
fwp::Line2dPtr pLineTarget = pLines2d->AddBy2Points(0.1, 0.1, 0.1, -0.1);
// 开放路径必有两个延伸方向,方向点(-0.1,0)指示延伸方向为右侧
// 开放路径会选择距离方向点更近的一侧延伸
pLineToExtend->Extend(-0.1, 0, pLineTarget);
} 上述代码演示了延伸一条线段的一般过程,运行效果如下,可以看到关键是传入方向点决定开放路径的延伸方向。
方向点更改为(-0.4,0)时。
3.2 分割
3.2.1 开放路径
二维草图中的开放路径(如线段、弧、样条曲线、椭圆弧)都有分割功能,它们的原型都是一样的。
HRESULT SplitAtPoint (double x,double y,VARIANT * OtherSplitElement ) 由原型可知,x、y提供了一个分割点;OtherSplitElement则为出参,表示分割出来的部分,不关心结果时也可以传入nullptr。
void DemoOpenPathSplit(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
fwp::Line2dPtrpLineToSplit = pLines2d->AddBy2Points(-0.4, 0, 0.4, 0);// 横线
// 指定分割点(0,0)将线段分割为两段
// 从分割点到路径终点的部分,被分割出来作为一个新的特征
// 从路径起点到分割点的部分,保留在原路径上
_variant_t splitRes; // 分割结果,也可以不关心
splitRes.vt = VT_DISPATCH;
pLineToSplit->SplitAtPoint(0, 0, &splitRes);
// 将分割出来的线段角度设为45度
fwp::Line2dPtr pLineSplitRes = fwp::Line2dPtr(splitRes.pdispVal);
pLineSplitRes->PutAngle(45 * M_PI / 180.0);
} 上述代码以线段为例示例分割的一般过程,运行效果如下,分割只需要传入分割点即可,另外值得注意的是保留在原对象和被分割部分之间的区分。
3.2.2 闭合路径
同理,二维草图的闭合路径(如圆、椭圆、闭合样条曲线)也都有分割功能,他们的原型都是一样的。
HRESULT SplitAtPoints (double x1,double y1,double x2,double y2,
VARIANT * SplitElement1 = &vtMissing,VARIANT * SplitElement2 = &vtMissing ) 此原型与开放路径时分割所用方法SplitAtPoint相似,x1、y1、x2、y2定义了两个分割点。SplitElement1、SplitElement2则为分割出来的两个部分。下述代码以圆为例演示了闭合路径分割的一般过程,
voidDemoClosedPathSplit(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Circles2dPtr pCirs = pProfile->GetCircles2d();
// 中心在原点,半径为0.5的圆
fwp::Circle2dPtr pCircleToSplit = pCirs->AddByCenterRadius(0, 0, 0.5);// 圆
_variant_t pSplitResFst, pSplitResScd; // 分割结果,也可以不关心
pSplitResFst.vt = VT_DISPATCH;
pSplitResScd.vt = VT_DISPATCH;
// 由两个分割点(0.5,0)(-0.5,0)定义了一段参数区间,
// 区间内的部分被分割出来作为第一个新的特征
// 区间外的部分被分割出来作为第二个新的特征
pCircleToSplit->SplitAtPoints(0.5, 0.0, -0.5, 0, &pSplitResFst, &pSplitResScd);
// 运行到此pCircleToSplit已经无效,因为已经被分割成两个新的特征
// 分割点区间内,因为参考平面是XOY平面,所以从(0.5,0)到(-0.5,0)的圆弧是上半部分
fwp::Arc2dPtr pArcTop = fwp::Arc2dPtr(pSplitResFst.pdispVal);
pArcTop->PutRadius(pArcTop->GetRadius() * 2);
// 分割点区间外
fwp::Arc2dPtr pArcBot = fwp::Arc2dPtr(pSplitResScd.pdispVal);
pArcBot->PutRadius(pArcBot->GetRadius() * 4);
} 运行效果如下,与开放路径分割不同之处在于需要两个分割点,而且分割成了两个新的特征,注意这两个新特征与传入分割点之间的关系即可。
四、复制/移动/旋转
二维草图的所有可编辑特征都可以复制、移动、旋转,只需要调用各个特征的Duplicate/Move/Rotate方法即可,且他们的原型都是一样的。
复制的原型如下:
IDispatchPtr Duplicate (const _variant_t & XDistance = vtMissing,const _variant_t & YDistance = vtMissing ) 默认原位复制,也允许位移复制。
移动的原型如下:
HRESULT Move (double XFrom,double YFrom,double XTo,double YTo ) 旋转的原型如下:
HRESULT Rotate (double Angle,double x,double y ); 注意其中Angle应为弧度制。
下述代码以线段为例演示复制、 移动、旋转的一般用法。
void DemoDuplicateMoveRotate(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
// 原始线段:起点为(-0.5, -0.5)终点为(0, 0)
fwp::Line2dPtr pLine = pLines2d->AddBy2Points(-0.5, -0.5, 0, 0);
// 位移(0.5,0.5)
fwp::Line2dPtr pLinePreMove = pLine->Duplicate(); // 位移前复制一份
pLine->Move(0, 0, 0.5, 0.5);
// 新的起点已为(-0.5, -0.5) + (0.5, 0.5) = (0, 0)
double startXNew, startYNew;
pLine->GetStartPoint(&startXNew, &startYNew);
assert(startXNew == 0 && startYNew == 0);
// 绕起点旋转45度,此时线已是竖直的
fwp::Line2dPtr pLinePreRotate = pLine->Duplicate(); // 未旋转前复制一份
pLine->Rotate(45 * M_PI / 180.0, startXNew, startYNew);
} 运行效果如下,移动方法由两点定义了位移矢量,旋转方法则只要提供旋转中心和旋转角度即可,至于复制,其实也可以传入两个值以定义一个位移矢量,什么都不传时就是原位复制。
五、镜像/缩放/伸展
5.1 镜像
二维草图特征都可以镜像,调用相应类的Mirror方法即可,而且他们的原型都一致。
IDispatchPtr Mirror (double x1,double y1,double x2,double y2,
下述代码以线段为例演示了镜像的常规用法示例:
void DemoMirror(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
//原始线段位于一象限
fwp::Line2dPtr pCurLine = pLines2d->AddBy2Points(0, 0, 0.1, 0.1);
// 镜像到二象限,(0,0),(0,1)两点使y轴成为镜像轴
pCurLine = pCurLine->Mirror(0, 0, 0, 1, VARIANT_TRUE);
// 镜像到三象限,(0,0),(1,0)两点使x轴成为镜像轴
pCurLine = pCurLine->Mirror(0, 0, 1, 0, VARIANT_TRUE);
// 镜像到四象限,(0,0),(0,1)两点使x轴成为镜像轴
pCurLine = pCurLine->Mirror(0, 0, 0, 1, VARIANT_TRUE);
} 运行效果如下。Mirror方法的前四个参数构造了两个点,两点构成镜像轴。最后一个参数,则控制返回的对象是源对象还是镜像后的对象,true时返回的是镜像后的对象。
六、偏置(偏移)
二维草图都可偏移,不过是在剖面层次上进行,因为偏移不仅可只针对单个元素,还可以针对链。使用到的方法为Profile::Offset2d,其原型如下。
HRESULT Profile::Offset2d (double offsetSideX,double offsetSideY,double offsetDistance ) 下述代码演示了偏移的常规用法:
void DemoOffset(TGPart::ProfilePtr const& pProfile)
{
namespace fwp = TGFrameworkSupport;
fwp::Arcs2dPtr pArcs2d = pProfile->GetArcs2d();
fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
// 构造一条弧和连接此弧起终点的直线
fwp::Arc2dPtr pArc = pArcs2d->AddByCenterStartEnd(0, 0, 0.5, 0, -0.5, 0);
fwp::Line2dPtr pLine = pLines2d->AddBy2Points(-0.5, 0, 0.5, 0);
// 清空之前的选择集
fw::SelectSetPtr pSsSet = SEAPP->GetActiveSelectSet();
pSsSet->RemoveAll();
// 偏移以剖面为单位
// 前提是将想要偏移的单个特征或链加入到当前选择集中
pSsSet->Add(pArc);// 只偏移弧时
//pProfile->ChainLocate(0, 0.5);//偏移链时
//朝(0,1)点方向偏移,偏移距离为0.1
pProfile->Offset2d(0, 1, 0.1);
//朝(0,1)点方向偏移,偏移距离为0.1
pProfile->Offset2d(0, 1, 0.1);
<font face="微软雅黑">}</font> 偏移对象确定后,关键是传入方向点定义偏移方向,偏移距离也是必须的。只偏移弧时运行效果如下:
偏移链时运行效果如下。
页:
[1]