Библиотека для деталей БЧ

Автор Вират Лакх, 19.08.17, 07:32:57

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

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

Вират Лакх

Для чего задержка root.after(500, Selection) ?

Задержка перед передачей фокуса на Gabarit не везде дает переключение на окно макроса.
Мои поиски привели меня к тому же, что у нас уже есть! Процедура Copy_program нормально же открывала окно!
Отсюда предлагаю сделать так:
Цитировать
def Copy_program(exit):
    """
    Ищет ранее запущенные свои копии
    """
    EnumWindows = ctypes.windll.user32.EnumWindows
    EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
    GetWindowText = ctypes.windll.user32.GetWindowTextW
    GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
    IsWindowVisible = ctypes.windll.user32.IsWindowVisible
    def foreach_window(hwnd, lParam):
        if IsWindowVisible(hwnd):
            length = GetWindowTextLength(hwnd)
            buff = ctypes.create_unicode_buffer(length + 1)
            GetWindowText(hwnd, buff, length + 1)
            if buff.value.find(u"Оформление детали БЧ") != -1:
                hwnd = win32gui.FindWindow(None, buff.value)
                win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) # разворачивает окно
                if exit:
                   sys.exit()
        return True
    EnumWindows(EnumWindowsProc(foreach_window), 0)

Цитировать
"""_____________________НАЧАЛО ПРОГРАММЫ___________________________________"""
Copy_program(True)

Цитировать
if root.state() != "normal":
                Copy_program(False)
                Gabarit.focus()

Только вопрос маленький в том, что при проверке копии программы перестает перебирать окна sys.exit(), а как остановить перебирание окон после того, как нужное нашлось, в случае, когда надо просто развернуть окно?

Проверьте у себя, работает ли таким образом передача фокуса макросному окну после измерения.

ТрындецЪ

Цитата: Вират Лакх от 04.10.17, 08:07:09
Только вопрос маленький в том, что при проверке копии программы перестает перебирать окна sys.exit(), а как остановить перебирание окон после того, как нужное нашлось, в случае, когда надо просто развернуть окно?
Проверьте у себя, работает ли таким образом передача фокуса макросному окну после измерения.

Отлично работает! Молодец!
Я особо не вникал в функцию, пусть себе перебирает все окна, на результате работы не отражается и ладно.
ЦитироватьДля чего задержка root.after(500, Selection) ?

Это пауза в зацикливании. Программа проверяет не выделено ли что-нибудь с периодичностью в 0,5 сек.
Тут правильнее было бы подписаться на событие окна документа, но с этим я пока не дружу.

Вират Лакх

Новая версия 0.7.3. Пока основной программист занят, ребенок балуется с питоном :) Вроде ничего не испортил.
За исходник взят макрос версии 0.7.2 из Ответа #116 : 22.09.17, 18:15:54

* Исправлено появление копии программы.
* Исправлен фокус на окно макроса после измерения.
* Изменен текст во всплывающем меню для шаблонов на "Вставить шаблон".
* Добавлена настройка в константах по отображению незначащего нуля после запятой. По той рекомендации <Чтобы незначащие нули показывались, нужно вырезать .rstrip("0").rstrip(",")> показывается только один нуль, который после запятой. В остальном толку нет. Или я не догнал что к чему. Возможно, тут зависимость от единиц измерения в модели: граммы или килограммы...
* Попробовал для отображения дроби использовать вместо минуса знак подчеркивания. Вроде красивее стало.
* Доделана приписка мм для шайб: "D = 55 мм, d = 66 мм", когда activ_mm = True.
* Добавлена настройка для типа доп. колонки Обозначение материала (по сути для себя сделал, чтобы новые версии легче настраивать было).
* Добавлена экспериментальная опция автозапуска Измерения. Только её допилить надо в зависимости от ситуации. В деталях сойдет, а в сборочниках, где еще не выбрана деталь или не реализован п.8 (см. ниже), неуместно пока.

Итоги. Из ранее написанного варианты развития:
4) Небольшая фишка еще. У меня материал по умолчанию удален, т.е. пустая строка. Если пустой материал, то умная галочка должна отключиться или, оставаясь включенной, не прописывать @/.
5) Еще один путь для замеров. Сейчас мы запускаем линейку, а потом указываем. Но возможен путь такой: я выделяю грань, запускаю макрос и линейку. Линейка понимает, что что-то выделено и вставляет, если выделено правильное.
6) Что вы думаете насчет автозапуска линейки и/или автоctrl+enter после линейки? Давайте сделаем еще пару настроек для этих двух авто. Просто обозначение детали я могу сделать в другое время, Название отключено. И мне, кроме линейки, делать-то в макросе нечего.
7) Еще из нового функционала для сборок: деталь выделять не только в дереве или с shift+ЛКМ на поверхность, но и попробовать научить макрос определять чья (какой детали принадлежит) выделенная поверхность.
8) п.7 + п.5 = Выделяем в сборке ребро, грань или цилиндр и запускаем макрос. Макрос определил, какой детали выделенное принадлежит, обновил содержимое полей у себя в окне по этой детали. Потом пользователю можно сразу запускать линейку, а она сразу берет выделенную геометрию и вставляет в поле Габарит.

