1

0

分享

【初级教程九】拉伸建模

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

一、扫描拉伸
        概念:使用单一路径和横截面或多个路径和横截面创建扫描特征。

6.7.png

        API:
  1. ModelPtr AddSweptProtrusion(
  2.     long NumCurves,//指定在构建扫描凸出特征时使用的曲线对象的数量。
  3.     const _variant_t& TraceCurves,//包含轮廓和/或边缘对象。数组的大小等于NumCurves的值。
  4.     const _variant_t& TraceCurveTypes,//数组的大小等于NumCurves的值。包含FeaturePropertyConstants常量集合(igProfileBasedCrossSection, igEdgeBasedCrossSection)的成员,它们指定TraceCurves数组的相应成员是Profile对象还是Edge对象。
  5.     long NumSections,//指定在构造扫描凸出特征时使用的Section对象的数量。
  6.     const _variant_t& CrossSections,//包含轮廓和/或边缘对象。数组的大小等于NumSections的值
  7.     const _variant_t& CrossSectionTypes,//数组的大小等于NumSections的值。
  8.     const _variant_t& Origins,//包含定义相应截面的起始点的点。每个点表示为两个Double数组(例如,Dim dblOrigin(2) as Double;Dim Origins()作为Variant)。对于与周期性横截面(圆和椭圆)对应的此数组的成员,指定值为0,而不是指定表示点的数组。
  9.     const _variant_t& SegmentMaps,
  10.     enum FeaturePropertyConstants MaterialSide,
  11.     enum FeaturePropertyConstants StartExtentType,
  12.     double StartExtentDistance,
  13.     IDispatch* StartSurfaceOrRefPlane,
  14.     enum FeaturePropertyConstants EndExtentType,
  15.     double EndExtentDistance,
  16.     IDispatch* EndSurfaceOrRefPlane);
复制代码
        示例代码:
  1. template<typename T>
  2. _variant_t CreateVariant(T* t, VARENUM em)
  3. {
  4.     // 暂时支持数量为一的一维数组
  5.     SAFEARRAYBOUND bound = { 1, 0 };
  6.     SAFEARRAY* pSafeArry = SafeArrayCreate(em, 1, &bound);
  7.     SafeArrayPutElement(pSafeArry, &bound.lLbound, t);
  8.     VARIANT var;
  9.     VariantInit(&var);
  10.     var.vt = VT_ARRAY | em;
  11.     var.parray = pSafeArry;
  12.     return _variant_t(var);
  13. }
