Delphi. Прикрепить прямоугольник к указателю мыши.

Автор alice_liddell, 24.06.17, 13:55:59

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

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

alice_liddell

Здравствуйте! Пишу библиотеку на Delphi для Компаса V16. Мне нужно на форме Делфи задать размеры прямоугольника, после чего перейти в Компас, "прикрепить" этот прямоугольник к указателю мыши и разместить прямоугольник в нужном месте на документе. Подскажите, пожалуйста, как это можно сделать? Надеюсь, понятно объяснила.

Смотрите пример, версия Компас, может быть другой.
c:Program FilesASCONKOMPAS-3D v17SDKSamplesPascalDELPHIAUTOstep4

alice_liddell

Примеры из SDK не компилируются (см. скриншот), как исправить ошибку, без понятия. Посмотрела сам код, нужно разбираться с функцией CallBackProcCursor?


alice_liddell

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

Да всё, как обычно, открываю проект, выбираю платформу и компилирую.
В папке bin нет файла, как у вас на картинке.

alice_liddell

Продолжаю биться с Delphi и Компасом :) Создаю чертёж, вызываю форму для рисования отрезка. По нажатию на кнопку "Готово" вылезает ошибка (см. вложение).Нужно прикрепить этот отрезок к курсору и разместить его по нажатию на ЛКМ. Код взят из step4. Проект также прикрепила.

Так пользуйтесь отладчиком.
Рекомендую посмотреть эту тему и в отладчике поработать с примером Step4 из SDK.
+ Благодарностей: 1

alice_liddell

Код вроде написан верно, но ничего не прикрепляется, да и командное окно не выводится... Что не так, не подскажете? Не могу понять.

unit fopmer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, LDefin2D, ksConstTLB, ksAuto, ksTLB;

procedure DrawGruz();
                             
type
  TMainForm = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    button1: TButton;
    procedure button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;
  Document2D: ksDocument2D;
  kompas: KompasObject;
  _type, flag: Integer;
  a, b, c, d: Double;

implementation

{$R *.dfm}

procedure DrawGruz();
type
  figType=(ftCircle=1, ftTriangle, ftSquare);
var
  j         : Integer;
  phan      : ksPhantom;
  t1        : ksType1;
  info      : ksRequestInfo;
  x, y, ang : Double;
  flag      : Integer;
  fEndCycle : Bool;
  resCode   : LongInt;
  Fig       : figType;
begin
  phan:=ksPhantom(kompas.GetParamStruct(ko_Phantom));
  if (phan <> nil) then
  begin
    phan.Init;
    phan.phantom:=1;;
    t1 := ksType1( phan.GetPhantomParam );
    if (t1 <> nil) then
    begin
      t1.Init;
      //координаты базовой точки группы
      t1.xBase:=0;
      t1.yBase:=0;
      t1.scale_:=1;
      t1.gr:=0;

      info := ksRequestInfo( kompas.GetParamStruct(ko_RequestInfo) );
      info.title:=StringToOleStr('Выбор фигуры');
      info.commandsString:=StringToOleStr('!Окружность !Треугольник !Квадрат');

      Fig:=ftCircle;
      fEndCycle := false;
      flag:=1;
      while (fEndCycle <> true) do
        begin
          t1.gr:=Document2D.ksNewGroup( 1 );
          case Fig of
            ftCircle: begin    //круг
              Document2D.ksCircle(0, 0, 20, 1);
               end;
            ftTriangle: begin  //треугольник
              Document2D.ksLineSeg(-10, 0, 10, 0, 1);
              Document2D.ksLineSeg(10, 0, 0, 20, 1);
              Document2D.ksLineSeg(0, 20, -10, 0, 1);
            end;
            ftSquare: begin  //квадрат
              Document2D.ksLineSeg(-10, 0, 10, 0, 1);
              Document2D.ksLineSeg(10, 0, 10, 20, 1);
              Document2D.ksLineSeg(10, 20, -10, 20, 1);
              Document2D.ksLineSeg(-10, 20, -10, 0, 1);
            end;
          end;
          Document2D.ksEndGroup();

          if (Fig=ftCircle) then
            resCode:=Document2D.ksCursor(info, x, y, phan)
          else
            resCode:=Document2D.ksPlacement(info, x, y, ang, phan);

          case (resCode) of
            0: begin
              fEndCycle:= true;
               end;
            1: begin
              Fig:=ftTriangle;
            end;
            2: begin
              Fig:=ftSquare;
            end;
            3: begin
              Fig:=ftCircle;
               end;
            -1: begin
              Document2D.ksMoveObj(t1.gr, x, y);
              if (Abs(ang) > 0.01) then
                Document2D.ksRotateObj(t1.gr, x, y, ang);
              Document2D.ksStoreTmpGroup(t1.gr);
              Document2D.ksDeleteObj(t1.gr); 
            end;
          end;
          Document2D.ksClearGroup(t1.gr, true);
          Document2D.ksDeleteObj(t1.gr);
        end;
    end;
  end;
end;

procedure TMainForm.button1Click(Sender: TObject);
begin
  kompas := KompasObject(CreateKompasObject);
  if kompas <> nil then
  begin
    DrawGruz();
  end;
end;

begin

end.

Где у Вас функция обратной связи?
Я же сказал пример Step4 в отладчике разберите и все вопросы отпадут.

alice_liddell

Как я поняла, в примере step4 два варианта - с обратной связью и без неё. Разве не так?

Ссылку на тему я давал выше, для кого?

Как видите, работает.
+ Благодарностей: 1

alice_liddell

Большое спасибо Вам за терпение, помогли! :)
Не могли бы Вы ещё подсказать, как закрасить нарисованные объекты выбранным цветом?

+ Благодарностей: 1

alice_liddell

А можно как-то окрасить границы фигуры другим цветом? А то получается, что, например, прямоугольники, стоящие вплотную друг к другу, сливаются в одну большую фигуру...

Так задайте, нужный цвет, тут - ksColouring($0000CD); - RGB, либо константа определённого цвета.
PS. Справку то посмотреть можно.
+ Благодарностей: 1

alice_liddell

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


Николай

Программа отрисовывает на чертеже разные детали для прессформ. Но всегда в одном месте. А можно ли считывать координаты курсора, которые отображаются в окне Компаса и закидывать в какой- либо буфер обмена, хотя бы в текстовый файл? Тогда функцией  ksDocument2D.ksMtr можно было бы отрисовывать деталь прямо в нужном месте. Пример Step  мне не помог, либо я не смог в нём разобраться...
Или наоборот- программа извлекает текущие координаты курсора из открытого чертежа.

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