天气与日历 切换到窄版

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

‎使用 ObjectARX 的 XCLIP 外部参照‎

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
‎使用 ObjectARX 的 XCLIP 外部参照‎


‎AcDbSpatialFilter 类就是为此而设计的。此类用于定义一个空间过滤器,AutoCAD 使用该过滤器来定义主体图形中外部参照的块参照的剪辑体积。‎
‎AutoCAD 使用此空间过滤器来决定在恢复期间将处理哪些对象 ID。‎

‎下面的示例是一个小演示。注意:命令需要使用以下选项ACRX_CMD_NOINTERNALLOCK进行定义:‎

[code]ACED_ARXCOMMAND_ENTRY_AUTO(CMyTestApp,
                           MyTestApp,
                           _MyClip, MyClip,
                           ACRX_CMD_TRANSPARENT |
                           ACRX_CMD_NOINTERNALLOCK,
                           NULL)





static void MyTestApp_MyClip()

{

    ads_point pt1,pt2;

    ads_name ent;

    if (acedEntSel(_T("Select xref:"),ent,pt1)!=RTNORM)

        return;

    AcDbObjectId idXref;

    if (acdbGetObjectId(idXref,ent)!=Acad::eOk)

        return;

    AcDbObjectPointer<AcDbBlockReference> pRef(idXref,AcDb::kForRead);

    if (pRef.openStatus()!=Acad::eOk)

    {

        acutPrintf(_T("Not an xref!\n"));

        return;

    }

    AcGePoint2dArray pts;

    if (acedGetPoint(NULL,_T("First point:"),pt1)!=RTNORM)

        return;

    //the ECS of the vertices must be defined in the

    //coordinate system of the _block_ so let's calculate

    //transform all points to that coordinate system



    AcGeMatrix3d mat(pRef->blockTransform());

    mat.invert();



    AcGePoint3d pt3d(asPnt3d(pt1));

    pt3d.transformBy(mat);

    pts.append(AcGePoint2d(pt3d.x,pt3d.y));

    while (acedGetPoint(pt1,_T("Next point:"),pt2)==RTNORM)

    {

        acedGrDraw(pt1,pt2,1,1);

        pt3d = asPnt3d(pt2);

        pt3d.transformBy(mat);

        pts.append(AcGePoint2d(pt3d.x,pt3d.y));

        memcpy(pt1,pt2,sizeof(ads_point));

    }

    acedRedraw(NULL,0);

    AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();

    AcGeVector3d normal;

    double elev;

    if (pDb->tilemode())

    {

        normal = pDb->ucsxdir().crossProduct(pDb->ucsydir());

        elev = pDb->elevation();

    }

    else

    {

        normal = pDb->pucsxdir().crossProduct(pDb->pucsydir());

        elev = pDb->pelevation();

    }

    normal.normalize();

    Acad::ErrorStatus es = pRef.object()->upgradeOpen();

    if (es !=Acad::eOk)

        return;

    //create the filter

    AcDbSpatialFilter* pFilter = new AcDbSpatialFilter;

    if (pFilter->setDefinition(pts,normal,elev,

        ACDB_INFINITE_XCLIP_DEPTH,-ACDB_INFINITE_XCLIP_DEPTH,true)!=Acad::eOk)

    {

        delete pFilter;

        return;

    }

    //add it to the extension dictionary of the block reference

    //the AcDbIndexFilterManger class provides convenient utility functions

    if (AcDbIndexFilterManager::addFilter(pRef.object(),pFilter)!=Acad::eOk)

        delete pFilter;

    else

    {

        acutPrintf(_T("Filter has been succesfully added!\n"));

        pFilter->close();

    }



}[/code]

 

 

 

 

‎使用 ObjectARX 的 XCLIP 外部参照‎
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 09:25 , Processed in 0.132686 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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