Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Python и КОМПАС-Макро => Тема начата: biomotor от 02.06.21, 09:28:10

Название: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 02.06.21, 09:28:10
Каким образом сделать макрос питона на замену выделенного библиотечного .kle элемента?

т.е.:
есть сборка, в нее подключен/а деталь/сборка из библиотеки .kle.
в свойствах детали/сборки указан 'файл-источник' C:\Program Files\ASCON\KOMPAS-3D v19\Libs\mylib.kle|Сборка.a3d
необходимо заменить на C:\Program Files\ASCON\KOMPAS-3D v19\Libs\mylib.kle|Сборка_22.a3d

примерная реализация:
жмешь макрос, он выкидывает окно, в котором ты вставляешь 'путь к библиотеке|сборка' или просто имя сборки (второй вариант предпочтительней), жмешь ок или enter и макрос меняет путь в графе 'файл-источник' и перестраивает сборку.

p.s. может не полностью, но хотябы в какую сторону копать...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 02.06.21, 11:34:23
Полученный результат:

    import pythoncom
    from win32com.client import Dispatch, gencache

    #  Подключим описание интерфейсов API5
    KAPI = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
    iKompasObject = KAPI.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(KAPI.KompasObject.CLSID, pythoncom.IID_IDispatch))
    iDocument3D = iKompasObject.ActiveDocument3D()

    #  GetSelectionMng - Получить указатель на интерфейс менеджера выделенных объектов
    SlcMan = iDocument3D.GetSelectionMng()
    #  SlcMan.GetCount - Считывание количества выделенных объектов
    Count = SlcMan.GetCount()

    #  Срез пути до файла библиотеки
    Part0 = SlcMan.GetObjectByIndex (0)
    PathName = Part0.fileName
    i = len(PathName)
    n = 0
    for n in range(0,i,1):
        if PathName[n] == '|':
            break
    Lib = PathName[0:n+1]

    #  Собираем путь к библиотеке и имя файла
    Name = 'Сборка_22.a3d'
    LibName = Lib + Name

    #  Производим замену всех выделенных элементов
    n=0
    Part = {}
    for n in range(0,Count,1):
        Part[n] = SlcMan.GetObjectByIndex (n)
        Part[n].fileName = LibName
    for n in range(0,Count,1):
        Part[n].Update()
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 15.06.21, 12:51:24
сделал приложение.
для замены нужно:
1) выделить объекты,
2) вписать/вставить название заменяемого файла без директорий.
3) нажать замена

Library.png

https://disk.yandex.ru/d/v9yBYywgKT2TgQ

Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: p3452 от 15.06.21, 13:54:00
5 копеек...
Лучше если у пользователя будет возможность выбирать новый компонент(деталь, сборку) из готового списка (надо этот список библиотечных элементов сформировать и показать пользователю).
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 15.06.21, 13:56:53
p3452, знаю, уже пытаюсь что-то сделать.
Для начала и это уже неплохо.... хоть как-то заменить можно.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Умка от 15.06.21, 14:25:07
Неплохо! Для питона 2.6 можно сварганить?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 17.06.21, 13:21:05
Умка, вообще можно, но я неверное не буду этого делать.
питон разный и придется исправлять и подгонять, а времени особо нет.
а какой питон, 2.6.0 или 2.6.7 ?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Умка от 17.06.21, 15:54:17
питон 2.6.2 на нём много хороших скриптов.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 17.06.21, 22:14:47
Можно так сделать со списком
https://yadi.sk/d/p-CpHKSea8N-ZA

В папке где находится файл с программой(test_Library.pyw) создаем папку Detail.
Выгружаем все из библиотеки kle в папку Detail.
1.png
Запускаем программу. Получаем listbox со всеми деталями из библиотеки.
Выбираем в сборке библиотечные детали, которые нужно заменить. В listboxe выделяем строку с нужной деталью и 2 раза щелкаем левой кнопкой мыши.
Происходит замена.

