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

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

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

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

lavgirb

Цитата: Михаил88 от 30.04.26, 14:31:59Согласен. По этому и предложил (в сообщении #29) наполнять словарь.

Да. Я и хотел написать по типу как Вы предложили в GRAPHIC.DNS.  :)

Добавлю, я в GRAPHIC.DNS добавил теплоемкость каждого материала для расчета Бракомом суммарной теплоемкости изделия.
Бывает иногда требуется.
+ Благодарностей: 1

lavgirb

Цитата: Михаил88 от 30.04.26, 14:31:59Вы тему по СкР почитайте. То такие настройки надо то другие, то такие шаги то другие и пошло поехало.
Не знаю, что это такое.
Я просто пообсуждать. Листовой материал в работе практичеки не используется.
Во всяком случае автоматизировать у себя это бессмысленно.

Михаил88

Цитата: lavgirb от 30.04.26, 14:33:54Да. Я и хотел написать по типу как Вы предложили в GRAPHIC.DNS.  :)

А как Вы бы сделали: из условия меняем материал и потом меняем переменную? Забить и писать регулярку, а если что-то не будет срабатывать, потом добавлять?
Я с регулярками мало работал, нужно разбираться.
У нас, наоборот, всё практически из листового материала. Можно и под свои задачи приспособить. Материал пишут по ГОСТ.
Бывают люди разные, обращаются с просьбами, там всякое может быть. Многих вообще ЕСКД не очень волнует, приходится как-то адаптироваться под требования. Жизнь заставляет искать универсальные решения.
+ Благодарностей: 1

IgorT

Цитата: lavgirb от 30.04.26, 14:32:24Можно пойти еще другим путем. Или добавить.
При вставке утилитой толщины в переменную автоматически менять толщину в существующей записи материала  :)
У нас Полином.
Приходится там брать материал. Как будет в этом случае в толщину листа попадать наша переменная?
Есть способ?

IgorT

Цитата: Михаил88 от 30.04.26, 14:37:39А как Вы бы сделали: из условия меняем материал и потом меняем переменную? Забить и писать регулярку, а если что-то не будет срабатывать, потом добавлять?
Я с регулярками мало работал, нужно разбираться.
Что такое "регулярка"?

lavgirb

Цитата: Михаил88 от 30.04.26, 14:37:39А как Вы бы сделали: из условия меняем материал и потом меняем переменную? Забить и писать регулярку, а если что-то не будет срабатывать, потом добавлять?
Я с регулярками мало работал, нужно разбираться.
Да я написал как. Меняем материал, если по его записи есть толщина в "базе данных", меняем ее в переменной.
Если этой записи материала нет в базе, предлагаем указать толщину и после ввода пользователем в модель добавляем запись материала и его толщину в базу данных.
Наполнение идет автоматом, не заметно.

Михаил88

Цитата: lavgirb от 30.04.26, 14:46:16Да я написал как. Меняем материал, если по его записи есть толщина в "базе данных", меняем ее в переменной.
Если этой записи материала нет в базе, предлагаем указать толщину и после ввода пользователем в модель добавляем запись материала и его толщину в базу данных.
Наполнение идет автоматом, не заметно.

Я имел ввиду может у Вас есть еще какие нибудь идеи или подобный опыт.

Михаил88

Цитата: IgorT от 30.04.26, 14:41:04Что такое "регулярка"?

Регулярные выражения. Проще говоря, это язык инструкций, который говорит компьютеру: «Найди мне в тексте всё, что выглядит вот так».
Типа такого.

import re

def extract_thickness_universal(text):
    """
    Извлекает толщину материала из строки с описанием изделия.
    Поддерживает несколько форматов: d1,00; 0,15х60; 2х600х1500; -3х1250х2500 и др.
    """
    # Список регулярных выражений для разных форматов
    patterns = [
        # Формат d1,00 — толщина после 'd'
        r'd(\d+,\d+)',
        # Формат 0,15х60 — толщина первая в группе с 'х' в начале строки или после пробела
        r'(?:^|\s)(\d+,\d+)х',
        # Формат 2х600х1500 — толщина первая в группе размеров
        r'(\d+)х\d+х\d+',
        # Формат -3х1250х2500 — толщина после '-' и перед 'х'
        r'-(\d+)х',
        # Формат с указанием в мм: 3 мм, 0.5 мм и т. д.
        r'(\d+(?:,\d+)?)\s*мм'
    ]
   
    for pattern in patterns:
        match = re.search(pattern, text)
        if match:
            value = match.group(1).replace(',', '.')
            try:
                # Преобразуем в число для проверки корректности
                thickness_float = float(value)
                # Базовая проверка: толщина должна быть положительной и разумной (до 100 мм)
                if 0 < thickness_float <= 100:
                    return value
            except ValueError:
                continue
   
    return "Толщина не найдена"

