| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Визуализация результатов FEM расчетов с помощью Matpotlib

Визуализация результатов FEM расчетов с помощью Matpotlib

Ответ
Поиск в этой теме
Непрочитано 08.05.2020, 10:42 #1
Визуализация результатов FEM расчетов с помощью Matpotlib
DEM
 
YngIngKllr
 
СПб
Регистрация: 29.03.2005
Сообщений: 12,968

Добрый день!
С помощью Matpotlib получается формировать результаты расчетов плоских плит.
Примерно вот такого вида.

Но это результаты плоские, а мне нужно 3d.
С помощью Poly3DCollection можно формировать Face. Но они получаются одного цвета, и нет сглаживания цветов и контрурных линий.
Может быть кто то уже делал подобное.

Миниатюры
Нажмите на изображение для увеличения
Название: Аннотация 2020-05-08 103837.jpg
Просмотров: 278
Размер:	37.2 Кб
ID:	225946  

__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
Просмотров: 3117
 
Непрочитано 08.05.2020, 11:15
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Я как бы первый раз про эту библиотеку слышу, но на странице примеров https://matplotlib.org/tutorials/int...ple_plots.html , есть описание методов Contouring and pseudocolor, которые собственно делают именно то, что тебе нужно.
Boxa вне форума  
 
Автор темы   Непрочитано 08.05.2020, 11:56
#3
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Цитата:
Сообщение от Boxa Посмотреть сообщение
Я как бы первый раз про эту библиотеку слышу, но на странице примеров https://matplotlib.org/tutorials/int...ple_plots.html , есть описание методов Contouring and pseudocolor, которые собственно делают именно то, что тебе нужно.
Там действительно примеров много, но они в основном с плоскими сетками работают, а z используют как свойство для отображения градиента или изолиний...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 08.05.2020, 12:57
#4
Scoody


 
Регистрация: 07.02.2013
Сообщений: 194


Добрый день!
А вот здесь смотрели?
https://matplotlib.org/mpl_toolkits/.../tutorial.html
Scoody вне форума  
 
Автор темы   Непрочитано 08.05.2020, 14:57
#5
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Кажется нашел....
Больше подходит VTK
Не получается.....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.

Последний раз редактировалось DEM, 08.05.2020 в 17:29.
DEM вне форума  
 
Непрочитано 08.05.2020, 15:18
#6
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Цитата:
Сообщение от DEM Посмотреть сообщение
Примерно вот такого вида.
DEM, можно кусочек кода, рисующий такие изополя?
румата вне форума  
 
Автор темы   Непрочитано 08.05.2020, 15:38
1 | #7
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


румата
Это то что отрисовывает изополя пример....
Код:
[Выделить все]
import matplotlib.pyplot as plt
import matplotlib.tri as tri
%matplotlib inline

# converts quad elements into tri elements
def quads_to_tris(quads):
    tris = [[None for j in range(3)] for i in range(2*len(quads))]
    for i in range(len(quads)):
        j = 2*i
        n0 = quads[i][0]
        n1 = quads[i][1]
        n2 = quads[i][2]
        n3 = quads[i][3]
        tris[j][0] = n0
        tris[j][1] = n1
        tris[j][2] = n2
        tris[j + 1][0] = n2
        tris[j + 1][1] = n3
        tris[j + 1][2] = n0
    return tris

# plots a finite element mesh
def plot_fem_mesh(nodes_x, nodes_y, elements):
    for element in elements:
        x = [nodes_x[element[i]] for i in range(len(element))]
        y = [nodes_y[element[i]] for i in range(len(element))]
        plt.fill(x, y, edgecolor='black', fill=False)

# FEM data
nodes_x = [0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]
nodes_y = [0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0]
nodal_values = [1.0, 0.9, 1.1, 0.9, 2.1, 2.1, 0.9, 1.0, 1.0, 0.9, 0.8]
elements_tris = [[2, 6, 5], [5, 6, 10], [10, 9, 5]]
elements_quads = [[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 8, 7], [4, 5, 9, 8]]
elements = elements_tris + elements_quads

# convert all elements into triangles
elements_all_tris = elements_tris + quads_to_tris(elements_quads)

# create an unstructured triangular grid instance
triangulation = tri.Triangulation(nodes_x, nodes_y, elements_all_tris)

# plot the finite element mesh
plot_fem_mesh(nodes_x, nodes_y, elements)

