- 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个字节,大家有什么好的方法吗,能不能给个实例呀。 |   
 
 
 
 |