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
Extracts random colours from an image

EXTRACT COLOURS This repo contains all the project files. Project Description A Program that extracts 10 random colours from an image and saves the rg

David .K. Danso 3 Dec 13, 2021
starfish is a Python library for processing images of image-based spatial transcriptomics.

starfish: scalable pipelines for image-based transcriptomics starfish is a Python library for processing images of image-based spatial transcriptomics

199 Dec 08, 2022
LabelMe annotation tool source code

LabelMe annotation tool source code Here you will find the source code to install the LabelMe annotation tool on your server. LabelMe is an annotation

MIT CSAIL Computer Vision 1.3k Jan 03, 2023
Find target hash collisions for Apple's NeuralHash perceptual hash function.💣

neural-hash-collider Find target hash collisions for Apple's NeuralHash perceptual hash function. For example, starting from a picture of this cat, we

Anish Athalye 630 Jan 01, 2023
Tool that takes your photo and generates a pixelated color by number photo.

Color by number Tool that takes your photo and generates a pixelated color by number photo. Requirements You need to have python installed on your com

1 Dec 18, 2021
Semi-hash-based Image Generator

pixel-planet Semi-hash-based Image Generator Utilizable for NFTs Generation Process Input is salted and hashed Colors (background, planet, stars) are

Bill Ni 3 Sep 01, 2022
SALaD (Semi-Automatic Landslide Detection) is a landslide mapping system

SALaD (Semi-Automatic Landslide Detection) is a landslide mapping system. SALaD utilizes Object-based Image Analysis and Random Forest to map landslides.

NASA 14 Jan 04, 2023
MetaStalk is a tool that can be used to generate graphs from the metadata of JPEG, TIFF, and HEIC images

MetaStalk About MetaStalk is a tool that can be used to generate graphs from the metadata of JPEG, TIFF, and HEIC images, which are tested. More forma

Cyb3r Jak3 1 Jul 05, 2021
Forza painter app with python

forza-painter Discord: A-Dawg#0001 (AE) Supports: Forza Horizon 5 Offically (OTHER v1.405.2.0, MS STORE v3.414.967.0, STEAM v1.414.967.0) Unofficially

320 Dec 31, 2022
㊙️ Create standard barcodes with Python. No external dependencies. 100% Organic Python.

python-barcode python-barcode provides a simple way to create barcodes in Python. There are no external dependencies when generating SVG files. Pillow

Hugo Barrera 419 Dec 26, 2022
A minimal, standalone viewer for 3D animations stored as stop-motion sequences of individual .obj mesh files.

ObjSequenceViewer V0.5 A minimal, standalone viewer for 3D animations stored as stop-motion sequences of individual .obj mesh files. Installation: pip

csmailis 2 Aug 04, 2022
GIMP script to export bitmap as GRAPHICS 4 file (aka SCREEN 5)

gimpfu-msx-gr4.py GIMP script to export bitmap as GRAPHICS 4 file (aka SCREEN 5). GRAPHICS 4 specs are: 256x212 (or 256x192); 16 color palette (from 5

Pedro de Medeiros 4 Oct 17, 2022
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
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
Computer art based on joining transparent images

Computer Art There is no must in art because art is free. Introduction The following tutorial exaplains how to generate computer art based on a series

Computer Art 12 Jul 30, 2022
HtmlWebShot - A python3 package which Can Create Images From url, Html-CSS, Svg and from any readable file and texts with many setup features.

A python3 package which Can Create Images From url, Html-CSS, Svg and from any readable file and texts with many setup features

Danish 24 Dec 14, 2022
reversable image censoring tool

StupidCensor a REVERSABLE image censoring tool to reversably mosiac censor jpeg files to temporarily remove image details not allowed on most websites

2 Jan 28, 2022
Blue noise image stippling in Processing (requires GPU)

Blue noise image stippling in Processing (requires GPU)

Mike Wong 141 Oct 09, 2022
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
A GUI-based (PyQt5) tool used to design 2D linkage mechanism.

Pyslvs-UI A GUI-based (PyQt5) tool used to design 2D linkage mechanism. Planar Linkages Simulation Python-Solvespace: Kernel from Solvespace with Cyth

Yuan Chang 141 Dec 13, 2022