# plot the contours
plt.tricontourf(triangulation, nodal_values)

# show
plt.colorbar()
plt.axis('equal')
plt.show()


Этот код считывает файлы которые я экспортирую из СКАДа....
Код:
[Выделить все]
# -*- coding: utf-8 -*-
import sys
from collections import namedtuple
import numpy as np
import sys
from IPython.display import display
from IPython.display import HTML
print("Чтение файла")
import os
import matplotlib.pyplot as plt
import matplotlib.tri as tri
%matplotlib inline


Node = namedtuple('Node', 'number x y z')
Element = namedtuple('Element', 'number nodes')
Arm = namedtuple('Arm', 'name_arm Elements')
ArmElement = namedtuple('ArmElement', 'number AS1 AS2 AS3 AS4 ASW1 ASW2')
NODES_START = '$Nodes'
NODES_END = '$EndNodes'
ELEMENTS_START = '$Elements'
ELEMENTS_END = '$EndElements'
ARM_START = '$ARM'
ARM_END = '$EndARM'
Arm={}
Arm_element={}
odes_dict={}

def iterate_nodes(lines, start):
    for line in lines[start:]:
        if line == NODES_END:
            return
        yield Node(*map(float, line.split()))


def iterate_elements(lines, start):
    for line in lines[start:]:
        if line == ELEMENTS_END:
            return
        numbers = list(map(int, line.split()))
        yield Element(int(numbers[0]), numbers[1:])
def iterate_arm(lines):
        numbers = list(map(float, line.split()))
        
        return numbers
def plot_fem_mesh(nodes_x, nodes_y, elements):
    for element in elements:
        x = [nodes_x[element[i]] for i in range(len(element))]
        y = [nodes_y[element[i]] for i in range(len(element))]
        plt.fill(x, y, edgecolor='black', fill=False)

    
with open('C:\\Users\\Tom\\1_My_Folder\\Test.nepbgs', 'r', encoding="utf-8") as f:
        lines = [s.strip() for s in f.readlines()]
        for i, line in enumerate(lines):
            if line == NODES_START:
                nodes_start_idx = i + 1
            if line == ELEMENTS_START:
                elements_start_idx = i + 1
            if line == ARM_START:
                arm_start_idx = i + 1
        nodes_dict = {node.number: node for node in list(iterate_nodes(lines, nodes_start_idx))}
        elements = {Element.number: Element for Element in list(iterate_elements(lines, elements_start_idx))}
        for line in lines[arm_start_idx:]:
            if line == ARM_END:
                break
            if line.find("@")==0:
                name=line.replace("@","")
                Arm[name]=[]
            else:
                AR_=iterate_arm(line)
                num=int(AR_[0])
                arm_ed_elem=AR_[1:]
                Arm[name].append(num)
                Arm_element[num]=arm_ed_elem
X=[]            
Y=[]            
for key in   range(1, 120):
    X.append(nodes_dict[key].x)
    Y.append(nodes_dict[key].y)
            
print(X)
print(Y)
for name in Arm.keys():
    nodal_values=[]
    elements_tris =[]
    print(name)
    for i in Arm[name]:
        list_pt=[]
        nodal_values.append(Arm_element[i][0])
        nodal_values.append(Arm_element[i][0])
        list_pt.append(elements[i].nodes[1]-1)
        list_pt.append(elements[i].nodes[0]-1)
        list_pt.append(elements[i].nodes[2]-1)
        elements_tris.append(list_pt)
        list_pt=[]
        list_pt.append(elements[i].nodes[1]-1)
        list_pt.append(elements[i].nodes[2]-1)
        list_pt.append(elements[i].nodes[3]-1)
        elements_tris.append(list_pt)
    triangulation = tri.Triangulation(X, Y, elements_tris)
    #plot the finite element mesh
    plot_fem_mesh(X, Y, elements_tris)
    # plot the contours
    print(len(X))
    for i in range(0,19):
        nodal_values.append(0.01)
    print(len(nodal_values))
    plt.tricontour(triangulation,nodal_values, colors='k')
    # show
    plt.colorbar()
    plt.axis('equal')
    plt.show()

    
print(nodal_values)


Этот код экспортирует результаты ВСЕГО армирования из СКАДа в файл формата nopbgs

Код:
[Выделить все]
var global_obj =
{
	explorer:null
};