复制代码
  1. void AddSweptProtrusion()
  2. {
  3.     Application* application = TGAddinApp::GetTGApp()->GetApplication();
  4.     TGPart::PartDocumentPtr pDoc = application->GetActiveDocument();
  5.     // 新建草图
  6.     TGPart::SketchPtr pSketch = pDoc->Sketches->Add();
  7.     //参考平面
  8.     TGPart::RefPlanePtr pRefplane = pDoc->GetRefPlanes()->Item(1);
  9.     // 轮廓
  10.     TGPart::ProfilePtr pProfile = pSketch->GetProfiles()->Add(pRefplane);
  11.     // 创建一个中线点为(0.0,0.0),长度为0.1,宽度为0.08的矩形
  12.     TGFrameworkSupport::Lines2dPtr pLines2d = pProfile->GetLines2d();
  13.     double cenX = 0.0, cenY = 0.0, width = 0.08, len = 0.1;
  14.     std::array<TGFrameworkSupport::Line2dPtr, 4> lines;
  15.     lines[0] = pLines2d->AddBy2Points(cenX - len / 2, cenY - width / 2, cenX + len / 2, cenY - width / 2);// 底边
  16.     lines[1] = pLines2d->AddBy2Points(cenX + len / 2, cenY - width / 2, cenX + len / 2, cenY + width / 2); // 右边
  17.     lines[2] = pLines2d->AddBy2Points(cenX + len / 2, cenY + width / 2, cenX - len / 2, cenY + width / 2); // 上边
  18.     lines[3] = pLines2d->AddBy2Points(cenX - len / 2, cenY + width / 2, cenX - len / 2, cenY - width / 2); // 左边

  19.     TGFrameworkSupport::Relations2dPtr pRelations2d = pProfile->GetRelations2d();
  20.     for (int i = 0; i < 4; i++)
  21.     {
  22.         TGFrameworkSupport::Line2dPtr pLine = lines[i];
  23.         TGFrameworkSupport::Line2dPtr pNextLine = lines[(i + 1) % 4];
  24.         pRelations2d->AddKeypoint(
  25.             pLine,
  26.             (int)TGConstants::KeypointIndexConstants::igLineEnd,
  27.             pNextLine,
  28.             (int)TGConstants::KeypointIndexConstants::igLineStart,
  29.             true);
  30.     }
  31.     pProfile->End(ProfileValidationType::igProfileClosed);

  32.     // 将该矩形设置为路径曲线
  33.     IDispatchPtr pTempTrace = static_cast<IDispatch*>(pProfile);
  34.     _variant_t TraceCurves = CreateVariant<IDispatch>(pTempTrace, VT_DISPATCH);
  35.     int TraceCurveType
  36.         = TGConstants::FeaturePropertyConstants::igProfileBasedCrossSection;
  37.     _variant_t TraceCurveTypes = CreateVariant<int>(&TraceCurveType, VT_INT);

  38.     // 绘制截面轮廓
  39.     _variant_t OrientationPlaneOrPivot(static_cast<IDispatch*>(pDoc->RefPlanes->Item(1)));
  40.     _variant_t ParentCurve(static_cast<IDispatch*>(pProfile));
  41.     pRefplane = pDoc->GetRefPlanes()->AddNormalToCurve(lines[0],
  42.         ReferenceElementConstants::igCurveStart, OrientationPlaneOrPivot,
  43.         ReferenceElementConstants::igPivotEnd, true, ParentCurve);
  44.     pSketch = pDoc->Sketches->Add();
  45.     ProfilePtr pProfileCross = pSketch->GetProfiles()->Add(pRefplane);
  46.     // 绘制一个圆心为新平面(0.0,0.0),半径为0.001的圆
  47.     pProfileCross->GetCircles2d()->AddByCenterRadius(0, 0.0, 0.01);
  48.     auto status = pProfileCross->End(ProfileValidationType::igProfileClosed);

  49.     // 将该圆设置为截面
  50.     IDispatchPtr pTempCross = static_cast<IDispatch*>(pProfileCross);
  51.     _variant_t CrossSections = CreateVariant<IDispatch>(pTempCross, VT_DISPATCH);
  52.     int CrossSectionType
  53.         = TGConstants::FeaturePropertyConstants::igProfileBasedCrossSection;
  54.     _variant_t CrossSectionTypes = CreateVariant<int>(&CrossSectionType, VT_INT);
  55.     // 截面原点,若截面为圆,此处为零
  56.     int t = 0;
  57.     _variant_t Origins = CreateVariant<int>(&t, VT_INT);
  58.     // 以圆为截面,矩形为路径的扫掠添料的操作
  59.     pDoc->Models->AddSweptProtrusion(
  60.         1,
  61.         TraceCurves,
  62.         TraceCurveTypes,
  63.         1,
  64.         CrossSections,
  65.         CrossSectionTypes,
  66.         Origins,
  67.         0,    //从此往下的参数都是预备参数,无需考虑
  68.         FeaturePropertyConstants::igLeft,
  69.         FeaturePropertyConstants::igNone,
  70.         0.0,
  71.         NULL,
  72.         FeaturePropertyConstants::igNone,
  73.         0.0,
  74.         NULL
  75.     );
  76. }
复制代码
        示例效果:

