Skip to main content

Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.2.1)

Project description

About

Pyclipper is a Cython wrapper exposing public functions and classes of the C++ translation of the Angus Johnson’s Clipper library (ver. 6.2.1).

Pyclipper releases were tested with Python 2.7 and 3.4 on Linux (Ubuntu 14.04, x64) and Windows (8.1, x64).

Source code is available on GitHub.

About Clipper

Clipper - an open source freeware library for clipping and offsetting lines and polygons.

The Clipper library performs line & polygon clipping - intersection, union, difference & exclusive-or, and line & polygon offsetting. The library is based on Vatti’s clipping algorithm.

Angus Johnson’s Clipper library

Install

Dependencies

Cython dependency is optional. Cpp sources generated with Cython are available in releases.

Note on using the setup.py:

setup.py operates in 2 modes that are based on the presence of the dev file in the root of the project.

  • When dev is present, Cython will be used to compile the .pyx sources. This is the development mode (as you get it in the git repository).

  • When dev is absent, C/C++ compiler will be used to compile the .cpp sources (that were prepared in in the development mode). This is the distribution mode (as you get it on PyPI).

This way the package can be used without or with an incompatible version of Cython.

The idea comes from Matt Shannon’s bandmat library.

From PyPI

Cython not required.

pip install pyclipper

From source

Cython required.

Clone the repository:

git clone git@github.com:greginvm/pyclipper.git

Install:

python setup.py install

After every modification of .pyx files compile with Cython:

python setup.py build_ext --inplace

Clippers’ preprocessor directives

Clipper can be compiled with the following preprocessor directives: use_int32, use_xyz, use_lines and use_deprecated. Among these the use_int32 and use_lines can be used with Pyclipper.

  • use_int32 - when enabled 32bit ints are used instead of 64bit ints. This improve performance but coordinate values are limited to the range +/- 46340. In Pyclipper this directive is disabled by default.

  • use_lines - enables line clipping. Adds a very minor cost to performance. In Pyclipper this directive is enabled by default (since version 0.9.2b0).

In case you would want to change these settings, clone this repository and change the define_macros collection (setup.py, pyclipper extension definition). Add a set like ('use_int32', 1) to enable the directive, or remove the set to disable it. After that you need to rebuild the package.

How to use

This wrapper library tries to follow naming conventions of the original library.

  • ClipperLib namespace is represented by the pyclipper module,

  • classes Clipper and ClipperOffset -> Pyclipper and Pyclipper and PyclipperOffset,

  • when Clipper is overloading functions with different number of parameters or different types (eg. Clipper.Execute, one function fills a list of paths the other PolyTree) that becomes Pyclipper.Execute and Pyclipper.Execute2.

Basic example (based on Angus Johnson’s Clipper library):

import pyclipper

subj = (
    ((180, 200), (260, 200), (260, 150), (180, 150)),
    ((215, 160), (230, 190), (200, 190))
)
clip = ((190, 210), (240, 210), (240, 130), (190, 130))

pc = pyclipper.Pyclipper()
pc.AddPath(clip, pyclipper.PT_CLIP, True)
pc.AddPaths(subj, pyclipper.PT_SUBJ, True)

solution = pc.Execute(pyclipper.CT_INTERSECTION, pyclipper.PFT_EVENODD, pyclipper.PFT_EVENODD)

The Clipper library uses integers instead of floating point values to preserve numerical robustness. You can use pyclipper.SCALING_FACTOR to scale your values to preserve the desired presision. The default value is 1, which disables scaling. Scaling factor is also applied to the relevant parameters.

For more examples of use see tests/test_pyclipper.py and Clipper documentation.

Authors

License

  • Pyclipper is available under MIT license.

  • The core Clipper library is available under Boost Software License. Freeware for both open source and commercial applications.

Changelog

0.9.3b0

  • Applied SCALING_FACTOR to the relevant function parameters and class properties

  • Refactored tests

0.9.2b1

  • bug fix: Fix setting of the PyPolyNode.IsHole property

0.9.2b0

  • enable preprocessor directive use_lines by default,

  • bug fix: PyPolyNode.Contour that is now one path and not a list of paths as it was previously.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyclipper-0.9.3b0.tar.gz (94.0 kB view details)

Uploaded Source

File details

Details for the file pyclipper-0.9.3b0.tar.gz.

File metadata

  • Download URL: pyclipper-0.9.3b0.tar.gz
  • Upload date:
  • Size: 94.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pyclipper-0.9.3b0.tar.gz
Algorithm Hash digest
SHA256 6a958542e4e327a06628409d70c012f81692f8f09a28fd4af968278ee9a2c255
MD5 a5b15e70114f317f88e3343fd99baf0d
BLAKE2b-256 e1a2d080e238dc9c536316fe70ee22b32cf017e3afc33c3576811b9f84769627

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page