几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(C++)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-18, 02:37 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】批量把所有图层放入到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: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);

}
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 06:34 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多