Как правильно создать ассоциативный AcDbHatch

Автор Тема: Как правильно создать ассоциативный AcDbHatch  (Прочитано 3131 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ParavozzzАвтор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Добрый день! Есть очень похожий вопрос.
Создаю ассоциативную штриховку для набора замкнутых полилиний. В зависимости от имени слоя замкнутая полилиния штрихуется со своим углом штриховки. Также для всех замкнутых полилиний задается масштаб штриховки 0,4. После выполнения команды, штриховка появляется. Ассоциативная. Но вот только масштаб штриховки прорисован как 1, а угол штриховки прорисован по умолчанию. Хотя в свойствах штриховок отображается масштаб 0,4 и угол отличный от дефолтного. Если я в свойствах руками меняю масштаб, то штриховка перерисовывается и угол отрисовки становится равным углу в свойствах.
Код - C++ [Выбрать]
  1. for (Adesk::Int32 i = 0; i < numberOfPolylines; i++)
  2.         {
  3.                 if (acedSSName(selectionSet, i, entiyAdsName) != RTNORM)
  4.                 {
  5.                         acedSSFree(selectionSet);
  6.                         return Acad::eUnrecoverableErrors;
  7.                 }
  8.  
  9.                 es = acdbGetObjectId(entityId, entiyAdsName);
  10.                 if (es != Acad::eOk)
  11.                 {
  12.                         //acutPrintf(L"\nНе получен Id");
  13.                         return es;
  14.                 }
  15.  
  16.                 es = acdbOpenAcDbEntity(pEntity, entityId, AcDb::kForRead);
  17.                 if (es != Acad::eOk)
  18.                 {
  19.                         //acutPrintf(L"\nНе открыть примитив для чтения");
  20.                         return es;
  21.                 }
  22.  
  23.                 sEntityLayerName = pEntity->layer();
  24.                 hatchAngle = 0 + rand() % 360;
  25.                 hatchOptionsMap.insert(std::pair<std::wstring, int>(sEntityLayerName, hatchAngle));
  26.  
  27.                 // Используем перегрузку функции AcDbLayerTable::getAt(), которая возвращает ID слоя
  28.                 es = pLayerTable->getAt (&sEntityLayerName[0], layerId, Adesk::kFalse);
  29.                
  30.                 AcDbHatch* pHatch = new AcDbHatch();
  31.                 // Set hatch plane
  32.                 AcGeVector3d normal(0.0, 0.0, 1.0);
  33.                 pHatch->setNormal(normal);
  34.                 pHatch->setElevation(0.0);
  35.                 // Set non associative hatch
  36.                 pHatch->setAssociative(Adesk::kFalse);
  37.                 // Set hatch pattern to ANSI31 type
  38.                 pHatch->setPattern(AcDbHatch::kPreDefined, L"ANSI31");
  39.                 // Set Associativity
  40.                 pHatch->setAssociative(Adesk::kTrue);
  41.                 // Set hatch style to kNormal
  42.                 pHatch->setHatchStyle(AcDbHatch::kNormal);
  43.                 pHatch->setPatternScale(0.4);
  44.                 pHatch->setLayer(layerId);
  45.                 pHatch->setPatternAngle(hatchOptionsMap[sEntityLayerName]);
  46.                 AcDbObjectIdArray entityIds;
  47.                 entityIds.append(entityId);
  48.                 // Append an internal loop (circle) to hatch boundary
  49.                 pHatch->appendLoop(AcDbHatch::kDefault, entityIds);
  50.                 // Elaborate solid fill
  51.                 pHatch->evaluateHatch();
  52.  
  53.                 // Get all associative source boundary object Ids for later use.
  54.                 entityIds.setLogicalLength(0);
  55.                 pHatch->getAssocObjIds(entityIds);
  56.                 //pHatch->draw();
  57.                 //добавляем штриховку к пространству модели
  58.                 pModelSpaceBlockTableRecord->appendAcDbEntity(hatchId, pHatch);
  59.                
  60.                 // Attach hatchId to all source boundary objects for notification.
  61.                 AcDbEntity *pEnt;
  62.                 int numObjs = entityIds.length();
  63.                 for (int j = 0; j < numObjs; j++)
  64.                 {
  65.                         es = acdbOpenAcDbEntity(pEnt, entityIds[j], AcDb::kForWrite);
  66.                         if (es == Acad::eOk)
  67.                         {
  68.                                 pEnt->addPersistentReactor(hatchId);
  69.                                 pEnt->close();
  70.                         }
  71.                 }
  72.                 pHatch->close();
  73.         }
  74.  
  75.         pLayerTable->close();
  76.         pModelSpaceBlockTableRecord->close();
  77.         pDocumentBlockTable->close();
  78.         acDocManager->unlockDocument(pActiveDoc);
  79.         return Acad::ErrorStatus::eOk;
  80.  


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Paravozzz,
Версия AutoCAD? Кстати, угол задаётся не в градусах, а в радианах.
« Последнее редактирование: 29-05-2018, 18:56:17 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Paravozzz 29-05-2018, 22:59:57

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
После задания угла (с учетом того, что угол должен быть в радианах):
Код - C++ [Выбрать]
  1. pHatch->setPatternAngle(hatchOptionsMap[sEntityLayerName]);
добавь строку:
Код - C++ [Выбрать]
  1. pHatch->setPattern(pHatch->patternType(),pHatch->patternName());
Ну и напоследок посмотри эту статью: http://adndevblog.typepad.com/autocad/2013/01/create-a-hatch-object-and-set-its-scale.html
В ней указано в каком порядке следует задавать свойства штриховке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ParavozzzАвтор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Paravozzz,
Версия AutoCAD? Кстати, угол задаётся не в градусах, а в радианах.
AutoCAD 2016.

Оффлайн ParavozzzАвтор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Александр Ривилис, Спасибо, помогла статья!