0

0

分享

【初级教程四】常用三维图形创建

 
157 0
2024-10-18 17:35:08 天工开发者中心| 显示全部楼层 阅读模式
本帖最后由 天工开发者团队 于 2024-10-23 16:51 编辑

一、点
         通过x y z坐标可创建点。
         API:
  1. Point3DPtr Add(long NumberOfValues, SAFEARRAY** Array);
复制代码
         参数:
         NumberOfValues:  Array 的个数
         Array:                     
点集,按顺序每三个元素形成一个点,分别是x、y、z
         示例:
  1. ATL::CComSafeArray<T> ToComSafeArray(std::initializer_list<T> const& initial_list)
  2. {
  3.     ATL::CComSafeArray<T> comArray((ULONG)initial_list.size());
  4.     long i = 0;
  5.     for (auto it = initial_list.begin(); it != initial_list.end(); ++it)
  6.     {
  7.         comArray.SetAt(i, *it);
  8.         i++;
  9.     }
  10.     return comArray;
  11. }
  12. bool CreatePoint()
  13. {
  14.     // 获取Application
  15.     Application* application = TGAddinApp::GetTGApp()->GetTGAddin()->GetApplication();
  16.     // 获取PartDocumentPtr
  17.     TGPart::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument");
  18.     assert(partDoc);

  19.     //创建三维草图
  20.     Sketches3DPtr sketches = partDoc->GetSketches3D();
  21.     Sketch3DPtr sketch = sketches->Add();

  22.     //创建点
  23.     TGPart::Points3DPtr points = sketch->GetPoints3D();
  24.     ATL::CComSafeArray<double> point3DArray = ToComSafeArray({ 0.0,0.0,0.0,0.03,0.04,0.05,0.02,0.03,0.04 });
  25.     TGPart::Point3DPtr point = points->Add(9, point3DArray.GetSafeArrayPtr());

  26.     return true;
  27. }
复制代码
         上述代码创建了三个点,分别是(0,0,0),(0.03,0.04,0.05),(0.02,0.03,0.04),效果如下:
1.png

二、线段
         通过两个点可以确定一个直线。
         API:
  1. Line3DPtr Add(double Startx, double Starty, double Startz, double Endx, double Endy, double Endz);
复制代码
         参数:
         Startx、Starty、Startz:   起点坐标
         Endx、Endy、Endz:       终点坐标
         通过两个点画一个线段,示例如下:
  1. bool CreateLine()
  2. {
  3.     // 获取Application
  4.     Application* application = TGAddinApp::GetTGApp()->GetTGAddin()->GetApplication();
  5.     // 获取PartDocumentPtr
  6.     TGPart::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument");
  7.     assert(partDoc);

  8.     //创建草图
  9.     Sketches3DPtr sketches = partDoc->GetSketches3D();
  10.     Sketch3DPtr sketch = sketches->Add();

  11.     //创建起点为(-0.01, 0.03, 0.15)终点为(0.05, 0.06, 0.07)的线
  12.     TGPart::Lines3DPtr lines = sketch->GetLines3D();
  13.     TGPart::Line3DPtr line = lines->Add(-0.01, 0.03, 0.15, 0.05, 0.06, 0.07);

  14.     return true;
  15. }
复制代码
         效果如下:
2.png
        API:
  1. HRESULT AddEx(SAFEARRAY** arrPoints, SAFEARRAY** arrLines);
复制代码
         参数:
         arrPoints:  点集,为3的倍数,按顺序三个元素分别为一个点的x、y、z坐标
         arrLines:   线集(出参)

         把所有点按顺序连接成线段,示例如下:
  1. bool CreateLine()
  2. {
  3.     // 获取Application
  4.     Application* application = TGAddinApp::GetTGApp()->GetTGAddin()->GetApplication();
  5.     // 获取PartDocumentPtr
  6.     TGPart::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument");
  7.     assert(partDoc);

  8.     //创建草图
  9.     Sketches3DPtr sketches = partDoc->GetSketches3D();
  10.     Sketch3DPtr sketch = sketches->Add();

  11.     //添加连接点集(0.5,0.1,0.2),(0.8,0.6,0.5),(0.6,0.7,0.8),(0.09,0.11,0.17)的连段
  12.     ATL::CComSafeArray<double> points = ToComSafeArray({ 0.5,0.1,0.2,0.8,0.6,0.5,0.6,0.7,0.8,0.09,0.11,0.17 });
  13.     ATL::CComSafeArray<IDispatch*> lines(3);
  14.     sketch->AddEx(points.GetSafeArrayPtr(), lines.GetSafeArrayPtr());

  15.     return true;
  16. }