function Plugin_Clean()
{
	if (global_obj.explorer)
	{
		global_obj.explorer.Quit();
		global_obj.explorer = null;
	}


}

function Plugin_Cancel(engine)
{
	Plugin_Clean();

	if(engine)
	{
		engine.Cancel();
	}
}


function Plugin_Execute(engine)
{
try
{
var     WshShell = new ActiveXObject("Wscript.Shell"); //Create WScript Object
var myMsgBox=new ActiveXObject("wscript.shell")
var fso  = new ActiveXObject("Scripting.FileSystemObject");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var filename = "E:\\Test.nepbgs";
var fh  = fso.OpenTextFile(filename, 2, true, -1); // -1 means unicode

var model	= engine.GetModel();
var result	= engine.GetResult();
var ResultDisp={AS1:0,AS2:0,AS3:0,AS4:0,ASW1:0,ASW2:0};
var ConcreteElem={Text:"",QuantityElem:0,ListElem:[],IsPlate:0,Modul:0,Type:0,CrackResisting:0,MinArmatur:0,YesExpert:"",YesLengthOfFactor:0,NbCalc:0,OldCode:0,Range:[],EffectiveLength:[],FactorEffectiveLength:[],SeismFactor:[],m_GammaN:0,m_GammaN2:0,TypeBeton:0,ConditionsHardening:0,Filler:0,ClassBeton:"",SortBeton:"",FactorHardening:0, FactorForce:0,FactorTotal:0,ClassArmAlong:"",ClassArmAcross:"",FactorWorkAlong:0,FactorWorkAcross:0,MaxDiam:0,MaxProcent:0,MaxKolUg:0}; 
var Elem={Text:"",QuantityNode:0,ListNode:[],TypeElem:0,Flag:0,TypeRigid:0,NumInsert:0,NumSysCoord:0,NumSysCoordEffors:0,NumBed:0} 
var Rv=0;
var index2=0;
var All_arm=0;
var X=0
var Y=0
var Z=0
var info_pt={x:0,y:0,z:0,flag:0};
var N_Point=model.GetQuantityNode()
fh.WriteLine("$Nodes");
for (var Pt=1; Pt<N_Point; Pt++){
	model.GetNode(Pt, info_pt);
	X=info_pt.x;
	Y=info_pt.y;
	Z=info_pt.z;
	fh.WriteLine(Pt+" "+Math.ceil(X*1000)/1000+" "+Math.ceil(Y*1000)/1000+" "+Math.ceil(Z*1000)/1000);
};
var N_Elem=model.GetQuantityElem()
fh.WriteLine("$EndNodes");
fh.WriteLine("$Elements");
var List_pt =new Array();
var List_string ="";
for (var NumElem=1; NumElem<N_Elem+1; NumElem++){
	model.GetElem (NumElem, Elem);
	List_pt=Elem.ListNode.toArray()
	List_string ="";
	
	for (var index=0; index<List_pt.length; index++){
		List_string =List_string+" "+List_pt[index];
	};
	fh.WriteLine(NumElem+List_string);

};


fh.WriteLine("$EndElements");
fh.WriteLine("$ARM");
var List =  new Array();
		All_arm=model.GetQuantityConcreteElem()+1;
		for (var index=1; index<All_arm; index++){ 
			model.GetConcreteElem(index, ConcreteElem) 
			List=ConcreteElem.ListElem.toArray();
			myMsgBox.Popup (ConcreteElem.Text);
			myMsgBox.Popup (List.length);
			fh.WriteLine("@"+ConcreteElem.Text+"@"); 
			for (var index_el=0; index_el<List.length; index_el++){
				result.GetRCFitPlateResult(index_el, ResultDisp); 
				fh.WriteLine(List[index_el]+" "+Math.ceil(ResultDisp.AS1*1000000)/10000+" "+Math.ceil(ResultDisp.AS2*1000000)/10000+" "+Math.ceil(ResultDisp.AS3*1000000)/10000+" "+Math.ceil(ResultDisp.AS4*1000000)/10000+" "+Math.ceil(ResultDisp.ASW1*1000000)/10000+" "+Math.ceil(ResultDisp.ASW2*1000000)/10000);
			}
		};
		fh.WriteLine("$EndARM");
		   fh.Close(); 
		Plugin_Clean();
		Plugin_Cancel(engine)
	};
		catch (e)
	{
        	engine.Cancel(DumpObj(e));
	}
}
function DumpObj(obj)
{
	var dump = "";

	dump += obj;

	for(objKey in obj)
	{
		dump += "\n" + objKey.toString() + " : <" + obj[objKey] + ">";
	}

	if(!dump)
	{
		dump = "DumpObj empty";
	}

	return dump;
}


