Вставка фрагмента из библиотеки

Автор Thender, 13.12.16, 01:30:35

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

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

Thender

Прошу помощи со вставкой фрагмента из библиотеки
мой код:

var
  iKompas: KompasObject;
  iDocument2D: ksDocument2D;
  iDocumentParam: ksDocumentParam;
  ifragment1:ksfragment;
  obj:reference;
  iPlacementParam1:ksPlacementParam;
begin
  ifragment1:=ksFragment(iDocument2D.GetFragment());
  typestamp:='D:/Program Files/ASCON/KOMPAS-3D V16/Libs/Formats.lfr|Frog';
  obj:= iFragment1.ksFragmentDefinition(typestamp, typestamp, 0);
  iPlacementParam1 := ksPlacementParam(iKompas.GetParamStruct(ko_PlacementParam));
  iPlacementParam1.Init();
  iPlacementParam1.angle := 0.0;
  iPlacementParam1.scale_ := 1.0;
  iPlacementParam1.xBase := 0.0 ;
  iPlacementParam1.yBase := 0.0  ;
  iFragment1.ksInsertFragmentEx(obj, False, iPlacementParam1, False);

выдаёт ошибку в первой же стоке.

И правильно делает, где Вы получили iDocument2D? Я так понял, что он появился от святого духа.

Thender

получил интерфейс документа2д добавив строчки: 
  ikompas:=Kompasobject(CreateKompasObject);
  iDocument2D:=ksDocument2D(ikompas.Document2D);
  ifragment1:=ksFragment(iDocument2D.GetFragment());
теперь вылетает тут, с ошибкой:
  obj:= iFragment1.ksFragmentDefinition(typestamp, typestamp, 0);

15.12.16, 05:11:48 #3 Последнее редактирование: 15.12.16, 05:30:48 от Sabahs
В SDK даже пример есть, не может два первых входных параметра быть одинаковыми, но нужно ещё и наличие правильного файла по заданному пути.
Выглядеть должно примерно так:
ifragment1:=iFragment1.ksFragmentDefinition('D:/Program Files/ASCON/KOMPAS-3D V16/Libs/Formats.lfr','Frog',0);


Смотрите пример Step5, процедура - procedure ShowInsertFragment;


Thender

15.12.16, 20:45:09 #4 Последнее редактирование: 15.12.16, 21:03:07 от Thender
Давайте рассмотрим его вместе:
для примера я выбрал библиотеку Graphic.lfr|Основания, пластины|Звезда-5 35

***************// блок определений************************
procedure ShowInsertFragment;
var
  par          : PlacementParam;                      // Параметры размещения
  libName, buf : array [0..250] of AnsiChar;  // Имя библиотеки фрагментов и имя фрагмента
  insertName   : PAnsiChar;                         // Имя вставки
  x, y         : Double;                                      // Координаты точки
  rub          : Phantom;                                  // Фантом
  pDefFrg      : Reference;                            // Указатель на параметры вставки фрагмента
  p            : Reference;                                // Указатель на объект
  j1, j        : Integer;
****************// тело процедуры****************************
begin
  // Выберем библиотеку фрагментов
  if( ksChoiceFile( '*.lfr','Библиотки фрагментов(*.lfr)|*.lfr|Все файлы (*.*)|*.*|', libName, 250, 0 ) > 0 ) then
******************************************************************************************************************************
   насколько я понимаю ksChoiceFile возвращает в libName имя файла! строка заканчивающаяся #0 символом.
   после вызова Libname="d:\Program Files\ASCON\KOMPAS-3D V16\Libs\"+#0+хеш заполняющий массив до размера 250 символов
******************************************************************************************************************************

  begin
    repeat
      // Выбрать фрагмент в библиотеке фрагментов
      j1 := ksChoiceFragmentFromLib( libName, buf, 250 );