Если структура библиотеки kle разветвленная то удобнее вместо listbox использовать treeview
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 18.06.21, 08:50:42
Михаил88, а можно дописать программу и будет приблизительно так...
(и к слову, распаковывать весь архив чтобы вывести содержимое нет смысла, потому что все файлы будут в куче,
достаточно распаковать файл 'FileInfo.ru' и вывести его содержимое должным образом.)
Screenshot_1.jpg
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 18.06.21, 08:58:38
Умка, а если упаковать программу в .exe файл с помощью nuitka или pyinstaller то можно будет запускать независимо от того какой python стоит в OS, главное чтобы сама OS поддерживала этот python.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 18.06.21, 09:32:26
biomotor, если распаковать kle , как я показал на скриншоте то структура полностью сохранится. С файла FileInfo.ru думаю тоже можно достать ту же инфу.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 18.06.21, 09:35:52
то что у вас показано на скриншоте тоже можно сделать через treeview
изображение_2021-06-18_113503.png

вот так можно сделать
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 18.06.21, 09:40:33
Михаил88, то что у меня на скриншоте уже сделано через treeview...
(где же Вы были раньше?)
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 18.06.21, 09:58:38
Михаил88, а v1.05 можно глянуть?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Умка от 18.06.21, 12:11:53
Всё-же лучше оное упаковать в exe.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 18.06.21, 14:13:15
biomotor, пока не получится посмотреть в процессе разработки, но она немного для других целей. Спрашивайте если, что то интересует.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 18.06.21, 14:52:36
Михаил88, интересует код на отображение иконок, и на окно предпросмотра. долго махаетесь с ней?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: p3452 от 18.06.21, 16:05:23
Цитата: Умка от 18.06.21, 12:11:53Всё-же лучше оное упаковать в exe.
На ЭТОМ, обычно, и заканчивается "любовь" к Python :angel:
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 18.06.21, 17:48:29
biomotor, при вставке строки в treeview можно передать параметр image
справа в label вставляется тот же рисунок.
Если надо могу сделать пример?
При выборе строки в tree в label будет показываться нужный рисунок
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 18.06.21, 18:24:14
да, если можно примерчик пожалуйста...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 18.06.21, 18:40:14
Хорошо сделаю.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 19.06.21, 13:58:06
Михаил88, Если есть возможность, не откажусь от помощи в разработке кода.... :)
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 19.06.21, 21:00:33
сейчас скину
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 19.06.21, 22:02:36
https://yadi.sk/d/6LEceU0Q2Ch5Gw

здесь библиотека 3D
2 файла, pyw и exe

запускаем файл появляются 2 папки (imag и Detail) в директории где находится файл программы.
в папку Detail скидываем свои модели в дальнейшем структура в treeview будет зависеть от того, как и где будут расположены файлы.
Screenshot_2.png
В программе нажимаем файл -> обновить данные
Идет обновление данных (происходит обновление в папке imag).
Screenshot_1.png
Далее в сборке выбираем нужные детали и 2 нажатием по левой кнопке мыши выбираем нужную деталь в tree программы
Происходит замена

Как сделать выгрузку деталей из kle с сохранением структуры смотри выше.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 19.06.21, 22:12:25
Screenshot_3.png

