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中如何获取填充实体的边界 的相关文章

  • 如何使用 VS2022 中的新控制台应用程序模板访问命令行参数

    我想知道如何访问命令行参数 因为这是在Program cs通过 Visual Studio 2022 中控制台应用程序的新模板创建文件 See https aka ms new console template for more infor
  • ASP.NET 会员电子邮件验证

    尝试基于 C 创建电子邮件验证本文 https web archive org web 20211020153319 https www 4guysfromrolla com articles 062508 1 aspx 我创建了一个 ja
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • DataContractJsonSerializer 包含元素类型子类型的通用列表

    我要使用DataContractJsonSerializer用于 JSON 序列化 反序列化 我在 JSON 数组中有两种对象类型 并希望将它们都反序列化为相应的对象类型 具有以下类定义 DataContract public class
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用
  • 应用非限定名称查找而不是依赖于参数的名称查找

    考虑标准 sec 3 4 1 3 中的一个示例 typedef int f namespace N struct A friend void f A operator int void g A a int i f a f is the ty
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • 【分享】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