![]() |
【转帖】再次请教!
再次请教!
再次请教! 再次请教各位大虾:程序代码如下,完全是参考的例子上的: dwgpath="d:\\drawing1.dwg"; acdocmanager->lockdocument(curdoc(),acap::kwrite,null,null,true); acdbdatabase *pnewdb =new acdbdatabase(adesk::kfalse); acad::errorstatus es=pnewdb->readdwgfile(dwgpath , _sh_denyno); if (es!=acad::eok) { acutprintf("\nthe file %s cannot be opend",dwgpath); return; } acdbdatabase *pdb; pdb =acdbhostapplicationservices ()->workingdatabase (); cstring pblockname=blockdwg; acdbobjectid blockid; //出问题的地方 if((es=pdb->insert(blockid, pblockname,pnewdb, true))==acad::eok) { acutprintf("\ninsert ok\n"); } else { afxmessagebox("insert failed"); delete pnewdb; return; } const acgepoint3d& pt=acgepoint3d(0,0,0); double angle=0; double xrefscale=0; acdbblockreference *pblkref = new acdbblockreference; pblkref->setblocktablerecord(blockid); pblkref->setposition(pt); pblkref->setrotation(angle); pblkref->setscalefactors( xrefscale); acdbblocktable *pblocktable; pdb->getsymboltable(pblocktable, acdb::kforread); acdbblocktablerecord *pblocktablerecord; pblocktable->getat(acdb_model_space, pblocktablerecord, acdb::kforwrite); pblocktable->close(); acdbobjectid newentid; //出问题的地方 pblocktablerecord->appendacdbentity(newentid, pblkref); pblocktablerecord->close(); acdbblocktablerecord *pblockdef; acdbopenobject(pblockdef, blockid, acdb::kforread); acdbblocktablerecorditerator *piterator; pblockdef->newiterator(piterator); acgepoint3d basepoint; acdbentity *pent; acdbattributedefinition *pattdef; for (piterator->start(); !piterator->done(); piterator->step())//将source.dwg中所有的attibute进行遍历 { piterator->getentity(pent, acdb::kforread); pattdef = acdbattributedefinition::cast(pent); if (pattdef != null && !pattdef->isconstant()) { acdbattribute *patt = new acdbattribute(); patt->setpropertiesfrom(pattdef); patt->setinvisible(pattdef->isinvisible()); basepoint = pattdef->position(); basepoint += pblkref->position().asvector(); patt->setposition(basepoint); patt->setheight(pattdef->height()); patt->setrotation(pattdef->rotation()); patt->settag("tag"); patt->setfieldlength(25); char *pstr = pattdef->tag(); patt->settag(pstr); acutdelstring(pstr); patt->setfieldlength(pattdef->fieldlength()); patt->settextstring("-"); acdbobjectid attid; pblkref->appendattribute(attid, patt); patt->close(); } pent->close(); // use pent... pattdef might be null } delete piterator; acdocmanager->unlockdocument(curdoc()); 程序编译无误,也将dwg文件的块插到当前稳当的数据库中了,但是不知为什么,视图上并没有显示,查找当前的数据库,发现块名在里面,就是没有图形,请教各位! 另外在acdbobjectid blockid;这句话时,调试时出现了find symbols对话框,要求查找acdbhdr.pdb文件,cancel掉以后程序能继续执行,真是奇怪,是vc的毛病么,请教! 我的程序是在非模对话框的单击事件里调用的,不知是不是有影响,谢谢各位! acad::errorstatus insert(acdbobjectid& blockid, const char* pblockname, acdbdatabase* pdb, bool preservesourcedatabase = true); 首先,此函数在数据库中创建一个新的块表记录。 这个新块表记录的名称由pblockname指向的名称给定,且blockid参数储存它的对象id。 然后,pdb指向的数据库中所有模型空间实体被复制至新的块表记录中。 调用者应确保源数据库立即被删除或在目标数据库被删除之前被删除。(是否是这个原因呢??) 谢谢二楼大虾,不过我按照你说的改了其中的: if((es=pdb->insert(blockid, pblockname,pnewdb, true))==acad::eok) { acutprintf("\ninsert ok\n"); delete pnewdb; } else { afxmessagebox("insert failed"); delete pnewdb; return; } 删除了pnewdb数据库,但是问题依旧啊。。。。。。 是不是因为加了这句:acdocmanager->lockdocument(curdoc(),acap::kwrite,null,null,true);锁定了文档,使图块写不尽去了呢,但是不加这句 程序就出错误,而且将解锁语句acdocmanager->unlockdocument(curdoc()); 提前也会出错,头疼。。。。 一边看世界杯,一边想问题,呵呵,ppstream这个网络电视不错,播放很流畅。 还是想不出来,那位大虾帮帮忙啊,不用输入数据的图块能显示,但是有的图块要求输入一些信息的显示不出来,如果用autocad的insert命令通过对话框也可以加入,和锁定文档没什么关系,那位大虾帮忙想想办法!!! ???/ 请教高手,帮忙看看,。。。。。。。。。急。。。 这个问题应该等价于如何用arx来实现autocad中的insert命令,不过不是动态的,是静态的,也就是并不要求用户输入数据,各位认为如何去做,请教。。。。 咋没人理我呢??????? 搞定了,!!!! 代码没变,我也不知道怎么就可以了,,,, |
所有的时间均为北京时间。 现在的时间是 08:21 AM. |