при выделение строки в tree в окне просмотра справа будет отображаться деталь
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 08:45:51
Михаил88, честно говоря не уверен что распаковка всей библиотеки это хорошая идея, постоянно иметь запас памяти на hdd/ssd диске, и русурсы ПК чтобы распаковать... мой вариант распаковывает только xml файл из библиотеки, и читает все данные с него. я наверное у себя сделаю тоже кнопку обновить данные, но не буду оставлять сами файлы на hdd/ssd диске. Т.е. при каждом запуске будет читаться файл xml, если он отсутствует, происходит 'обновить данные' (распаковка -> png -> удаление моделей). Последующие запуски будут просто читать png и xml файл.
Можете помочь с конвертацией в exe ? у меня постоянно ошибки вылезают...
В вашем коде используются одни и те же png для каждой строки и для предпросмотра, верно?
Как получить data от png?
Вот что пока что получается у меня...
Screenshot_1.jpg
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 12:49:23
понятно, это ведь только для примера. В моей библиотеке мне нужны модели, по этому сделал так.
я создаю exe c помощью pyinstaller. Что вы пишите в командную строку?
да я использую одни и теже png.
для получения data конвертирую картинку (в документации написано ,что лучше использовать формат gif) в base64 (https://base64.guru/converter/encode/image/gif)
после этого она включится в состав программы


Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: p3452 от 21.06.21, 12:53:18
Цитата: biomotor от 21.06.21, 08:45:51мой вариант распаковывает только xml файл из библиотеки, и читает все данные с него
+

И еще, как вариант - есть такое приложение "TemplateManager" (Менеджере типовых элементов), лежит в папке Lib - возможно это то что вам надо (и даже более...).
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 13:13:11
Михаил88, pyinstaller -F myprog.py , Нужно ли подключать библиотеки dll из Win 10 ?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 13:17:00
я не подключаю
можете скинуть мне прогу я у себя попробую создать exe
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 13:19:18
Вот ссылка на простое приложение которое у меня с кучей ошибок. еще и не создается exe.
https://disk.yandex.ru/d/t3DhXKAB6nxklQ

Screenshot_1.jpg
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 13:32:35
https://yadi.sk/d/pbR4xCEC4SWeJg

так должно получиться?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 13:50:46
Оно, только что-то у меня не собирается...

пробовал и так:
set PATH=%PATH%;C:\Windows\System32\downlevel
и так:
set PATH=%PATH%;C:\Windows\SysWOW64\downlevel
и так:
set PATH=%PATH%;C:\Program Files\JetBrains\PyCharm 2020.1\jbr\bin

может что-то нужно еще? Visual C++ или еще что?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 13:58:26
я за комментировал эту строку
style.map("Horizontal.TProgressbar", troughrelief = 'flat')
у меня на ней ошибку выдавало
Еще я использую python 3.6 и pyinstaller 4.2
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 14:02:17
чет я не найду Pyinstaller в списке установленных модулей...
py -m pydoc modules
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 14:10:05
pip list
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 14:12:01
класть программу в корень с pyinstaller?

Python 3.9.2
pyinstaller 3.3.1
pip install pyinstaller не обновляет его до 4.2...

при попытке обновления таким образом, происходит куча ошибок...
pip install --upgrade pyinstaller
(он перебирает версии вниз до 3.3.1 и везде ошибки.)

так тоже ошибки
pip install https://github.com/pyinstaller/pyinstaller/tarball/develop


Имя пользователя русскими или английскими? возможно связано с этим.
я попробовал удалить полностью и установить из уже скачанного архива 4.3 - неполучилось
попробовал закинуть в папку python - неполучилось
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 14:45:21
pip install pyinstaller==4.2
так можно откатить
еще папку с проектом ложить в С
в названии папки и файла программы должны быть только латинские буквы
я так делаю и все ок
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 14:47:51
куда установлен питон? у меня C:\Python39\
имя пользователя OS у Вас латиницей? у меня кирилицей.
команда pip install pyinstaller==4.2 тоже не сработала.

Создал нового пользователя латиницей, установил pyinstaller, перезашел обратно, заработало вроде....
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 15:05:10
у меня латиницей
я не понял смогли exe создать или нет?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 15:08:18
да exe смог создать,
но столкнулся с очередным костылем:
https://disk.yandex.ru/d/v9yBYywgKT2TgQ если сконвертировать этот файл, кнопки не срабатывают почему-то...
для выхода использовал exit(), а нужно было root.destroy()
но с другой кнопкой пока не понятно...  GetSelectionMng() не срабатывает
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 15:19:44
text='🗙'
text='🗘'
надо заменить на
text='x'
text='<>'
если охота, чтобы было красиво установить картинки на эти кнопки
у меня тоже в этих строках ошибки, что то с юникодом связано разбираться не когда, проще поставить картинки
теперь вы знаете как это делается
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 15:30:12
у меня тоже не заработало, надо разбираться
сейчас нету времени
но в прошлый раз когда вы эту прогу скидывали я с нее создавал exe без проблем, правда я ее корректировал
позже посмотрю
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 15:41:56
У меня собралось и работает, все что написал выше заменил и все стало ок. Сначала забыл a3d на m3d заменить.
Еще из функции start exit() убрал он там не нужен
https://yadi.sk/d/WBw23m5YGAumOQ
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 21.06.21, 17:03:54
Михаил88, я тоже собрал. но у меня при запуске мышка думать начинает...
на счет текста у меня не ругался, это символы юникода.
я не хотел использовать картинки по причине того что в стоковом функционале tkinter нет возможности сделать картинку в виде 'data', для того чтобы не использовать отдельный файл, или я ошибаюсь?
или быть может проще сделать dll файл с изображениями? и просто читать их оттуда?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 17:28:04
я же не использовал отдельный файл
после конвертации получил текстовый код записываем его в переменную
например data_png ='R0lGODlhLQAtAIcAAAAAAP8AAP8YGP85Of9zc/8hIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAAACwAAAAALQAtAAAI7gABCBxIsKDBgwgTKlzIsKHDhxAREigwICLBAQUIRBQQoGMAiwA8BhDwkKPIjxBPjmxoUuVDlR1JKmwJsyFMjzIP0ry58KbInAQJ+DyZcKhIjQULGBV5cKnHAgYHOPVYcGrHigatdhyoFWVTrSHBKuwqtifZpS/P+oyotqbFtkxBhm0rl6vaugTP4q1adu/cvnXp4oXr9S3hwmkPI2aoOK7Nxo7HQiYq2epfp0XLdj0o1XJeq1gJKp361SnUgkIxI5yKtOBOt5mHAnU99PHN2QZfb3V4m6XLlCdxJ6QJ8mfEi'

Далее ссылаемся на эту переменную
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 21.06.21, 17:32:55
такой вариант прекрасно подойдет для картинок, которые будут стандартно использованы и не должны меняться.

картинки которые будут обновляться вам уже решать как хранить

Может кто-нибудь знает ,как вообще без этих манипуляций с картинками сделать предпросмотр на python.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: pr0100 от 21.06.21, 23:24:37
При сборке пайинсталлером в пути не должно быть кириллицы. Пользователь на кириллице тут не причём.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: p3452 от 22.06.21, 01:32:56
Цитата: Михаил88 от 21.06.21, 17:32:55Может кто-нибудь знает ,как вообще без этих манипуляций с картинками сделать предпросмотр на python.
Для страждущих - "Preview документов в программе на Python (https://habr.com/ru/post/344086/)".
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 22.06.21, 06:04:04
Спасибо, за ссылку. Ранее уже читал эту статью. Там он еще С использует.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 22.06.21, 08:46:12
pr0100, неверно!
полный путь: C:\ex\progressbar.py. Где тут латиница?
я не пог обновить pyinstaller с версии 3.3.1 до версии 4.3, потому что пользователь кирилицей,
я создал нового пользователя только латиницей, перезашел в него, обновил из него pyinstaller до версии 4.3,
вышел из пользователя, зашел в пользователя кирилицей, и все заработало!

Михаил88, p3452, а есть ли возможность смотреть превьюшки в архиве, не извлекая файлы? rar, zip ???
Вот нашел ссылку:
https://ocomp.info/kak-prosmatrivat-foto-v-arhive.html
(самый идеальный варинт был бы, смотреть превьюхи напрямую из архива, не распаковывая,
только структуры папок там нет, хотя это может быть и неважно, так же из xml прочитать...)
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 22.06.21, 08:57:51
я не знаю
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 22.06.21, 10:42:40
Михаил88, на форуме вроде где-то была функция добавления компонента в сборку, Вы не видели?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 22.06.21, 11:09:36
В SDK все описано, на форуме тоже полно информации
Screenshot_1.png
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 22.06.21, 11:16:34
Screenshot_2.png
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 22.06.21, 11:17:36
Михаил88, спасибо
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: p3452 от 22.06.21, 13:06:32
Цитата: biomotor от 22.06.21, 08:46:12а есть ли возможность смотреть превьюшки в архиве, не извлекая файлы?
Есть!
Но говорить об этом будет иметь смысл если осилите, хотя-бы, чтение содержимого архива.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 22.06.21, 16:24:06
p3452, что Вы под этим подразумеваете? см. скрины что я кидал выше. структура архива показана. что еще нужно?

можно еще так...
import zipfile

zipfile.is_zipfile('ex.kle')
z = zipfile.ZipFile('ex.kle', 'r')
z.printdir()
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: p3452 от 22.06.21, 18:12:52
Цитата: biomotor от 22.06.21, 16:24:06выше. структура архива показана.
Ну! Тогда дело за малым:
- разархивировать не на диск, а в память,
- читать нужные метаданные из нужного файла в памяти (через поток или массив байт - так на C#, как это будет на Python, вам виднее).
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 08:28:09
p3452, разархивировать в память, спорный вопрос, если у меня 50-100 мб архива, то это не так важно, но когда библиотека наполнится до 1-2 гб, все это пихать в память? какой смысл так нагружать OS? проще всего на мой взгляд вообще без превьюшек обойтись, но всетаки с ними поудобней, поэтому я считаю что та схема которую я выбрал выше самая адекватная.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 08:30:46
Михаил88, а выпробовали использовать BitmapImage и иконки в виде кода? у меня не получилось собрать иконку.
что лучше BitmapImage или PhotoImage всетаки?
наверное основные различия:
BitmapImage представляет собой простое двухцветное изображение, PhotoImage – полноцветное изображение.
PhotoImage позволяет использовать полноцветное изображение. Кроме того у этого класса есть несколько (достаточно примитивных) методов для работы с изображениями. PhotoImage гарантированно понимает формат GIF.

выходит BitmapImage - примитив 2 цветов, чего нам обычно нехватает.... поэтому наверное удобней использовать PhotoImage.
кроме того PhotoImage может работать с альфа каналом.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 10:19:27
Не получилось собрать иконку самого приложения? Я что то не совсем понял.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 10:27:30
Михаил88, есть ли аналог https://base64.guru/converter/encode/image/gif
только для BitmapImage?

с PhotoImage дела обстоят печально, не получается убрать border, и четко обозначить размер иконки.
если поставить на frame, то получается что frame подстраивается под размеры PhotoImage, хотя размеры четко заданы и большего размера.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 11:54:05
from tkinter import *
''
data = '''#define smile_width 15
#define smile_height 15
static unsigned char smile_bits[] = {
   0x00, 0x00, 0x80, 0x00, 0x70, 0x07, 0x08, 0x08, 0x04, 0x10, 0x04, 0x10,
   0x74, 0x17, 0x02, 0x20, 0x04, 0x10, 0x14, 0x14, 0xe4, 0x13, 0x08, 0x08,
   0x70, 0x07, 0x80, 0x00, 0x00, 0x00 };'''
root=Tk()
image = BitmapImage(data=data, background='red', foreground='green')
button=Button(root, image=image)
button.pack()
root.mainloop()
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 11:55:01
нашел такой пример, но как изображение в data перевести не знаю
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 11:56:30
Цитата: biomotor от 23.06.21, 10:27:30с PhotoImage дела обстоят печально, не получается убрать border, и четко обозначить размер иконки.
если поставить на frame, то получается что frame подстраивается под размеры PhotoImage, хотя размеры четко заданы и большего размера.
а у меня смотрели как сделано в примере который я высылал?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 13:06:39
Михаил88, у Вас иконки идут напрямую, я хочу сделать кнопку с иконкой и границей.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 13:13:58
а можно увидеть как на выходе вы хотите чтобы получилось? А так сложно что то понять.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 13:23:05
Михаил88, frame с границей и размерами, по центру иконка которая растягивается на максимум, если не указать ipadx или ipady
Screenshot_1.jpg

label имеет размеры не в пикселях,
frame не имеет image,
button не позволяет использовать нормальный border.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 14:09:05
у меня получилось сделать? Так должно было быть.
https://yadi.sk/d/GAXGKEwXdUL-IQ
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 14:43:21
Михаил88, нет не так(старое не рассматриваем).

Нужно создать кнопку у которой вкл/выкл border,
внутри иконка растягивающаяся на всю кнопку и расположенная всегда строго по центру.
возможность поставить ipadx и ipady, для изменения размера иконки.
отсутствие лишних border и прочих границ.

P.S. у меня почему-то вместо растягивания иконки по кнопке, кнопка сжимается до иконки...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 14:47:46
Цитата: biomotor от 23.06.21, 14:43:21Нужно создать кнопку у которой вкл/выкл border,
что это значит, вы скиньте пример
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 14:54:31
кнопка это ваш класс кнопка или стандартная кнопка? Так очень сложно понять без кода, что вы делаете
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 15:16:37
Вариант 1: (не растягивается иконка)

EXIT = 'R0lGODlhEAAQAHAAACH5BAEAAAsALAAAAAAQABAAgwMDAwAAAEVFRUlJSQEBAUhISEREREdHR0NDQ0JCQkpKSgAAAAAAAAAAAAAAAAAAAARMEASxqr0jEDnvLYFmhJ13kMiSkJQloNYatm+YXnJgjLZX5TDfjxRICC28kOG4qBFbHmciB62cek2WBYStOCmK4OXLufmum4BZCCJEAAA7'

class IButton(Frame):
    def __init__(self, master):
        super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')
        self.pi = PhotoImage(data=EXIT)
        self.c = tk.Canvas(self, width=38, height=38, bg='lightblue', highlightthickness=0)
        self.ci = self.c.create_image(19, 19, image=self.pi, state=tk.NORMAL)
        self.c.place(anchor=tk.CENTER, relx=0.5, rely=0.5)

btn = IButton(root)
btn.pack()
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 15:24:07
Вариант 2: (сжимает frame до размеров иконки)

EXIT = 'R0lGODlhEAAQAHAAACH5BAEAAAsALAAAAAAQABAAgwMDAwAAAEVFRUlJSQEBAUhISEREREdHR0NDQ0JCQkpKSgAAAAAAAAAAAAAAAAAAAARMEASxqr0jEDnvLYFmhJ13kMiSkJQloNYatm+YXnJgjLZX5TDfjxRICC28kOG4qBFbHmciB62cek2WBYStOCmK4OXLufmum4BZCCJEAAA7'

class IButton(Frame):
    def __init__(self, master):
        super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')
        self.pi = PhotoImage(data=self.data)
        self.lb = tk.Label(self, image=self.pi, relief='flat', borderwidth=0)
        self.lb.place(anchor=tk.CENTER, x=20-1, y=20-1, width=38, height=38)
        self.pack()

btn = IButton(root)
btn.pack()
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 15:59:27
from tkinter import *
import tkinter as tk

EXIT = 'R0lGODlhEAAQAHAAACH5BAEAAAsALAAAAAAQABAAgwMDAwAAAEVFRUlJSQEBAUhISEREREdHR0NDQ0JCQkpKSgAAAAAAAAAAAAAAAAAAAARMEASxqr0jEDnvLYFmhJ13kMiSkJQloNYatm+YXnJgjLZX5TDfjxRICC28kOG4qBFbHmciB62cek2WBYStOCmK4OXLufmum4BZCCJEAAA7'

class IButton(Frame):
    def __init__(self, master):
        super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')
        self.pi = PhotoImage(data=EXIT)
        self.c = tk.Canvas(self, width=38, height=38, bg='lightblue', highlightthickness=0)
        self.ci = self.c.create_image(19, 19, image=self.pi, state=tk.NORMAL)
        self.c.place(anchor=tk.CENTER, relx=0.5, rely=0.5)

root = Tk()
btn = IButton(root)
btn.pack(fill=tk.BOTH, expand=1)
root.mainloop()
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 23.06.21, 16:02:14
Михаил88, не то, мне нужно чтобы иконка полностью заполняла frame, в моем случае class IButton(Frame):
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 23.06.21, 17:47:11
from tkinter import *
import tkinter as tk
from PIL import Image, ImageTk
import io
import base64

EXIT = 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAG9QTFRFAAAApKSkdnZ2iYmJjIyMd3d3ODg4Ojo6kpKSPDw8iIiISEhINDQ0jY2Nj4+PNTU1Ozs7MjIySUlJMzMzlJSUmZmZmJiYi4uLk5OTPj4+PT09MTExPz8/m5ublpaWjo6OMDAwl5eXkZGRioqKhoaGNNjFLgAAACV0Uk5TAP///////////////////////////////////////////////6idEXsAAACQSURBVHicpZDbFoIgEEUBA+Qi5KCGVGiX///GMhGtHj0v7LXXGjgDQruDSbHggeBElPFyplIwmqTkSlcTGKuOecjU4BqEGv05lsi3bTsH7rR9yzvoA5z9d4MuAFyuP7Xa/l9GCyKAjVs3aBjjzYEuVuct1Pe5ksm7CeUeE1RacZkkYXxII+uamD7z5flDduQFuUsHRd9ZElkAAAAASUVORK5CYII='

class IButton(Frame):
    def __init__(self, master):
        super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')

        self.image = Image.open(io.BytesIO(base64.b64decode(EXIT)))
        self.img_copy = self.image.copy()
        self.pi = ImageTk.PhotoImage(self.image)

        self.lb = tk.Label(self, image=self.pi, relief='flat', bg='lightblue', borderwidth=0)
        self.lb.pack(fill=tk.BOTH, expand=1)
        self.lb.bind('<Configure>', self._resize_image)
        self.pack(fill=tk.BOTH, expand=1) #, padx=3, pady=3 (если нужны границы)

    def _resize_image(self, event):

        new_width = event.width
        new_height = event.height
        self.image = self.img_copy.resize((new_width, new_height))
        self.pi = ImageTk.PhotoImage(self.image)
        self.lb.configure(image=self.pi)


root = Tk()
root.geometry("200x200")
btn = IButton(root)
btn.pack()
root.mainloop()
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 24.06.21, 08:13:39
Михаил88, практически то что нужно, единственное бы средствами tkinter...
а есть встроенные средства resize? или написать что-нить простенькое?
можно конечно использовать subsample и zoom, но иконка не сглаживается тогда...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 24.06.21, 08:18:03
может и можно, но я не искал.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 24.06.21, 08:26:36
Цитата: biomotor от 24.06.21, 08:13:39единственное бы средствами tkinter...

Почему только средствами tkinter хотите?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 24.06.21, 09:16:43
Михаил88, как минимум потому что почти у всех пользователей компаса нет сторонних библиотек, и там не поставишь их...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 24.06.21, 09:28:01
почему exe не использовать? Я пишу программы, всем передаю exe.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 24.06.21, 10:37:55
Михаил88, я не уверен что компиляция будет нормально проходить.
да и не очень хочется в файл накидывать кучу модулей, потом программа виснуть будет.
у меня на первом этапе после компиляции программа подвисает при запуске...
(чем больше модулей, тем больше будет весить exe.) один только python dll сколько весит...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 24.06.21, 11:05:16
вы попробуйте pyinstaller 4.2 (сами разработчики рекомендуют его как стабильно работающий)
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 24.06.21, 14:46:01
Михаил88, а Вы 4.3 пробовали? не знаете он лучше, хуже или так же?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 24.06.21, 20:02:13
не пробовал
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 24.06.21, 21:58:25
biomotor, более простое решение с разработкой библиотеки.
https://yadi.sk/d/tPd8ei7E4eA14A
Screenshot_1.png
заменить на путь до своей библиотеки

здесь и структура и предпросмотр все в одном и все делается встроенными функциями.
порядок действий:
1. Меняем на путь расположения своей библиотеки.
2. Выделяем в сборке нужные детали.
3. Запускаем программу.
4. В открывшемся окне выбираем нужную деталь. Подтверждаем выбор.
5. Происходит замена.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 24.06.21, 22:06:24
Остается сделать интерфейс. Например combobox(для выбора библиотеки если она не одна) ну и кнопку добавить для выполнения функции замены.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 25.06.21, 08:31:12
Михаил88, на счет combobox я уже думал об этом вопроссе...
а чем более простое решение с разработкой библиотеки отличается от моего?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 25.06.21, 08:48:23
вы пробовали запустить файл тот, что я скинул?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 25.06.21, 09:01:12
да, ничего не происходит, может я не помнимаю как с этим работать?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 25.06.21, 09:04:08
видимо да, вы путь к библиотеке на свой путь поменяли?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 25.06.21, 09:07:10
Screenshot_1.png
выделяю детали , запускаю файл с программой
выходит такое окно, выбираю на что поменять
нажимаю выбрать
происходит замена

Вот это окно и есть та самая библиотека , путь к которой прописан в коде.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 25.06.21, 09:32:06
а, путь не поменял....
ну а файл менять только вызовом ГЛАВНОГО окна с последующим выбором файла.
(PATH - путь до каталога Libs, поиск файлов по пути и выбор, жмешь ок, вылетает текущее окно.)
идеальное решение наверное...

в принципе, я пользуюсь только одной своей библиотектой, для меня такого решения будет вполне достаточно. (по поводу всего кода)
да, и еще, если объект/объекты не выбраны, то добавить объект.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 25.06.21, 10:36:17
Михаил88, можете добавить функцию добавления элемента?

Какие еще полезные программы пишете, если не секрет конечно... ?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 25.06.21, 11:37:11
biomotor, добавление элемента в сборку или в саму библиотеку? Можете описать, что эта функция должна делать.
Да всякие программки по автоматизации рутинной работы конструктора.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 25.06.21, 11:42:38
1) Есть готовая открытая сборка, если я не выделяю компонент в сборке, и нажимаю в выборе компонента библиотеки ОК, происходит не замена, а добавление выделенного компонента библиотеки как компонента сборки с выбором места установки.
2) Например? может и мне пригодится, может себе что другое замучу...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 25.06.21, 11:45:15
сделать можно, но вот зачем? Можно же вставить элемент из библиотеки стандартным методом.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 25.06.21, 12:07:09
Михаил88, а зачем мыкаться туда сюда, когда можно пользоваться одним инструментом?

