Escolar Documentos
Profissional Documentos
Cultura Documentos
Foz do Iguaçu, PR
Julho de 2020
Ministério da Educação
Universidade Federal da Integração Latino-Americana
Instituto de Tecnologia, Infraestrutura e Território
Centro Interdisciplinar de Tecnologia e Infraestrutura
Foz do Iguaçu, PR
Julho de 2020
ii
iii
Universidade Federal da Integração Latino-Americana
Engenharia Civil de Infraestrutura
RESUMO
iv
Desenvolvimento de Software Para Análise Estrutural e Dimensionamento de Vigas de
VIALI, E. P. Concreto Armado Sob Flexão Simples
ABSTRACT
In order to reduce the time spent on the analysis and design of structures, computational
tools are developed with the function of automating the calculation processes, proposing
solutions with a higher degree of reliability and more economical dimensioning. Thus, the
objective of the present study was to develop software for structural analysis, through the
application of the finite element method and design of reinforced concrete beams, under
simple bending. For the implementation of the source code, the Python programming
language was used in conjunction with its Numpy and Matplotlib libraries, the program's
graphical interface being designed using the Qt Designer software and the PyQt library. In
order to validate the reliability and applicability of the software, and also to propose a new
tool to assist in the structural analysis, models were defined and simulated and the results
were subsequently compared with those obtained through similar programs. As shown, the
results obtained by the software developed in this study were the same as those obtained
when simulating the models in another program, validating their application, ensuring the
reliability of their results. Therefore, the program developed is passive for application in the
study and analysis of structures.
v
LISTA DE FIGURAS
vi
Desenvolvimento de Software Livre Para Análise de Estruturas Planas e Dimensionamento
VIALI, E. P. de Vigas em Concreto Armado Sob Flexão Simples
vii
FIGURA 45. TRECHO DE CÓDIGO PARA GERAÇÃO DA MATRIZ DE RIGIDEZ DO
ELEMENTO FINITO NO SISTEMA DE COORDENADAS LOCAL..............................62
FIGURA 46. TRECHO DE CÓDIGO PARA OBTENÇÃO DA MATRIZ DE RIGIDEZ DO
ELEMENTO FINITO NO SISTEMA DE COORDENADAS GLOBAL............................62
FIGURA 47. TRECHO DE CÓDIGO PARA GERAÇÃO DA MATRIZ DE RIGIDEZ
GLOBAL DA ESTRUTURA..........................................................................................63
FIGURA 48. MODELO-01 – VIGA BIAPOIADA COM 2 METROS DE COMPRIMENTO.
..................................................................................................................................... 64
FIGURA 49. MODELO-02 – PÓRTICO PLANO COM 4 METROS DE COMPRIMENTO
E 4 METROS DE ALTURA..........................................................................................65
FIGURA 50. MODELO PARA VALIDAÇÃO DO DIMENSIONAMENTO DA
ARMADURA LONGITUDINAL.....................................................................................65
FIGURA 51. JANELA DO PROGRAMA COM A INSERÇÃO DOS DADOS DEFINIDOS
NO EXEMPLO UTILIZADO PARA VALIDAÇÃO DO DIMENSIONAMENTO...............66
FIGURA 52. REAÇÕES NOS APOIOS CALCULADAS PELO SOFTWARE
DESENVOLVIDO – MODELO-01................................................................................67
FIGURA 53. REAÇÕES NOS APOIOS CALCULADAS PELO PROGRAMA FTOOL –
MODELO-01................................................................................................................ 67
FIGURA 54. ESFORÇOS CORTANTES CALCULADOS PELO SOFTWARE
DESENVOLVIDO – MODELO-01................................................................................68
FIGURA 55. ESFORÇOS CORTANTES CALCULADOS PELO PROGRAMA FTOOL –
MODELO-01................................................................................................................ 68
FIGURA 56. MOMENTOS FLETORES CALCULADOS PELO SOFTWARE
DESENVOLVIDO – MODELO-01................................................................................69
FIGURA 57. MOMENTOS FLETORES CALCULADOS PELO PROGRAMA FTOOL –
MODELO-01................................................................................................................ 69
FIGURA 58. VALORES DOS ESFORÇOS INTERNOS CALCULADOS PELO
SOFTWARE DESENVOLVIDO – MODELO-01...........................................................70
FIGURA 59. VALORES DOS DESLOCAMENTOS CALCULADOS PELO SOFTWARE
DESENVOLVIDO – MODELO-01................................................................................71
FIGURA 60. DIAGRAMA DE DESLOCAMENTOS OBTIDO PELO SOFTWARE
DESENVOLVIDO – MODELO-01................................................................................72
FIGURA 61. DIAGRAMA DE DESLOCAMENTOS NO EIXO Y OBTIDO PELO
PROGRAMA FTOOL – MODELO-01...........................................................................72
FIGURA 62. DIAGRAMA DE ROTAÇÕES OBTIDO PELO PROGRAMA FTOOL –
MODELO-01................................................................................................................ 72
viii
Desenvolvimento de Software Livre Para Análise de Estruturas Planas e Dimensionamento
VIALI, E. P. de Vigas em Concreto Armado Sob Flexão Simples
ix
SUMÁRIO
RESUMO...................................................................................................................... iii
ABSTRACT.................................................................................................................. iv
LISTA DE FIGURAS.....................................................................................................v
1. INTRODUÇÃO E JUSTIFICATIVA..........................................................................12
2. OBJETIVOS............................................................................................................14
3. REVISÃO BIBLIOGRÁFICA...................................................................................15
3.1.1 Ftool....................................................................................................................15
3.1.2 AcadFrame.........................................................................................................16
3.1.3 Trame................................................................................................................. 17
3.2.4 Qt Designer.........................................................................................................19
x
Desenvolvimento de Software Livre Para Análise de Estruturas Planas e Dimensionamento
VIALI, E. P. de Vigas em Concreto Armado Sob Flexão Simples
4. METODOLOGIA......................................................................................................50
4.1 INTRODUÇÃO.......................................................................................................50
xi
4.6.2 Modelo para validação do dimensionamento das armaduras longitudinais.........65
5. RESULTADOS........................................................................................................67
5.1.3 Deslocamentos...................................................................................................71
5.2.3 Deslocamentos...................................................................................................79
6. CONCLUSÕES........................................................................................................83
REFERÊNCIAS BIBLIOGRÁFICAS............................................................................84
..................................................................................................................................... 87
xii
1. INTRODUÇÃO E JUSTIFICATIVA
13
contemplam o dimensionamento de vigas em concreto armado, o desenvolvimento de uma
ferramenta que permita tal procedimento contribui de forma significativa aos estudos
acadêmicos voltados à análise estrutural. Além disso, sendo o código do software
desenvolvido aberto, este pode ser otimizado, adaptado ou ainda ampliado com a inserção
de novos módulos, conforme as necessidades de seus usuários, obtendo desta forma um
programa com maiores recursos e funcionalidades.
14
2. OBJETIVOS
15
3. REVISÃO BIBLIOGRÁFICA
3.1.1 Ftool
16
Embora o Ftool permita a análise do comportamento de estruturas planas (vigas,
pórticos e treliças), o programa não tem como objetivo o dimensionamento dos elementos
analisados, porém leva em consideração as propriedades do material atribuído à estrutura
em análise, bem como as dimensões da seção transversal definida pelo usuário. A interface
gráfica do programa (Figura 1), além de ser amigável ao usuário, é bastante interativa,
permitindo a rápida familiarização do usuário com o programa.
3.1.2 AcadFrame
17
Fonte: Coda e Paccola (2009).
3.1.3 Trame.
18
3.2 A LINGUAGEM DE PROGRAMAÇÃO PYTHON
19
3.2.3 Biblioteca PyQt e Qt Designer
3.2.4 Qt Designer
Após a interface ter sido criada no Qt Designer, um arquivo XML é gerado (com a
extensão .ui). Este arquivo depois de convertido para um módulo Python (com extensão
.py), através do utilitário pyuic, pode então ser importado ao código fonte do software criado
(BORGES, 2010).
20
3.3 ANÁLISE ESTRUTURAL
Fonte: Adaptado de Martha (2010) (b); DS Engenharia (2012) (a); Kim e Sankar (2011) (c).
21
materiais. Assim, os elementos estruturais passam representados por barras unifilares
(linhas), que representam os eixos dos elementos estruturais, estando o comportamento do
meio sólido contínuo contido no eixo das barras.
Com base em teorias físicas e em resultados experimentais e estatísticos, algumas
hipóteses simplificadoras podem ser adotadas na concepção do modelo estrutural:
Hipóteses sobre a geometria do modelo;
Hipóteses relacionadas às condições de suporte (ligações com o meio
externo);
Hipóteses sobre o comportamento dos materiais;
Hipóteses sobre as solicitações atuantes na estrutura.
A Figura 6 apresenta um dos pórticos de um galpão em modelo real e modelo
estrutural, neste último, os elementos estruturais de vigas e pilares são representados por
barras, ficando as informações tridimensionais dos elementos representadas por
propriedades globais de sua seção transversal, como a área e o momento de inércia.
22
Figura 7. Deslocamentos e rotações nodais para um
elemento de pórtico plano.
Conforme abordado por Beer e Johnston (2015); Hibbeler (2013); Kim e Sankar
(2011); Martha (2010); Timoshenko e Gere (1983), a análise do comportamento de
estruturas reticuladas tem como base a teoria da viga de Navier (1785-1836), a qual é
fundamentada em duas hipóteses simplificadoras: a primeira, originalmente proposta por
Jacob Bernoulli (1654-1705), expressa o fato de que, as seções transversais de uma viga
permanecem planas após a viga ter sido deformada; a segunda consiste em desprezar as
deformações geradas por forças de cisalhamento. Assim, da união destas hipóteses tem-se
que, estando a viga deformada por flexão simples, suas seções transversais são mantidas
planas e normais ao eixo da viga. Além disso, segundo salientado por Martha (2010), uma
vez que cada seção transversal da viga permanece unida a suas adjacentes, existe a
continuidade de deslocamentos em todos os pontos interiores de uma viga que sofre flexão
simples.
Frente ao fato de que a análise estrutural será realizada por meio da aplicação do
método dos elementos finitos, onde os graus de liberdade da estrutura são os
deslocamentos e as rotações da seção transversal, apresenta-se a formulação da equação
diferencial da viga de Navier.
Inicialmente serão determinadas as relações entre os deslocamentos e as
deformações em uma viga. Desta forma, define-se um sistema de coordenadas locais (ou
eixos locais) para uma barra conforme apresentado na figura Figura 8. Definido o sistema de
eixos locais, e tomando como modelo uma viga engastada em uma de suas extremidades,
traça-se a sua curva elástica onde podem ser representados os deslocamentos e rotações
que ocorrem na viga sob flexão.
23
Figura 8. Sistema de eixos locais e elástica
da barra.
dv
θ(x )= [1]
dx
24
Sendo:
δ ≈ dθ . y [2]
dθ
ε fx =− y [3]
dx
Da relação:
Resulta:
1 dθ
= [5]
ρ dx
1 d² v
= [7]
ρ dx ²
25
Figura 10. Equilíbrio do elemento infinitesimal.
dQ
∑ F y =0 → dx =q(x ) [8]
dM
∑ M o =0 → dx
=Q( x ) [9]
d2 M
=q ( x) [10]
d x2
σ fx =E ε fx [12]
dθ
(
σ fx =E − y
dx ) [13]
❑
dθ
M =E
( ∫ y 2 dA
A
) dx
[14]
26
O momento de inércia da seção transversal é dado por:
I =∫ y ² dA [15]
dθ
M =EI [16]
dx
dθ
Conforme apresentado na Equação 5, a relação representa a curvatura da linha
dx
elástica v( x), podendo a Equação 16 ser reescrita.
d ²v
M =EI [17]
dx ²
M : momento fletor;
E : módulo de Young – módulo de elasticidade;
I : momento de inércia da seção transversal.
d2 d2 v
dx ²[EI
dx ² ]
=q ( x) [18]
d4 v q ( x )
= [19]
d x 4 EI
Com origem na mecânica estrutural, o método dos elementos finitos (MEF) consiste
em uma poderosa ferramenta para a análise das estruturas, auxiliando na resolução de
27
equações diferenciais-parciais e equações integrais-diferenciais. Seu princípio é embasado
na discretização (divisão) do sistema estrutural analisado em elementos menores,
denominados elementos finitos. Para cada elemento são identificados os graus de liberdade
que descrevem seu comportamento, podendo assim, serem determinadas as equações que
apresentam seu comportamento e sua interação com os elementos vizinhos por meio dos
nós compartilhados, obtendo ao fim da análise a resposta global da estrutura com base nas
solicitações impostas (KIM e SANKAR, 2011).
Lv=f [20]
n
v́=∑ ai ϕi [21]
i=1
28
Ao substituir v por v́ , a igualdade apresentada na Equação 20 não é mais verificada,
havendo um erro dado por:
∫ ( L v́ −f ) ϕi dV =0 ,i=1, 2 , … , n [23]
V
29
uiG =uiL cosα−viL senα
viG =uiL senα + v iL cosα [24]
θiG =θiL
u1G u1L
{ }[ ]{ }
cos α −sin α 0 0 0 0
v 1G sin α cos α 0 0 0 0 v 1L
θ1G θ1L
= 0 0 1 0 0 0
[25]
uG2
0 0 0 cos α −sin α 0 u2L
vG2 0 0 0 sin α cos α 0 v 2
L
0 0 0 0 0 1 2
θ2G θL
É importante ressaltar que este trabalho não tem como objetivo esgotar o tema em
questão. Assim, a obtenção das funções aproximadoras e de forma é apresentada de
maneira sucinta, podendo maiores detalhes quanto ao desenvolvimento do tema serem
30
obtidos na literatura que embasou este subcapítulo (Método dos Elementos Finitos; Assan,
2003).
A fundamentação para obtenção das funções aproximadoras e das funções de forma
é dada como base na Figura 7.
Conforme apresentado por Assan (2003), o elemento finito de pórtico plano possui
como incógnitas nodais duas translações u e v , longitudinal e transversal respectivamente,
além de uma rotação θ .
Admitindo que a deformação longitudinal ε seja constante ao longo do elemento
finito, tais deslocamentos podem ser representados por uma reta, sendo sua função
aproximadora dada por:
Uma vez que é mais cômodo trabalhar com as funções aproximadoras explicitadas
em relação às incógnitas nodais, tem-se:
31
x
Sendo ξ uma coordenada adimensional dada por ξ= .
l
1−ξ 0 0 ξ 0 0
ϕ=
[ 0 1−3 ξ +2 ξ ( ξ−2 ξ + ξ ) l 0 3 ξ −2 ξ ( ξ −ξ 2 ) l
2 3 2 3 2 3 3
] [31]
Uma vez que as tensões e deformações no elemento finito de pórtico plano são
compostas por uma parcela relativa ao esforço axial e outra devida ao momento fletor, tem-
se as relações entre esses esforços e os deslocamentos (Assan, 2003).
du
N=σA=EεA=EA [32]
dx
d2 v
M =EIχ =−EI [33]
d x2
Sendo:
E o módulo de Young;
A a área da seção transversal do elemento;
I o momento de inércia da seção transversal em relação ao seu eixo neutro;
ε a deformação longitudinal;
χ a curvatura do eixo da barra no ponto analisado;
N os esforços normais; e
M os momentos fletores.
σ =D ε [35]
32
Sendo D a matriz que contém os parâmetros elásticos que caracterizam o material.
du 1 du −d 2 v −1 d2 v
ε= = e χ= = 2 [36]
dx l dε d x2 l d ε2
u1
{}
v1
0 0 1/l 0 0 θ1
{εχ }=[−1/l
0 (12 ξ−6)/l (6 ξ−4)/l 0 (6−12 ξ)/l 2
2
]
(6 ξ−2)/l u2
[37]
v2
θ2
ϵ =Bv [38]
Uma vez que as funções aproximadoras são escritas em função das incógnitas
nodais, a matriz de rigidez k do elemento finito de pórtico plano pode ser obtida por meio da
equação:
❑ ❑ ❑
(∫ BT DB dV
V
) v=∫ ϕT b dV +∫ ϕ T p dS
V S
[39]
Sendo v o vetor que contém as incógnitas nodais (graus de liberdade), b o vetor que
representa as ações volumétricas (nulo nesta análise), já que as cargas em questão são
inseridas como ações na estrutura, e p o vetor que contém as ações nodais atuantes.
kv =r [40]
Assim:
33
❑
k =∫ BT DB dV [41]
V
EA −EA
0 0 0 0
[ ]
l l
12 EI 6 EI −12 EI 6 EI
0 0
l3 l2 l3 l2
6 EI 4 EI −6 EI 2 EI
0 0
l2 l l2 l
k= [42]
−EA EA
0 0 0 0
l l
−12 EI −6 EI 12 EI −6 EI
0 0
l3 l2 l3 l2
6 EI 2 EI −6 EI 4 EI
0 0
l2 l l2 l
34
Figura 13
Pórtico
plano
modelo para
apresentaçã
o da
obtenção da
matriz de
rigidez
global da
estrutura.
Fonte: Autor
(2020).
35
A Figura 14 apresenta as matrizes de rigidez de cada um dos elementos do modelo
utilizado.
Os valores de k 1ij, k 2ij, k 3ij e k 4ij, com i e j variando de 1 a 12, correspondem aos termos
das matrizes de rigidez dos elementos 1, 2, 3 e 4 respectivamente.
Com o intuito de tornar mais claro o entendimento, as matrizes dos elementos foram
divididas em quadrantes numerados conforme apresenta a Figura 15.
36
Figura 15 Matrizes de rigidez dos elementos do modelo
dividida em quadrantes.
37
O fato dos quadrantes 12 e 21 estarem em branco na matriz de rigidez global,
elucida que na estrutura utilizada como modelo não há elemento ligando o nó 1 ao nó 2,
sendo a mesma observação válida para os quadrantes 23 e 32.
Com relação aos quadrantes 11, 33 e 44, que são comuns a mais de um elemento,
esses deverão serem somados termo a termo em sua respectiva posição dentro da matriz
1 4
de rigidez global conforme exemplificado na Figura 17 para os termos k 1,1 e k 1,1 que ocorrem
dentro do quadrante 11, o qual se repete nas matrizes dos elementos 1 e 4 do modelo.
Assim, o termo K 1,1 da matriz de rigidez global é dado pela soma k 11,1+ k 41,1.
Uma vez aplicado o exposto para todos os elementos que compõe o modelo
estrutural, tem-se a matriz de rigidez global da estrutura.
38
Com o intuito de determinar um vetor genérico das cargas nodais equivalentes,
toma-se um elemento finito inclinado de um ângulo α com a direção horizontal, sendo esse
elemento submetido a ação de um carregamento vertical linearmente variável (Figura 18).
Ou:
p=F pi [46]
Logo, o vetor das cargas nodais equivalentes pode ser calculado através da
equação:
39
❑
r =∫ ϕT p dS [47]
S
1 1
( )
p1 + p2 lsenαcosα
{ }
3 2
1
( 7 p 1+ 3 p2 ) lco s 2 α
20
1 1 1
r =−
(
10 2 1 3 2 )
p + p l 2 co s 2 α
[48]
1 1
(
3 2 1 2 )
p + p lsenαcosα
1 2
20
( 3 p 1+7 p2 ) lco s α
−1 1 1
10 3 ( )
p1 + p2 l 2 co s 2 α
2
A este vetor devem ser somadas as cargas diretamente aplicadas sobre os nós
(caso existam) nas posições correspondentes aos graus de liberdade a que se relacionam e
considerando seus sinais corretos, obtendo assim o vetor de cargas nodais equivalentes
total.
T
{ F }=[ T ] [ k ][ T ] {v }−{r } [49]
40
3.4 DIMENSIONAMENTO ESTRUTURAL
Segundo o item 12.5 da NBR 6118 (ABNT, 2014), para a verificação da segurança
das estruturas de concreto armado, devem ser atendidas além das condições construtivas
as condições analíticas de segurança.
Quanto às condições construtivas, devem ser atendidos as exigências estabelecidas:
nos critérios de detalhamento previstos nas seções 18 e 20 da norma;
nas normas de controle dos materiais, especialmente a ABNT NBR 12655;
no controle de execução da obra, conforme ABNT NBR 14931 e Normas
Brasileiras específicas.
No que diz respeito às condições analíticas e de segurança, a NBR 6118 (ABNT,
2014) estabelece que as resistências não devem ser menores que as solicitações e devem
ser verificadas em relação a todos os estados-limites e todos os carregamentos
especificados para o tipo de construção. Assim, em qualquer caso deve ser respeitada a
condição:
Rd ≥ Sd [50]
41
Onde Rd são os valores de cálculo dos esforços resistentes e Sd são os valores de
cálculo dos esforços solicitantes.
3.4.2.1 Estádio I
42
Figura 19 Comportamento do concreto na flexão pura (Estádio I).
3.4.2.2 Estádio II
Neste estádio, o concreto passa a não resistir a atuação das tensões de tração,
sendo sua contribuição resistente a esse tipo de esforço desprezada. Nesse momento, a
região tracionada do concreto inicia a fase de fissuração(Figura 20). Entretanto, a relação
linear das tensões ainda é válida para a parte do elemento sob compressão.
No estádio II, podem ser verificados os estados limites de serviço onde são
verificados os limites de aberturas de fissuras e deformações excessivas, podendo ou não
ocorrer o escoamento das armaduras (PINHEIRO et al., 2007).
43
Figura 20 Comportamento do concreto na flexão pura (Estádio II).
44
Figura 22 Diagrama retangular – NBR 6118.
45
Figura 23 Diagramas tensão x deformação do concreto e aço – Segundo a NBR 6118
(ABNT, 2014).
Conforme apresentado por Carvalho e Figueiredo Filho (2015), são definidos seis
domínios de deformação (Figura 24) com base no conjunto de deformações específicas do
concreto e do aço ao longo de uma seção transversal retangular com armadura simples
(apenas tracionada) submetida a ações normais.
A NBR 6118 (ABNT, 2014) apresenta os domínios de deformação correspondentes
aos limites de encurtamento do concreto à compressão simples ou do alongamento
excessivo do aço por deformação plástica excessiva à tração simples. O encurtamento
último do concreto para o caso de flexão simples é igual a ε cd =3,5 ‰, enquanto, que para o
46
3.4.5.1 Domínio 2
3.4.5.2 Domínio 3
Nesse domínio tanto o concreto quanto o aço trabalham com suas capacidades
máximas, a deformação do concreto comprimido varia até ε cd =3,5 ‰, enquanto o
alongamento da armadura tracionada varia da deformação relativa ao escoamento e ao
alongamento máximo permitido (2,07 ≤ ε yd ≤10 ‰ ¿ para o aço CA-50 aplicado neste estudo.
para qualquer valor de deformação dentro do intervalo de ε yd. Logo, caso ocorra a ruptura,
esta se dará com aviso prévio, pois o concreto apresentará fissuras aparentes e flechas
significativas no momento em que a armadura entrar em sua fase de escoamento
(PINHEIRO et al., 2007).
47
Figura 25 Elementos da seção retangular e diagramas de tensões e deformações.
Sendo:
h a altura da seção transversal;
d a altura útil da seção transversal;
b w a largura da seção transversal;
x a profundidade da linha neutra;
z o braço de alavanca;
Acc a área de concreto comprimido;
σ c a tensão de compressão atuante no concreto;
f cd a resistência de cálculo do concreto;
A s a área de aço resistente aos esforços de tração;
f yd a resistência de cálculo do aço;
48
F c ação atuante no concreto;
F s ação atuante na armadura;
M Sd Momento solicitante de cálculo;
M Rd Momento resistente de cálculo.
Sendo:
F S=f yd ⋅ A s [53]
Com:
f ck f yk
f cd = e f yd = [54]
1,4 1,15
Σ M =0 → M Sd −M Rd =0 ∴ M Sd =M Rd [55]
49
Uma vez que:
M Sd
x=
√ 2
0,68 ⋅ d ± ( 0,68 d ) −4 ⋅ 0,272⋅
0,544
( bw ⋅ f cd ) [60]
M Sd
A s= [61]
z ⋅ f yd
50
4. METODOLOGIA
4.1 INTRODUÇÃO
51
As 14 janelas que compõe o programa foram criadas em módulos distintos
(independentes), sendo posteriormente interligadas a janela principal (interface) do sistema,
possibilitando ao usuário o acompanhamento em tempo real das informações inseridas na
análise.
A seguir são apresentadas as telas que compõe a interface gráfica do software
desenvolvido neste trabalho.
A Figura 28 mostra a tela inicial do sistema, composta por uma área onde estão
dispostos os botões de acesso às telas de inserção de dados e visualização dos resultados,
contando ainda com uma área (canvas) para a visualização do modelo a ser analisado.
52
Na Figura 29 é apresentada a tela na qual o usuário faz a inserção dos nós da
estrutura por meio da indicação das coordenadas ( x , y ).
53
Posteriormente, o usuário pode inserir as propriedades físicas e mecânicas dos
elementos da estrutura conforme apresenta a Figura 31. Tais propriedades podem ser
inseridas igualmente a todos os elementos ou de maneira distinta para cada elemento,
conforme opção do usuário.
54
Figura 32 Janela-5 - Inserção das restrições nodais.
As cargas nodais são inseridas através de uma janela na qual o usuário pode
selecionar o nó em que as cargas de valor definido irão atuar.
A Figura 33 apresenta o momento em que são inseridas cargas nodais no nó 4 do
modelo.
55
De maneira similar, são inseridas as cargas distribuídas, para tal, o usuário seleciona
o elemento onde a carga irá atuar, bem como a orientação ( x , y ) e as cargas inicial (w i) e
56
Figura 35 Janela-10 – Dimensionamento das armaduras.
Para o armazenamento e manipulação dos dados inseridos pelo usuário, foi criado
um módulo para servir como banco de dados do software, utilizando a funcionalidade dos
dicionários do Python. Tal funcionalidade permite a busca das propriedades dos nós e
elementos do modelo por meio da identidade dos mesmos, aqui definidas como I dnó e I d elm
respectivamente.
Os dados inseridos pelo usuário são alocados dentro deste módulo e salvos em
arquivos de texto (arquivos do tipo .txt), podendo ser manipulados pelo sistema a qualquer
momento.
57
4.3.1 Inserção dos nós
Figura 36. Trecho de código para inserção e armazenamento de dados referentes aos
nós da estrutura.
58
Figura 37. Trecho de código para inserção e armazenamento de dados referentes aos
elementos da estrutura.
59
A inserção das condições de contorno (apoios da estrutura), é feita por meio da
seleção do nó a ser restringido e definição das restrições a serem aplicadas ao nó. Assim, o
programa faz a busca do nó por meio de sua identidade alimentando o banco de dados.
O trecho do código referente a essa função é apresentado na Figura 39.
A inserção das cargas distribuídas é dada por meio da seleção do elemento ao qual
a carga será aplicada, bem como sua orientação ( x , y ) e intensidades inicial e final da
carga, respectivamente w i e w f .
A Figura 41 apresenta o código desenvolvido para essa função.
60
Figura 41. Trecho de código para inserção e armazenamento das cargas distribuídas.
Além do banco de dados onde são armazenados os dados inseridos pelo usuário, foi
desenvolvido um segundo banco de dados similar onde são armazenadas as informações
que serão utilizadas para os cálculos a serem executados pelo sistema.
De modo a obter maior aproximação quanto aos resultados obtidos pelo programa,
foi desenvolvido um módulo responsável por subdividir cada elemento inserido pelo usuário
em 10 novos elementos exatamente idênticos, conforme apresentado na Figura 42. Dessa
forma, 9 novos nós são criados, sendo a análise realizada em um número maior de pontos
da estrutura, permitindo assim a representação gráfica mais precisa dos resultados.
Ressalta-se que havendo necessidade, a quantidade de elementos a serem gerados
pelo programa pode facilmente ser alterada dentro do código.
61
Passada esta etapa, o programa faz a incidência cinemática das matrizes de rigidez
dos novos elementos sobre a matriz de rigidez global da estrutura. Logo, são calculados os
esforços e deslocamentos atuantes para o sistema de coordenadas global da estrutura.
A seguir são apresentadas as funções criadas para o desenvolvimento dos cálculos
referentes a análise do modelo estrutural.
Inicialmente é feito o acesso ao banco de dados para a obtenção dos valores a
serem utilizados no procedimento dos cálculos (Figura 43).
62
Figura 45. Trecho de código para geração da matriz de rigidez do elemento finito no sistema
de coordenadas local.
Figura 46. Trecho de código para obtenção da matriz de rigidez do elemento finito no
sistema de coordenadas global.
63
Figura 47. Trecho de código para geração da matriz de rigidez global da
estrutura.
64
Dada a extensão do código responsável pelos cálculos, o mesmo será apresentado
como apêndice a este trabalho.
Visando validar os resultados obtidos pelo software quanto a análise estrutural, fez-
se uso de 2 modelos estruturais, os quais foram analisados pelo programa desenvolvido
neste estudo, sendo os resultados comparados com os aqueles obtidos fazendo uso do
programa ftool.
Para a validação do software foram definidos os modelos:
Viga biapoiada;
Pórtico plano.
65
Figura 49. Modelo-02 – Pórtico plano com 4 metros de
comprimento e 4 metros de altura.
66
Figura 51. Janela do programa com a inserção dos dados definidos no
exemplo utilizado para validação do dimensionamento.
67
5. RESULTADOS
Figura 52. Reações nos apoios calculadas pelo software desenvolvido – Modelo-01.
Figura 53. Reações nos apoios calculadas pelo programa ftool – Modelo-01.
68
5.1.2.2 Esforços cortantes
Conforme apresentado nas imagens que seguem (Figura 54 e Figura 55), os valores
dos esforços cortantes obtidos pelo programa desenvolvido são os mesmos apresentados
pelo programa ftool.
69
5.1.2.3 Momentos fletores
70
Os valores calculados pelo programa também podem ser observados dispostos em
uma tabela conforme apresenta a Figura 58.
71
5.1.3 Deslocamentos
72
Figura 60. Diagrama de deslocamentos obtido pelo software desenvolvido –
Modelo-01.
Figura 61. Diagrama de deslocamentos no eixo y obtido pelo programa ftool – Modelo-01.
73
5.2 ANÁLISE DO MODELO-02
5.2.1 Reações nos apoios da estrutura
As imagens que seguem, apresentam a igualdade entre os valores calculados pelo
programa (Figura 63) e os obtidos através do programa ftool (Figura 64).
74
5.2.2 Esforços internos
5.2.2.1 Esforços normais
As imagens que seguem (Figura 65 e Figura 66) apresentam respectivamente os
esforços normais calculados pelo programa e os resultados obtidos pelo ftool.
75
5.2.2.2 Esforços cortantes
Conforme apresentado nas imagens que seguem (Figura 67 e Figura 68), os valores
dos esforços cortantes obtidos pelo programa desenvolvido são os mesmos apresentados
pelo programa ftool.
76
Figura 68. Esforços cortantes calculados pelo programa ftool – Modelo-02.
77
5.2.2.3 Momentos fletores
As imagens (Figura 69 e Figura 70), elucidam a igualdade dos valores dos momentos
fletores calculados pelo programa frente aos resultados apresentados pelo programa ftool.
78
Conforme apresentado anteriormente, o programa ainda conta com uma janela
(Figura 71) onde os valores calculados são dispostos em uma tabela para visualização e
análise pelo usuário.
79
5.2.3 Deslocamentos
Os deslocamentos calculados para este modelo podem ser observados na Figura 72,
sendo o diagrama gerado pelo programa apresentado na Figura 73. O diagrama gerado pela
ferramenta ftool é apresentado na Figura 74.
80
Figura 73. Diagrama dos deslocamentos obtido pelo software desenvolvido
– Modelo-02.
81
5.3 ANÁLISE PARA VALIDAÇÃO DO DIMENSIONAMENTO DAS ARMADURAS LONGITUDINAIS
82
A imagem que segue (Figura 76esenta a tela do programa com os valores do modelo
inseridos para o dimensionamento das armaduras, bem como os resultados obtidos.
Nesta análise, fez-se a alteração da classe do concreto para C25 de modo a atender
a normativa vigente. Porém, como pode ser observado, a área de aço calculada pelo
programa foi de 4,30 cm², sendo a diferença entre os valores inferior a 0,5 %, sendo esta
diferença insignificativa.
83
6. CONCLUSÕES
84
REFERÊNCIAS BIBLIOGRÁFICAS
ASSAN, A. A. Método dos elementos finitos: primeiros passos. 2. ed. Campinas: Editora
da UNICAMP, 2003.
BEER, F. P.; JOHNSTON, E. R. Jr. Mecânica dos materiais. 7. ed. Porto Alegre: AMGH,
2015.
85
MENEZES, N. N. C. Introdução à programação com Python: algoritmos e lógica de
programação para iniciantes 2.ed. São Paulo: Novatec, 2014.
MESQUITA FILHO J. Estudo das vigas: flexão normal simples. 2015. Disponível em: <
https://www.feis.unesp.br/Home/departamentos/engenhariacivil/nepae/estudo-das-
vigas.pdf>. Acesso em: 02 jul. 2020.
TIMOSHENKO, S. P.; GERE, J. E. Mecânica dos sólidos. Rio de Janeiro: LTC - Livros
Técnicos Científicos, 1983.
86
APÊNDICES
87
Código para armazenamento dos dados
import math as m
import pickle
import csv
def dic_nos(self):
"Dicionário de Nós"
self.Nos = {}
return self.Nos
def dic_nos_des(self):
"Dicionário de Nós para o desenho da estrutura"
self.Nos_des = {}
return self.Nos_des
def dic_elem(self):
"Dicionário de Elementos"
self.Elem = {}
return self.Elem
def dic_elem_des(self):
"Dicionário de Elementos para o desenho da estrutura"
self.Elem_des = {}
return self.Elem_des
def dic_w_dist(self):
"Dicionário das ações atuantes na estruturra"
self.W_dist = {}
return self.W_dist
def limpar(self):
self.Nos = {}
self.salvar_nos(self.Nos)
self.Nos_des = {}
self.salvar_nos_des(self.Nos_des)
self.Elem = {}
self.salvar_elem(self.Elem)
self.Elem_des = {}
self.salvar_elem_des(self.Elem_des)
self.W_dist = {}
self.salvar_w_dist(self.W_dist)
def n(self):
"Função para definir a quantidade de elementos na discretização da
estrutura"
num_elem = 10
return num_elem
88
def conv_prog(self,valor):
"Função para converter valores do usuário para valores do programa"
n = self.n()
return (valor*n)-(n-1)
def conv_real(self,valor):
"Função para converter valores do programa para valores do usuário
- Valores de Desenho"
n = self.n()
return (valor+(n-1))/n
def no_int(self,elem):
"Função para calcular o primeiro nó interno ao longo do elemento
discretizado"
n = self.n()
return (elem*n)-(n-2)
def abrir_nos_des(self):
arq = open("Nos_des.txt", "rb")
self.Nos_des = pickle.load(arq)
arq.close()
return self.Nos_des
def abrir_elem(self):
arq = open("Elementos.txt", "rb")
self.Elem = pickle.load(arq)
arq.close()
return self.Elem
def abrir_elem_des(self):
arq = open("Elementos_des.txt", "rb")
self.Elem_des = pickle.load(arq)
arq.close()
return self.Elem_des
def abrir_w_dist(self):
arq = open("W_dist.txt", "rb")
self.W_dist = pickle.load(arq)
arq.close()
return self.W_dist
def abrir_resultados(self):
arq = open("Resultados.txt", "w")
arq.close()
89
def arq_nos(self):
"Função para verificar se o arquivo de nós existe"
try:
with open('Nos.txt', 'r') as f:
f = 'Nos.txt'
self.Nos = self.abrir_nos()
except IOError:
self.Nos = self.dic_nos()
return self.Nos
def arq_nos_des(self):
"Função para verificar se o arquivo de nós existe - Desenho"
try:
with open('Nos_des.txt', 'r') as f:
f = 'Nos_des.txt'
self.Nos_des = self.abrir_nos_des()
except IOError:
self.Nos_des = self.dic_nos_des()
return self.Nos_des
def arq_elem(self):
"Função para verificar se o arquivo de elementos existe"
try:
with open('Elementos.txt', 'r') as f:
f = 'Elementos.txt'
self.Elem = self.abrir_elem()
except IOError:
self.Elem = self.dic_elem()
return self.Elem
def arq_elem_des(self):
"Função para verificar se o arquivo de elementos existe - Desenho"
try:
with open('Elementos_des.txt', 'r') as f:
f = 'Elementos_des.txt'
self.Elem_des = self.abrir_elem_des()
except IOError:
self.Elem_des = self.dic_elem_des()
return self.Elem_des
def arq_w_dist(self):
"Função para verificar se o arquivo de cargas distribuídas existe"
try:
with open('W_dist.txt', 'r') as f:
f = 'W_dist.txt'
self.W_dist = self.abrir_w_dist()
except IOError:
self.W_dist = self.dic_w_dist()
return self.W_dist
def salvar_nos_des(self,dic):
arq = open("Nos_des.txt","wb")
pickle.dump(dic,arq)
90
arq.close()
def salvar_elem(self,dic):
arq = open("Elementos.txt","wb")
pickle.dump(dic,arq)
arq.close()
def salvar_elem_des(self,dic):
arq = open("Elementos_des.txt","wb")
pickle.dump(dic,arq)
arq.close()
def salvar_w_dist(self,dic):
arq = open("W_dist.txt","wb")
pickle.dump(dic,arq)
arq.close()
writer.writerow((elem,noi,nof,xi,yi,xf,yf,dxi,dxf,dyi,dyf,rzi,rzf,Fxi,Fxf,F
91
yi,Fyf,Mzi,Mzf,Ni,Nf,Vi,Vf,Mi,Mf))
finally:
arq.close()
arq_2 = open("Nodais_Eq.txt","w")
try:
writer = csv.writer(arq_2)
writer.writerow((u"Nós","Fx_eq","Fy_eq","Mz_eq"))
ord = list(self.Nos.keys())
ord.sort()
for no in ord:
Id_no = no
Fx_eq = self.Nos[Id_no]["Q_eq"]["fx_eq"]
Fy_eq = self.Nos[Id_no]["Q_eq"]["fy_eq"]
Mz_eq = self.Nos[Id_no]["Q_eq"]["mz_eq"]
writer.writerow((Id_no,Fx_eq,Fy_eq,Mz_eq))
finally:
arq_2.close()
def inserir_no(self,no,x,y):
"Função para inserir nós"
entrada = {"x": x,
"y": y,
"Restr.": {"u": 0, "v": 0, "t":
0},
"Q_nodal": {"fx": 0.00, "fy": 0.00, "mz":
0.00},
"Q_eq": {"fx_eq": 0.00, "fy_eq": 0.00, "mz_eq":
0.00},
"Desloc.": {"dx": 0.00, "dy": 0.00, "rz":
0.00},
"Reacoes": {"Fx": 0.00, "Fy": 0.00, "Mz":
0.00},
"Esforcos": {"N": 0.00, "V": 0.00, "M":
0.00}}
self.Nos[no] = entrada
self.salvar_nos(self.Nos)
def inserir_no_des(self,no,x,y):
"Função para inserir nós - Desenho"
entrada = {"x": x,
"y": y,
"Restr.": {"u": 0, "v": 0, "t":
0, "Rot.": 0},
"Q_nodal": {"fx": 0.00, "fy": 0.00, "mz":
0.00},
#"Q_eq": {"fx_eq": 0.00, "fy_eq": 0.00, "mz_eq":
0.00},
#"Desloc.": {"dx": 0.00, "dy": 0.00, "rz":
0.00},
"Reacoes": {"Fx": 0.00, "Fy": 0.00, "Mz":
0.00},
#"Esforcos": {"N": 0.00, "V": 0.00, "M":
0.00}
}
self.Nos_des[no] = entrada
92
self.salvar_nos_des(self.Nos_des)
def excluir_no(self,no):
"Função para excluir nós"
del self.Nos[no]
self.salvar_nos(self.Nos)
def rest_nos(self,no,u,v,t):
"Função para inserir as condições de contorno dos nós\
Manter livres u,v ou t: 0\
Manter Fixos u,v ou t: 1"
self.Nos[no]["Restr."] = {"u": u,
"v": v,
"t": t}
self.salvar_nos(self.Nos)
def rest_nos_des(self,no,u,v,t,rot):
"Função para inserir as condições de contorno (restrições) dos nós\
Manter livres u,v ou t: 0\
Manter Fixos u,v ou t: 1"
self.Nos_des[no]["Restr."] = {"u": u, "v": v, "t": t, "Rot.": rot}
self.salvar_nos_des(self.Nos_des)
def inserir_Qnodal(self,no,fx,fy,mz):
"Função para inserir cargas nodais - Q"
no = self.conv_prog(no)
self.Nos[no]["Q_nodal"] = {"fx": fx,
"fy": fy,
"mz": mz}
self.salvar_nos(self.Nos)
def ord_nos(self):
"Função para ordenar o dicionário Nós com base nas chaves"
ord = list(self.Nos.keys())
ord.sort()
for key in ord:
print("Nós: %d\t" % key, "--->", self.Nos[key])
def ord_nos_des(self):
"Função para ordenar o dicionário Nós com base nas chaves"
ord = list(self.Nos_des.keys())
ord.sort()
for key in ord:
print("Nós_des: %d\t" % key, "--->", self.Nos_des[key])
93
elem = self.conv_prog(elem)
noi = self.conv_prog(noi)
nof = self.conv_prog(nof)
xi = self.Nos[noi]["x"]
yi = self.Nos[noi]["y"]
xf = self.Nos[nof]["x"]
yf = self.Nos[nof]["y"]
L = m.sqrt(m.pow((xf-xi),2)+m.pow((yf-yi),2))
L_prog = L/n
Lamb_x = (xf-xi)/L
Lamb_y = (yf-yi)/L
x_prog = (Lamb_x*L_prog)+xi
y_prog = (Lamb_y*L_prog)+yi
entrada = {"noi": {"id": int(noi), "x": round(xi,2), "y":
round(yi,2),
"Q_eq": {"fx_eq": 0.00,"fy_eq": 0.00, "mz_eq":
0.00},
"Esforcos":{"N": 0, "V": 0, "M": 0}},
self.Elem[elem] = entrada
self.inserir_no(int(no_int),round(x_prog,2),round(y_prog,2))
c = 1
while c <= (n-2):
elem = elem+1
x_prog = (Lamb_x*c*L_prog)+xi
y_prog = (Lamb_y*c*L_prog)+yi
entrada = {"noi": {"id": int(no_int), "x": round(x_prog,2),
"y": round(y_prog,2),
"Q_eq": {"fx_eq": 0.00,"fy_eq": 0.00,
"mz_eq": 0.00},
"Esforcos":{"N": 0, "V": 0, "M": 0}},
self.Elem[elem] = entrada
self.inserir_no(int(no_int+1), round((Lamb_x*(c+1)*L_prog)
+xi,2), round((Lamb_y*(c+1)*L_prog)+yi,2))
c += 1
no_int =int(no_int+1)
x_prog = (Lamb_x*c*L_prog)+xi
y_prog = (Lamb_y*c*L_prog)+yi
entrada = {"noi": {"id": int(no_int), "x": round(x_prog, 2),
"y": round(y_prog, 2),
"Q_eq": {"fx_eq": 0.00,"fy_eq": 0.00,
"mz_eq": 0.00},
94
"Esforcos":{"N": 0, "V": 0, "M": 0}},
self.Elem[elem+1] = entrada
self.salvar_elem(self.Elem)
self.salvar_nos(self.Nos)
def inserir_elem_des(self,elem,noi,nof):
"Função para inserir elementos no desenho"
xi = self.Nos_des[noi]["x"]
yi = self.Nos_des[noi]["y"]
xf = self.Nos_des[nof]["x"]
yf = self.Nos_des[nof]["y"]
entrada = {"noi": {"id": noi, "x": xi, "y": yi, "wi": 0.00},
"nof": {"id": nof, "x": xf, "y": yf, "wf": 0.00}}
self.Elem_des[elem] = entrada
self.salvar_elem_des(self.Elem_des)
elem = self.conv_prog(elem)
c = 0
while c < self.n():
del self.Elem[elem]
elem += 1
c += 1
self.salvar_elem(self.Elem)
def excluir_elem_des(self,elem):
"Função para excluir elementos do desenho"
del self.Elem_des[elem]
self.salvar_elem_des(self.Elem_des)
def prop_elem(self,elem,area,inercia,elasticidade):
"Função para inserir as propriedades do elemento"
self.Elem[elem]["Prop."] = {"area": area,
"inercia": inercia,
"elast.": elasticidade}
self.salvar_elem(self.Elem)
def inserir_Wdist(self,elem,orientacao,wi,wf):
"Função para inserir cargas distribuídas"
n = self.n()
elem_prog = self.conv_prog(elem)
noi = self.Elem[elem_prog]["noi"]["id"]
95
nof = self.Elem[elem_prog+(n-1)]["nof"]["id"]
entrada = {"oreient.": str(orientacao), "noi": noi, "nof": nof,
"wi": wi, "wf": wf}
self.W_dist[elem] = entrada
self.salvar_w_dist(self.W_dist)
def ord_elem(self):
"Função para ordenar o dicionário Elem com base nas chaves"
ord = list(self.Elem.keys())
ord.sort()
for key in ord:
print("Elemento: %d" % key,"\t", "--->", self.Elem[key])
def ord_elem_des(self):
"Função para ordenar o dicionário Elem com base nas chaves"
ord = list(self.Elem_des.keys())
ord.sort()
for key in ord:
print("Elemento_des: %d" % key, "\t", "--->",
self.Elem_des[key])
def ord_wdist(self):
"Função para ordenar o dicionário Elem com base nas chaves"
ord = list(self.W_dist.keys())
ord.sort()
for key in ord:
print("Elemento: %d" % key, "\t", "--->", self.W_dist[key])
return self.wi+a*(self.x-self.xi)
def inserir_eq(self):
"Função para calcular e inserir as cargas nodais equivalentes"
self.Nos = self.abrir_nos()
self.Elem = self.abrir_elem()
self.W_dist = self.abrir_w_dist()
n = self.n()
96
elem_prog = self.conv_prog(elem)
c = 0
while c < n:
self.noi = self.Elem[elem_prog+c]["noi"]["id"]
self.nof = self.Elem[elem_prog+c]["nof"]["id"]
self.Nos[self.noi]["Q_eq"] = {"fx_eq": 0.00, "fy_eq": 0.00,
"mz_eq": 0.00}
self.Nos[self.nof]["Q_eq"] = {"fx_eq": 0.00, "fy_eq": 0.00,
"mz_eq": 0.00}
c += 1
if self.wi != 0 or self.wf != 0:
c = 0
while c < n:
self.noi = self.Elem[elem_prog]["noi"]["id"]
self.nof = self.Elem[elem_prog]["nof"]["id"]
self.xi = self.Elem[elem_prog]["noi"]["x"]
self.yi = self.Elem[elem_prog]["noi"]["y"]
self.xf = self.Elem[elem_prog]["nof"]["x"]
self.yf = self.Elem[elem_prog]["nof"]["y"]
self.L = m.sqrt(m.pow((self.xf - self.xi), 2) +
m.pow((self.yf - self.yi), 2))
self.Lamb_X = (self.xf - self.xi) / self.L
self.Lamb_y = (self.yf - self.yi) / self.L
print("\nElemento", elem_prog)
print("xi = ", self.xi)
print("xf = ", self.xf)
print("yi = ", self.yi)
print("yf = ", self.yf)
print("L = ", self.L)
print("Lamb_x = ", self.Lamb_X)
print("Lamb_y = ", self.Lamb_y)
print("xi_global = ", self.xi_global)
print("xf_global = ", self.xf_global)
print("yi_global = ", self.yi_global)
print("yf_global = ", self.yf_global)
xi = self.xi
xf = self.xf
fx = self.Nos[self.noi]["Q_eq"]["fx_eq"]
fy = self.Nos[self.noi]["Q_eq"]["fy_eq"]
mz = self.Nos[self.noi]["Q_eq"]["mz_eq"]
print("fx=", fx, "fy=", fy, "mz=", mz)
self.qi = self.Wx(xi, self.xi_global, self.xf_global,
self.wi, self.wf)
self.qf = self.Wx(xf, self.xi_global, self.xf_global,
self.wi, self.wf)
97
print("qi = ", self.qi, "\nqf = ", self.qf)
print("fx1=",self.fx1,"fy1=",self.fy1,"mz1=",self.mz1)
fx = self.Nos[self.nof]["Q_eq"]["fx_eq"]
fy = self.Nos[self.nof]["Q_eq"]["fy_eq"]
mz = self.Nos[self.nof]["Q_eq"]["mz_eq"]
print("fx=", fx, "fy=", fy, "mz=", mz)
self.fx2 = ((1/3) * (self.qi / 2 + self.qf) * self.L *
self.Lamb_y * self.Lamb_X)
self.fy2 = ((1/20) * (3 * self.qi + 7 * self.qf) *
self.L * m.pow(self.Lamb_X, 2))
self.mz2 = ((-1) * (1/10) * (self.qi / 3 + self.qf / 2)
* m.pow(self.L, 2) * m.pow(self.Lamb_X, 2))
#__Insere as equivalentes nodais devidas somente ao
elemento em questão
#__Cargas utilizadas para o cálculo dos esforços
internos
#__Sem isso as cargas equivalentes são subtraídas
erroneamente gerando esforços incorretos
self.Elem[elem_prog]["nof"]["Q_eq"] = {"fx_eq":
self.fx2, "fy_eq": self.fy2, "mz_eq": self.mz2}
self.salvar_elem(self.Elem)
#__Soma das cargas nodais equivalentes dos n elementos
ligados ao nó
self.fx2 = self.fx2 + fx
self.fy2 = self.fy2 + fy
self.mz2 = self.mz2 + mz
#__Insere as equivalentes nodais devidas a cada
elemento ligado ao nó
#__Cargas utilizadas para o cálculo das reações nos
apoios
self.Nos[self.nof]["Q_eq"] = {"fx_eq": self.fx2,
98
"fy_eq": self.fy2, "mz_eq": self.mz2}
self.salvar_nos(self.Nos)
elem_prog += 1
c += 1
#import csv
import math as m
99
class Drawing(QWidget):
"Classe que define o canvas de desenho"
def __init__(self, parent=None):
super(Drawing, self).__init__(parent)
self.setMinimumSize(5000,5000)
self.size = self.size()
self.h = self.size.height()
self.w = self.size.width()
self.n = 50
self.grid = self.n # ---> Assume-se: 50 pixels = 1 metro
#self.QScrollBar.setSliderPosition(99)
self.xo = 2*self.grid
self.yo = (self.h - self.h % self.grid) - 2*self.grid
def conv_x(self,x):
conv_x = self.xo+x*self.grid
return conv_x
def conv_y(self,y):
conv_y = self.yo-y*self.grid
return conv_y
def x_estat(self,x):
x_estat = self.xo_estat+x*self.n
return x_estat
def y_estat(self,y):
y_estat = self.yo_estat-y*self.n
return y_estat
#__EVENTOS DO
MOUSE______________________________________________________________________
_______________________________
#======================================================================#
# A FUNÇÃO PAINT_EVENT FUNCIONA DE MÓDO CUMULATIVO, SENDO ASSIM,
#
# É NECESSÁRIA A INCLUSÃO DOS DICIONÁRIOS DENTRO DO MÓDULOS DE DESENHO
#
100
#======================================================================#
self.db = Dados()
self.Nos = self.db.arq_nos()
self.Nos_des = self.db.arq_nos_des()
self.Elem = self.db.arq_elem()
self.Elem_des = self.db.arq_elem_des()
self.W_dist = self.db.arq_w_dist()
qp = QPainter()
qp.begin(self)
"Desenha os elementos"
self.drawElem(qp)
"Desenha os nós"
self.drawNos(qp)
#==========================================================#
# Verificação das restrições e rotação dos apoios #
# Índices e ângulos das rotações: 0=0, 1=90, 2=180 e 3=270 #
#==========================================================#
for no in self.Nos_des:
if self.Nos_des[no]["Reacoes"]["Fx"] == 0 and \
self.Nos_des[no]["Reacoes"]["Fy"] == 0 and \
self.Nos_des[no]["Reacoes"]["Mz"] == 0:
u = self.Nos_des[no]["Restr."]["u"]
v = self.Nos_des[no]["Restr."]["v"]
t = self.Nos_des[no]["Restr."]["t"]
rot = self.Nos_des[no]["Restr."]["Rot."]
if u == 1 and v == 0 and t == 0 and rot == 0:
self.drawApoioX(qp, no)
elif u == 1 and v == 0 and t == 0 and rot == 2:
self.drawApoioX_180(qp, no)
elif u == 0 and v == 1 and t == 0 and rot == 0:
self.drawApoioY(qp, no)
elif u == 0 and v == 1 and t == 0 and rot == 2:
self.drawApoioY_180(qp, no)
elif u == 1 and v == 1 and t == 0 and rot == 0:
self.drawApoioXY(qp, no)
elif u == 1 and v == 1 and t == 0 and rot == 2:
self.drawApoioXY_180(qp, no)
101
elif u == 1 and v == 0 and t == 1 and rot == 0:
self.drawApoioXZ(qp, no)
elif u == 1 and v == 0 and t == 1 and rot == 2:
self.drawApoioXZ_180(qp, no)
elif u == 0 and v == 1 and t == 1 and rot == 0:
self.drawApoioYZ(qp, no)
elif u == 0 and v == 1 and t == 1 and rot == 2:
self.drawApoioYZ_180(qp, no)
elif u == 1 and v == 1 and t == 1 and rot == 0:
self.drawApoioXYZ(qp, no)
elif u == 1 and v == 1 and t == 1 and rot == 1:
self.drawApoioXYZ_90(qp, no)
elif u == 1 and v == 1 and t == 1 and rot == 2:
self.drawApoioXYZ_180(qp, no)
elif u == 1 and v == 1 and t == 1 and rot == 3:
self.drawApoioXYZ_270(qp, no)
elif u == 0 and v == 0 and t == 1 and rot == 0:
self.drawApoioZ(qp, no)
#================================================================#
# Verificação e inserção das CARGAS NODAIS atuantes na estrutura #
#================================================================#
for no in self.Nos_des:
fx = self.Nos_des[no]["Q_nodal"]["fx"]
fy = self.Nos_des[no]["Q_nodal"]["fy"]
mz = self.Nos_des[no]["Q_nodal"]["mz"]
if fx > 0:
self.drawFx1(qp, no, fx)
if fx < 0:
self.drawFx2(qp, no, fx)
if fy > 0:
self.drawFy1(qp, no, fy)
if fy < 0:
self.drawFy2(qp, no, fy)
if mz > 0:
self.drawMz1(qp, no, mz)
if mz < 0:
self.drawMz2(qp, no, mz)
#===================================================================#
# Verificação e inserção das REAÇÕES DE APOIO atuantes na estrutura #
#===================================================================#
for no in self.Nos_des:
fx = self.Nos_des[no]["Reacoes"]["Fx"]
fy = self.Nos_des[no]["Reacoes"]["Fy"]
mz = self.Nos_des[no]["Reacoes"]["Mz"]
if fx > 0:
self.drawFx1(qp, no, fx)
if fx < 0:
self.drawFx2(qp, no, fx)
if fy > 0:
self.drawFy1(qp, no, fy)
if fy < 0:
self.drawFy2(qp, no, fy)
if mz > 0:
self.drawMz1(qp, no, mz)
if mz < 0:
self.drawMz2(qp, no, mz)
#======================================================================#
102
# Verificação e inserção das cargas distribuídas atuantes na estrutura
#
#======================================================================#
###########################################################################
#############################################
#__FUNÇÕES PARA A CRIAÇÃO DE
DESENHOS___________________________________________________________________
________________
###########################################################################
#############################################
qp.setPen(Qt.green)
qp.setRenderHint(qp.Antialiasing)
"Eixo x"
qp.drawLine(self.x_estat(-1.8), self.y_estat(-1.8), self.x_estat(-
0.5), self.y_estat(-1.8))
qp.drawLine(self.x_estat(-0.5), self.y_estat(-1.8), self.x_estat(-
0.7), self.y_estat(-1.7))
qp.drawLine(self.x_estat(-0.5), self.y_estat(-1.8), self.x_estat(-
0.7), self.y_estat(-1.9))
qp.drawText(self.x_estat(-0.4), self.y_estat(-1.8), "x")
"Eixo y"
qp.setPen(Qt.red)
qp.setRenderHint(qp.Antialiasing)
qp.drawLine(self.x_estat(-1.8), self.y_estat(-1.8), self.x_estat(-
1.8), self.y_estat(-0.5))
qp.drawLine(self.x_estat(-1.8), self.y_estat(-0.5), self.x_estat(-
1.7), self.y_estat(-0.7))
qp.drawLine(self.x_estat(-1.8), self.y_estat(-0.5), self.x_estat(-
1.9), self.y_estat(-0.7))
qp.drawText(self.x_estat(-1.7), self.y_estat(-0.4), "y")
103
qp.setPen(Qt.yellow)
qp.setRenderHint(qp.Antialiasing)
qp.drawText(self.x_estat(-0.10), self.y_estat(-1.85), "Produced By:
EPV_ENGENHARIA")
###########################################################################
#############################################
#__FUNÇÕES PARA DESENHAR A ESTRUTURA (Nós e
Elementos)_________________________________________________________________
_
###########################################################################
#############################################
if yi > yf:
y = yi
else:
104
y = yf
pen = QPen(Qt.green)
qp.setPen(pen)
font = QFont("Arial", 9)
qp.setFont(font)
#__Elementos inclinados
elif delta_x != 0 and delta_y != 0:
qp.drawText(xi + delta_x/2, y - delta_y/2 + 17.5,
str(elem))
###########################################################################
#############################################
#__FUNÇÕES PARA DESENHAR OS
APOIOS_____________________________________________________________________
_______________
###########################################################################
#############################################
105
qp.drawPolygon(a, b, c)
"Desenha a linha da base"
qp.drawLine(x+21, y+10.5, x+21, y-10.5)
106
y = self.conv_y(self.Nos_des[no]["y"])
ponto_no = QPointF(x, y)
a = ponto_no
b = QPoint(x-10.5, y-14)
c = QPoint(x+10.5, y-14)
"Desenhando"
pen = QPen(Qt.green, 1, Qt.SolidLine)
qp.setPen(pen)
qp.setRenderHint(qp.Antialiasing)
"Desenha o triângulo"
qp.drawPolygon(a, b, c)
"Desenha as linhas inclinadas - Fixação"
k = 0
while k <= 21:
qp.drawLine(x-10.5+k, y-14, x-6+k, y-19)
k += 7
107
"Desenha a linha de ligação"
qp.drawLine(x, y, x+14, y)
"Desenha as linhas inclinadas - Fixação"
k = 0
while k <= 21:
qp.drawLine(x+21, y-10.5+k, x+26, y-15+k)
k += 7
108
"Função para desenhar apoio fixo xyz - Default - Rot_0"
x = self.conv_x(self.Nos_des[no]["x"])
y = self.conv_y(self.Nos_des[no]["y"])
"Desenhando"
pen = QPen(Qt.green, 1, Qt.SolidLine)
qp.setPen(pen)
qp.setRenderHint(qp.Antialiasing)
"Desenha a linha da base"
qp.drawLine(x-10.5, y+14, x+10.5, y+14)
"Desenha linha de ligação"
qp.drawLine(x, y, x, y + 14)
"Desenha as linhas inclinadas - Fixação"
k = 0
while k <= 21:
qp.drawLine(x-10.5+k, y+14, x-15+k, y+19)
k += 7
109
"Desenha a linha da base"
qp.drawLine(x-14, y+10.5, x-14, y-10.5)
"Desenha a linha de ligação"
qp.drawLine(x, y, x - 14, y)
"Desenha as linhas inclinadas - Fixação"
k = 0
while k <= 21:
qp.drawLine(x-14, y-10.5+k, x-19, y-6+k)
k += 7
###########################################################################
#############################################
#__FUNÇÕES PARA DESENHAR AS CARGAS
NODAIS_____________________________________________________________________
__________
###########################################################################
#############################################
110
qp.drawText(x+40, y-8, fx+" kN")
111
b = QPoint(x, y-35)
c = QPoint(x, y-25)
centro = QRectF(x-30, y+30, 60, -60)
pen = QPen(Qt.red, 1, Qt.SolidLine)
qp.setPen(pen)
qp.setBrush(QColor(Qt.red))
qp.setRenderHint(qp.Antialiasing)
qp.drawPolygon(a, b, c)
qp.setBrush(Qt.NoBrush)
qp.drawArc(centro, -45*16, -225*16)
qp.drawText(x+30, y+30, mz+" kN.m")
qp.setRenderHint(qp.Antialiasing)
pen = QPen(Qt.darkGray, 0.5, Qt.SolidLine)
pen.setCapStyle(Qt.RoundCap)
qp.setPen(pen)
"Desenha a linha superior da carga"
qp.drawLine(xi, (y+wi), xf, (y+wf))
c = 0
while c <= L:
x = xi + c
y1 = y+(wi+((wf-wi)/(xf-xi))*(x-xi))
if y1 < y:
a = 3
y2 = y-5
elif y1 > y:
a = -3
y2 = y+5
"Desenhando as setas que representam o carregamento"
if abs(y1-y2) >= 5:
qp.drawLine(x, y1, x, y2)
qp.drawLine(x, y2, x+a, y2-a)
qp.drawLine(x, y2, x-a, y2-a)
'''if abs(wi) <= abs(wf) and y1 <= y2:
qp.drawLine(x, y1, x, y2)
if abs(y1-y2)>=8:
qp.drawLine(x, y2, x+a, y2-a)
qp.drawLine(x, y2, x-a, y2-a)
112
elif abs(wi) >= abs(wf) and y1 <= y2:
qp.drawLine(x, y1, x, y2)
if abs(y1 - y2) >= 8:
qp.drawLine(x, y2, x+a, y2-a)
qp.drawLine(x, y2, x-a, y2-a)
elif abs(wi) == abs(wf):
qp.drawLine(x, y1, x, y2)
if abs(y1 - y2) >= 8:
qp.drawLine(x, y2, x+a, y2-a)
qp.drawLine(x, y2, x-a, y2-a)'''
c += 10
"Escrevendo os textos com os valores dos carregamentos"
if wi == wf:
w = str(abs(wi))
qp.setRenderHint(qp.Antialiasing)
pen = QPen(Qt.green, 1, Qt.SolidLine)
qp.setPen(pen)
qp.drawText(((xi+xf)/2)-30, y+wi-5,"w = " + w + "
kN/m")
if wi != wf:
w1 = str(abs(wi))
w2 = str(abs(wf))
qp.setRenderHint(qp.Antialiasing)
pen = QPen(Qt.green, 1, Qt.SolidLine)
qp.setPen(pen)
qp.drawText(((xi+xf)/2)-30, y+((wi+wf)/2)-30, "wi = " +
w1 + " kN/m")
qp.drawText(((xi+xf)/2)-30, y+((wi+wf)/2)-15, "wf = " +
w2 + " kN/m")
#==========================================================================
============================================#
# JANELA DA INTERFACE
#==========================================================================
============================================#
class Interface(QWidget):
def __init__(self, parent=None):
super(Interface, self).__init__(parent)
self.db = Dados()
#self.Nos = self.db.arq_nos()
self.bt_3.setVisible(False)
self.bt_4.setVisible(False)
self.bt_5 = QPushButton("Fechar")
self.bt_5.setMinimumSize(QSize(75, 25))
self.bt_5.setMaximumSize(QSize(75, 25))
113
self.bt_5.clicked.connect(self.fechar)
self.h_layout_2 = QHBoxLayout()
self.h_layout_2.setSpacing(5)
self.h_layout_2.addStretch(1)
#self.h_layout_2.addWidget(self.bt_Deslocamentos)
#self.h_layout_2.addWidget(self.bt_Esforcos)
self.h_layout_2.addWidget(self.bt_3)
self.h_layout_2.addWidget(self.bt_4)
self.h_layout_2.addWidget(self.bt_5)
#self.bt_Iniciar = QPushButton("Iniciar")
#self.bt_Iniciar.setMinimumSize(QSize(60, 60))
#self.bt_Iniciar.setMaximumSize(QSize(60, 60))
#self.bt_Iniciar.clicked.connect(self.abrir_nos)
self.bt_Nos = QPushButton("Inserir\nNós")
self.bt_Nos.setMinimumSize(QSize(60, 60))
self.bt_Nos.setMaximumSize(QSize(60, 60))
self.bt_Nos.clicked.connect(self.abrir_nos)
self.bt_Elementos = QPushButton("Inserir\nElementos")
self.bt_Elementos.setMinimumSize(QSize(60, 60))
self.bt_Elementos.setMaximumSize(QSize(60, 60))
self.bt_Elementos.clicked.connect(self.abrir_elementos)
self.bt_Propriedades = QPushButton("Inserir\nPropried.")
self.bt_Propriedades.setMinimumSize(QSize(60, 60))
self.bt_Propriedades.setMaximumSize(QSize(60, 60))
self.bt_Propriedades.clicked.connect(self.abrir_propriedades)
self.bt_Apoios = QPushButton("Inserir\nApoios")
self.bt_Apoios.setMinimumSize(QSize(60, 60))
self.bt_Apoios.setMaximumSize(QSize(60, 60))
self.bt_Apoios.clicked.connect(self.abrir_apoios)
self.bt_Deslocamentos = QPushButton("Visualizar\nDeslocam.")
self.bt_Deslocamentos.setMinimumSize(QSize(60, 60))
self.bt_Deslocamentos.setMaximumSize(QSize(60, 60))
self.bt_Deslocamentos.clicked.connect(self.calcular)
self.bt_Deslocamentos.clicked.connect(self.abrir_desloc)
self.bt_Esforcos = QPushButton("Visualizar\nEsforços")
self.bt_Esforcos.setMinimumSize(QSize(60, 60))
self.bt_Esforcos.setMaximumSize(QSize(60, 60))
self.bt_Esforcos.clicked.connect(self.calcular)
self.bt_Esforcos.clicked.connect(self.abrir_esforcos)
#self.bt_Calcular = QPushButton("Calcular\nEstrutura")
#self.bt_Calcular.setMinimumSize(QSize(60, 60))
#self.bt_Calcular.setMaximumSize(QSize(60, 60))
114
#self.bt_Calcular.clicked.connect(self.calcular)
self.bt_Dimensionar = QPushButton("Dimens.\nArmadura\nLong.")
self.bt_Dimensionar.setMinimumSize(QSize(60, 60))
self.bt_Dimensionar.setMaximumSize(QSize(60, 60))
self.bt_Dimensionar.clicked.connect(self.abrir_dimensionamento)
self.bt_Salvar_txt.setVisible(False)
self.bt_Limpar = QPushButton("Limpar\nDados")
self.bt_Limpar.setMinimumSize(QSize(60, 60))
self.bt_Limpar.setMaximumSize(QSize(60, 60))
self.bt_Limpar.clicked.connect(self.limpar)
self.h_layout = QHBoxLayout()
self.h_layout.setSpacing(5)
#self.h_layout.addWidget(self.bt_Iniciar)
self.h_layout.addWidget(self.bt_Nos)
self.h_layout.addWidget(self.bt_Elementos)
self.h_layout.addWidget(self.bt_Propriedades)
self.h_layout.addWidget(self.bt_Apoios)
self.h_layout.addWidget(self.bt_CargaNodal)
self.h_layout.addWidget(self.bt_Carga_Dist)
self.h_layout.addWidget(self.bt_Esforcos)
self.h_layout.addWidget(self.bt_Deslocamentos)
#self.h_layout.addWidget(self.bt_Calcular)
self.h_layout.addWidget(self.bt_Dimensionar)
self.h_layout.addWidget(self.bt_Salvar_txt)
self.h_layout.addWidget(self.bt_Limpar)
self.h_layout.addStretch(1)
#self.lineEdit = QLineEdit()
#self.lineEdit.setMinimumSize(QSize(200, 20))
#self.lineEdit.setMaximumSize(QSize(200, 20))
###########################################################################
#############################################
self.drawing = Drawing()
self.scrollArea = QScrollArea()
self.scrollArea.setWidget(self.drawing)
###########################################################################
#############################################
#self.formLayout = QFormLayout()
#self.formLayout.setMargin(10)
#self.formLayout.setHorizontalSpacing(10)
#self.formLayout.setLayout(0, QFormLayout.SpanningRole,
self.h_layout)
#self.formLayout.setWidget(1, QFormLayout.LabelRole, self.lineEdit)
#self.formLayout.setWidget(2, QFormLayout.SpanningRole,
self.drawing)
#self.formLayout.setLayout(3, QFormLayout.LabelRole,
self.h_layout_2)
self.GridLayout = QGridLayout()
self.GridLayout.addLayout(self.h_layout, 0, 0)
115
#self.GridLayout.addWidget(self.lineEdit, 1, 0)
self.GridLayout.addWidget(self.scrollArea, 1, 0)
self.GridLayout.addLayout(self.h_layout_2, 2, 0)
#self.GridLayout.addWidget(self.bt_1, 3, 0)
#self.GridLayout.addWidget(self.bt_Esforcos, 3, 1)
#self.GridLayout.addWidget(self.bt_3, 3, 2)
#self.GridLayout.addWidget(self.bt_4, 3, 3)
#self.GridLayout.addWidget(self.bt_5, 3, 4)
#self.setLayout(self.formLayout)
self.setLayout(self.GridLayout)
def abrir_nos(self):
W = J_Nos(self)
W.setModal(True)
W.show()
W.exec_()
def abrir_elementos(self):
W = J_Elementos(self)
W.setModal(True)
W.show()
W.exec_()
def abrir_propriedades(self):
W = J_Propriedades(self)
W.setModal(True)
W.show()
W.exec_()
def abrir_apoios(self):
W = J_Apoios(self)
W.setModal(True)
W.show()
W.exec_()
def abrir_carga_C(self):
W = J_Carga_C(self)
W.setModal(True)
W.show()
W.exec_()
def abrir_carga_D(self):
W = J_Carga_D(self)
W.setModal(True)
W.show()
W.exec_()
def abrir_dimensionamento(self):
W = J_Dimensionamento(self)
W.setModal(True)
W.showMaximized()
W.exec_()
def abrir_selvar_txt(self):
W = J_Salvar_txt(self)
W.setModal(True)
W.show()
W.exec_()
116
def abrir_desloc(self):
W = J_Res_Desloc(self)
W.setModal(True)
W.show()
W.exec_()
def abrir_esforcos(self):
W = J_Res_Esforcos(self)
W.setModal(True)
W.show()
W.exec_()
def calcular(self):
inicio = time.time()
self.calculos = Calculos()
self.calculos.deslocamentos()
self.calculos.reacoes()
self.calculos.esforcos()
fim = time.time()
print("\nTempo de execução:", round((fim - inicio),ndigits=4))
#self.close()
#self.show()
def salvar(self):
"Função para salvar os resultados em arquivo .txt, para abrir com
EXCEL"
#self.db.abrir_resultados()
#self.db.salvar_resultados()
self.abrir_selvar_txt()
'''def teste(self):
self.lineEdit.setText('Testando a Janela')'''
def limpar(self):
self.db.limpar()
self.close()
self.show()
def fechar(self):
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = Interface(None)
app.showMaximized()
app.show()
root.exec_()
class J_Nos(QDialog):
def __init__(self, parent=None):
117
super(J_Nos, self).__init__(parent)
self.db = Dados()
self.Nos = self.db.arq_nos()
self.Nos_des = self.db.arq_nos_des()
self.setWindowTitle("INSERIR NÓS")
self.resize(270, 465)
self.setMinimumSize(QSize(270, 465))
self.setMaximumSize(QSize(270, 465))
self.tableWidget = QTableWidget(self)
self.tableWidget.setGeometry(20, 130, 230, 230)
self.tableWidget.setColumnCount(3)
item = QTableWidgetItem()
item.setText("Nó")
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QTableWidgetItem()
item.setText("X")
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QTableWidgetItem()
item.setText("Y")
self.tableWidget.setHorizontalHeaderItem(2, item)
for i in range(0):
self.tableWidget.insertRow(i)
self.tableWidget.horizontalHeader().setDefaultSectionSize(70)
self.tableWidget.verticalHeader().setVisible(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(20)
self.lineEdit_y = QLineEdit(self)
self.lineEdit_y.setGeometry(QRect(180, 70, 70, 20))
self.lineEdit_y.setMinimumSize(QSize(15, 20))
self.lineEdit_y.setAlignment(Qt.AlignCenter)
self.lineEdit_x = QLineEdit(self)
self.lineEdit_x.setGeometry(QRect(100, 70, 70, 20))
self.lineEdit_x.setAlignment(Qt.AlignCenter)
self.lineEdit_No = QLineEdit(self)
self.lineEdit_No.setEnabled(True)
self.lineEdit_No.setGeometry(QRect(20, 70, 70, 20))
item = self.tableWidget.currentRow()
118
self.lineEdit_No.setText(str(item + 2))
self.lineEdit_No.setMouseTracking(False)
self.lineEdit_No.setFocusPolicy(Qt.NoFocus)
self.lineEdit_No.setAcceptDrops(False)
self.lineEdit_No.setAlignment(Qt.AlignCenter)
#self.label_1 = QLabel(self)
#self.label_1.setGeometry(QRect(20, 400, 221, 41))
#self.label_1.setText("Clique duas vezes sobre uma coordenada\n
para editar.")
self.label_2 = QLabel(self)
self.label_2.setGeometry(QRect(20, 425, 221, 41))
self.label_2.setText("Clique 'Excluir' para deletar a última
linha.")
self.label_No = QLabel(self)
self.label_No.setGeometry(QRect(20, 50, 70, 13))
self.label_No.setText("Id - Nó")
self.label_No.setAlignment(Qt.AlignCenter)
self.label_x = QLabel(self)
self.label_x.setGeometry(QRect(100, 50, 70, 13))
self.label_x.setText("X")
self.label_x.setAlignment(Qt.AlignCenter)
self.label_y = QLabel(self)
self.label_y.setGeometry(QRect(180, 50, 70, 13))
self.label_y.setText("Y")
self.label_y.setAlignment(Qt.AlignCenter)
self.label_3 = QLabel(self)
self.label_3.setGeometry(QRect(20, 20, 230, 20))
self.label_3.setText("Inserir Coordenadas dos Nós")
font = QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.label_3.setFont(font)
self.label_3.setAlignment(Qt.AlignCenter)
self.label_4 = QLabel(self)
self.label_4.setGeometry(QRect(20, 105, 230, 20))
self.label_4.setText("Nós Inseridos")
font = QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.label_4.setFont(font)
self.label_4.setAlignment(Qt.AlignCenter)
self.setTabOrder(self.lineEdit_x, self.lineEdit_y)
self.setTabOrder(self.lineEdit_y, self.bt_Inserir)
self.setTabOrder(self.bt_Inserir, self.bt_Salvar)
self.setTabOrder(self.bt_Salvar, self.tableWidget)
self.setTabOrder(self.tableWidget, self.lineEdit_No)
self.tableWidget.setFocusPolicy(Qt.NoFocus)
self.bt_Inserir.setFocusPolicy(Qt.NoFocus)
self.bt_Salvar.setFocusPolicy(Qt.NoFocus)
self.repopular()
119
def repopular(self):
"Função para extrair dados do dicionário Nós e repopular a janela
Nós"
Nos = list(self.Nos.keys())
Nos.sort()
for no in Nos:
id_no = no
x = self.Nos[id_no]["x"]
y = self.Nos[id_no]["y"]
id_no = self.db.conv_real(no)
if id_no %1 == 0:
id_no = int(id_no)
self.lineEdit_No.setText(str(id_no+1))
self.tableWidget.insertRow(id_no-1)
item = QTableWidgetItem()
item.setText(str(id_no))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) #__Para desabilitar a
ediçao dos campos da coluna 0 da tabela
self.tableWidget.setItem((id_no-1), 0, item)
item = QTableWidgetItem()
item.setText(str(x))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled)
self.tableWidget.setItem((id_no-1), 1, item)
item = QTableWidgetItem()
item.setText(str(y))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled)
self.tableWidget.setItem((id_no-1), 2, item)
def inserir(self):
x = self.lineEdit_x.text()
y = self.lineEdit_y.text()
c=0
while self.tableWidget.item(c,0)!=None:
c+=1
if x and y != '':
self.lineEdit_No.setText(str(c+2))
self.tableWidget.insertRow(c)
item = QTableWidgetItem()
item.setText(str(c + 1))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled)
self.tableWidget.setItem(c, 0, item)
item = QTableWidgetItem()
item.setText(str(float(x)))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
self.tableWidget.setItem(c, 1, item)
item = QTableWidgetItem()
item.setText(str(float(y)))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
self.tableWidget.setItem(c, 2, item)
120
no = (int(float(self.lineEdit_No.text())-1))
no_prog = int(self.db.conv_prog(no))
x = (float(self.lineEdit_x.text()))
y = (float(self.lineEdit_y.text()))
self.db.inserir_no(no_prog,x,y)
self.db.inserir_no_des(no,x,y)
self.close()
self.show()
self.lineEdit_x.clear()
self.lineEdit_y.clear()
self.lineEdit_x.setFocus()
def salvar(self):
# _TRECHO PARA O CASO DE SER POSSÍVEL EDITAR AS COORDENADAS DOS
NÓS_#
'''c = 0
while self.tableWidget.item(c, 0) != None:
no = int(float(self.tableWidget.item(c, 0).text()))
x = float(self.tableWidget.item(c, 1).text())
y = float(self.tableWidget.item(c, 2).text())
#self.db.atualizar_no(no, x, y)
self.db.salvar_nos(self.Nos)
c += 1'''
print("\nNós")
self.db.ord_nos()
print("\nNós_des")
self.db.ord_nos_des()
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Nos()
app.show()
root.exec_()
class J_Elementos(QDialog):
121
def __init__(self, parent=None):
super(J_Elementos, self).__init__(parent)
self.db = Dados()
self.Nos = self.db.arq_nos()
self.Nos_des = self.db.arq_nos_des()
self.Elem = self.db.arq_elem()
self.Elem_des = self.db.arq_elem_des()
self.setWindowTitle("INSERIR ELEMENTOS")
self.resize(270, 465)
self.setMinimumSize(QSize(270, 465))
self.setMaximumSize(QSize(270, 465))
self.tableWidget = QTableWidget(self)
self.tableWidget.setGeometry(20, 130, 230, 230)
self.tableWidget.setColumnCount(3)
item = QTableWidgetItem()
item.setText("Elemento")
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QTableWidgetItem()
item.setText("Nó i")
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QTableWidgetItem()
item.setText("Nó f")
self.tableWidget.setHorizontalHeaderItem(2, item)
for i in range(0):
self.tableWidget.insertRow(i)
self.tableWidget.horizontalHeader().setDefaultSectionSize(70)
self.tableWidget.verticalHeader().setVisible(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(20)
self.bt_Inserir = QPushButton("Inserir",self)
self.bt_Inserir.setGeometry(QRect(97.5, 370, 75, 25))
self.bt_Inserir.clicked.connect(self.inserir)
self.bt_Inserir.setShortcut("Enter")
self.lineEdit_Nof = QLineEdit(self)
self.lineEdit_Nof.setGeometry(QRect(180, 70, 70, 20))
self.lineEdit_Nof.setMinimumSize(QSize(15, 20))
self.lineEdit_Nof.setAlignment(Qt.AlignCenter)
self.lineEdit_Noi = QLineEdit(self)
self.lineEdit_Noi.setGeometry(QRect(100, 70, 70, 20))
self.lineEdit_Noi.setAlignment(Qt.AlignCenter)
122
self.lineEdit_Elemento = QLineEdit(self)
self.lineEdit_Elemento.setEnabled(True)
self.lineEdit_Elemento.setGeometry(QRect(20, 70, 70, 20))
item = self.tableWidget.currentRow()
self.lineEdit_Elemento.setText(str(item + 2))
self.lineEdit_Elemento.setFocusPolicy(Qt.NoFocus)
self.lineEdit_Elemento.setAlignment(Qt.AlignCenter)
self.label_Elemento = QLabel(self)
self.label_Elemento.setGeometry(QRect(20, 50, 70, 13))
self.label_Elemento.setText("Id - Elemento")
self.label_Elemento.setAlignment(Qt.AlignCenter)
self.label_Noi = QLabel(self)
self.label_Noi.setGeometry(QRect(100, 50, 70, 13))
self.label_Noi.setText("Nó i")
self.label_Noi.setAlignment(Qt.AlignCenter)
self.label_Nof = QLabel(self)
self.label_Nof.setGeometry(QRect(180, 50, 70, 13))
self.label_Nof.setText("Nó f")
self.label_Nof.setAlignment(Qt.AlignCenter)
self.label_1 = QLabel(self)
self.label_1.setGeometry(QRect(20, 20, 230, 20))
self.label_1.setText("Inserir Elementos e Nós Vinculados")
font = QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.label_1.setFont(font)
self.label_1.setAlignment(Qt.AlignCenter)
self.label_2 = QLabel(self)
self.label_2.setGeometry(QRect(20, 105, 230, 20))
self.label_2.setText("Elementos Inseridos")
font = QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
self.label_2.setAlignment(Qt.AlignCenter)
#self.label_3 = QLabel(self)
#self.label_3.setGeometry(QRect(20, 400, 221, 41))
#self.label_3.setText("Clique duas vezes sobre um Nó para editar.")
self.label_4 = QLabel(self)
self.label_4.setGeometry(QRect(20, 415, 221, 41))
self.label_4.setText("Clique 'EXCLUIR' para deletar a última
linha.")
self.setTabOrder(self.lineEdit_Noi, self.lineEdit_Nof)
self.setTabOrder(self.lineEdit_Nof, self.bt_Inserir)
self.setTabOrder(self.bt_Inserir, self.bt_Salvar)
self.setTabOrder(self.bt_Salvar, self.tableWidget)
self.setTabOrder(self.tableWidget, self.lineEdit_Elemento)
self.tableWidget.setFocusPolicy(Qt.NoFocus)
self.bt_Inserir.setFocusPolicy(Qt.NoFocus)
self.bt_Salvar.setFocusPolicy(Qt.NoFocus)
123
self.repopular()
def repopular(self):
"Função para extrair dados do dicionário Elem e repopular a janela
Elementos"
n = self.db.n()
Elementos = list(self.Elem.keys())
Elementos.sort()
for elem in Elementos:
id_elem = self.db.conv_real(elem)
if id_elem % 1 == 0:
noi = self.db.conv_real(self.Elem[elem]["noi"]["id"])
nof = self.db.conv_real(self.Elem[elem+(n-1)]["nof"]["id"])
id_elem = int(id_elem)
self.lineEdit_Elemento.setText(str(id_elem+1))
self.tableWidget.insertRow(id_elem-1)
item = QTableWidgetItem()
item.setText(str(id_elem))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) #__Para desabilitar a
ediçao dos campos da coluna 0 da tabela
self.tableWidget.setItem((id_elem-1), 0, item)
item = QTableWidgetItem()
item.setText(str(noi))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) #__Para desabilitar a
ediçao dos campos da coluna 1 da tabela
self.tableWidget.setItem((id_elem-1), 1, item)
item = QTableWidgetItem()
item.setText(str(nof))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) #__Para desabilitar a
ediçao dos campos da coluna 2 da tabela
self.tableWidget.setItem((id_elem-1), 2, item)
def inserir(self):
noi = self.lineEdit_Noi.text()
nof = self.lineEdit_Nof.text()
c = 0
while self.tableWidget.item(c, 0) != None:
c += 1
if noi and nof != '':
self.lineEdit_Elemento.setText(str(c + 2))
self.tableWidget.insertRow(c)
item = QTableWidgetItem()
item.setText(str(c + 1))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled)
self.tableWidget.setItem(c, 0, item)
item = QTableWidgetItem()
item.setText(str(float(noi)))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
self.tableWidget.setItem(c, 1, item)
item = QTableWidgetItem()
item.setText(str(float(nof)))
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
124
Qt.AlignCenter)
self.tableWidget.setItem(c, 2, item)
elem = (int(float(self.lineEdit_Elemento.text())-1))
noi = (float(self.lineEdit_Noi.text()))
nof = (float(self.lineEdit_Nof.text()))
self.db.inserir_elem(elem, noi, nof)
self.db.inserir_elem_des(elem, noi, nof)
self.close()
self.show()
self.lineEdit_Noi.clear()
self.lineEdit_Nof.clear()
self.lineEdit_Noi.setFocus()
def salvar(self):
#inicio = time.time()
print("\nNós")
self.db.ord_nos()
print("\nNós Desenho")
self.db.ord_nos_des()
print("\nElementos")
self.db.ord_elem()
print("\nElementos Desenho")
self.db.ord_elem_des()
self.close()
self.destroy()
self.abrir_propriedades()
#fim = time.time()
#print("\nTempo de execução:",fim-inicio)
def excluir(self):
c = 0
while self.tableWidget.item(c, 0) != None:
c += 1
self.tableWidget.removeRow(c-1)
self.lineEdit_Elemento.setText(str(c))
self.db.excluir_elem(c)
#__Função que será desnecessária apos nova adequação sem os
elementos e nós de desenho
self.db.excluir_elem_des(c)
self.close()
self.show()
def abrir_propriedades(self):
time.sleep(1)
W = J_Propriedades(self)
W.setModal(True)
W.show()
W.exec_()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Elementos()
app.show()
root.exec_()
125
Código da janela para inserção das propriedades físicas e mecânicas dos
elementos
class J_Propriedades(QDialog):
def __init__(self, parent=None):
super(J_Propriedades, self).__init__(parent)
self.db = Dados()
self.Elem = self.db.arq_elem()
'''try:
with open('Elementos.txt', 'r') as f:
f = 'Elementos.txt'
print("\nO arquivo",f, "existe e pode ser utilizado pelo
sistema")
self.Elem = self.db.abrir_elem()
except IOError:
print(u'Arquivo não encontrado - O banco de dados esta sendo
inicializado!')
self.Elem = self.db.dic_elem()'''
self.setWindowTitle("PROPRIEDADES")
self.resize(255, 305)
self.setMinimumSize(QSize(255, 305))
self.setMaximumSize(QSize(255, 305))
self.lineEdit_Area = QLineEdit(self)
self.lineEdit_Area.setGeometry(QRect(155, 20, 90, 20))
self.lineEdit_Area.setAlignment(Qt.AlignCenter)
self.lineEdit_Area.setText("450.00")
self.lineEdit_MomentoI = QLineEdit(self)
self.lineEdit_MomentoI.setGeometry(QRect(155, 50, 90, 20))
self.lineEdit_MomentoI.setAlignment(Qt.AlignCenter)
self.lineEdit_MomentoI.setText("33750.00")
126
self.lineEdit_ModuloE = QLineEdit(self)
self.lineEdit_ModuloE.setGeometry(QRect(155, 80, 90, 20))
self.lineEdit_ModuloE.setAlignment(Qt.AlignCenter)
self.lineEdit_ModuloE.setText("25000.00")
self.comboBox_Elementos = QComboBox(self)
self.comboBox_Elementos.setGeometry(QRect(70, 120, 80, 22))
self.comboBox_Elementos.addItem("")
self.comboBox_Elementos.setItemText(0, "Selecione...")
def popular_elementos(self):
"Função para inserir os elementos no ComboBox Elementos"
Elementos = list(self.Elem.keys())
Elementos.sort()
for elem in Elementos:
id_elem = self.db.conv_real(elem)
if id_elem % 1 == 0:
id_elem = int(id_elem)
self.comboBox_Elementos.addItem("")
self.comboBox_Elementos.setItemText(id_elem, str(id_elem))
def aplicar(self):
if self.checkBox_Elementos.isChecked():
for elem in self.Elem:
elem = elem
A = float(self.lineEdit_Area.text())
I = float(self.lineEdit_MomentoI.text())
E = float(self.lineEdit_ModuloE.text())
self.db.prop_elem(elem, A, I, E)
else:
n = self.db.n()
elem = float(self.comboBox_Elementos.currentText())
elem = self.db.conv_prog(elem)
A = float(self.lineEdit_Area.text())
I = float(self.lineEdit_MomentoI.text())
E = float(self.lineEdit_ModuloE.text())
"Laço para inserir as propriedades nos novos elementos gerados"
c = 0
while c < n:
self.db.prop_elem(elem+c, A, I, E)
c+=1
self.comboBox_Elementos.setCurrentIndex(0)
self.checkBox_Elementos.setChecked(False)
127
def salvar(self):
print("\nElementos")
self.db.ord_elem()
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Propriedades()
app.show()
root.exec_()
class J_Apoios(QDialog):
def __init__(self, parent=None):
super(J_Apoios, self).__init__(parent)
self.db = Dados()
self.Nos = self.db.arq_nos()
self.Nos_des = self.db.arq_nos_des()
self.setWindowTitle("INSERIR RESTRIÇÕES")
self.resize(275, 460)
self.setMinimumSize(QSize(275, 460))
self.setMaximumSize(QSize(275, 460))
128
self.comboBox_Angulo = QComboBox(self.groupBox_Fixar)
self.comboBox_Angulo.setGeometry(QRect(80, 115, 80, 20))
self.comboBox_Angulo.addItem("0\xB0")
self.checkBox_Dx.clicked.connect(self.angulos)
self.checkBox_Dy.clicked.connect(self.angulos)
self.checkBox_Rz.clicked.connect(self.angulos)
self.lineEdit_Dx = QLineEdit(self.groupBox_Atribuir)
self.lineEdit_Dx.setGeometry(QRect(85, 30, 70, 20))
self.lineEdit_Dx.setAlignment(Qt.AlignCenter)
self.lineEdit_Dy = QLineEdit(self.groupBox_Atribuir)
self.lineEdit_Dy.setGeometry(QRect(85, 60, 70, 20))
self.lineEdit_Dy.setAlignment(Qt.AlignCenter)
self.lineEdit_Rz = QLineEdit(self.groupBox_Atribuir)
self.lineEdit_Rz.setGeometry(QRect(85, 90, 70, 20))
self.lineEdit_Rz.setAlignment(Qt.AlignCenter)
self.comboBox_Nos = QComboBox(self)
self.comboBox_Nos.setGeometry(QRect(185, 70, 80, 22))
self.comboBox_Nos.addItem("")
self.comboBox_Nos.setItemText(0, "Selecione...")
129
self.bt_Salvar.setGeometry(QRect(185, 130, 80, 23))
self.bt_Salvar.setFocusPolicy(Qt.NoFocus)
self.bt_Salvar.clicked.connect(self.salvar)
self.checkBox_Dx.clicked.connect(self.verificar_Dx)
self.checkBox_Dy.clicked.connect(self.verificar_Dy)
self.checkBox_Rz.clicked.connect(self.verificar_Rz)
self.popular_nos()
def popular_nos(self):
'''Inserir (popular) os nós do banco de dados dentro do
ComboBox_Nos'''
Nos = list(self.Nos.keys())
Nos.sort()
for no in Nos:
id_no = self.db.conv_real(no)
if id_no % 1 == 0:
id_no = int(id_no)
self.comboBox_Nos.addItem("")
self.comboBox_Nos.setItemText(id_no, str(id_no))
def angulos(self):
self.comboBox_Angulo.clear()
self.comboBox_Angulo.addItem("0\xB0")
self.Dx = self.checkBox_Dx
self.Dy = self.checkBox_Dy
self.Rz= self.checkBox_Rz
if self.Rz.isChecked():
self.comboBox_Angulo.clear()
self.comboBox_Angulo.addItem("0\xB0")
if self.Dx.isChecked() or self.Dy.isChecked():
self.comboBox_Angulo.clear()
self.comboBox_Angulo.addItem("0\xB0")
self.comboBox_Angulo.addItem("180\xB0")
if self.Dx.isChecked() and self.Dy.isChecked() and
self.Rz.isChecked():
self.comboBox_Angulo.clear()
self.comboBox_Angulo.addItem("0\xB0")
self.comboBox_Angulo.addItem("90\xB0")
self.comboBox_Angulo.addItem("180\xB0")
self.comboBox_Angulo.addItem("270\xB0")
def inserir(self):
'''Inserir restrições nodais'''
angulo = self.comboBox_Angulo.currentText()
if angulo == "0\xB0":
rot = 0
elif angulo == "90\xB0":
rot = 1
elif angulo == "180\xB0":
rot = 2
elif angulo == "270\xB0":
rot = 3
if self.checkBox_Dx.isChecked():
u = 1
else:
u = 0
if self.checkBox_Dy.isChecked():
v = 1
130
else:
v = 0
if self.checkBox_Rz.isChecked():
t = 1
else:
t = 0
no = int(self.comboBox_Nos.currentText())
no_prog = self.db.conv_prog(no)
self.db.rest_nos(no_prog, u, v, t)
self.db.rest_nos_des(no, u, v, t, rot)
self.close()
self.show()
# __Desmarcando opções selecionadas
self.comboBox_Nos.setCurrentIndex(0)
self.checkBox_Dx.setChecked(False)
self.checkBox_Dy.setChecked(False)
self.checkBox_Rz.setChecked(False)
def verificar_Dx(self):
if self.checkBox_Dx.isChecked():
self.lineEdit_Dx.setText("0.00")
self.lineEdit_Dx.setEnabled(False)
else:
self.lineEdit_Dx.setText("")
self.lineEdit_Dx.setEnabled(True)
def verificar_Dy(self):
if self.checkBox_Dy.isChecked():
self.lineEdit_Dy.setText("0.00")
self.lineEdit_Dy.setEnabled(False)
else:
self.lineEdit_Dy.setText("")
self.lineEdit_Dy.setEnabled(True)
def verificar_Rz(self):
if self.checkBox_Rz.isChecked():
self.lineEdit_Rz.setText("0.00")
self.lineEdit_Rz.setEnabled(False)
else:
self.lineEdit_Rz.setText("")
self.lineEdit_Rz.setEnabled(True)
def salvar(self):
print("\nNós")
self.db.ord_nos()
print("\nNós_des")
self.db.ord_nos_des()
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Apoios()
app.show()
root.exec_()
131
Código da janela para inserção sas cargas nodais
class J_Carga_C(QDialog):
def __init__(self, parent=None):
super(J_Carga_C, self).__init__(parent)
self.db = Dados()
self.Nos = self.db.arq_nos()
self.Nos_des = self.db.arq_nos_des()
self.setWindowTitle("CARGAS NODAIS")
self.resize(240, 285)
self.setMinimumSize(QSize(240, 285))
self.setMaximumSize(QSize(240, 285))
self.lineEdit_Fx = QLineEdit(self)
self.lineEdit_Fx.setGeometry(QRect(65, 15, 80, 20))
self.lineEdit_Fx.setAlignment(Qt.AlignCenter)
self.lineEdit_Fx.setText("0.00")
self.lineEdit_Fx.setFocus()
self.lineEdit_Fy = QLineEdit(self)
self.lineEdit_Fy.setGeometry(QRect(65, 45, 80, 20))
self.lineEdit_Fy.setAlignment(Qt.AlignCenter)
self.lineEdit_Fy.setText("0.00")
self.lineEdit_Mz = QLineEdit(self)
self.lineEdit_Mz.setGeometry(QRect(65, 75, 80, 20))
self.lineEdit_Mz.setAlignment(Qt.AlignCenter)
self.lineEdit_Mz.setText("0.00")
self.comboBox_No = QComboBox(self)
self.comboBox_No.setGeometry(QRect(65, 105, 80, 22))
self.comboBox_No.addItem("")
self.comboBox_No.setItemText(0, "Selecione...")
132
self.bt_Salvar.clicked.connect(self.salvar)
self.popular_nos()
def popular_nos(self):
"Função para extrair dados do dicionário Nós e popular o ComboBox
Nós"
Nos = list(self.Nos.keys())
Nos.sort()
for no in Nos:
id_no = self.db.conv_real(no)
if id_no % 1 == 0:
id_no = int(id_no)
self.comboBox_No.addItem("")
self.comboBox_No.setItemText(id_no, str(id_no))
def aplicar(self):
no = int(float(self.comboBox_No.currentText()))
fx = float(self.lineEdit_Fx.text())
fy = float(self.lineEdit_Fy.text())
mz = float(self.lineEdit_Mz.text())
self.db.inserir_Qnodal(no, fx, fy, mz)
self.db.inserir_Qnodal_des(no, fx, fy, mz)
self.close()
self.show()
self.lineEdit_Fx.setText("0.00")
self.lineEdit_Fy.setText("0.00")
self.lineEdit_Mz.setText("0.00")
self.comboBox_No.setCurrentIndex(0)
self.lineEdit_Fx.setFocus()
def salvar(self):
print()
self.db.ord_nos()
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Carga_C()
app.show()
root.exec_()
class J_Carga_D(QDialog):
def __init__(self, parent=None):
super(J_Carga_D, self).__init__(parent)
self.db = Dados()
self.n = self.db.n()
self.Elem = self.db.arq_elem()
self.W_dist = self.db.arq_w_dist()
133
self.setWindowTitle("CARGAS DISTRIBUÍDAS")
self.resize(265, 285)
self.setMinimumSize(QSize(265, 285))
self.setMaximumSize(QSize(265, 285))
self.lineEdit_Wi = QLineEdit(self)
self.lineEdit_Wi.setGeometry(QRect(75, 15, 80, 20))
self.lineEdit_Wi.setAlignment(Qt.AlignCenter)
self.lineEdit_Wi.setText('0.00')
self.lineEdit_Wi.setFocus()
self.lineEdit_Wf = QLineEdit(self)
self.lineEdit_Wf.setGeometry(QRect(75, 45, 80, 20))
self.lineEdit_Wf.setAlignment(Qt.AlignCenter)
self.lineEdit_Wf.setText('0.00')
self.comboBox_Orientacao = QComboBox(self)
self.comboBox_Orientacao.setGeometry(QRect(75, 75, 80, 22))
self.comboBox_Orientacao.addItem("")
self.comboBox_Orientacao.addItem("")
self.comboBox_Orientacao.addItem("")
self.comboBox_Orientacao.setItemText(0, "Selecione...")
self.comboBox_Orientacao.setItemText(1, "Eixo x")
self.comboBox_Orientacao.setItemText(2, "Eixo y")
self.comboBox_Elemento = QComboBox(self)
self.comboBox_Elemento.setGeometry(QRect(75, 105, 80, 22))
self.comboBox_Elemento.addItem("")
self.comboBox_Elemento.setItemText(0, "Selecione...")
self.popular_elementos()
def popular_elementos(self):
"Função para extrair dados do dicionário Elem e popular o ComboBox
Elementos"
Elementos = list(self.Elem.keys())
Elementos.sort()
134
for elem in Elementos:
id_elem = self.db.conv_real(elem)
if id_elem % 1 == 0:
id_elem = int(id_elem)
self.comboBox_Elemento.addItem("")
self.comboBox_Elemento.setItemText(id_elem, str(id_elem))
def aplicar(self):
elem = int(float(self.comboBox_Elemento.currentText()))
orientacao = self.comboBox_Orientacao.currentText()
wi = float(self.lineEdit_Wi.text())
wf = float(self.lineEdit_Wf.text())
def salvar(self):
self.db.inserir_eq()
print("\nCargas Distribuídas")
print(self.db.ord_wdist())
print("\nNós")
print(self.db.ord_nos())
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Carga_D()
app.show()
root.exec_()
import numpy as np
import math as m
from Dicionarios import *
class Calculos(object):
def __init__(self):
135
self.n = self.db.n()
#print("\n",self.db.ord_nos())
#print("\n", self.db.ord_elem())
return T
self.xi = self.Elem[elem]["noi"]["x"]
self.yi = self.Elem[elem]["noi"]["y"]
self.xf = self.Elem[elem]["nof"]["x"]
self.yf = self.Elem[elem]["nof"]["y"]
self.L = m.sqrt(m.pow((self.xf-self.xi),2)+m.pow((self.yf-
self.yi),2))
A = (self.Elem[elem]["Prop."]["area"]) * 1e-4
I = (self.Elem[elem]["Prop."]["inercia"]) * 1e-8
E = (self.Elem[elem]["Prop."]["elast."]) * 1e3
a1 = (E*A)/self.L
a2 = (E*I)/m.pow(self.L, 3)
L = self.L
return k_
def k(self,elem):
"Matriz de rigidez [k] do elemento no sistema de coordenadas
global"
T = self.T(elem)
k_ = self.k_(elem)
k = ((T.transpose()).dot(k_)).dot(T)
136
return k
def K(self):
"Matriz de rigidez global da estrutura [K] - Acoplamento dos
elementos do pórtico"
nos = 0
for no in self.Nos:
nos += 1
ordem_K = 3*nos
K = np.zeros((ordem_K,ordem_K))
i_ = self.Elem[elem]["noi"]["id"]
j_ = self.Elem[elem]["nof"]["id"]
k = self.k(self.elem)
i = (i_*3)-3
j = (j_*3)-3
#print("\nElemento:", elem)
#print("i = ", i, "j = ", j)
#print("\nMatriz k Global - Elemento\n", np.around(k,
decimals=1))
#print('\nMatriz K Global - Estrutura\n', np.around(K,
decimals=1))
return K
def Ko(self):
'''Aplicação das condições de contorno na Matriz de Rigidez Global
para
zerar as linhas e colunas dos vínculos (u, v, t) restringidos por
apoios'''
Ko = self.K()
for no in self.Nos:
u = self.Nos[no]["Restr."]["u"]
v = self.Nos[no]["Restr."]["v"]
t = self.Nos[no]["Restr."]["t"]
id_no = no
137
if u == 1:
i = j = (id_no*3-3)
Ko[i,: ] = 0
Ko[:, j] = 0
Ko[i, j] = 1
if v == 1:
i = j = (id_no*3-3)+1
Ko[i, :] = 0
Ko[:, j] = 0
Ko[i, j] = 1
if t == 1:
i = j = (id_no*3-3)+2
Ko[i, :] = 0
Ko[:, j] = 0
Ko[i, j] = 1
return Ko
def Q_nodal(self):
"Vetor de cargas nodais equivalentes {Q} no sistema de coordenadas
global"
nos = 0
for no in self.Nos:
nos += 1
self.ordem_Q = 3*nos
Q = np.zeros((self.ordem_Q, 1))
for no in self.Nos:
id_no = no
fx = self.Nos[id_no]["Q_nodal"]["fx"]+self.Nos[id_no]["Q_eq"]
["fx_eq"]
fy = self.Nos[id_no]["Q_nodal"]["fy"]+self.Nos[id_no]["Q_eq"]
["fy_eq"]
mz = self.Nos[id_no]["Q_nodal"]["mz"]+self.Nos[id_no]["Q_eq"]
["mz_eq"]
if fx != 0:
i = (id_no*3-3)
Q[i, 0] = fx
if fy != 0:
i = (id_no*3-3)+1
Q[i, 0] = fy
if mz != 0:
i = (id_no*3-3)+2
Q[i, 0] = mz
print("\nMatriz Q\n", Q)
return Q
def deslocamentos(self):
"Vetor dos deslocamentos nodais {D} no sistema de coordenadas
global"
K = self.Ko()
Q = self.Q_nodal()
138
D = np.linalg.solve(K, Q)
for no in self.Nos:
id_no = no
i = (id_no*3-3)
if self.Nos[id_no]["Restr."]["u"] == 1:
D[i,0]=0
#dx = np.around(D[i, 0], decimals=9)
dx = D[i,0]
i = (id_no*3-3)+1
if self.Nos[id_no]["Restr."]["v"] == 1:
D[i,0] = 0
#dy = np.around(D[i, 0], decimals=9)
dy = D[i,0]
i = (id_no*3-3)+2
if self.Nos[id_no]["Restr."]["t"] == 1:
D[i, 0] = 0
#rz = np.around(D[i, 0], decimals=9)
rz = D[i,0]
return D
def reacoes(self):
"Vetor das reações nos apoios {F}"
K = self.K()
D = self.deslocamentos()
F = K.dot(D)
for no in self.Nos:
id_no = no
fx_eq = self.Nos[id_no]["Q_nodal"]["fx"] + self.Nos[id_no]
["Q_eq"]["fx_eq"]
fy_eq = self.Nos[id_no]["Q_nodal"]["fy"] + self.Nos[id_no]
["Q_eq"]["fy_eq"]
fz_eq = self.Nos[id_no]["Q_nodal"]["mz"] + self.Nos[id_no]
["Q_eq"]["mz_eq"]
i = (id_no*3-3)
F[i,0] = F[i,0]-fx_eq
fx = F[i,0]
#fx = np.around(F[i, 0], decimals=2)
i = (id_no*3-3)+1
F[i,0] = F[i,0]-fy_eq
fy = F[i,0]
#fy = np.around(F[i, 0], decimals=2)
i = (id_no*3-3)+2
F[i,0] = F[i,0]-fz_eq
mz = F[i,0]
#mz = np.around(F[i, 0], decimals=2)
#fx = fx - fx_eq
if abs(fx) < 1e-10:
fx = 0
#fy = fy - fy_eq
139
if abs(fy) < 1e-10:
fy = 0
if mz != 0:
mz = mz - fz_eq
no_des = self.db.conv_real(id_no)
if no_des % 1 == 0:
self.db.reacoes_des(no_des, fx, fy, mz)
#print("no:",id_no,"fx:",fx,"fy:",fy,"mz:",mz)
def esforcos(self):
"Função para cálculo dos esforços internos"
self.xi = self.Elem[id_elem]["noi"]["x"]
self.yi = self.Elem[id_elem]["noi"]["y"]
self.xf = self.Elem[id_elem]["nof"]["x"]
self.yf = self.Elem[id_elem]["nof"]["y"]
L = m.sqrt(m.pow((self.xf - self.xi), 2) + m.pow((self.yf -
self.yi), 2))
#print("\nElemento:", elem)
#print("Matriz T:\n", T)
A = (self.Elem[elem]["Prop."]["area"]) * 1e-4
I = (self.Elem[elem]["Prop."]["inercia"]) * 1e-8
E = (self.Elem[elem]["Prop."]["elast."]) * 1e3
N = ((A*E)/L)*np.array([[1, -1],
[-1, 1]])
noi = self.Elem[id_elem]["noi"]["id"]
nof = self.Elem[id_elem]["nof"]["id"]
d[0,0] = self.Nos[noi]["Desloc."]["dx"]
140
d[1,0] = self.Nos[noi]["Desloc."]["dy"]
d[2,0] = self.Nos[noi]["Desloc."]["rz"]
d[3,0] = self.Nos[nof]["Desloc."]["dx"]
d[4,0] = self.Nos[nof]["Desloc."]["dy"]
d[5,0] = self.Nos[nof]["Desloc."]["rz"]
d_N = np.array([[d_[0,0],d_[3,0]]]).reshape(2,1)
d_V_M =
np.array([[d_[1,0],d_[2,0],d_[4,0],d_[5,0]]]).reshape(4,1)
Normal = N.dot(d_N)
Fletor = V_M.dot(d_V_M)
if Normal[1, 0] > 0:
tipo = "Tração"
else:
tipo = "Compressão"
self.db.esforcos(noi,Normal[0,0],Fletor[0,0],Fletor[1,0])
self.db.esforcos(nof,Normal[1,0],Fletor[2,0],Fletor[3,0])
self.db.esforcos_elem(elem, Normal[0,0], Fletor[0,0],
Fletor[1,0], Normal[1,0], Fletor[2,0], Fletor[3,0])
class J_Res_Esforcos(QDialog):
def __init__(self, parent=None):
super(J_Res_Esforcos, self).__init__(parent)
self.db = Dados()
self.Elem = self.db.arq_elem()
self.Nos = self.db.arq_nos()
self.n = self.db.n()
141
self.setWindowTitle("ESFORÇOS INTERNOS ( Normal / Cortante / Fletor
)")
self.resize(450, 555)
self.setMinimumSize(QSize(450, 590))
self.setMaximumSize(QSize(450, 590))
self.tableWidget = QTableWidget(self)
self.tableWidget.setGeometry(QRect(20, 10, 410, 487))
font = QFont()
font.setPointSize(10)
self.tableWidget.setFont(font)
#self.tableWidget.setRowCount(20)
self.tableWidget.setColumnCount(6)
item = QTableWidgetItem()
item.setText("Elemento")
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QTableWidgetItem()
item.setText("x (m)")
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QTableWidgetItem()
item.setText("y (m)")
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QTableWidgetItem()
item.setText("N (KN)")
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QTableWidgetItem()
item.setText("V (KN)")
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QTableWidgetItem()
item.setText("M (KN.m)")
self.tableWidget.setHorizontalHeaderItem(5, item)
for i in range(0):
self.tableWidget.insertRow(i)
self.tableWidget.horizontalHeader().setVisible(True)
self.tableWidget.horizontalHeader().setDefaultSectionSize(65)
self.tableWidget.verticalHeader().setVisible(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(20)
142
font.setPointSize(9)
self.label_Instrucao.setFont(font)
self.horizontalSlider = QSlider(self)
self.horizontalSlider.setGeometry(QRect(145, 518.5, 230, 20))
self.horizontalSlider.setMinimumSize(QSize(230, 20))
self.horizontalSlider.setMaximumSize(QSize(230, 20))
self.horizontalSlider.setMaximum(500)
self.horizontalSlider.setSingleStep(1)
self.horizontalSlider.setPageStep(10)
self.horizontalSlider.setProperty("value", 1)
self.horizontalSlider.setSliderPosition(1)
self.horizontalSlider.setOrientation(Qt.Horizontal)
self.label_Fator = QLabel(self)
self.label_Fator.setGeometry(QRect(390, 516, 40, 24))
self.label_Fator.setMinimumSize(QSize(40, 24))
self.label_Fator.setMaximumSize(QSize(40, 24))
self.label_Fator.setFrameShape(QFrame.Box)
self.label_Fator.setFrameShadow(QFrame.Sunken)
self.label_Fator.setAlignment(Qt.AlignCenter)
self.horizontalSlider.connect(self.horizontalSlider,
SIGNAL(("valueChanged(int)")), self.label_Fator.setNum)
self.label_Fator.setText("1")
self.inserir_resultados()
def inserir_resultados(self):
"Função para extrair resultados do dicionário Elementos e inserir
na tabela"
# __Listas de apoio para inserção de dados
L_elem = []
coord_x = []
coord_y = []
L_N = []
L_V = []
L_M = []
Elem = list(self.Elem.keys())
Elem.sort()
143
for elem in Elem:
id_elem = int(elem)
elem_usuario = int(self.db.conv_real(elem))
xi = self.Elem[id_elem]["noi"]["x"]
yi = self.Elem[id_elem]["noi"]["y"]
xf = self.Elem[id_elem]["nof"]["x"]
yf = self.Elem[id_elem]["nof"]["y"]
L = m.sqrt(m.pow((xf - xi), 2) + m.pow((yf - yi), 2))
Lamb_x = ((xf - xi) / L)
Lamb_y = ((yf - yi) / L)
if Lamb_x > 0:
x = xi
y = yi
N = self.Elem[id_elem]["noi"]["Esforcos"]["N"]
V = self.Elem[id_elem]["noi"]["Esforcos"]["V"]
M = self.Elem[id_elem]["noi"]["Esforcos"]["M"]
if abs(M) < 1e-10:
M = 0
if id_elem % self.n == 0:
x = xf
y = yf
N = - self.Elem[id_elem]["nof"]["Esforcos"]["N"]
V = - self.Elem[id_elem]["nof"]["Esforcos"]["V"]
M = - self.Elem[id_elem]["nof"]["Esforcos"]["M"]
if abs(M) < 1e-10:
M = 0
144
elif Lamb_x == 0 and Lamb_y < 0:
x = xi
y = yi
N = self.Elem[id_elem]["noi"]["Esforcos"]["N"]
V = self.Elem[id_elem]["noi"]["Esforcos"]["V"]
M = - self.Elem[id_elem]["noi"]["Esforcos"]["M"]
if abs(M) < 1e-10:
M = 0
if id_elem % self.n == 0:
x = xf
y = yf
N = - self.Elem[id_elem]["nof"]["Esforcos"]["N"]
V = - self.Elem[id_elem]["nof"]["Esforcos"]["V"]
M = self.Elem[id_elem]["nof"]["Esforcos"]["M"]
if abs(M) < 1e-10:
M = 0
L_elem.append(elem_usuario)
coord_x.append(x)
coord_y.append(y)
L_N.append(N)
L_V.append(V)
L_M.append(M)
for i, j in enumerate(L_elem):
# __Laço para inserir os dados na tabela
self.tableWidget.insertRow(i)
item = QTableWidgetItem()
item.setText(str(L_elem[i]))
self.tableWidget.setItem(i, 0, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 0 da tabela
item = QTableWidgetItem()
item.setText(str(coord_x[i]))
self.tableWidget.setItem(i, 1, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 1 da tabela
item = QTableWidgetItem()
item.setText(str(coord_y[i]))
self.tableWidget.setItem(i, 2, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 2 da tabela
item = QTableWidgetItem()
item.setText(str("%.2f" % (L_N[i])))
self.tableWidget.setItem(i, 3, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 3 da tabela
item = QTableWidgetItem()
145
item.setText(str("%.2f" % (L_V[i])))
self.tableWidget.setItem(i, 4, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 4 da tabela
item = QTableWidgetItem()
item.setText(str("%.2f" % (L_M[i])))
self.tableWidget.setItem(i, 5, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 5 da tabela
def des_normal(self):
"Funçao para desenhar a estrutura deslocada"
fator = int(self.label_Fator.text())
Nos = list(self.Nos.keys())
Nos.sort()
for no in Nos:
#__Desenha os NÓS da estrutura
x = self.Nos[no]["x"]
y = self.Nos[no]["y"]
plt.scatter(x, y, color="red", s=1)
Elem = list(self.Elem.keys())
Elem.sort()
for elem in Elem:
#__Desenha os ELEMENTOS da estrutura
xi = self.Elem[elem]["noi"]["x"]
xf = self.Elem[elem]["nof"]["x"]
yi = self.Elem[elem]["noi"]["y"]
yf = self.Elem[elem]["nof"]["y"]
plt.plot([xi, xf], [yi, yf], color="black", linewidth=1)
Ni = self.Elem[elem]["noi"]["Esforcos"]["N"] / fator
Nf = - self.Elem[elem]["nof"]["Esforcos"]["N"] / fator
print(Ni*fator,Nf*fator)
delta_xi = 0
delta_xf = 0
delta_yi = 0
delta_yf = 0
146
delta_xf = - Nf
Nx_i = xi + delta_xi
Nx_f = xf + delta_xf
Ny_i = yi + delta_yi
Ny_f = yf + delta_yf
"Plotando os diagramas"
if Lamb_x == 0:
plt.plot([Nx_i, Nx_f], [Ny_i, Ny_f], color="blue",
linewidth=0.7)
plt.plot([xi, Nx_i], [yi, Ny_i], color="blue",
linewidth=0.7)
plt.plot([xf, Nx_f], [yf, Ny_f], color="blue",
linewidth=0.7)
elif Lamb_y == 0:
plt.plot([Nx_i, Nx_f], [Ny_i, Ny_f], color="red",
linewidth=0.7)
plt.plot([xi, Nx_i], [yi, Ny_i], color="red",
linewidth=0.7)
plt.plot([xf, Nx_f], [yf, Ny_f], color="red",
linewidth=0.7)
elif Lamb_x != 0 and Lamb_y != 0:
plt.plot([Nx_i, Nx_f], [Ny_i, Ny_f], color="green",
linewidth=0.7)
plt.plot([xi, Nx_i], [yi, Ny_i], color="green",
linewidth=0.7)
plt.plot([xf, Nx_f], [yf, Ny_f], color="green",
linewidth=0.7)
147
plt.text(x,y,"%.2f" %(N), rotation="0",
horizontalalignment="left", verticalalignment="center")
else:
xi = Nx_i
yi = Ny_i
Ni = Ni * fator
plt.text(xi, yi, "%.2f" % (Ni), rotation="0",
horizontalalignment="left",
verticalalignment="center")
xf = Nx_f
yf = Ny_f
Nf = Nf * fator
plt.text(xf, yf, "%.2f" % (Nf), rotation="0",
horizontalalignment="left", verticalalignment="center")
def des_cortante(self):
"Funçao para desenhar a estrutura deslocada"
fator = int(self.label_Fator.text())
Nos = list(self.Nos.keys())
Nos.sort()
for no in Nos:
#__Desenha os NÓS da estrutura
x = self.Nos[no]["x"]
y = self.Nos[no]["y"]
plt.scatter(x, y, color="red", s=1)
Elem = list(self.Elem.keys())
Elem.sort()
for elem in Elem:
#__Desenha os ELEMENTOS da estrutura
xi = self.Elem[elem]["noi"]["x"]
xf = self.Elem[elem]["nof"]["x"]
yi = self.Elem[elem]["noi"]["y"]
yf = self.Elem[elem]["nof"]["y"]
plt.plot([xi, xf], [yi, yf], color="black", linewidth=1)
Vi = self.Elem[elem]["noi"]["Esforcos"]["V"] / fator
Vf = - self.Elem[elem]["nof"]["Esforcos"]["V"] / fator
delta_xi = 0
delta_xf = 0
delta_yi = 0
delta_yf = 0
148
#__Para elemento na posição vertical
if Lamb_x == 0:
if Vi < 0:
delta_xi = - Vi
elif Vi > 0:
delta_xi = - Vi
if Vf < 0:
delta_xf = - Vf
elif Vf > 0:
delta_xf = - Vf
Vx_i = xi + delta_xi
Vx_f = xf + delta_xf
Vy_i = yi + delta_yi
Vy_f = yf + delta_yf
"Plotando os diagramas"
if Lamb_x == 0:
plt.plot([Vx_i, Vx_f], [Vy_i, Vy_f], color="blue",
linewidth=0.7)
plt.plot([xi, Vx_i], [yi, Vy_i], color="blue",
linewidth=0.7)
plt.plot([xf, Vx_f], [yf, Vy_f], color="blue",
linewidth=0.7)
elif Lamb_y == 0:
plt.plot([Vx_i, Vx_f], [Vy_i, Vy_f], color="red",
linewidth=0.7)
plt.plot([xi, Vx_i], [yi, Vy_i], color="red",
linewidth=0.7)
plt.plot([xf, Vx_f], [yf, Vy_f], color="red",
linewidth=0.7)
elif Lamb_x != 0 and Lamb_y != 0:
plt.plot([Vx_i, Vx_f], [Vy_i, Vy_f], color="green",
linewidth=0.7)
149
plt.plot([xi, Vx_i], [yi, Vy_i], color="green",
linewidth=0.7)
plt.plot([xf, Vx_f], [yf, Vy_f], color="green",
linewidth=0.7)
def des_fletor(self):
"Funçao para desenhar a estrutura deslocada"
fator = int(self.label_Fator.text())
Nos = list(self.Nos.keys())
Nos.sort()
for no in Nos:
#__Desenha os NÓS da estrutura
x = self.Nos[no]["x"]
y = self.Nos[no]["y"]
plt.scatter(x, y, color="red", s=1)
Elem = list(self.Elem.keys())
Elem.sort()
for elem in Elem:
#__Desenha os ELEMENTOS da estrutura
xi = self.Elem[elem]["noi"]["x"]
xf = self.Elem[elem]["nof"]["x"]
yi = self.Elem[elem]["noi"]["y"]
yf = self.Elem[elem]["nof"]["y"]
plt.plot([xi, xf], [yi, yf], color="black", linewidth=1)
150
Mi = self.Elem[elem]["noi"]["Esforcos"]["M"] / fator
Mf = - self.Elem[elem]["nof"]["Esforcos"]["M"] / fator
#print(Mi,Mf)
delta_xi = 0
delta_xf = 0
delta_yi = 0
delta_yf = 0
Mx_i = xi + delta_xi
Mx_f = xf + delta_xf
My_i = yi + delta_yi
My_f = yf + delta_yf
"Plotando os diagramas"
if Lamb_x == 0:
plt.plot([Mx_i, Mx_f], [My_i, My_f], color="blue",
linewidth=0.7)
plt.plot([xi, Mx_i], [yi, My_i], color="blue",
linewidth=0.7)
151
plt.plot([xf, Mx_f], [yf, My_f], color="blue",
linewidth=0.7)
elif Lamb_y == 0:
plt.plot([Mx_i, Mx_f], [My_i, My_f], color="red",
linewidth=0.7)
plt.plot([xi, Mx_i], [yi, My_i], color="red",
linewidth=0.7)
plt.plot([xf, Mx_f], [yf, My_f], color="red",
linewidth=0.7)
elif Lamb_x != 0 and Lamb_y != 0:
plt.plot([Mx_i, Mx_f], [My_i, My_f], color="green",
linewidth=0.7)
plt.plot([xi, Mx_i], [yi, My_i], color="green",
linewidth=0.7)
plt.plot([xf, Mx_f], [yf, My_f], color="green",
linewidth=0.7)
def fechar(self):
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Res_Esforcos()
152
app.show()
root.exec_()
class J_Res_Desloc(QDialog):
def __init__(self, parent=None):
super(J_Res_Desloc, self).__init__(parent)
self.db = Dados()
self.Nos = self.db.arq_nos()
self.Elem = self.db.arq_elem()
self.n = self.db.n()
self.setWindowTitle("DESLOCAMENTOS DA ESTRUTURA")
self.resize(600, 555)
self.setMinimumSize(QSize(600, 555))
self.setMaximumSize(QSize(600, 555))
self.tableWidget = QTableWidget(self)
self.tableWidget.setGeometry(QRect(20, 10, 560, 487))
font = QFont()
font.setPointSize(10)
self.tableWidget.setFont(font)
self.tableWidget.setColumnCount(6)
item = QTableWidgetItem()
item.setText("Elemento")
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QTableWidgetItem()
item.setText("x (m)")
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QTableWidgetItem()
item.setText("y (m)")
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QTableWidgetItem()
item.setText("dx (m)")
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QTableWidgetItem()
item.setText("dy (m)")
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QTableWidgetItem()
item.setText("rot. z (rad)")
self.tableWidget.setHorizontalHeaderItem(5, item)
153
for i in range(0):
self.tableWidget.insertRow(i)
self.tableWidget.horizontalHeader().setDefaultSectionSize(90)
self.tableWidget.verticalHeader().setVisible(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(20)
self.horizontalSlider = QSlider(self)
self.horizontalSlider.setGeometry(QRect(130, 518.5, 200, 20))
self.horizontalSlider.setMinimumSize(QSize(200, 20))
self.horizontalSlider.setMaximumSize(QSize(200, 20))
self.horizontalSlider.setMaximum(300)
self.horizontalSlider.setSingleStep(1)
self.horizontalSlider.setPageStep(10)
self.horizontalSlider.setProperty("value", 1)
self.horizontalSlider.setSliderPosition(1)
self.horizontalSlider.setOrientation(Qt.Horizontal)
self.label_Fator = QLabel(self)
self.label_Fator.setGeometry(QRect(340, 516, 40, 24))
self.label_Fator.setMinimumSize(QSize(40, 24))
self.label_Fator.setMaximumSize(QSize(40, 24))
self.label_Fator.setFrameShape(QFrame.Box)
self.label_Fator.setFrameShadow(QFrame.Sunken)
self.label_Fator.setAlignment(Qt.AlignCenter)
self.horizontalSlider.connect(self.horizontalSlider,
SIGNAL(("valueChanged(int)")), self.label_Fator.setNum)
self.label_Fator.setText("1")
self.inserir_resultados()
def inserir_resultados(self):
"Função para extrair resultados do dicionário Nós e inserir na
tabela"
#__Listas de apoio para inserção de dados
L_elem = []
coord_x = []
coord_y = []
154
L_dx = []
L_dy = []
L_rz = []
Elem = list(self.Elem.keys())
Elem.sort()
for elem in Elem:
id_elem = int(elem)
elem_usuario = int(self.db.conv_real(elem))
noi = self.Elem[id_elem]["noi"]["id"]
nof = self.Elem[id_elem]["nof"]["id"]
x = self.Nos[noi]["x"]
y = self.Nos[noi]["y"]
dx = self.Nos[noi]["Desloc."]["dx"]
dy = self.Nos[noi]["Desloc."]["dy"]
rz = self.Nos[noi]["Desloc."]["rz"]
L_elem.append(elem_usuario)
coord_x.append(x)
coord_y.append(y)
L_dx.append(dx)
L_dy.append(dy)
L_rz.append(rz)
if id_elem % self.n == 0:
x = self.Nos[nof]["x"]
y = self.Nos[nof]["y"]
dx = self.Nos[nof]["Desloc."]["dx"]
dy = self.Nos[nof]["Desloc."]["dy"]
rz = self.Nos[nof]["Desloc."]["rz"]
L_elem.append(elem_usuario)
coord_x.append(x)
coord_y.append(y)
L_dx.append(dx)
L_dy.append(dy)
L_rz.append(rz)
item = QTableWidgetItem()
item.setText(str(coord_x[i]))
self.tableWidget.setItem(i, 1, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 1 da tabela
item = QTableWidgetItem()
item.setText(str(coord_y[i]))
self.tableWidget.setItem(i, 2, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
155
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 2 da tabela
item = QTableWidgetItem()
item.setText(str("%.5e" %(L_dx[i])))
self.tableWidget.setItem(i, 3, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 3 da tabela
item = QTableWidgetItem()
item.setText(str("%.5e" %(L_dy[i])))
self.tableWidget.setItem(i, 4, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 4 da tabela
item = QTableWidgetItem()
item.setText(str("%.5e" %(L_rz[i])))
self.tableWidget.setItem(i, 5, item)
item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter |
Qt.AlignCenter)
item.setFlags(Qt.ItemIsEnabled) # __Para desabilitar a ediçao
dos campos da coluna 5 da tabela
def des_deslocamentos(self):
"Funçao para desenhar a estrutura deslocada"
fator_desloc = int(self.label_Fator.text())
Nos = list(self.Nos.keys())
Nos.sort()
for no in Nos:
#__Desenha os NÓS da estrutura
x = self.Nos[no]["x"]
y = self.Nos[no]["y"]
plt.scatter(x, y, color="red", s=1)
Elem = list(self.Elem.keys())
Elem.sort()
for elem in Elem:
#__Desenha os ELEMENTOS da estrutura
noi = self.Elem[elem]["noi"]["id"]
nof = self.Elem[elem]["nof"]["id"]
xi = self.Nos[noi]["x"]
xf = self.Nos[nof]["x"]
yi = self.Nos[noi]["y"]
yf = self.Nos[nof]["y"]
plt.plot([xi, xf], [yi, yf], color="black", linewidth=1)
156
#no_usuario = self.db.conv_real(no)
#if no_usuario % 1 == 0:
# x = self.Nos[no]["x"]
# y = self.Nos[no]["y"]
# plt.scatter(x, y, color="red", s=6)
plt.grid()
plt.show()
def fechar(self):
self.close()
self.destroy()
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Res_Desloc()
app.show()
root.exec_()
import math
import numpy as np
class J_Dimensionamento(QDialog):
def __init__(self, parent=None):
super(J_Dimensionamento, self).__init__(parent)
self.setWindowTitle("DIMENSIONAMENTO")
self.resize(1170, 780)
self.setMinimumSize(QSize(1170, 780))
self.setMaximumSize(QSize(1170, 780))
icon = QIcon()
icon.addPixmap(QPixmap("examples/painting/basicdrawing/images/qt-
logo.png"), QIcon.Normal, QIcon.On)
self.setWindowIcon(icon)
157
self.label_2 = QLabel("Coeficientes de ponderação das resistências
- ELU:", self)
self.label_2.setGeometry(QRect(30, 60, 250, 20))
self.label_2.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_3 = QLabel("Classe de Agressividade Ambiental (CAA):",
self)
self.label_3.setGeometry(QRect(30, 95, 250, 20))
self.label_3.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_4 = QLabel("Dimensão do agregado - DMC (mm):", self)
self.label_4.setGeometry(QRect(30, 130, 250, 20))
self.label_4.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_5 = QLabel("Tipo do agregado graúdo:", self)
self.label_5.setGeometry(QRect(30, 165, 250, 20))
self.label_5.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_6 = QLabel("Classe do Aço:", self)
self.label_6.setGeometry(QRect(30, 200, 250, 20))
self.label_6.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_7 = QLabel("Resistência do concreto - Fck (MPa):", self)
self.label_7.setGeometry(QRect(30, 235, 250, 20))
self.label_7.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_8 = QLabel("Propriedades da seção transversal (m):",
self)
self.label_8.setGeometry(QRect(40, 270, 225, 20))
self.label_8.setFont(font)
self.label_9 = QLabel("Geometria da seção transversall:", self)
self.label_9.setGeometry(QRect(40, 300, 211, 20))
font = QFont()
font.setBold(True)
font.setWeight(50)
self.label_9.setFont(font)
self.label_10 = QLabel("h (cm):", self)
self.label_10.setGeometry(QRect(50, 360, 55, 20))
self.label_10.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_11 = QLabel("bw (cm):", self)
self.label_11.setGeometry(QRect(50, 390, 55, 20))
self.label_11.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_12 = QLabel("cnom (cm):", self)
self.label_12.setGeometry(QRect(50, 420, 55, 20))
self.label_12.setAlignment(Qt.AlignRight | Qt.AlignTrailing |
Qt.AlignVCenter)
self.label_13 = QLabel("Momento Fletor Solicitante - Msd (KN.m):",
self)
self.label_13.setGeometry(QRect(40, 460, 231, 20))
font = QFont()
font.setBold(True)
font.setWeight(75)
self.label_13.setFont(font)
self.label_Fck = QLabel(self)
self.label_Fck.setGeometry(QRect(425, 235, 150, 20))
self.label_Cnom = QLabel(self)
self.label_Cnom.setGeometry(QRect(180, 420, 150, 20))
158
self.line_h = QLineEdit(self)
self.line_h.setGeometry(QRect(110, 360, 60, 20))
self.line_h.setAlignment(Qt.AlignCenter)
self.line_bw = QLineEdit(self)
self.line_bw.setGeometry(QRect(110, 390, 60, 20))
self.line_bw.setAlignment(Qt.AlignCenter)
self.line_Cnom = QLineEdit(self)
self.line_Cnom.setGeometry(QRect(110, 420, 60, 20))
self.line_Cnom.setAlignment(Qt.AlignCenter)
self.line_Msd = QLineEdit(self)
self.line_Msd.setGeometry(QRect(280, 460, 60, 20))
self.line_Msd.setAlignment(Qt.AlignCenter)
self.combobox_Combinacoes = QComboBox(self)
self.combobox_Combinacoes.setGeometry(QRect(290, 60, 125, 22))
self.combobox_Combinacoes.addItem("")
self.combobox_Combinacoes.addItem("")
self.combobox_Combinacoes.addItem("")
self.combobox_Combinacoes.addItem("")
self.combobox_Combinacoes.setItemText(0, "Selecione...")
self.combobox_Combinacoes.setItemText(1, "Normal")
self.combobox_Combinacoes.setItemText(2, "Especiais/Construção")
self.combobox_Combinacoes.setItemText(3, "Excepcionais")
self.comboBox_CAA = QComboBox(self)
self.comboBox_CAA.setEnabled(True)
self.comboBox_CAA.setGeometry(QRect(290, 95, 125, 22))
self.comboBox_CAA.setMouseTracking(False)
self.comboBox_CAA.setLayoutDirection(Qt.LeftToRight)
self.comboBox_CAA.setAutoFillBackground(False)
self.comboBox_CAA.addItem("")
self.comboBox_CAA.addItem("")
self.comboBox_CAA.addItem("")
self.comboBox_CAA.addItem("")
self.comboBox_CAA.addItem("")
self.comboBox_CAA.setItemText(0, "Selecione...")
self.comboBox_CAA.setItemText(1, "I - Fraca")
self.comboBox_CAA.setItemText(2, "II - Moderada")
self.comboBox_CAA.setItemText(3, "III - Forte")
self.comboBox_CAA.setItemText(4, "IV - Muito Forte")
self.combobox_DMC = QComboBox(self)
self.combobox_DMC.setGeometry(QRect(290, 130, 125, 22))
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.addItem("")
self.combobox_DMC.setItemText(0, "Selecione...")
self.combobox_DMC.setItemText(1, "6.3")
self.combobox_DMC.setItemText(2, "9.5")
self.combobox_DMC.setItemText(3, "12.5")
self.combobox_DMC.setItemText(4, "19")
self.combobox_DMC.setItemText(5, "25")
self.combobox_DMC.setItemText(6, "32")
self.combobox_DMC.setItemText(7, "35")
self.combobox_DMC.setItemText(8, "50")
159
self.combobox_Agregado = QComboBox(self)
self.combobox_Agregado.setGeometry(QRect(290, 165, 125, 22))
self.combobox_Agregado.addItem("")
self.combobox_Agregado.addItem("")
self.combobox_Agregado.addItem("")
self.combobox_Agregado.addItem("")
self.combobox_Agregado.addItem("")
self.combobox_Agregado.setItemText(0, "Selecione...")
self.combobox_Agregado.setItemText(1, "Basalto ou Diabásio")
self.combobox_Agregado.setItemText(2, "Granito ou Gnaise")
self.combobox_Agregado.setItemText(3, "Calcário")
self.combobox_Agregado.setItemText(4, "Arenito")
self.combobox_ClasseAco = QComboBox(self)
self.combobox_ClasseAco.setGeometry(QRect(290, 200, 125, 22))
self.combobox_ClasseAco.addItem("")
self.combobox_ClasseAco.addItem("")
self.combobox_ClasseAco.addItem("")
self.combobox_ClasseAco.setItemText(0, "Selecione...")
self.combobox_ClasseAco.setItemText(1, "CA-50")
self.combobox_ClasseAco.setItemText(2, "CA-60")
self.combobox_Fck = QComboBox(self)
self.combobox_Fck.setGeometry(QRect(290, 235, 125, 20))
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.addItem("")
self.combobox_Fck.setItemText(0, "Selecione...")
self.combobox_Fck.setItemText(1, "20")
self.combobox_Fck.setItemText(2, "25")
self.combobox_Fck.setItemText(3, "30")
self.combobox_Fck.setItemText(4, "35")
self.combobox_Fck.setItemText(5, "40")
self.combobox_Fck.setItemText(6, "45")
self.combobox_Fck.setItemText(7, "50")
self.combobox_Fck.setItemText(8, "55")
self.combobox_Fck.setItemText(9, "60")
self.combobox_Fck.setItemText(10, "65")
self.combobox_Fck.setItemText(11, "70")
self.combobox_Fck.setItemText(12, "75")
self.combobox_Fck.setItemText(13, "80")
self.combobox_Fck.setItemText(14, "85")
self.combobox_Fck.setItemText(15, "90")
160
self.radioButton_1.setVisible(False)
self.radioButton_2 = QRadioButton("Seção T", self)
self.radioButton_2.setGeometry(QRect(130, 330, 75, 20))
self.radioButton_2.setFocusPolicy(Qt.NoFocus)
self.radioButton_2.setVisible(False)
self.radioButton_3 = QRadioButton("Seção I-1", self)
self.radioButton_3.setGeometry(QRect(210, 330, 75, 20))
self.radioButton_3.setFocusPolicy(Qt.NoFocus)
self.radioButton_3.setVisible(False)
self.radioButton_4 = QRadioButton("Seção I_2", self)
self.radioButton_4.setGeometry(QRect(300, 330, 75, 20))
self.radioButton_4.setFocusPolicy(Qt.NoFocus)
self.radioButton_4.setVisible(False)
self.bt_Dimensionar = QPushButton("Dimensionar",self)
self.bt_Dimensionar.setGeometry(QRect(40, 510, 130, 25))
self.bt_Dimensionar.setShortcut("Enter")
self.bt_Dimensionar.setFocusPolicy(Qt.NoFocus)
self.bt_Limpar = QPushButton("Limpar",self)
self.bt_Limpar.setGeometry(QRect(190, 510, 80, 25))
self.bt_Limpar.setFocusPolicy(Qt.NoFocus)
self.list_Dimensionamento = QListWidget(self)
self.list_Dimensionamento.setEnabled(True)
self.list_Dimensionamento.setGeometry(QRect(640, 20, 511, 741))
font = QFont()
font.setPointSize(10)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
font.setKerning(True)
font.setStyleStrategy(QFont.PreferAntialias)
self.list_Dimensionamento.setFont(font)
self.list_Dimensionamento.setMouseTracking(False)
self.list_Dimensionamento.setFocusPolicy(Qt.NoFocus)
self.list_Dimensionamento.setAutoFillBackground(False)
self.list_Dimensionamento.setFrameShape(QFrame.NoFrame)
self.list_Dimensionamento.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.list_Dimensionamento.setProperty("showDropIndicator", False)
self.list_Dimensionamento.setSelectionMode(QAbstractItemView.NoSelection)
self.list_Dimensionamento.setViewMode(QListView.ListMode)
self.combobox_Combinacoes.setFocus(True)
self.setTabOrder(self.combobox_Combinacoes, self.comboBox_CAA)
self.setTabOrder(self.comboBox_CAA, self.combobox_DMC)
self.setTabOrder(self.combobox_DMC, self.combobox_Agregado)
self.setTabOrder(self.combobox_Agregado, self.combobox_ClasseAco)
self.setTabOrder(self.combobox_ClasseAco, self.combobox_Fck)
self.setTabOrder(self.combobox_Fck, self.line_h)
self.setTabOrder(self.line_h, self.line_bw)
self.setTabOrder(self.line_bw, self.line_Cnom)
self.setTabOrder(self.line_Cnom, self.line_Msd)
self.setTabOrder(self.line_Msd, self.bt_Dimensionar)
self.setTabOrder(self.bt_Dimensionar, self.bt_Limpar)
self.list_Dimensionamento.setSortingEnabled(False)
# Conectando Sinais
161
self.comboBox_CAA.currentIndexChanged.connect(self.FckNorma)
#self.combobox_Agregado.currentIndexChanged.connect(self.Agregado)
self.bt_Dimensionar.clicked.connect(self.Limpar)
self.bt_Limpar.clicked.connect(self.Limpar)
self.bt_Dimensionar.clicked.connect(self.Dimensionar)
#self.combobox_DMC.currentIndexChanged.connect(self.DMC)
###########################################################################
#############################################
#######################################_____FUNÇÕES VINCULADAS AOS
MATERIAIS_____#######################################
###########################################################################
#############################################
###########################################################################
#############################################
##################################_____DIMENSIONAMENTO - ARMADURAS
LONGITUDINAIS_____###################################
###########################################################################
#############################################
def Limpar(self):
self.list_Dimensionamento.clear()
def Dimensionar(self):
#__Unidades utilizadas
#__global CAA #__Classe de Agressividade Ambiental
#__global fck #__(MPa)
#__global p_espec_conc #__(KN/m^3)
#__global agregado
#__global aE #__Parâmetro em função do tipo de agregado
- Influencia no módulo de elasticidade "E"
#__global DMC #__(mm)
#__global aco
#__global fyk #__(MPa)
#__global comb_ELU
#__global h #__(cm)
#__global bw #__(cm)
#__global cnom #__(cm)
162
CAA = self.comboBox_CAA.currentText()
fck = float(self.combobox_Fck.currentText())
p_espec_conc = 2500 #__(KN/m^3) - Peso específico do concreto
cnom = float(self.line_Cnom.text())
agregado = self.combobox_Agregado.currentText()
DMC = float(self.combobox_DMC.currentText())
aco = self.combobox_ClasseAco.currentText()
if self.combobox_ClasseAco.currentText() == "CA-50":
fyk = 500
if self.combobox_ClasseAco.currentText() == "CA-60":
fyk = 600
comb_ELU = self.combobox_Combinacoes.currentText()
h = float(self.line_h.text())
bw = float(self.line_bw.text())
if self.combobox_Combinacoes.currentText() == "Normal":
yc = 1.4
ys = 1.15
if self.combobox_Combinacoes.currentText() ==
"Especiais/Construção":
yc = 1.2
ys = 1.15
if self.combobox_Combinacoes.currentText() == "Excepcionais":
yc = 1.2
ys = 1.00
163
#__fcd #__(MPa) - Resistência a compressão do concreto
- Valor de projeto
#__sigma_c #__(MPa) - Tensão de compressão no concreto
#__Es #__(MPa) - Módulo de Elasticidade do aço
#__fyd #__(MPa) - Resistência à tração do aço - Valor
de Prajeto
ai = 0.8+0.2*(fck/80)
Ecs = ai*Eci
fcd = fck/yc
sigma_c = ac*fcd
Es = 210000
fyd = fyk/ys
Ac = bw*h
As_max = 0.04*Ac #__Armadura máxima (cm^2)
As_min = 0.0015*Ac #__Armadura mínima (cm^2)
yCG = h/2
I = (bw*math.pow(h,3))/12
#__Diâmetros iniciais das barras
Fi_ti = 5.0
164
Fi_li = 8.0
d = h-cnom-(Fi_ti*1e-1)-((Fi_li*1e-1)/2)
d_ = cnom+(Fi_ti*1e-1)+(Fi_li*1e-1)/2
# Relação x/d Para domínio 3 - Conforme Item 14.6.4.3 da NBR 6118
y = lamb*x
z = (d-y/2) # Distância entre os pontos de aplicação das cargas Fc
e Fs (Braço de momento na seção)
Msd = float(self.line_Msd.text())
Ac_comp = bw*y
Fc = (sigma_c*1e3)*(Ac_comp*1e-4)
Mrd = Fc*(z*1e-2)
165
Tração")
self.list_Dimensionamento.addItem("As' = %.2f cm²" %(As_2)+" -
Compressão")
self.list_Dimensionamento.addItem("As_tot = %.2f cm²" %(As)+" -
Total")
Diametros_Aco = [0.63,0.8,1.0,1.25,1.6,2.0,2.2,2.5,3.2,4.0]
#__(cm)
#Diametros_Aco = np.array(Diametros_Aco, dtype=float)
Areas_Aco = []
N_Barras_1 = []
N_Barras_2 = []
for i in Diametros_Aco:
A_secao = (math.pi*math.pow(i,2))/4
Areas_Aco.append(A_secao)
Areas_Aco = np.array(Areas_Aco, dtype=float)
166
# Verificação para barras em em quantidade par
#if Msd>Mrd:
D = []
N = []
eh = []
ev = []
Camadas = []
if ((qtotal/2)*Fi_L+(ev_min*((qtotal/2)-1))+cnom+Fi_ti*1e-1) <
0.80*yCG:
while qntd>1:
while eh_barra < eh_min and c<1:
qntd-=1
if qntd<=2:
break
eh_barra = (bw-2*(cnom+(Fi_ti*1e-
1))-(qntd*Fi_L))/(qntd-1)
# PAR___PAR
if qtotal%2==0 and qntd%2==0 and qntd>1:
c+=1
print("Camada %.2f recebe %.2f barras de %.2f mm
com eh = %.2f cm e ev = %.2f cm ---> Reastam %.2f barras" \
% (c, qntd, (Fi_L*1e1), eh_barra, ev_min,
qtotal - qntd))
N.append(qntd)
D.append(Fi_L*1e1)
Camadas.append(c)
soma = soma + qntd
qtotal = qtotal - qntd
qntd = qtotal
if qntd>=2:
qntd=2
else:
qntd=0
eh.append(eh_min)
ev.append(ev_min)
# ÍMPAR___ÍMPAR
elif qtotal%2!=0 and qntd%2!=0 and qntd>1:
c+=1
print("Camada %.2f recebe %.2f barras de %.2f mm
com eh = %.2f cm e ev = %.2f cm ---> Reastam %.2f barras" \
% (c, qntd, (Fi_L * 1e1), eh_barra, ev_min,
qtotal-qntd))
N.append(qntd)
D.append(Fi_L*1e1)
Camadas.append(c)
soma = soma + qntd
qtotal = qtotal - qntd
qntd = qtotal
167
if qntd>=2:
qntd=2
else:
qntd=0
eh.append(eh_min)
ev.append(ev_min)
# ÍMPAR___PAR
elif qtotal%2!=0 and qntd%2==0 and qntd>1:
c+=1
if c==1:
qntd-=1
if qntd==1:
break
print("Camada %.2f recebe %.2f barras de %.2f mm
com eh = %.2f cm e ev = %.2f cm ---> Reastam %.2f barras" \
% (c, qntd, (Fi_L*1e1), eh_barra, ev_min,
qtotal-qntd))
N.append(qntd)
D.append(Fi_L*1e1)
Camadas.append(c)
soma = soma + qntd
qtotal = qtotal - qntd
qntd = qtotal
if qntd>=2:
qntd=2
else:
qntd=0
eh.append(eh_min)
ev.append(ev_min)
# PAR___ÍMPAR
elif qtotal%2==0 and qntd%2!=0 and qntd>1:
c+=1
if c==1:
qntd-=1
print("Camada %.2f recebe %.2f barras de %.2f mm
com eh = %.2f cm e ev = %.2f cm ---> Reastam %.2f barras"\
% (c, qntd, (Fi_L*1e1), eh_barra, ev_min,
qtotal - qntd))
N.append(qntd)
D.append(Fi_L*1e1)
Camadas.append(c)
soma = soma + qntd
qtotal = qtotal - qntd
qntd = qtotal
if qntd>=2:
qntd=2
else:
qntd=0
eh.append(eh_min)
ev.append(ev_min)
#else:
#break
'''if ((valor/2)*Fi_L*1e-1+(ev_min*((valor/2)-1))
+cnom+Fi_ti*1e-1)<0.5*h:
D.append(Diametros_Aco[indice])
Q.append(valor)
for i,v in enumerate(Q):
diam = D[i]
n = Q[i]
eh_min = max (2,1.2*(DMC*1e-1),diam*1e-1)
168
ev_min = max(2, diam * 1e-1, 0.5 * (DMC * 1e-1))
eh_barra = (bw-2*((cnom+Fi_ti*1e-1))-(n*diam*1e-1))/(n-1)
soma=0
cam = 0
while n>0:
while eh_barra<eh_min:
n-=1
eh_barra = (bw-2*((cnom+Fi_ti*1e-1))-(n*diam*1e-
1))/(n-1)
if eh_barra>eh_min:
n=2
eh_b = (bw-2*((cnom+Fi_ti*1e-1))-(n*diam*1e-1))/(n-
1)
cam+=1
soma=soma+n
n=Q[i]-soma
eh.append(eh_b)
ev.append(ev_min)
Camadas.append(cam)'''
D = np.around(D, decimals=3)
print("\nDiâmetros: ",D)
print("Quantidades: ",N)
print("Camadas: ",Camadas,"\n")
#print(eh)
#print(ev)
###########################################################################
#############################################
#____________________________________INSERINDO PROPRIEDADES DOS MATERIAIS
NO RESUMO_____________________________________
###########################################################################
#############################################
#self.list_Dimensionamento.addItem("")
#self.list_Dimensionamento.addItem("Propriedades dos Materiais:")
#self.list_Dimensionamento.addItem("")
# Propriedades do Concreto
#self.list_Dimensionamento.addItem("Concreto:")
#self.list_Dimensionamento.addItem("Coeficiente de ponderação da
resistência (Combinação %s) = %.2f" %(comb_ELU,yc))
#self.list_Dimensionamento.addItem("Classe de agressividade
ambiental (CAA) = %s" % CAA)
#self.list_Dimensionamento.addItem("Resistência à compressão (fck)
= %.2f MPa" % fck)
#self.list_Dimensionamento.addItem("Resistência média à tração
(fct,m) = %.2f MPa" %fctm)
#self.list_Dimensionamento.addItem("Resistência média à tração
indireta (fctk,sup) = %.2f MPa" % fctk_sup)
#self.list_Dimensionamento.addItem("Resistência média à tração na
flexão (fctk,inf) = %.2f MPa" % fctk_inf)
#self.list_Dimensionamento.addItem("Peso específico = 2500 KN/m³")
#self.list_Dimensionamento.addItem("Módulo de elasticidade inicial
(Eci) = %.2f GPa" %(Eci*1e-3))
#self.list_Dimensionamento.addItem("Módulo de elasticidade secante
(Ecs) = %.2f GPa" %(Ecs*1e-3))
169
AÇO___***")
170
if __name__ == '__main__':
import sys
root = QApplication(sys.argv)
app = J_Dimensionamento()
app.show()
#app.showMaximized()
root.exec_()
171