СЕРИЯ АВТОМАТИЗАЦИИ PLAXIS

Визуализация вывода PLAXIS с использованием Python

Пошаговое руководство по автоматизации

Приложение PLAXIS Output предлагает возможность использования встроенного графического инструмента для сравнения результатов на разных этапах. Хотя он предоставляет некоторые базовые функции построения графиков, которые позволяют пользователям визуализировать результаты, люди часто используют Excel, поскольку он обеспечивает гибкость в форматировании графиков, манипулировании данными и совместном использовании результатов.

Без сомнения, Excel — это мощное и хорошо известное программное обеспечение для визуализации данных. Однако PLAXIS не обеспечивает полной интеграции с Excel, что делает процесс извлечения и визуализации трудоемким. Есть три возможных области улучшения с точки зрения визуализации данных:

  1. Объедините все данные в один рабочий лист для построения графика
  2. Автоматизируйте процесс выбора рядов данных в Excel при создании графиков
  3. Создавайте графики с настраиваемыми именами рядов и названиями осей

Целью этого руководства является расширение урока, извлеченного из 2-го руководства. Мы будем извлекать выходные данные из нескольких этапов и использовать графики для сравнения результатов. Это можно сделать с помощью следующих трех шагов:

  1. Установить внешний модуль в среду PLAXIS
  2. Извлечение результатов для нескольких этапов
  3. Сравните результаты на разных этапах, используя графики в Excel
  4. Форматирование с помощью Openpyxl

Как и прежде, для работы с этим учебным пособием у читателей должны быть установлены VS Code и среда PLAXIS. Следуйте инструкциям из статьи ниже, если вы впервые на этой странице. Давайте начнем!



Пример модели PLAXIS

Мы будем использовать ту же 2D-модель PLAXIS из второго урока. Следуйте приведенным ниже инструкциям, чтобы настроить и рассчитать модель, если вы этого еще не сделали.



Как и в предыдущем уроке, мы откроем файл PLAXIS с помощью «open_output.py», чтобы можно было включить сервер API.

Напомним, что мы используем следующий код для открытия файла:

После запуска приведенного выше кода оба приложения ввода и вывода PLAXIS 2D должны открываться автоматически. В выходном приложении вы должны увидеть «SERVER ACTIVE на порту 10001».

Шаг 1: Установите внешний модуль в среду PLAXIS

Наша цель — извлечь результаты из PLAXIS и создать сравнительные графики в Excel. Для этого нам понадобятся три внешних модуля:

  • Панды
  • XLSXWriter
  • Openpyxl

Процесс установки внешних модулей через командную строку PLAXIS подробно описан во 2-м туториале. Убедитесь, что вы прошли этот процесс, прежде чем переходить к следующим шагам.

Из последнего урока должны быть установлены как pandas, так и xlsxwriter. Обратите внимание, что модули Python чувствительны к версии, это связано с тем, что некоторые модули связаны с другими модулями, и, следовательно, обновления версии могут вызвать сбои. Это необходимо для обеспечения согласованности зависимостей модулей в среде PLAXIS.

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

pandas == 1.5.2
xlsxwriter == 3.0.3
openpyxl == 3.0.9
defusedxml == 0.7.1

Чтобы проверить текущую версию модуля, мы можем использовать следующую команду в командной строке PLAXIS:

python -m pip show pandas

Если версии не совпадают, мы можем использовать следующую команду для обновления/понижения версии:

python -m pip install --upgrade pandas==1.5.2

Установите остальные модули:

python -m pip install xlsxwriter==3.0.3
python -m pip install openpyxl==3.0.9
python -m pip install defusedxml==0.7.1

В некоторых ситуациях вы можете столкнуться с ошибкой при установке defusexml.

ERROR: Could not install packages due to an OSError: [WinError 5] Access is denied

Если это ваш случай, попробуйте следующий код:

python -m pip install --upgrade defusedxml==0.7.1 --user

Теперь, когда мы установили все необходимые модули. Теперь мы можем извлечь результаты из разных фаз в PLAXIS, используя скрипт Python.

Шаг 2. Извлечение результатов для нескольких этапов

Основная цель шага 2 — извлечь результаты (изгибающий момент) из трех фаз модели «Раскопки». Затем мы экспортируем результаты в Excel на листе под названием «combined_Plate_1» со столбцами, показанными ниже:

