Очень не хотел отвечать в эту тему - думал, что кто-то реально это использует и поделится информацией. Но так как добровольцев не нашлось...
bool Flag_Thread_Start = false;
// Добавление примитива в базу чертежа - стандартная функция
Acad::ErrorStatus postToDb(AcDbDatabase *pDb, AcDbEntity* ent, AcDbObjectId& objId)
{
Acad::ErrorStatus es;
AcDbBlockTable* pBlockTable;
AcDbBlockTableRecord* pSpaceRecord;
if ((es = pDb->getSymbolTable(pBlockTable, AcDb::kForRead)) != Acad::eOk) {
return es;
}
if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,
pSpaceRecord,
AcDb::kForWrite)) != Acad::eOk) {
return es;
}
if ((es = pBlockTable->close()) != Acad::eOk) {
return es;
}
if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) {
return es;
}
if ((es = pSpaceRecord->close()) != Acad::eOk) {
return es;
}
return ent->close();
}
// Фоновая задача
void OtherThread(void *parm)
{
AcApDocument *cDoc = curDoc();
if (cDoc) {
int iColor = 1;
AcDbDatabase *pDb = cDoc->database();
AcDbObjectId eId;
Acad::ErrorStatus es;
if (pDb) {
es = acDocManager->lockDocument(cDoc);
if (es == Acad::eOk) {
AcDbLine *pLine = new AcDbLine(AcGePoint3d(0,0,0),AcGePoint3d(10,10,0));
pLine->setColorIndex(iColor);
postToDb(pDb,pLine,eId);
acDocManager->unlockDocument(cDoc);
while (Flag_Thread_Start) {
es = acDocManager->lockDocument(cDoc);
if (es == Acad::eOk) {
AcDbObjectPointer<AcDbLine>pLine(eId,AcDb::kForWrite);
if (pLine.openStatus() == Acad::eOk) {
pLine->setColorIndex(++iColor%256);
}
acDocManager->unlockDocument(cDoc);
}
Sleep(300);
}
}
}
}
_endthread();
}
// - MultiThread.Thread command (do not rename) - Обработчик команды
static void MultiThreadThread(void)
{
// Add your code for command MultiThread.Thread here
if (!Flag_Thread_Start) {
Flag_Thread_Start = true;
_beginthread(&OtherThread,0,NULL);
}
}
Конечно можно нарваться на неприятности, т.к. Autodesk специально пишет, что делать этого не следует, но если очень осторожненько, проверяя, что AcDbDatabase существует и не закрыта, AcApDocument "живой" и т.д., то можно попробовать. Безусловно это только IMHO, но с данным примером я поигрался и он работает. Более того, когда для отрезка выбираешь Properties, то номер цвета мелькает в окошке.