def filter_command( lines: vp.LineCollection, min_length: Optional[float], max_length: Optional[float], closed: bool, not_closed: bool, tolerance: float, ) -> vp.LineCollection: """Filter paths according to specified criterion. When an option is provided (e.g. `--min-length 10cm`) the corresponding criterion is applied and paths which do not respect the criterion (e.g. a 9cm-long path) are rejected. If multiple options are provided, paths will be kept only if they respect every corresponding criterion (i.e. logical AND operator). """ keys = [] if min_length is not None: keys.append( lambda line: vp.line_length(line) >= cast(float, min_length)) if max_length is not None: keys.append( lambda line: vp.line_length(line) <= cast(float, max_length)) if closed: keys.append(lambda line: vp.is_closed(line, tolerance)) if not_closed: keys.append(lambda line: not vp.is_closed(line, tolerance)) if keys: lines.filter(lambda line: vp.union(line, keys)) else: logging.warning( "filter: no criterion was provided, all geometries are preserved") return lines
def test_line_length(line, length): assert vp.line_length(np.array(line, dtype=complex)) == length