На главную страницу RastrWin

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


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

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

Тема: «Rastr и python , работа с Rastr в python » в форуме: Макро   Просмотров: 12698
 
Иван Ведерников
Посетитель
 
Всего сообщений: 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 | След. | Конец 

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


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





Работает на «Битрикс: Управление сайтом» © «Битрикс», 2001-2006