Сначала мы создаем пустой файл Python и называем его «plot_plate_combine.py».

Импорт модулей и запуск сервера

from plxscripting.easy import *
import math
import pandas as pd
from openpyxl import load_workbook
from openpyxl.chart import (
    ScatterChart,
    Reference,
    Series,
)
###############################################
PORT_i = 10000  # Define a port number.
PORT_o = 10001
PASSWORD = 'SxDBR<TYKRAX834~'  # Define a password.



# Start the scripting server.
s_i, g_i = new_server('localhost', PORT_i, password=PASSWORD)
s_o, g_o = new_server('localhost', PORT_o, password=PASSWORD)

Определить имя файла

Расположение файла: C:\Users\phtsang\Desktop\PLAXIS_V22\Script

Имя файла: может быть любым именем, которое вы хотите

EXCEL_PATH=r'C:\Users\phtsang\Desktop\PLAXIS_V22\Script\\'
EXCEL_NAME='Plate_y.xlsx'


FILENAME=EXCEL_PATH+EXCEL_NAME

Входное определение

В этом случае мы извлечем изгибающий момент для «Plate_1» из следующих фаз:

  • «Установка стойки [Этап_3]»
  • «Второй (подводный) этап раскопок [Фаза_4]»
  • «Третий этап раскопок [Фаза_5]»
###############################################
#Inputs:
plate_input=['Plate_1']
phase_input=['Installation of strut [Phase_3]','Second (submerged) excavation stage [Phase_4]','Third excavation stage [Phase_5]']

Ваш скрипт должен выглядеть так:

Извлечение результата

После предварительной обработки мы определим функцию для извлечения изгибающего момента (упрощенная версия из прошлого урока) и назовем ее «get_plate()».

def get_plate(plate_o,phase_o):


    plateY=g_o.getresults(plate_o,phase_o,g_o.ResultTypes.Plate.Y, "node")
    plateM=g_o.getresults(plate_o,phase_o,g_o.ResultTypes.Plate.M2D, "node")


    phasename=str(phase_o.Identification).split('[')[0]
    col1='Bending Moment [kNm/m]'+'_'+phasename


    results = {'Y': plateY,col1: plateM}


    plateresults=pd.DataFrame(results)
    plateresults = plateresults.sort_values(by=['Y'],ascending=False)


    return plateresults

Экспорт в Excel

В отличие от предыдущего урока, мы хотим извлечь результаты из нескольких этапов, а не из одного этапа. Следовательно, функцию «export_excel()» необходимо изменить. Задействованы три действия:

  1. Цикл по названию существующей фазы из текущей модели
  2. Перепроверьте ввод фазы пользователем (т.е. фазы 3, 4 и 5).
  3. Извлеките результаты, если они совпадают, и экспортируйте их в отдельный рабочий лист (например, Plate_1_Phase_3).
  4. Объедините результаты в новый фрейм данных и экспортируйте в рабочий лист («combined_Plate_1»).

Эти действия можно выполнить с помощью следующего кода. Давайте сломаем это!

def export_excel(plate_input,phase_input,filename):
    writer = pd.ExcelWriter(filename, engine='xlsxwriter')
    combined=[]
    for i in range(len(phase)):
        for j in range(len(phase_input)):
            if phase[i].Identification == phase_input[j]:
                name=str(phase[i].Identification).split(' [')[1]
                name=name.split(']')[0]
                sheet_name = "%s_%s" % (plate[0].Name, name)
                results = get_plate(plate[0], phase[i])
                combined.append(results)
                results.to_excel(writer,sheet_name=sheet_name,index=False)


    combinedsheet='combined'+'_'+str(plate[0].Name)
    combined=pd.concat(combined, axis=1)
    combined.to_excel(writer,sheet_name=combinedsheet,index=False)
    writer.save()



export_excel(plate_input,phase_input,FILENAME)
  • Сначала нам нужно определить пустой список «combined=[]». Это позволяет нам добавлять извлеченные результаты на каждом этапе в единый список, чтобы мы могли объединить их на последнем шаге.
  • Следующий шаг — просмотреть существующие фазы модели и посмотреть, какая из них соответствует нашему вводу. Это делается с помощью команды PLAXIS «фаза[i].Идентификация», которая дает полное имя каждой фазы.
