Next-generation of the non-destructive, node-based 2D image graphics editor

Overview

Gimel Studio


Non-destructive, node-based 2D image graphics editor written in Python, focused on simplicity, speed, elegance, and usability
Official Website | Join Our Discord Server | Official Manual

About the Next Generation of Gimel Studio

The previous (now archived) version of Gimel Studio is still available here.

This repository tracks the next step of Gimel Studio (the v0.6.x series) to become a truly usable and serious node-based, non-destructive image editor. It is currently in initial development stage, working towards a usable MVP application. Things will probably change a lot from what is currently here.

We’re especially seeking Python and/or GLSL developers, 3D artists, photographers and UI designers to help with the project. However, even if you have none of these skills you’re still welcome, of course, to ask questions, give feedback, and suggest ideas and improvements. :)

Vision

The main goal is to expand on and greatly improve upon the concepts from the previous version of Gimel Studio to create a serious (yet fun!) 2D graphics editor.

This includes:

  • Re-designed UI (highly inspired by the Blender 2.8x UI and parts of Sketch)
  • Improved file-type support (.tiff, .exr files, etc)
  • 16-bit workflow support
  • CPU and GPU based processing
  • Highly improved node-graph and overall workflow for image editing
  • Greater emphasis on re-usabilty of node graph setups via templates, etc
  • User preferences for customizabilty
  • UI translations and localization
  • Gizmos for the viewport to allow for WYSIWYG-like interaction for transforms, etc. (e.g. crop, rotate, etc)
  • Continued improvement and additions to the Python API for scripting custom nodes

Nodes can be used to composite, create new effects and/or composite raster and vector graphics on-demand. Helpful gizmos in the interactive viewport can be used to do various editing tasks and speed up the workflow. Preset node graph templates can be created, used and re-used to save time setting up common node-setups.

Custom nodes can be scripted with the built-in Python API for maximum flexibility. Integrations with other software like Blender are planned.

With a fully non-destructive workflow that uses both GPU and CPU processing while being seamlessly cross-platform on Windows, Linux and macOS (for 64-bit systems), Gimel Studio aims to be a simple, yet powerful 2D graphics editing tool for anyone with an image to edit.

Visit our home page here for an overview of the project goals, etc

WIP Mockup

Here is a WIP mockup of the redesigned UI:

Discord chat

If you’d like to join development, help with the UI design, UI translations, or have questions, comments, and ideas, you can join the Gimel Studio Discord. This is where you can chat with the developers, designers and project contributors and get the latest updates on development.

If you prefer to keep to Github instead, feel free to start a discussion here.

Status

We are working towards an MVP which will showcase much of the core goals and features listed on the website.

The initial UI is now mostly laid out according to the WIP UI mockup and the core nodegraph rendering is just functional (it “just works”) at the moment. There is much more to do… and we could really use help to speed progress along. ;)

gs-wip-demo The current status of the next generation of Gimel Studio as of 10/5/2021

Take a look at the GitHub Issues for details on immediate and future tasks to be done. Issues labeled “Good first issue” will be the best for new contributors. A familiarity with Python helps, but we are willing to mentor any contributors as needed.

Pull requests are always welcome! :)

Running the code

Please note: At this stage of development, the code is highly WIP and likely to change a lot. Many things are not implemented and not stable. Please don't expect too much at this point...

Windows

  1. pip install -r requirements.txt
  2. Get the OIIO (OpenImageIO) pre-built python wheel (Windows only) here and install it.
  3. cd src
  4. python main.py

Linux

  1. pip3 install -r requirements.txt
  2. If building wxPython fails, Download the wheel file for wxpython which matches your Python version and Linux OS version from https://extras.wxpython.org/wxPython4/extras/linux/ and install the wxpython package with pip3 install
  3. cd src
  4. python3 main.py

Please note that the renderer, which relies on OIIO (OpenImageIO) will not work if OIIO is not found. The rest of the application will run, but the renderer will not work. This essentially means that we do not have Linux support yet (please check back later or help us to get it working for linux).

OIIO will need to be built from source since pre-built wheels are not yet available. See this issue.

