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

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

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

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

Эту строку пока уберите.
pRemoteElement.AutoSorted:=False;
PS. Отладчик отличная вещь, интерфейс который равен nil сразу покажет.

niktoto


Тогда, пока курите бамбук, я пришёл с работы и у меня ребёнок голодный, разберусь с домашними проблемами, тогда дойдёт очередь до Ваших.
PS. Я не видел, как Вы получили newKompasAPI, а в функции GetCurrentDocument ошибка, возможно разработчики SDK хотели заставить думать, т.к. она ...

niktoto

опачки, ну вот что получилось

function GetCurrentDocument : IKompasDocument2D;
var
  kDoc : IKompasDocument;
  begin

  if ( newKompasAPI <> nil ) then
     // Получить активный документ
     kDoc := newKompasAPI.ActiveDocument;
  Result := kDoc As IKompasDocument2D;

end;

function GetSymbols2DContainer : ISymbols2DContainer;

var
  viewsMng  : IViewsAndLayersManager;
  views     : IViews;
  view      : IView;
begin
  Result := nil;

  if ( newdoc <> nil ) then
  begin
    // Получить менеджер для работы с видами и слоями
    viewsMng := newdoc.ViewsAndLayersManager;

    if ( viewsMng <> nil ) then
    begin
      // Получить коллекцию видов
      views := viewsMng.Views;

      if ( views <> nil ) then
      begin
        // Получить активный вид
        view := views.ActiveView;
        // Получить контейнер
        Result := view As ISymbols2DContainer;
      end;
    end
  end
end;

procedure GetNewKompasAPI;
var
  disp : IDispatch;
begin
if newKompasAPI = nil then
  begin
    disp := IDispatch(CreateKompasApplication);
    newKompasAPI := disp As IApplication;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
symbCont      : ISymbols2DContainer;
pRemoteElements:IRemoteElements;
pRemoteElement:IRemoteElement;
txt : IText;

begin
    GetNewKompasAPI;
    newdoc := GetCurrentDocument;

    symbCont := GetSymbols2DContainer;
    pRemoteElements:=symbCont.RemoteElements;
    pRemoteElement:=pRemoteElements.Add;
    pRemoteElement.AutoSorted:=False;
    pRemoteElement.Radius:=10;
    pRemoteElement.Xc:=0;
    pRemoteElement.Yc:=0;
    pRemoteElement.Height:=10;
    pRemoteElement.Width :=10;
    txt:=pRemoteElement.AdditionalText;
    txt.Str:='Ж';
    pRemoteElement.Update ;


end;

end.


niktoto

все супер, все получилось :) осталось только со свойствами разобраться

niktoto


function GetCurrentDocument : IKompasDocument2D;
var
  kDoc : IKompasDocument;
  begin

  if ( newKompasAPI <> nil ) then
     // Получить активный документ
     kDoc := newKompasAPI.ActiveDocument;
  Result := kDoc As IKompasDocument2D;

end;

function GetSymbols2DContainer : ISymbols2DContainer;

var
  viewsMng  : IViewsAndLayersManager;
  views     : IViews;
  view      : IView;
begin
  Result := nil;

  if ( newdoc <> nil ) then
  begin
    // Получить менеджер для работы с видами и слоями
    viewsMng := newdoc.ViewsAndLayersManager;

    if ( viewsMng <> nil ) then
    begin
      // Получить коллекцию видов
      views := viewsMng.Views;

      if ( views <> nil ) then
      begin
        // Получить активный вид
        view := views.ActiveView;
        // Получить контейнер
        Result := view As ISymbols2DContainer;
      end;
    end
  end
end;

procedure GetNewKompasAPI;
var
  disp : IDispatch;
begin
if newKompasAPI = nil then
  begin
    disp := IDispatch(CreateKompasApplication);
    newKompasAPI := disp As IApplication;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
symbCont      : ISymbols2DContainer;
pRemoteElements:IRemoteElements;
pRemoteElement:IRemoteElement;


RemoteElementParam: ksRemoteElementParam;
DynamicArray: ksDynamicArray;
Char255: ksChar255;

txt:IText;
line  : ITextLine;
item  : ITextItem;
font  : ITextFont;


begin
    GetNewKompasAPI;
    newdoc := GetCurrentDocument;
    symbCont := GetSymbols2DContainer;
    pRemoteElements:=symbCont.RemoteElements;
    pRemoteElement:=pRemoteElements.Add;
    pRemoteElement.AutoSorted:=False;
    pRemoteElement.Xc:=10;
    pRemoteElement.Yc :=5;
    pRemoteElement.Radius :=5;
    pRemoteElement.ShelfX :=20;
    pRemoteElement.ShelfY :=30;
    txt:=pRemoteElement.TextUp;
    line:=txt.Add;
    item:=line.Add;
    font := item As ITextFont;
    font.Height := 10;
    txt.Str := 'Ж';
    item.Update;
    pRemoteElement.Update ;
end;

end.

и столько проблем из за одной галочки!

#86
Если делать всё правильно, то проблем минимум.
У Вас проблема, Вы ленитесь лишний раз делать проверки, если бы Вы проверяли, то по крайней мере не было бы вылетов, но для того, чтобы понять, почему, не что не получается, нужно использовать отладчик, либо дополнительный код, который подтверждает прохождение операции.
Для примера - if symbCont<>nil then pRemoteElements:=symbCont.RemoteElements else kompas.ksMessage('pRemoteElements=nil'); и т.д.

niktoto

у выносного элемента есть свойство pRemoteElement.ShelfDirection, я так понял это задать числами направление: 1 вправо, 2 вверх, 3 вниз, а вот влево никак не получается направить.

#88
Вы, извините, но у Вас очень интересная специальность и Вас, не научили правильно поставить задачу, при минимуме телодвижений.
Как, я  могу ответить?
PS. Я уверен, что у Вас не тот тип переменной, а некоторые переменные, не могут иметь отрицательные значения.
http://forum.ascon.ru/index.php/topic,24298.msg174086.html#msg174086

niktoto

Я уже боюсь что либо спрашивать. Но все же рискну. Вот например я строю просто две линии через ksLineSeg. Возможно ли как нибудь задать условие, если они пересекаются то ... ?


niktoto

#91
вот и заканчиваю библиотеку, остались мелкие доработки, а именно:
1) я вызываю форму вот таким кодом
if (command=1) then
begin
// получаем дескриптор главного окна КОМПАС
Application.Handle := kompas.ksGetHWindow;
// создаем объект диалогового окна
Form1 := TForm1.Create(Application);
// выводим диалог на экран
Form1.Show;
Application.Handle := 0;
doc:=nil;
end;

взял из примера, где форма в модальном режиме. Отсюда вопрос, корректно ли я переделал ее под свой проект?

2) Решил добавить маленькую фишку, чтобы после того как нажималась кнопка и появлялся фантом ,форма сворачивалась. А вот как реализовать это ? Просто через form3.windowstate:=wsMinimized; не получается. Наверняка это как то связано с тем, как вызывается сама форма...

niktoto


niktoto

#93
для этого вопроса лучше создадим отдельную тему