乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 69|回复: 4

[讨论]我想把模型空间的直线替换成自己的~~代码注释很清楚,望高手走过时顺便指点一

[复制链接]

15

主题

28

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
88
发表于 2010-7-10 16:39:00 | 显示全部楼层 |阅读模式
[讨论]我想把模型空间的直线替换成自己的~~代码注释很清楚,望高手走过时顺便指点一下啊[br] //获得当前数据库的快表
  AcDbBlockTable *pBlockTbl;
  acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTbl,AcDb::kForRead    );
  //获得模型空间的块表记录
  AcDbBlockTableRecord *pBlockTblRcd;
  pBlockTbl->getAt (ACDB_MODEL_SPACE,pBlockTblRcd,AcDb::kForWrite);//原本是read格式
  pBlockTbl->close();//已经关闭啦
  //创建快表记录遍历器
  AcDbBlockTableRecordIterator *pltr;
  pBlockTblRcd->newIterator (pltr);
  AcDbEntity *pEnt;//遍历的临时实体指针。
  unsigned int No_Line;//多少条直线
  No_Line=0;
  //第一次 遍历只为获得直线的数目即 No_Line
  for (pltr->start ();!pltr->done();pltr->step())
  {
   pltr->getEntity (pEnt,AcDb::kForWrite   );
   AcDbLine *pLine=AcDbLine::cast(pEnt);//淘出直线
   if (pLine!=NULL)
   {
    No_Line=No_Line+1;//遇到直线就加1.
    pLine->close();//这里忘关
   
   }
   pEnt->close();
   }
  }
  //及时删除遍历
  delete pltr;
  
  //有点生疏的动态数组
/* AcDbLine **pLines;
  pLines=new AcDbLine*[No_Line];*/
  typedef AcDbLine* AcDbLinePointer;
        AcDbLinePointer *pLines=new AcDbLinePointer[No_Line];//小梁

  ////将直线的信息 放到新建的动态数组
  unsigned int No_Line_Tmp;
  No_Line_Tmp=0;
  AcDbObjectId pLines_ID;//临时保存实体用的ID
  //第二次 遍历为了将直线的信息放入到动态数组
  AcDbBlockTableRecordIterator *pltr1;
  pBlockTblRcd->newIterator (pltr1);
  for (pltr1->start ();!pltr1->done ();pltr1->step())
  {
   pltr1->getEntity(pEnt,AcDb::kForWrite );//这里是写的模式
   AcDbLine *pLine=AcDbLine::cast(pEnt);//淘出直线
   if (pLine!=NULL)
   {
    //新建一条直线
    pLines[No_Line_Tmp]->startPoint() =pLine->startPoint ();
    pLines[No_Line_Tmp]->endPoint() =pLine->endPoint ();
    //删除老线,换成新线。
    pLine->erase ();
    //及时关闭pLine
    pLine->close();
    //pBlockTblRcd->appendAcDbEntity(pLines_ID,pLines[No_Line_Tmp]); //遍历时不要添加 否则死循环。
    No_Line_Tmp=No_Line_Tmp+1;//序号加一。
   /* pLines[No_Line_Tmp]->close ();
      */
   
   }
   pEnt->close();
  }

  
  delete pltr1;//删除遍历器
  pBlockTblRcd->close();
  delete[] pLines;//删除动态数组。
回复

使用道具 举报

12

主题

228

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
276
发表于 2010-7-11 11:54:00 | 显示全部楼层
这里有问题:
pLines[No_Line_Tmp]->startPoint() =pLine->startPoint ();
    pLines[No_Line_Tmp]->endPoint() =pLine->endPoint ();
另外不明白你这样做,有什么意义
回复

使用道具 举报

2

主题

165

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2010-7-12 13:53:00 | 显示全部楼层
  //第一次 遍历只为获得直线的数目即 No_Line
  for (pltr->start ();!pltr->done();pltr->step())
  {
   pltr->getEntity (pEnt,AcDb::kForWrite   );
   AcDbLine *pLine=AcDbLine::cast(pEnt);//淘出直线
   if (pLine!=NULL)
   {
    No_Line=No_Line+1;//遇到直线就加1.
    pLine->close();//这里忘关
   
   }
这里,cast(pent),之前必须确定这个pent就是acdbline,否则会出问题if ( !pent->isKindOf(acdbLine::desc() ) ) {ent->close(); continue;}

在确定了line的数量后,把它们放进acdbvoidpointerarray,你记得放进去的是acdbline类型的指针就可以了,其余的就简单了~~
回复

使用道具 举报

15

主题

28

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
88
发表于 2010-7-12 14:40:00 | 显示全部楼层
本来想用这一句设置起点 终点的,发现错了。
还得用new AcDbLine(x,y)这种格式。
谢谢
回复

使用道具 举报

15

主题

28

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
88
发表于 2010-7-12 14:40:00 | 显示全部楼层
谢谢您的指点!!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 18:42 , Processed in 0.201569 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表