Мой вариант. Дополнительно добавляет ассоциативность.
static void ADDGRADHATCH(void)
{
ads_name ss;
AcDbObjectIdArray ids;
TCHAR* promptPtrs[] = { _T("\nВыберите объекты для штриховки: "), _T("\nУдалите из выбранного: ") };
if (acedSSGet(_T(":$"),promptPtrs,NULL,NULL,ss) != RTNORM) return;
acedGetCurrentSelectionSet(ids); acedSSFree(ss);
if (ids.length() == 0) return;
Acad::ErrorStatus es = Acad::eOk;
AcDbHatch *pHatch = new AcDbHatch();
pHatch->setDatabaseDefaults();
pHatch->setHatchObjectType(AcDbHatch::kGradientObject);
pHatch->setAssociative(true);
for (int i = 0; i < ids.length(); i++) {
AcDbObjectIdArray ids1; ids1.append(ids[i]);
pHatch->appendLoop(AcDbHatch::kDefault,ids1);
}
pHatch->setGradient(AcDbHatch::kPreDefinedGradient,_T("LINEAR"));
AcCmColor colors[2];
colors[0].setRGB(255,0,0); colors[1].setRGB(0,255,0);
float ff[2] = {0.0, 1.0};
pHatch->setGradientColors(2,colors,ff);
pHatch->evaluateHatch();
ids.setLogicalLength(0);
pHatch->getAssocObjIds(ids);
AcDbObjectId idHatch = postToDwgAndCloseWithId(pHatch);
// Добавляем ассоциативность
if (!idHatch.isNull() && ids.length() > 0) {
for (int i = 0; i < ids.length(); i++) {
AcDbEntityPointer pEnt(ids[i],AcDb::kForWrite);
if (pEnt.openStatus() == Acad::eOk) {
pEnt->addPersistentReactor(idHatch);
}
}
}
}