批量把所有图层放入到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:

nok() //对象框的ok按钮
{
cdialog:

nok();
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:

nok() //对象框的ok按钮
{
cdialog:

nok();
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);
}