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

ADN Club => ObjectARX => Тема начата: Paravozzz от 29-05-2018, 17:11:12

Название: Как правильно создать ассоциативный AcDbHatch
Отправлено: Paravozzz от 29-05-2018, 17:11:12
Добрый день! Есть очень похожий вопрос.
Создаю ассоциативную штриховку для набора замкнутых полилиний. В зависимости от имени слоя замкнутая полилиния штрихуется со своим углом штриховки. Также для всех замкнутых полилиний задается масштаб штриховки 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.  

Название: Re: Как правильно создать ассоциативный AcDbHatch
Отправлено: Александр Ривилис от 29-05-2018, 17:20:23
Paravozzz,
Версия AutoCAD? Кстати, угол задаётся не в градусах, а в радианах.
Название: Re: Как правильно создать ассоциативный AcDbHatch
Отправлено: Александр Ривилис от 29-05-2018, 19:00:39
После задания угла (с учетом того, что угол должен быть в радианах):
Код - 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
В ней указано в каком порядке следует задавать свойства штриховке.
Название: Re: Как правильно создать ассоциативный AcDbHatch
Отправлено: Paravozzz от 29-05-2018, 21:59:50
Paravozzz,
Версия AutoCAD? Кстати, угол задаётся не в градусах, а в радианах.
AutoCAD 2016.
Название: Re: Как правильно создать ассоциативный AcDbHatch
Отправлено: Paravozzz от 29-05-2018, 22:01:07
Александр Ривилис, Спасибо, помогла статья!