6.1.png
二、螺旋拉伸
        使用Models接口下的AddFiniteBaseHelix可创建螺旋特征:
  1. ModelPtr Models::AddFiniteBaseHelix(struct RefAxis* HelixAxis, enum FeaturePropertyConstants AxisStart,
  2.     long NumCrossSections, SAFEARRAY** CrossSectionArray, enum FeaturePropertyConstants ProfileSide,
  3.     double Height, double Pitch, double NumberOfTurns, enum FeaturePropertyConstants HelixDir,
  4.     const _variant_t& TaperAngle = vtMissing, const _variant_t& TaperSide = vtMissing,
  5.     const _variant_t& EndPitch = vtMissing, const _variant_t& DeltaPitch = vtMissing,
  6.     const _variant_t& TaperStartRadius = vtMissing, const _variant_t& TaperEndRadius = vtMissing,
  7.     const _variant_t& FromFaceOrRefPlane = vtMissing, const _variant_t& ToFaceOrRefPlane = vtMissing);
复制代码
  1. void AddHelixProtrusion()
  2. {
  3.     namespace pt = TGPart;
  4.     namespace fwp = TGFrameworkSupport;
  5.     pt::PartDocumentPtr pPartDoc = SEAPP->GetActiveDocument();
  6.     pt::RefPlanePtr pRefPlaen = pPartDoc->GetRefPlanes()->Item(2l);
  7.     pt::ProfilePtr pProfile = pPartDoc->GetProfileSets()->Add()->GetProfiles()->Add(pRefPlaen);
  8.     fwp::Line2dPtr pLine = pProfile->GetLines2d()->AddBy2Points(0, -0.05, 0, 0.05);
  9.     pt::RefAxisPtr pRefAxis = pProfile->SetAxisOfRevolution(pLine);
  10.     fwp::Circle2dPtr pCrossSection = pProfile->GetCircles2d()->AddByCenterRadius(0.05, -0.05, 0.01);

  11.     ATL::CComSafeArray<IDispatch*> crossSectionArray(1);
  12.     crossSectionArray[0] = pProfile;
  13.     pPartDoc->GetModels()->AddFiniteBaseHelix(pRefAxis,  // 螺旋轴
  14.         pt::igStart,  // pt::igStart表示从轴定义的线段起点向终点向螺旋,pt::igEnd表示从轴定义的线段终点向起点螺旋
  15.         1, crossSectionArray.GetSafeArrayPtr(), // 传入横截面
  16.         pt::igRight,   // 为未来开放路径预留,暂时无用,pt::igRight和pt::igLeft为有效值
  17.         0.1,  // 螺高,暂时无用
  18.         0.05, // 螺距
  19.         2, // 螺数
  20.         pt::igRight  // pt::igRight右旋,pt::igLeft左旋   
  21.     );
  22. }
复制代码
        上述代码演示了创建螺旋拉伸的一般过程,运行效果如下。
6.2.png

三、法向拉伸
        概念:法向拉伸通过拉伸位于零件面上的封闭曲线构造垂直于该面的拉伸,适用于使用文本轮廓或其他草图元素在非平整面构建特征时。与普通拉伸不同,法向拉伸命令并不基于轮廓。要构造法向拉伸特征,有几个前提:
一、已有一个设计模型
二、已将一个草图或草图中的某些轮廓投影至设计模型中。
        使用下述Api可以创建一个法向拉伸特征。
  1. NormalToFaceProtrusions::Add(
  2.     long NumberOfInputCurves,// 传入的edges个数
  3.     const _variant_t& InputCurvesSetArray,  // edges
  4.     enum FeaturePropertyConstants LongestCurveSide, // pt::igLeft 向外拉伸(加料) pt::igRight 向内拉伸(除料)
  5.     double offsetDistance, // 拉伸厚度
  6.     enum FeaturePropertyConstants FaceContainment// pt::igFacesTouchingCurvesOnly 仅修改与曲线接触的面
  7.     // pt::igAllFaces 修改曲线图内的所有面
  8. );
