Создание библиотеки переводников.

Автор niktoto, 17.10.13, 14:25:59

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

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

#20
Цитата: niktoto от 17.10.13, 14:25:59
Здравствуйте! Буду краток, диплом мой - создание библиотеки переводников.
...
Тогда проще пойти купить диплом в переходе.
Я за Вас писать не буду, у меня своей роботы куча, если нужна помощь, то выкладывайте кусок кода, где проблема, кто нибудь наставит на путь истинный, если у Вас будет желание учиться.
P.S. Зачем весь проект, судя по тексту Вы и не пытались, что то менять.
Здесь показана работа с формами http://forum.ascon.ru/index.php/topic,22654.msg155743.html#msg155743

unit Former1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ks : KompasObject;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  doc : ksDocumentParam;
  doc2    : ksDocument2D;
  doc3 : ksDocument3D;
begin
   doc2 := ksDocument2D( ks.Document2D() );
   doc :=ksDocumentParam(ks.GetParamStruct(ko_DocumentParam));
   ks := kompasobject(createkompasobject);
      doc2 := ksDocument2D( ks.Document2D() );
      doc :=ksDocumentParam(ks.GetParamStruct(ko_DocumentParam));
         doc.Init;
         doc.fileName := 'D:\SHEMA.frw';
         doc.author := 'My ksDLLx64' ;
         doc.regime := 0;
         doc.type_  := lt_DocFragment;
         doc2.ksCreateDocument(doc);
     //Здесь собственно строишь отрезок
     doc2.ksLineSeg(0,0,100,100,1);


end;

end.

niktoto

Спасибо за добрые слова конечно, но то что я скинул файл не тронутый это не означает что я его не менял и не пытался что либо делать, я просто скинул исходник без своих наработок.
P.S. простой размер поставить получилось, а вот с фантомом пока стоим...

Сюда текстом кусок кода, где стоите выложите, я проект всё равно компилировать не буду.
Вы отладчиком пользуетесь, Потому, что без него, что то делать, бесполезно.

niktoto

Ладно фантом дело не обязательное. А возможно ли сделать чтобы библиотека "черпала" уже начерченный фрагмент из другого файла?

Можно полюбопытствовать, какая у Вас специальность? Судя по задаваемым вопросам, такое впечатление, что компьютер в первый раз увидели, не обижайтесь, естественно можно.
Сегодня обсуждали http://forum.ascon.ru/index.php/topic,25253.msg183142.html#msg183142

niktoto

Специальность 220301, delphi нам "преподавали" на уровне калькулятора и то это было 2 года назад. А о связи delphi с компасом я вообще услышал наверно месяц назад. А результатов требуют уже сейчас.
Мне нужно хотя бы один пример листинга, в котором путем нажатия одной кнопки копируется из файла начерченный отрезок и вставляется в нужное место в другом файле. Конечно в существующем файле кроме этого отрезка больше ничего и нет.

При Вашей специальности, Вам хоть один язык должны были нормально преподавать, мой совет полистайте SDK Компаса, это будет Ваша каждодневная работа, только для других устройств и они могут быть ещё сложнее.
У меня к сожалению готового примера нет.
P.S. Специальность можно было и буквами написать.

niktoto

пока разбирался со всеми возможностями наткнулся на вещи:
1. решил сделать библиотеку чуток иным способом и стала выскакивать какая то ошибка при нажатии кнопки, теперь даже отрезок не могу построить
2. как сделать нормальное имя библиотеки?
library Project1;

uses
  SysUtils,
  Classes,
  ksTLB,
  Forms,
  ksAuto,
  comobj,

  former in 'former.pas' {MainForm};


{$E RTW}

{$R *.res}
// глобальная переменная приложения КОМПАС API
var
Kompas: KompasObject;
Document2D: ksDocument2D;
form : TMainForm; // ссылка на форму

function LIBRARYNAME: PChar; pascal;
begin
// произвольное название библиотеки
Result := 'Библиотека построения отрезков'
end;
function LIBRARYID: integer; pascal;
begin
// произвольный идентификатор от 100 и выше
Result := 100;
end;
procedure LIBRARYENTRY (command:WORD); pascal;
begin
// связываем переменную Kompas с API КОМПАСа
Kompas := KompasObject(CreateKompasObject);
// если все в порядке...
if Kompas <> nil then
begin
// связываем переменную iDocument2D
// с текущим 2D документом
Document2D := ksDocument2D(Kompas.ActiveDocument2D());
if Document2D=nil then
// сообщение об ошибке
Kompas.ksMessage('Текущий документ не является чертежом или фрагментом')
else
begin
// своя процедура запуска библиотеки – см. ниже
// делаем нашу форму дочерней формой КОМПАСа
Application.Handle := kompas.ksGetHWindow;
// закрыть доступ к компасу
kompas.ksEnableTaskAccess(0);
// создаем форму
form:=TMainForm.Create(Application);
// вывод формы
form.ShowModal;
// открыть доступ к компасу
kompas.ksEnableTaskAccess(1);
// отключаем нашу форму от КОМПАСа
Application.Handle := 0
end;
Kompas.ksMessage('Работа библиотеки завершена')
end;
// освобождение памяти
Document2D := nil;
Kompas := nil
end;