******************************************************************************************************************************
//данные после вызова:
//j1=3
//Libname="d:\Program Files\ASCON\KOMPAS-3D V16\Libs\"+#0+хеш заполняющий массив до размера 250 символов (без изменений)
//buf="d:\Program Files\ASCON\KOMPAS-3D V16\Libs\Graphic.lfr|Основания, пластины|Звезда-5 35"+#0+хеш
******************************************************************************************************************************

      if ( j1 <> 0 ) then
      begin
        // Выделим имя вставки
        insertName := StrPos( buf, '|' );
******************************************************************************************************************************
   insertName="|Основания, пластины|Звезда-5 35"
******************************************************************************************************************************
        if ( insertName <> nil ) then
        begin
          //подготовим структуры фанома и запросов для Placement
          rub.type1.xBase := 0;
          rub.type1.yBase := 0;
          rub.type1.scale := 1;
          rub.phType      := 1;
          // Создадим описание всавки фрагментов
          pDefFrg := FragmentDefinition( buf,            // Имя файла фрагмента
                                         insertName + 1, // Имя вставки
                                         1 );            // Тип вставки -действителен для внешнего фрагмента
                                                         // 0- взять в документ, 1-внешней ссылкой

******************************************************************************************************************************
насколько я понял тут происходит Получение указателя на фрагмент
InsertName + 1 - Выкидывается первый символ "|"
что удивительно получается указатель без получения каких либо интерфейсов.
pDefFrg=1073741846
******************************************************************************************************************************
          if( pDefFrg > 0) then
          begin
            // Во временную группу положим вставку фрагмента, взятую из библиотеки фрагментов
******************************************************************************************************************************
//тут уже можете помогать мне  потому что не совсем ясно что это за группа и зачем она нужна
//ну возможно фрагмент состоит из примитивов которые помещаются в макроэлемент[/i][/b]
******************************************************************************************************************************

            rub.type1.gr    := NewGroup( 1 );       // Временная группа

              par.xBase := 0;
              par.yBase := 0;
              par.ang   := 0;
              par.scale := 1 ;
              // Создаем объект "вставка фрагмента"

              p := InsertFragment( pDefFrg,         // Указатель определения  фрагмента
                                   0,               // Тип размещения по слоям 0 - на свои слои 1- в текущий слой
                                   Addr(par) );     // Параметры привязки
******************************************************************************************************************************
//тут я уже поплыл  p=1073741848  - что это за указатель и в чем отличие от pDefFrg
******************************************************************************************************************************

            EndGroup();

            repeat
              rub.type1.ang  := 0;
              // Указать точку вставки и угол поворота
              j := Placement( nil, x, y, rub.type1.ang, Addr(rub) );
*******************************//j=-1***********************************
              if ( j <> 0 ) then
              begin
                CopyObj( p,                   // Указатель на графический объект
                         0, 0,                // Базовая точка объекта
                         x, y,                // Точка куда копировать
                         1, rub.type1.ang  ); // Масштаб и угол поворота а градусах
              end;
*****************************//j=0 при выходе из команды**************************
            until( j = 0 );

            DeleteObj( rub.type1.gr );        // Удалить группу

          end else
            Error( 'Ошика создания описания вставки фрагмента' );
        end else
          Error( 'Имя вставки не определено' );
      end;
    until( j1 = 0 );
  end;
end;

свои коменты я выделил *ми
есть небольшая разница в методах,надеюсь это небольшое исследование пойдёт впрок не только мне.


Thender

похоже без разницы что написать лишь бы написать что нибудь, не знаете - лучше не пишите.

16.12.16, 08:35:18 #7 Последнее редактирование: 16.12.16, 09:30:52 от Sabahs
Хорошо, больше писать не буду.


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

Thender

"PS. Просто, чтобы разобрать пример, нужно создавать проект садится и в отладчике его разбирать, Вы считаете, что у меня другой работы больше нет?"
Вы читали сообщение:
если да то могли бы заметить что там в коде есть мои коменты в которых значения переменных, откуда я мог их достать кроме отладчика? есть идеи?
по поводу писать вам или не писать..
насколько я понимаю это ваше личное дело, я пришёл за помощью а не что бы послали курить мануалы или еще куда подальше, это я мог делать и без форума.
в руководстве написано идите на форум там помогут, чем тут помогут если тут всего 1 человек отвечает.

