Para esse sábado, essa semana foi bem corrida e esqueci de mandar
mensagem confirmando se faríamos alguma coisa. Mas por mim na próxima
quinta estamos confirmados.
No sábado dia 16, a são judas vai estar aberta. Se quiserem podemos
marcar lá ou em outro lugar.
Nessa quinta vimos um pouco os tópicos para implementar um programa mais
completo. Alguns desses tópicos valem para qualquer programa, outros
somente para o projeto sugerido.
- Documentação e testes
- Interface gráfica
- Visualização de geometria com Cairo/OpenGL/Vulkan
- Verificações de norma técnica
- Elementos finitos e análise estrutural
- Distribuição e compilação
Dessa vez focamos um pouco mais em interfaces gráficas e elementos finitos.
Para interfaces gráficas, essa documentação vai ajudar muito:
https://python-gtk-3-tutorial.readthedocs.io/
Para elementos finitos, temos 3 partes:
- iniciar a parte de álgebra linear e métodos numéricos com Numpy e
Scipy em https://scipy.org/
- implementar um protótipo com Fenics em https://fenicsproject.org/
- e por fim passar para uma implementação acabada em todos os detalhes
em Python e C com https://docs.python.org/3/extending/
Não chegamos a ver, mas para visualização de geometria, começando com o
mais fácil, em Cairo, tem esses manuais:
https://pycairo.readthedocs.io/
https://cairographics.org/documentation/
Vou anexar aqui também 4 protótipos que fiz quando estava aprendendo cairo.
Lembrando que, além dos vídeos e cursos e tutoriais que mandei, a
docuemntação oficial de python é muito boa, até hoje consulto ela
constantemente para aprender alguma coisa que nunca usei ou lembrar como
usa alguma coisa que esqueço sempre: https://docs.python.org/
Esse comando abaixo instala tudo o que é necessário para os tópicos
acima, exceto o fenics:
pacman --sync --noconfirm \
mingw-w64-x86_64-toolchain \
mingw-w64-x86_64-gtk3 \
mingw-w64-x86_64-python3 \
mingw-w64-x86_64-python3-pip \
mingw-w64-x86_64-python3-cairo \
mingw-w64-x86_64-python3-gobject \
mingw-w64-x86_64-python3-numpy \
mingw-w64-x86_64-python3-scipy \
mingw-w64-x86_64-python3-matplotlib \
mingw-w64-x86_64-python3-sympy \
mingw-w64-x86_64-python3-ipython \
mingw-w64-x86_64-python3-notebook \
mingw-w64-x86_64-SDL \
mingw-w64-x86_64-SDL_mixer \
mingw-w64-x86_64-emacs \
mercurial \
git
Pode copiar e colar na shell do MSYS2-64-bit tudo acima desde pacman até
git. As barras invertidas no final de cada linha indicam que o comando
não terminou naquela linha, e você pode continuar escrevendo antes de
mandar executar dando enter na primeira linha que não termina em barra
invertida. Se ele não executar direto quando você colar, aperte Enter.
att
YT
#! /usr/bin/env python3
# -*- coding: utf-8; -*-
import cairo
surface = cairo.SVGSurface('example.svg', 200, 200)
context = cairo.Context(surface)
x, y, x1, y1 = 0.1, 0.5, 0.4, 0.9
x2, y2, x3, y3 = 0.6, 0.1, 0.9, 0.5
context.scale(200, 200)
context.set_line_width(0.04)
context.move_to(x, y)
context.curve_to(x1, y1, x2, y2, x3, y3)
context.stroke()
context.set_source_rgba(1, 0.2, 0.2, 0.6)
context.set_line_width(0.02)
context.move_to(x, y)
context.line_to(x1, y1)
context.move_to(x2, y2)
context.line_to(x3, y3)
context.stroke()
surface.finish()
print('example.svg created')
#! /usr/bin/env python3
# -*- coding: utf-8; -*-
import math
import cairo
WIDTH, HEIGHT = 256, 256
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)
ctx.scale(WIDTH, HEIGHT) # Normalizing the canvas
pat = cairo.LinearGradient(0.0, 0.0, 0.0, 1.0)
pat.add_color_stop_rgba(1, 0.7, 0, 0, 0.5) # First stop, 50% opacity
pat.add_color_stop_rgba(0, 0.9, 0.7, 0.2, 1) # Last stop, 100% opacity
ctx.rectangle(0, 0, 1, 1) # Rectangle(x0, y0, x1, y1)
ctx.set_source(pat)
ctx.fill()
ctx.translate(0.1, 0.1) # Changing the current transformation matrix
ctx.move_to(0, 0)
# Arc(cx, cy, radius, start_angle, stop_angle)
ctx.arc(0.2, 0.1, 0.1, -math.pi / 2, 0)
ctx.line_to(0.5, 0.1) # Line to (x,y)
# Curve(x1, y1, x2, y2, x3, y3)
ctx.curve_to(0.5, 0.2, 0.5, 0.4, 0.2, 0.8)
ctx.close_path()
ctx.set_source_rgb(0.3, 0.2, 0.5) # Solid color
ctx.set_line_width(0.02)
ctx.stroke()
surface.write_to_png("example.png") # Output to PNG
print('example.png created')
#! /usr/bin/env python3
# -*- coding: utf-8; -*-
import numpy.random as npr
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
def draw(area, context):
width = area.get_allocated_width()
height = area.get_allocated_height()
for _ in range(10):
x, y, r, g, b = npr.random(5)
x = int(x * width)
y = int(y * height)
context.set_source_rgba(r, g, b, 1)
context.rectangle(x-50, y-50, 100, 100)
context.fill()
return False
win = Gtk.Window()
win.set_title("Cairo Test")
win.set_default_size(600, 600)
win.connect('destroy', Gtk.main_quit)
area = Gtk.DrawingArea()
area.connect('draw', draw)
win.add(area)
win.show_all()
Gtk.main()
#! /usr/bin/env python3
# -*- coding: utf-8; -*-
import numpy.random as npr
import cairo
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
image = cairo.ImageSurface.create_from_png('example.png')
# pattern = cairo.SurfacePattern(image)
x, y = 0, 0
def move(widget, event):
global x, y
x, y = event.x, event.y
area.queue_draw()
def draw(area, context):
width = area.get_allocated_width()
height = area.get_allocated_height()
context.translate(x-50, y-50)
context.set_source_surface(image)
context.rectangle(0, 0, 100, 100)
context.fill()
context.set_source_rgba(0, 0, 0, 1)
context.rectangle(0, 0, 100, 100)
context.set_line_width(2)
context.stroke()
context.identity_matrix()
a, b = npr.random(2)
a = int(a * width)
b = int(b * height)
context.set_source_rgba(1, 0, 0, 1)
context.rectangle(a-50, b-50, 100, 100)
context.fill()
return False
win = Gtk.Window()
win.set_title("Cairo Test")
win.set_default_size(600, 600)
win.connect('destroy', Gtk.main_quit)
area = Gtk.DrawingArea()
area.add_events(Gdk.EventMask.POINTER_MOTION_MASK)
area.connect('draw', draw)
area.connect('motion-notify-event', move)
win.add(area)
win.show_all()
Gtk.main()