Создание контура на API5

Автор detrin, 25.08.16, 23:55:52

« назад - далее »

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

detrin

Подскажите, пожалуйста, как правильно собирать контур из примитивов? Пытаюсь через ksMakeEncloseContours указывая точку внутри контура
TestContour := doc.ksMakeEncloseContours(0, x,y);
Указатель на контур появляется, т.е. ошибки нет. Но самого контура нет на чертеже.

Ясно, что нет, Вы справку внимательно почитайте, функция возвращает указатель на временную группу, т.е. виртуальную, чтобы её добавить в документ и сделать постоянной нужно вызвать функцию ksStoreTmpGroup.
+ Благодарностей: 1

detrin

Благодарю, получилось.
Думал, что если поставил gr=0, то группа будет постоянная. А это оказывается входящий параметр. И примеров нигде толком не нашёл, все почему-то обходят Контур стороной((
Входные параметры:

gr
- временная группа
или 0, если требуются контуры в текущем виде,

psiv

Мне нужно создать макроэелемент, в который будут входить несколько примитивов, образующих контур, и заливка этого контура.
Применяю 3 составных объекта, кождый из которых должен заканчиваться методом ksEndObj.
1. Как их (ksEndObj) "разнести" по своимм объектам? Каждый по отдельности объект работает нормально, а одновременно никак...
2. Заливка удаляет примитивы, входящие в контур, хотя при ручном рисовании контур остается, приходится их рисовать еще раз, хочу применить временную группу и копировать.
3. Заливка "вылезает наверх", хотя при ручном рисовании заливка лежит ниже контура, приходится принудительно отправлять ее ниже всех.
4. Созданные позже примитивы тоже падают под ранее созданную заливка, хотя при ручном рисовании они лежат выше такой заливки.
Буду благодарен за любые советы.

doc.ksMtr(UGO_X,UGO_Y,0,1,1);
doc.ksMacro(0);
GroupID:=doc.ksNewGroup(0);
doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1);
doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
//  doc.ksEndObj;
doc.ksColouringEx(RGB(255,255,255),GroupID);
doc.ksChangeObjectsOrder(GroupID, doc.ksEndObj, co_Bottom);
doc.ksCopyObj (GroupID, 0,0,20,20,1,0);
doc.ksEndObj;


Напротив каждой строки напишите комментарий, что Вы делаете и у Вас к себе появятся вопросы.

psiv


doc.ksMtr(UGO_X,UGO_Y,0,1,1); // создание локальной системы координат - перенос нул¤ координат в указанную точку
doc.ksMacro(0); // начало создания макроэлемента
GroupID:=doc.ksNewGroup(0); // начало создания временной группы для последующего копирования контура
doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1); // создание примитивов
doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
//  doc.ksEndObj; // хотелось бы чтобы это было окончание создания группы
doc.ksColouringEx(RGB(255,255,255),GroupID); // начало создания заливки
doc.ksChangeObjectsOrder(GroupID, doc.ksEndObj, co_Bottom); // перенос заливки ниже всех, не работает, не разобрался
doc.ksCopyObj (GroupID, 0,0,20,20,1,0); // создание копии примитивов, входящих в контур, т.к. они исчезли
doc.ksEndObj; // где-то должны быть окончания создания заливки и макроэлемента, но не знаю где...