for i in range(len(phase)):
        for j in range(len(phase_input)):
            if phase[i].Identification == phase_input[j]:
  • Следующий код предназначен для именования. Например, «фаза [0]. Идентификация» даст «Установка стойки [Фаза_3]». Я хочу получить «Phase_3», который находится между квадратной скобкой [ ]. Затем я комбинирую «Plate_1» и «Phase_3», чтобы сформировать имя рабочего листа.
name=str(phase[i].Identification).split(' [')[1]
name=name.split(']')[0]
sheet_name = "%s_%s" % (plate[0].Name, name)
  • Изгибающий момент PLate_1 на каждой фазе извлекается с помощью функции «get_plate()» и сохраняется как результат. Затем результаты добавляются в «объединенный» список с помощью метода «combined.append(results)». Наконец, используйте «results.to_excel (писатель, имя_листа = имя_листа, индекс = False)», чтобы экспортировать результаты на каждом этапе на отдельный рабочий лист.
results = get_plate(plate[0], phase[i])
combined.append(results)
results.to_excel(writer,sheet_name=sheet_name,index=False)
  • Последние четыре строки предназначены для объединения результатов в «комбинированный» список и экспорта в рабочий лист «combined_Plate_1». Это делается с помощью метода pandas concat(). Важно ввести «ось = 1» в качестве аргумента, поскольку это говорит пандам объединять результаты по горизонтали (по строкам). По умолчанию «ось = 0» объединяет результаты по вертикали (по столбцам).
combinedsheet='combined'+'_'+str(plate[0].Name
combined=pd.concat(combined, axis=1)
combined.to_excel(writer,sheet_name=combinedsheet,index=False)
writer.save())

Ваш окончательный сценарий должен выглядеть так:

Теперь, когда мы извлекли результаты всех этапов, мы можем приступить к созданию графиков в Excel с помощью Python.

Шаг 3. Сравните результаты на разных этапах, используя графики в Excel с Openpyxl.

Наконец, мы узнаем об Openpyxl, модуле, который позволяет нам создавать графики Excel.

Мы создаем функцию, называем ее «get_combined_plot()».

  • df_inter хранит кадр данных, полученный от «combined_Plate_1». лист — это место, где я указываю рабочий лист «combined_Plate_1», чтобы я мог создать там график.
def get_combined_plot(filename,sheetname):
    df_inter = pd.read_excel(filename, sheet_name = sheetname,engine="openpyxl")
    wb=load_workbook(filename)
    sheet=wb[sheetname]
  • Затем создайте объект диаграммы с именем «chart1», который представляет собой точечную диаграмму. После этого мы назначаем названия осей с помощью методов openpyxl (x_axis.title и y_axis.title).
  • yvalue сохраняет координаты Y результатов с помощью метода Reference().
  • position и prow — это место, где я указываю местоположение графика.
    chart1=ScatterChart()
    chart1.x_axis.title = 'Bending Moment (kNm/m)'
    chart1.y_axis.title = 'RL (m)'
    chart={'chart1':chart1} 
    yvalue=Reference(sheet,min_col=1,min_row=2,max_row=len(df_inter)+1)
    position='G'
    prow=1
  • Затем извлеките значения изгибающего момента из второго столбца и сохраните их в value.
  • Когда у нас есть данные для осей x и y, мы используем «Series()» для создания серии и назначаем ее «chart1» с помощью «chart1.series.append(series)».
    if df_inter.columns.values[1].split(' [')[0] == 'Bending Moment'
        value=Reference(sheet,min_col=2,min_row=2,max_row=len(df_inter)+1)
        series=Series(yvalue,value,title=list(df_inter.columns.values)[1])

        chart1.series.append(series):
  • Приведенный ниже код в основном предназначен для форматирования, которое устанавливает стили графика, такие как высота, флажок, положение легенды и т. д. (например, типичные настройки графика Excel). Более подробная информация о форматировании описана в официальной документации:


    charts='chart1'
    chart[charts].height=15
    chart[charts].y_axis.tickLblPos = 'low'
    chart[charts].legend.position = 'b'


    if ord(position)<89 and prow<=2:
        sheet.add_chart(chart[charts], position+str(1))
    position=chr(ord(position)+10)
    prow=prow+1
    wb.save(filename)
  • Вышеуказанные шаги создали график с использованием первых двух столбцов (т. Е. «Y» и «Изгибающий момент [кНм / м]_Установка стойки»).
  • Последний шаг — перебрать остальные столбцы и добавить их как две дополнительные серии к существующему графику.
  • Чтобы определить, содержат ли столбцы координату Y или изгибающий момент, нам нужно использовать оператор if-else.
  • Если заголовок столбца «Y», он будет хранить значения столбца в значении y (т. е. по оси Y). Если заголовок столбца содержит «Изгибающий момент», значения столбца будут храниться как значение (т. е. по оси X).
    for i in range(3,len(df_inter.columns)+1):
        if df_inter.columns.values[i-1].split('.')[0] != 'Y':
            if df_inter.columns.values[i-1].split(' [')[0] == 'Bending Moment':
                value=Reference(sheet,min_col=i,min_row=2,max_row=len(df_inter)+1)
                series=Series(yvalue,value,title=list(df_inter.columns.values)[i-1])
                chart1.series.append(series)
        elif df_inter.columns.values[i-1].split('.')[0] == 'Y':
            yvalue=Reference(sheet,min_col=i,min_row=2,max_row=len(df_inter)+1)      
    wb.save(filename)