exports
LibraryName name 'LIBRARYNAME',
LibraryId name 'LIBRARYID',
LibraryEntry name 'LIBRARYENTRY';

begin
end.


unit former;

interface

uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ksTLB, ksAuto, ksConstTLB, LDefin3D, LDefin2D, math, StdCtrls, comobj;

type
  TMainForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    kompas : KompasObject;
  end;


var
  MainForm: TMainForm;
  kompas: KompasObject;
Document2D: ksDocument2D;

implementation

{$R *.dfm}

procedure TMainForm.Button1Click(Sender: TObject);
begin
    Document2D.ksLineSeg(0,0,100,100,1);
end;

end.

#28
1. Используйте функцию  function LibraryNameW:PWideChar; pascal;
2. Ссылку уже давал, посмотрите, как сделано, там и код есть.
Здесь показана работа с формами http://forum.ascon.ru/index.php/topic,22654.msg155743.html#msg155743
Полный код скачаете в теме по ссылке выше, правда здесь работа с двумя формами, но лишние обрезать не трудно.
Код http://forum.ascon.ru/index.php/topic,22654.msg156271.html#msg156271
procedure LIBRARYENTRY(comm:WORD); pascal;
begin
   Kompas:=KompasObject(CreateKompasObject);
   if Kompas=nil then Exit;
   Application.Handle:=Kompas.ksGetHWindow;
   Form1:=TForm1.Create(Application);
   Form2:=TForm2.Create(Application);
   Form1.Show;
   Kompas.ksSystemControlStart('Остановить библиотеку');
   if Kompas<>nil then Kompas.ksSystemControlStop;
   if Form2<>nil then
    begin
        Form2.Close;
        Form2.Free;
        Form2:=nil;
    end;
   if Form1<>nil then
    begin
        Form1.Close;
        Form1.Free;
        Form1:=nil;
    end;
   Kompas:=nil;
   Application.Handle:=0;
end;

#29
Зачем Kompas: KompasObject; столько раз объявлять?

niktoto

Возник вопрос. В делфи есть как бы целевая платформа чтоли в настройках и справа в проекте она выскакивает постоянно, и я везде настроился на 32 битную. Хотя у самого на компе 64 битная. Отсюда и вопрос принципиален ли этот выбор и может ли привести к каким нить последствиям???

Компас, какой разрядности?
Вы создаёте Dll под Компас, настройка платформы Delphi должна совпадать с разрядностью Компаса, а не системы.

niktoto

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


niktoto

Как поставить угловой размер вот так как на скрине, всю голову сломал все координаты уже перебрал - ставит справа и все. Используемый код приложил
//Получаем интерфейс ksLBreakDimParam
ADimParam:=ksADimParam(kompas.GetParamStruct(ko_ADimParam));
//Получаем интерфейс ksDimDrawingParam
DimDrawingParam:=ksDimDrawingParam(ADimParam.GetDPar());
DimDrawingParam.ang:=0; //Угол наклона "ножки" выносной полки
DimDrawingParam.lenght:=0;//длина "ножки" выносной полки
DimDrawingParam.pl1:=false;//Отрисовываем первую выносную линию
DimDrawingParam.pl2:=false;//Отрисовываем вторую выносную линию
DimDrawingParam.pt1:=2; //у первой выносной линии стрелки изнутри
DimDrawingParam.pt2:=2; //у первой выносной линии стрелки изнутри
DimDrawingParam.shelfDir:=1;//выносной полки у нас нет

//Получаем интерфейс ksADimSourceParam
ADimSourceParam:=ksADimSourceParam(ADimParam.GetSPar());
//Координаты центра размерной дуги
ADimSourceParam.xc:=0;
ADimSourceParam.yc:=0;
//Координаты точки первой выносной линии
ADimSourceParam.x1:=-15.945;
ADimSourceParam.y1:=1.329;
//Координаты точки второй выносной линии
ADimSourceParam.x2:=0;
ADimSourceParam.y2:=0;
//Начальный и конечный угол размерной дуги
ADimSourceParam.ang1:=0;
ADimSourceParam.ang2:=-4.76333;
ADimSourceParam.dir:=-1; //против часовой стрелки
ADimSourceParam.rad:= 25;//радиус размерной дуги
//Получаем интерфейс ksDimTextParam
DimTextParam:=ksDimTextParam(ADimParam.GetTPar());
DimTextParam.bitFlag:=1;//Автоматическая простановка размера
DimTextParam.sign:=0;//Значка нет
DimTextParam.stringFlag:=false;
DimTextParam.style:=3;//Текст размерной надписи
//Получаем интерфейс ksDynamicArray
DynamicArray:=ksDynamicArray(DimTextParam.GetTextArr());
DynamicArray.ksClearArray(); //Очищаем массив
//Строим сам угловой размер
Doc.ksAngDimension(ADimParam);

