找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1266|回复: 8

[求助] 读取并调整实体在数据库中的存放先后顺序

[复制链接]
发表于 2017-7-19 15:07:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
选择集选中所需要的实体,把实体从库中读取出来,然后再按特定顺序存入,比如黑色先存入,其它颜色再存入,最后红色存入到库中 能给个思路吗?
我的做法是:
std::vector<AcDbEntity *> redEntities;
std::vector<AcDbEntity *> blackEntities;
std::vector<AcDbEntity *> otherEntities;
std::vector<AcDbObjectId> redIds;
std::vector<AcDbObjectId> blackIds;
std::vector<AcDbObjectId> otherIds;
//
for(i=0;i<ssmlen;i++)
{
      AcDbObjectId eId;
      ads_name entName;
      acdbGetObjectId(eId,entName);
      AcDbEntity *pEnt;
     if(Acad::eOk!=acdbOpenObject(pEnt,eId,AcDb::kForWrite))
      {
            acutPrintf(_T("..."));
             return;
       }
       if(1==pEnt->colorIndex())
       {
             redEntities.push_back(pEnt);
            redIds.push_back(eId);
             pEnt->close();
       }

       else if(7==pEnt->colorIndex())
       {
             blackEntities.push_back(pEnt);
            blackIds.push_back(eId);
             pEnt->close();
       }
        else
       {
             otherEntities.push_back(pEnt);
            otherIds.push_back(eId);
             pEnt->close();
       }
}
//
for(i=0;i<blackEntities.size();i++)
{
     AcDbBlockTable *tpBlkTble;
     Acad::ErrorStatus es;
     es=acdbHostApplicationServices()->workingDatabase()->getBlockTable(tpBlkTbl,AcDb::kForRead);
     AcDbBlockTableRecord *tpBlkTblRcd=NULL;
     es=tpBlkTbl->getAt(ACDB_MODEL_SPACE,tpBlkTblRcd,AcDb::kForWrite);
     if(es==Acad::eOk)
      {
             try
             {
                  es=tpBlkTbl->close();
                   es=tpBlkTblRcd->appendAcDbEntity(blackIds.at(i),blackEntities.at(i));
                   es=tpBlkTblRcd->close();  
            }
              catch(...)
              {

              }
        }
}

//其它类似
可是操作完后,一点影响都没有 那位大神可以指导一下吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-7-19 17:08:26 | 显示全部楼层
本帖最后由 newer 于 2017-7-19 17:09 编辑

路的方向对了,就不怕遥远。方向很重要,别偏离了。
做你说的这个事,就是draworder, 你暂时没做出来,是你的局部的代码有问题,但方向没错。

如果你想重新在生成遍实体来达到目的,那写程序就不是一门“艺术”,而是一门苦力了.........

以前说过,调整显示顺序和颜色什么的无关,之和对象自身的ID有关, 你说的颜色等只是为了过滤出最后的ID,哪个ID再上面,哪个ID在下面,你之前先分好,然后把ID放入AcDbObjectIdArray里面。

怎么分,你再写写合适的代码。不存在分不出来的情况,只要你的条件对。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-7-19 15:16:08 | 显示全部楼层
你为什么想到要这么做呢? 想改变生成顺序,同时改变显示的顺序?

试试ACAD的DRFAWORDER命令,想实现同样的功能

你完全可以用draworder的方法,调整显示顺序达到你的要求。

用 draworder 搜索论坛,看看以前的帖子。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-19 16:20:21 | 显示全部楼层
我主要是想 通过选中的选择集来改变生成顺序 从而改变显示顺序 之前我用大神的提示 用了AcDbSortentsTable 来改变了颜色的显示顺序,问题是黑色放在最底层的时候 会被图片掩盖,而达不到效果。但是如果只改变选中的实体的生成顺序 就像大神说的 先生成的放下面后生成的放上面从而改变其显示顺序,但是不知道怎么去更改其生成顺序哦,能给一些指导吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-19 16:21:27 | 显示全部楼层

我主要是想 通过选中的选择集来改变生成顺序 从而改变显示顺序 之前我用大神的提示 用了AcDbSortentsTable 来改变了颜色的显示顺序,问题是黑色放在最底层的时候 会被图片掩盖,而达不到效果。但是如果只改变选中的实体的生成顺序 就像大神说的 先生成的放下面后生成的放上面从而改变其显示顺序,但是不知道怎么去更改其生成顺序哦,能给一些指导吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-7-19 17:13:25 | 显示全部楼层

你想把“黑色”的显示到哪呢? 想放哪个前面,你就把它提到 哪个对象ID的上面。

你先别写代码,先用ACAD的命令:draworder , 手工看看怎么能调整到你希望的效果,然后再写代码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 08:58:24 | 显示全部楼层

谢谢大神的指导哈 那个draworder的代码 我会再改进哈 但这有个好奇的问题 不针对这个程序 而是针对arx原理的问题 就是
std::vector<AcDbEntity *> redEntities;
std::vector<AcDbEntity *> blackEntities;
std::vector<AcDbEntity *> otherEntities;
std::vector<AcDbObjectId> redIds;
std::vector<AcDbObjectId> blackIds;
std::vector<AcDbObjectId> otherIds;
保存不住实体,这是什么原因造成的呢?
如果后面不执行pEnt->close(),那么前面的pEnt->erase()就没作用,这是什么原因呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 10:05:51 | 显示全部楼层
不pEnt->close()的话,pEnt->erase()只是删除了标记,而实体要数据库自己删,但是如果没有关闭实体的话,数据库也打不开实体,所有删不了。std::vector<AcDbEntity *> redEntities;是不能保存实体的,要保存的话,可以保存id,为什么我也不知道
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 11:10:48 | 显示全部楼层
std::vector<AcDbEntity *> redEntities;是可以保存实体的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-24 12:53 , Processed in 0.171639 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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