Прошу помощи со вставкой фрагмента из библиотеки
мой код:
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? Я так понял, что он появился от святого духа.
получил интерфейс документа2д добавив строчки:
ikompas:=Kompasobject(CreateKompasObject);
iDocument2D:=ksDocument2D(ikompas.Document2D);
ifragment1:=ksFragment(iDocument2D.GetFragment());
теперь вылетает тут, с ошибкой:
obj:= iFragment1.ksFragmentDefinition(typestamp, typestamp, 0);
В SDK даже пример есть, не может два первых входных параметра быть одинаковыми, но нужно ещё и наличие правильного файла по заданному пути.
Выглядеть должно примерно так:
ifragment1:=iFragment1.ksFragmentDefinition('D:/Program Files/ASCON/KOMPAS-3D V16/Libs/Formats.lfr','Frog',0);
Смотрите пример Step5, процедура - procedure ShowInsertFragment;
Давайте рассмотрим его вместе:
для примера я выбрал библиотеку 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;
свои коменты я выделил *ми
есть небольшая разница в методах,надеюсь это небольшое исследование пойдёт впрок не только мне.
Есть отладчик, в нём и разбираете.
похоже без разницы что написать лишь бы написать что нибудь, не знаете - лучше не пишите.
Хорошо, больше писать не буду.
PS. Просто, чтобы разобрать пример, нужно создавать проект садится и в отладчике его разбирать, Вы считаете, что у меня другой работы больше нет?
"PS. Просто, чтобы разобрать пример, нужно создавать проект садится и в отладчике его разбирать, Вы считаете, что у меня другой работы больше нет?"
Вы читали сообщение:
если да то могли бы заметить что там в коде есть мои коменты в которых значения переменных, откуда я мог их достать кроме отладчика? есть идеи?
по поводу писать вам или не писать..
насколько я понимаю это ваше личное дело, я пришёл за помощью а не что бы послали курить мануалы или еще куда подальше, это я мог делать и без форума.
в руководстве написано идите на форум там помогут, чем тут помогут если тут всего 1 человек отвечает.
Почему, Вы считаете, что здесь один человек отвечает?
Почитайте ветку внимательнее, тут много компетентных людей способных компетентно ответить.
Теперь по коду, скопировал я Ваш код, как есть и о чудо, ничего не вылетает и даже работает, т.ч. смотрим кино.
https://yadi.sk/i/KmvhPGEy33oKE4 (https://yadi.sk/i/KmvhPGEy33oKE4)
Вы проверили пример 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 (http://forum.ascon.ru/index.php/topic,30015.msg232981.html#msg232981) - ах это, не Ваш?
PS. Кино ещё раз посмотрите, медленно.
Цитата: 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);
именно этот код не работает.
Вы лучше свой проект прикрепите, если конечно он не секретный.
PS. Уже ненужно.