Тема: Как программно определить штриховку с островами ?

Если я правильно все понял, то для создания штриховки можно передавать массив ID объектов, которые участвуют в штриховке (либо контур, либо островки). Элементы естественно замкнутые (все полилинии).
Но получается весьма забавно. В БД акада штриховка есть, а вот на чертеже ее не наблюдается.
Помоему все дело в evaluateHatch. Уж очень странный возврат из нее идет.
Кстати. вот моя функция.
Может кто знает в чем тут дело.

AcDbObjectId makeFill(AcDbObjectIdArray objIds,
            const char* Layer,
            Adesk::UInt16 Color)
{
    Acad::ErrorStatus es;
    AcDbObjectId hatchId;
    if(objIds == NULL) return NULL;
    AcDbHatch* pHatch = new AcDbHatch();
    AcGeVector3d normal(0.0, 0.0, 1.0);
    es = pHatch->setNormal(normal);
    es = pHatch->setElevation(0.0);
    es = pHatch->setAssociative(Adesk::kFalse);
    es = pHatch->setPattern(AcDbHatch::kPreDefined, "SOLID");
    es = pHatch->setHatchStyle(AcDbHatch::kNormal);
    es = pHatch->appendLoop(AcDbHatch::kExternal, objIds);
    es = pHatch->setColorIndex(Color);
    if ( Layer != NULL )es = pHatch->setLayer(Layer);
    es = pHatch->evaluateHatch();
      postToDatabase(pHatch, hatchId); // здесь идет запись в BD
    es = pHatch->upgradeOpen();
    es = pHatch->draw();
      es = pHatch->close();
    return hatchId;
}

Re: Как программно определить штриховку с островами ?

> Николай
Для каждого островка нужен свой
pHatch->appendLoop(AcDbHatch::kDefault, objIds);
При этом в objectIds содержится IDs только тех объектов, которые этот островок образуют. Если это, как ты писал, замкнутая полилиния) то в массиве только один IDs этой полилинии. И вообще посмотри внимательнее в Help'е описание класса AcDbHatch - там есть примеры.

Re: Как программно определить штриховку с островами ?

Все. Разобрался. Спасибо за помощь.
Оказалось, что вместо es = pHatch->appendLoop(AcDbHatch::kExternal, objIds);
нужно было вставить такой код. Еще раз спасибо.

    for (int i = 0; i < objIds.length(); i++)
    {
        AcDbObjectIdArray Ids;
        Ids.setLogicalLength(0);
        Ids.append(objIds.at(i));
        es = pHatch->appendLoop(AcDbHatch::kDefault, Ids);
    }

Re: Как программно определить штриховку с островами ?

> Николай
Небольшое замечание. Если уж ты создаешь AcDbObjectIdArray внутри цикла, то Ids.setLogicalLength(0); - лишнее.
А мне больше нравится так:

AcDbObjectIdArray Ids; Ids.setLogicalLength(1);
for (int i = 0; i < objIds.length(); i++)
{
  Ids[0] = objIds[i];
  es = pHatch->appendLoop(AcDbHatch::kDefault, Ids);
}

Но это на любителя! :)

Re: Как программно определить штриховку с островами ?

> Александр Ривилис
А можно наверное и так:
for(int i = 0; i < objIds.length(); i++)
{
   es = pHatch->appendLoop(AcDbHatch::kDefault, objIds[i]);
}

Re: Как программно определить штриховку с островами ?

> CheVik
Метод appendLoop принимает массив AcDbObjectId (т.е. AcDbObjectIdArray), а не отдельный AcDbObjectId. Так что этот вариант не проходит.