удалю предыдущий пост. значит код в итоге получился такой
// вставить после строки if(es!=Acad::eOk){delete pBlockDatabase;return NULL;}
//->////////////////////////////////////////////////////////////////////////////////////////////////
// заплатка ////////////////////////////////////////////////////////////////////////////////////////
// в pWorkDatabase найти этот блок, убить sortents, найти все штриховки и кинуть их на задний план
AcDbBlockTableRecordPointer pBadBlockRecord(pBlockName,pWorkDatabase,AcDb::kForRead);
if ((es = pBadBlockRecord.openStatus()) != Acad::eOk) return NULL;
//-> а теперь ищем все штриховки
AcDbObjectIdArray hatchArray; hatchArray.removeAll();
AcDbBlockTableRecordIterator *iter = NULL;
if ((es = pBadBlockRecord->newIterator(iter)) != Acad::eOk) return NULL;
AcDbObjectId eId;
for (;!iter->done(); iter->step())
{
if (iter->getEntityId(eId) == Acad::eOk)
{
AcDbObjectPointer<AcDbHatch> pHatch(eId,AcDb::kForRead);
if ((es = pHatch.openStatus ()) == Acad::eOk)
hatchArray.append(eId);
}
}
delete iter;
//<-
bool needReCreate = false;
if (!hatchArray.isEmpty())
{
AcDbSortentsTable *pSortTable;
es = pBadBlockRecord->getSortentsTable(pSortTable,AcDb::kForRead);
if (es == Acad::eOk)
{
for (int i = 0; i < hatchArray.length(); i++)
{
AcDbHandle handle;
Adesk::Boolean resHasHatch;
resHasHatch = pSortTable->sortAs(hatchArray.at(i),handle);
if (resHasHatch == Adesk::kFalse)
{
needReCreate = true;
break;
}
}
pSortTable->close();
}
}
if (needReCreate)
{
//-> словарь удалим через extensionDictionary. так проще, чем через getSortentsTable
AcDbObjectId extDictId = pBadBlockRecord->extensionDictionary();
if (extDictId.isNull()){return NULL;}
AcDbDictionaryPointer pObjectDictionary(extDictId,AcDb::kForWrite);
if (pObjectDictionary.openStatus() != Acad::eOk) {return NULL;}
AcDbDictionaryIterator* pDictIter;
pDictIter= pObjectDictionary->newIterator();
for (; !pDictIter->done(); pDictIter->next())
{
AcDbObjectId idXrec;
CString tmpStr = pDictIter->name();
if (tmpStr.CompareNoCase(_T("ACAD_SORTENTS")) == 0)
{
if ((es = pObjectDictionary->remove(tmpStr)) != Acad::eOk)
{
continue;
}
break;
}
}
pObjectDictionary->close();
delete pDictIter;
//<-
if (!hatchArray.isEmpty())
{
AcDbSortentsTable *pSortTable;
pBadBlockRecord->getSortentsTable(pSortTable,AcDb::kForWrite,true);
pSortTable->moveToBottom(hatchArray);
pSortTable->close();
}
}
//<-////////////////////////////////////////////////////////////////////////////////////////////////
в итоге. вроде все рисует правильно. и позволяет копипастом переносить блок в другой чертеж, сохраняя штриховку на заднем плане, НО, кусок кода функции importBlockToCurDWGDatabase, которая используется и для перетягивания штриховок в мой файл и в чертеж, где идет проверка на существование штриховки в AcDbSortentsTable выдает, что штриховки нет ни в корявом блоке (blockfile.dwg), ни в файле с уже якобы исправленной штриховкой (mydwg.dwg), хотя я пересоздаю словарь sortents и сохраняю dwg.
и еще. если взять блок их файла mydwg.dwg (там его вставить и перетянуть в другой файл), то sortents у этого блока почти пустой и там нет никаких упоминаний о штриховке, хоть и рисует правильно
, а если вставить блок через мою команду, то sortents большая (подозреваю, что там все объекты блока), упоминание о штриховке есть (ближе к началу таблицы).
короче говоря, механизмы видать разные для вставки, ну да ладно. вопрос в том, почему при вставке блока из МОЕГО файла функция
pSortTable->sortAs() говорит, что штриховку я так и не добавил, хотя при просмотре arxdbg штриховка есть. и вообще, можно ли пользоваться sortAs, если в описании говорится, что из-за своих внутренних алгоритмов результат не может быть надежным (сказочная функция).
есть еще другая функция -
getSortHandle. такая же сказочная
. но, если певая всегда говорит, что штриховки нет, то вторая всегда говорит, что штриховка есть даже в корявом блоке
.
может есть какой-то надежный способ, не ковыряя словарь вручную через resbuf, получить правдивую информацию о том, есть ли штриховка в таблице сортировки или нет. а то как-то неправильно будет все-все блоки переделывать.
----------------------------------------------------------------------------------------------------------------
продолжил ковыряться.
if (!hatchArray.isEmpty())
{
AcDbSortentsTable *pSortTable;
es = pBadBlockRecord->getSortentsTable(pSortTable,AcDb::kForRead);
if (es == Acad::eOk)
{
AcDbObjectIdArray idsDrawOrder;idsDrawOrder.removeAll();
pSortTable->getFullDrawOrder(idsDrawOrder);
for (int i = 0; i < hatchArray.length(); i++)
{
if (!idsDrawOrder.contains(hatchArray.at(i)))
{
needReCreate = true;
break;
}
}
pSortTable->close();
}
}
взял всю таблицу сортировки и проверил наличие в ней моей злополучной штриховки. таки она там есть, так что
getSortHandle была права. то я просто глазками не досмотрел в списке сортировки.
так что ж тогда получается. штриховка есть в блоке, штриховка есть в таблице сортировки даже в изначально корявом блоке. проверить правильная или неправильная штриховка в конкретном блоке (ну рассматриваем тот, который есть) нельзя не посмотрев на него глазами после вставки в чертеж копипастом, а ставить штриховку на задний план всех-всех блоков убивая при этом сортировку всех остальных элементов блока ... ну как-то совсем не правильно.