明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: tongtong

批量把所有图层放入到0层

  [复制链接]
 楼主| 发表于 2007-2-9 16:46:00 | 显示全部楼层

我的程序是通过一个对话框,由用户输入数据的位置和需要移到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);
}

 楼主| 发表于 2007-2-12 08:53:00 | 显示全部楼层

按照上面的方法现在出现错误提示“Error writting/closing file”,然后把我的测试数据全删掉拉。这是什么问题?

 楼主| 发表于 2007-2-12 11:19:00 | 显示全部楼层

好的,谢谢大家,已经调试好了。至于上面出错原因我还是不清楚。现将将成功代码公布如下:

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

 楼主| 发表于 2007-2-28 10:36:00 | 显示全部楼层

如果我还想继续把已经移到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);
 
}

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 22:31 , Processed in 0.148094 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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