резюме по скорости запуска:
py файл - 3 сек
pyw файл - 2 сек
exe файл - 10 сек

Вероятно из-за распаковки dll файлов из exe...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 27.06.21, 20:29:32
Цитата: biomotor от 23.06.21, 10:27:30Михаил88, есть ли аналог https://base64.guru/converter/encode/image/gif (https://base64.guru/converter/encode/image/gif)
только для BitmapImage?

в документации написано, что нужно сохранить картинку как .xbm. Далее в data прописываем этот файл (data='imag.xbm').
Второй способ открываем файл xbm текстовым редактором и копируем содержимое. Далее этот текст записываем в переменную и в записываем переменную
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 27.06.21, 20:39:38
Цитата: biomotor от 25.06.21, 12:07:09Михаил88, а зачем мыкаться туда сюда, когда можно пользоваться одним инструментом?

Я как раз у себя в программе это и реализовал. Только у меня программа вставляет детали из папки с файлами, а не из библиотеки kle. Теперь думаю надо переписать, чтобы детали брались из библиотеки kle. Преимущества kle очевидны. Еще хотел сделать, чтобы вставка деталей в сборку была сразу с возможность установки сопряжений (аналогично вставке деталей из библиотеки стандартные изделия) вообще ради этого все и затевалось.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 28.06.21, 09:29:47
Михаил88, а Вы не пробовали установить pip в компасовский python?

