0

0

分享

【初级教程五】三维草图进阶

120 0
2024-10-18 14:53:21 天工开发者中心| 显示全部楼层 阅读模式
本帖最后由 天工开发者团队 于 2024-10-18 15:36 编辑

一、镜像
  1. // API: Mirror
  2. Sketch3D::Mirror(SAFEARRAY** Objects, IDispatch* RefPlane, SAFEARRAY** ppMirroredObjetcs);
复制代码
         参数:
         Objects:                      需要镜像的特征
         RefPlane :                   镜像平面
         ppMirroredObjetcs:    镜像后的对象(出参)

  1. bool CreateMirror()
  2. {
  3.     namespace pt = TGPart;
  4.     // 获取PartDocumentPtr
  5.     TGPart::PartDocumentPtr partDoc = SEAPP->Documents->Add("SolidEdge.PartDocument");
  6.     assert(partDoc);
  7.     //创建草图
  8.     pt::Sketches3DPtr sketches = partDoc->GetSketches3D();
  9.     pt::Sketch3DPtr sketch = sketches->Add();
  10.     //创建圆:圆心(0.01,0.02,0.05),法向(1,1,1),半径0.04
  11.     TGPart::Ellipses3DPtr ellipses = sketch->GetEllipses3D();
  12.     TGPart::Ellipse3DPtr circle = ellipses->AddByCenterRadiusNormal(0.01, 0.02, 0.05, 1, 1, 1, 0.04);
  13.     pt::RefPlanesPtr pRefPlanes = partDoc->RefPlanes;
  14.     pt::RefPlanePtr pRefPlane = pRefPlanes->Item(1);//xoy
  15.     ATL::CComSafeArray<IDispatch*> toMirrorObjs(1);
  16.     toMirrorObjs.SetAt(0, circle);
  17.     //圆基于xoy平面镜像
  18.     SAFEARRAY* pResDispArr = nullptr;
  19.     sketch->Mirror(toMirrorObjs.GetSafeArrayPtr(), pRefPlane, &pResDispArr);
  20.     ATL::CComSafeArray<IDispatch*> resObjArr;
  21.     resObjArr.Attach(pResDispArr);
  22.     assert(1 == resObjArr.GetCount());
  23.     IDispatch* pObj = resObjArr[0];
  24.     pt::Ellipse3DPtr pResEllipse = pObj;
  25.     assert(pResEllipse);
  26.     return true;
  27. }
复制代码
         效果图:
image.png

二、关系约束
2.1 相等
         使两个线段的长度相等,或者使两个圆或者圆弧的半径或弧长相等。
  1. // API: AddEqual
  2. Sketch3DRelations::AddEqual(IDispatch* Object1, IDispatch* Object2);
复制代码
         代码示例:
  1. bool EqualLine(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     TGPart::Lines3DPtr lines = sketch->GetLines3D();
  4.     TGPart::Line3DPtr line1 = lines->Add(-0.01, 0.03, 0.15, 0.05, 0.06, 0.07);
  5.     TGPart::Line3DPtr line2 = lines->Add(-0.01, 0.02, 0.4, 0.1, 0.3, 0.5);

  6.     TGPart::Sketch3DRelationsPtr pRelations = sketch->GetSketch3DRelations();
  7.     TGPart::Sketch3DRelationPtr pRelation = pRelations->AddEqual(line1, line2);
  8.     return 0;
  9. }
复制代码
2.2 共线
        移动第一个线,使两个线的方向相同。
  1. // API:AddCollinear
  2. Sketch3DRelations::AddCollinear(IDispatch* Object1, IDispatch* Object2);
