- UID
- 8619
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-8-8
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
希望实现这样一个功能,在一个非模式对话框中,点击一个按钮,用户回到CAD界面点选一条线段,然后程序自动在该线段上每隔一段距离插入一个已有的图块(该图块为文件fileName中的一个名为blockname的块),并返回这些图块的Id。我插入块的程序部分如下:
Adesk::Boolean AddBlockToDwg1(const char* fileName, const char* blockname,
const char* SLayerName, AcGePoint3d basePoint,
double rAngle, double Scalex,double Scaley,
AcDbObjectId &ChairId, const int shmode = _SH_DENYWR)
{
ads_printf("进入函数 AddBlockToDwg\n");
AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
pDb->readDwgFile(fileName,shmode);
AcDbObjectId blockId;
AcDbBlockTable *pBlkTbl;
pDb->getSymbolTable(pBlkTbl, AcDb::kForRead);
pBlkTbl->getAt(blockname,blockId ,false);
pBlkTbl->close();
AcDbDatabase * pOutputDb = new AcDbDatabase(Adesk::kTrue);
pDb->wblock(pOutputDb, blockId);
delete pDb;
AcDbObjectId inblockId;
Acad::ErrorStatus retSta;
AcDbDatabase *pCurDb=acdbHostApplicationServices()->workingDatabase();
retSta=pCurDb->insert(inblockId, blockname, pOutputDb,true);
delete pOutputDb;
int acedCommandRt;
CString strCommand,tmpstr1;
strCommand="(command \"-INSERT\" ";
tmpstr1.Format("\"%s\" ",blockname);
strCommand=strCommand+tmpstr1;
tmpstr1.Format("\"%f,%f,%f\" ",basePoint.x,basePoint.y,basePoint.z);
strCommand+=tmpstr1;
tmpstr1.Format("\"%f\" \"%f\" \"%f\" )",Scalex,Scaley,rAngle);
strCommand+=tmpstr1;
AfxMessageBox(strCommand);
ads_printf("%s",strCommand);
acedCommandRt=acDocManager->sendStringToExecute(curDoc(),strCommand);
ads_name adsblkname;
if(acdbEntLast(adsblkname)==RTNORM)
{
ads_printf("插入块正确\n");
acdbGetObjectId( ChairId, adsblkname );
}
ads_printf("退出函数 AddBlockToDwg1\n");
return Adesk::kTrue;
}
其中变量ChairId返回新插入块的Id,现在的问题是我发现sendStringToExecute()函数不是立刻执行,这样我想通过acdbEntLast()函数得到新插入块Id的方法无法实现,而且当插入块个数较多时,sendStringToExecute()函数会出错,帮助上所命令长度被限制在296个字节,大家有什么好的方法吗,能不能给个实例呀。 |
|