# GDSPY README
[![Boost Software License - Version 1.0](https://img.shields.io/github/license/heitzmann/gdspy.svg)](http://www.boost.org/LICENSE_1_0.txt)
[![Documentation Status](https://readthedocs.org/projects/gdspy/badge/?version=stable)](https://gdspy.readthedocs.io/en/stable/?badge=stable)
[![tests](https://github.com/heitzmann/gdspy/actions/workflows/testing.yml/badge.svg)](https://github.com/heitzmann/gdspy/actions/workflows/testing.yml)
[![Appveyor Status](https://ci.appveyor.com/api/projects/status/pr49a6bhxvbqwocy?svg=true)](https://ci.appveyor.com/project/heitzmann/gdspy)
[![Downloads](https://img.shields.io/github/downloads/heitzmann/gdspy/total.svg)](https://github.com/heitzmann/gdspy/releases)
Gdspy is a Python module for creation and manipulation of GDSII stream files.
Key features for the creation of complex CAD layouts are included:
* Boolean operations on polygons (AND, OR, NOT, XOR) based on clipping algorithm
* Polygon offset (inward and outward rescaling of polygons)
* Efficient point-in-polygon solutions for large array sets
Gdspy also includes a simple layout viewer.
Typical applications of Gdspy are in the fields of electronic chip design, planar lightwave circuit design, and mechanical engineering.
## Future of Gdspy
In trying to improve the performance of Gdspy for large layouts, we ended up concluding that the best way to reach our goal was to rewrite the critical parts of the library as a C extension.
It turns out that beside obvious functions, method calling has a big impact in performance due to the overhead it introduces.
The best solution was to re-design the whole project as a C++ library with a thin Python wrapper: thus was born [Gdstk, the GDSII Tool Kit](https://github.com/heitzmann/gdstk).
Therefore, version 1.6 will be the last major release of Gdspy, with development focused only on bug fixes.
Users are encouraged to move from Gdspy to Gdstk: although their API is not 100% compatible, the new module should be familiar enough to allow a quick transition.
## Installation
### Dependencies:
* [Python](https://www.python.org/) (tested with versions 2.7, 3.6, 3.7, and 3.8)
* [Numpy](http://numpy.scipy.org/)
* C compiler (needed only if built from source)
* Tkinter (optional: needed for the `LayoutViewer` GUI)
* [Sphinx](https://www.sphinx-doc.org/) (optional: to build the documentation)
### Linux / OS X
Option 1: using [pip](https://docs.python.org/3/installing/):
```sh
python -m pip install --user gdspy
```
Option 2: download the source from [github](https://github.com/heitzmann/gdspy) and build/install with:
```sh
python setup.py install
```
### Windows
The preferred option is to install pre-compiled binaries from [here](https://github.com/heitzmann/gdspy/releases).
Installation via `pip` and building from source as above are also possible, but an appropriate [build environment](https://wiki.python.org/moin/WindowsCompilers) is required for compilation of the C extension modules.
## Documentation
The complete documentation is available [here](http://gdspy.readthedocs.io/).
The source files can be found in the `docs` directory.
## Support
Help support Gdspy development by [donating via PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JD2EUE2WPPBQQ)
## History of changes
### Version 1.6.12 (Jun 2, 2022)
* Fix in `Cell.get_texttypes`.
* Allow labels to inherit transforms through `get_labels`.
### Version 1.6.11 (Jan 14, 2022)
* Fix in `Cell.write_svg` when missing references.
* Speed improvements in `Cell.remove_polygons` (thanks Troy for the contribution).
### Version 1.6.10 (Nov 14, 2021)
* Fix in `Cell.get_polygons`
### Version 1.6.9 (Sep 23, 2021)
* Fix in `Cell.get_polygons` with specified layer and datatype.
* Raise error for duplicate cells when reading a GDSII file.
### Version 1.6.8 (Aug 2, 2021)
* Fix in `boolean` for complex geometries that freeze the operation.
### Version 1.6.7 (Jul 14, 2021)
* Fixes in `boolean` for bugs with self-intersecting holes and holes horizontal edges.
* Fix bug in warning message.
### Version 1.6.6 (Jun 09, 2021)
* Fix error in `Path.smooth` not finding `_hobby` function.
* Allow precision specification in SVG output.
### Version 1.6.5 (Jun 08, 2021)
* Support GDSII files with 0-padding at the end.
* Allow fixing and modifying GDSII file timestamps.
* *Thanks Troy Tamas and Joaquin Matres for the fixes*
### Version 1.6.4 (Apr 23, 2021)
* Fix missing module import (thanks Troy Tamas for the fix).
### Version 1.6.3 (Dec 28, 2020)
* Fix bounding box edge case (thanks Troy Tamas for the fix).
### Version 1.6.2 (Dec 18, 2020)
* More efficient bounding box calculation (thanks to Troy Tamas for the contribution).
* Fix Label creation bug.
### Version 1.6.1 (Oct 22, 2020)
* Fix SVG output when `Label` contains special characters.
### Version 1.6 (Aug 12, 2020)
* Added support for element properties.
* Added transformation support to `Cell.copy`.
* Layer/datatype filtering in `get_polygons` for `Cell`, `CellReference` and `CellArray`.
* Layer/datatype filtering in `LayoutViewer`.
* Removed global cache `_bounding_boxes`. Only cells cache their bounding boxes.
* Bug fixes (thanks Daniel Hwang for the contributions).
* Bug fix in `Cell.copy` where the whole dependency tree would be copied on a deep copy creation.
### Version 1.5.2 (Feb 01, 2020)
* Added support for importing GDSII files containing BOX elements.
* Bug fix in `GdsLibrary.extract` (thanks collineps for finding the problem).
### Version 1.5 (Dec 20, 2019)
* New `Cell.write_svg` function to export an SVG image of the cell.
* New `GdsLibrary.new_cell` function to quickly create and add cells to a library.
* `GdsLibrary.add` can update references when a cell is overwritten.
* Added `GdsLibrary.remove` to allow cells to be properly removed from libraries.
* Added `GdsLibrary.rename_cell` to rename cells in libraries.
* Added `GdsLibrary.replace_references` to easily replace referenced cells in libraries.
* `GdsLibrary.add` can add dependencies recursively.
* Iterating over `GdsLibrary` objects yields all its cells.
* Iterating over `Cell` objects yield all its polygons, paths, labels and references.
* Breaking change to `*.to_gds` functions in order to improve write efficiency (this should not be a problem for most users, since `gdspy.write_gds` and `Cell.write_gds` remain the same).
* Breaking change: renamed `GdsLibrary.cell_dict` to `GdsLibrary.cells`.
* Deprecated: `gdspy.current_library`, `gdspy.write_gds`, `gdspy.fast_boolen`, `GdsLibrary.extract`.
* Bug fixes and better tests for `FlexPath` and `RobustPath`.
### Version 1.4.3 (Nov 11, 2019)
* Bug fix for `FlexPath` and `RobustPath` references.
### Version 1.4.2 (Oct 01, 2019)
* Bug fix in `FlexPath`.
### Version 1.4.1 (Sep 20, 2019)
* Bug fixes (thanks to DerekK88 and Sequencer for the patches).
### Version 1.4 (May 18, 2019)
* Revised [documentation](http://gdspy.readthedocs.io/).
* New `FlexPath` and `RobustPath` classes: more efficient path generation when using the original GDSII path specification.
* New `Curve` class: SVG-like polygon creation.
* Added `PolygonSet.mirror` (thanks to Daan Waardenburg for the contribution).
* Added `Path.bezier` to create paths based on Bézier curves.
* Added `Path.smooth` to create paths based on smooth interpolating curves.
* Added `get_gds_units` to get units used in a GDSII file without loading.
* Added `get_binary_cells` to load only the binary GDSII representation of cell from a file.
* Added argument `tolerance` to `Round`, `Path.arc`, `Path.turn`, and `Path.parametric` to automatically control the number of points in the final polygons.
* Added argument `binary_cells` to GDSII writing functions to support `get_binary_cells`.
* Added argument `rename_template` to `GdsLibrary.read_gds` for flexible cell renaming (thanks to @yoshi74ls181 for the contribution).
* Changed return value of `slice` to avoid creating empty `PolygonSet`.
* Added argument `times