Почему, Вы считаете, что здесь один человек отвечает?
Почитайте ветку внимательнее, тут много компетентных людей способных компетентно ответить.

Теперь по коду, скопировал я Ваш код, как есть и о чудо, ничего не вылетает и даже работает, т.ч. смотрим кино.
https://yadi.sk/i/KmvhPGEy33oKE4

Thender

Вы проверили пример STEP5, это не мой код,
мой код который я не могу запустить:

var
  iKompas: KompasObject;
  iDocument2D: ksDocument2D;
  iDocumentParam: ksDocumentParam;
  ifragment1:ksfragment;
  obj:reference;
  iPlacementParam1:ksPlacementParam;
  j1,j2:ansistring;
  typestamp:ansistring;
begin
  ikompas:=Kompasobject(CreateKompasObject);
  iDocument2D:=ksDocument2D(ikompas.Document2D);
  ifragment1:=ksFragment(iDocument2D.GetFragment())
  ifragment1:=ksFragment(iDocument2D.GetFragment());
  typestamp:='Основания, пластины|Звезда-5 35';
  j1:=STRtoansichar('C:\Program Files\ASCON\KOMPAS-3D V16\Libs\Graphic.lfr');
  j2:=STRtoansichar(typestamp);
  obj:= iFragment1.ksFragmentDefinition(j1, j2, 0);
  iPlacementParam1 := ksPlacementParam(iKompas.GetParamStruct(ko_PlacementParam));
  iPlacementParam1.Init();
  iPlacementParam1.angle := 0.0;
  iPlacementParam1.scale_ := 1.0;
  iPlacementParam1.xBase := 0.0 ;
  iPlacementParam1.yBase := 0.0  ;
  iFragment1.ksInsertFragmentEx(obj, False, iPlacementParam1, False);
end;

http://forum.ascon.ru/index.php/topic,30015.msg232981.html#msg232981 - ах это, не Ваш?
PS. Кино ещё раз посмотрите, медленно.

Thender

Цитата: Sabahs от 15.12.16, 05:11:48
В SDK даже пример есть, не может два первых входных параметра быть одинаковыми, но нужно ещё и наличие правильного файла по заданному пути.
Выглядеть должно примерно так:
ifragment1:=iFragment1.ksFragmentDefinition('D:/Program Files/ASCON/KOMPAS-3D V16/Libs/Formats.lfr','Frog',0);

Смотрите пример Step5, процедура - procedure ShowInsertFragment;
Цитата: Thender от 15.12.16, 20:45:09
Давайте рассмотрим его вместе:
для примера я выбрал библиотеку Graphic.lfr|Основания, пластины|Звезда-5 35
есть небольшая разница в методах,надеюсь это небольшое исследование пойдёт впрок не только мне.
налицо какое то недопонимание,
в моём сообщении разобран пошагово пример step5.
В программе же  я пользуюсь методом описанным в хелпе:

  typestamp:='Основания, пластины|Звезда-5 35';
  j1:='C:\Program Files\ASCON\KOMPAS-3D V16\Libs\Graphic.lfr';
  j2:='Основания, пластины|Звезда-5 35';
  obj:= iFragment1.ksFragmentDefinition(j1, j2, 0);//   <<<<<====== ОШИБКА
  iPlacementParam1 := ksPlacementParam(iKompas.GetParamStruct(ko_PlacementParam));
  iPlacementParam1.Init();
  iPlacementParam1.angle := 0.0;
  iPlacementParam1.scale_ := 1.0;
  iPlacementParam1.xBase := 0.0 ;
  iPlacementParam1.yBase := 0.0  ;
  iFragment1.ksInsertFragmentEx(obj, False, iPlacementParam1, False);

именно этот код не работает.

22.12.16, 08:44:23 #13 Последнее редактирование: 22.12.16, 13:33:38 от Sabahs
Вы лучше свой проект прикрепите, если конечно он не секретный.
PS. Уже ненужно.