复制代码
         效果如下:
3.png

三、矩形
         通过长宽和中心点、法向、平面U方向可以确定一个矩形
         API:
  1. TGPart::Lines3D::CreateRectangle
  2.    (double dWidth, double dHeight,
  3.     double dCentrexpos, double dCentreypos, double dCentrezpos,
  4.     double dPlaneNormalxpos, double dPlaneNormalypos, double dPlaneNormalzpos,
  5.     double dPlaneUDirxpos, double dPlaneUDirypos, double dPlaneUDirzpos,
  6.     SAFEARRAY** Line3D);
复制代码
         参数:
         
dWidth:                                                                                                
         
dHeight:                                                                                                

         dCentrexpos、dCentreypos、dCentrezpos:                                  中心点
         dPlaneNormalxpos、dPlaneNormalypos、dPlaneNormalzpos:   法向
         Line3D:                                                                                           矩形的四个线段(输出参数)
         代码示例:
  1. bool CreateRect(TGPart::Sketch3DPtr const& sketch)
  2. {
  3.     TGPart::Lines3DPtr lines = sketch->GetLines3D();

  4.     ATL::CComSafeArray<IDispatch*> toPointObjs(4);
  5.     LPSAFEARRAY pSafeArray = toPointObjs.Detach();

  6.     //长为0.03,宽为0.04,中心点为(0.01,0.05,0.08) 法向为(1,1,1) 方向为(1,0,1)
  7.     lines->CreateRectangle(0.03, 0.04, 0.01, 0.05, 0.08, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, &pSafeArray);
  8.     toPointObjs.Attach(pSafeArray);

  9.     return true;
  10. }
复制代码
         运行效果:
4.png

四、圆
         通过圆心和半径、法向可以确定一个圆。
         API:
  1. TGPart::Ellipse3DPtr TGPart::Ellipses3D::AddByCenterRadiusNormal(double CenterX, double CenterY, double CenterZ, double DirNormalX, double DirNormalY, double DirNormalZ, double Radius);
复制代码
         参数:
         
CenterX、CenterY、CenterZ:                      定义圆心
         
DirNormalX、DirNormalY、DirNormalZ:  定义法向
         
Radius:                                                           定义半径
         
代码示例:
  1. bool CreateCircle()
  2. {
  3.     // 获取Application
  4.     Application* application = TGAddinApp::GetTGApp()->GetTGAddin()->GetApplication();
  5.     // 获取PartDocumentPtr
  6.     TGPart::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument");
  7.     assert(partDoc);

  8.     //创建草图
  9.     Sketches3DPtr sketches = partDoc->GetSketches3D();
  10.     Sketch3DPtr sketch = sketches->Add();

  11.     //创建圆:圆心(0.01,0.02,0.05),法向(1,1,1),半径0.04
  12.     TGPart::Ellipses3DPtr ellipses = sketch->GetEllipses3D();
  13.     TGPart::Ellipse3DPtr circle = ellipses->AddByCenterRadiusNormal(0.01, 0.02, 0.05, 1, 1, 1, 0.04);

  14.     return true;
  15. }
复制代码
         运行效果:
5.png

五、圆弧
         API:
  1. TGPart::Arc3DPtr TGPart::Arcs3D::AddByStartEndCenterNormal
  2.    (double Startx, double Starty, double Startz,
  3.     double Endx, double Endy, double Endz,
  4.     double CenterX, double CenterY, double CenterZ,
  5.     double NormalX, double NormalY, double NormalZ,
  6.     double dRadius);
复制代码
         参数:
         
Startx、Starty、Startz:                起点坐标
         Endx、Endy、Endz:                     终点坐标
         CenterX、CenterY、CenterZ:      圆心
         NormalX、NormalY、NormalZ:  法向
         dRadius:                                      半径
         代码示例:
  1. bool CreateArc()
  2. {
  3.     // 获取Application
  4.     Application* application = TGAddinApp::GetTGApp()->GetTGAddin()->GetApplication();
  5.     // 获取PartDocumentPtr
  6.     TGPart::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument");
  7.     assert(partDoc);

  8.     //创建草图
  9.     Sketches3DPtr sketches = partDoc->GetSketches3D();
  10.     Sketch3DPtr sketch = sketches->Add();

  11.     //创建弧起点为(0.04254, 0.0013, 0.03616),终点为(0.00312,-0.00421, 0.08109),圆心为(0.01, 0.02, 0.05),法向(1, 1, 1),半径0.04
  12.     TGPart::Arcs3DPtr arcs = sketch->GetArcs3D();
  13.     TGPart::Arc3DPtr arc = arcs->AddByStartEndCenterNormal(0.04254, 0.0013, 0.03616, 0.00312, -0.00421, 0.08109, 0.01, 0.02, 0.05, 1, 1, 1, 0.04);

  14.     return true;
  15. }