macOS

  1. Make sure you have Python 3.8+ installed on your system.
  2. Navigate to the root folder and in your terminal, run python3 build.py. This will install all of the neccesary libraries and will give you the option to create a standalone executable or just run the code with Python.

Tech we're using

Python – We can effectively use Python’s strong suits (ease-of-use, portability, multitude of packages, large community, etc) and get the performance required by relying on lower-level and performant external libraries to do the heavy lifting (where implementing something in Python would be a bottleneck).

We also use GLSL in addition to Python for image-editing, as applicable, via ModernGL. Other graphics rendering API suggestions are welcome!

Numpy – Numpy is the “data-exchange” format, the core image format used for the backend of Gimel Studio. It is used as “glue” to combine OIIO, GMIC, etc.

OpenImageIO – OIIO is used for image input/output and some image editing. OpenImageIO is a library for reading, writing, and processing images in a wide variety of file formats using a format-agnostic API. It is used in professional large-scale visual effects and feature film animation, and it is used ubiquitously by large VFX studios, as well as incorporated into many commercial products.

Cario – Cairo is a 2D graphics library with support for multiple output devices, including SVG, etc. We will use either Cairo or another library (suggestions welcome) for vector graphics support.

G'MIC – For additional image effects and filters (CPU-based). Mainly need to wait for the GMIC python bindings to support Windows and macOS before implementing this into Gimel Studio, but this probably won’t be implemented until after the core is stable anyway.

wxPython – Is used as the primary GUI front-end as it’s a powerful, native, cross-platform GUI toolkit based on wxWidgets.

A greatly improved node graph for Gimel Studio is currently in development via the GS Nodegraph library.

Modern, styleable widgets for Gimel Studio are currently in development via the GS WidgetKit library.

The API Scripting Language is Python (with the option to use a GLSL shader).

