Как получить список доступных стилей оформления для заданного файла *.lyt

Автор Дмитрий Геннадьевич, 16.04.21, 19:03:58

« предыдущая - следующая »

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

Дмитрий Геннадьевич

Всем здравствуйте!
К сожалению, не нашел в доках...
Как программно получить список доступных стилей оформления (их номера и названия) для заданного файла *.lyt  ???
Желательно на api7...
Заранее благодарен  :beer:

graphdark


Дмитрий Геннадьевич

Цитата: graphdark от 19.04.21, 10:29:13В книге Норсеева 23 страница про это.
Все, что там написано, я знаю. Вопрос не про это, читайте внимательно, вроде пытался внятно сформулировать задачу, может не получилось... Еще раз пробую:
Мне нужно следующее:
Есть некая библиотека оформлений blablabla.lyt. Задача - программно предоставить юзеру перечень всех стилей оформления, которые она содержит (с номерами и названиями)
Ну, в крайнем случае, можно и таким путем пойти:
1. Создать некий временный чертеж;
2. По циклу присваивать ему стили из библиотеки blablabla.lyt, каждый раз читая из свойств чертежа, как они называются и сохраняя себе в массив;
3. Закрыть временный чертеж без сохранения;
4. Показать юзеру массив записей, содержащий номера и названия стилей, которые удалось присвоить чертежу.
Как то это черезжопно что ли... Должен же быть путь покороче?

graphdark

Цитата: Дмитрий Геннадьевич от 20.04.21, 18:49:10Все, что там написано, я знаю.
Везет вам. Я никак выучить не могу, постоянно заглядываю.
Цитата: Дмитрий Геннадьевич от 20.04.21, 18:49:101. Создать некий временный чертеж;
2. По циклу присваивать ему стили из библиотеки blablabla.lyt, каждый раз читая из свойств чертежа, как они называются и сохраняя себе в массив;
3. Закрыть временный чертеж без сохранения;
4. Показать юзеру массив записей, содержащий номера и названия стилей, которые удалось присвоить чертежу.
Как то это черезжопно что ли... Должен же быть путь покороче?
Учитывая, что api7 означает поддержку delphi 7, мне кажется это оптимальный путь. Единственное, что нет Count конца списка, но можно поочередно переменной присваивать пока она не станет nil. В описании sdk я не увидел функции показать весь список для shtType

Дмитрий Геннадьевич

