[gepec] Tópicos

  • From: Yuri Teixeira <yuri@xxxxxxxxxxxxxxxxxxx>
  • To: gepec@xxxxxxxxxxxxx
  • Date: Sat, 9 Nov 2019 13:30:38 -0300

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()

Other related posts:

  • » [gepec] Tópicos - Yuri Teixeira