На главную страницу
Русский English
 


Поддержка
Форум
Техподдержка
Закрытый разделПерсональная

Авторизация

Запомнить меня на этом компьютере
  Забыли свой пароль?
  Регистрация



Поиск по сайту


Подписка

Изменение параметров

Hits 67409076
426
Hosts 3607178
215
Visitors 53562022
425

67


Главная / Поддержка / Форумы / Макро

Форум «Макро»

Версия для печати Версия для печати

Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация

Сообщения 1 - 25 из 45
Начало | Пред. | 1 2 | След. | Конец 

Тема: «Rastr и python , работа с Rastr в python » в форуме: Макро   Просмотров: 12696
 
Иван Ведерников
Посетитель
 
Всего сообщений: 27
Дата регистрации: 06.11.2018
Создано: 08.12.2021 07:48:08
 
 
Добрый день!

Подскажите как записать значения в таблицы Rastr используя python?

Код

x = rastr.tables("node").cols­.Item("ny").Z(0)  # работает

rastr.tables("node").cols­.Item("ny").Z(0) = 5   # не работает
# SyntaxError: cannot assign to function call here.

rastr.tables("node").cols­.Item("ny").Z[0] = 5   # не работает
# TypeError: 'method' object does not support item assignment
 
Профиль
Наверх
Станислав Богданов
Модератор
 
Всего сообщений: 61
Дата регистрации: 11.10.2012
Создано: 08.12.2021 10:10:23
 
 
Примерно так:
Код

column = table.Cols(column)
column.SetZ(row­_id, value) # вместо column.Z(row_id) = value
 
Профиль
Наверх
Иван Ведерников
Посетитель
 
Всего сообщений: 27
Дата регистрации: 06.11.2018
Создано: 08.12.2021 10:56:52
 
 
Благодарю, работает!
 
Профиль
Наверх
Иван
Постоянный посетитель
 
Всего сообщений: 233
Дата регистрации: 03.05.2011
Создано: 09.12.2021 09:49:20
 
 
А как подключить объекты растра в python?
 
Профиль
Наверх
Иван Ведерников
Посетитель
 
Всего сообщений: 27
Дата регистрации: 06.11.2018
Создано: 09.12.2021 10:20:27
 
 
установить модуль pywin32
Код

import win32com.client

rastr = win32com.client.Dispatch(­"Astra.Rastr")
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 09.12.2021 15:42:17
 
 
Я прям вижу флотилию Парусов на горизонте С улыбкой
Пользователь добавил изображение
 
Профиль
Наверх
Иван
Постоянный посетитель
 
Всего сообщений: 233
Дата регистрации: 03.05.2011
Создано: 10.12.2021 23:28:00
 
 
Спасибо!
Есть у него какие-то очевидные преимущества относительно обычного vbs?
 
Профиль
Наверх
Иван Ведерников
Посетитель
 
Всего сообщений: 27
Дата регистрации: 06.11.2018
Создано: 13.12.2021 10:40:59
 
 
Если простая программка или она должна работать в загруженном файле растр, то vbs, если программа посложнее то писать, отлаживать , делать графический интерфейс лучше в python. Там очень много возможностей
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 45
Дата регистрации: 30.09.2021
Создано: 21.12.2022 11:01:54
 
 
Добрый день. А может кто-то показать какой-то пример макро на python. Чтобы начать было проще. Как происходит загрузка файлов, таблиц в них, сохранение, добавление строк, изменение параметров и прочее. Заранее благодарю
 
Профиль
Наверх
Александр Александров
Администратор
 
Всего сообщений: 659
Дата регистрации: 31.05.2008
Создано: 21.12.2022 13:35:04
 
 
Здравствуйте!

макрос загружает файлы из директорий и считает оптимизацию

Код

import os
import win32com.client as c32

def GetPathToScanDir():
    return r'D:VmsSHARAcrossesODU_SB­2022_11_18_archmup'
def GetPathToScanDir7z():
    return r'D:VmsSHARAcrossesODU_SB­2022_11_18_archm'
def GetCentr():
    return 45000
def GetCentrs():
    return (15000,)