Окончательный сценарий показан ниже:

def get_combined_plot(filename,sheetname):
    df_inter = pd.read_excel(filename, sheet_name = sheetname,engine="openpyxl")
    wb=load_workbook(filename)
    sheet=wb[sheetname]


    chart1=ScatterChart()
    chart1.x_axis.title = 'Bending Moment (kNm/m)'
    chart1.y_axis.title = 'RL (m)'
    chart={'chart1':chart1} 
    xvalue=Reference(sheet,min_col=1,min_row=2,max_row=len(df_inter)+1)
    position='G'
    prow=1


    if df_inter.columns.values[1].split(' [')[0] == 'Bending Moment':
        value=Reference(sheet,min_col=2,min_row=2,max_row=len(df_inter)+1)
        series=Series(xvalue,value,title=list(df_inter.columns.values)[1])


        chart1.series.append(series)
        
    charts='chart1'
    chart[charts].height=15
    chart[charts].y_axis.tickLblPos = 'low'
    chart[charts].legend.position = 'b'


    if ord(position)<89 and prow<=2:
        sheet.add_chart(chart[charts], position+str(1))
    position=chr(ord(position)+10)
    prow=prow+1
    wb.save(filename)


    for i in range(3,len(df_inter.columns)+1):
        if df_inter.columns.values[i-1].split('.')[0] != 'Y':
            if df_inter.columns.values[i-1].split(' [')[0] == 'Bending Moment':
                value=Reference(sheet,min_col=i,min_row=2,max_row=len(df_inter)+1)
                series=Series(xvalue,value,title=list(df_inter.columns.values)[i-1])
                chart1.series.append(series)
        elif df_inter.columns.values[i-1].split('.')[0] == 'Y':
            xvalue=Reference(sheet,min_col=i,min_row=2,max_row=len(df_inter)+1)      
    wb.save(filename)                    


combinedsheet='combined_Plate_1'
get_combined_plot(FILENAME,combinedsheet)

Запустите скрипт со следующим.

(PLAXIS) C:\Users\phtsang\Desktop\PLAXIS_V22\Script>python plot_plate_combine.py

Теперь, если вы откроете электронную таблицу Excel в указанном ранее месте и перейдете к рабочему листу «combined_Plate_1». Как видите, мы извлекли координату Y и изгибающий момент для всех трех фаз. Что еще более важно, у нас есть график, содержащий все результаты, которые позволяют нам сравнивать изгибающий момент на разных фазах!

Фантастика! Вы успешно извлекли результаты из PLAXIS и использовали их для создания графика в Excel с помощью Python.

Заключение

Это все, что касается третьего руководства по визуализации выходных данных PLAXIS с использованием Python. К настоящему времени вы должны уметь извлекать результаты на нескольких этапах и создавать графики в Excel для сравнения результатов. Это может быть дополнительно расширено за счет включения нескольких структурных элементов на разных этапах, что означает, что весь процесс извлечения вывода может быть автоматизирован. Я буду говорить об этом в будущих уроках.

Если вам нравится читать этот тип контента, не стесняйтесь подписаться на мою страницу. Я буду продолжать публиковать эту серию руководств по автоматизации PLAXIS с помощью Python. Кроме того, я также хочу поделиться знаниями о том, как использовать Python для автоматизации рабочего процесса в инженерии.