复制代码
        下述代码演示了创建一个法向拉伸特征的完整过程:
  1. void AddNormalProtrusion()
  2. {
  3.     namespace pt = TGPart;
  4.     namespace gm = TGGeometry;
  5.     pt::PartDocumentPtr pPartDoc = SEAPP->GetActiveDocument();
  6.     assert(pPartDoc);

  7.     // 首先创建一个圆柱
  8.     pt::RefPlanePtr pYOZPlane = pPartDoc->GetRefPlanes()->Item(2l);
  9.     pt::ProfilePtr pProfile = pPartDoc->GetSketches()->AddByPlane(pYOZPlane)->GetProfile();
  10.     pProfile->GetCircles2d()->AddByCenterRadius(0.0, 0.0, 0.2);
  11.     ATL::CComSafeArray<IDispatch*> aProfiles(1);
  12.     aProfiles.SetAt(0, pProfile);
  13.     pt::ModelPtr pCylinderModel = pPartDoc->GetModels()->AddFiniteExtrudedProtrusion(1, aProfiles.GetSafeArrayPtr(),
  14.         pt::igSymmetric, 0.6);

  15.     // 在一个新的草图上创建一个圆
  16.     pt::RefPlanePtr pXOYPlane = pPartDoc->GetRefPlanes()->Item(1l);
  17.     pt::SketchPtr pSketch = pPartDoc->GetSketches()->AddByPlane(pXOYPlane);
  18.     pt::ProfilePtr pProfileScd = pSketch->GetProfile();
  19.     pProfileScd->GetCircles2d()->AddByCenterRadius(0.0, 0.0, 0.05);

  20.     // 投影圆所在草图到圆柱面上
  21.     gm::BodyPtr pBody = pCylinderModel->GetBody();
  22.     gm::FacesPtr pFaces = pBody->GetFaces(gm::igQueryCylinder);
  23.     assert(pFaces->GetCount() > 0);
  24.     gm::FacePtr pFace = pFaces->Item(1l);
  25.     long faceCnt = pFaces->GetCount();
  26.     pt::ProjectCurvesPtr pProjCvs = pPartDoc->GetConstructions()->GetProjectCurves();
  27.     pt::RefPlanePtr pDestPlane = pPartDoc->GetRefPlanes()->AddParallelByDistance(pXOYPlane, 0.2, pt::igNormalSide);
  28.     pt::ProjectCurvePtr pProjCv = pProjCvs->Add(pSketch, pFace, pDestPlane, pt::igRight, pt::igProjectOptionProject);

  29.     // 法向拉伸
  30.     gm::EdgesPtr pProjEdges = pProjCv->GetEdges(gm::igQueryAll);
  31.     long projEdgeCnt = pProjEdges->GetCount();
  32.     ATL::CComSafeArray<IDispatch*> aEdges(projEdgeCnt);
  33.     for (long i = 0; i < projEdgeCnt; i++)
  34.     {
  35.         aEdges.SetAt(i, pProjEdges->Item(i + 1));
  36.     }
  37.     _variant_t varEdges;
  38.     varEdges.parray = aEdges.Detach();
  39.     varEdges.vt = VT_ARRAY | VT_DISPATCH;
  40.     pCylinderModel->GetNormalToFaceProtrusions()->Add(projEdgeCnt,  // 传入的edges个数
  41.         varEdges, // edges
  42.         pt::igLeft, // pt::igLeft 向外拉伸(加料) pt::igRight 向内拉伸(除料)
  43.         0.01,  // 拉伸厚度
  44.         pt::igFacesTouchingCurvesOnly // pt::igFacesTouchingCurvesOnly 仅修改与曲线接触的面
  45.         // pt::igAllFaces 修改曲线图内的所有面
  46.     );
  47. }