def GetScnaFName():
    return 'roc_debug_before_OC'
def Get_RG_REPL():
    return 1
def GetMaxOtv():
    return 18
def Get_max_otv(tables):
    table_node = tables('node')
    node_col_sta = table_node.Cols('sta')
    node_col_ny = table_node.Cols('ny')
    node_col_otv = table_node.Cols('otv')
    table_node.SetSel('sta=0'­)
    max_otv = 0
    max_otv_node_num = -1000
    curent_row_node = table_node.FindNextSel(-1­)
    while curent_row_node != -1:
        sta = node_col_sta.Z(curent_row­_node)
        ny = node_col_ny.Z(curent_row_­node)
        otv = node_col_otv.Z(curent_row­_node)
        if abs(max_otv) < abs(otv):
            max_otv = otv
            max_otv_node_num = ny
        #print('sta= '+str(sta)+ ' dv='+str(otv))
        curent_row_node = table_node.FindNextSel(cu­rent_row_node)
    return (max_otv, max_otv_node_num)
def rfile_analyze(rastr,path_­rfile,centr):
    rastr.Load(Get_RG_REPL(),­ path_rfile, '')
    try:
        tables = rastr.Tables
        table_com_opf = tables('com_opf')
        com_opf_col_centr = table_com_opf.Cols('centr­')
        res1 = rastr.opf('s')
        (max_otv1, max_otv_node_num1) = Get_max_otv(tables)
        com_opf_col_centr.SetZ(0,­centr)
        res2 = rastr.opf('s')
        rastr.rgm('')
        (max_otv2, max_otv_node_num2) = Get_max_otv(tables)
        str_res1 = ''
        str_res2 = ''
        if(abs(max_otv1) > GetMaxOtv() ) : str_res1 = "FAIL1"
        if(abs(max_otv2) > GetMaxOtv() ) : str_res2 = "FAIL2"
        print (str(path_rfile)+ ' : ' + str(res1) + ' - ' + str(res2) +'  '+ ' max_otv1= '+ str(max_otv1)+ ' max_otv2= '+ str(max_otv2)  + ' <> '+ str_res1 + ' - '+ str_res2  
        + ' : ny1=' + str(max_otv_node_num1)+ '  ny2=' + str(max_otv_node_num2) )
    except OSError as err:
        print("OS error:", err)
    except ValueError:
        print("Could not convert data to an integer.")
    except Exception as ex:
        print('type{type(ex)}')
    except :
        print('xz')
def scan_dir(path_2_scan_dir)­:
    #app = c32.gencache.EnsureDispat­ch('astra.rastr')
    rastr=c32.Dispatch('astra­.rastr')      
    print(rastr.__module__)  
    print( 'scan-> ' + path_2_scan_dir )
    folder_names = os.listdir(path_2_scan_di­r)
    #print(folder_names)
    for centr in GetCentrs() :
        print(centr)
        print('------------------­--------- '+str(centr)+' -------------------------­----------')
        for folder_name in folder_names:
            path_2_folder = path_2_scan_dir+'\'+ folder_name
            #print(path_2_folder)
            if os.path.isdir(path_2_fold­er):
                #print(path_2_folder)
                path_2_file = path_2_folder+ '\'+GetScnaFName()
                if os.path.isfile(path_2_fil­e) :
                    #print (path_2_file)
                    rfile_analyze(rastr,path_­2_file,centr)
                    continue
                else:
                    print ( f'no file: {path_2_file}' )

scan_dir( r'D:VmsSHARAcrossesODU_SB­2022_11_18_archmup')
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 45
Дата регистрации: 30.09.2021
Создано: 21.12.2022 15:01:06
 
 
Спасибо. В бОльшей части всё понятно... Кроме главного - при создании объекта rastrt возникает исключение (и даже при обработке первого исключения возникает второе... исключение в квадрате)

Код

Traceback (most recent call last):
  File "C:UsersBruckij-Stempkovs­kijAppDataRoamingPythonPy­thon310site-packageswin32­comclientdynamic.py", line 86, in _GetGoodDispatch
    IDispatch = pythoncom.connect(IDispat­ch)
