pyclipper: сбой в тривиальном случае (завершение называется созданием исключения)

Я пытаюсь использовать Clipper Python bindings, чтобы обрезать линию с помощью многоугольника. Но процесс падает внутри привязок или библиотеки clipper:

import pyclipper

pc = pyclipper.Pyclipper()

# Add a single line as the subject.
pc.AddPath([(-1, -1), (2, 1)], pyclipper.PT_SUBJECT, False)

# Add a square as the clipping region.
pc.AddPath([(0, 0), (1, 0), (1, 1), (0, 1)], pyclipper.PT_CLIP, True)

# Clip the line using the rectangle.
solution = pc.Execute(pyclipper.CT_INTERSECTION, pyclipper.PFT_NONZERO, pyclipper.PFT_NONZERO)

print(solution)

Когда я запускаю приведенный выше код, процесс завершается во время вызова pc.Execute() со следующим сообщением, записанным в стандартную ошибку:

libc++abi.dylib: terminate called throwing an exception

Я использую Python 3.4.3 в OS X 10.8.5 с новейшей версией pyclipper (0.9.3b0), доступной в PyPI, которая использует Clipper 6.2.1.

Я делаю что-то не так или это ошибка либо в Clipper, либо в pyclipper?


person Feuermurmel    schedule 24.08.2015    source источник


Ответы (1)


Я попробовал ваш пример с Python 3.4.3 в Ubuntu 15.04 и получил следующую ошибку:

terminate called after throwing an instance of 'ClipperLib::clipperException'
  what():  Error: PolyTree struct is need for open path clipping.

Как говорится в сообщении об ошибке, структура PolyTree должна использоваться при обрезке открытых путей.

Библиотека Clipper имеет 2 функции с именами Execute в классе Clipper. Один принимает Paths в качестве типа параметра решения, другой принимает PolyTree в качестве типа параметра решения. Как говорится в сообщении об ошибке, в вашем случае вы должны использовать второй. Вторая функция вызывается в функции Pyclipper::Execute2. Поэтому замените строку 12 на следующую, чтобы использовать правильные типы:

solution = pc.Execute2(pyclipper.CT_INTERSECTION, pyclipper.PFT_NONZERO, pyclipper.PFT_NONZERO)

Пожалуйста, сообщите, если это решит вашу проблему.

person greginvm    schedule 31.08.2015
comment
Похоже, это действительно было причиной. Я заменил вызов Execute вашим кодом, а вызов print() заменил на print([i.Contour for i in solution.Childs]). Теперь я получаю правильное решение [[[0.0, 0.0], [1.0, 0.0]]]. Спасибо! - person Feuermurmel; 31.08.2015
comment
Большой! Имейте в виду, что результатом, который вы получаете от Execute2, является дерево, поэтому печать таким образом будет работать только тогда, когда глубина дерева равна 1. Вы можете использовать функцию pyclipper.PolyTreeToPaths, чтобы преобразовать его в список путей. Затем вы можете печатать так, как вы делали это раньше. - person greginvm; 01.09.2015
comment
О, спасибо за указатель. print(pyclipper.PolyTreeToPaths(solution)) это так. - person Feuermurmel; 01.09.2015