27/03/2016
Установка цвета всем граням твёрдого тела
Ниже вы видите код, который показывает как пройти по всем граням твердого тела и покрасить каждую из граней в свой цвет:
Код - C++: [Выделить]
- static void TestBrep(void)
- {
- Adesk::Int32 len;
- ads_name ssname0;
- struct resbuf *buffer;
- buffer = acutBuildList(RTDXF0, _T("3DSOLID"), RTNONE);
- acutPrintf(_T("\nВеберите Ящик:"));
- acedSSGet(NULL, NULL, NULL, buffer, ssname0);
- acutRelRb(buffer);
- if (RTNORM == acedSSLength(ssname0, &len))
- {
- ads_name ent;
- AcDbObjectId entId;
- for(long k = 0; k < len; k++)
- {
- acedSSName(ssname0, k, ent);
- acdbGetObjectId(entId, ent);
- settingDifferentColorToEachFace(entId);
- }
- acedSSFree(ssname0);
- }
- }
- static void settingDifferentColorToEachFace(AcDbObjectId solidId)
- {
- AcCmColor specialColor;
- AcDb3dSolid* pSolid;
- if (Acad::eOk == acdbOpenObject(pSolid, solidId, AcDb::kForRead))
- {
- AcDbFullSubentPath path(solidId, AcDbSubentId());
- AcBrBrep brep;
- AcBr::ErrorStatus bs = brep.setSubentPath(path);
- if (bs != AcBr::eOk)
- return;
- // Инициализируем проход BrepFace
- AcBrBrepFaceTraverser bft;
- bs = bft.setBrep(brep);
- if (bs != AcBr::eOk)
- return;
- AcArray<AcDbSubentId> arrSubentId;
- // Выполняем проход по всем граням
- for ( ; !bft.done(); bft.next())
- {
- AcBrFace face;
- bs = bft.getFace(face);
- if (bs != Acad::eOk)
- {
- acutPrintf(L"\nОшибка getFace");
- break;
- }
- AcDbFullSubentPath Path(kNullSubent);
- AcDbSubentId subentId;
- AcBr::ErrorStatus bss = face.getSubentPath(Path);
- subentId = Path.subentId();
- arrSubentId.append(subentId);
- }
- pSolid->upgradeOpen();
- for (int i = 0; i < arrSubentId.length(); i++)
- {
- specialColor.setColorIndex(i);
- pSolid->setSubentColor(arrSubentId[i],specialColor);
- }
- pSolid->downgradeOpen();
- }
- pSolid->close();
- }
Источник: http://adndevblog.typepad.com/autocad/2016/03/setting-color-to-each-face-of-solid.html
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=6991
Опубликовано 27.03.2016