leven50 发表于 2024-10-17 15:49:36

【初级教程七】倒角、建孔

本帖最后由 天工开发者团队 于 2024-10-29 10:10 编辑

一、前置性代码
         创建一个矩形:
// 创建一个中点为(0,0),长度为0.1,宽度为0.08的矩形
void CreateRectangle(TGPart::ProfilePtr& pProfile, double cenX = 0.0
            , double cenY = 0.0, double len = 0.1, double width = 0.08);void CreateRectangle(TGPart::ProfilePtr& pProfile, double cenX, double cenY, double len, double width)
{
    // 添加矩形
    TGFrameworkSupport::Lines2dPtr pLines2d = pProfile->GetLines2d();
    std::array<TGFrameworkSupport::Line2dPtr, 4> lines;
    lines = pLines2d->AddBy2Points(cenX - len / 2, cenY - width / 2, cenX + len / 2, cenY - width / 2);// 底边
    lines = pLines2d->AddBy2Points(cenX + len / 2, cenY - width / 2, cenX + len / 2, cenY + width / 2); // 右边
    lines = pLines2d->AddBy2Points(cenX + len / 2, cenY + width / 2, cenX - len / 2, cenY + width / 2); // 上边
    lines = pLines2d->AddBy2Points(cenX - len / 2, cenY + width / 2, cenX - len / 2, cenY - width / 2); // 左边

    TGFrameworkSupport::Relations2dPtr pRelations2d = pProfile->GetRelations2d();
    for (int i = 0; i < 4; i++)
    {
      TGFrameworkSupport::Line2dPtr pLine = lines;
      TGFrameworkSupport::Line2dPtr pNextLine = lines[(i + 1) % 4];
      pRelations2d->AddKeypoint(
            pLine,
            (int)TGConstants::KeypointIndexConstants::igLineEnd,
            pNextLine,
            (int)TGConstants::KeypointIndexConstants::igLineStart,
            true);
    }
}      创建一个一维数组:
template<typename T>
_variant_t CreateVariant(T* t, VARENUM em)
{
    // 暂时支持数量为一的一维数组
    SAFEARRAYBOUND bound = { 1, 0 };
    SAFEARRAY* pSafeArry = SafeArrayCreate(em, 1, &bound);
    SafeArrayPutElement(pSafeArry, &bound.lLbound, t);
    VARIANT var;
    VariantInit(&var);
    var.vt = VT_ARRAY | em;
    var.parray = pSafeArry;
    return _variant_t(var);
}
二、孔
         概念:使用孔命令可以构造简单孔、螺纹孔、沉头孔、埋头孔以及锥孔。

         API:
// API 所在数据结构 Holes
HolePtr AddFinite (// 轮廓,传洞口hole2d结构
struct Profile * Profile,
// 孔的方向igLeft基于平面法向igRight基于平面法向反向(平面指的是参考平面)
enum FeaturePropertyConstants ProfilePlaneSide,
// 孔深度
double FiniteDepth,
// 孔数据,包括孔类型,以及沉头孔和螺纹孔的其他参数
struct HoleData * Data );         使用示例:
void AddHole()
{
    Application* application = TGAddinApp::GetTGApp()->GetApplication();
    TGPart::PartDocumentPtr pDoc = application->GetActiveDocument();
    // 新建草图
    TGPart::SketchPtr pSketch = pDoc->Sketches->Add();
    //参考平面
    TGPart::RefPlanePtr pRefplane = pDoc->GetRefPlanes()->Item(3);
    // 轮廓
    TGPart::ProfilePtr pProfile = pSketch->GetProfiles()->Add(pRefplane);
    // 创建一个矩形
    CreateRectangle(pProfile);
    // 拉伸
    CComSafeArray<IDispatch*> aProfiles(1);
    aProfiles = pProfile;
    // 基于不同的轮廓去进行拉伸
    pDoc->Models->AddFiniteExtrudedProtrusion(
      1,
      aProfiles.GetSafeArrayPtr(),
      TGPart::FeaturePropertyConstants::igRight,
      0.2);
    // 添加2D洞口
    TGPart::ProfilePtr pHolePro = pDoc->Sketches->Add()->GetProfiles()->Add(pDoc->GetRefPlanes()->Item(2));
    pHolePro->Holes2d->Add(-0.025, 0.03);
    auto status = pHolePro->End(TGPart::ProfileValidationType::igProfileClosed);
    // 获取孔数据并添加新孔
    TGPart::HoleDataCollectionPtr pHoleCol = pDoc->GetHoleDataCollection();
//
    HoleDataPtr pHoleData = pHoleCol->Add(FeaturePropertyConstants::igRegularHole, 0.006);
    pDoc->Models->Item(1)->Holes->AddFinite(pHolePro, FeaturePropertyConstants::igBoth, 0.1, pHoleData);
}         代码效果图:

三、槽
         概念:使用槽命令,在直接建模或顺序建模零件和钣金环境中,沿相切连续的草图方向创建槽特征。

         API:
// API所在数据结构 Slots
SlotPtr Add (
struct Profile * Profile,// 槽的轮廓
enum FeaturePropertyConstants SlotType,// 槽的类型
enum FeaturePropertyConstants SlotEndCondition,// 槽端部条件
double SlotWidth,// 槽的宽度
double SlotOffsetWidth,// 槽的偏移宽度
double SlotOffsetDepth,// 槽的偏移深度
enum FeaturePropertyConstants ExtentType,// 第一个范围,槽的延伸方式
enum FeaturePropertyConstants ExtentSide,// 第一个范围侧
double FiniteDistance,// 第一个有限距离,延伸距离
enum KeyPointExtentConstants KeyPointFlags,// 关键点标识类型
IDispatch * KeyPointOrTangentFace,// 关键点,无则为NULL
enum FeaturePropertyConstants ExtentType2,// 第二个范围,槽的延伸方式
enum FeaturePropertyConstants ExtentSide2,// 第一个范围侧
double FiniteDistance2,// 第二个有限距离
enum KeyPointExtentConstants KeyPointFlags2,// 第二个关键点标识
IDispatch * KeyPointOrTangentFace2,// 关键点
IDispatch * FromFaceOrPlane,// 面或平面定义槽的起点
enum OffsetSideConstants FromOffsetSide,// 来自的偏移侧
double FromOffsetDistance,// 来自的偏移距离
IDispatch * ToFaceOrPlane,// 面或平面
enum OffsetSideConstants ToOffsetSide,// 到达的偏移侧
double ToOffsetDistance );// 到达的偏移距离         使用示例:
void AddSlot()
{
    Application* application = TGAddinApp::GetTGApp()->GetApplication();
    TGPart::PartDocumentPtr pDoc = application->GetActiveDocument();
    // 新建草图
    TGPart::SketchPtr pSketch = pDoc->Sketches->Add();
    //参考平面
    TGPart::RefPlanePtr pRefplane = pDoc->GetRefPlanes()->Item(3);
    // 轮廓
    TGPart::ProfilePtr pProfile = pSketch->GetProfiles()->Add(pRefplane);
    // 创建一个矩形
    CreateRectangle(pProfile);
    // 拉伸
    CComSafeArray<IDispatch*> aProfiles(1);
    aProfiles = pProfile;

    // 基于不同的轮廓去进行拉伸
    pDoc->Models->AddFiniteExtrudedProtrusion(
      1,
      aProfiles.GetSafeArrayPtr(),
      TGPart::FeaturePropertyConstants::igRight,
      0.2);
    // 新建草图
    pSketch = pDoc->Sketches->Add();
    pProfile = pSketch->GetProfiles()->Add(pRefplane);
    TGFrameworkSupport::Lines2dPtr pLines2d = pProfile->GetLines2d();
    double cenX = 0.0;   // 中心X
    double cenY = 0.0;   // 中心Y
    double len = 0.1;      // 长
    double width = 0.08;// 宽
      // 添加特征轮廓
    pLines2d->AddBy2Points(cenX - len / 2, cenY, cenX + len / 2, cenY);

    TGPart::SlotsPtr pSlots = pDoc->Models->Item(1)->Slots;
    pSlots->Add(
      pProfile, FeaturePropertyConstants::igRegularSlot, FeaturePropertyConstants::igFormedEnd,
      0.005, 0.0, 0.0,
      FeaturePropertyConstants::igFinite, FeaturePropertyConstants::igRight,
      0.2,
      KeyPointExtentConstants::igTangentNormal, NULL,
      FeaturePropertyConstants::igNone, FeaturePropertyConstants::igNone,
      0.0,
      KeyPointExtentConstants::igTangentNormal,
      NULL, NULL,
      OffsetSideConstants::seOffsetNone,
      0.0, NULL,
      OffsetSideConstants::seOffsetNone, 0.0
    );
}         代码效果图:


四、倒角
4.1 倒圆角
         概念:倒圆允许您将锐利的模型边替换为平滑的倒圆表面,以改进模型外观或功能。

         API:RoundPtr Add(
long NumberOfEdgeSets,// 倒圆边的数量
const _variant_t& EdgeSetArray,// 倒圆边的数组
const _variant_t& RadiusArray,// 倒圆边的对应的半径的数组
const _variant_t& RollAcrossTangentEdges = vtMissing,
const _variant_t& RollOrCapAcrossSharpEdges = vtMissing,
const _variant_t& RollAlongBlendEdges = vtMissing,
const _variant_t& ApplyVertexBlends = vtMissing);         使用示例:
void AddRound()
{
    Application* application = TGAddinApp::GetTGApp()->GetApplication();
    TGPart::PartDocumentPtr pDoc = application->GetActiveDocument();
    // 新建草图
    TGPart::SketchPtr pSketch = pDoc->Sketches->Add();
    //参考平面
    TGPart::RefPlanePtr pRefplane = pDoc->GetRefPlanes()->Item(3);
    // 轮廓
    TGPart::ProfilePtr pProfile = pSketch->GetProfiles()->Add(pRefplane);
    // 创建一个中线点为(0,0),长度为0.1,宽度为0.08的矩形
    CreateRectangle(pProfile);
    // 拉伸
    CComSafeArray<IDispatch*> aProfiles(1);
    aProfiles = pProfile;
    // 基于矩形进行拉伸 ,右侧,长度为0.2
    pDoc->Models->AddFiniteExtrudedProtrusion(
      1,
      aProfiles.GetSafeArrayPtr(),
      TGPart::FeaturePropertyConstants::igRight,
      0.2);
    // 选择可以倒圆的边
    ExtrudedProtrusionPtr pEx = pDoc->Models->Item(1)->ExtrudedProtrusions->Item(1);
    TGGeometry::EdgesPtr pEdges =
      pEx->Edges;
    IDispatchPtr s = pEdges->Item(1);
    //倒圆半径 0.05
    double radius = 0.05;
    // 构造参数
    _variant_t    edgeSetArray = CreateVariant<IDispatch>(s, VT_DISPATCH);
    _variant_t    radiusArray = CreateVariant<double>(&radius, VT_R8);
    // 添加倒圆
    RoundsPtr pRounds = pDoc->Models->Item(1)->GetRounds();
    RoundPtr pRound = pRounds->Add(
      1, edgeSetArray, radiusArray
    );
}         代码效果图:

4.2 倒斜角
         概念:使用倒斜角命令(特征) 可在两个面之间 公共边上构造倒斜角。

         API:
ChamferPtr AddEqualSetback(
long NumberOfEdgeSets,//边的数量
const _variant_t& EdgeSetArray,// 边的数组 IDispatch类型
double SetbackDistance);// 倒斜角距离         使用示例:
void AddChamfer()
{
    Application* application = TGAddinApp::GetTGApp()->GetApplication();
    TGPart::PartDocumentPtr pDoc = application->GetActiveDocument();
    // 新建草图
    TGPart::SketchPtr pSketch = pDoc->Sketches->Add();
    //参考平面
    TGPart::RefPlanePtr pRefplane = pDoc->GetRefPlanes()->Item(3);
    // 轮廓
    TGPart::ProfilePtr pProfile = pSketch->GetProfiles()->Add(pRefplane);
    // 创建一个中线点为(0,0),长度为0.1,宽度为0.08的矩形
    CreateRectangle(pProfile);
    // 拉伸
    CComSafeArray<IDispatch*> aProfiles(1);
    aProfiles = pProfile;
    // 基于矩形去进行拉伸
    pDoc->Models->AddFiniteExtrudedProtrusion(
      1,
      aProfiles.GetSafeArrayPtr(),
      TGPart::FeaturePropertyConstants::igRight,
      0.2);
    // 选择可以倒斜角的边
    ExtrudedProtrusionPtr pEx = pDoc->Models->Item(1)->ExtrudedProtrusions->Item(1);
    TGGeometry::EdgesPtr pEdges =
      pEx->Edges;
    IDispatchPtr s = pEdges->Item(2);
    //倒斜角距离 0.01
    double distance = 0.01;
    // 构造参数
    _variant_t    edgeSetArray = CreateVariant<IDispatch>(s, VT_DISPATCH);
    // 获取斜角集合
    ChamfersPtr pChamfers = pDoc->Models->Item(1)->GetChamfers();
    // AddEqualSetback 从边缘集数组创建一个或多个倒角对象。
    // AddUnequalSetback 以指定角度创建一个或多个倒角对象
    // AddSetbackAngle 创建一个或多个后退距离不等的倒角对象
    ChamferPtr pChamfer = pChamfers->AddEqualSetback(
      1,
      edgeSetArray,
      distance
    );
}         代码效果图:

页: [1]
查看完整版本: 【初级教程七】倒角、建孔