复制代码
         参数:
         Object1:第一个线(移动的线)
         Object2:第二个线

  1. bool Collinear(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     TGPart::Lines3DPtr lines = sketch->GetLines3D();
  4.     TGPart::Line3DPtr line1 = lines->Add(-0.01, 0.03, 0.15, 0.05, 0.06, 0.07);
  5.     TGPart::Line3DPtr line2 = lines->Add(-0.01, 0.02, 0.4, 0.1, 0.3, 0.5);

  6.     //使两个线段共线
  7.     TGPart::Sketch3DRelationsPtr pRelations = sketch->GetSketch3DRelations();
  8.     TGPart::Sketch3DRelationPtr pRelation = pRelations->AddCollinear(line1, line2);
  9.     return 0;
  10. }
复制代码
         效果如下:可见移动line1与line2共线
image (1).png
2.3 同心
         调整圆方向,使两个圆心的连线与法向共线。
  1. //API: AddConcentric
  2. Sketch3DRelationPtr Sketch3DRelations::AddConcentric(IDispatch* Object1, IDispatch* Object2);
复制代码
         参数:
         Object1:移动的圆
         Object2:参照的圆

  1. bool Concentric(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     TGPart::Ellipses3DPtr ellipses = sketch->GetEllipses3D();
  4.     TGPart::Ellipse3DPtr circle = ellipses->AddByCenterRadiusNormal(0.01, 0.02, 0.05, 1, 1, 1, 0.04);
  5.     TGPart::Ellipse3DPtr cir = ellipses->AddByCenterRadiusNormal(0.02, 0.01, 0.03, 1, 2, 4, 0.02);

  6.     TGPart::Sketch3DRelationsPtr pRelations = sketch->GetSketch3DRelations();
  7.     TGPart::Sketch3DRelationPtr pRelation = pRelations->AddConcentric(cir, circle);
  8.     return true;
  9. }
复制代码
2.4 连接
         使一个元素的关键点与另一元素的关键点保持连接。
  1. // API: AddConnect
  2. Sketch3DRelationPtr AddConnect(IDispatch* Object1, enum Sketch3DKeypointType ElemType1, IDispatch* Object2, enum Sketch3DKeypointType ElemType2);
复制代码
         参数:
         Object1:       元素一 (三维草图的元素,比如直线、源、弧等)
         ElemType1:  关键点
         Object2:       元素二 (三维草图的元素,比如直线、源、弧等)
         ElemType2:  关键点
         直线连接关系示例:

  1. bool Connect(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     TGPart::Lines3DPtr lines = sketch->GetLines3D();
  4.     TGPart::Line3DPtr line1 = lines->Add(-0.01, 0.03, 0.15, 0.05, 0.06, 0.07);
  5.     TGPart::Line3DPtr line2 = lines->Add(-0.01, 0.02, 0.4, 0.1, 0.3, 0.5);

  6.     //把两个线段连接起来
  7.     TGPart::Sketch3DRelationsPtr pRelations = sketch->GetSketch3DRelations();
  8.     TGPart::Sketch3DRelationPtr pRelation = pRelations->AddConnect(line1, igSketch3DEndPoint, line2, igSketch3DStartPoint);
  9.     return 0;
  10. }
复制代码
         直线连接关系示例:
  1. bool Connect(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     TGPart::Ellipses3DPtr ellipses = sketch->GetEllipses3D();
  4.     TGPart::Ellipse3DPtr circle = ellipses->AddByCenterRadiusNormal(0.01, 0.02, 0.05, 1, 1, 1, 0.04);
  5.     TGPart::Ellipse3DPtr cir = ellipses->AddByCenterRadiusNormal(0.02, 0.01, 0.03, 1, 2, 4, 0.02);

  6.     //两个圆的中心点坐标相同,法向不变
  7.     TGPart::Sketch3DRelationsPtr pRelations = sketch->GetSketch3DRelations();
  8.     TGPart::Sketch3DRelationPtr pRelation = pRelations->AddConnect(cir, igSketch3DCenter, circle, igSketch3DCenter);

  9.     return true;
  10. }
复制代码

三、关键点捕捉
  1. // API: GetKeypointPosition
  2. HRESULT GetKeypointPosition(enum Sketch3DKeypointType KeypointType, SAFEARRAY** KeyPointPosition)
