Тема: Выделение примитивов и удаление селекшена

Всем доброго времени суток!
Столкнулся с проблемой: необходимо добавить в селекшн примитивы, но таким образом, чтобы выделились те которые входят в облать, ну например в область, заданную двумя точками, думал acedSSSetFirst поможет, но чето не помогает.
И соответственно после выделения мне необходимо их стереть...ну возможно стандартной процедурой erase(), при перечислении примитивов селекшена..
Подскажите если есть возможность реализовать данную задумку... Заранее спасибо.
С уважением, Sergey

Re: Выделение примитивов и удаление селекшена

Sergey SH пишет:

необходимо добавить в селекшн примитивы, но таким образом, чтобы выделились те которые входят в облать, ну например в область, заданную двумя точками, думал acedSSSetFirst поможет, но чето не помогает.

В какой "селекшн"? В набор предварительного выбора? Если да, то acedSSSetFirst должно помочь. Только команду, из которой выполняется acedSSSetFirst нужно регистрировать с флагами ACRX_CMD_USEPICKSET | ACRX_CMD_REDRAW
Если не в предварительный набор, а в обычный, то acedSSGet(...) и из него все выбранное в другой набор.
Если и это не подходит, то объясни подробнее что тебе нужно.

Re: Выделение примитивов и удаление селекшена

Да нужен acedSSGet(...), чтобы добавить примитивы в набор. Делаю так:

   ads_point pt1, pt2;
   pt1[X] = 0.0;
   pt1[Y] = 0.0;
   pt1[Z] = 0.0;
   pt2[X] = 26.0;
   pt2[Y] = 226.0;
   pt2[Z] = 0.0;
   
   ads_name countSet;
   long len;
   
   acedSSGet("W", pt1, pt2, NULL, countSet);

но почему то не выделяет на чертеже(

Re: Выделение примитивов и удаление селекшена

Нашел косяс нада было написать:

acedSSGet(_T("_W"), pt1, pt2, NULL, countSet);

а дальше как удалить этот набор примитивов с чертежа???

Re: Выделение примитивов и удаление селекшена

Все нашел решение:

acedSSLength(countSet, &len);
     
    AcAxDocLock lock(acdbHostApplicationServices()->workingDatabase(), AcAxDocLock::kNormal);
    if ((lock.lockStatus() != Acad::eOk) | (lock.lockStatus() != Acad::eNoDatabase))
    {
        AcDbBlockTable *pBlkTbl;
        acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlkTbl, AcDb::kForRead);

        AcDbBlockTableRecord *pBlkTblRcd;
        pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,  AcDb::kForRead);
        pBlkTbl->close();
        
        for(int i = 0; i < len; i++)
        {
            ads_name ent;
            acedSSName(countSet, i, ent);
            AcDbObjectId id;
            acdbGetObjectId(id, ent);
            AcDbEntity *pEnt;
            acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite);
            pEnt->erase();
            pEnt->close();
        }
    }

Александр, спс, за подсказки) Уже не первый раз спасаете

Re: Выделение примитивов и удаление селекшена

Это явно лишнее:

      
AcDbBlockTableRecord *pBlkTblRcd;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,  AcDb::kForRead);
pBlkTbl->close(); 

Да и вообще советую использовать интеллектуальные указатели. И код будет короче и вероятность забыть что-нибудь закрыть меньше. Да и проверять результаты acdbOpenAcDbEntity обязательно!

Re: Выделение примитивов и удаление селекшена

Да это лишнее..со старого кода забыл удалить, сорри! Все замечания подправил...
Тада такой вопрос что такое интеллектуальные указатели? Просто примерчик небольшой, а в хелпе сам тада почитаю.
С уважением, Sergey

Re: Выделение примитивов и удаление селекшена

Что такое интеллектуальные указатели в C++ - смотри в литературе или в интернете. Главное их достоинство это то, что они в деструкторе "сливают за собой воду", т.е. освобождают память или закрывают файл и т.д.
А пример использования можешь взглянуть здесь, или поиском по AcDbObjectPointer.

Re: Выделение примитивов и удаление селекшена

спс, Александр, что бы мы без Вас делали)