Тема: Как помигать цветом примитива из AcDbBlockReference?

Доброго дня всем.
Требуется спозиционироваться на произвольный примитив, смасштабировать его в поле видимости и помигать им. Первые две задачи решены, а для третьей хорошего решения пока не вижу, обращаюсь к вам за помощью. ObjectARX 2000.
Сначала помигать надо было полилинией. Это решалось примерно следующим образом (для трех миганий):

MyClass::Flick();
{
  m_aEnt = entId;
  m_bFlick = false;            
  for (int i=0; i<6; i++)
    acedCommand(RTSTR, "FLICKCOLOR", RTNONE);
}
// обработчик команды "FLICKCOLOR"
void load_objects_class::FlickColor()
{
  AcDbEntity* pEnt;    
  if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_aEnt, AcDb::kForWrite))
  {        
    int ci = (m_bFlick = !m_bFlick) ? 2 : m_nColor;
    if (m_nColor == -1)
      m_nColor = pEnt->colorIndex();
    else
      Sleep(500);
    pEnt->setColorIndex(ci);
    Ent->close();
  }
}

Здесь единственный отрицательный момент, это что в командном окне 6 раз печатается FLICKCOLOR. Попытки использовать функции типа Update(), Redraw() в тот момент к успеху не привели. Но это как бы маленький вопрос - можно ли было сделать лучше, что надо было использовать.
Полилиния прекрасно меняла цвет на желтый и затем на исходный. Тоже и хэтч. А теперь возникла необходимость применить это мигание к AcDbBlockReference, состоящий, скажем, из текста и хэтча. Причем, мигать надо одним экземпляром, AcDbObjectId (объекта AcDbBlockReference) которого известен.
Вопрос в следующем. Насколько я понял, просматривая доки, достучаться до составляющих одного экземпляра AсDbBlockReference невозможно. Можно только до его AcDbBlockTableRecord, т.е., меняя цвета сразу всех объектов AcDbBlockReference.
Выход, который мне кажется возможным - создавать еще такой же AcDbBlockTableRecord, но желтый. И для мигания переключать их методом AсDbBlockReference::setBlockTableRecord для одного элемента чертежа.
Есть ли лучшее решение?
И можно ли оптимизировать мигание, заставить примтив перерисовываться в пределах одной функции ObjectARX?
Спасибо.

Re: Как помигать цветом примитива из AcDbBlockReference?

Выход, который мне кажется возможным — создавать еще такой же AcDbBlockTableRecord, но желтый. И для мигания переключать их методом AсDbBlockReference::setBlockTableRecord для одного элемента чертежа.
Есть ли лучшее решение?

Можно и так. А почему бы тебе не сделать дубликат примитивов, которые содержатся в блоке (причем можно мигать и не всеми примитивами) и не помигать дубликатами? На время мигания для BlockReference установить setVisibility(AcDb::kInvisible). Ну а после мигания их стереть.

Re: Как помигать цветом примитива из AcDbBlockReference?

А почему бы тебе не сделать дубликат примитивов, которые содержатся в блоке (причем можно мигать и не всеми примитивами) и не помигать дубликатами? На время мигания для BlockReference установить setVisibility(AcDb::kInvisible). Ну а после мигания их стереть.

Создать отдельно от AcDbReference такой же примитив? Наверное, это вариант лучше.  Только нет уверенности, что он будет впереди относительно элемента блока (решаемая проблема, но тоже огород городить). Поскольку остальные экземпляры того же AcDbTableRecord не должны меняться, то я не могу менять сам AcDbTableRecord и ставить его элементам AcDb::kInvisible. Не верится, что нет ничего удобнее.
А насчет отрисовки примитива до выхода из команды таки ничего не подскажете? Я точно пробовал AcDbEntity::draw(), пред ней setColorIndex(), после нее Sleep(500), и так 6 раз (все во Flick()), но мигания не наблюдал.... не помогало даже ::UpdateWindow(adsw_acadMainWnd())....

Re: Как помигать цветом примитива из AcDbBlockReference?

> Wing
Такое тоже не помогает?

Re: Как помигать цветом примитива из AcDbBlockReference?

Спасибо, Александр.
Для обновления экрана в пределах команды ваш код

actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();
acedUpdateDisplay();

помог.
А в реализации мигания остановился на еще одном экземпляре AcDbBlockTableRecord, и вполне компактный код получился.
Еще раз большое человеческое спасибо.
Wing

Re: Как помигать цветом примитива из AcDbBlockReference?

Вдогонку: можно ли перед этим миганием, обновить командое окно? В коде

acutPrintf("Переход: %s\n", title.c_str());
for (int i=0; i<6; i++)
  FlickColor();

заголовок дублируется в командную строку почему-то после мигания...

Re: Как помигать цветом примитива из AcDbBlockReference?

> Wing
А вот с этим сложнее. Начиная с какой-то из версий AutoCAD (в R14 было нормально) вывод из acutPrintf буферизируется и вывод происходит не сразу. Что интересно - в lisp функция (princ) позволяет сбросить этот буфер и заставить отобразится текст немедленно. Можешь попробовать альтернативу: acedSetStatusBarProgressMeter/acedSetStatusBarProgressMeterPos хотя в твоем случае это не лучший вариант.

Re: Как помигать цветом примитива из AcDbBlockReference?

> Александр Ривилис
P.S.: Можешь еще попробовать acedPrompt(""); для немедленного вывода в командную строку. В какой-то из версий это помогало, а так как AutoCAD 2000 у меня не установлен - проверить не могу.

Re: Как помигать цветом примитива из AcDbBlockReference?

Должен извиниться. Вывод происходит вовремя, а для того, чтобы буферизация сбросилась и вывод пошел, действительно достаточно добавить "\n" в в строку вывода.
Видимо, вечером не сообразил что последовательность вызовов измtнилась после ввода кода

actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();
acedUpdateDisplay();

и отказа от отдельной команды FLICKCOLOR. Сорри.