复制代码
        总体思路为在创建一个圆柱体,并将一个圆投影至圆柱面后,调用NormalToFaceProtrusions::Add方法,运行效果如下。
6.3.png

四、加厚
        加厚命令通过偏移一个或多个面来加厚零件,SDK中使用Thickens::Add方法用于加厚。
        其原型为:
  1. ThickenPtr Add(
  2.     enum FeaturePropertyConstants Side, //加厚方法
  3.     double offsetDistance, // 加厚厚度
  4.     long NumberOfFaces,  // 要加厚的面的个数
  5.     SAFEARRAY** Faces  // 要加厚的面集
  6. )
复制代码
        下述代码演示了添加加厚特征的一般过程:
  1. // 添加加厚特征
  2. void  AddThickenFeature()
  3. {
  4.     namespace pt = TGPart;
  5.     namespace gm = TGGeometry;
  6.     pt::PartDocumentPtr pPartDoc = SEAPP->GetActiveDocument();
  7.     assert(pPartDoc);

  8.     // 使用对称拉伸,创建一个圆柱,圆柱顶底面法向分别为左、右视图
  9.     // 圆柱底面半径0.1,圆柱高0.6
  10.     pt::RefPlanePtr pYOZPlane = pPartDoc->GetRefPlanes()->Item(2l);
  11.     pt::ProfilePtr pProfile = pPartDoc->GetSketches()->AddByPlane(pYOZPlane)->GetProfile();
  12.     pProfile->GetCircles2d()->AddByCenterRadius(0.0, 0.0, 0.1);
  13.     ATL::CComSafeArray<IDispatch*> aProfiles(1);
  14.     aProfiles.SetAt(0, pProfile);
  15.     pt::ModelPtr pCylinderModel = pPartDoc->GetModels()->AddFiniteExtrudedProtrusion(1, aProfiles.GetSafeArrayPtr(),
  16.         pt::igSymmetric, 0.6);

  17.     // 加厚顶、底面其中之一,使不对称
  18.     gm::BodyPtr pBody = pCylinderModel->GetBody();
  19.     gm::FacesPtr pFaces = pBody->GetFaces(gm::igQueryPlane);
  20.     assert(pFaces->GetCount() == 2);
  21.     ATL::CComSafeArray<IDispatch*> aFaces(1);
  22.     aFaces.SetAt(0, pFaces->Item(1l));
  23.     // 朝外侧加厚0.2
  24.     pCylinderModel->GetThickens()->Add(pt::igRight,  // 加厚方向 一般为igRight(外侧),
  25.         // 对于单个的曲面特征可以往两侧加厚,则可为igLeft 或 igBoth(未验证)
  26.         0.2,   // 加厚厚度
  27.         1l, aFaces.GetSafeArrayPtr()   // 模型中要加厚的面
  28.     );
  29. }
复制代码
        运行效果如下:
6.4.png

五、实体拉伸
        使用SolidSweptProtrusions::Add方法可以基于已知实体和扫掠路径添加实体扫掠特征,这个方法的原型为:
  1. SolidSweptProtrusionPtr Add(IDispatch* pTargetBody, //目标实体 要求为gm::Body
  2.     IDispatch* pToolBody, // 原始实体 要求为gm::Body 可与pTargetBody相等
  3.     IDispatch* pPath, // 扫掠路径,要求为pt::Profile
  4.     IDispatch* pRotationAxis,  // 原始实体的旋转轴,对于圆柱、圆锥体,可传nullptr
  5.     IDispatch* pLockDirection,
  6.     VARIANT_BOOL bToolOnPath,  // true时,在路径上旋转工具体;false时,垂直于曲面放置工具
  7.     VARIANT_BOOL bProtrusion   // true时,拉伸;false时,除料
  8. );
