LoveArx 发表于 2017-1-27 12:47:28

改变显示顺序的代码

本帖最后由 LoveArx 于 2017-1-27 12:54 编辑


Acad::ErrorStatus changeDrawOrder(AcDbObjectId parent, AcDbObjectIdArray &childArray, AcEdDrawOrderCmdType variant)
{
   if (childArray.isEmpty()) return Acad::eInvalidInput;
   Acad::ErrorStatus es = Acad::eOk;
   AcDbSortentsTable *pSortTab = NULL;
   AcDbObjectId spaceId = AcDbObjectId::kNull;
   AcDbEntityPointer pEnt(childArray.first(),AcDb::kForRead);
   if (pEnt.openStatus() == Acad::eOk)
   {
      spaceId = pEnt->ownerId();
      pEnt->close();
   }
   if (!spaceId.isNull())
   {
      AcDbBlockTableRecordPointer pBTR(spaceId,AcDb::kForRead);
      if (pBTR.openStatus() == Acad::eOk)
      {
         if (pBTR->getSortentsTable(pSortTab, AcDb::kForWrite, true) == Acad::eOk)
         {
            switch (variant)
            {
               case kDrawOrderBottom:
                  es = pSortTab->moveToBottom(childArray);
                  break;
                                       
               case kDrawOrderTop:
                  es = pSortTab->moveToTop(childArray);
                  break;
                                                
               case kDrawOrderBelow:
                  es = pSortTab->moveBelow(childArray,parent);
                  break;
                                                
               case kDrawOrderAbove:
                  es = pSortTab->moveAbove(childArray,parent);
                  break;
            }
            pSortTab->close();
         }
      }
   }
   return es;
}

下面是具体调用的实例

**** Hidden Message *****

另一个用法例子:


ads_name entName;
ads_point entpoint;
if (acedEntSel(_T("\nlayer:"),entName,entpoint)!=RTNORM)
{
        return;
}
AcDbObjectId layerId;
acdbGetObjectId(layerId,entName);
AcDbEntity *pEnt;
acdbOpenObject(pEnt,layerId,AcDb::kForWrite);
TCHAR *layerName=pEnt->layer();
pEnt->close();

struct resbuf *rb;
ads_name ssname;
rb=acutBuildList(8,layerName,RTNONE);
int rc=acedSSGet(_T("X"),NULL,NULL,rb,ssname);
AcDbObjectIdArray objIds;
if (rc!=RTNORM)
{
        acutRelRb(rb);
        return;
}
long length;
acedSSLength(ssname,&length);
acutPrintf(_T("\nlayer%sall%d个"),layerName,length);
for (int i=0;i<length;i++)
{
        ads_name ent;
        acedSSName(ssname,i,ent);
        AcDbObjectId objId;
        acdbGetObjectId(objId,ent);
        objIds.append(objId);
}
changeDrawOrder(NULL,objIds,kDrawOrderTop);
//acedDrawOrderInherit(NULL,objIds,::kDrawOrderTop);
acedSSFree(ssname);
acutDelString(layerName);
if (rb!=NULL)
{
        acutRelRb(rb);
}




LoveArx 发表于 2017-1-27 12:59:48

改变选择的实体显示顺序到最下


static void MoveToBottom(void)
{
ads_point p;
ads_name en;
Acad::ErrorStatus es;
if (acedEntSel(L"\nSelect entity: ",en,p) == RTNORM) {
    AcDbObjectId id; acdbGetObjectId(id,en);
    AcDbSortentsTable *pSortTab = NULL;
    AcDbObjectId spaceId = acdbCurDwg()->currentSpaceId();
    AcDbObjectPointer<AcDbBlockTableRecord> pBTR(spaceId,AcDb::kForRead);
    if ((es = pBTR.openStatus()) == Acad::eOk) {
      if ((es = pBTR->getSortentsTable(pSortTab, AcDb::kForWrite, true)) == Acad::eOk) {
      AcDbObjectIdArray ar; ar.append(id);
      pSortTab->moveToBottom(ar);
      pSortTab->close();
      } else {
      acutPrintf(L"\nError open AcDbSortentsTable: %s",acadErrorStatusText(es));
      }
    } else {
      acutPrintf(L"\nError open AcDbBlockTableRecord: %s",acadErrorStatusText(es));
    }
}
}

qqqincccken 发表于 2017-1-28 00:35:41

谢谢提供,祝新年快乐

28952996 发表于 2017-1-28 22:03:12

看起来不错啊。。

qqqincccken 发表于 2017-1-29 00:19:58

谢谢提供,学习一下了!!!

sunshinejwt 发表于 2017-1-30 22:33:14

谢谢提供,祝新年快乐

kqqt6236 发表于 2017-2-2 16:06:06

谢谢分享。

zjy2999 发表于 2017-2-3 10:14:21

学习!!!!!!!!!!!

用途 发表于 2017-2-12 19:10:34

谢谢 学习学习 谢谢

1425361224 发表于 2017-2-20 14:45:36

过来学习学习

gis2000 发表于 2017-2-25 19:26:44

谢谢分享!!

lhg 发表于 2017-3-5 20:55:18

啥也不说了,感谢楼主分享哇!

革天明 发表于 2017-3-6 10:57:37

谢谢楼主分享

牵手_uKql0 发表于 2017-3-12 16:28:23

我也来学习学习,

炫翔 发表于 2017-5-4 17:42:25

回复学习
页: [1] 2 3
查看完整版本: 改变显示顺序的代码