# Тестовые строки
test_strings = [
    "Лента 0,15х60-М-О-20Х13 ГОСТ 4986-79",
    "Лист ДПРНМ 2х600х1500 М1 ГОСТ 1173-2006",
    "Лист ОЦ$d1,00 ГОСТ 19904-90;08пс ГОСТ 14918-80$",
    "Лист ОЦ$dБТ-ПН-НО-3х1250х2500 ГОСТ 19904-90;08пс-ОН-Н-МТ-НР-1 ГОСТ 14918-80$"
]

# Извлечение толщины для каждой строки
print("Результаты извлечения толщины:")
print("-" * 40)
for i, string in enumerate(test_strings, 1):
    thickness = extract_thickness_universal(string)
    print(f"Строка {i}: {thickness} мм")
    print(f"  Текст: {string}")
    print()


lavgirb

Цитата: Михаил88 от 30.04.26, 14:47:59Я имел ввиду может у Вас есть еще какие нибудь идеи или подобный опыт.
Опыт есть похожий. Если правильно понял вопрос.
Для разноса по строкам записей в ведомости покупных изделий из базы данных считываются места позиций для переноса строки.
Если записи нет в базе данных, то она в окошке не разнесенная по строкам и выводится не разнесенной.
Разношу в окошке по строкам. Эта запись и ее места разнесения по строкам записываются в БД.
При последующих выводах ВП эта запись уже всегда разнесена по строкам.
На самом деле у меня все чуть-чуть не так работает. Но для пояснения принципа это верно.

Кстати, точно так же работает мой Тексель при наполнении спецификации записями из базы данных ))
+ Благодарностей: 1

Kilia

Можно ещё так
# -*- coding: utf-8 -*-

import re
from pythoncom import connect, VT_EMPTY
from win32com.client import gencache, VARIANT

con0 = gencache.EnsureModule('{75C9F5D0-B5B8-4526-8681-9903C567D2ED}', 0, 1, 0).constants  # kompas6_constants
con3 = gencache.EnsureModule('{2CAF168C-7961-4B90-9DA2-701419BEEFE3}', 0, 1, 0).constants  # kompas6_constants_3d
API5 = gencache.EnsureModule('{0422828C-F174-495E-AC5D-D31014DBBE87}', 0, 1, 0)  # kompas6_api5_module
API7 = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)  # kompas_api7_module

KompasObject = API5.KompasObject(connect('Kompas.Application.5'))
iApplication = KompasObject.ksGetApplication7()

iKompasDocument = iApplication.ActiveDocument
iKompasDocument3D = API7.IKompasDocument3D(iKompasDocument)
iPart7 = API7.IPart7(iKompasDocument3D.TopPart)

iPropertyMng = API7.IPropertyMng(iApplication)
iPropertyKeeper = API7.IPropertyKeeper(iPart7)
iPropertyMaterial = iPropertyMng.GetProperty(iKompasDocument, 9.0)

material = iPropertyKeeper.GetPropertyValue(iPropertyMaterial, 0, True)[1]
match = re.search(r"\$d\s*([0-9]+(?:[.,][0-9]+)?)", str(material), re.IGNORECASE)

thickness = float(match.group(1).replace(",", "."))

if thickness.is_integer():
    thickness = int(thickness)

iVariable7 = API7.IFeature7(iPart7).Variable(False, False, "SM_Thickness")
if not iVariable7:
    iVariable7 = iPart7.AddVariable("SM_Thickness", thickness, "")

iVariable7.Value = thickness
iVariable7.External = True
iKompasDocument3D.RebuildDocument()

print(f"Материал: {material}")
print(f"SM_Thickness = {iVariable7.Value}")


из "Лист$d12 ГОСТ 19903-2015;Ст3пс ГОСТ 14637-89$" извлечёт все что после $d и до ГОСТ, в примере 12 и запишет в переменную

IgorT

Цитата: Михаил88 от 30.04.26, 14:48:37Регулярные выражения. Проще говоря, это язык инструкций, который говорит компьютеру: «Найди мне в тексте всё, что выглядит вот так».
Типа такого.
....

Охоооох..
Может привести пример, когда способ перебора символов, который предлагал выше, не сработает?

IgorT