复制代码
  1. void AddSolidSweptExtruProtrusion()
  2. {
  3.     namespace pt = TGPart;
  4.     namespace fwp = TGFrameworkSupport;
  5.     namespace gm = TGGeometry;
  6.     pt::PartDocumentPtr pPartDoc = SEAPP->GetActiveDocument();
  7.     assert(pPartDoc);

  8.     // 创建一个圆柱体用于演示
  9.     pt::ProfilePtr pProfile = pPartDoc->GetSketches()->AddByPlane(pPartDoc->GetRefPlanes()->Item(1l))->GetProfile();
  10.     pProfile->GetCircles2d()->AddByCenterRadius(0, 0, 0.1);  // 中心位于原点,半径0.1
  11.     ATL::CComSafeArray<IDispatch*> aProfiles(1);
  12.     aProfiles.SetAt(0, pProfile);
  13.     pt::ModelPtr pModelFst = pPartDoc->GetModels()->AddFiniteExtrudedProtrusion(aProfiles.GetCount(), aProfiles.GetSafeArrayPtr(), pt::igRight, 1.0);

  14.     // 创建扫掠路径(一条直线)
  15.     pt::RefPlanePtr pXOYPlane = pPartDoc->GetRefPlanes()->Item(1l);
  16.     pt::ProfilePtr pXOYProfile = pPartDoc->GetSketches()->AddByPlane(pPartDoc->GetRefPlanes()->Item(1l))->GetProfile();
  17.     fwp::Line2dPtr pLine2d = pXOYProfile->GetLines2d()->AddBy2Points(0, 0, 0.5, 0);

  18.     // 进行实体扫掠
  19.     pt::SolidSweptProtrusionsPtr pSweptProtrusions = pModelFst->GetSolidSweptProtrusions();
  20.     assert(pModelFst->GetExtrudedProtrusions()->GetCount() > 0);
  21.     pt::ExtrudedProtrusionPtr pCylinder = pModelFst->GetExtrudedProtrusions()->Item(1l);
  22.     gm::BodyPtr pToolBody = pModelFst->GetBody();
  23.     gm::BodyPtr pTargetBody = pToolBody;
  24.     pt::SolidSweptProtrusionPtr pBodySwept = pSweptProtrusions->Add(pTargetBody, pToolBody,
  25.         pXOYProfile, nullptr, nullptr, VARIANT_TRUE, VARIANT_TRUE);
  26. }
复制代码
        上述代码演示了使用这个方法的一般过程,运行效果如下。
6.5.png