ТрындецЪ

Цитата: Вират Лакх от 05.10.17, 09:27:02
Новая версия 0.7.3. Пока основной программист занят, ребенок балуется с питоном :) Вроде ничего не испортил.
За исходник взят макрос версии 0.7.2 из Ответа #116 : 22.09.17, 18:15:54

Давно бы так))) Я вас всех научу Python любить :-)))

Замечание по коду: переменную exit лучше переименовать, т.к. это имя уже зарезервировано за системной функцией exit().

Умка

перестало выполнять замеры, однако

Вират Лакх

Микрообновление v0.7.4, чтобы тема не забывалась.
* сделал п.4: про пустой материал и @/
Цитировать# Получаем материал
    if mat_var.get() and iPart7.Material != "":

* доделал п.6: добавил настройку "автоctrl+enter после линейки". Но мне не нравится, что при нажатии на Стоп тоже вносятся изменения и закрывается программа. А должно прерваться измерение и ждать следующих действий пользователя. Значит не туда вставил и/или какие-то условия надо добавить. Ув. ТрындецЪ, добейте, плиз :)
Цитироватьif auto_close:
              Start_2()

Умка, про замеры. Вам надо поудалять или закомментировать сообщения в этой процедуре, если я правильно понимаю.

ТрындецЪ

18.10.17, 13:24:45 #166 Последнее редактирование: 18.10.17, 13:53:32 от ТрындецЪ
Цитата: Вират Лакх от 18.10.17, 09:03:40
доделал п.6: добавил настройку "автоctrl+enter после линейки". Но мне не нравится, что при нажатии на Стоп тоже вносятся изменения и закрывается программа. А должно прерваться измерение и ждать следующих действий пользователя.

Нужно было ещё отступов добавить, чтобы попало в условие, вставляющее текст в габарит.

Попутно добавил обработку предварительного выделения перед вызовом замеров (п.5). Давно реализовал в черновой версии.

Вират Лакх

Классно! Осталось только п.8 сделать, но это точно мне как до луны раком.
И всё, у меня идей нет больше для того варианта программы, как сейчас.
Остается только пробовать полный автомат определения габаритов и ссылки через линию-выноску.

Вират Лакх

Немного смущает способ чтения свойств источника. Сейчас макрос заходит в редактирование на месте и сразу выходит, видимо, считав оттуда обозначение, наименование и материал. Но компасная команда Информация об объекте может считать свойства источника без входа/выхода в компонент. Может наведем эстетику и пересмотрим чтение свойств? Кто знает, как прочитать свойства источника, не заходя в редактирование на месте?

Умка

БЧ_v0.7.4.1.7: application.MessageBoxEx заменил на kompas_object.ksMessage и если я указываю где выполнить замер, а потом запускаю линейку, то получаю размер. Если запускаю линейку, то получаю зависание.

ТрындецЪ

Цитата: Умка от 27.10.17, 11:07:41
БЧ_v0.7.4.1.7: application.MessageBoxEx заменил на kompas_object.ksMessage и если я указываю где выполнить замер, а потом запускаю линейку, то получаю размер. Если запускаю линейку, то получаю зависание.

Выложите свой код. Похоже, где-то пропустили сообщение.

Вират Лакх

02.11.17, 06:22:34 #171 Последнее редактирование: 02.11.17, 07:03:27 от Вират Лакх
Испытания макроса в боевых условиях привели к желанию иметь комбинацию ctrl+a для выделения всего текста в полях ввода.

Еще есть мысли по последовательности записи размеров листа. Как оно сейчас происходит? Видимо так: XxY. Может записывать сначала меньший размер, а потом больший типа не 260х80, а 80х260? Это я к тому, если будут несколько одинаковых, но по-разному созданных листов одной ширины и длины. Тогда объекты спецификации станут разными из-за разных наименований. И для вообще разных листов тоже неплохо бы однообразную запись. Если группировать БЧ в спецификации под один материал, то эти детали по правилам должны быть отсортированы от меньшего к большему. И внутри габаритов ту же сортировку от меньшего к большему. Тогда группа будет такой: 80х260 мм, 80х300 мм, 100х500 мм и т.д.
UPD
Если макрос был запущен в детали, а потом я пошел в сборку выяснить некоторые подробности и в ней вношу данные, то макрос говорит "Выделите деталь". Можно как-то запоминать, с чем имеем дело?

ТрындецЪ

Цитата: Вират Лакх от 02.11.17, 06:22:34
Испытания макроса в боевых условиях привели к желанию иметь комбинацию ctrl+a для выделения всего текста в полях ввода.
... Может записывать сначала меньший размер, а потом больший типа не 260х80, а 80х260?

