找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 775|回复: 4

[求助] 用arx如何实现将多重块变成普通块

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2016-9-24 07:33:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
网上共享的lisp程序可以实现:
(setq r_zm70 (assoc 70 e))
(setq c_zm71 (assoc 71 e))
(setq r_dist_zm44 (assoc 44 e))
(setq c_dist_zm45 (assoc 45 e))
(setq e (subst (cons 44 0) r_dist_zm44 e))
(setq e (subst (cons 45 0) c_dist_zm45 e))
(setq e (subst (cons 70 0) r_zm70 e))
(setq e (subst (cons 71 0) c_zm71 e))
(setq e (subst (list 100"AcDbBlockReference") (list 100"AcDbMInsertBlock") e))
我自己用arx编程,最好一句实现不了,代码如下,求大神指点:
AcDbMInsertBlock *pMBlk;
if(acdbOpenObject(pMBlk,idObj,AcDb::kForWrite) != Acad::eOk)
  return;
pMBlk->setRowSpacing(0.0);
pMBlk->setColumnSpacing(0.0);
pMBlk->setRows(0);
pMBlk->setColumns(0);
pMBlk->close();
最后一句我试着直接修改dxf组码,但失败了:
struct resbuf *entdata,*tmpreb;
entdata = ads_entget(ent);
if(entdata==NULL)
{
   return;
}
str = _T("AcDbBlockReference");
ACHAR appName[32];
memcpy(appName, str, 32);
for(tmpreb=entdata;tmpreb!=NULL;tmpreb=tmpreb->rbnext)
{
  str = tmpreb->resval.rstring;
  if(API_stricmp(str,_T("AcDbMInsertBlock")) == 0)
  {
   tmpreb->resval.rstring = (ACHAR*)malloc((API_strlen(appName)+1)*sizeof(ACHAR));
   API_strcpy(tmpreb->resval.rstring, appName);
    break;
  }
}
ads_entmod(entdata);
ads_relrb(entdata);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-9-24 11:31:25 | 显示全部楼层
看 AcDbMInsertBlock 帮助文件,它派生于AcDbBlockReference 。



  1. AcDbMInsertBlock Class The AcDbMInsertBlock class represents a special form of the INSERT entity in which an array of duplicate images of the entities within the referenced AcDbBlockTableRecord is displayed.

  2. Creating an AcDbMInsertBlock with a definition of rows = 1 and columns = 1 will create a AcDbBlockReference instead.

  3. Warning Do not derive from this class. Attempting to do so will cause your application to halt AutoCAD.

  4. Inherits From
  5. AcDbBlockReference
复制代码


说的很清楚了,Creating an AcDbMInsertBlock with a definition of rows = 1 and columns = 1 will create a AcDbBlockReference instead.

你打开AcDbMInsertBlock 写,把rows和columns设置成1就行了。

示例:
AcDbMInsertBlock *pMInsert ;
...............
pMInsert->setRows(1);
pMInsert->setColumns(1);
pMinsert->close();
.......
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2016-9-24 11:54:45 来自手机 | 显示全部楼层
重新构造多个AcDbBlockReference
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2016-9-24 12:18:09 | 显示全部楼层
pMInsert->setRows(1);
pMInsert->setColumns(1);这个方法试过,不行啊,还是多重块,请问ilisp,怎么重新构造多个AcDbBlockReference?我是菜鸟,望赐教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-9-24 12:42:29 | 显示全部楼层

哦,理解有误,你是想原位“炸开”多重块,变成NXM个单独的INSERT?

如果这样,你可以得到多重块的AcDbBlockRecord块定义,根据多重MINSERT的变换矩阵创建一个单独的INSERT,然后根据多重MINSERT的行数、列数、行间距、列间距,transformedCopy下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-26 07:29 , Processed in 0.213691 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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