复制代码
         参数:
         KeypointType:      需要获取关键点的类型
         KeypointPosition: 获取的关键点
         常用的KeypointType 如下:

企业微信截图_17292335926579.png
         获取直线终点示例:
  1. bool LineGetKeypointPosition(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     //创建直线
  4.     TGPart::Lines3DPtr lines = sketch->GetLines3D();
  5.     TGPart::Line3DPtr line1 = lines->Add(-0.01, 0.03, 0.15, 0.05, 0.06, 0.07);

  6.     //获取关键点
  7.     ATL::CComSafeArray<double> keyPointObjs(3);
  8.     line1->GetKeypointPosition(igSketch3DEndPoint, keyPointObjs.GetSafeArrayPtr());

  9.     return 0;
  10. }
复制代码
         获取圆中心点示例:
  1. bool CircleGetKeypointPosition(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     TGPart::Ellipses3DPtr ellipses = sketch->GetEllipses3D();
  4.     TGPart::Ellipse3DPtr circle = ellipses->AddByCenterRadiusNormal(0.01, 0.02, 0.05, 1, 1, 1, 0.04);
  5.     //TGPart::Ellipse3DPtr cir = ellipses->AddByCenterRadiusNormal(0.02, 0.01, 0.03, 1, 2, 4, 0.02);

  6.     /*TGPart::Sketch3DRelationsPtr pRelations = sketch->GetSketch3DRelations();
  7.     TGPart::Sketch3DRelationPtr pRelation = pRelations->AddHV(circle);*/
  8.     ATL::CComSafeArray<double> keyPointObjs = ToComSafeArray({ 0.0,0.0,0.0 });
  9.     circle->GetKeypointPosition(igSketch3DCenter, keyPointObjs.GetSafeArrayPtr());

  10.     return true;
  11. }
复制代码

四、管线路径
         将颜色和线条样式应用于路径,并相对于用户定义坐标系而非基本坐标系创建路径。
  1. // API: AddRoutePath
  2. HRESULT AddRoutePath(IDispatch* firstKeyPointObject, enum Sketch3DKeypointType firstKeyPointType, IDispatch* secondKeyPointObject, enum Sketch3DKeypointType secondKeyPointType, long numberOfSpacePoints, SAFEARRAY** arrSpacePoints, SAFEARRAY** arrLines, double dPortSegmentLength, const _variant_t& vCoordinateSystem = vtMissing);
复制代码
         参数:
         firstKeyPointObject:         元素一
         firstKeyPointType:            关键点类型
         secondKeyPointObject:   元素二
         secondKeyPointType:      关键点类型
         numberOfSpacePoints:    点个数(arrSpacePoints元素个数/3)
         arrSpacePoints:                路径的点
         arrLines:                           输出的线段
         dPortSegmentLength:     端口段的长度
         两个圆通过圆心的管线路径如下:

  1. bool RoutePath(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     //创建两个圆
  4.     TGPart::Ellipses3DPtr ellipses = sketch->GetEllipses3D();
  5.     TGPart::Ellipse3DPtr circle1 = ellipses->AddByCenterRadiusNormal(0, 0.002, 0.005, 1, 0, 0, 0.04);
  6.     TGPart::Ellipse3DPtr circle2 = ellipses->AddByCenterRadiusNormal(0, 0.002, 1.005, 5, 0, 0, 0.04);

  7.     //创建路径经过的点
  8.     ATL::CComSafeArray<double> points = ToComSafeArray({ 0.24707 ,-0.02275 ,-0.07221 ,0.24707 ,0.09894 ,-0.07221 });
  9.     ATL::CComSafeArray<double> lines(6);

  10.     //创建管线路径
  11.     sketch->AddRoutePath(circle1, igSketch3DCenter, circle2, igSketch3DCenter, 2, points.GetSafeArrayPtr(), lines.GetSafeArrayPtr(), 0.02);

  12.     return true;
  13. }
复制代码
image (2).png


评论(0)

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

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