Цитата: Kilia от 30.04.26, 14:58:08Можно ещё так
....

из "Лист$d12 ГОСТ 19903-2015;Ст3пс ГОСТ 14637-89$" извлечёт все что после $d и до ГОСТ, в примере 12 и запишет в переменную
Там может быть 12,0х1500х3000.

lavgirb

Цитата: Михаил88 от 30.04.26, 14:48:37Регулярные выражения. Проще говоря, это язык инструкций, который говорит компьютеру: «Найди мне в тексте всё, что выглядит вот так».
Типа такого.
Я пытался универсально программно выделять обозначение документа из записи покупных изделий.
Там оказалось такое большое разнообразие (одно это чего стоит: обозначение документа не в конце, а в середине записи), что бросил это дело.
Просто добавляю документ в базу данных и потом он легко выделяется из записи.
+ Благодарностей: 1

Михаил88

#53
Цитата: IgorT от 30.04.26, 15:03:22Охоооох..
Может привести пример, когда способ перебора символов, который предлагал выше, не сработает?

Тут сработает?
Паронит ПМБ-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

Kilia

Мне кажется логичнее наоброт в переменных менять размер, а в материал писать на основе переменных)
Точнее так, материал задаём любой толщины, потом работаем с моделью в том числе со сборками, а после запускаем скрипт и обрабатываем все листовые детали с записью в материал толщины ширины и высоты путем редактирования указанного материала. И получается сразу скопом все

Kilia


Kilia

Цитата: Kilia от 30.04.26, 15:53:39Мне кажется логичнее наоброт в переменных менять размер, а в материал писать на основе переменных)
Точнее так, материал задаём любой толщины, потом работаем с моделью в том числе со сборками, а после запускаем скрипт и обрабатываем все листовые детали с записью в материал толщины ширины и высоты путем редактирования указанного материала. И получается сразу скопом все

Вот что имею в виду
# -*- coding: utf-8 -*-

import re
from pythoncom import connect
from win32com.client import gencache

API5 = gencache.EnsureModule('{0422828C-F174-495E-AC5D-D31014DBBE87}', 0, 1, 0)
API7 = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)

KompasObject = API5.KompasObject(connect('Kompas.Application.5'))
iApplication = KompasObject.ksGetApplication7()

iKompasDocument = iApplication.ActiveDocument
iKompasDocument3D = API7.IKompasDocument3D(iKompasDocument)
iPart7 = API7.IPart7(iKompasDocument3D.TopPart)

iPropertyMng = API7.IPropertyMng(iApplication)
iPropertyKeeper = API7.IPropertyKeeper(iPart7)

iVariable7 = API7.IFeature7(iPart7).Variable(False, False, "SM_Thickness")
if not iVariable7:
    raise ValueError("Переменная SM_Thickness не найдена")

thickness = float(iVariable7.Value)
thickness_text = str(int(thickness)) if thickness.is_integer() else str(thickness).replace(".", ",")

iPropertyMaterial = iPropertyMng.GetProperty(iKompasDocument, 9.0)
material = str(iPropertyKeeper.GetPropertyValue(iPropertyMaterial, 0, True)[1])

iPropertyDensity = iPropertyMng.GetProperty(iKompasDocument, 10.0)
density = float(iPropertyKeeper.GetPropertyValue(iPropertyDensity, 0, True)[1]) / 1000

new_material = re.sub(
    r"(\$d\s*)[0-9]+(?:[.,][0-9]+)?",
    r"\g<1>" + thickness_text,
    material,
    count=1,
    flags=re.IGNORECASE,
)

if new_material == material:
    new_material = re.sub(
        r"(\bТ\s*)[0-9]+(?:[.,][0-9]+)?",
        r"\g<1>" + thickness_text,
        material,
        count=1,
        flags=re.IGNORECASE,
    )

if new_material == material:
    raise ValueError(f"Не удалось найти толщину в материале: {material}")

iPart7.SetMaterial(new_material, density)
iPart7.Update()
iKompasDocument3D.RebuildDocument()

print(f"SM_Thickness = {thickness_text}")
print(f"Материал был: {material}")
print(f"Материал стал: {new_material}")


Запускать пока на детали, поменять SM_Thickness в переменных и существующий материал актуализируется в части толщины

Михаил88

Илья, можно сделать два режима на выбор. У меня еще была мысль расширить и не останавливаться только на листавом материале.

Kilia

Как бы сделать чтобы при нажатии на сохранить или лучше закрыть документ - самостоятельное выполнение скрипта...

Михаил88