Для чего вообще нужен питон в компасе? для стороннего подключения пользователей или для внутренних команд самого компаса?
Может вообще только для компас макро?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 28.06.21, 09:44:16
в пятницу попробовал, не получилось выдал ошибку.
Наверное для компас макро. Можете попробовать, при установке компаса отключить установку компас макро. И посмотреть после python установится или нет.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 28.06.21, 10:06:34
Михаил88, походу так оно и есть... только для компас макро.
Установил без компас макро, питона не появилось.

Удалил все из папки: C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\
Установил последний python по пути: C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\App\
Установил последний PyScripter по пути: C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\App\
Заменил Приложения -> конфигуратор -> утилиты->
  Имя:
    PyScripter-Portable.exe
    на PyScripter
  Путь
    C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\PyScripter-Portable.exe
    на C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\App\PyScripter.exe
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 28.06.21, 15:56:45
Умка, какие скрипты, можете поделиться?

Михаил88, можете поделиться кодом для добавления компонента, под Ваш последний код?
(P.S. очень не хочется использовать костыли когда есть готовое практически идеальное решение...)
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 29.06.21, 06:51:26
https://yadi.sk/d/dzUpwqCGH_3zMw
сначала запустить dispatchOCX.py (делается разово)
потом уже пользуемся Библиотека.pyw (в коде заменить на путь до своей библиотеки)

