"Изменить порядок -> Впереди всех"

Автор psiv, 02.06.20, 11:04:45

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

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

psiv

Подскажите, пожалуйста, как программно выполнить команду "Изменить порядок -> Впереди всех".

msvteh

смотрите функцию в API
ksChangeObjectsOrder (reference group, reference obj, int orderType) - Изменить порядок отрисовки объектов чертежа
входной параметр orderType = co_Top 1 Выше всех
 


psiv

#2
Спасибо за совет.
Но не получается...
Вариант 1
  iDoc.ksMacro(0);
  gr := iDoc.ksNewGroup(0);
  iDoc.ksCircle(UGOX, UGOY, 5, 1);
  iDoc.ksEndGroup;
  obj := iDoc.ksColouring($FFFFFF); // заливка
  iDoc.ksChangeObjectsOrder(gr, obj, co_Top);
  iDoc.ksCircle(UGOX, UGOY, 5, 1);
  iDoc.ksEndObj;

Вариант 2
  iDoc.ksMacro(0);
  iDoc.ksLineSeg(UGOX - 5, UGOY + 15, UGOX + 5 , UGOY + 15, 7);
  iDoc.ksLineSeg(UGOX, UGOY + 15, UGOX, UGOY - 15, 7);
  gr := iDoc.ksNewGroup(0);
  iDoc.ksCircle(UGOX, UGOY, 5, 1);
  iDoc.ksEndGroup;
  obj := iDoc.ksNewGroup(0);
  iDoc.ksColouring($FFFFFF); // заливка
  iDoc.ksCircle(UGOX, UGOY, 5, 1);
  iDoc.ksEndGroup;
  iDoc.ksChangeObjectsOrder(gr, obj, co_Top);
  iDoc.ksEndObj;

Вариант 3
  iDoc.ksMacro(0);
  gr := iDoc.ksNewGroup(0);
  iDoc.ksColouring($FFFFFF); // заливка
  iDoc.ksCircle(UGOX, UGOY, 5, 1);
  iDoc.ksEndGroup;
  obj :=  iDoc.ksCircle(UGOX, UGOY, 5, 1);
  iDoc.ksChangeObjectsOrder(gr, obj, co_Bottom);
  iDoc.ksEndObj;
Результат одинаков.
1.jpg
Да, при закрытии Компаса было сообщение "Неверный указатель группы".
Как поправить?

Всё правильно пишет, создали макроэлемент, создали группу, завершили запись в группу, создали заливку и пытаетесь менять порядок, чего?
У Вас не завершена заливка и ни в одном варианте не закончен макроэлемент, что КОМПАС должен делать, с этим не завершённом строительством?

psiv

 
iDoc.ksMacro(0); // создал макроэлемент
      iDoc.ksNewGroup(0); // создал группу
      iDoc.ksCircle(UGOX, UGOY, 5, 1); // создал окружность
      UGO := iDoc.ksEndGroup; // завершил группу
      iDoc.ksColouring($FFFFFF); // создал заливку
      iDoc.ksCircle(UGOX, UGOY, 5, 1); // создал контур для заливки
      Zalivka := iDoc.ksEndObj; // завершил заливку
      iDoc.ksChangeObjectsOrder(UGO, Zalivka, co_Top); // изменил порядок
iDoc.ksEndObj;       // завершил макроэлемент

Тоже "Неверный указатель группы"...

Вы, вообще SDK, читаете?
Указатель, возвращается при создании.
Я, так бы делал, а потом думал, что не получается.
iDoc.ksMacro(0); // создал макроэлемент
      UGO:=iDoc.ksNewGroup(0); // создал группу
      iDoc.ksCircle(UGOX, UGOY, 5, 1); // создал окружность
      iDoc.ksEndGroup; // завершил группу
      iDoc.ksColouring($FFFFFF); // создал заливку
      iDoc.ksCircle(UGOX, UGOY, 5, 1); // создал контур для заливки
      Zalivka:=iDoc.ksEndObj; // завершил заливку
      iDoc.ksChangeObjectsOrder(UGO, Zalivka, co_Top); // изменил порядок
iDoc.ksEndObj;       // завершил макроэлемент

psiv

SDK читаю, мало что в нем понимаю...
Создал новый проект, ничего лишнего.
Не работает.
Что не так?