Цитата: graphdark от 21.04.21, 08:42:26можно поочередно переменной присваивать пока она не станет nil
Такой фокус не пройдет, т.к. могут быть заняты не все номера подряд для стилей оформления. У меня есть библиотека оформлений, в которой отсутствуют стили с номерами с 6-го по 12-й, а потом опять начиная с 13-го еще полтора десятка стилей. На что ориентироваться для окончания поиска, непонятно (((((
Цитата: graphdark от 21.04.21, 08:42:26В описании sdk я не увидел функции показать весь список
Вот о чем и вопрос... Если бы оно там было, и вопроса бы не было...

Slaviation

Добрый день.
Может KompasObject::ksGetLibraryStylesArray ?

Пример из справки:
//получим массив оформлений для графических документов из библиотеки graphic.lyt
reference styleArr = ksGetLibraryStylesArray ("d:\\Kompas56\\Sys\\graphic.lyt",
GRAPHIC_LAYOUT_STYLE_LIBRARY);// библиотека оформлений

if (styleArr)

{

char buf[128];

 

//определим количество стилей и отобразим на экране

int count = GetArrayCount(styleArr);

sprintf(buf, "count = %d", count);

Message(buf);

 

//в цикле получим информацию о каждом стиле и отобразим на экране

for (uint i = 0; i < count; i++)

{

LibraryStyleParam par;

GetArrayItem (styleArr, // указатель на массив

i, // индекс в массиве (нумерация начинается с 0)

&par, // указатель на структуру элемента

sizeof (LibraryStyleParam)); // размер структуры элемента

 

sprintf(buf, "ID = %d\nname=%s", par.styleId, par.styleName);

Message(buf);

}

}


Вират Лакх

На питоне:
from win32com.client import Dispatch, gencache
API5 = gencache.EnsureModule('{0422828C-F174-495E-AC5D-D31014DBBE87}', 0, 1, 0)
const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
KompasObject = Dispatch('Kompas.Application.5', None, API5.KompasObject.CLSID)
ksDynamicArray = KompasObject.ksGetLibraryStylesArray(r'c:\Program Files\ASCON\KOMPAS-3D V16\Sys\!Оформление.lyt', 5)
print('Type', ksDynamicArray.ksGetArrayType())
ksLibraryStyleParam = KompasObject.GetParamStruct(const.ko_LibraryStyleParam)
for i in range(ksDynamicArray.ksGetArrayCount()):
ksDynamicArray.ksGetArrayItem(i, ksLibraryStyleParam)
print(i, ksLibraryStyleParam.styleName, ksLibraryStyleParam.styleId)

Дмитрий Геннадьевич

Спасибо большое всем, действительно пролистал эту страничку в хелпе! Опробую на Делфи - отпишусь, что получилось.

Дмитрий Геннадьевич

Еще не получилось (((
Пишу так:

var
styleArr:  ksDynamicArray;

begin
........
styleArr := kompas.ksGetLibraryStylesArray ('... blabla.lyt', 5);
........
end;


пишет ошибку: Incompatible types: 'ksDynamicArray' and 'IDispatch'

Понятно, что массив и указатель на массив - это разные вещи, но что с этим делать????

Вират Лакх

Если бы это был сам динамический массив, то наверное надо было бы писать как-то так:
styleArr: array of ksLibraryStyleParam;
В примере выше написан тип reference
Как-нибудь IDispatch или LPDISPATCH не прокатывает?
Интересно было бы узнать правильный ответ для общего развития.

Sabahs


Вират Лакх

Цитата: Sabahs от 27.04.21, 06:10:52styleArr:=ksDynamicArray(kompas.ksGetLibraryStylesArray ('... blabla.lyt', 5));
Это вы выполнили QueryInterface? А сам kompas.ksGetLibraryStylesArray('... blabla.lyt', 5) какой тип имеет?
Т.е. как записалось бы в две строки через переменные разных типов?

Sabahs

GRAPHIC_LAYOUT_STYLE_LIBRARY 5 - библиотека офор­млений графических документов (*.lyt)
ksGetLibraryStylesArray.png

Дмитрий Геннадьевич

Цитата: Sabahs от 27.04.21, 06:10:52styleArr:=ksDynamicArray(kompas.ksGetLibraryStylesArray ('... blabla.lyt', 5));

Спасибо, Борис! Так и думал, что от Вас будет наиболее конкретный ответ ;-)
Я сейчас на работе, и нет делфи на рабочем компе, чтобы опробовать.
Но я ведь пробовал этот вариант, откомпилировалось без проблем, но рантаймэррор был, поэтому и решил что неправильно...
Однако вечером (ночью))) дома еще опробую, видимо в другом косяк.....

Цитата: Вират Лакх от 27.04.21, 08:41:27Т.е. как записалось бы в две строки через переменные разных типов?

Как бы возвращает IDispatch. Пробовал присваивать промежуточной переменной типа Pointer. Присваивается, но как дальше с ней работать хз. Стандартными средствами паскаля получить ее значение через указатель (...^) и дальше его присвоить переменной нашего типа ksDynamicArray тоже не прокатывало - опять несовместимость типов возникает...

Sabahs

Так посмотрите пример в SDK c:\Program Files\ASCON\KOMPAS-3D v20\SDK\Samples\Pascal\DELPHIAUTO\step2a\.
Принципы работы одинаковые.

Вират Лакх

Как-то по-разному получается с питоном.
Если из модуля выдернуть код ksGetLibraryStylesArray, то он сначала получает питоновский IDispatch, а в итоге-то возвращает интерфейс ksDynamicArray:

ret = KompasObject._oleobj_.InvokeTypes(56, 0x0, 1, (9, 0), ((8, 0), (2, 0)), r'c:\Program Files\ASCON\KOMPAS-3D V16\Sys\!Оформление.lyt', 5)
print(ret)
<PyIDispatch at 0x005C9A10 with obj at 0x0050FA6C>

ksDynamicArray = Dispatch(ret, 'ksGetLibraryStylesArray', None) или даже так работает Dispatch(ret, None, None)
print(ksDynamicArray)
<win32com.gen_py.0422828C-F174-495E-AC5D-D31014DBBE87x0x1x0.ksDynamicArray instance at 0x44429928>

То есть дополнительно запрашивать нужный интерфейс не нужно. По ходу, это ksDynamicArray(kompas.ksGetLibraryStylesArray ('... blabla.lyt', 5)) не QueryInterface...

p3452


Sabahs

SDK, там, от v19.
PS. Я из tlb модули генерировал, а потом до кучи все собирал.


Дмитрий Геннадьевич

Цитата: Sabahs от 27.04.21, 06:10:52styleArr:=ksDynamicArray(kompas.ksGetLibraryStylesArray ('... blabla.lyt', 5));
Ура! Работает :)
Всем спасибо!