Тема: Есть в ARXе средство для поиска примитивов по метке.
Подскажите, пожалуйста как имея метку найти примитив и его подсветить?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Есть в ARXе средство для поиска примитивов по метке.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите, пожалуйста как имея метку найти примитив и его подсветить?
> alex
По первому вопросу:
acdbHandEnt AcDbDatabase::getAcDbObjectId
По второму:
AcDbEntity::highlight AcDbEntity::unhighlight
Спасибо, Александр!
Сейчас попробую.
Еще здесь глянь: https://www.caduser.ru/forum/topic29007.html
Да, я смотрел. Конструктор твоего класса сразу принимает ID объекта. У меня именно проблема в получении этого ID.
Посредством acdbHandEnt я получаю имя примитива.
Следующая функция AcDbDatabase::getAcDbObjectId() должна вернуть мне наверное этот самый вожделенный ID, но в числе аргументов нет имени примитива, там фигурирует const AcDbHandle& objHandle
Может нужно насильно преобразовывать ads_name в AcDbHandle?
Спасибо за ответ.
Для получения AcDbObjectId из ads_name воспользуйся функцией acdbGetObjectId. Что касается AcDbDatabase::getAcDbObjectId(), то тебе не ads_name нужно преобразовывать в AcDbHandle, а метку(строку) в AcDbHandle (воспользуйся его конструктором вида AcDbHandle("шестнадцатиричная строка").
Спасибо, Александр.
Эта информация + ссылка на твой же ответ - и все получилось!
Правда, половина кода, для меня пока не понятна, но работает.
Могу ли я AcDbObjectIdArray объявить как static и при входе в эту функцию проверять его содержимое с обратной целью (погасить подсветку)
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 но видимого результата не получил, хотя как бы, все отрабатывает корректно :(
Может быть я опять, чего-то не увидел, или на мину какую наступил?
Отбой! Все работает как надо.
Я проверял функцию без ids.removeAll();, естественно массив и дальше хранил все индексы и при вызове SelectedEnt(..., true) снова их подсвечивал :)
Еще раз спасибо, Александр!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Есть в ARXе средство для поиска примитивов по метке.
Форум работает на PunBB, при поддержке Informer Technologies, Inc