Добрый день!
Написал программу (на Python) "KSaver" для сохранения документов КОМПАСа в старые версии. Работает с КОМПАС v21 и предыдущими версиями.
Что умеет:
1. Сохранять текущий открытый/открытые файлы, в "одиночном" и "массовом" (все открытые файлы) режиме.
2. Если неоткрыт документ или документ неактивен (нажат домик), предлагает массовое сохранение из папки.
3. Возможность задавать настройки (версия сохранения; откуда брать файлы; куда сохранять) каждый раз при запуске или записать их в txt файл.
4. Имеет основные опции (задаются в txt файле): "model_name" - брать обозначение и наименование из модели;
"mass_saving" - включение/выключение опции массового сохранения (для открытых файлов);
"file_version" - версия в какую сохранять файл;
"types_of_documents" - типы документов для обработки;
"***_directory" - путь к папкам открытия/сохранения документов;
.... и т.д.
5. В случае невозможности сохранения, выдаёт сообщение о открытии или создания списка этих файлов.
6. В случае невозможности открытия, выдаёт сообщение, о создании списка этих файлов.
В планах:
1. Сделать быстрое открытие в КОМПАС v21 (по аналогии как открытие перетаскиванием "BeginDragOpenFiles", если есть пример, буду очень благодарен).
2. Добавить сохранение в другие форматы.
3. Добавить опцию сохранения дет./подсборок из открытой СБ.
4. Сделать интерфейс.
P.S. Приложение работает с txt файлом расположенном радом с ним, можно сохранить приложение и txt файл с разными настройками в разные папки и создать ярлык на приложение.
P.S.S Во вложение не влазит, архив будет из 2-х частей.
Вторая часть архива.
dimak222, а для России будет вариант программы с русским именем?
Сейчас многие используют Яндекс Диск. !0 Гб бесплатно. Сюда только ссылку.
Цитата: Валерий Изранов от 27.01.23, 12:16:46dimak222, а для России будет вариант программы с русским именем?
Изначально было "Сохранение в старые версии", но звучит не очень, да и ещё планирую добавить сохранение в другие форматы, так что решил так назвать.
В свойствах файла, есть описание со старым названием=)
Цитата: Валерий Изранов от 27.01.23, 12:16:46Сейчас многие используют Яндекс Диск. !0 Гб бесплатно. Сюда только ссылку.
Тоже думал насчёт этого, но тут оно останется пока работает форум. А на диске могу и ненароком удалить... Конечно могу продублировать если будет полезно.
Юнец (совсем начинающий),Кадет(уже слегка подросший)и множество других нейтральных имен...
Отвлекись и подумай. Мысли придут.
Цитата: Валерий Изранов от 27.01.23, 12:16:46Сейчас многие используют Яндекс Диск. !0 Гб бесплатно. Сюда только ссылку.
Если не знаете то можно сделать хоть 1000гб бесплатно.
Регите 10 разных почт и подключате в настройках все по максимум.
в ТС есть плагин WebDav прописываете пароли там и одним кликом прям попадаете на яндекс диски, и в быстром меню или на бар делает ссылку перескакиваете мгновенно туда, без каких либо вводов паролей и тд они все в настройке один раз делаются.. быстрый просмотр от туда работает тоже !!!!
Оч удобно!
К сожалению, архив распаковать не удалось, просит KSaver v1.3.3.z01.
В качестве пожелания, в первую очередь, конечно прошу интерфейс и сохранение в PDF.
Цитата: mikor от 27.01.23, 20:17:21архив распаковать не удалось
https://cloud.mail.ru/public/7Ug1/8McXWZDXK
Интересно, а можно ли использовать разные окружения в которых хранятся соответствующие библиотеки Компаса ?
Цитата: Doom от 01.02.23, 15:47:28Интересно, а можно ли использовать разные окружения в которых хранятся соответствующие библиотеки Компаса ?
Сложно, я не понял вопроса=) Да и скорее всего подсказать не смогу, кроме Python ни на чём не писал...
P.S. Если смотрю за темой по потокам, если будет вариант решения, прошу отписаться=)
Цитата: dimak222 от 01.02.23, 15:55:41P.S. Если смотрю за темой по потокам, если будет вариант решения, прошу отписаться=)
На сколько я понимаю, у Sabahs параллельность была реализована просто запуском нескольких экземпляров Компаса?
Типа берем список файлов, делим на заданное количество компасов и обрабатываем...
Цитата: Вират Лакх от 02.02.23, 10:10:46На сколько я понимаю, у Sabahs параллельность была реализована просто запуском нескольких экземпляров Компаса?
Хммм, возможно и так. Просто, я не пробовал подключиться ко второму экземпляру КОМПАСа, если запустить два экземпляра, автоматом подключиться к первому.
Ну и по опыту случайного открытия двух экземпляров, КОМПАС часто ломается, то при закрытии КОМПАСа ругается на изменения файлов другой программой (...\AppData\Roaming\ASCON\KOMPAS-3D\XX\KOMPAS.prj и KOMPAS.cfg), то шрифты ТТ становиться длиннее (лечиться выключением/включением компа). Конечно не факт что будет повторяться, надо пробовать.
Есть идеи как подключаться к другим экземплярам?
Не надо к ним подключаться, их надо создавать, работать с ними и закрывать. Для создания используем DispatchEx. Он возвращает интерфейс - и поехали.
Цитата: Вират Лакх от 02.02.23, 11:57:14Для создания используем DispatchEx
Уумммм, спасибо! Буду пробовать=)
Цитата: dimak222 от 01.02.23, 15:55:41Сложно, я не понял вопроса=) Да и скорее всего подсказать не смогу, кроме Python ни на чём не писал...
я имел ввиду что у пользователя данной утилиты мб установлена другая версия Компаса и как тогда с ним работать ?
# определить версию нужно как то и иначе
Get_Ver_Kompas = iKompasObject.ksGetSystemVersion()
match Get_Ver_Kompas:
case "14":
sys.path.append(r'C:\Python38x32\KompasModuleFor14')
case "15":
sys.path.append(r'C:\Python38x32\KompasModuleFor15')
case "16":
sys.path.append(r'C:\Python38x32\KompasModuleFor16')
case :
messagebox.showinfo("error", "Не обнаружена соответствующая версия Компас -3D")
далее идет код соответствующей версии..
Цитата: Вират Лакх от 02.02.23, 10:10:46На сколько я понимаю, у Sabahs параллельность была реализована просто запуском нескольких экземпляров Компаса?
видимо так и есть - но доступа я так не нашел пока + не как не могу получить доступ к объекту Компаса из авто запускаемой библиотеки что бы передать его своему приложению.
Цитата: Вират Лакх от 02.02.23, 11:57:14Для создания используем DispatchEx.
не совсем понятно как с ним работать
def Dispatch(
dispatch,
userName=None,
resultCLSID=None,
typeinfo=None,
UnicodeToString=None,
clsctx=pythoncom.CLSCTX_SERVER,
):
def DispatchEx(
clsid,
machine=None,
userName=None,
resultCLSID=None,
typeinfo=None,
UnicodeToString=None,
clsctx=None,
):
Цитата: Doom от 02.02.23, 15:38:42я имел ввиду что у пользователя данной утилиты мб установлена другая версия Компаса и как тогда с ним работать ?
Я подключаюсь к открытому/открываю программно (когда компас зарегистрирован правильно, он при подключении сам открывается) через Dispatch, дальше, при необходимости, узнаю версию у самого КОМПАСа.
from win32com.client import Dispatch, gencache # библиотека API Windows
KompasAPI5 = gencache.EnsureModule('{0422828C-F174-495E-AC5D-D31014DBBE87}', 0, 1, 0) # API5 КОМПАСа
iKompasObject = Dispatch('Kompas.Application.5', None, KompasAPI5.KompasObject.CLSID) # интерфейс API КОМПАС
iKompasVersion = iKompasObject.ksGetSystemVersion() # текущая версия компаса
iKompasVersion = iKompasVersion[1] + iKompasVersion[2]*0.1 # разбиваем полученое значение на обычную запись (19.0)
print(iKompasVersion)
а может быть такое что одна и таже функция по разному реализована в модулях ?
и что бы это все не отслеживать просто закинуть соответствующие и готово..
в мануале написано
DispatchEx решает проблему многопоточности..
у Sabahs утилита написана на Delphi + он ее так хорошо запаковал что ее скажем так не изучить)))
я почему то уверен что Компас поддерживает командную строку - запустив с аргументами и забыл про него.. (тк он писал что есть ряд не задокументированных функций)
Цитата: dimak222 от 02.02.23, 11:41:53КОМПАСа ругается на изменения файлов другой программой
тут два варианта 1) я думал что у Компаса есть debug профиль запуска который хранит все переменные файлы гдето в темр - у многих программ видел такой профиль
+ CreateProcess в аргументах есть поддержка переноса файлов например в тот же temp папку потом автоматом очищается.
2) сообщениям говорить - нет.
Вират Лакх, спасибо!
работает :-)))
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import DispatchEx, gencache
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH
def runApp():
KAPI = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
iKompasObject = KAPI.KompasObject(DispatchEx("Kompas.Application.5")._oleobj_.QueryInterface(KAPI.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject = iKompasObject
KAPI7 = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
iApplication = KAPI7.IApplication(DispatchEx("Kompas.Application.7")._oleobj_.QueryInterface(KAPI7.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = iApplication
iApplication.Visible = True
return (KAPI, KAPI7, iKompasObject, iApplication)
KAPI_0, KAPI7_0, iKompasObject_0, iApplication_0 = runApp()
KAPI_1, KAPI7_1, iKompasObject_1, iApplication_1 = runApp()
Documents_0 = iApplication_0.Documents
Documents_1 = iApplication_1.Documents
kompas_document_0 = Documents_0.Open(r"G:\temp\file1.cdw", True, False)
kompas_document_1 = Documents_1.Open(r"G:\temp\file2.cdw", True, False)
Цитата: Doom от 02.02.23, 16:42:39а может быть такое что одна и та же функция по разному реализована в модулях ?
и что бы это все не отслеживать просто закинуть соответствующие и готово..
Модуль должен соответствовать своей версии компаса. Может в новой версии API исправлен косяк предыдущей, а работа команды определяется версией компаса, а не его API.
В общем, не стоит оно того, хранить кучу сгенерированных модулей в надежде на что-то там. От этого скорее словишь глюк, чем какую-то пользу. И 100% сложнее код.
Цитата: Doom от 02.02.23, 22:09:41в мануале написано DispatchEx решает проблему многопоточности..
у Sabahs утилита написана на Delphi + он ее так хорошо запаковал что ее скажем так не изучить)))
я почему то уверен что Компас поддерживает командную строку - запустив с аргументами и забыл про него..
Что за мануал?
Sabahs не запаковал, а скомпилировал. Изучить только через disassembler или ещё может какие-то способы существуют.
Скорее всего Компас не поддерживает командную строку, иначе про это было бы в SDK.
Цитата: Doom от 02.02.23, 22:36:33работает (https://forum.ascon.ru/Smileys/fugue/hihi.gif)
Зачем у нас некоторые товарищи импортируют всякие там LDefin2D и MiscellaneousHelpers? Вы их используете в программе?
И эта странная фраза "KAPI.KompasObject(DispatchEx("Kompas.Application.5")._oleobj_.QueryInterface(KAPI.KompasObject.CLSID, pythoncom.IID_IDispatch))". В универсальном Dispatch и так уже накручено-наворочено всякое, а тут ещё сверху опять то же самое.
У вас в этом коде не четыре компаса запускается?
Цитата: Вират Лакх от 03.02.23, 06:10:16Что за мануал?
https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/windows-scripting/reference/idispatchex-interface?redirectedfrom=MSDN (https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/windows-scripting/reference/idispatchex-interface?redirectedfrom=MSDN)
тут по частичному комментированию более менее хоть что то
https://github.com/mhammond/pywin32/blob/d10d5594b1951c58930f42a000a6038eed6a283d/com/win32com/client/__init__.py#L98 (https://github.com/mhammond/pywin32/blob/d10d5594b1951c58930f42a000a6038eed6a283d/com/win32com/client/__init__.py#L98)
мануал - наверно сильно сказано
Цитата: Вират Лакх от 03.02.23, 06:10:16Зачем у нас некоторые товарищи импортируют всякие там LDefin2D
у меня он модифицированный и добавил описание диалоговых окон которые не нашел в справке
Цитата: Вират Лакх от 03.02.23, 06:10:16Sabahs не запаковал, а скомпилировал. Изучить только через disassembler или ещё может какие-то способы существуют.
или компилятор с элементами защиты есть и такое.