В принципе, почти все получилось, кроме визуализации в 3d.
Плиты я в принципе могу создать, но лучше сразу создавать вариант со стенами.
Так что нужна помощь, я пока завяз, может кто нибудь посмотри, кто разбирается с Python по лучше...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.

Последний раз редактировалось DEM, 08.05.2020 в 17:31.
DEM вне форума  
 
Автор темы   Непрочитано 12.05.2020, 16:27
#8
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Довольно симпатично с помощью Plotly получается.
Но не могу разобраться как контурные линии на этот треугольник наложить.


Код:
[Выделить все]
from plotly import offline


import plotly.graph_objects as go
offline.init_notebook_mode(connected=False)

fig = go.Figure(data=[
    go.Mesh3d(
        x=[0, 1, 2],
        y=[0, 0, 1],
        z=[0, 0, 0],
        colorbar_title='z',
        colorscale=[[0, 'gold'],
                    [0.5, 'mediumturquoise'],
                    [1, 'magenta']],
        # Intensity of each vertex, which will be interpolated and color-coded
        intensity=[0, 0.33, 1],
        
        # i, j and k give the vertices of triangles
        # here we represent the 4 triangles of the tetrahedron surface
        i=[0],
        j=[1],
        k=[2],
        name='y',
        showscale=True
    )
])

fig.show()
Миниатюры
Нажмите на изображение для увеличения
Название: 0.jpg
Просмотров: 181
Размер:	19.1 Кб
ID:	226079  
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Автор темы   Непрочитано 14.05.2020, 09:20
#9
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Обнаружил что есть библиотека VTK.
Она гораздо мощнее чем Poltli и Матплотлиб.
Правда пользоваться ею несколько сложнее.
Миниатюры
Нажмите на изображение для увеличения
Название: 0.jpg
Просмотров: 143
Размер:	20.2 Кб
ID:	226139  
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 14.05.2020, 11:01
#10
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


А есть ли большая надобность в выводе изополей армирования стен именно в трехмерном виде? Как насчет вывода разверток стен, т.е. вывод каждой стены в горизонтальной плоскости подобно плите? Все равно арматура проектируется что для плиты, что для стены на плоскости.
румата вне форума  
 
Автор темы   Непрочитано 14.05.2020, 11:14
#11
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Цитата:
Сообщение от румата Посмотреть сообщение
А есть ли большая надобность в выводе изополей армирования стен именно в трехмерном виде? Как насчет вывода разверток стен, т.е. вывод каждой стены в горизонтальной плоскости подобно плите? Все равно арматура проектируется что для плиты, что для стены на плоскости.
Ну как бы это уже отдельная тема...
Можно пилоны называть каким нибудь определенным образом и выводить их армирование на всю высоту.
Но в 3d это классика и экспертам понятнее...
Это же для формирования ПЗ. Можно будет за 10 минут полный отчет по армированию сделать. А если хорошенько подумать, то можно вообще автоматизировать выпуск результатов и граничных условий.
Для армирования в автокаде я все никак прогу до делать не могу, она уже есть у меня.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 14.05.2020, 11:19
#12
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Цитата:
Сообщение от DEM Посмотреть сообщение
Но в 3d это классика и экспертам понятнее...
На вкус и цвет, конечно, но лично мне намного удобнее смотреть на изополя и ГУ отдельных развернутых участков стен. Типа стена в/о 1-2-А-Б на отм. ....
румата вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Визуализация результатов FEM расчетов с помощью Matpotlib

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пакетная визуализация dwg моделей с помощью 3Ds Max-а Unfamous AutoCAD 2 17.06.2012 20:21
Lisp.Выделение с помощью ActiveX Composter LISP 8 07.03.2012 21:11
Как настроить плавное движение курсора при редактировании с помощью ручек? tasia AutoCAD 9 22.06.2011 15:35
Использование VBA в Excel для автоматизации расчетов Kinzer Программирование 24 29.10.2010 22:53
Подскажите как построить кривую с помощью команды SPLiNE, к boban Программирование 1 02.11.2003 19:58