Вразумительные вопросы к себе, к сожалению, не появились...  :(

Создайте группу относительно нуля, создайте заливку и её границу, для начала, а потом можно будет добавить матрицу и её отмену, далее всё это сделать макроэлементом.

psiv

Sabahs, спасибо за подсказку. Кое-что получилось, кое-что - нет. 

  begin
    //  Запрашиваем у пользователя координаты точки вставки
  info := ksRequestInfo( kompas.GetParamStruct(ko_RequestInfo) );
if ( info <> nil ) then begin
info.Init;
info.commandsString := 'Укажите точку вставки';
if ( doc.ksCursor(info, UGO_X, UGO_Y, Nil) <> 0 ) then

//  Создаем группу и рисуем УГО
        UGO := doc.ksNewGroup(0);   
        doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
        doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
        if SIA_Shcit = True then
          doc.ksLineSeg(-UGO_Size/2,0,UGO_Size/2,0,1);
        doc.ksText(-2,1,0,2.5,0,0,SA_Fun_var);
        doc.ksText(-2,-3.5,0,2.5,0,0,SA_Poz_var);
        doc.ksEndGroup;   //  закрываем группу

    // создаем заливку и контур для нее
        doc.ksColouring(RGB(255,255,255));    // создать заливку
        doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
        doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
        Zalivka := doc.ksEndObj;

// Добавляем заливку в группу
        doc.ksAddObjGroup (UGO, Zalivka);

// создаем матрицу и переносим группу в указанную точку
        doc.ksMtr(UGO_X,UGO_Y,0,1,1);
        doc.ksTransformObj (UGO);
        doc.ksDeleteMtr;       
   
// создаем макроэлемента
        doc.ksMacro(0);              // начало создания макроэлемента
// ???
        doc.ksEndObj;               // завершение макроэлемента

  end;

Заливку получилось создать только повторным рисованием границы. Пытался предварительно создавать из элементов границы группу, но не получилось ее вставить между ksColouring и ksEndObj. Если это возможно, то как это делать?
С созданием макроэлемента тоже затык - как вставить группу? 
+ Благодарностей: 1

Как то так:
begin
    //  Запрашиваем у пользователя координаты точки вставки
     info := ksRequestInfo( kompas.GetParamStruct(ko_RequestInfo) );
      if ( info <> nil ) then begin
         info.Init;
         info.commandsString := 'Укажите точку вставки';
         if ( doc.ksCursor(info, UGO_X, UGO_Y, Nil) <> 0 ) then
        // создаем макроэлемента
        doc.ksMacro(0);              // начало создания макроэлемента
   doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
        doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
        if SIA_Shcit = True then
          doc.ksLineSeg(-UGO_Size/2,0,UGO_Size/2,0,1);
        doc.ksText(-2,1,0,2.5,0,0,SA_Fun_var);
        doc.ksText(-2,-3.5,0,2.5,0,0,SA_Poz_var);
     
    // создаем заливку и контур для нее
        doc.ksColouring(RGB(255,255,255));    // создать заливку
        doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
        doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
        Zalivka := doc.ksEndObj;
        UGO:=doc.ksEndObj;               // завершение макроэлемента

   // создаем матрицу и переносим группу в указанную точку   
        doc.ksMtr(UGO_X,UGO_Y,0,1,1);
        doc.ksTransformObj (UGO);
        doc.ksDeleteMtr;       

  end;

psiv

Спасибо, Sabahs, Ваш код работает, но мне хотелось бы ясности...
Ваше сегодняшнее решение отличается от Вашего совета от 17 ноября:
Цитировать- Создайте группу относительно нуля,
- создайте заливку и её границу,
- потом можно будет добавить матрицу и её отмену,
- далее всё это сделать макроэлементом.
Я и старался следовать предложенному порядку. Можете показать, как сделать именно в таком порядке?
Остались вопросы:
- можно ли в ksColouring передать группу?
- можно ли в ksMacro передать группу?

Я писал так, чтобы Вы сделали поэтапно для облегчения решения задачи, сделали одно получилось, пошли дальше и т.д.
Как вариант создаёте пустой макроэлемент и заливку и с помощью функции ksAddObjGroup добавляете в них группу.

psiv

Sabahs, будьте добры, подробнее о добавлении группы в макро.
У меня не получается...


        UGO := doc.ksNewGroup (0);
        doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
        doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
        if SIA_Shcit = True then
          doc.ksLineSeg(-UGO_Size/2,0,UGO_Size/2,0,1);
        doc.ksText(-2,1,0,2.5,0,0,SA_Fun_var);
        doc.ksText(-2,-3.5,0,2.5,0,0,SA_Poz_var);
        doc.ksEndGroup;

    // создаем заливку и контур для нее
        doc.ksColouring(RGB(255,255,255));
        doc.ksArcByAngle((UGO_Size/2-5),0,5,-90,90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),5,(UGO_Size/2-5),5,1);
        doc.ksArcByAngle((-UGO_Size/2+5),0,5,90,-90,1,1);
        doc.ksLineSeg((-UGO_Size/2+5),-5,(UGO_Size/2-5),-5,1);
        Zalivka := doc.ksEndObj;
        doc.ksChangeObjectsOrder (Zalivka, UGO, co_Bottom);
    // Добавляем заливку в группу
        doc.ksAddObjGroup (UGO, Zalivka);

   // создаем матрицу и переносим группу в указанную точку
        doc.ksMtr(UGO_X,UGO_Y,0,1,1);
        doc.ksTransformObj (UGO);
        doc.ksDeleteMtr;

        lbl := doc.ksMacro(0);              // создаем пустой макроэлемент
        MacroUGO:=doc.ksEndObj;             // завершение макроэлемента
        doc.ksAddObjGroup (MacroUGO, UGO);  // Добавляем группу в макроэлемент
        Label1.Caption := IntToStr(lbl);    // контроль создания макро

Чему равен MacroUGO?
Если нулю то дальнейшие телодвижения, уже бесполезны.
Пользуйтесь отладчиком и в код добавляйте проверки на то, что объект есть.
Есть подозрение, что матрицу применить нужно уже после всего.

psiv

Разумеется MacroUGO = 1, было бы 0, то искал бы проблему сам.
Макро создается, но группа в него не добавляется.
Если матрицу применить уже после всего, то если переносить группу UGO, то результат тот же, если переносить макроэлемент, то не переносится, т.к. он пуст.

Тогда нужно добавлять через редактирование макроэлемента, вопрос в том, а не проще остановиться на первом варианте, зачем усложнять себе жизнь?

psiv

Да, макроэлемент создавать предложенным Вами способом проще.
Но при создании заливки дублировать код рисования элементов контура мне кажется не совсем правильно...
Вот и хотелось мне научиться делать правильно, т.к. ksColouring у меня не принимает группу, так же как и doc.ksMacro. Думал, причина была одинакова, следовательно и решение было бы похожим.

Чтобы не дублировать код, сделать его отдельной функцией.
+ Благодарностей: 1

psiv

Да, спасибо, попробую.
А добавить группу в макро получилось с помощью ksUpdateMacro.