circuitpainter


Namecircuitpainter JSON
Version 0.0.9 PyPI version JSON
download
home_pageNone
SummarySketching interface for macking function printed circuit boards
upload_time2024-04-21 15:04:46
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseNone
keywords kicad pcb printed ciruit board circuit design skectching
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Circuit Painter

![](doc/lotus_leds.png)

Circuit painter is a creative coding tool for making functional printed
circuit boards.

Inspired by the simplifed drawing language of Processing, this tool provides
an environment for designing PCBs using basic geometric shapes such as lines,
arcs, and polygons. The tool maintains a drawing 'context' that applies a
translation and rotation matrix to all calls, making it simple to replicate
circuit features at differnt points across a circuit board. Functional PCB
components such as part footprints can also be placed, and connected together
logically using 'nets'.

Circuit painter works as a front end / wrapper for [KiCad's pcbnew](https://www.kicad.org/).

# Installation

Release versions are available on PyPi:

    pip install circuitpainter

In addition to the python library, you'll also need KiCad 7.x. The library is
tested on Ubuntu 22.04, with KiCad 7.0.6 installed from theofficial package
(https://www.kicad.org/download/), and Python 3.10.7 (the Ubuntu default).

It should work with any Linux distro,  and might work in Mac/Windows if the
pcbnew library is set up correctly in Python. It should also work with any
recent version of Python 3, but will probably only work with KiCad 7.0.6 or
higher as their API is not stable.

# Example usage

Start by creating a drawing context:

	from circuitpainter import CircuitPainter
	painter = CircuitPainter()

Using the painter object, you can draw non-conductive and conductve shapes,
footprints, and text onto the PCB.

First, set the layer to place the object on (tip: use
print(painter.layers.keys()) to show all available layers):

	painter.layer('F_SilkS')

Next, draw some non-conductive objects:

	painter.circle(0,0,3) # Draw a circle with radius 3 at the board origin
	painter.line(0,0,10,10) # Draw a line from the board origin to (10,10)
	painter.circle(10,10,3) # Draw a circle with raidus 3 at position (10,10)

So far, there hasn't been any visual indication of what you're making.
To get a preview of what your design looks like, use the preview()
function:

	painter.preview()

This will save the design to a temporary location, then open it in the
KiCad editor:

![](doc/example-two-lines.png)

It's good for seeing the project, but be careful! The file
will be deleted (along with any changes you make), as soon as you close
the window. If you do want to save your board at this time, use the 'Save As'
feature before exiting the editor!

To change the width of lines, use the width() command:

	painter.width(0.5)
	painter.line(0,0,10,0) # line with width 0.5mm
	painter.width(1)
	painter.line(0,5,10,5) # line with width 1mm
	painter.width(2)
	painter.line(0,10,10,10) # line with width 2mm

![](doc/example-line-widths.png)

You can change where and at what angle features are added, by using the
translate() and rotate() features:

	painter.translate(10,10)
	painter.rotate(30)
	painter.rect(-5,-5,5,5) # Rectangle is drawn at a 30 degreen angle, centered at (10,10).

![](doc/example-rotate-rect.png)

Calling them multiple times will stack the transformations (they are
calculated as a 2d transformation matrix)

	painter.translate(10,10)
	painter.rect(-5,-5,5,5) # Rectangle is drawn centered at (10,10).
	painter.translate(10,10)
	painter.rect(-5,-5,5,5) # Rectangle is drawn centered at (20,20).
	painter.translate(10,10)
	painter.rect(-5,-5,5,5) # Rectangle is drawn centered at (30,30).

![](doc/example-translate-rect.png)

Saving and restoring the applied tranformation is done using push_matrix()
and pop_matrix(). (Note: This is implemented as a stack, and multiple pushes can be nested):

	for angle in range(0,360,30):
		painter.push_matrix() # Save the current transformation settings
		painter.rotate(angle)
  		painter.translate(10,10)
		painter.rect(-5,-5,5,5)
		painter.pop_matrix() # Restore previous transformation settings

![](doc/example-push-pop-rect.png)

Besides lines and rectangles, there are other basic shapes such as arc(), cirle(), and polygon().

Drawing shapes is ok but the real fun comes from adding components. To add a component,
first use the library editor in KiCad to find the library and footprint name for
the part you want to place. Then, you can add them to your board using the footprint()
command:

	painter.layer('F_Cu')
	painter.footprint(0,0,"LED_SMD","LED_0805_2012Metric")

![](doc/example-add-led.png)

This placed the part, but it won't work well as a part- it's not wired up, so it
won't actually function! Let's add some nets, and a resistor because that
is nicer to the LED. Note that CircuitPainter doesn't know or care about what net
names you assign to what footprints, so be sure to double or triple check that
your circuit is correct:

	painter.layer('F_Cu')
	painter.footprint(0,0,"Resistor_SMD","R_0805_2012Metric",nets=['gnd','led_n'])
	painter.footprint(5,0,"LED_SMD","LED_0805_2012Metric",nets=['led_n','vcc'])
	painter.track(1,0,4,0)

![](doc/example-connect-led.png)

Note: In this example, we are manually drawing a track that just happens to line up
with the centers of the two pads that we want to connect. To see a more exact way
to accomplish this by looking up the positions of each pad, see the asterix example
project.
q
Also note that we didn't specify a net name to assign to the track. pcbnew is able
to figure this out because the starting postiion of the track overlapped with the
second resistor pad, so it assigned the same net to track.	

One LED and resistor is cool, but not that impressive (and honestly more work than
just doing it by hand). However, we can put this into a loop and combine it with
the previous translation operations, to make a ring of LEDs:

	for angle in range(0,360,30):
		painter.push_matrix()
		painter.rotate(angle) # Rotation and translation for the next resistor/led combination
	 	painter.translate(5,0)
   		painter.layer('F_Cu')
		painter.footprint(0,0,"Resistor_SMD","R_0805_2012Metric",nets=['gnd',f'led_{angle}'])
		painter.footprint(5,0,"LED_SMD","LED_0805_2012Metric",nets=[f'led_{angle}','vcc'])
		painter.track(1,0,4,0)

		painter.pop_matrix()
  
![](doc/example-led-ring.png)

Not bad for a few lines of code!

To make a complete board, here is the [rest of the owl](https://knowyourmeme.com/memes/how-to-draw-an-owl):

	from circuitpainter import CircuitPainter
	painter = CircuitPainter()
	
	painter.no_designators() # Don't show reference designator names on the board silkscreen
	painter.layer('F_Cu')
	painter.width(.2)
	
	for angle in range(0,360,36):
	    painter.push_matrix() # Save the current transformation settings
	    painter.rotate(angle)
	    painter.translate(5,0)
	    painter.footprint(0,0,"Resistor_SMD","R_0805_2012Metric",nets=['gnd',f'led_{angle}'])
	    painter.footprint(5,0,"LED_SMD","LED_0805_2012Metric",nets=[f'led_{angle}','vcc'])
	    painter.track(1,0,4,0) # Connect the resistor to the LED
	    painter.track(-1,0,-2,0) # Connect the resistor to ground
	    painter.via(-2,0)
	    painter.track(6,0,7,0) # Connect the LED to vcc
	    painter.via(7,0)
	    painter.pop_matrix()
	
	# Fill the back of the board with a copper zone, and assign it to the 'vcc' net
	painter.layer('B_Cu')
	painter.circle_zone(0,0,14,net='vcc')
	
	# Add a battery connector to the back
	painter.layer('B_Cu')
	painter.footprint(0,0,"Battery","BatteryHolder_Keystone_3000_1x12mm",nets=['vcc','vcc','gnd'])

 	# Make the board shape to a circle
	painter.layer("Edge_Cuts")
	painter.circle(0,0,14)
	
	painter.preview()

 ![](doc/example-rest-of-owl.png)

Note that we've added a battery connector, vias to connect power and ground from each of the LEDs,
and a circular board edge to make it look a little prettier. It's not a bad idea to check DRC:

![](doc/example_led_ring_drc.png)

One you are satisfied with the design, you can either save it for further editing in KiCad
with the .save() command, or go straight to a gerber with the .export_gerber() command.

For more complete examples, see the scripts in the examples directory.

# Advanced usage

The goal of circuitpainter is to make the most common parts of PCB generation
easy, and you might want to do things that this API doesn't directly support.

Note that the underlying pcbnew API is not finished, and will likely be
different between even minor KiCad versions. Using the python help() function
on these object references is a good way to explore their options, though it
gets complicated because they are themselves thin wrappers over the C-language
pcbnew library. Eventually, you'll need to dig through the KiCad source
to figure out how things are supposed to work, and don't forget to check the
bug tracker if things aren't working correctly, because it probably is a bug
and there might be a workaround / fix.

## Extended object properties

Circuit painter aims to keep circuit creation simple, but there are extra configuration
settings on many objects that you might want access to. To facilitate this, all
functions that create a PCB object will also return a reference to that object,
so that you can modify it.

For example, create a rectangular zone, and save the reference to it:

    painter.layer("F_Cu") 
    zone = painter.rect_zone(0,0,10,10)

Then, modify the zone properties using the pcbnew api:

    zone.SetIsRuleArea(True)
    zone.SetDoNotAllowCopperPour(True)
    zone.SetDoNotAllowVias(False)
    zone.SetDoNotAllowTracks(False)
    zone.SetDoNotAllowPads(False)

## Board configuration

Many of the board configuration options (stackup, DRC rules, etc) are
stored in the board design settings. For example, to create a 4-layer board
with some different DRC settings:

    import pcbnew
    settings = painter.pcb.GetDesignSettings()
    settings.SetCopperLayerCount(4) # Change to a 4-layer board design
    settings.m_CopperEdgeClearance = pcbnew.FromMM(0.1) # Set the copper-to-edge spacing to 0.1mm

Note that we are importing 'pcbnew' here, in order to use the FromMM() function
to convert a measurement from mm to KiCad's internal units.

## Updating boards / adding manual edits

Circuit Painter is great for automating parts of designs that are highly repetitive,
but is less effective for more mundane tasks such as wiring up a fancy LED array to
a microcontroller. On this end, everything that CircuitPainter creates is placed into
a single group. When you make manual additions to the board, be sure not to put your
changes into the auto-generated group. Later, if you want to re-generate the automated
portion of your design, you should be able to just delete that group, then start
Circuit Painter by passing it the file name:

	painter = CircuitPainter('my_file.kicad_pcb')

New objects will then be added to that board, in a new group.

# Notes

Wishlist:

* Cooler examples: Fractals such as Apollonian gasket, Sierpinski triangles, Fibonacci spirals?
* Font configuration: Configure a text-type, and have it auto-apply whenever text is drawn (similar to this: https://processing.org/reference/textFont_.html )
* Some way to generate schematics, even if they are terrible and just have each component drawn out separtely, with small wires and net names on each port.
* Place components on path: tool for placing evenly-spaced footprints along a path
* 'Fill' region with equally-spaced or patterned components

Similar nontraditional PCB design tools:

* [SVG-PCB](https://leomcelroy.com/svg-pcb-website/)
* [SVG2Shenzhen](https://github.com/badgeek/svg2shenzhen)

# Credits

CircuitPainter is a simplified interface for KiCad's
[PcbNew](https://www.kicad.org/discover/pcb-design/) library. Their library
does all of the heavy lifting in actually making the PCBs.

CircuitPainter was written by [Matthew Mets](https://github.com/cibomahto)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "circuitpainter",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "kicad, pcb, printed ciruit board, circuit design, skectching",
    "author": null,
    "author_email": "Matthew Mets <matt@blinkinlabs.com>",
    "download_url": "https://files.pythonhosted.org/packages/55/80/8e8fe99b08ab3ab2c5f24a007d682a5dd50f0be8e1d6f487aa97d68457b4/circuitpainter-0.0.9.tar.gz",
    "platform": null,
    "description": "# Circuit Painter\n\n![](doc/lotus_leds.png)\n\nCircuit painter is a creative coding tool for making functional printed\ncircuit boards.\n\nInspired by the simplifed drawing language of Processing, this tool provides\nan environment for designing PCBs using basic geometric shapes such as lines,\narcs, and polygons. The tool maintains a drawing 'context' that applies a\ntranslation and rotation matrix to all calls, making it simple to replicate\ncircuit features at differnt points across a circuit board. Functional PCB\ncomponents such as part footprints can also be placed, and connected together\nlogically using 'nets'.\n\nCircuit painter works as a front end / wrapper for [KiCad's pcbnew](https://www.kicad.org/).\n\n# Installation\n\nRelease versions are available on PyPi:\n\n    pip install circuitpainter\n\nIn addition to the python library, you'll also need KiCad 7.x. The library is\ntested on Ubuntu 22.04, with KiCad 7.0.6 installed from theofficial package\n(https://www.kicad.org/download/), and Python 3.10.7 (the Ubuntu default).\n\nIt should work with any Linux distro,  and might work in Mac/Windows if the\npcbnew library is set up correctly in Python. It should also work with any\nrecent version of Python 3, but will probably only work with KiCad 7.0.6 or\nhigher as their API is not stable.\n\n# Example usage\n\nStart by creating a drawing context:\n\n\tfrom circuitpainter import CircuitPainter\n\tpainter = CircuitPainter()\n\nUsing the painter object, you can draw non-conductive and conductve shapes,\nfootprints, and text onto the PCB.\n\nFirst, set the layer to place the object on (tip: use\nprint(painter.layers.keys()) to show all available layers):\n\n\tpainter.layer('F_SilkS')\n\nNext, draw some non-conductive objects:\n\n\tpainter.circle(0,0,3) # Draw a circle with radius 3 at the board origin\n\tpainter.line(0,0,10,10) # Draw a line from the board origin to (10,10)\n\tpainter.circle(10,10,3) # Draw a circle with raidus 3 at position (10,10)\n\nSo far, there hasn't been any visual indication of what you're making.\nTo get a preview of what your design looks like, use the preview()\nfunction:\n\n\tpainter.preview()\n\nThis will save the design to a temporary location, then open it in the\nKiCad editor:\n\n![](doc/example-two-lines.png)\n\nIt's good for seeing the project, but be careful! The file\nwill be deleted (along with any changes you make), as soon as you close\nthe window. If you do want to save your board at this time, use the 'Save As'\nfeature before exiting the editor!\n\nTo change the width of lines, use the width() command:\n\n\tpainter.width(0.5)\n\tpainter.line(0,0,10,0) # line with width 0.5mm\n\tpainter.width(1)\n\tpainter.line(0,5,10,5) # line with width 1mm\n\tpainter.width(2)\n\tpainter.line(0,10,10,10) # line with width 2mm\n\n![](doc/example-line-widths.png)\n\nYou can change where and at what angle features are added, by using the\ntranslate() and rotate() features:\n\n\tpainter.translate(10,10)\n\tpainter.rotate(30)\n\tpainter.rect(-5,-5,5,5) # Rectangle is drawn at a 30 degreen angle, centered at (10,10).\n\n![](doc/example-rotate-rect.png)\n\nCalling them multiple times will stack the transformations (they are\ncalculated as a 2d transformation matrix)\n\n\tpainter.translate(10,10)\n\tpainter.rect(-5,-5,5,5) # Rectangle is drawn centered at (10,10).\n\tpainter.translate(10,10)\n\tpainter.rect(-5,-5,5,5) # Rectangle is drawn centered at (20,20).\n\tpainter.translate(10,10)\n\tpainter.rect(-5,-5,5,5) # Rectangle is drawn centered at (30,30).\n\n![](doc/example-translate-rect.png)\n\nSaving and restoring the applied tranformation is done using push_matrix()\nand pop_matrix(). (Note: This is implemented as a stack, and multiple pushes can be nested):\n\n\tfor angle in range(0,360,30):\n\t\tpainter.push_matrix() # Save the current transformation settings\n\t\tpainter.rotate(angle)\n  \t\tpainter.translate(10,10)\n\t\tpainter.rect(-5,-5,5,5)\n\t\tpainter.pop_matrix() # Restore previous transformation settings\n\n![](doc/example-push-pop-rect.png)\n\nBesides lines and rectangles, there are other basic shapes such as arc(), cirle(), and polygon().\n\nDrawing shapes is ok but the real fun comes from adding components. To add a component,\nfirst use the library editor in KiCad to find the library and footprint name for\nthe part you want to place. Then, you can add them to your board using the footprint()\ncommand:\n\n\tpainter.layer('F_Cu')\n\tpainter.footprint(0,0,\"LED_SMD\",\"LED_0805_2012Metric\")\n\n![](doc/example-add-led.png)\n\nThis placed the part, but it won't work well as a part- it's not wired up, so it\nwon't actually function! Let's add some nets, and a resistor because that\nis nicer to the LED. Note that CircuitPainter doesn't know or care about what net\nnames you assign to what footprints, so be sure to double or triple check that\nyour circuit is correct:\n\n\tpainter.layer('F_Cu')\n\tpainter.footprint(0,0,\"Resistor_SMD\",\"R_0805_2012Metric\",nets=['gnd','led_n'])\n\tpainter.footprint(5,0,\"LED_SMD\",\"LED_0805_2012Metric\",nets=['led_n','vcc'])\n\tpainter.track(1,0,4,0)\n\n![](doc/example-connect-led.png)\n\nNote: In this example, we are manually drawing a track that just happens to line up\nwith the centers of the two pads that we want to connect. To see a more exact way\nto accomplish this by looking up the positions of each pad, see the asterix example\nproject.\nq\nAlso note that we didn't specify a net name to assign to the track. pcbnew is able\nto figure this out because the starting postiion of the track overlapped with the\nsecond resistor pad, so it assigned the same net to track.\t\n\nOne LED and resistor is cool, but not that impressive (and honestly more work than\njust doing it by hand). However, we can put this into a loop and combine it with\nthe previous translation operations, to make a ring of LEDs:\n\n\tfor angle in range(0,360,30):\n\t\tpainter.push_matrix()\n\t\tpainter.rotate(angle) # Rotation and translation for the next resistor/led combination\n\t \tpainter.translate(5,0)\n   \t\tpainter.layer('F_Cu')\n\t\tpainter.footprint(0,0,\"Resistor_SMD\",\"R_0805_2012Metric\",nets=['gnd',f'led_{angle}'])\n\t\tpainter.footprint(5,0,\"LED_SMD\",\"LED_0805_2012Metric\",nets=[f'led_{angle}','vcc'])\n\t\tpainter.track(1,0,4,0)\n\n\t\tpainter.pop_matrix()\n  \n![](doc/example-led-ring.png)\n\nNot bad for a few lines of code!\n\nTo make a complete board, here is the [rest of the owl](https://knowyourmeme.com/memes/how-to-draw-an-owl):\n\n\tfrom circuitpainter import CircuitPainter\n\tpainter = CircuitPainter()\n\t\n\tpainter.no_designators() # Don't show reference designator names on the board silkscreen\n\tpainter.layer('F_Cu')\n\tpainter.width(.2)\n\t\n\tfor angle in range(0,360,36):\n\t    painter.push_matrix() # Save the current transformation settings\n\t    painter.rotate(angle)\n\t    painter.translate(5,0)\n\t    painter.footprint(0,0,\"Resistor_SMD\",\"R_0805_2012Metric\",nets=['gnd',f'led_{angle}'])\n\t    painter.footprint(5,0,\"LED_SMD\",\"LED_0805_2012Metric\",nets=[f'led_{angle}','vcc'])\n\t    painter.track(1,0,4,0) # Connect the resistor to the LED\n\t    painter.track(-1,0,-2,0) # Connect the resistor to ground\n\t    painter.via(-2,0)\n\t    painter.track(6,0,7,0) # Connect the LED to vcc\n\t    painter.via(7,0)\n\t    painter.pop_matrix()\n\t\n\t# Fill the back of the board with a copper zone, and assign it to the 'vcc' net\n\tpainter.layer('B_Cu')\n\tpainter.circle_zone(0,0,14,net='vcc')\n\t\n\t# Add a battery connector to the back\n\tpainter.layer('B_Cu')\n\tpainter.footprint(0,0,\"Battery\",\"BatteryHolder_Keystone_3000_1x12mm\",nets=['vcc','vcc','gnd'])\n\n \t# Make the board shape to a circle\n\tpainter.layer(\"Edge_Cuts\")\n\tpainter.circle(0,0,14)\n\t\n\tpainter.preview()\n\n ![](doc/example-rest-of-owl.png)\n\nNote that we've added a battery connector, vias to connect power and ground from each of the LEDs,\nand a circular board edge to make it look a little prettier. It's not a bad idea to check DRC:\n\n![](doc/example_led_ring_drc.png)\n\nOne you are satisfied with the design, you can either save it for further editing in KiCad\nwith the .save() command, or go straight to a gerber with the .export_gerber() command.\n\nFor more complete examples, see the scripts in the examples directory.\n\n# Advanced usage\n\nThe goal of circuitpainter is to make the most common parts of PCB generation\neasy, and you might want to do things that this API doesn't directly support.\n\nNote that the underlying pcbnew API is not finished, and will likely be\ndifferent between even minor KiCad versions. Using the python help() function\non these object references is a good way to explore their options, though it\ngets complicated because they are themselves thin wrappers over the C-language\npcbnew library. Eventually, you'll need to dig through the KiCad source\nto figure out how things are supposed to work, and don't forget to check the\nbug tracker if things aren't working correctly, because it probably is a bug\nand there might be a workaround / fix.\n\n## Extended object properties\n\nCircuit painter aims to keep circuit creation simple, but there are extra configuration\nsettings on many objects that you might want access to. To facilitate this, all\nfunctions that create a PCB object will also return a reference to that object,\nso that you can modify it.\n\nFor example, create a rectangular zone, and save the reference to it:\n\n    painter.layer(\"F_Cu\") \n    zone = painter.rect_zone(0,0,10,10)\n\nThen, modify the zone properties using the pcbnew api:\n\n    zone.SetIsRuleArea(True)\n    zone.SetDoNotAllowCopperPour(True)\n    zone.SetDoNotAllowVias(False)\n    zone.SetDoNotAllowTracks(False)\n    zone.SetDoNotAllowPads(False)\n\n## Board configuration\n\nMany of the board configuration options (stackup, DRC rules, etc) are\nstored in the board design settings. For example, to create a 4-layer board\nwith some different DRC settings:\n\n    import pcbnew\n    settings = painter.pcb.GetDesignSettings()\n    settings.SetCopperLayerCount(4) # Change to a 4-layer board design\n    settings.m_CopperEdgeClearance = pcbnew.FromMM(0.1) # Set the copper-to-edge spacing to 0.1mm\n\nNote that we are importing 'pcbnew' here, in order to use the FromMM() function\nto convert a measurement from mm to KiCad's internal units.\n\n## Updating boards / adding manual edits\n\nCircuit Painter is great for automating parts of designs that are highly repetitive,\nbut is less effective for more mundane tasks such as wiring up a fancy LED array to\na microcontroller. On this end, everything that CircuitPainter creates is placed into\na single group. When you make manual additions to the board, be sure not to put your\nchanges into the auto-generated group. Later, if you want to re-generate the automated\nportion of your design, you should be able to just delete that group, then start\nCircuit Painter by passing it the file name:\n\n\tpainter = CircuitPainter('my_file.kicad_pcb')\n\nNew objects will then be added to that board, in a new group.\n\n# Notes\n\nWishlist:\n\n* Cooler examples: Fractals such as Apollonian gasket, Sierpinski triangles, Fibonacci spirals?\n* Font configuration: Configure a text-type, and have it auto-apply whenever text is drawn (similar to this: https://processing.org/reference/textFont_.html )\n* Some way to generate schematics, even if they are terrible and just have each component drawn out separtely, with small wires and net names on each port.\n* Place components on path: tool for placing evenly-spaced footprints along a path\n* 'Fill' region with equally-spaced or patterned components\n\nSimilar nontraditional PCB design tools:\n\n* [SVG-PCB](https://leomcelroy.com/svg-pcb-website/)\n* [SVG2Shenzhen](https://github.com/badgeek/svg2shenzhen)\n\n# Credits\n\nCircuitPainter is a simplified interface for KiCad's\n[PcbNew](https://www.kicad.org/discover/pcb-design/) library. Their library\ndoes all of the heavy lifting in actually making the PCBs.\n\nCircuitPainter was written by [Matthew Mets](https://github.com/cibomahto)\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Sketching interface for macking function printed circuit boards",
    "version": "0.0.9",
    "project_urls": {
        "Home": "https://github.com/blinkinlabs/pcb_painter"
    },
    "split_keywords": [
        "kicad",
        " pcb",
        " printed ciruit board",
        " circuit design",
        " skectching"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "12726b66829508c5826ef5592e4306f14b3f89c62eeee7251423adf8e9910dc0",
                "md5": "e30d53d1e0530eaadbf8c6ab1fb28fdb",
                "sha256": "c6848388702699dc8fbafa658e7ea41be34bbb44201125d3f203cadc94fd93db"
            },
            "downloads": -1,
            "filename": "circuitpainter-0.0.9-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e30d53d1e0530eaadbf8c6ab1fb28fdb",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": null,
            "size": 15443,
            "upload_time": "2024-04-21T15:04:43",
            "upload_time_iso_8601": "2024-04-21T15:04:43.326136Z",
            "url": "https://files.pythonhosted.org/packages/12/72/6b66829508c5826ef5592e4306f14b3f89c62eeee7251423adf8e9910dc0/circuitpainter-0.0.9-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "55808e8fe99b08ab3ab2c5f24a007d682a5dd50f0be8e1d6f487aa97d68457b4",
                "md5": "a4a52f68e26aafbf26e83e24e5f632c3",
                "sha256": "850c0aa529260070793831b373ac650b704f03e61a4cbfff76332f97d2a1d84c"
            },
            "downloads": -1,
            "filename": "circuitpainter-0.0.9.tar.gz",
            "has_sig": false,
            "md5_digest": "a4a52f68e26aafbf26e83e24e5f632c3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 4390617,
            "upload_time": "2024-04-21T15:04:46",
            "upload_time_iso_8601": "2024-04-21T15:04:46.271008Z",
            "url": "https://files.pythonhosted.org/packages/55/80/8e8fe99b08ab3ab2c5f24a007d682a5dd50f0be8e1d6f487aa97d68457b4/circuitpainter-0.0.9.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-21 15:04:46",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "blinkinlabs",
    "github_project": "pcb_painter",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "circuitpainter"
}
        
Elapsed time: 0.31745s