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

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

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

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

niktoto

не получается ничего
procedure TForm1.ComboBox1Change(Sender: TObject);
var
docPar  : ksDocumentParam;
begin
doc := ksDocument2D(kompas.ActiveDocument2D());
if (doc<>nil) then
begin
button1.Enabled :=true;
end;

Вот так норм работает, даже отлично! А как разделить то на фрагмент и чертеж?? Через  type_ не получается ничего! Помогите пожалуйста, наверно последний момент в моей библиотеке!

Тогда давайте код, как не работает.

Функция ksGetDocumentType - вернёт значение - DocType - Типы документов системы КОМПАС:
lt_DocSheetStandart  1 - чертеж стандартного формата
lt_DocSheetUser 2 - чертеж нестандартного фор­мата
lt_DocFragment 3 - фрагмент
lt_DocSpc 4 - спецификация
lt_DocPart3D 5 - деталь
lt_DocAssemble3D 6 - сборка
lt_DocTxtStandart 7 - текстовый документ стандар­тный
lt_DocTxtUser 8 - текстовый документ нестан­дартный
lt_DocSpcUser 9 - спецификация - нестандар­тный формат
lt_DocTechnologyAssemble3D 10 - 3d-документ технологическая сборка
+ Благодарностей: 1

niktoto

ну вот теперь вроде бы все ясно
procedure TForm1.ComboBox1Change(Sender: TObject);

begin
if (ks.ksGetDocumentType(0) = lt_DocSheetStandart) or
(ks.ksGetDocumentType(0) = lt_DocSheetUser) then  button1.Enabled :=true;

end;

end.

вот так сделал и вроде бы работает отлично!

Единственный подводный камень остался, это эскиз в 3D, данный код должен выдать True - при активном эскизе.

niktoto


niktoto

Странная проблема возникла, при создании выносного элемента воспользовался шаблоном из книжки, со всем разобрался только вот текст в выносном элементе менять не хочет. В чем подвох? В автосортировке названия видов выносных элементов чтоли?
Var
kompas: KompasObject;
Document2D: ksDocument2D;
RemoteElementParam: ksRemoteElementParam;
DynamicArray: ksDynamicArray;
Char255: ksChar255;
....................................
Begin
....................................
//Получаем интерфейс параметров выносного элемента
RemoteElementParam:=ksRemoteElementParam(kompas.GetParamStruct(ko_RemoteElementParam));
RemoteElementParam.height := 0;
RemoteElementParam.radius := 10; //радиус
RemoteElementParam.shelfDir := 1; //вправо
RemoteElementParam.shelfX := 120;
RemoteElementParam.shelfY := 120;
RemoteElementParam.signType := 0; // re_Circle
RemoteElementParam.smooth := 0;
RemoteElementParam.style := 0; //стиль по умолчанию
RemoteElementParam.width := 0;
RemoteElementParam.x := 100;
RemoteElementParam.y := 100;
//Получаем интерфейс массива
DynamicArray := ksDynamicArray(RemoteElementParam.GetpText());
DynamicArray.ksClearArray();
//Получаем интерфейс строки
Char255 := ksChar255(kompas.GetParamStruct(ko_Char255));
Char255.str:= 'А';
//Добавляем строку в массив
DynamicArray.ksAddArrayItem(-1,Char255);
//Строим сам выносной элемент
Document2D.ksRemoteElement(RemoteElementParam);

Картинку можно глянуть, что получается?

niktoto


Правильно думаете, виновата авто сортировка, свойство можно установить через API7 IRemoteElement::AutoSorted

niktoto

Можно поподробней. Я понял лишь что нужно в uses добавить ksAPI7. А дальше не могу разобраться