六、放样拉伸
        放样拉伸操作通过连接一系列闭合截面形成三维模型,可以使用Models::AddLoftedProtrusion方法进行放样拉伸。
  1. template<typename T>
  2. ATL::CComSafeArray<T> ToComSafeArray(std::initializer_list<T> const& initial_list)
  3. {
  4.     ATL::CComSafeArray<T> comArray((ULONG)initial_list.size());
  5.     long i = 0;
  6.     for (auto it = initial_list.begin(); it != initial_list.end(); ++it)
  7.     {
  8.         comArray.SetAt(i, *it);
  9.         i++;
  10.     }
  11.     return comArray;
  12. }

  13. template<typename T>
  14. _variant_t ToArrayVar(std::initializer_list<T> const& initial_list)
  15. {
  16.     VARENUM varEnum;
  17.     if (std::is_same_v<T, double>)
  18.     {
  19.         varEnum = VT_R8;
  20.     }
  21.     else if (std::is_same_v<T, int>)
  22.     {
  23.         varEnum = VT_I4;
  24.     } else if (std::is_same_v<T, float>)
  25.     {
  26.         varEnum = VT_R4;
  27.     }
  28.     else if (std::is_same_v<T, IDispatch*>)
  29.     {
  30.         varEnum = VT_DISPATCH;
  31.     }
  32.     else if (std::is_same_v<T, long>)
  33.     {
  34.         varEnum = VT_I8;
  35.     }
  36.     else
  37.     {
  38.         static_assert("未定义的类型");
  39.     }
  40.     ATL::CComSafeArray<T> comArray = ToComSafeArray(initial_list);
  41.     _variant_t var;
  42.     var.vt = VT_ARRAY| varEnum;
  43.     var.parray = comArray.Detach();
  44.     return var;
  45. }

  46. _variant_t ToEmbedVar(std::initializer_list<_variant_t> const& initial_list)
  47. {
  48.     SAFEARRAYBOUND arrBound{ initial_list.size(),0};
  49.     SAFEARRAY* psa = SafeArrayCreate(VT_VARIANT, 1, &arrBound);
  50.     long i = 0;
  51.     for (auto it = initial_list.begin(); it != initial_list.end(); ++it,++i)
  52.     {
  53.         SafeArrayPutElement(psa, &i, (void*)(&(*it)));
  54.     }
  55.     _variant_t var;
  56.     var.vt = VT_ARRAY | VT_VARIANT;
  57.     var.parray = psa;
  58.     return var;
  59. }
  60. void CreateRectange(TGPart::ProfilePtr pProfile, double cenX, double cenY, double len, double width)
  61. {
  62.     namespace fwp = TGFrameworkSupport;
  63.     // 矩形在天工CAD中由四条首尾相连的直线组成
  64.     fwp::Lines2dPtr pLines2d = pProfile->GetLines2d();
  65.     std::array<fwp::Line2dPtr, 4> lines;
  66.     lines[0] = pLines2d->AddBy2Points(cenX - len / 2, cenY - width / 2, cenX + len / 2, cenY - width / 2);// 底边
  67.     lines[1] = pLines2d->AddBy2Points(cenX + len / 2, cenY - width / 2, cenX + len / 2, cenY + width / 2); // 右边
  68.     lines[2] = pLines2d->AddBy2Points(cenX + len / 2, cenY + width / 2, cenX - len / 2, cenY + width / 2); // 上边
  69.     lines[3] = pLines2d->AddBy2Points(cenX - len / 2, cenY + width / 2, cenX - len / 2, cenY - width / 2); // 左边
  70.     fwp::Relations2dPtr pRelations2d = pProfile->GetRelations2d();
  71.     for (int i = 0; i < 3; i++)
  72.     {
  73.         fwp::Line2dPtr pLine = lines[i];
  74.         fwp::Line2dPtr pNextLine = lines[(i + 1) % 4];
  75.         pRelations2d->AddKeypoint(
  76.             pLine,
  77.             (int)TGConstants::KeypointIndexConstants::igLineEnd,
  78.             pNextLine,
  79.             (int)TGConstants::KeypointIndexConstants::igLineStart,
  80.             true);
  81.     }
  82.     pProfile->End(TGPart::ProfileValidationType::igProfileClosed);
  83. }
  84. void AddLoftProtrusion()
  85. {
  86.     namespace pt = TGPart;
  87.     namespace fwp = TGFrameworkSupport;
  88.     pt::PartDocumentPtr pPartDoc = SEAPP->GetActiveDocument();
  89.     pt::RefPlanePtr pSidePlane = pPartDoc->GetRefPlanes()->Item(2l); // 侧平面

  90.     // 左剖面,画一个矩形
  91.     pt::RefPlanePtr pFstPlane = pPartDoc->GetRefPlanes()->AddParallelByDistance(pSidePlane, 0.5, pt::igReverseNormalSide);
  92.     pt::ProfilePtr pFstProfile = pPartDoc->GetSketches()->AddByPlane(pFstPlane)->GetProfile();
  93.     CreateRectange(pFstProfile, 0, 0, 0.6, 0.5);

  94.     // 中间剖面,画一个圆
  95.     pt::ProfilePtr pScdProfile = pPartDoc->GetSketches()->AddByPlane(pSidePlane)->GetProfile();
  96.     pScdProfile->GetCircles2d()->AddByCenterRadius(0, 0, 0.2);

  97.     // 右剖面,画一个矩形
  98.     pt::RefPlanePtr pTrdPlane = pPartDoc->GetRefPlanes()->AddParallelByDistance(pSidePlane, 0.5, pt::igNormalSide);
  99.     pt::SketchsPtr pSketchs = pPartDoc->GetSketches();
  100.     pt::SketchPtr pSketch = pPartDoc->GetSketches()->AddByPlane(pTrdPlane);
  101.     pt::ProfilePtr pTrdProfile = pSketch->GetProfile();
  102.     CreateRectange(pTrdProfile, 0, 0, 0.6, 0.5);

  103.     // 创建放样拉伸特征
  104.     _variant_t sectionArr = ToArrayVar({
  105.     (IDispatch*)pFstProfile.GetInterfacePtr(),(IDispatch*)pScdProfile.GetInterfacePtr(),
  106.     (IDispatch*)pTrdProfile.GetInterfacePtr(),});

  107.     _variant_t sectTypeArr = ToArrayVar({
  108.         (int)pt::igProfileBasedCrossSection,
  109.         (int)pt::igProfileBasedCrossSection,
  110.         (int)pt::igProfileBasedCrossSection});
  111.     _variant_t sectionFstStPoints = ToArrayVar({ -0.3,-0.25 });
  112.     _variant_t sectionTrdStPoints = ToArrayVar({ -0.3,-0.25 });
  113.     _variant_t orginArr = ToEmbedVar({ sectionFstStPoints,_variant_t(0),sectionTrdStPoints });

  114.     pt::ModelsPtr pModels = pPartDoc->GetModels();
  115.     pModels->AddLoftedProtrusion(3, sectionArr, sectTypeArr, orginArr, 0, pt::igLeft,
  116.         pt::igNone, 0.0, nullptr, pt::igNone, 0.0, nullptr, pt::igNone, 0.0, pt::igNone, 0.0);
  117. }