#35
Во первых заполните, анкету по минимуму, какой компас, т.к. есть особенности в API.
Пока я не вникал в соответствие значений, но, что значит это ADimSourceParam.ang2:=-4.76333; , все углы должны быть положительными значениями, знак берётся в зависимости от квадранта, в котором оказывается вектор.
При радиусе = 25 такого быть не может:
//Координаты точки второй выносной линии
ADimSourceParam.x2:=0;
ADimSourceParam.y2:=0;
ADimSourceParam.ang2:=180-4.76333;
PS. Методом перебора не получится, Вы должны знать, что хотите получить.

#36
Задайте значения не методом перебора, а так, чтобы Компас понял, что от него Вы хотите.
Углы можно посчитать так:
Ang1:=Angle(X0,Y0,X1,Y1);
Ang2:=Angle(X0,Y0,X2,Y2);
P.S. Значение радиуса при задании размера в виде, где масштаб не равен 1:1, очень зависит от версии Компаса.

niktoto

С углами разобрался спасибо! Теперь с фантомом какая то беда, вроде бы смог собрать минимальный пример работы с фантомом через LibraryEntry. А вот реализовать через кнопку не получается. Пробовал в кнопке ModalResult ставить mrOK - не помогло. Пробовал колдовать с доступом к окну - тоже ничего не получается. Код приложил.
library Frager;


uses
  SysUtils,
  Classes,
  ksTLB,
  Forms,
  ksAuto,
  Former1 in 'Former1.pas' {Form1};

{$E RTW}

{$R *.res}
// глобальная переменная приложения КОМПАС API
var
kompas : KompasObject;
  doc    : ksDocument2D;

function LibraryName: PChar; pascal;
begin
Result := '0';
end;

function LibraryId: integer; pascal;
begin
Result := 100;
end;

procedure LibraryEntry(command: WORD); pascal;
var GearsForm : TForm1;
begin
kompas := KompasObject(CreateKompasObject);
if kompas <> nil then
begin
doc := ksDocument2D(kompas.ActiveDocument2D());
if (doc <> nil) then
begin
// получаем дескриптор главного окна КОМПАС
Application.Handle := kompas.ksGetHWindow;
// запрещаем доступ к главному окну
kompas.ksEnableTaskAccess(0);
// создаем объект диалогового окна
GearsForm := TForm1.Create(Application);
GearsForm.kompas := kompas;
// выводим диалог на экран
GearsForm.ShowModal;
// удаляем объект
GearsForm.Free;
// возвращаем доступ к окну
kompas.ksEnableTaskAccess(1);
Application.Handle := 0;
doc:=nil;
end;
kompas := nil;
end;

end;

exports
LibraryName name 'LIBRARYNAME',
LibraryId name 'LIBRARYID',
LibraryEntry name 'LIBRARYENTRY';

begin
end.


unit Former1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     kompas : KompasObject;
  doc    : ksDocument2D;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
iPhan     : ksPhantom;
    it1       : ksType1;
    iReqInfo  : ksRequestInfo;
        x, y, ang : Double;
    resCode   : Longint;

begin
  Kompas := KompasObject(CreateKompasObject);
   Doc := ksDocument2D(kompas.ActiveDocument2D);

// Параметры вариантного изображения
  iPhan := ksPhantom(Kompas.GetParamStruct(ko_Phantom));
  iPhan.Init;
  iPhan.phantom := 1;    // Тип варианта - произвольная группа
  // Параметры вывода группы, изображающей вариант
  it1 := ksType1(iPhan.GetPhantomParam);
  it1.Init;
  it1.xBase := 0; it1.yBase := 0; // Базовая точка группы
  it1.scale_ := 1;                // Масштаб
  it1.gr := 0;                    // Дескриптор группы

      // Создание временной группы, изображающей фигуру текущего типа
    it1.gr := Doc.ksNewGroup( 1 );
    // В качестве базовой точки была указана (0,0), поэтому при рисовании
    // варианта именно точка (0, 0) будет совпадать с указателем мыши

    doc.ksMacro(1);
      Doc.ksLineSeg( -10, 0,  10,  0,  1 );
      Doc.ksLineSeg( 10,  0,  0,   20, 1 );
      Doc.ksLineSeg( 0,   20, -10, 0,  1 );
      doc.ksEndObj;

    Doc.ksEndGroup;

      resCode := Doc.ksPlacement( iReqInfo, x, y, ang, iPhan );

      begin
        // Копирование группы в документ (в текущий вид) с учетом
        // указанного местоположения и угла поворота
        Doc.ksMoveObj( it1.gr, x, y );
        if abs(ang) > 0.01 then
          Doc.ksRotateObj( it1.gr, x, y, ang );
        Doc.ksStoreTmpGroup( it1.gr );
      end;
    end;

end.

Подробнее смотрите пример STEP4_1, для от рисовки фантома нужно использовать CallBack - функцию обратной связи, которую я у Вас не наблюдаю.

Забыл добавить с таким окном form.ShowModal;, ни о каких фантомах речи быть не может.
Разберитесь с кодом, чтобы формой можно было управлять http://forum.ascon.ru/index.php/topic,25180.msg183540.html#msg183540
+ Благодарностей: 1