Заливка

Автор Аleks, 24.04.04, 10:36:23

« предыдущая - следующая »

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

Аleks

Привет!
Не могу найти функцию заливки площади, например, как при стандартном расчете площади.
Подскажите пожалуйста что это за функция.

ViСТоr


Аleks

ViCTor, спасибо!!!

ViСТоr

Еще есть полезная функция: ksMakeEncloseContour которая вернет замкнутую группу объектов по точке по параметрам данных объектов можно построить заливку.

Аleks

да. эта функция в хелпе есть, вместе со штриховкой, удобная вешчь:)

Prog2

Здравствуйте! Подниму тему.

Хочу залить цветом фигуру (например, прямоугольник), чтобы на чертеже она заслоняла собой другие объекты, лежащие по порядку "ниже".

  long gr1, gr2, Macro;
  int x=-50;

  gr1=pDoc->ksNewGroup(0);   // рисуем прямоугольник
   pDoc->ksLineSeg(0, 0, 0, x, 1);
   pDoc->ksLineSeg(0, x, x, x, 1);
   pDoc->ksLineSeg(x, x, x, 0, 1);
   pDoc->ksLineSeg(x, 0, 0, 0, 1);
  pDoc->ksEndGroup();

  gr2=pDoc->ksColouringEx(-1, pDoc->ksMakeEncloseContours(0, x/2, x/2 ));   // создаём заливку внутри контура


Если остановиться на этом, всё отрабатывает: заливка действительно создаётся и может перекрывать другие объекты на чертеже.
НО мне необходимо объеденить заливку и прямоугольник в макроэлемент:


  pDoc->ksMacro(0);
  Macro=pDoc->ksEndObj();
  pDoc->ksAddObjectToMacro(Macro, gr2);
  pDoc->ksAddObjectToMacro(Macro, gr1);


Объединение происходит, но заливка в этом случает получается "прозрачной" и не заслоняет др. объекты. Если вручную рарушить макроэлемент, а затем вручную опять его создать, то заливка опять отрабатывает правильно.  Такой вариант меня не устраивает.

Подскажите, как корректно программно залить фигуру цветом и объединить в макроэлемент?

Prog2

Методом проб пришёл к выводу, что косяк проявляется именно при вызове:


pDoc->ksAddObjectToMacro(Macro, gr2);

//gr2 - группа, содержащая заливку;
//Macro - какой-либо макроэлемент (вообще не важно, что он содержит).


После этого вызова заливка добавлена в макро, но "прозрачна" (словно не активирована???).

Кто-нибудь сталкивался с подобным? Как "активировать" заливку в макро?

prog1

             Doc.ksChangeObjectsOrder(GRMainRect,0,2);
GRMainRect-эта группа опускается ниже всех.
Удачи!

Prog2

Огромное спасибо, prog1!!! Работает, как надо.

Вот рабочий кусок кода:


  long gr1, Macro;
  int x=-50;

  // Создаём группу.
  gr1=pDoc->ksNewGroup(0);
    pDoc->ksLineSeg(0, 0, 0, x, 1); // Рисуем прямоугольник
    pDoc->ksLineSeg(0, x, x, x, 1);
    pDoc->ksLineSeg(x, x, x, 0, 1);
    pDoc->ksLineSeg(x, 0, 0, 0, 1);
      pDoc->ksColouringEx(-1, pDoc->ksMakeEncloseContours(0, x/2, x/2)); // Создаём заливку фоновым цветом внутри контура
  pDoc->ksEndGroup();
  // Т.е. прямоугольник вместе с заливкой оказались в группе gr1

  pDoc->ksLineSeg(-2*x, -2*x, 2*x, 2*x, 1); // Для наглядности рисуем отрезок, пересекающий прямоугольник

  pDoc->ksChangeObjectsOrder(gr1, 0, 1); // Устанавливаем отрисовку группы gr1 поверх всех объектов.

  pDoc->ksMacro(0); // Создаём макроэлемент
  Macro=pDoc->ksEndObj();
  pDoc->ksAddObjectToMacro(Macro, gr1); // Добавляем группу gr1 в макроэлемент.


  // На чертеже видим, что отрезок оказался "рассечён" прямоугольником, что и требовалось!!!.