![]() |
【转帖】批量把所有图层放入到0层
批量把所有图层放入到0层
我的程序是通过一个对话框,由用户输入数据的位置和需要移到0图层的图层名称,然后“ok”完成批处理将图形的一些图层的数据移到0图层。下面是主要代码,问题还是依旧是那样的(没有出任何错误,但是也没有执行任何操作,包括最后最后从层表中删除图层也没有执行)大家帮忙看看问题出在哪里啊?谢谢 void lcdlg::layerclear() //主函数 { if(cpath=="") cpath= "d:\\temp\\"; //缺省条件下的数据位置 cfilefind find; cfilefind pathfind; bool bfileisfind; cstring cdwgpath = cpath+"*.dwg"; bfileisfind = find.findfile(cdwgpath); int filecounter=0; acdbdatabase *pcurdb= new acdbdatabase(adesk::ktrue,adesk::ktrue); pcurdb=acdbhostapplicationservices()->workingdatabase(); createdirectory(cpath+"questioned\\",null); //生成一个文件名为questioned的文件夹 createdirectory(cpath+"ok\\",null); //生成一个文件名为ok的文件夹 while (bfileisfind) { balldone=true; acdbdatabase *preaddb= new acdbdatabase(adesk::kfalse,adesk::ktrue); if(bfileisfind) { filecounter++; bfileisfind = find.findnextfile(); find.getfilename(); acad::errorstatus es =preaddb->readdwgfile(find.getfilepath(),_sh_denyno); if(es==acad::eok) { acdbhostapplicationservices()->setworkingdatabase(preaddb); clear(preaddb,layernames); if(balldone) preaddb->saveas(cpath+"ok\\"+find.getfilename()); else preaddb->saveas(cpath+"questioned\\"+find.getfilename()); acdbhostapplicationservices()->setworkingdatabase(pcurdb); delete preaddb; deletefile(find.getfilepath()); } else afxmessagebox("文件"+find.getfilename()+"打开出错"); } } cstring str; str.format("%d",filecounter); afxmessagebox("修改了"+str+"个文件"); } void lcdlg::clear(acdbdatabase *pdb,char *names) //多个需要更改图层的情况 { acdbdatabase *pd; acdblayertable *pt; pd=pdb; acdbobjectidarray nids; char layername[256]; int count1=0; int count2=0; layername[0]=names[0]; while (layername[count1]!='\0') { count2++; if(layername[count1]==';') { while(count1<255) { layername[count1]='\0'; count1++; } pd->getsymboltable(pt, acdb::kforread); if(pt->has(layername)) delss(layername,nids); else balldone=false; count1=0; } else count1++; layername[count1]=names[count2]; } } void lcdlg::onok() //对象框的ok按钮 { cdialog::onok(); sprintf(layernames , "%s",m_layernames); cpath=m_path; layerclear(); } void lcdlg::delss(char* nlayername,acdbobjectidarray& nids)//将一个图层的数据移到0图层 { acad::errorstatus es = acad::eok; ads_name ents; struct resbuf *rb; struct resbuf blc; acdbentity *pe; rb=acutnewrb(acdb::kdxflayername); rb->restype=8; rb->resval.rstring=(char*)nlayername; rb->rbnext=null; acedssget("x",null,null,rb,ents); // long entnums=0; long entnums; acedsslength(ents,&entnums); if (entnums == 0) es = acad::einvalidinput; else { for (long a = 0; a < entnums ; a ++) { acdbobjectid objid; ads_name ent; acdbobject* obj; acedssname(ents,a,ent); acdbgetobjectid(objid, ent); acdbopenobject(pe,objid,acdb::kforwrite,false); nids.append(objid); pe->setlayer("0"); pe->close; obj->close; nids.append(objid); } } acedssfree(ents); blc.restype = rtstr; blc.resval.rstring = "0"; acedsetvar("clayer",&blc);//设置当前图层为0层 acdblayertable * playertbl;//定义层表指针 acdbhostapplicationservices()->workingdatabase()->getsymboltable(playertbl, acdb::kforwrite); acdblayertablerecord * playertblrcd; //定义层表记录指针 if ( acad::eok == playertbl->getat((char*)nlayername, playertblrcd , acdb::kforwrite)) { playertblrcd->erase(true);//删除图层 } playertblrcd->close(); playertbl->close(); acutrelrb(rb); } 按照上面的方法现在出现错误提示“error writting/closing file”,然后把我的测试数据全删掉拉。这是什么问题? 好的,谢谢大家,已经调试好了。至于上面出错原因我还是不清楚。现将将成功代码公布如下: void lcdlg::layerclear() //主函数 { if(cpath=="") cpath= "d:\\temp\\"; //缺省条件下的数据位置 cfilefind find; cfilefind pathfind; bool bfileisfind; cstring cdwgpath = cpath+"*.dwg"; bfileisfind = find.findfile(cdwgpath); int filecounter=0; acdbdatabase *pcurdb= new acdbdatabase(adesk::ktrue,adesk::ktrue); pcurdb=acdbhostapplicationservices()->workingdatabase(); createdirectory(cpath+"questioned\\",null); //生成一个文件名为questioned的文件夹 createdirectory(cpath+"ok\\",null); //生成一个文件名为ok的文件夹 while (bfileisfind) { balldone=true; acdbdatabase *preaddb= new acdbdatabase(adesk::kfalse,adesk::ktrue); if(bfileisfind) { filecounter++; bfileisfind = find.findnextfile(); find.getfilename(); acad::errorstatus es =preaddb->readdwgfile(find.getfilepath(),_sh_denyno); if(es==acad::eok) { acdbhostapplicationservices()->setworkingdatabase(preaddb); clear(preaddb,layernames); if(balldone) preaddb->saveas(cpath+"ok\\"+find.getfilename()); else preaddb->saveas(cpath+"questioned\\"+find.getfilename()); acdbhostapplicationservices()->setworkingdatabase(pcurdb); delete preaddb; deletefile(find.getfilepath()); } else afxmessagebox("文件"+find.getfilename()+"打开出错"); } } cstring str; str.format("%d",filecounter); afxmessagebox("修改了"+str+"个文件"); } void lcdlg::clear(acdbdatabase *pdb,char *names) //多个需要更改图层的情况 { acdbdatabase *pd; acdblayertable *pt; pd=pdb; acdbobjectidarray nids; char layername[256]; int count1=0; int count2=0; layername[0]=names[0]; while (layername[count1]!='\0') { count2++; if(layername[count1]==';') { while(count1<255) { layername[count1]='\0'; count1++; } pd->getsymboltable(pt, acdb::kforread); if(pt->has(layername)) delss(layername); else balldone=false; count1=0; } else count1++; layername[count1]=names[count2]; } } void lcdlg::onok() //对象框的ok按钮 { cdialog::onok(); sprintf(layernames , "%s",m_layernames); cpath=m_path; layerclear(); } void lcdlg::delss(const char *slay) { ads_name ss; struct resbuf *rb=acutbuildlist(8,slay,null); long nlen=0; if(acedssget("x",null,null,rb,ss)!=rtnorm) { acutrelrb(rb); return; } acutrelrb(rb); acedsslength(ss,&nlen); for(long n=0l;n<nlen;n++) { ads_name ent; acedssname(ss,n,ent); acdbobjectid ident; acdbgetobjectid(ident,ent); acdbentity *pent=null; if(acdbopenobject(pent,ident,acdb::kforwrite)==acad::eok) { pent->setlayer("0"); pent->close(); } } acedssfree(ss); } 如果我还想继续把已经移到0层的图层删除是怎么做的啊?我是这样做的,但是有问题,请指教 void lcdlg::delss(const char *slay) { ads_name ss; struct resbuf *rb=acutbuildlist(8,slay,null); long nlen=0; if(acedssget("x",null,null,rb,ss)!=rtnorm) { acutrelrb(rb); return; } acutrelrb(rb); acedsslength(ss,&nlen); for(long n=0l;n<nlen;n++) { ads_name ent; acedssname(ss,n,ent); acdbobjectid ident; acdbgetobjectid(ident,ent); acdbentity *pent=null; if(acdbopenobject(pent,ident,acdb::kforwrite)==acad::eok) { pent->setlayer("0"); pent->close(); } } acedssfree(ss); acdblayertable * playertbl;//定义层表指针 acdbhostapplicationservices()->workingdatabase()->getsymboltable(playertbl, acdb::kforwrite); acdblayertablerecord * playertblrcd; //定义层表记录指针 if ( acad::eok == playertbl->getat(slay, playertblrcd , acdb::kforwrite)) { playertblrcd->erase(true);//删除图层 } playertblrcd->close(); playertbl->close(); free(&slay); } |
所有的时间均为北京时间。 现在的时间是 06:10 AM. |