ObjectARX中如何获取填充实体的边界

2023-12-19

原文链接:https://blog.csdn.net/itwalker1618/article/details/54604486

//遍历填充对象的边界信息。
bool CAcUiSelDialog::OpenDwgFile(const ACHAR* fileName)
{
    Acad::ErrorStatus es;
    //AcDbObjectIdArray objectIds ;         //边界id数组
    AcGeVector3d normal;                    //填充平面
    bool bAssociative;                      //关联型
    AcDbHatch::HatchPatternType patternType;//填充图案类型
    const ACHAR *patternName;               //填充图案名
    AcDbHatch::HatchStyle   hatchStyle;
    //2.读取.dwg文件
    AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse); 
    es=pDb->readDwgFile(_T("D:\\***.dwg")); //.dwg文件路径
    if (Acad::eOk!=es)
    {
        acedAlert(_T("临时数据库打开失败"));
        delete pDb;
        return false;
    }
    //3.获取块表
    AcDbBlockTable *pBlkTbl; 
    es=pDb->getSymbolTable(pBlkTbl, AcDb::kForRead); 
    if (Acad::eOk!=es)
    {
        acedAlert(_T("获取块表错误!"));
        delete pDb;
        pBlkTbl->close();
        return false;
    }
    //4.获取块表记录
    AcDbBlockTableRecord *pBlkTblRcd; 
    es=pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForRead); 
    if (Acad::eOk!=es)
    {
        delete pDb;
        pBlkTbl->close();
        pBlkTblRcd->close();
        acedAlert(_T("获取块表记录错误!"));
        return false;
    }
    pBlkTbl->close(); 

    //5.创建块表记录迭代器,遍历模型空间块表记录
    CString hClass;  
    AcDbBlockTableRecordIterator *pBlkTblRcdItr; 
    pBlkTblRcd->newIterator(pBlkTblRcdItr); 

    AcGePoint3d *pPt3D = new AcGePoint3d();
    if (NULL == pPt3D)
    {
        pBlkTblRcd->close();
        delete pDb;
        //delete pHatch;
        delete pBlkTblRcdItr;
        return false;
    }
    //遍历块表记录中的实体
    for (pBlkTblRcdItr->start();!pBlkTblRcdItr->done();pBlkTblRcdItr->step()) 
    {
        //6.得到实体对象
        AcDbHatch *pHatch= new AcDbHatch();
        AcDbEntity *pEnt;
        Adesk::Int32 loopType;                  
        Adesk::UInt16 color=0;      
        AcGePoint2dArray vertices;             
        AcGeDoubleArray bulges;  
        pBlkTblRcdItr->getEntity(pEnt,AcDb::kForRead); 
        if (!pEnt->isKindOf(AcDbHatch::desc()))
        {
            pEnt->close();          
            pHatch->close();
            //delete patternName;
            delete pBlkTblRcdItr;
            return false;
        }
        pHatch=AcDbHatch::cast(pEnt);
        if (pHatch != NULL) 
        {   

            int loopNums=pHatch->numLoops();
            //acutPrintf(_T("%d"),loopNums);//此处可用
            normal=pHatch->normal();                //平面向量
            bAssociative=pHatch->associative();     //关联性
            patternName=pHatch->patternName();      //填充图案名
            patternType=pHatch->patternType();      //填充类型
            hatchStyle=pHatch->hatchStyle();        //hatch style of the hatch entity,填充风格
            color=pHatch->colorIndex();             //得到为indicates the entity uses the color specified in the LayerTableRecord it references.
            //acutPrintf(_T("填充对象的颜色:%d"),color);

            /
            AcDbHatch *pHatch2 = new AcDbHatch();           //新建填充对象                    
            es=pHatch2->setNormal(normal);                  // 设置填充平面
            if (Acad::eOk!=es)
            {
                acedAlert(_T("构造向量失败"));
                return false;
            }           
            es=pHatch2->setElevation(0); 
            es=pHatch2->setAssociative(bAssociative);       // 设置关联性
            if (Acad::eOk!=es)
            {
                acedAlert(_T("构造关联性失败"));
                return false;
            }
            es=pHatch2->setPattern(patternType,patternName); // 设置填充图案
            if (Acad::eOk!=es)
            {
                acedAlert(_T("构造图案失败"));
                return false;
            }
            es=pHatch2->setHatchStyle(hatchStyle);//设置填充类型
            es=pHatch2->setColorIndex(color);//设置颜色


            for (int loopIndex=0;loopIndex<loopNums;loopIndex++)//遍历第-61条边界
            {
                //为每一条边界长久存放数组
                AcGeVoidPointerArray edgePtrs;          
                AcGeIntArray edgeTypes;   

                AcGeVoidPointerArray VoidPtrAry;
                AcGeIntArray IntAry;
                if (Acad::eNotApplicable != pHatch->getLoopAt(loopIndex,loopType, vertices,bulges))//获取kPolyLine的边界
                {
                    //多义线----kPolyLine-----获取其顶点;
                    int iIndex = 0;
                    for (iIndex=0; iIndex<vertices.length(); iIndex++)
                    {                                               
                        pPt3D->x = vertices.at(iIndex).x;//This function returns the element of the array at position i
                        pPt3D->y = vertices.at(iIndex).y;
                        acutPrintf(_T("多义线的坐标是:%d,%d"),pPt3D->x,pPt3D->y);
                        //pPenStroke->m_Stroke.push_back(pPt3D);//保存多义线顶点
                    }
                }
                //非多义线
                else
                {
                    //分别获取第-61条边界,每一条边界都是AcGe对像数组
                    es=pHatch->getLoopAt(loopIndex,   //Input index of selected loop 
                        loopType,      //Output loop type 
                        edgePtrs,       //Output a set of AcGeCurve pointers 
                        edgeTypes);     //Output a set of enumerated edge types                     
                    for (int j=0; j<edgePtrs.length(); j++)//遍历AcGe对象数组中的点
                    {
                        /*
                        else if(edgeTypes[j]==AcDbHatch::kCirArc)//圆弧
                        {
                        //AcGeCircArc2d *CirArc=(AcGeCircArc2d *)edgePtrs;
                        acutPrintf(_T("\n圆弧"));
                        //可以根据数学圆弧构造相应的AcDb圆弧,取决于你(以下同)
                        }
                        else if(edgeTypes[j]==AcDbHatch::kEllArc)//椭圆弧
                        {
                        //AcGeEllipArc2d *EllArc=(AcGeEllipArc2d *)edgePtrs;
                        acutPrintf(_T("\n椭圆弧"));
                        }
                        else if(edgeTypes[j]==AcDbHatch::kSpline)//NURBS曲线
                        {
                        //AcGeNurbCurve2d *Spline=(AcGeNurbCurve2d *)edgePtrs;
                        acutPrintf(_T("\nNURBS曲线"));
                        }
                        //获取直线的起点和终点,只考虑直线,章中只有直线
                        if(edgeTypes[j]==AcDbHatch::kLine)//线型
                        {
                        AcGeLineSeg2d *pLnSeg=(AcGeLineSeg2d *)edgePtrs.at(j);//遍历第j个AcGe对象
                        }
                        */
                        AcGeLineSeg2d *pLineSeg= NULL;
                        //边类型(仅当边界不是多段线时):
                        //1 = 直线;= 圆弧;= 椭圆弧;= 样条曲线
                        switch(edgeTypes.at(j))//判断边类型
                        {
                        case 1://-----直线
                            {
                                pLineSeg = (AcGeLineSeg2d *)edgePtrs.at(j);
                            }
                        }
                        if (NULL != pLineSeg)
                        {
                            AcGePoint3d * pPt3D1 = new AcGePoint3d() ;//起点,并转换为D                            
                            pPt3D1->x = pLineSeg->startPoint().x;
                            pPt3D1->y = pLineSeg->startPoint().y;
                            AcGePoint2d BeginPt(pPt3D1->x, pPt3D1->y);
                            delete pPt3D1;

                            AcGePoint3d *pPt3D2=new AcGePoint3d() ;//尾点,并转为D                            
                            pPt3D2->x = pLineSeg->endPoint().x;
                            pPt3D2->y = pLineSeg->endPoint().y;
                            AcGePoint2d EndPt(pPt3D2->x, pPt3D2->y);
                            delete pPt3D2;

                            AcGeLineSeg2d *pObj = new AcGeLineSeg2d(BeginPt, EndPt);//
                            //acutPrintf(_T("添加第%d对象数组")),loopIndex;
                            VoidPtrAry.append(pObj);
                            IntAry.append(AcDbHatch::kLine);
                        }

                    }//遍历边界(AcGe对象数组)中AcGe对象结束,得到AcGe对象数组               

                    //es=pHatch2->appendLoop(loopType,VoidPtrAry,IntAry);
                    es=pHatch2->appendLoop(loopType,VoidPtrAry,IntAry);
                    if(Acad::eOk!=es)
                    {
                        acedAlert(_T("Acad::eInvalidInput"));
                        pHatch2->close();
                        pHatch->close();
                        pBlkTblRcd->close();
                        delete pBlkTblRcdItr;
                        delete patternName;
                        delete pDb;
                        return false;
                    }                   

                }//将每一条边界添加进自定义实体, //将得到的每条边界加入到填充对象中

            }//边界循环结束,得到填充对象的整边界

            es = pHatch2->evaluateHatch();      // 显示填充对象
            AcDbObjectId hatchId;               // 添加到模型空间
            hatchId = PostToModelSpace(pHatch2); 
            if (hatchId!=NULL)
            {
                acedAlert(_T("获取填充对象成功\n"));
            }           
            pEnt->close();
            pHatch->close();//关闭实体,
            //pHatch2->close();
            pBlkTblRcd->close();
//          delete patternName;
            delete pBlkTblRcdItr;
            delete pDb;
            return true;

        }//pHatch对象为空
        pEnt->close();          
        pHatch->close();
        delete patternName;
        delete pBlkTblRcdItr;
        delete pDb;

        return false;
    }//遍历dwg文件临时库结束

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ObjectARX中如何获取填充实体的边界 的相关文章

