Тема: Как определить в каком пространстве лежит объект?

Задача: имеем массив AcDbObjectId элеементов, необходимо в одну кучу отсотсортировать объекты лежащие в пространстве модели, а в другую объекты пространства листа. Интуитивно чувствую, что необходимо найти Space Id объекта, но как это сделать? В общем вошел в ступор...

Re: Как определить в каком пространстве лежит объект?

 static void SplitObjectArrayBySpace(AcDbObjectIdArray &objs, AcDbObjectIdArray &obj_model, AcDbObjectIdArray &obj_paper)
  {
    for (int i=0; i < objs.length(); i++) {
      AcDbObjectPointer<AcDbEntity> ent(objs[i], AcDb::kForRead);
      AcDbObjectId ownId = ent->blockId(); // Находим владельца
      AcDbObjectPointer<AcDbBlockTableRecord> btr(ownId, AcDb::kForRead);
      char *blkname = NULL;   btr->getName(blkname);
      // Если владелец - Model_Space заносим в один массив, если нет - в другой
      if (stricmp(blkname,ACDB_MODEL_SPACE)) {
        obj_paper.append(objs[i]);
      } else {
        obj_model.append(objs[i]);
      }
      if (blkname) free(blkname);
     }
  }

Пример обращения:

  static void getspaceid_MyCommand1(void)
  {
    // Add your code for command getspaceid._MyCommand1 here
    long nMspace =0, nPspace = 0, sslen = 0;
    ads_name ss, en;
    AcDbObjectIdArray objs, objs_model, objs_paper;
    if (acedSSGet("_ALL",NULL,NULL,NULL,ss) == RTNORM) {
      if (acedSSLength(ss,&sslen) == RTNORM) {
        for (long i=0; i < sslen; i++) {
          if (acedSSName(ss,i,en) == RTNORM) {
            AcDbObjectId objId;
            if (acdbGetObjectId(objId,en) == Acad::eOk) {
              objs.append(objId);
            }
          }
        }
        SplitObjectArrayBySpace(objs,objs_model,objs_paper);
        acutPrintf("\nSelected entities in Model_Space:<%d>"
                   "\nSelected entities in Paper_Space:<%d>",objs_model.length(),objs_paper.length());
      }
    }
  }

Учти две вещи:
1) Подразумевается, что параметр objs содержит id's примитивов (!!!) а не просто объектов, и примитивы содержатся непосредственно или в Model_Space или в Paper_Space, но не внутри блоков. Если бы они содержались внутри блоков, то определить к какому пространству они относятся было бы невозможно, т.к. блок их содержащий можно вставить и в одно и в другое пространство.
2) Реализована минимальная проверка на ошибки sad

Re: Как определить в каком пространстве лежит объект?

Еще один простенький вариант функции, которая определяет принадлижит ли переданный ID Model_Space или нет:

bool IsInModelSpace(AcDbObjectId id)
{
 AcDbObjectPointer<AcDbObject> ent(id, AcDb::kForRead);
 if (ent.openStatus() == Acad::eOk) {
   AcDbObjectId modelSpId = acdbSymUtil()->blockModelSpaceId(id.database());
   if (modelSpId == ent->ownerId()) return true;
 }
 return false;
}

Re: Как определить в каком пространстве лежит объект?

Александр! Большущее спасибо за столь исчерпывающие ответы. Идея ясна, а реализация - дело техники и немножко времени...))

Re: Как определить в каком пространстве лежит объект?

Как сделать всем вложенным объектам в объекте - explode?