не прорисовывается штриховка

Автор Тема: не прорисовывается штриховка  (Прочитано 14184 раз)

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

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34

От такая проблемка. Заштриховывается узкий замкнутый контур штриховкой НЕ solid с заданным масштабом. Иногда бывает такая ситуация, что ни одного элемента штриховки в данный контур не попадает (ну я так думаю) при заданном масштабе (вот такая поганая штриховка ))) но от этого никуда не деться. на рисунке как раз два таких контура. левый получился корявым). Самое смешное, что все возвраты функций AcDbHatch идут eOk. Ну и собственно вопрос, КАК понять, какой сюрприз подбросит автокад при штриховании очередного контура (заштрихует ли указанным типом штриховки или просто зальет черным цветом)?
Иногда бывает так, что достаточно передернуть масштаб вручную (например, +\- 0.2, а потом вернуть  в исходный в диспетчере свойств), чтоб начала отображаться штриховка, иногда это не помогает.
PS: если нужно, код могу кинуть. От версии автокада не зависит, проверял и в 2010 и в 2015. по сути, картина та же.

Отмечено как Решение Николай Горлов 27-04-2015, 12:06:03

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: не прорисовывается штриховка
« Ответ #1 : 24-04-2015, 11:34:54 »
Ну и собственно вопрос, КАК понять, какой сюрприз подбросит автокад при штриховании очередного контура (заштрихует ли указанным типом штриховки или просто зальет черным цветом)?
Никак. Но можешь после создания штриховки попытаться её проанализировать. Например, при помощи AcDbHatch::getHatchLinesData
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: не прорисовывается штриховка
« Ответ #2 : 24-04-2015, 12:14:09 »
Спасибо, в принципе помогло. Но только с теми штриховками, которых действительно не видно в указанных рамках. А вот с таким интересным результатом, возвращает начала и концы отрезков, но рисует залитый контур. а если поклацать данные для этого контура в диспетчере свойств, то начинает рисовать нормально.


ну, чтоб было понятней, приведу кусок кода
Код - C++ [Выбрать]
  1. AcGePoint2dArray arSt,arEnd;
  2. es = pHatch->getHatchLinesData(arSt,arEnd);
  3. pHatch->close();
  4. if (es == Acad::eOk && arSt.isEmpty() && arEnd.isEmpty())
  5. { // <- сюда не заходит, значит есть начала и концы отрезков. но по прежнему закрашивает цветом
  6.         deleteEntities(eId);
  7.         return NULL;
  8. }
  9. else
  10.         return eId;
  11.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: не прорисовывается штриховка
« Ответ #3 : 24-04-2015, 12:40:55 »
Ну это явно баг AutoCAD. А интересно какое количество отрезков показывает в случае когда заливает цветом? Может по этому критерию можно отсечь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: не прорисовывается штриховка
« Ответ #4 : 27-04-2015, 12:05:55 »
в общем так. создавалась штриховка. там шла проверка на то, получилась она или нет. проверка выдавала ШЕСТЬ отрезков.
дальше по коду штриховке устанавливалась уникальная нулевая точка, ну и собственно говоря, после этого проверки не было. уже поставил (теперь корректно удаляется).
но вот что интересно, если без этой самой проверки редактировать просто масштаб (меньше/больше и в исходное состояние), то она начинала рисоваться даже с неправильной точкой вставки (проверил. точка вставки в диспетчере не меняется).
в общем, дело ясное, что дело темное  :o.

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: не прорисовывается штриховка
« Ответ #5 : 29-04-2015, 11:04:16 »
а вот еще интересный вариант. автокад не пересчитал штриховку относительно её новой базовой точки (внешний вид первой и второй штриховки разный, хоть в диспетчере свойств координата базовой точки одинаковая)

Создается штриховка. потом (после создания уже в другой функции) ей принудительно меняется базовая точка вот таким кодом
Код - C++ [Выбрать]
  1. AcDbObjectId hatchId = addHatch(...);
  2. if (hatchId != NULL)
  3. {
  4.         object_SendAfterTaget(hatchId,contId);
  5.         resIds.append(hatchId);
  6. }
  7. AcDbObjectPointer<AcDbHatch> pHatchPtr(hatchId,AcDb::kForWrite);
  8. if (pHatchPtr.openStatus () == Acad::eOk)
  9. {
  10.         AcGePoint2d originPoint2dUCS = AcGePoint2d(0.0,0.0);
  11.         AcGePoint3d pTempPt = pt_ll; // левый нижний угол прямоугольничка, который нужно заштриховать
  12.         acdbUcs2Wcs(asDblArray(pTempPt),asDblArray(pTempPt),false);
  13.         originPoint2dUCS.x = pTempPt.x;
  14.         originPoint2dUCS.y = pTempPt.y;
  15.         Acad::ErrorStatus es;
  16.         es = pHatchPtr->setOriginPoint(originPoint2dUCS); // выставить базовую точку . возврат - eOk
  17.         es = pHatchPtr->setPattern(AcDbHatch::kPreDefined, pColumnData.at(i).hatchName.GetString()); // на всякий случай еще раз указать имя. возврат - eOk
  18.         es = pHatchPtr->evaluateHatch(); // пересчитать. возврат - eOk
  19.         es = pHatchPtr->draw(); // отрисовать. возврат - eOk
  20.  
  21.         AcGePoint2dArray arSt,arEnd;
  22.         es = pHatchPtr->getHatchLinesData(arSt,arEnd);
  23.         pHatchPtr->close();
  24.         if (es == Acad::eOk && arSt.isEmpty() && arEnd.isEmpty())
  25.                 deleteEntities(hatchId);
  26. }
  27.