Comments
  • Test and make fixes for MacOs

    Test and make fixes for MacOs

    Just as simple as that: just build and test on a MacOs system to see what needs to be fixed, etc. The current developers do not have access to a Mac so we need someone else to do this.

    good first issue macos python 
    opened by Correct-Syntax 30
  • Wanted to share a tip for Linux and OpenImageIO installation

    Wanted to share a tip for Linux and OpenImageIO installation

    Hey there, I just wanted to share with folks who might be having an issue getting OpenImageIO built / installed on linux. If you simply install the Linux version of Homebrew (Linuxbrew), you can install OIIO using brew. It takes a bit (took about 10 minutes) but it will get the job done. :+1:

    Thanks, -MH

    opened by MostHated 22
  • Preferences/Configuration Dialog

    Preferences/Configuration Dialog

    Settings/tabs I am thinking we are going to include in the dialog, so far:

    • [ ] Node wire curvature (e.g: 0 is straight, 8 is curved, etc)
    • [ ] Maybe some settings for enabling/disabling node cache as it may not always be needed/wanted
    • [ ] Node Manager (add/remove enable/disable available nodes)
    • [ ] Enable/disable "experimental" features
    • [ ] Toggle showing image thumbnails on nodes by default
    • [ ] Fonts path (default could be the system font folder)
    • [ ] Default output folder (default could be the home folder of the users computer)
    • [ ] Whether to position the Add Node menu based on the cursor location or just have it static (placed at the bottom corner)
    • [ ] Toggle showing the statusbar by default
    good first issue ui 
    opened by Correct-Syntax 21
  • Implement GLSL shader support for image manipulation (GPU image processing)

    Implement GLSL shader support for image manipulation (GPU image processing)

    This is a very difficult, work-in-progress PR to implement GLSL shader support (and thus GPU image processing) in the node API. It is currently demonstrable via the Opacity and Alpha Over Node, so feel free to test it out. 😃

    There are a bunch of things to be worked out before merging this PR:

    • [x] Implement ability to have multiple image inputs into the shader. Currently, you can only pass a single image into the shader. This works for nodes like Opacity, but the ability to pass in multiple images is needed in order to implement nodes like Mix, etc.
    • [x] Figure out loading GLSL from a file rather than hardcoding it in the python file.
    • [x] Work on code organization. (e.g: what is the best place for the GLSLRenderer class?)
    • [x] Refine the API (Passing in props to the shader could be easier, I think. Though, we don't want too much overhead.)
    • [x] Make sure to call Release on application quit.
    • ~~When two nodes in a row are using GLSL shaders, it would be nice to keep the data on the GPU to reduce overhead. This could be achieved with the Swap method, but details need to be worked out.~~ Not in this PR
    • ~~Implement 16-bit support via (uint16). Currently, only has 8-bit (uint8) support.~~ Not in this PR

    At the moment, this uses ModernGL to give us access to an OpenGL 3.3+ context. Maybe other libraries would be better?

    I am open to your critiques and thoughts on possible solutions @iwoithe, @JohJakob and others...

    This will close #27

    opened by Correct-Syntax 12
  • Running in a fresh VM, GimelStudio was able to create it's config folder, but not the config file.

    Running in a fresh VM, GimelStudio was able to create it's config folder, but not the config file.

    Describe the bug When I was doing testing in the fresh VM, after building and attempting to run the application for the first time, it seems it was able to create ~/.gimelstudio/ but it was not able to create the config file itself.

    Terminal output
    10075 INFO: Removing dir /home/mosthated/dev/github/GimelStudio/dist/GimelStudio
    10135 INFO: Building COLLECT COLLECT-00.toc
    10446 INFO: Building COLLECT COLLECT-00.toc completed successfully.
    Build complete. Run GimelStudio now? y/n y
    [email protected]:~/dev/github/GimelStudio$ [INFO] Registered core nodes
    [INFO] Registered custom nodes
    Traceback (most recent call last):
      File "main.py", line 67, in OnInit
    AttributeError: 'NoneType' object has no attribute 'upper'
    OnInit returned false, exiting...
    
    

    I tried it a second time, starting it directly instead of letting the build script start it, just in case that has anything to do with it, but it had the same results.

    Terminal output - second try
    [email protected]:~/dev/github/GimelStudio/dist/GimelStudio$ ./GimelStudio 
    [INFO] Registered core nodes
    [INFO] Registered custom nodes
    Traceback (most recent call last):
      File "main.py", line 67, in OnInit
    AttributeError: 'NoneType' object has no attribute 'upper'
    OnInit returned false, exiting...
    
    

    Once I manually created the config file by just copying it from my desktop into the VM's ~/.gimelstudio/pr1-config.json, it fired up just fine.

    I didn't have this issue with my desktop. Upon first run, it created the folder and config file. The only real difference between the environments is my desktop was using pyenv to create the build and not the system install of py3, like the VM. I am wondering if since pyenv is installed and ran from $HOME/.pyenv/bin/, it might have something to do with it, but I feel like the built application, after the fact, it would not matter?

    To Reproduce Steps to reproduce the behavior: From a fresh VM, navigate to dist/GimelStudio and execute the application via: ./GimelStudio If you create a config manually in ~/.gimelstudio/pr1-config.json, then start it again, it works. If you then remove/rename the config, ex. pr1-config.json.bak and try to start it again, it no longer works.

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Desktop (please complete the following information): Issue does occur on:

    VM with issue
    python3 -V : Python 3.9.5
    which python3: /usr/bin/python3
    
    OS: Pop!_OS 21.04 x86_64 
    Host: KVM/QEMU (Standard PC (Q35 + ICH9, 2009) pc-q35-5.2) 
    Kernel: 5.15.5-76051505-generic 
    Uptime: 39 mins 
    Packages: 1910 (dpkg) 
    Shell: bash 5.1.4 
    Resolution: 1504x729 
    DE: GNOME 3.38.4 
    WM: Mutter 
    WM Theme: Pop 
    Theme: Pop-dark [GTK2/3] 
    Icons: Pop [GTK2/3] 
    Terminal: gnome-terminal 
    CPU: AMD EPYC-Rome (24) @ 3.493GHz 
    GPU: 00:01.0 Red Hat, Inc. QXL paravirtual graphic card 
    Memory: 1439MiB / 15620MiB 
    
    

    Issue does not occur on:

    Desktop system without issue
    pyenv 2.2.1
    pyenv python version: python3.9.9
    whereis pyenv  - /home/mosthated/.pyenv/bin/pyenv
    
    OS: Pop!_OS 21.04 x86_64
    Host: X570 AORUS ELITE -CF
    Kernel: 5.13.0-7620-generic
    Uptime: 6 days, 21 hours, 10 mins
    Packages: 3559 (dpkg), 171 (brew), 63 (flatpak), 13 (snap)
    Shell: zsh 5.8
    Resolution: 1920x1080, 2560x1080, 1920x1080
    DE: GNOME 3.38.4
    WM: Mutter
    WM Theme: Pop
    Theme: Materia-dark-compact [GTK2/3]
    Icons: Flatery-Orange-Dark [GTK2/3]
    Terminal: alacritty
    CPU: AMD Ryzen 9 3950X (32) @ 3.500GHz
    GPU: NVIDIA GeForce RTX 2070
    Memory: 44962MiB / 64250MiB
    
    

    Additional context I am going to install pyenv in the VM and then build with that and see if there is any sort of difference in behavior with the final application, I would not think there would be, but I guess that is what testing is all about.

    bug 
    opened by instance-id 9
  • Initial implementation of multi node outputs + Property based nodes

    Initial implementation of multi node outputs + Property based nodes

    Description

    Rather raw implementation of multi-outputs for nodes and the switch to using properties for node values and connections (vs. the previous properties and parameters setup). A ton of breaking changes. This PR also updates all of the current nodes to be either fully or somewhat compatible with the changes. Some of the code is a mess and there are many things that need to be added, but in order to not make this PR huge I've cut it short to the bare minimum implementation.

    Known things this PR breaks:

    • Project file IO
    • Node caching

    Related issues

    Systems Tested On

    Windows 10

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides
    opened by Correct-Syntax 8
  • Add the ColorProp class to property.py

    Add the ColorProp class to property.py

    Add the ColorProp class to property.py

    Issue #93 (Implement node color property)

    Systems Tested On: Windows 10

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides
    opened by yonMaor 7
  • Build process update for Linux

    Build process update for Linux

    Description

    Update to build process for Linux systems

    Related issues

    https://github.com/GimelStudio/GimelStudio/issues/118

    Systems Tested On

    Pop_OS 21.04

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides
    opened by instance-id 6
  • Add the preferences dialog

    Add the preferences dialog

    Closes https://github.com/GimelStudio/GimelStudio/issues/2

    Todo

    This PR is marked as a draft as there is still quite a bit of work to do. I have added a (rough) to do list below.

    • [x] Make a final decision on the name (out of Preferences, Settings, or Options)

    • [x] Add an accent to the currently selected button

    • [x] Add the preferences themselves

    • [ ] ~Make the widgets expand to fill the whole notebook~ Not this PR

    When merged, this PR will not include

    • The "special" pages (add-ons, nodes, and templates)
    • Reset settings to defaults
    • Search/filter settings

    Current Progress

    Screenshot

    opened by iwoithe 6
  • Proposal: Use user-friendly labels for toggles

    Proposal: Use user-friendly labels for toggles

    Toggles like “Toggle Status Bar” should have a different label based on their state to better indicate what they will do when clicked. For the status bar, this could be “Show Status Bar” and “Hide Status Bar” or it could be replaced with a checkbox toggle like “Auto Render”.

    This would also make translations in certain languages (like German) easier because they do not have a convenient term like “toggle” (in German, the only fitting translation is “umschalten”, but it is a bit ambiguous). The same would apply to the help texts.

    feature good first issue 
    opened by JohJakob 4
  • Proposal: Rename “User Preferences” to “Preferences…”

    Proposal: Rename “User Preferences” to “Preferences…”

    There is no real difference between user preferences and settings in Gimel Studio. It would make sense to simplify the term “User Preferences” and just call it “Preferences”. This would also shorten the term in German from “Benutzereinstellungen” to “Einstellungen” which is more desirable.

    I would also append an ellipsis () to the menu item to let the user know that the action requires more actions/opens a dialogue. Both macOS and Blender use “Preferences…”.

    feature 
    opened by JohJakob 4
  • Use custom made icons for Gimel Studio

    Use custom made icons for Gimel Studio

    Currently Bootstrap icons are being used for GS 1. At some point it would be nice to switch to a custom icon set. Also comes from the point that there more icons will need to be made anyway as Bootstrap icons won't always have a suitable icon.

    Style

    Lined, rounded style icons

    Ideas:

    Duo-tone icons

    design ui 
    opened by iwoithe 0
  • The (hopefully) final re-write of Gimel Studio for a while

    The (hopefully) final re-write of Gimel Studio for a while

    Description

    The next re-write of Gimel Studio. More details to come soon.

    Current Progress

    As of writing, I am still working on the base of the project which will probably take a few months to complete. Note that there won't be much to see during this period.

    You can see the issues for this re-write here.

    Screenshots

    image

    image

    Related issues

    N/A

    Systems Tested On

    • Windows 10
    • Linux (Slackware/XFCE 4)

    Checklist

    • [x] I signed the CLA
    • [x] There are no unnecessary or out-of-scope changes in this PR
    • [x] Gimel Studio runs successfully on the above system(s) with the changes in this PR
    • [x] The changes in this PR follow the style guides

    Notes/Other Information

    • While correct on Linux, the icons are wrong on Windows. Yet to investigate.
    design ui core blocker node high priority 
    opened by iwoithe 0
  • Use OpenCV as a fallback for OpenImageIO, file I/O

    Use OpenCV as a fallback for OpenImageIO, file I/O

    Currently, we do not have pre-built python wheels for OpenImageIO. OpenImageIO is only used for image I/O so it is not necessarily a hard dependency. OpenCV doesn't provide all of the same support for the formats OIIO does, but that is the tradeoff. :/

    This issue should implement cv2 (which is already a dependency) as a fallback for image Input and output when OIIO is not installed. It should also alert the user that the image import and export may be limited because of using cv2 rather than OIIO.

    feature good first issue core python high priority ready 
    opened by Correct-Syntax 0
  • Add node reload

    Add node reload

    Currently, you have to restart Gimel Studio every time you make a change to a node. Add the ability to reload and refresh the nodes in Gimel Studio without restarting. Take a look at the src/GimelStudio/node_importer for an idea how they are loaded in on application start.

    feature ui core python node medium priority 
    opened by Correct-Syntax 0
Releases(v0.6.0-alpha-2)
  • v0.6.0-alpha-2(Jan 10, 2022)

    Welcome to the second pre-release of the v0.6.x series of Gimel Studio!

    This pre-release has some more of the basic functionality implemented and is mainly meant as a test version.

    It is important to note that this is a pre-release and thus is by no means feature complete (thus this is not the MVP version). There are also some known issues, so just know that many things will change from what is currently here.

    Let us know any feedback you have! Thanks.

    (Only a Windows binary is provided for this release. Enjoy. 😃)

    Source code(tar.gz)
    Source code(zip)
    GimelStudio-v0.6.0-alpha-pre-release-2.zip(69.44 MB)
  • v0.6.0-alpha-1(Nov 25, 2021)

    Welcome to the first pre-release of the v0.6.x series of Gimel Studio!

    This pre-release has some of the basic functionality implemented and is mainly meant as a test version.

    It is important to note that this is a pre-release and thus is by no means feature complete (thus this is not the MVP version). There are also some known issues, so just know that many things will change from what is currently here.

    Let us know any feedback you have! Thanks.

    (Only a Windows binary is provided for this release. Enjoy. 😃)

    Source code(tar.gz)
    Source code(zip)
    GimelStudio-v0.6.0-alpha-pre-release-1.zip(67.77 MB)
Owner
Gimel Studio
Non-destructive, node-based 2D image graphics editor
Gimel Studio
Python Digital Art Generator

Python Digital Art Generator The main goal of this repository is to generate all possible layers permutations given by the user in order to get unique

David Cuentas Mar 3 Mar 12, 2022
📷 Python package and CLI utility to create photo mosaics.

📷 Python package and CLI utility to create photo mosaics.

Loic Coyle 7 Oct 29, 2022
Validate arbitrary image uploads from incoming data urls while preserving file integrity but removing EXIF and unwanted artifacts and RCE exploit potential

Validate arbitrary base64-encoded image uploads as incoming data urls while preserving image integrity but removing EXIF and unwanted artifacts and mitigating RCE-exploit potential.

A3R0 1 Jan 10, 2022
Simple utility to tinker with OPlus images

OPlus image utilities Prerequisites Linux running kernel 5.4 or up (check with uname -r) Image rebuilding Used to rebuild read-only erofs images into

Wiley Lau 15 Dec 28, 2022
Utilities for SteamVR on Linux

This project contains scripts to improve the functionally of SteamVR on Linux:

86 Dec 29, 2022
Sample data for the napari image viewer.

napari-demo-data Sample data for the napari image viewer. This napari plugin was generated with Cookiecutter using @napari's cookiecutter-napari-plugi

Genevieve Buckley 1 Nov 08, 2021
Script For Importing Image sequences into scrap mechanic via blueprints

To use dowload and extract "video makes.zip" Python has to be installed https://www.python.org/ (may not work on version lower than 3.9) Has to be run

2 Oct 30, 2021
missing-pixel-filler is a python package that, given images that may contain missing data regions (like satellite imagery with swath gaps), returns these images with the regions filled.

Missing Pixel Filler This is the official code repository for the Missing Pixel Filler by SpaceML. missing-pixel-filler is a python package that, give

SpaceML 11 Jul 19, 2022
A procedural Blender pipeline for photorealistic training image generation

BlenderProc2 A procedural Blender pipeline for photorealistic rendering. Documentation | Tutorials | Examples | ArXiv paper | Workshop paper Features

DLR-RM 1.8k Jan 02, 2023
python binding for libvips using cffi

README PyPI package: https://pypi.python.org/pypi/pyvips conda package: https://anaconda.org/conda-forge/pyvips We have formatted docs online here: ht

libvips 467 Dec 30, 2022
Python class that generates pixel art from images

Python class that generates pixel art from images

Richard Nagyfi 1.4k Dec 29, 2022
Converting Images Into Minecraft Houses

Converting Images Into Minecraft Houses In this particular project, we turned a 2D Image into Minecraft pixel art and then scaled it in 3D such that i

Mathias Oliver Valdbjørn Jørgensen 1 Feb 02, 2022
A tool to maintain an archive/mirror of your Google Photos library for backup purposes.

Google Photos Archiver Updated Instructions 8/9/2021 Version 2.0.6 Instructions: Download the script (exe or python script listed below) Follow the in

Nick Dawson 116 Jan 03, 2023
Extract the temperature data of each wire from the thermal imager raw data.

Wire-Tempurature-Detection Extract the temperature data of each wire from the thermal imager raw data. The motivation of this computer vision project

JohanAckerman 1 Nov 03, 2021
A large-scale dataset of both raw MRI measurements and clinical MRI images

fastMRI is a collaborative research project from Facebook AI Research (FAIR) and NYU Langone Health to investigate the use of AI to make MRI scans faster. NYU Langone Health has released fully anonym

Facebook Research 907 Jan 04, 2023
With this simple py script you will be able to get all the .png from a folder and generate a yml for Oraxen

Oraxen-item-to-yml With this simple py script you will be able to get all the .png from a folder and generate a yml for Oraxen How to use Install the

Akex 1 Dec 29, 2021
Kimimaro: Skeletonize Densely Labeled Images

Kimimaro: Skeletonize Densely Labeled Images # Produce SWC files from volumetric images. kimimaro forge labels.npy --progress # writes to ./kimimaro_o

92 Dec 17, 2022
Xmas-Tree-GIF-Tool - Convert any given animated gif file into an animation in GIFT CSV format

This repo is made to participate in Matt Parker's XmasTree 2021 event. Convert a

Aven Zitzelberger 2 Dec 30, 2021
Pnuemonia Normal detection by using XRay images.

Pnuemonia Normal detection by using XRay images. Got image datas from kaggle(link is given in sources.txt file) also normal xray images from other site (also link is given) in order to avoid data dis

Zarina 1 Feb 28, 2022
Tool to create a Phunk image with a custom background

Create Phunk image Tool to create a Phunk image with a custom background Installation Clone the repo git clone https://github.com/albanow/etherscan_sa

Albano Pena Torres 6 Mar 31, 2022