找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1277|回复: 14

匿名块问题

[复制链接]
发表于 2002-10-23 20:48:52 | 显示全部楼层 |阅读模式

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

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

×
我想创建一个匿名块,前面都没为题,到最后调试发现status=5003,即status!=RTKWORD,不知什么原因?



status=acdbEntMake(entlist);
acutRelRb(entlist);
if(status!=RTKWORD)
{acdbFail("建立ENDBLK块失败!");
return ;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2002-10-23 20:50:59 | 显示全部楼层
前面代码我也贴出来
entlist=acutBuildList(RTDXF0,"ENDBLK",0);
if(entlist==NULL)
{acdbFail("建立链表失败!");
return ;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-23 20:52:28 | 显示全部楼层

Re: 匿名块问题

最初由 xulpec 发布
[B]我想创建一个匿名块,前面都没为题,到最后调试发现status=5003,即status!=RTKWORD,不知什么原因?



status=acdbEntMake(entlist);
acutRelRb(entlist);
if(status!=RTKWORD)
{acdbFail("建立ENDBLK?.. [/B]


这个状态码是输入了关键字后返回的,建立块正常不用返回RTKWORD啊,你把完整的代码贴论坛吧,大家看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-23 20:55:45 | 显示全部楼层
entlist=acutBuildList(RTDXF0,"BLOCK",2,"*ANON",10,"1",0);
if(entlist==NULL)
{acdbFail("建立链表失败!");
return ;
}
status=acdbEntMake(entlist);
acutRelRb(entlist);
if(status!=RTNORM)
{acdbFail("建立块失败!");
return ;
}
entlist = acutBuildList(RTDXF0, "LINE",10, pt2,10, pt3,0);
if (entlist == NULL) {
    acdbFail("Unable to create result buffer list\n");
    return ;
}
status = acdbEntMake(entlist);
acutRelRb(entlist); // Release acdbEntMake buffer.

if (status == RTERROR) {

    acdbFail("Unable to make circle entity\n");
    return ;

}
entlist=acutBuildList(RTDXF0,"ENDBLK",0);
if(entlist==NULL)
{acdbFail("建立链表失败!");
return ;
}
status=acdbEntMake(entlist);
acutRelRb(entlist);
if(status!=RTKWORD)
{acdbFail("建立ENDBLK块失败!");
return ;
}
status=acedGetInput(newblkname);
if(status!=RTNORM)
{acdbFail("不能得到匿名块名称!");
return ;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-23 20:59:47 | 显示全部楼层
我想画一根线加入块.我在书上看到是RTKWORD,我现在都高糊涂了,acdbEntMake一会儿返回RTNORM,一会儿返回RTKWORD
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-23 21:11:20 | 显示全部楼层
最初由 xulpec 发布
[B]我想画一根线加入块.我在书上看到是RTKWORD,我现在都高糊涂了,acdbEntMake一会儿返回RTNORM,一会儿返回RTKWORD [/B]


下面给你贴个完整的把单个实体或者一个选择集制作块和匿名块的方法,如果块名参数是*,表示制作匿名块。
下面使用了ARX对象数据库的方法,既然用ARX,大家还是尽量少用ADSRX的全局函数。


  1. [FONT=courier new]
  2. int makeAnonymousBlock()
  3. {
  4.         resbuf *rb=ads_getargs();
  5.         AcDbObjectIdArray ids;
  6.         if (!rb)
  7.                 return RTNORM;

  8.         char * szBlkName="*U";
  9.         if (rb->restype==RTSTR)
  10.         {
  11.                 if (*rb->resval.rstring=='*')
  12.                         return RTNORM;
  13.                 szBlkName=rb->resval.rstring;
  14.                 rb=rb->rbnext;
  15.                 if (!rb)
  16.                         return RTNORM;
  17.                 if (rb->restype!=RTPICKS)
  18.                         return RTNORM;
  19.                 XdDbUtils::getIdArrayFromPickSet(rb->resval.rlname,ids);
  20.                 if (ids.isEmpty())
  21.                         return RTNORM;
  22.         }
  23.         else if (rb->restype==RTPICKS)
  24.         {
  25.                 XdDbUtils::getIdArrayFromPickSet(rb->resval.rlname,ids);
  26.                 if (ids.isEmpty())
  27.                         return RTNORM;
  28.         }
  29.         else
  30.                 return RTNORM;
  31.        
  32.         rb=rb->rbnext;

  33.         if (!rb)
  34.                 return RTNORM;

  35.         AcGePoint2d basePt1;
  36.         AcGePoint3d basePt;
  37.         if (rb->restype==RTPOINT)
  38.         {
  39.                 basePt1=asPnt2d(rb->resval.rpoint);
  40.                 basePt.set(basePt1.x,basePt1.y,0.0);
  41.         }
  42.         else if (rb->restype==RT3DPOINT)
  43.         {
  44.                 basePt=asPnt3d(rb->resval.rpoint);
  45.         }
  46.         else
  47.                 return RTNORM;
  48.         rb=rb->rbnext;
  49.         BOOL b_delObj=FALSE;
  50.         if (rb)
  51.         {
  52.                 if (rb->restype==RTT)
  53.                         b_delObj=TRUE;
  54.                 else
  55.                         return RTNORM;
  56.         }
  57.        
  58.         AcDbBlockTableRecord *pBlockTableRec;
  59.         // Get the block table.
  60.         //
  61.         AcDbBlockTable *pBlockTable = NULL;
  62.         acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
  63.        
  64.         // Add the new block table record to the block table.
  65.         //
  66.         AcDbObjectId blockTableRecordId;
  67.         if (pBlockTable->getAt(szBlkName,pBlockTableRec,AcDb::kForRead)==Acad::eOk)
  68.         {
  69.                 pBlockTable->close();
  70.                 AcDbBlockTableRecordIterator *pIter;
  71.                 pBlockTableRec->newIterator(pIter);
  72.                 for (;!pIter->done();pIter->step())
  73.                 {
  74.                         AcDbEntity *pEnt;
  75.                         if (Acad::eOk!=pIter->getEntity(pEnt,AcDb::kForWrite))
  76.                                 continue;
  77.                         pEnt->erase();
  78.                         pEnt->close();
  79.                 }
  80.                 delete pIter;
  81.                 pBlockTableRec->upgradeOpen();
  82.                 pBlockTableRec->setName(szBlkName);
  83.                 pBlockTableRec->setOrigin(basePt);
  84.         }
  85.         else
  86.         {
  87.                 pBlockTableRec= new AcDbBlockTableRecord();
  88.                 pBlockTableRec->setName(szBlkName);
  89.                 pBlockTableRec->setOrigin(basePt);
  90.                 pBlockTable->upgradeOpen();
  91.                 pBlockTable->add(blockTableRecordId, pBlockTableRec);
  92.                 pBlockTable->close();
  93.         }

  94.         pBlockTableRec->getName(szBlkName);
  95.         AcDbEntity *pEnt;
  96.         AcDbObjectId objId;
  97.         AcDbEntity *pClone;
  98.         for (int i=0;i<ids.length();i++)
  99.         {
  100.                 if (Acad::eOk==acdbOpenObject(pEnt,ids[i],AcDb::kForRead))
  101.                 {
  102.                         pClone=AcDbEntity::cast(pEnt->clone());
  103.                         if (pClone)
  104.                         {
  105.                                 pBlockTableRec->appendAcDbEntity(objId, pClone);
  106.                                 pClone->close();
  107.                         }
  108.                         pEnt->close();
  109.                 }
  110.         }
  111.         AcDbObjectId blkId=pBlockTableRec->objectId();
  112.         pBlockTableRec->close();
  113.         if (b_delObj)
  114.         {
  115.                 deleteArray(&ids);
  116.                 AcDbBlockReference *pBlk=new AcDbBlockReference;
  117.                 pBlk->setBlockTableRecord(blkId);
  118.                 pBlk->setPosition(basePt);
  119.                 XdDbUtils::addToModelSpaceAndClose(pBlk);
  120.         }
  121.         XdDbUtils::flushBlockDisplay(blkId);
  122.         ads_retstr(szBlkName);
  123.         return RTNORM;
  124. }[/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-23 21:16:39 | 显示全部楼层
XDSoft能否把我上面程序里的错误找出来。出来生成line那几行,其余我是抄书上的呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-23 21:23:59 | 显示全部楼层
最初由 xulpec 发布
[B]XDSoft能否把我上面程序里的错误找出来。出来生成line那几行,其余我是抄书上的呀 [/B]


制作LINE的ARX代码:

AcDbLine *pL=new AcDbLine;
pL->setStartPoint(sPt); // sPt,ePt是起点和终点
pL->setEndPoint(ePt);
PostToMs(pL);  //添加到数据库模型空间



  1. [FONT=courier new]
  2. void PostToMs(AcDbEntity *pEnt)
  3. {
  4. AcDbBlockTable *pTable;
  5. AcDbBlockTableRecord *pRecord; acdbCurDwg()->getBlockTable(pTable, AcDb::kForRead);
  6. pTable->getAt(ACDB_MODEL_SPACE, pRecord, AcDb::kForWrite);
  7. pTable->close();
  8. pRecord->appendAcDbEntity(pEnt);
  9. pRecord->close();
  10. pEnt->close();
  11. }[/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-23 21:27:18 | 显示全部楼层
entlist = acutBuildList(RTDXF0, "LINE",10, pt2,10, pt3,0)难道不自动生成一条直线吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-23 21:30:58 | 显示全部楼层
最初由 xulpec 发布
[B]entlist = acutBuildList(RTDXF0, "LINE",10, pt2,10, pt3,0)难道不自动生成一条直线吗? [/B]


你这行代码,组码后面的应该是11,而不应该是10,现在这样生成的是起点和终点相同的,ACAD不允许。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-23 21:41:48 | 显示全部楼层
你意思是改为entlist = acutBuildList(RTDXF0, "LINE",11, pt2,11, pt3,0)?还是不行,屏幕上也没有出现直线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-23 21:44:36 | 显示全部楼层
最初由 xulpec 发布
[B]你意思是改为entlist = acutBuildList(RTDXF0, "LINE",11, pt2,11, pt3,0)?还是不行,屏幕上也没有出现直线 [/B]


起点组码是10,终点组码是11,你怎么这次都改成11了啊:)

上个帖子说后面的10改11。

entlist = acutBuildList(RTDXF0, "LINE",10, pt2,11, pt3,0);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-23 21:46:48 | 显示全部楼层
组码在那儿查呀,我一直没弄明白
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-23 21:53:33 | 显示全部楼层
组码我查着了,可是acdbEntMake究竟应该返回什么值呀?
entlist=acutBuildList(RTDXF0,"ENDBLK",0);
if(entlist==NULL)
{acdbFail("建立链表失败!");
return ;
}
status=acdbEntMake(entlist);
acutRelRb(entlist);
if(status!=RTKWORD)
{acdbFail("建立ENDBLK块失败!");
return ;
}
我调试发现status=RTREJ是非怎么回事?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-23 21:53:37 | 显示全部楼层
最初由 xulpec 发布
[B]组码在那儿查呀,我一直没弄明白 [/B]


ACAD联机帮助-LISP,VLISP,DXF 字项,DXF 里面就是介绍组码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 04:20 , Processed in 0.293440 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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