Получаете:
IApplication, затем свой активный документ IKompasDocument2D,
IViewsAndLayersManager - Менеджер слоев и видов графического документа,
IViews - Интерфейс коллекции видов графического документа,
IView - Интерфейс вида графического документа,
ISymbols2DContainer - Интерфейс контейнера условных обозначений,
IRemoteElements - Интерфейс коллекции выносных элементов,
IRemoteElement - Интерфейс выносного элемента.
Ещё подробнее, смотрите в примерах: Step1_API7_2D, Step2_API7_2D, Step3_API7_2D.

niktoto

К сожалению в SDK нашел только пример с базой, но и с ней не получается. Я так понял что нужно в тот код как я обычно добавляю базу, добавить лишь AutoSorted:=false. И кстати база вытаскивается вместе с фантомом при нажатии на кнопку. Но при нажатии на кнопку выскакивает ошибка, и когда закрываю компас появляется еще одна ошибка "В виде остались не закрытые составные элементы"
//// БАЗА НА МУФТЕ
//Получаем интерфейс параметров обозначения базы
BaseParam:=ksBaseParam(kompas.GetParamStruct(ko_BaseParam));
symbCont := GetSymbols2DContainer;
basesCol := symbCont.Bases;
base.AutoSorted := false;
base.Update;
BaseParam.str := 'М'; //Текст в обозначении базы
BaseParam.style := 0; //Стиль текста по умолчанию
BaseParam.type_ := FALSE; //Динамический массив не используем
BaseParam.x1 := 0.7*mx1; //Координаты базовой точки
BaseParam.y1 := my5-(tan(fimyf)*0.7*mx1);
BaseParam.x2 := BaseParam.x1-10*sin(fimyf); //Координаты конечной точки "опоры"
BaseParam.y2 := BaseParam.y1-10*cos(fimyf);
//Строим само обозначение базы
Doc.ksBase(BaseParam);

Вы получили ISymbols2DContainer - Интерфейс контейнера условных обозначений и Вам осталось получить:
IRemoteElements - Интерфейс коллекции выносных элементов - pRemoteElements:=symbCont.RemoteElements;
IRemoteElement - Интерфейс выносного элемента - pRemoteElement:=pRemoteElements.Add;
Далее заполняете свойства и вызываете метод pRemoteElement.Update; который создаст выносной элемент, причём тут база?

niktoto

У меня беда в том что на чертеже уже будут базы А и Б. Затем я достаю выносной и он опять А. Но в SDk есть пример с базой вот я и решил что раз есть пример с базой то отключим автосортировку в базах и все будет норм. Но и с базами не получилось разобраться. Щас будем все таки с выносным элементом разбираться. Просто уже все сделал, и тут бац наткнулся на эту автосортировку и доступного примера не нашел

Плохо искали, в файле Step3_API7_2D_1.pas есть редактирование базы.

niktoto

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

begin
doc := ksDocument2D( kompas.ActiveDocument2D );

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;

какие свойства обязательно прописать? текст правильно ли я добавил? и нужно же что то еще обьявить типа doc := ksDocument2D( kompas.ActiveDocument2D ); только для API7 другое что то? т.к. данный код не работает

Зачем Вам переменная doc, если Вы её не используете?
doc := ksDocument2D( kompas.ActiveDocument2D );
Если брать функцию GetSymbols2DContainer из примера то там используется doc:IKompasDocument2D;, то и используйте функцию GetCurrentDocument из того же примера.
doc:=GetCurrentDocument;
Ошибка возникает потому, что у Вас symbCont равен nil, т.к. ksDocument2D и IKompasDocument2D - это не одно и тоже.

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 TForm1.Button3Click(Sender: TObject);
var
symbCont      : ISymbols2DContainer;
pRemoteElements:IRemoteElements;
pRemoteElement:IRemoteElement;
txt : IText;

begin

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.

ничего не получается :(

if ( newdoc <> nil ) then
if ( doc <> nil ) then
viewsMng := newdoc.ViewsAndLayersManager;
viewsMng := doc.ViewsAndLayersManager;

niktoto

эээм..дык я специально переделал все doc на newdoc и newdoc : IKompasDocument2D;