随机推荐

  • 【分享】5种方法将Excel设置为“只读”

    将Excel表格设置以 只读方式 打开 可以提醒或者防止表格被随意改动 今天小编来分享一下将Excel设置为 只读 的5种方法 方法一 通过 保护工作簿 设置 首先 打开Excel表格依次点击菜单选项卡 文件 信息 保护工作簿 始终以只读方
  • Thinkphp+vue中小学编程教育培训学习网页端软件设计与实现7r1ci

    要内容 研究方法和思路 总体安排和进度 包括阶段性工作内容及完成日期 1 主要内容 本课题主要注重少儿编程教育平台的设计与实现 主要分为以下三方面 1 前台功能需求 基础功能 课程功能 互动功能 2 后台功能需求 课程管理功能 机构管理功能
  • HarmonyOS:Neural Network Runtime 对接 AI 推理框架开发指导

    场景介绍 Neural Network Runtime 作为 AI 推理引擎和加速芯片的桥梁 为 AI 推理引擎提供精简的 Native 接口 满足推理引擎通过加速芯片执行端到端推理的需求 本文以图 1 展示的 Add 单算子模型为例 介绍
  • 西南科技大学数据库实验七(综合实验—选课系统综合查询)

    一 实验目的 存储过程与触发器 二 实验任务 一 创建数据库及表 提供数据库文件mytables sql 可以导入 可以拷贝 1 创建班级表class 2 创建学生表student 3 创建选课表choose 4 创建课程表course 5
  • thinkphp+mysql_vue汽车资讯新闻网站

    本汽车资讯网站有管理员和用户 管理员功能有个人中心 用户管理 汽车品牌管理 价格分类管理 经销商管理 汽车信息管理 留言板管理 系统管理等 用户可以查看各种汽车信息 还可以进行留言 因而具有一定的实用性 运行环境 phpstudy wamp
  • Elasticsearch——深入原理

    在正式介绍Elasticsearch的具体功能以前 将介绍Elasticsearch中比较重要的原理与机制 这有助于理解Elasticsearch的内部机制 以及从表面功能深入了解其背后的逻辑本质 主要内容如下 搜索引擎的基本原理和组成结构
  • Linux——apt-get工具

    apt get是Debian和Ubuntu等基于Debian的Linux发行版的包管理工具 用于自动从互联网软件仓库中搜索 下载 安装 升级 卸载软件或操作系统 以及自动处理依赖关系 使用apt get进行软件包安装的基本步骤 请注意 具体
  • Python3 集合

    在Python3中 集合 Set 是一种无序 不重复的数据集合 集合使用 或set 来创建 以下是一些常用的集合操作 创建集合 set1 1 2 3 使用 创建集合 set2 set 4 5 6 使用set 创建集合 http www js
  • 零售EDI:如何与EDEKA 建立EDI连接?

    艾德卡EDEKA 是德国最大的食品零售商 因其采用 指纹付款 的方式进行结算 成为德国超市付款方式改革的先驱 与EDEKA建立EDI连接 首先需要填写EDEKA提供的调查问卷 其中包括公司信息 EDI负责人信息 EDI供应商信息 销售部门信
  • 计算机网络基础——光模块(Optical Modules)基础知识介绍

    一 光模块的工作原理 光模块 Optical Modules 的工作原理是将电信号转换为光信号 或者将光信号转换为电信号 实现光纤通信中的光电转换和电光转换功能 具体来说 光模块主要由光电子器件 光发射器和光接收器 功能电路和光接口等部分组
  • linux下载yum和python

    在下载pkdg时 因为yum报错坏的解释器 然后误删了yum和python 在下载各种版本 创建各种软连接 修改yum文件都不好使后 发现了这样一个方法 Centos 完美解决python升级导致的yum报错问题 相信我这是一篇有用的文章
  • 计算机网络基础——常用的中英文网络述语大全,强烈建议收藏

    系统网络体系结构 System Network Architecture SNA 国际标准化组织 International Organization for Standardization ISO 开放系统互连基本参考模型 Open Sy
  • 数据库学习日常案例20231219-19C集群ORA-27301 ORA-27300分析处理

    1 问题概述 今日对数据库检查发现如下错误 Errors in file u01 app oracle diag rdbms orcldb orcldb1 incident incdir 4510778 orcldb1 m004 32243
  • 为什么上下文学习有用

    上下文学习与Prompt learning 类似 但是又不完全一样 预训练的大模型不需要进行微调 只需要根据提示 也就是上下文 in context 就能够完成特定的任务 这一点在ChatGPT中体现的尤为明显 当我们与大模型进行对话的时候
  • 黑豹程序员-统一身份认证接口

    术语和定义 1 IAM Identity Access Manager 统一身份认证系统 2 IDM Identity Manager 身份管理 3 SSO Single Sign On 单点登录 4 AD Active Directory
  • 商城免 费搭建之java鸿鹄云商 java电子商务商城 Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

    saas云平台 打造全行业全渠道全场景的saas产品 为经营场景提供一体化解决方案 门店经营区域化 网店经营一体化 本地化 全方位 一站式服务 为多门店提供统一运营解决方案 提供丰富多样的营销玩法覆盖所有经营场景 助力商家成功 系统稳定压倒
  • Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单

    鸿鹄工程项目管理系统 Spring Cloud Spring Boot Mybatis Vue ElementUI 前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展 企业人员和经营规模不断壮大 为了提高工程管理效率 减轻劳动强度
  • 讲解SurfaceTexture BufferQueue has been abandoned

    目录 讲解SurfaceTexture BufferQueue has been abandoned 背景知识 问题描述 问题原因和解决方法 1 检查相机状态 2 检查SurfaceTexture状态 3 处理图像数据源中断 4 销毁和重建
  • Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

    功能描述 1 门户管理 所有用户可在门户页面查看所有的公告信息及相关的通知信息 主要板块包含 招标公告 非招标公告 系统通知 政策法规 2 立项管理 企业用户可对需要采购的项目进行立项申请 并提交审批 查看所有的立项信息 主要功能包含 招标
  • ObjectARX中如何获取填充实体的边界

    原文链接 https blog csdn net itwalker1618 article details 54604486 遍历填充对象的边界信息 bool CAcUiSelDialog OpenDwgFile const ACHAR f