ObjectArx创建指定块

ObjectArx创建自定义块

一. 目的
      仿照AutoCad的Block命令,实现简版创建块功能!

二.  开发环境
Win7操作系统,AutoCad2012, VS2008, ObjectArx_SDK_2012

三. 相关函数简介
1int acedSSGet (const ACHAR *str, const void *pt1,const void *pt2, const struct resbuf *filter,ads_name ss);  

选择集,个人理解:就是让你一次可以选择多个实体,与之相似的acedEntSel()一次只能选择一个实体

2) int acedSSName (const ads_name ss, AdInt32 i, ads_name entres)

既然选择了多个实体,我怎么得到其中的每一个实体呢?次函数即可让你得到选择实体中的任一个,参数二相当于索引,参数三就是还回的实体名

3)Acad::ErrorStatus acdbGetObjectId(AcDbObjectId& objId,const ads_name objName);

通过实体名获取实体ID,与之相同的另外几个函数(指针,句柄,ads_name之间的转换)
acdbopenAcDbEntity,objectid,getAcDbObject,acdbGetObjectid,acdbGetAdsName等

四.代码实现流程
1) 首先我们得获取实体,保存这些实体的ID,实现代码:

void MyBlock::GetPickEntity(AcDbObjectIdArray &idObjectArray)
{
 ads_name adsName;
 AdInt32 ssLen;
 acedSSGet(NULL, NULL, NULL, NULL, adsName);
 acedSSLength(adsName, &ssLen);
 idObjectArray.removeAll();
 for (INT32 i = 0; i < ssLen; i++)
 {
  ads_name entityName;
  acedSSName(adsName, i, entityName);
  AcDbObjectId entityID;
  acdbGetObjectId(entityID, entityName);
  idObjectArray.append(entityID); 
 }
 acedSSFree(adsName);
}

2) 从当前块表中查看是否已存在此块名记录,没有则创建新的块表记录,将选择的实体Clone一份,插入到新的
块表记录中,切记,关闭所有的数据库对象,实现代码(代码有点渣):
Acad::ErrorStatus MyBlock::CreateBlock(const CString &strBlockName, const AcDbObjectIdArray &idObjectArray)
{
 AcDbBlockTable *pBlockTable = NULL;
 Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
 if (Acad::eOk != es)
 {
  return es;
 }
 if (Adesk::kTrue == pBlockTable->has(strBlockName))
 {
  pBlockTable->close();
  return es;
 }
 AcDbBlockTableRecord *pBlockTableRcd = new AcDbBlockTableRecord();
 es = pBlockTableRcd->setName(strBlockName);
 es = pBlockTableRcd->setOrigin(AcGePoint3d::kOrigin);
 es = pBlockTable->upgradeOpen();
 if (Acad::eOk != es)
 {
  pBlockTableRcd->close();
  pBlockTable->close();
  return es;
 }
 es = pBlockTable->add(pBlockTableRcd);
 if (Acad::eOk != es)
 { 
  pBlockTable->close();
  pBlockTableRcd->close();
  return es;
 }
 pBlockTable->close();
 AcGeMatrix3d mat;
 mat.setToIdentity();
 for (INT32 i = 0; i < idObjectArray.length(); i++)
 {
  AcDbEntity *pEntity = NULL;
  es = acdbOpenAcDbEntity(pEntity, idObjectArray.at(i), AcDb::kForRead);
  if (Acad::eOk != es)
  {
   acDocManager->unlockDocument(curDoc());
   pBlockTableRcd->close();
   return es;
  }

  AcDbEntity *pNewEntity = AcDbEntity::cast(pEntity->clone());
  es = pBlockTableRcd->appendAcDbEntity(pNewEntity);
  if (Acad::eOk != es)
  {
   acDocManager->unlockDocument(curDoc());
   pBlockTableRcd->close();
   pEntity->close();
   pNewEntity->close();
   return es;
  }
  pEntity->close();
  pNewEntity->close();
 }
 pBlockTableRcd->close();
 return es;
}
三).创建非模式对话框,继承自CAcUiDialog类!
具体添加一些控件与消息响应以及还未完成的非模式对话框销毁(DestoryWindow)就不一一叙述了!

五. 成果截图
1)执行自定义命令,点击拾取,我这里选择3条边与一个圆,总共4个对象,joke为新块名,然后点击创建

2)在命令提示符输入指令insert,即可预览刚才创建的新块

3)点击确定,即可在Cad工作区添加此块,然后可点击颜色,如下:

4)这里我先则蓝色,即可改变刚才插入新块的颜色:

六. 源码
源码地址:http://download.csdn.net/detail/u012158162/9795717

七 后序:
A. 由于个人技术原因以及刚接触Cad与ObjectArx几天,其中难免有些胡说八道,请见谅!
B. 程序中修改块的颜色存在Bug,以及没对MFC的对话框销毁做处理!
C. 祝大家学习是艰辛的,生活是快乐的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:Dockerfile 中执行 tar 命令始终报错:tar: /xx/xx: Cannot stat: No such file or directory tar: Exiting with

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. docker 执行 build &#xff0c; dockerfile 中有一行命令&#xff1a; RUN tar -zcvP -f clientOne.tar /root/jiangyu/projects/…

ObjectArx创建自定义实体

