2015-08-24 3 views
1

Я пытаюсь использовать Clipper Python bindings, чтобы скопировать строку, используя многоугольник. Но процесс происходит сбой внутри креплений или библиотека клипера:pyclipper: Crash on trivial case («terminate called throwing exception»)

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?

ответ

2

Я попробовал ваш пример с 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) 

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

+0

Кажется, что это действительно было причиной. Я заменил вызов 'Execute' на ваш код и заменил вызов на' print() 'на' print ([i.Contour for i в solution.Childs]) '. Теперь я получаю правильное решение '[[[0.0, 0.0], [1.0, 0.0]]]'. Благодаря! – Feuermurmel

+0

Отлично! Помните, что результат, полученный вами из 'Execute2', является деревом, поэтому печать таким образом будет работать только тогда, когда глубина дерева равна 1. Вы можете использовать функцию' pyclipper.PolyTreeToPaths', чтобы преобразовать ее в список путей. Затем вы можете напечатать то, как вы это делали раньше. – greginvm

+0

О, спасибо за указатель. 'print (pyclipper.PolyTreeToPaths (solution))' it is. – Feuermurmel