Редактирование элементов фрагмента при вставке

Автор sorockinalex, 26.11.07, 11:35:36

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

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

sorockinalex

Здравствуйте! Необходимо получить список элементов, присутствующих во вставляемом фрагменте, а конкретно - текстовые поля на невидимом слое, чтобы при вставке фрагмента открывалась форма для ввода значений текстовых полей и копирования их на видимый слой в видимом режиме. Есть юнит, выполняющий вставку. Как реализовать поиск текстовых элементов во втсавляемом фрагменте?

unit InsertLibFragment_;

interface

uses
  ksConstTLB,
  LDefin2D,
  KsTLB,
  ksAuto,
  IniFile_,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

procedure InsertLibFragment( iKompas: KompasObject;iDoc : ksDocument2D );

type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

procedure InsertLibFragment( iKompas: KompasObject;iDoc : ksDocument2D );
var iFrgLib : ksFragmentLibrary;
    iFrg : ksFragment;
    iPhan : ksPhantom;
    iType1 : ksType1;
    iPlaceParms : ksPlacementParam;
    libName,frgName : string;
    refDefFrg, refInsRef : Reference;
    resCode : Longint;
    x, y, ang : Double;
    code : Integer;
    obraztype:string;
begin
  iDoc := ksDocument2D ( iKompas.ActiveDocument2D );
  iFrg := ksFragment(iDoc.GetFragment); // Интерфейс для работы с фрагментами
  iFrgLib := ksFragmentLibrary(iKompas.GetFragmentLibrary); // Интерфейс для работы с библиотеками фрагментов

  If obraztype='scheme' then // Выбор библиотеки фрагментов
    begin
      If ReadIni ('PATHS','LibraryObrazScheme')='NotExist' then
        begin
          libName := iKompas.ksChoiceFile( '*.lfr', 'Библиотеки фрагментов(*.lfr)|*.lfr|', TRUE );
          WriteIni ('PATHS','LibraryObrazScheme',libName);
        end
        else
        begin
          libName:=ReadIni ('PATHS','LibraryObrazScheme');
        end;
      If libName='' then Exit;
    end
    else
    begin
      If ReadIni ('PATHS','LibraryObrazMontazh')='NotExist' then
        begin
          libName := iKompas.ksChoiceFile( '*.lfr', 'Библиотеки фрагментов(*.lfr)|*.lfr|', TRUE );
          WriteIni ('PATHS','LibraryObrazMontazh',libName);
        end
        else
        begin
          libName:=ReadIni ('PATHS','LibraryObrazMontazh');
        end;
      if libName='' then Exit;
    end;

  while True do // Цикл для выбора/вставки произвольного количества фрагментов из библиотеки libName
    begin
      frgName := iFrgLib.ksChoiceFragmentFromLib( libName, resCode );
        if resCode=0 then // Проверка на то, что был выбран именно фрагмент (код 3)
          break           // Выход из цикла в случае ошибки
        else if resCode<>3 then  continue;

      // Описание варианта типа 1 (произвольная группа)
      iPhan := ksPhantom(iKompas.GetParamStruct(ko_Phantom));
      iPhan.Init;
      iPhan.phantom := 1;
      iType1 := ksType1(iPhan.GetPhantomParam);
      iType1.Init;
      iType1.scale_ := 1;

      // Описание объекта "вставка фрагмента". Указывается имя фрагмента, имя вставки фрагмента и способ вставки (1 - внешней ссылкой, 0-импортировать в документ)
      refDefFrg := iFrg.ksFragmentDefinition( frgName, 'вставка фрагмента', 1 );
      if refDefFrg=0 then
       iKompas.ksError( 'Ошибка вставки фрагмента' )
      else
      begin
        // Создание временной группы для вариантного отображения во временную группу поместим вставку фрагмента из библиотеки фрагментов
        iType1.gr := iDoc.ksNewGroup(1);
        iPlaceParms := ksPlacementParam(iKompas.GetParamStruct(ko_PlacementParam));
        iPlaceParms.Init;
        iPlaceParms.scale_ := 1;
        refInsRef := iFrg.ksInsertFragment( refDefFrg, FALSE, iPlaceParms );
        iDoc.ksEndGroup;

       // Получение параметров местоположения и ориентации для вставки произвольного количества экземпляров фрагмента
        repeat
          code := iDoc.ksPlacement(nil, x, y, ang, iPhan);
          if code<>0 then
            iDoc.ksCopyObj( refInsRef, 0, 0, x, y, 1, ang );
        until code=0;

        // Удаление временной группы, использовавшейся для вариантного отображения
        iDoc.ksDeleteObj( iType1.gr );
      end;
    end;
end;

{$R *.dfm}

end.


sorockinalex

  iIterator := ksIterator(iKompas.GetIterator);
  if iIterator <> nil then
    if iIterator.ksCreateIterator(SELECT_GROUP_OBJ, 0) then
      begin
        pDoc := iIterator.ksMoveIterator( 'F' ); // Ссылка на первый найденный документ
iKompas.ksMessage('ok');
GetObjParam(pDoc,
        while pDoc <> 0 do
          begin
            pDoc := iIterator.ksMoveIterator( 'N' ); // и на все последующие
          end;
          iIterator.ksDeleteIterator;
      end;


таким способом получаю идентификатор на выделенный объект.
каким образом теперь запустить поиск текстовых полей (TEXT_OBJ) в найденном макроэобъекте?
так? (при условии активности макрообъекта)
  iIterator := ksIterator(iKompas.GetIterator);
  if iIterator <> nil then
    if iIterator.ksCreateIterator(TEXT_OBJ, 0) then
      begin
        pDoc := iIterator.ksMoveIterator( 'F' ); // Ссылка на первый найденный документ
        while pDoc <> 0 do
          begin
            pDoc := iIterator.ksMoveIterator( 'N' ); // и на все последующие
          end;
          iIterator.ksDeleteIterator;
      end;



Как получить текст из текстового поля макроэлемента на скрытом слое?
Как установить SetObjParam текущего текстового поля?

И ещё один вопросик: Как организовать режим ортогонального черчения (SetOrthoMode - включить режим ортогонального черчения) при вставке фрагмента? Где вставить строчку и как она вообще должна выглядеть?