в имени директории расположения папки library не должно быть кириллицы

хорошо бы кто ни будь поделился кодом на наложение сопряжений (совпадение , соосность) при вставке детали из библиотеки
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 29.06.21, 08:19:50
Михаил88, было бы неплохо, но только вот наверняка сопряжения наложить можно но в фоновом режиме, а в режиме редактирования наверное никак...
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 29.06.21, 08:30:01
Можно. На этапе добавления детали в сборку, также как вставляете детали из библиотеки стандартных изделий.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 29.06.21, 10:47:14
Михаил88, в какой программе пишете код на python?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 29.06.21, 11:01:34
PyCharm
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 29.06.21, 11:02:35
Михаил88, PyScripter не используете? пробовали? отзыв?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 29.06.21, 11:07:19
biomotor, PyScripter тоже использовал. Для мох задач его вполне хватало. Потом решил попробовать PyCharm (уже не помню из-за чего) так и остался на нем.
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 29.06.21, 11:46:00
Михаил88, не видали на PyScrypter тему типа как в PyCharm - Darcula?
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: Михаил88 от 30.06.21, 05:57:57
нет не видел
Название: Re: Замена в сборке файла-источника из .kle библиотеки
Отправлено: biomotor от 02.07.21, 17:27:00
Михаил88, вот сделал сам, если кому-то нужно будет, тема и стиль Darcula на PyScrypter. Скачать. (https://ru.stackoverflow.com/questions/1300064/darcula-%d1%81%d0%ba%d0%b8%d0%bd-%d0%b8-%d1%81%d1%85%d0%b5%d0%bc%d1%8b-%d0%b4%d0%bb%d1%8f-pyscripter/1300066#1300066)