找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1060|回复: 5

[求助]:一个问题刚刚解决有一个出现......

[复制链接]
发表于 2002-6-19 09:30:13 | 显示全部楼层 |阅读模式

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

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

×
对于块插入,在大家的指点下.通宵调试..发现如果在autocad中先建一个块
在运行arx程序.就可以找到定义的块,,但是现在我想的是要将图形文件当作
块插入...那个定义的块不知保存在哪里的,,关掉autocad在打开就找不到
    please help me
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-19 09:46:11 | 显示全部楼层

Re: [求助]:一个问题刚刚解决有一个出现......

最初由 sand 发布
[B]对于块插入,在大家的指点下.通宵调试..发现如果在autocad中先建一个块
在运行arx程序.就可以找到定义的块,,但是现在我想的是要将图形文件当作
块插入...那个定义的块不知保存在哪里的,,关掉autocad在打开就找不到
... [/B]


ACAD中的INSERT实体是对块定义BLOCK的引用,所以要求BLOCK定义必须存在,如果你要在多个图形中用到这个块定义,那么你必须把这个BLOCK定义存成外部块,即通过WBLOCK命令把BLOCK写盘保存。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-6-19 12:44:04 | 显示全部楼层
现在我遇到的问题是.我已经用wblock定义了块保存在磁盘上,但是..
调用的时候老是说Block definition G:\c++\Code\Chapter 7\Ch7_1\1.dwg not found,可是我直接在autocad中用insert命令可以插入该块啊

以下是代码看看,错在哪里:

void insertBlock(char blkName[50], AcGePoint3d insPt,double k)
{
        double ang,sx,sy,sz;
        AcDbDatabase *pCurDb;
        AcDbBlockTable *pBlkTable;
        AcDbBlockTableRecord *pBlkTableRecord;
        AcDbBlockReference *pInsrtObj=new AcDbBlockReference;
        AcDbObjectId blkId;

        ang=0.0;
        sx=k;sy=k;sz=1;
        AcGeScale3d xyzscale(sx,sy,sz);
        pCurDb = acdbHostApplicationServices()->workingDatabase();
        // Check to see if the block table
        // has blkName
        pCurDb->getBlockTable(pBlkTable, AcDb::kForRead);
        if(!pBlkTable->has(blkName))
        {
                acutPrintf("\nBlock definition %s not found. ", blkName);
                pBlkTable->close();
                return;
        }

        pBlkTable->getAt(blkName, blkId);
        pBlkTable->getAt(ACDB_MODEL_SPACE,pBlkTableRecord,                 AcDb::kForWrite);
        pBlkTable->close();
       
        acedInitGet(RSG_NONULL, NULL);

        pInsrtObj->setBlockTableRecord(blkId);
        pInsrtObj->setPosition(insPt);
        pInsrtObj->setRotation(ang);
        pInsrtObj->setScaleFactors(xyzscale);

        pBlkTableRecord->appendAcDbEntity(blkId, pInsrtObj);

        pBlkTableRecord->close();
        pInsrtObj->close();


}

然后调用
        AcGePoint3d pti(100,100,0);
       
        insertBlock("G:\\c++\\Code\\Chapter 7\\Ch7_1\\1.dwg",pti,SK);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-6-19 16:14:38 | 显示全部楼层
最初由 sand 发布
[B]现在我遇到的问题是.我已经用wblock定义了块保存在磁盘上,但是..
调用的时候老是说Block definition G:\c++\Code\Chapter 7\Ch7_1\1.dwg not found,可是我直接在autocad中用insert命令可以插入该块啊

以下是代?.. [/B]


XDSoft说得对:“ACAD中的INSERT实体是对块定义BLOCK的引用,所以要求BLOCK定义必须存在”
Acad的Insert命令(插入一个新的外部块时)会做两件事:
1.建立Block的定义
2.建立Block的引用

你的代码只实现了第二步,所以会有“Block definition G:\c++\Code\Chapter 7\Ch7_1\1.dwg not found”的提示。

AcDbDatabase::insert(AcDbObjectId& blockId,const char* pBlockName,AcDbDatabase* pDb,bool preserveSourceDatabase = true)  可以建立对外部块的定义
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-6-19 18:22:58 | 显示全部楼层
你说的对.但是现在的问题是我不知道怎么对外部的块进行定义,没有资料参考了...在autocad中用wblock不可以实现吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2002-6-24 08:10:43 | 显示全部楼层
AcDbObjectId insBK(char *file,char *kname)//含路径的文件名和插入后块名
{
AcDbObjectId id;
AcDbBlockTable *pTb;
acdbCurDwg()->getBlockTable(pTb,AcDb::kForRead);
if(pTb->getAt(kname,id)==Acad::eOk){
pTb->close();
//ads_printf("\n%s 已存在",kname);
return id;
}
pTb->close();
AcDbDatabase *pDb=new AcDbDatabase(Adesk::kFalse);
if(pDb->readDwgFile(file)!=Acad::eOk){
delete pDb;
return NULL;
}
acdbCurDwg()->insert(id,kname,pDb);
delete pDb;
return id;
}

void insBK0(AcDbObjectId id,ads_point p0,double s)
{
double a;
a=p0[Z]*3.141592654/180;
p0[Z]=0;
if(id!=NULL){
AcDbBlockReference *pbr=new AcDbBlockReference(AcGePoint3d(p0[X],p0[Y],0.0),id);
pbr->setRotation(a);
AcDbBlockTable *pBlockTable;
acdbCurDwg()->getBlockTable(pBlockTable,AcDb::kForWrite);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
pBlockTable->close();
AcGeScale3d sc(s,s,1);
pbr->setScaleFactors(sc);
pBlockTableRecord->appendAcDbEntity(pbr);
pbr->close();
pBlockTableRecord->close();
}
}
注:insBK返回图块ID,若图块不存在,插入文件并返回ID
insBK0将ID图块插入图形,相当于插入图块命令。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 23:48 , Processed in 0.320591 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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