Реализовано в v0.8.

Вират Лакх

1) добавил применение title (давно хотел это вам предложить, смотрю в других макросах title используете, значит и тут сделаете в новых версиях) тут: root.title(title + " v0.8") и if buff.value.find(title) != -1
2) Если стандартным путем идти в сборочнике: выделить деталь и потом измерить, то макрос на меня говорит желтым знаком "выделите грань...". Но я же ничего плохого не сделал :) Макрос смотрит при измерении, что что-то выделено, а выделено не то: деталь вместо геометрии. Вот и ругается. Поменял 48 на 64.
3) Хотел объединить start и start2 типа так: def Start(exitprog), но, видимо, в кнопках нельзя писать "command = Start(True)". Напортачил в коде :)
А объединить хотел для того, чтобы ввести в процедуре локальную переменную activedoc, значение которой меняется на False после application.MessageBoxEx( u"Активный документ не является деталью или сборкой!", title, 48). Потом этот фолс не дал бы выйти из программы: if exitprog and activedoc: sys.exit().
Всё это для того, чтобы макрос не отключался при ctrl+enter на 2D чертеже. А то функция внесения изменений и закрытия закрывает, а вносит или нет - сразу непонятно.
Придется тогда глобальную переменную создавать и передавать её в start2, да?
4) а) ocircumflex - это какая кнопка? б) И не могу найти в коде, где в габарите сначала ставится меньшая цифра, потом большая (для общего развития).
5) С включенным capslock ctrl+A не работает.
6) А еще хотел добавить в контекстном меню строчку "Выделить всё" и подписи: Ctrl+X, Ctrl+C, Ctrl+V, Ctrl+A, ↓
Как, интересно, их по правому краю сделать. Просто пробелами - не вариант.

Вират Лакх

Сам делаю свои хотелки, часть вторая. Версия 0.8.1. Сделал п. 1, 2, 3, 6.
ТрындецЪ, ответьте по п. 4, плиз.
upd: Если вызвать контекстное меню без мигающего курсора на поле ввода, то Выделить всё не срабатывает. Надо как-то фокус передавать при ПКМ на поле или при команде "выделить всё".

Умка

Ошибка при замере

Traceback (most recent call last):
  File "C:\Program Files\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Program Files\ASCON\Á× v0.8.1.pyw", line 990, in <lambda>
    but3 = tk.Button(frame, image = img, command = lambda event = None: Izmerit(event))
  File "C:\Program Files\ASCON\Á× v0.8.1.pyw", line 743, in Izmerit
    kompas_object.ksMessage( u"УкажиÑ,е грань, цилиндрическую поверÑ...носÑ,ÑŒ или ребро", title, 64)
TypeError: ksMessage() takes at most 2 arguments (4 given)

Вират Лакх

08.11.17, 10:35:47 #176 Последнее редактирование: 08.11.17, 10:57:15 от Вират Лакх
Это всё та же тема с сообщениями в вашем компасе. Поставьте # перед kompas_object.ksMessage на 743 строке.
И во всех остальных местах, где есть такая ошибка.
upd: А, вообще, TypeError нерусским по белому говорит, что якобы ksMessage() берет не больше чем два аргумента, а дали 4. Где он там четыре насчитал - хз, но попробуйте удалить ", title, 64" из команды.
upd2: У вас точно включено "Сервис->Параметры->Система->Общее->Всплыва­ющие сообщения->Использовать всплывающие сообщения вместо информа­ционных диалогов" и вторая рядом галка?
Вам бы все-таки порешить со всплывающими сообщениями.

Умка

", title, 64" в строке удалил и заработало! Спасибо.

ТрындецЪ

Цитата: Вират Лакх от 03.11.17, 07:44:06
4) а) ocircumflex - это какая кнопка? б) И не могу найти в коде, где в габарите сначала ставится меньшая цифра, потом большая (для общего

a) Это для "Ф" русской раскладки мне такое выдало, когда я коды клавиш "пробивал".
б) Строка 628 в версии 0.8.1
text = (str(round(min(ab),n_izm))).replace(".",",").rstrip("0").rstrip(",") + u"х" + (str(round(max(ab),n_izm))).replace(".",",").rstrip("0").rstrip(",")

Вират Лакх

Спасибо, ясно. А как вы пробиваете? Это вы пробили для маленькой "ф". Я для "Caps Lock + a" добавил, но еще "Caps Lock + ф" осталось.
Что скажете по upd из Ответ #174? Есть быстрое решение?
UPD
И еще мысль: а не научить ли нам макрос присваивать материал? У нас, например, есть считанный материал от первой детали и есть еще детали, которые должны быть из этого же материала, но материал не указан или стоит неправильный. Можно было бы этот считанный материал присваивать другим деталям.