ADN Open CIS
Сообщество программистов Autodesk в СНГ

27/03/2016

Установка цвета всем граням твёрдого тела

Ниже вы видите код, который показывает как пройти по всем граням твердого тела и покрасить каждую из граней в свой цвет:

Код - C++: [Выделить]
  1. static void TestBrep(void)
  2. {
  3.   Adesk::Int32 len;
  4.   ads_name  ssname0;
  5.  
  6.   struct resbuf *buffer;
  7.  
  8.   buffer = acutBuildList(RTDXF0, _T("3DSOLID"), RTNONE);
  9.  
  10.   acutPrintf(_T("\nВеберите Ящик:"));
  11.  
  12.   acedSSGet(NULL, NULL, NULL, buffer, ssname0);
  13.  
  14.   acutRelRb(buffer);
  15.  
  16.   if (RTNORM == acedSSLength(ssname0, &len))
  17.   {
  18.     ads_name  ent;
  19.     AcDbObjectId entId;
  20.     for(long k = 0; k < len; k++)
  21.     {
  22.       acedSSName(ssname0, k, ent);
  23.       acdbGetObjectId(entId, ent);
  24.       settingDifferentColorToEachFace(entId);
  25.     }
  26.     acedSSFree(ssname0);
  27.   }
  28. }
  29.  
  30. static void settingDifferentColorToEachFace(AcDbObjectId solidId)
  31. {
  32.   AcCmColor specialColor;
  33.   AcDb3dSolid* pSolid;
  34.   if (Acad::eOk == acdbOpenObject(pSolid, solidId, AcDb::kForRead))
  35.   {
  36.     AcDbFullSubentPath path(solidId, AcDbSubentId());
  37.     AcBrBrep brep;
  38.     AcBr::ErrorStatus bs = brep.setSubentPath(path);
  39.     if (bs != AcBr::eOk)
  40.       return;
  41.  
  42.     // Инициализируем проход BrepFace
  43.  
  44.     AcBrBrepFaceTraverser bft;
  45.     bs = bft.setBrep(brep);
  46.     if (bs != AcBr::eOk)
  47.       return;
  48.  
  49.     AcArray<AcDbSubentId> arrSubentId;
  50.  
  51.     // Выполняем проход по всем граням
  52.  
  53.     for ( ; !bft.done(); bft.next())
  54.     {
  55.       AcBrFace face;
  56.       bs = bft.getFace(face);   
  57.       if (bs != Acad::eOk)
  58.       {
  59.         acutPrintf(L"\nОшибка getFace");
  60.         break;
  61.       }
  62.  
  63.       AcDbFullSubentPath    Path(kNullSubent);
  64.       AcDbSubentId          subentId;
  65.       AcBr::ErrorStatus bss = face.getSubentPath(Path);
  66.       subentId = Path.subentId();
  67.       arrSubentId.append(subentId);
  68.     }
  69.  
  70.     pSolid->upgradeOpen();
  71.  
  72.     for (int i = 0; i < arrSubentId.length(); i++)
  73.     {
  74.       specialColor.setColorIndex(i);
  75.       pSolid->setSubentColor(arrSubentId[i],specialColor);
  76.     }
  77.  
  78.     pSolid->downgradeOpen();
  79.  
  80.   }
  81.  
  82.   pSolid->close();
  83.  
  84. }

 

 

Источник: 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