ObjectArx创建自定义实体 一。目的在ObjectArx中已经有了许多实体&#xff0c;如AcDbLine,AcDbCircle,AcDbArc等&#xff0c;但在用户使用Cad时&#xff0c;会有一些对他们来讲常用的“实体“&#xff0c;如一扇门&#xff0c;如果我们能提供一个“门实体“&#xff0c;让用户能…

开车人千金难买的知识!(组图)

开车的人千金难买的知识: 前言&#xff1a; 一、 发动机是怎样被您自己开坏的 二、 变速箱是怎样被您自己开坏的 三、 排水口&#xff08;很重要您肯定不知道的&#xff09; 四、 离合 五、 水箱 六、 方向助力 七、 空调 八、底盘 九、爱车是如何被自己撞坏的&#x…

如何在 IDEA 启动多个 Spring Boot 工程实例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一个工程启动多个实例&#xff0c;分别占用不同的端口。 step 1 在IDEA上点击Application右边的下三角 ,弹出选项后&#xff0c;点击Ed…

重启 docker 服务、Docker 重启

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我的情况 &#xff1a;重启阿里云 ECS 服务器后&#xff0c;一切服务都停止了。 重启 XXX 服务通用命令&#xff1a;service xxx re…

linux 查看 CPU 使用率

1&#xff1a;top 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 top -bn 1 -i -c top命令可以看到总体的系统运行状态和cpu使用效率 %us: 表示用户空间程序的cpu使用效率 %sy:表示…

解决: service endpoint with name xxx already exists ( docker 已删除的容器却依旧存在)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 启动服务报错如题 确认 我已经 docker rm -f XXX 了。也确认 各个容器端口并不重复。 重新启动容器服务依旧报错&#xff1a; 粗…

解决:There was an unexpected error (type=Internal Server Error,..). No instances available for XXX

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.我的情况&#xff1a; 实践 springCloud , 启动了注册中心 eureka、也启动了 服务生产者、服务消费者。 eureka 端口&#xff1a; 1…

springCloud - 第3篇 - 消费者调用服务 ( RestTemplate + Ribbon )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、新建 ribbon 工程&#xff1a; 1. file - new - module 2. spring Initializr - module SDK 选择自己的 JDK &#xff0c;其余的可…

延长汽车使用寿命,抛弃六大用车坏习惯

汽车使用越来越普及&#xff0c;因为用车习惯问题导致汽车寿命减短&#xff0c;因错误用车习惯导致伤车、损车的例子比比皆是。而用车习惯得当与否&#xff0c;直接关系到汽车的使用寿命。例如发动机&#xff0c;如果保养得当&#xff0c;开50万~60万公里都没问题。汽车使用越来…

解决:Whitelabel Error Page This application has no explicit mapping for /error...UnknownHostException

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我的情况 &#xff1a; springcloud 实践&#xff0c;启动 ribbon 工程后&#xff0c;请求接口报错&#xff1a; Whitelabel Error…

springCloud - 第4篇 - 消费者调用服务 ( Feign )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、新建 ribbon 工程&#xff1a; 1. file - new - module 2. spring Initializr - module SDK 选择自己的 JDK &#xff0c;其余的可…

使用 idea 创建第一个 springboot 项目

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如今springboot越来越火&#xff0c;越来越多的公司选择使用springboot作为项目的开发框架&#xff0c;其设计目的就是用来简化spring项…

坚持步行的惊人效果,网上被疯狂转载!

俗话说&#xff0c;人老腿先老。由于人体2/3的肌肉集中在下半身&#xff0c;所以六十多岁的人可以有年轻人七成的握力和臂力&#xff0c;但下半身力量却只剩下四成。不过&#xff0c;大家也不必担心。最近&#xff0c;包括以色列、美国在内的科学家们发现&#xff0c;温和地健步…

springCloud - 第5篇 - 断路器 Hystrix ( Feign 、Ribbon )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、为什么要有熔断 在微服务架构中&#xff0c;根据业务来拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff08;RP…

springCloud - 第6篇 - 网关的实现:ZUUL

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在Spring Cloud 微服务系统中&#xff0c;一种常见的负载均衡方式是&#xff0c;客户端的请求首先经过负载均衡&#xff08;zuul、Ngnix…

亚特兰大峰会精彩看点:软件吞噬世界,OpenStack是变革核心

摘要&#xff1a;5月12日早9点&#xff0c;OpenStack Atlanta峰会在超过90家赞助厂商和4500名参会者的陪伴下拉开了序幕。Jonathan Bryce特别提出了Superuser和Marketplace两个新概念&#xff0c;软件正在吞噬整个世界&#xff0c;OpenStack是这场变革的核心。 第一天精彩看点…

解决: Gitee 自已提交的代码提交人头像为他人、码云上独自开发的项目显示为 2 个开发者

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我的情况 &#xff1a; 项目一直只有我一个开发者&#xff0c;却莫名的出来了一个完全不认识的开发者&#xff0c;我新建后 push 的…

为什么有些语言会比别的快?

摘要&#xff1a;为什么有些语言比别的快&#xff1a;JIT与字节码的使用&#xff0c;带来了Java和C#这样介于前两者之间的中间选择&#xff1b;编译型语言比解释型快&#xff0c;引入的间接层越多&#xff0c;速度越慢&#xff1b;语言设施上的投入力度&#xff1b;语言本身的设…

解决:idea - maven project 中 jar 报红线

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 如图&#xff1a; 2. 找到报红线的工程&#xff0c;执行 mvn clean后&#xff0c;再 mvn install 。这样会从私服重新拉取 jar 。 …