pywintypes.com_error: (-2147221021, 'Операция недоступна', None, None)
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:RastrНовая схемаМакросыОбработка моделейОбновление топологииopen.py", line 4, in <module>
    rastr = c32.Dispatch('astra.rastr­')
  File "C:UsersBruckij-Stempkovs­kijAppDataRoamingPythonPy­thon310site-packageswin32­comclient__init__.py", line 117, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchA­ndUserName(dispatch, userName, clsctx)
  File "C:UsersBruckij-Stempkovs­kijAppDataRoamingPythonPy­thon310site-packageswin32­comclientdynamic.py", line 106, in _GetGoodDispatchAndUserNa­me
    return (_GetGoodDispatch(IDispat­ch, clsctx), userName)
  File "C:UsersBruckij-Stempkovs­kijAppDataRoamingPythonPy­thon310site-packageswin32­comclientdynamic.py", line 88, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstanc­e(
pywintypes.com_error: (-2147221164, 'Класс не зарегистрирован', None, None)
 
Профиль
Наверх
Александр Александров
Администратор
 
Всего сообщений: 659
Дата регистрации: 31.05.2008
Создано: 21.12.2022 15:56:23
 
 
наверное у вас Растр 32 бита а Питон 64 или наоборот
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 45
Дата регистрации: 30.09.2021
Создано: 31.05.2024 17:43:47
 
 
Здравствуйте. Подскажите пожалуйста, почему не отображаются новые поля?

Код

import win32com.client as c32


rastr=c32.Dispatch('astra­.rastr')  # объект растр
rastr.Load(1, './test.rg2', '')  # загрузка файла
rastr.tables("node").cols­.Add("Repair", 3)  # добавление поля логического типа
rastr.tables("node").Cols­("Repair").SetProp(4, 'Ремонт')  # установка названия
rastr.Save(r'D:Programmin­gRastrtest_.rg2', '')  # сохранение файла под новым именем


Если сформированный файл загрузить в python, созданное поле в нем уже есть. оно заполнено значением False, а попытка добавить такое поле еще раз приведет к исключению. Однако, если загрузить файл в Rastr, данного поля нет (ни в выборе поля из таблицы, ни в файлы -> настройка программы -> Параметры. Почему колонка не отображается?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 31.05.2024 20:17:56
 
 
Потому что Вы манипулируете файлом в python без шаблона, и все поля, которые Вы добавили сохраняются и читаются. А в Растр Вы, по всей видимости, загружаете по шаблону "режим.rg2", в котором полей этих нет и шаблон накладывает на загружаемый файл свою структуру.

Середина 2024 года. Народ пишет вариантные расчеты.
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 45
Дата регистрации: 30.09.2021
Создано: 03.06.2024 10:59:07
 
 
Как в таком случае подгружать шаблон?
 
Профиль
Наверх
Иван
Постоянный посетитель
 
Всего сообщений: 233
Дата регистрации: 03.05.2011
Создано: 03.06.2024 12:08:58
 
 
Цитата
Середина 2024 года. Народ пишет вариантные расчеты.


Растр к середине 2024 года не смог реализовать этот компонент у себя в удобоваримом и конкурентом виде, вот каждый и пытается сам это реализовать.
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 03.06.2024 12:35:32
 
 
Ну второй же параметр у Save/Load - путь к шаблону же.
Да Вы что.... Какая, право, досада...
Конкуренты тут вот скоро статейку опубликуют про то как проектировать надо.
Ну, удачи.
 
Профиль
Наверх
Иван
Постоянный посетитель
 
Всего сообщений: 233
Дата регистрации: 03.05.2011
Создано: 03.06.2024 13:38:26
 
 
Цитата
Да Вы что.... Какая, право, досада...

А где же тут удобоваримый? Вся настройка через макрос, как и запуск.
А как дела обстоят с вариантными расчетами для 5-10 rg2 файлов? Каждый нужно открывать в Растре, настраивать и запускать макрос?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 03.06.2024 14:33:55
 
 
Вот Вы как себе представляете работу ? Типа:
>You are an engineer, who is responsible to complete a project that satisfies all the requirements of the system operator. Download files from their portal and arrange everything in the form of a beautiful PDF
>...
>Certainly, your project is ready to download at the following link, or should I send it to them ?
Подозреваю что года через три это станет реальностью. По-английски, скорее всего.
А если серьезно - то Вы как хотите-то чтобы было ? Может уже есть чего у конкурентов и правда ? И они даже..., где-то поблизости еще ?



 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 45
Дата регистрации: 30.09.2021
Создано: 06.06.2024 18:04:32
 
 
Добрый день. Подскажите пожалуйста, как работает SetSel с таблицами. Вот кусочек кода:

Код

    def get_current_mode_with_sel­(
        self,
        tables: dict[str, tuple[tuple[str], str]]
    ) -> dict[str, pd.DataFrame]:
        """
        Получает текущее состояние энергетической системы в виде словаря с pandas DataFrame.

        Аргументы:
            tables (dict[str, tuple[str]]): Словарь:
                ключи   : str   - наименования требуемых таблиц
                значения: tuple - кортежи:
                    tuple: Кортеж с перчнем требуемых колонок
                    str  : Конструкт для выборки, передваемый методу SetSel
        
        Returns:
            dict[str, pd.DataFrame]: Словарь, содержащий pandas DataFrame
        """
        result = {}
        for table, (cols, sel) in tables.items():
            table_dict = dict((col, list()) for col in cols)
            self.model.tables(table).­SetSel(sel)
            i = self.model.tables(table).­FindNextSel(-1)
            while i != -1:
                for col in cols:
                    table_dict[col].append(se­lf.model.tables(table).co­ls(col).Z(i))
                i = self.model.tables(table).­FindNextSel(i)
            result[table] = pd.DataFrame(table_dict)
        return result


Вызов метода:

Код

rastr.get_current_mode_wi­th_sel({'vetv': (('ip', 'iq', 'pl_ip', 'pl_iq',), 'ip < 1000')})


Код должен сделать выборку в таблице vetv по условию "номер начала меньше 1000". Вывести только номер начала/конца и переток Р. Однако выводится вся таблица, итерирование происходит по всем индексам, а не только по тем, что подходят по условию
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 06.06.2024 18:36:14
 
 
SetSel ставится на экземпляр таблицы, не на саму таблицу.
Ну типа нельзя написать в VB
Код
Rastr.Tables("node").SetS­el("uhom>100")
' выборка скончалась вместе с выходом из области видимости
ndx = Rastr.Tables("node").Find­NextSel(-1)

но можно

Код
Set tblNode = Rastr.Tables("node")
tblNode.SetSel("uhom>100"­)
ndx = tblNode.FindNextSel(-1)


skilbox Шутливо Сейчас мистраль у нас станет МДП считать

Так все прям чинно, благородно, docstrings... Но я бы с pytest бы начал бы
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 45
Дата регистрации: 30.09.2021
Создано: 06.06.2024 18:49:09
 
 
Замечательно!! Думал, этот механизм живет вместе с таблицей где-то. Спасибо
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 06.06.2024 22:00:41
 
 
Хочет кстати кто-нибудь поволонтерить на git с gRPC-клиентом на python для rastr ? COM-то, того, не ровён час.

Пользователь добавил изображение
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 08.06.2024 14:29:31
 
 
Как я и уповал: конкуренты таки сделали проектирование
Тут как бы их контент, ваш купец, но есть текст чуть более практичесий.
 
Профиль
Наверх
Михаил Одинцов
Постоянный посетитель
 
Всего сообщений: 148
Дата регистрации: 22.07.2008
Создано: 08.08.2024 14:24:35
 
 
Продам душу за код на Питон (для тех кто слабо шарит в программировании), который подключается к библиотеке логирования Растра (протоколу) и вытаскивает текст лога при наступлении события.
 
Профиль
Наверх


Сообщения 1 - 25 из 45
Начало | Пред. | 1 2 | След. | Конец 

Читают тему
гостей: 3, пользователей: 0, из них скрытых: 0


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация







Программный комплекс «RasrWin»
Программный комплекс «RastrWin»
© «RastrWin», 1988-2019