{"id":18380162,"url":"https://github.com/mossblaser/py_silhouette","last_synced_at":"2025-09-02T00:36:36.840Z","repository":{"id":8263414,"uuid":"9714453","full_name":"mossblaser/py_silhouette","owner":"mossblaser","description":"A Cross-Platform, Open Silhouette Portrait Cutter/Plotter Driver","archived":false,"fork":false,"pushed_at":"2024-05-21T20:46:48.000Z","size":188,"stargazers_count":31,"open_issues_count":3,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-22T08:11:07.618Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://jhnet.co.uk/projects/plotter","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mossblaser.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-04-27T12:33:40.000Z","updated_at":"2025-03-18T01:11:15.000Z","dependencies_parsed_at":"2024-11-06T00:42:08.055Z","dependency_job_id":null,"html_url":"https://github.com/mossblaser/py_silhouette","commit_stats":{"total_commits":35,"total_committers":2,"mean_commits":17.5,"dds":0.02857142857142858,"last_synced_commit":"468badfe51c931da75d9ab9e3c73954763e65ed8"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mossblaser%2Fpy_silhouette","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mossblaser%2Fpy_silhouette/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mossblaser%2Fpy_silhouette/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mossblaser%2Fpy_silhouette/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mossblaser","download_url":"https://codeload.github.com/mossblaser/py_silhouette/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247563905,"owners_count":20958971,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T00:42:02.950Z","updated_at":"2025-04-06T22:32:49.382Z","avatar_url":"https://github.com/mossblaser.png","language":"Python","funding_links":[],"categories":["Software"],"sub_categories":["Plotter Control"],"readme":"`py_silhouette`: Control Silhouette plotters/cutters from Python\n================================================================\n\nThis repository contains a library for controlling the\n[Silhouette](https://www.silhouetteamerica.com/) series of desktop\nplotters/cutters. It is intended as a base for building generic or specialised\nplotting/cutting software.\n\nThis library is not:\n\n* A complete plotting tool -- it is just a library.\n* A general purpose plotter control library -- it only controls the Silhouette\n  series of desktop plotters.\n* A library of generic utilities for plotting -- it only contains low-level\n  device control functionality.\n* A complete reverse engineering of every hardware command -- it contains\n  enough to implement all advertised device functionality though some software\n  emulation of certain functions may be required (e.g. for manual head movement\n  control).\n\nUsage Example\n-------------\n\nA quick-and-dirty example uses `py_silhouette` to draw a rectangle is\nshown below:\n\n    from py_silhouette import SilhouetteDevice\n    \n    # Connect to first available device\n    d = SilhouetteDevice()\n    \n    # Find printed registration marks indicating a 200x100 mm area\n    d.zero_on_registration_mark(200, 100)\n    \n    # Set plotting parameters\n    d.set_speed(d.params.tool_speed_min)\n    d.set_force(d.params.tool_force_max)\n    d.set_tool_diameter(d.params.tool_diameters[\"Pen\"])\n    \n    # Move to (10, 10) mm as a starting point without drawing\n    d.move_to(10, 10, False)\n    \n    # Draw the rectangle\n    d.move_to(30, 10, True)\n    d.move_to(30, 20, True)\n    d.move_to(10, 20, True)\n    d.move_to(10, 10, True)\n    \n    # Finish plotting and return to the home position\n    d.move_home()\n    \n    # Flush the command buffer and wait for all commands to be acknowledged\n    d.flush()\n\nDocumentation\n-------------\n\n[Fairly detailed API documentation can be found in\nReadTheDocs](http://py_silhouette.rtfd.org/) or built from scratch using sphinx:\n\n    $ pip install -r requirements-docs.txt\n    $ cd docs/\n    $ make html\n\nDisclaimer\n----------\n\nThis software is based on my reverse engineering of the USB protocol used by\nthis device and so may or may not work well or be good for the device.\n\nI'm also developing this for my own personal use. As such that means I'm\nprioritising features which matter to me (correctness, predictability,\nreliability) and not those which might matter to others (ease of use, features\nI don't happen to care about). I'd be delighted if you wish to use this\nsoftware or even contribute but I'd work on the principle that if you want to\nuse this long term you might have to maintain your own fork!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmossblaser%2Fpy_silhouette","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmossblaser%2Fpy_silhouette","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmossblaser%2Fpy_silhouette/lists"}