天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 54|回复: 0

Polyline offset using ObjectARX

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]// In DocData.h

// A public variable to store the offset distance

ads_real m_OffsetValue;

// In DocData.cpp

// Initialize the offset distance in the constructor

CDocData::CDocData ()

{

    m_OffsetValue = 1.0;

}

Here is the command implementation :

static void ADSProject_Test(void)

{

    AcDbPolyline *pPolyEnt = NULL;

    AcDbEntity *pObj;

    AcDbPolyline *pPolyPositive = NULL;

    AcDbPolyline *pPolyNegative = NULL;

    AcDbObjectId polyEntId, ownerId;

    AcDbVoidPtrArray ar_polyPositives;

    AcDbVoidPtrArray ar_polyNegatives;



    ads_real offset = 1.0;

    ads_name eName;

    ads_point pt;

    int rc;



    rc = acedEntSel(

                        ACRX_T("\nSelect Polyline to offset "),

                        eName,

                        pt

                    );



    if(rc != RTNORM)

    {

        acutPrintf(_T("\nNothing selected "));

        return;

    }



    // Get the selected entity object ID

    acdbGetObjectId(polyEntId, eName);



    // Is the selected entity an AcDbPolyline

    acdbOpenObject(pObj, polyEntId, AcDb::kForRead);

    if(pObj == NULL)

    {

        return;

    }



    pPolyEnt = AcDbPolyline::cast(pObj);

    if(!pPolyEnt)

    {

        acutPrintf(_T("\nNot an AcDbPolyline entity "));

        pPolyEnt->close();

        return;

    }



    // Now that we have a valid AcDbPolyline entity proceed

    rc = acedGetDist(

                        NULL,

                        ACRX_T("Polyline offset distance"),

                        &offset

                    );

    switch(rc)

    {

        case RTERROR:

            acutPrintf(_T("\nError with acedGetDist() "));

            pPolyEnt->close();

            return;

            break;



        case RTCAN:

            pPolyEnt->close();

            acutPrintf(_T("\nCancelled"));

            return;

            break;



        case RTNONE:

            offset = DocVars.docData().m_OffsetValue;

            break;



        case RTNORM:

            DocVars.docData().m_OffsetValue = offset;

            break;

    }



    try

    {

        // who owns the polyline Model Space or Paper Space

        ownerId = pPolyEnt->ownerId();

        pPolyEnt->getOffsetCurves(offset, ar_polyPositives);



        //offsetPolyline(pPolyEnt, ar_polyPositives, offset);

        if(ar_polyPositives.length() != 1)

        {

            deleteArray(ar_polyPositives);

            pPolyEnt->close();

            return;

        }

        else

        {

            pPolyPositive = (AcDbPolyline*)(ar_polyPositives[0]);

            appendEntity(pPolyPositive, ownerId);

        }



        pPolyPositive->getOffsetCurves(

                                        -2.0 * offset,

                                        ar_polyNegatives

                                      );

        if(ar_polyNegatives.length() != 1)

        {

            deleteArray(ar_polyNegatives);

            pObj->close();

            return;

        }

        else

        {

            pPolyNegative = (AcDbPolyline*)(ar_polyNegatives[0]);

            appendEntity(pPolyNegative, ownerId);

        }

    }

    catch(...)

    {

        acutPrintf(ACRX_T("Sorry, Error while offsetting."));

    }



    pPolyEnt->close();



    if(pPolyPositive)

    {

        pPolyPositive->close();

    }



    if(pPolyNegative)

    {

        pPolyNegative->close();

    }

}



static void deleteArray(AcDbVoidPtrArray entities)

{

    AcDbEntity* pEnt;

    int nEnts;



    nEnts = entities.length();

    for(int i = 0; i < nEnts; i++)

    {

        pEnt = (AcDbEntity*)(entities[i]);

        delete pEnt;

    }

}



static void appendEntity(

                            AcDbEntity* pEnt,

                            AcDbObjectId recordId

                        )

{

    AcDbBlockTableRecord* pRecord;

    acdbOpenObject(pRecord, recordId, AcDb::kForWrite);

    pRecord->appendAcDbEntity(pEnt);

    pRecord->close();

}[/code]

 

 

 

 

Polyline offset using ObjectARX
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:32 , Processed in 0.157318 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表