Связать толщину листа с параметром модели.

Автор IgorT, 28.04.26, 14:07:01

« назад - далее »

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

Kilia


Михаил88

Могу написать, но позже. Пока по делам отъехал.
+ Благодарностей: 1

Kilia


Михаил88

#63
Напишите, как планируете использовать?
Может лучше, как предложил Борис Николаевич.

Цитата: Gruden от 29.04.26, 09:27:47Кто прикалывается?
Подписались на события, обработали выбор материала и обновили всё, что нужно

Михаил88

Цитата: Kilia от 30.04.26, 18:12:09А есть пример как?

Пример обработки события «Выбор материала закончен».

# -*- coding: UTF-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache
import tkinter as tk

kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)


class MyksDocument3DNotify7(kompas_api7_module.ksDocument3DNotify7):
    def __init__(self, obj):
        super().__init__(obj)

    def OnChoiceMaterial(self, material=None, density=None):
        """Закончен выбор материала."""
        print('Начало обработки события — выбор материала закончен.')
        print(f'Материал: {material}.')
        print(f'Плотность: {density}.')
        # Здесь пишешь вызов своей функцию, которая будет делать нужную обработку.


def exit_app():
    print("Отписка от события")
    my_document3d_notify7.close()
    print("Уничтожение окна")
    root.destroy()


if __name__ == '__main__':

    root = tk.Tk()
    root.protocol("WM_DELETE_WINDOW", exit_app)

    try:
        application = kompas_api7_module.IApplication(
            Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                                     pythoncom.IID_IDispatch))
        kompas_document = application.ActiveDocument
        if not kompas_document:
            raise Exception("Нет активного документа в КОМПАС-3D")

        document_type = kompas_document.DocumentType
        if document_type != kompas6_constants.ksDocumentPart:
            raise Exception("Нет активной 3d модели")
        kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
        my_document3d_notify7 = MyksDocument3DNotify7(kompas_document_3d)

        root.mainloop()

    except Exception as e:
        print(f"Ошибка: {e}")
        root.destroy()
+ Благодарностей: 1

Михаил88

Цитата: Gruden от 30.04.26, 14:06:12По воде, писаные сложности, особенно, если их создать себе.
PS. Вы в Колхозе работаете? Или на предприятии?
На предприятии, но это не относится к делу. Если к Вам придут и попросят написать универсальное решение, Вы будете говорить: «Начните работать по ГОСТ, ЕСКД, а потом я начну решать ваши задачи?»
Видел даже такие маркировки - Лист ОЦ 1, Лист ХК 5 и т.д.
Не вижу проблем обработать справочник материалов предприятия и добавлять к нему по необходимости нужный материал. Даст дополнительный контроль того, что конструктор закладывает в КД.
Бывали случаи, закладывают, а на предприятии нет такого материала, срок поставки ого-го или вообще негде купить.

А работал я на разных предприятиях от сотен до тысяч человек. Работающих по ЕСКД и не совсем по ЕСКД.
Опыт имеется, и я знаю, о чем пишу.

IgorT

Цитата: Михаил88 от 30.04.26, 15:22:02Тут сработает?
Паронит ПМБ-1 Т 0,4х300х400 ГОСТ 481-80
Вот так в справочнике Материала набрал.
Лист$dА АБТ1-БШ1-БД-ПВ-I-НО-КД1-5х1600х6000 ГОСТ 19903-2015;440 S235JO-10-10-1ГП-Ф2-УЗК-09Г2-КП-ГС ГОСТ 19281-2014$с учетом 5.2.4
Это что хрень??!?!??!?!!?! Диковенная диковина!
Тему собственно поднял по причине мотивации КАЖДОДНЕВНОЙ РАБОТЫ с листами проката стали. Там приходится отслеживать изменения толщины листов!
А тут предъявляют Лист$dА АБТ1-БШ1-БД-ПВ-I-НО-КД1-5х1600х6000 ГОСТ 19903-2015;440 S235JO-10-10-1ГП-Ф2-УЗК-09Г2-КП-ГС ГОСТ 19281-2014$с учетом 5.2.4

Ладно!

как я вижу здесь отловить толщину листа можно по знакам "-" или " "  СЛЕВА и символу "х" СПРАВА.
Но у Вам вижу это не нужно. У Вам совершенно другой подход.
Больше не хочу в этом обсуждении участвовать. Увольте!


Михаил88

