天气与日历 切换到窄版

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

ObjectARX2015 + vs2012创建面域

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

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

        本篇介绍提示用户选择所要组成面域的对象,然后在命令行显示创建面域的结果。这与 AutoCAD 中 REGION 命令的操作基本一致。
2. 思路
        AcDbRegion 类代表 AutoCAD 中的面域。        
        
        在 ObjectARX 中创建面域对象非常特别,它一般不利用构造函数来完成对象的创建,而是使用 AcDbRegion 类的一个静态成员函数 createFromCurves 来完成。
        createFromCurves 函数的定义为:
static Acad::ErrorStatus createFromCurves(
    const AcDbVoidPtrArray& curveSegments, //CurveSegments 是一个指向曲线实体的指针数组,用来定义面域的边界,作为面域边界的曲线必须首尾相连;
    AcDbVoidPtrArray& regions);            //regions 是一个指针数组,返回指向新创建的面域的指针。
        在创建面域时,需要注意,作为面域边界的对象必须是 AcDbLine 、 AcDbArc 、 AcDbEllipse 、 AcDbCircle、 AcDbSpline 、 AcDb3dPolyline 或 AcDbPolyline 类的对象。
3. 步骤

(1) 创建面域

//面域
static AcDbObjectIdArray CreateRegion(AcDbObjectIdArray curveIds);
//创建面域
AcDbObjectIdArray CCreateEnt::CreateRegion(AcDbObjectIdArray curveIds)
{
    AcDbObjectIdArray regionIds; // 生成的面域的ID数组
    AcDbVoidPtrArray curves; // 指向作为面域边界的曲线的指针的数组
    AcDbVoidPtrArray regions; // 指向创建的面域对象的指针的数组
    AcDbEntity *pEnt; // 临时指针,用来关闭边界曲线
    AcDbRegion *pRegion; // 临时对象,用来将面域添加到模型空间

    // 用curveIds初始化curves
    for (int i = 0; i < curveIds.length(); i++)
    {
        acdbOpenAcDbEntity(pEnt, curveIds.at(i), AcDb::kForRead);
        if (pEnt->isKindOf(AcDbCurve::desc()))
        {
            curves.append(static_cast<void*>(pEnt));
        }
    }

    Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves,
        regions);
    if (es == Acad::eOk)
    {
        // 将生成的面域添加到模型空间
        for (int i = 0; i < regions.length(); i++)
        {
            // 将空指针(可指向任何类型)转化为指向面域的指针
            pRegion = static_cast<AcDbRegion*>(regions[i]);
            pRegion->setDatabaseDefaults();
            AcDbObjectId regionId;
            regionId = CCreateEnt::PostToModelSpace(pRegion);
            regionIds.append(regionId);
        }
    }
    else // 如果创建不成功,也要删除已经生成的面域
    {
        for (int i = 0; i < regions.length(); i++)
        {
            delete (AcRxObject*)regions[i];
        }
    }
    // 关闭作为边界的对象
    for (int i = 0; i < curves.length(); i++)
    {
        pEnt = static_cast<AcDbEntity*>(curves[i]);
        pEnt->close();
    }
    return regionIds;
}

(2) 在acrxEntryPoint.cpp中添加

ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDrawRegion, MyDrawRegion, ACRX_CMD_MODAL, NULL) //画多段线
//当前项目中注册一个命令 AddRegion
     static void MidasMyGroupMyDrawRegion()
     {
         // 使用选择集,提示用户选择作为面域边界的对象
         ads_name ss;
         int rt = acedSSGet(NULL, NULL, NULL, NULL, ss); // 提示用户选择对象
         AcDbObjectIdArray objIds;

         // 根据选择集中的对象构建边界曲线的ID数组
         if (rt == RTNORM)
         {
             long length;
             acedSSLength(ss, &length); // 获得选择集中的对象个数
             for (int i = 0; i < length; i++)
             {
                 ads_name ent;
                 acedSSName(ss, i, ent);
                 AcDbObjectId objId;
                 acdbGetObjectId(objId, ent);

                 objIds.append(objId);
             }
         }
         acedSSFree(ss); // 及时释放选择集
         AcDbObjectIdArray regionIds;
         regionIds = CCreateEnt::CreateRegion(objIds);
         int number = regionIds.length();
         if (number > 0)
         {
             acutPrintf(_T("\n已经创建%d个面域!"), number);
         }
         else
         {
             acutPrintf(_T("\n创建0个面域!"));
         }
     }


原文链接:https://blog.csdn.net/qq_42981953/article/details/121826112[/code]

 

 

 

 

ObjectARX2015 + vs2012创建面域
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 11:30 , Processed in 0.149001 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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