Тема: Есть в ARXе средство для поиска примитивов по метке.

Подскажите, пожалуйста как имея метку найти примитив и его подсветить?

Re: Есть в ARXе средство для поиска примитивов по метке.

> alex
По первому вопросу:

acdbHandEnt
AcDbDatabase::getAcDbObjectId

По второму:

AcDbEntity::highlight
AcDbEntity::unhighlight

Re: Есть в ARXе средство для поиска примитивов по метке.

Спасибо, Александр!
Сейчас попробую.

Re: Есть в ARXе средство для поиска примитивов по метке.

Еще здесь глянь: https://www.caduser.ru/forum/topic29007.html

Re: Есть в ARXе средство для поиска примитивов по метке.

Да, я смотрел. Конструктор твоего класса сразу принимает ID объекта. У меня именно проблема в получении этого ID.
Посредством acdbHandEnt я получаю имя примитива.
Следующая функция AcDbDatabase::getAcDbObjectId() должна вернуть мне наверное этот самый вожделенный ID, но в числе аргументов нет имени примитива, там фигурирует const AcDbHandle& objHandle
Может нужно насильно преобразовывать ads_name в AcDbHandle?
Спасибо за ответ.

Re: Есть в ARXе средство для поиска примитивов по метке.

Для получения AcDbObjectId из ads_name воспользуйся функцией acdbGetObjectId. Что касается AcDbDatabase::getAcDbObjectId(), то тебе не ads_name нужно преобразовывать в AcDbHandle, а метку(строку) в AcDbHandle (воспользуйся его конструктором вида AcDbHandle("шестнадцатиричная строка").

Re: Есть в ARXе средство для поиска примитивов по метке.

Спасибо, Александр.
Эта информация + ссылка на твой же ответ - и все получилось!
Правда, половина кода, для меня пока не понятна, но работает.
Могу ли я AcDbObjectIdArray объявить как static и при входе в эту функцию проверять его содержимое с обратной целью (погасить подсветку)

Re: Есть в ARXе средство для поиска примитивов по метке.

void DlgAddObj::SelectedObjectEnts(int idobj)
{
if(OpenDLL())
{
    CMSTools t;
    bool hi=true;
    CDataObjects v;
    ACHAR *sp=NULL;
    CMDIFrameWnd *pfrm = acedGetAcadFrame();        
    pfrm->SetFocus();
    [b]static AcDbObjectIdArray ids;[/b]
    if(!ids.isEmpty()&&ids.length())
    {
        [b]SelectedEnt(ids,false);[/b]
        ids.removeAll();
    }
    acdbCurDwg()->getFilename((const ACHAR*&)sp);
    if(m_libDLL.GetItemObject(idobj,v))
    {
        int i=0;
        ads_name anm;
        CString sb,s,sv=v.GetString(_DATA_RANGE_EXT_DATA);
        s=sp;
        sb=t.GetWPart(s,sv);
        resbuf*pres;
        AcDbObjectId id;
        AcDbHandle hd;
        while(t.StrTok(i,sb,s,'>'))
        {
            s.TrimLeft(L" <");
            s.TrimRight(L" >");
            if(hd=acdbHandEnt(s,anm)==RTNORM)
            {
            pres=acdbEntGet(anm);
            acdbGetObjectId(id,anm);
            ids.append(id);            
            }
        }
        [b]SelectedEnt(ids,true);[/b]
    }
}
}
void DlgAddObj::SelectedEnt(AcDbObjectIdArray&ids,bool hi)
{
    if (ids.isEmpty()) return;
        AcAxDocLock lc(ids[0].database());
        if (lc.lockStatus() != Acad::eOk) return;
        for (int i=0; i < ids.length(); i++)
        {
        AcDbObjectPointer<AcDbEntity> pEnt(ids[i],AcDb::kForWrite);
        if (pEnt.openStatus() != Acad::eOk) continue;
        pEnt->draw();
      if (hi) pEnt->highlight();
        else pEnt->unhighlight();
        }
}

Попробовал гасить подсветку объявив массив как static но видимого результата не получил, хотя как бы, все отрабатывает корректно :(
Может быть я опять, чего-то не увидел, или на мину какую наступил?

Re: Есть в ARXе средство для поиска примитивов по метке.

Отбой! Все работает как надо.
Я проверял функцию без ids.removeAll();, естественно массив и дальше хранил все индексы и при вызове SelectedEnt(..., true) снова их подсвечивал :)
Еще раз спасибо, Александр!