Конечно хрень. Всякое может быть. Охота было универсальное решение для большой массы пользователей. Вам наверное нужно только для себя.
Если брать, что маркировка материала идет по ГОСТ или ТУ, то проблем нету, по крайней мере пока не вижу.
Можно строку разделить по ГОСТ или ТУ, взять элемент с нулевым индексом, отсеч пробел в конце строки, потом разделить по пробелам и взять последний элемент списка, далее если есть х то поделить по нему и взять нулевой элемент, который и будет толщиной, если х нету, то это и есть толщина, ну и можно проверки добавить.
Ну или сделать через регулярные выражения.

Можно подписаться на события и будет все обновляться в автомате.

Михаил88

import re

def get_thickness(material):
    """Получить толщину из материала"""
    if not isinstance(material, str):
        print(f'{material} - это не строка!')
        return None

    # Ищем часть до ГОСТ или ТУ
    match = re.search(r'^(.*?)(?:ГОСТ|ТУ)', material)
    if not match:
        print('Отсутствует ГОСТ или ТУ в маркировке материала!')
        return None

    assortment = match.group(1).strip().replace('$d', ' ').replace('-', ' ')

    # Разбиваем на слова и берём последнее
    words = assortment.split()
    if not words:
        print('Не удалось извлечь размеры из маркировки!')
        return None

    sheet_dimensions = words[-1]

    thickness_match = re.search(r'(\d+(?:,\d+)?)[xXхХ]', sheet_dimensions)
    if thickness_match:
        return thickness_match.group(1)

    # Если x/х нет, проверяем, является ли последнее слово числом
    if re.fullmatch(r'\d+(?:,\d+)?', sheet_dimensions):
        return sheet_dimensions

    print('Не удалось определить толщину в маркировке!')
    return None


if __name__ == '__main__':
    material_ = 'Лист ОЦ$d0,70 ГОСТ 19904-90;08пс ГОСТ 14918-80$'
    print(get_thickness(material_))  # Ожидаемый вывод: 0,70

    material_ = 'Лист ОЦ БТ-ПН-НО-0,70х1250х2500 ГОСТ 19904-90_08Ю-ОН-Н-МТ-НР-1 ГОСТ 14918-80'
    print(get_thickness(material_))  # Ожидаемый вывод: 0,70

Функция возвращает.

Screenshot_1.png

YNA

Михаил, тут есть и подводные камни, которые нужно учитывать.
Дело в том, что у листового тела есть много параметров: радиусы гибки, варианты гибки, развёртки и т. п. При изменении толщины листа эти все параметры нужно будет менять. Если программа будет бесконтрольно менять толщины, то последствия могут быть непредсказуемые.
Простой пример из недавнего проекта:
Есть 24 колонны, стволы которых выполнены из одинаковых гнутых швеллеров Лист 10. Теперь пришла директива для 12 колонн поменять лист на 8.
Мне просто повезло, что все гибки были выполнены по габаритам и толщина листа была во внутрь детали. Всё обошлось "малой кровью".
А теперь представте, что произойдёт если программа будет автоматом в "тихом" режиме менять толщины деталей.  :o:
+ Благодарностей: 1

Михаил88

Цитата: YNA от 01.05.26, 08:06:27Михаил, тут есть и подводные камни, которые нужно учитывать.
Дело в том, что у листового тела есть много параметров: радиусы гибки, варианты гибки, развёртки и т. п. При изменении толщины листа эти все параметры нужно будет менять. Если программа будет бесконтрольно менять толщины, то последствия могут быть непредсказуемые.
Простой пример из недавнего проекта:
Есть 24 колонны, стволы которых выполнены из одинаковых гнутых швеллеров Лист 10. Теперь пришла директива для 12 колонн поменять лист на 8.
Мне просто повезло, что все гибки были выполнены по габаритам и толщина листа была во внутрь детали. Всё обошлось "малой кровью".
А теперь представте, что произойдёт если программа будет автоматом в "тихом" режиме менять толщины деталей.  :o:

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

Михаил88

Обновление толщины.
Программа обновляет значение в переменной SM_Thickness, беря толщину из маркировки материала.

https://disk.yandex.ru/d/xP1-XXf77HM60w

Мой-проект-1-2026-05-01_10-24-40.gif
+ Благодарностей: 1

IgorT

+ Благодарностей: 1

Student2025

Получается нужно иметь базу наименований материалов как маски и от них исходить..

IgorT так что:

T_1.jpg