复制代码
        上述代码演示了使用这个方法的一般过程,运行效果如下。
6.6.png
        
AddLoftedProtrusion的原型为:
  1. ModelPtr AddLoftedProtrusion (
  2. long NumSections,const _variant_t & CrossSections,const _variant_t & CrossSectionTypes,
  3. const _variant_t & Origins,const _variant_t & SegmentMaps,enum FeaturePropertyConstants MaterialSide,
  4. enum FeaturePropertyConstants StartExtentType,double StartExtentDistance,IDispatch * StartSurfaceOrRefPlane,
  5. enum FeaturePropertyConstants EndExtentType,double EndExtentDistance,IDispatch * EndSurfaceOrRefPlane,
  6. enum FeaturePropertyConstants StartTangentType,double StartTangentMagnitude,enum FeaturePropertyConstants EndTangentType,
  7. double EndTangentMagnitude,const _variant_t & NumGuideCurves = vtMissing,
  8. const _variant_t & GuideCurves = vtMissing );
复制代码

        虽然它看起来参数众多,但是一般只需要关注前四个参数,后面的参数要么是预留的,要么暂时是固定项。
        NumSections 截面个数
        CrossSections 用于传入截面,VT_ARRAY|VT_DISPATCH类型的变体,要求其内Dispatch个数和截面个数相同
        CrossSectionTypes 用于传入截面类型,VT_ARRAY|VT_I4型的变体,要求数组元素个数与截面个数相同,每个都用于描述CrossSections对应的截面类型
        Origins 用于描述每个截面的起始点,这些起始点集影响拉伸效果。VT_ARRAY|VT_VARIANT类型的变体,要求数组元素个数与截面个数相同。如果是周期性的截面(如圆、椭圆),作为元素的变体可以只传0。否则作为元素的变体是VT_ARRAY|VT_R8类型的数组,元素个数为2。






评论(0)

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

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