unit Unit1; // Работа с заливкой
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ComObj, LDefin2D, ksTLB;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  iKompas: KompasObject;
  iDoc: Document2D;
  UGO: Reference;
  Zalivka: Reference;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  // подключаемся к компас
  if iKompas = nil then
  begin
    iKompas := KompasObject(GetActiveOleObject('Kompas.Application.5'));
    // подключение к уже запущенному экземпляру Компаса
    if iKompas <> nil then
      iKompas.Visible := True;
  end;
  iDoc := ksDocument2D(iKompas.Document2D);
  iDoc := ksDocument2D(iKompas.ActiveDocument2D);
  iDoc.ksMacro(0); // создал макроэлемент
  UGO := iDoc.ksNewGroup(0); // создал группу
  ShowMessage(IntToStr(UGO));  // показывает 10-разрядный указатель на группу
  iDoc.ksCircle(0, 0, 5, 1); // создал окружность
  iDoc.ksEndGroup; // завершил группу
  iDoc.ksColouring($FFFFFF); // создал заливку
  iDoc.ksCircle(0, 0, 5, 1); // создал контур для заливки
  Zalivka := iDoc.ksEndObj; // завершил заливку
  iDoc.ksChangeObjectsOrder(UGO, Zalivka, co_Top); // изменил порядок
  iDoc.ksEndObj; // завершил макроэлемент
end;
end.

Так, проект нужно прикреплять, а не картинки.

psiv


И я приложу, библиотеку и код, можете разбираться.
Step1.rar

psiv

Цитата: Sabahs от 03.06.20, 22:18:40И я приложу, библиотеку и код, можете разбираться.
Очередное большое спасибо, почти разобрался...
Остался не выясненным один вопрос - почему при объединении заливки и окружности в макроэлемент заданный порядок не выполняется и возникает ошибка "Неверный указатель группы".
Это работает:
//iDoc.ksMacro(0); // создал макроэлемент
UGO := iDoc.ksNewGroup(0); // создал группу
iDoc.ksColouring($FF33FF); // создал заливку
iDoc.ksCircle(0,5,5,1); // создал контур для заливки
Zalivka:=IDoc.ksEndObj; // завершил заливку
iDoc.ksEndGroup; // завершил группу
Okrug:=iDoc.ksCircle(0,0,5,1); // создал окружность
iDoc.ksChangeObjectsOrder(UGO,Okrug,co_Bottom); // изменил порядок
//iDoc.ksEndObj; // завершил макроэлемент
А это не работает:
iDoc.ksMacro(0); // создал макроэлемент
UGO := iDoc.ksNewGroup(0); // создал группу
iDoc.ksColouring($FF33FF); // создал заливку
iDoc.ksCircle(0,5,5,1); // создал контур для заливки
Zalivka:=IDoc.ksEndObj; // завершил заливку
iDoc.ksEndGroup; // завершил группу
Okrug:=iDoc.ksCircle(0,0,5,1); // создал окружность
iDoc.ksChangeObjectsOrder(UGO,Okrug,co_Bottom); // изменил порядок
iDoc.ksEndObj; // завершил макроэлемент


psiv

Похоже, эта же причина вызывает и другой недостаток: https://forum.ascon.ru/index.php?topic=28313.new#new

Чьи, это недостатки, решать не мне, а макроэлементы разные бывают.
https://www.youtube.com/watch?v=S8qv4pfPdeY

psiv

Ну, трехмерку я знаю еще хуже программирования, комментировать не буду.
А с Вашим утверждением о том, что макроэлементы разные бывают, соглашусь - такой выкрутас решает мои две проблемы:
UGO := iDoc.ksNewGroup(0); // создал группу
iDoc.ksColouring($FF33FF); // создал заливку
iDoc.ksCircle(0,5,5,1); // создал контур для заливки
Zalivka:=IDoc.ksEndObj; // завершил заливку
Okrug:=iDoc.ksCircle(0,0,5,1); // создал окружность
obj := iDoc.ksText(0, -1, 0, 2.5, 1, 0, '123'); // создал текст
iDoc.ksSetTextAlign(obj, 1); // выровнял текст по центру
iDoc.ksEndGroup; // завершил группу
iDoc.ksChangeObjectsOrder(UGO,Okrug,co_Bottom); // изменил порядок
iDoc.ksMacro(0); // создал макроэлемент
Macr := iDoc.ksEndObj; // завершил макроэлемент
iDoc.ksUpdateMacro(Macr, UGO); // добавил группу в макроэлемент