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) Реализована минимальная проверка на ошибки