复制代码
         运行效果:
6.png

六、样条曲线
         所谓样条曲线(Spline Curves)是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。
         API:
  1. TGPart::BSplineCurve3DPtr TGPart::BSplineCurves3D::AddByPoints(long ArraySize, SAFEARRAY** Array, VARIANT_BOOL bCreateClosedCurve);
复制代码
         参数:
         ArraySize:                     点个数
         Array:                              点坐标集
         bCreateClosedCurve:   是否闭合,true闭合,false不闭合
         代码示例:
  1. bool CreateSplineCurves()
  2. {
  3.     // 获取Application
  4.     Application* application = TGAddinApp::GetTGApp()->GetTGAddin()->GetApplication();
  5.     // 获取PartDocumentPtr
  6.     TGPart::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument");
  7.     assert(partDoc);

  8.     //创建草图
  9.     Sketches3DPtr sketches = partDoc->GetSketches3D();
  10.     Sketch3DPtr sketch = sketches->Add();

  11.     ATL::CComSafeArray<double> points = ToComSafeArray({ -0.15411270107593356, -0.068218488561353263, -0.026578103946878956, -0.10365533369715851,
  12.             -0.015327208266761847, 0.063058046076703067, -0.018732188479349772, -0.013590396773229624, -0.017264793939970029, -0.1114395643167483, -0.06201958271901041,
  13.             -0.052832153874633456, -0.13789130547567818, -0.0678929518988939, -0.041937248227906225, -0.10411270107593357, -0.068218488561353263, -0.026578103946878956 });

  14.     //创建点--用于比较样点是否在曲线上
  15.     TGPart::Points3DPtr pPoints = sketch->GetPoints3D();
  16.     TGPart::Point3DPtr point = pPoints->Add(18, points.GetSafeArrayPtr());

  17.     //创建样条曲线
  18.     TGPart::BSplineCurves3DPtr  splines = sketch->GetBSplineCurves3D();
  19.     TGPart::BSplineCurve3DPtr spline = splines->AddByPoints(6, points.GetSafeArrayPtr(), true);

  20.     return true;
  21. }
复制代码
         运行效果:
7.png
8.png
         由效果图可知,点都在样条曲线上,AddByPoints方法用于插值样条曲线。

七、圆角

         API:
  1. TGPart::Arc3DPtr TGPart::Arcs3D::AddAsFillet(IDispatch* Obj1, IDispatch* Obj2, double dRadius, VARIANT_BOOL bNoTrim);
复制代码
         参数:
         Obj1、Obj2 :    线段
         dRadius :          半径
         bNoTrim:       是否修剪 true(不修剪)、false(修剪)
         代码示例:
  1. bool CreateFillet()
  2. {
  3.     // 获取Application
  4.     Application* application = TGAddinApp::GetTGApp()->GetTGAddin()->GetApplication();
  5.     // 获取PartDocumentPtr
  6.     TGPart::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument");
  7.     assert(partDoc);

  8.     //创建草图
  9.     Sketches3DPtr sketches = partDoc->GetSketches3D();
  10.     Sketch3DPtr sketch = sketches->Add();

  11.     TGPart::Arcs3DPtr arcs = sketch->GetArcs3D();
  12.     TGPart::Lines3DPtr lines = sketch->GetLines3D();

  13.     //创建圆角
  14.     TGPart::Line3DPtr line1 = lines->Add(-0.02266, 0.00805, 0.09461, -0.02266, 0.0673, 0.03536);
  15.     TGPart::Line3DPtr line2 = lines->Add(-0.02266, 0.00805, 0.09461, 0.03595, -0.02126, 0.0653);
  16.     TGPart::Arc3DPtr arc = arcs->AddAsFillet(line1, line2, 0.04, VARIANT_TRUE);

  17.     return true;
  18. }
复制代码
         运行效果:
9.png
10.png







评论(0)

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

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