Skip to content

Commit 8eb97d2

Browse files
committed
Profile mk3 - errors handling.
1 parent 6e5d2f5 commit 8eb97d2

File tree

4 files changed

+34
-19
lines changed

4 files changed

+34
-19
lines changed

nodes/script/profile_mk3.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,8 @@ def process(self):
667667
curves_form = Interpreter.NURBS if self.nurbs_out else None
668668
interpreter = Interpreter(self, input_names,
669669
curves_form=curves_form,
670-
z_axis=self.selected_axis)
670+
z_axis=self.selected_axis,
671+
logger = self.sv_logger)
671672
interpreter.interpret(profile, variables)
672673
verts = self.extend_out_verts(interpreter.vertices)
673674
result_vertices.append(verts)

utils/modules/profile_mk3/interpreter.py

+25-13
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@
2323
from mathutils.geometry import interpolate_bezier
2424
from mathutils import Vector, Matrix
2525

26-
from sverchok.utils.sv_logging import sv_logger
2726
from sverchok.utils.geom import interpolate_quadratic_bezier
2827
from sverchok.utils.sv_curve_utils import Arc
2928
from sverchok.utils.nurbs_common import SvNurbsMaths
3029
from sverchok.utils.curve import SvCircle, SvLine, SvBezierCurve, SvCubicBezierCurve
3130
import sverchok.utils.curve.knotvector as sv_knotvector
3231
from sverchok.utils.curve.nurbs_solver import SvNurbsCurveControlPoints
3332
from sverchok.utils.curve.nurbs_solver_applications import prepare_solver_for_interpolation
33+
from sverchok.utils.sv_logging import get_logger, sv_logger
34+
35+
class SvProfileException(Exception):
36+
__description__ = "Error in profile definition"
3437

3538
def make_functions_dict(*functions):
3639
return dict([(function.__name__, function) for function in functions])
@@ -73,14 +76,15 @@ def __eq__(self, other):
7376
return isinstance(other, Expression) and self.string == other.string
7477

7578
@classmethod
76-
def from_string(cls, string):
79+
def from_string(cls, string, logger=None):
7780
try:
7881
string = string[1:][:-1]
7982
expr = ast.parse(string, mode='eval')
8083
return Expression(expr, string)
8184
except Exception as e:
82-
print(e)
83-
print(string)
85+
if logger is None:
86+
logger = get_logger()
87+
logger.warning(f"Cannot parse expression «{string}»: {e}")
8488
return None
8589

8690
def eval_(self, variables):
@@ -338,7 +342,7 @@ def interpret(self, interpreter, variables):
338342
v1 = (x, y0)
339343
interpreter.position = v1
340344
verts = self._interpolate(v0, v1, num_segments)
341-
# sv_logger.debug("V0 %s, v1 %s, N %s => %s", v0, v1, num_segments, verts)
345+
#interpreter.logger.debug("V0 %s, v1 %s, N %s => %s", v0, v1, num_segments, verts)
342346
for vertex in verts[1:]:
343347
v_index = interpreter.new_vertex(*vertex)
344348
interpreter.new_edge(prev_index, v_index)
@@ -1029,7 +1033,7 @@ def get_variables(self):
10291033
def interpret(self, interpreter, variables):
10301034
interpreter.assert_not_closed()
10311035
if not interpreter.has_last_vertex:
1032-
sv_logger.info("X statement: no current point, do nothing")
1036+
interpreter.logger.warning("X statement: no current point, do nothing")
10331037
return
10341038

10351039
v0 = interpreter.vertices[0]
@@ -1063,7 +1067,11 @@ def get_variables(self):
10631067
def interpret(self, interpreter, variables):
10641068
interpreter.assert_not_closed()
10651069
if not interpreter.has_last_vertex:
1066-
sv_logger.info("X statement: no current point, do nothing")
1070+
interpreter.logger.warning("X statement: no current point, do nothing")
1071+
return
1072+
1073+
if interpreter.close_first_index >= len(interpreter.vertices):
1074+
interpreter.logger.warning("X statement: curve was not started")
10671075
return
10681076

10691077
v0 = interpreter.vertices[interpreter.close_first_index]
@@ -1100,7 +1108,7 @@ def get_optional_inputs(self):
11001108

11011109
def interpret(self, interpreter, variables):
11021110
if self.name in interpreter.defaults:
1103-
raise Exception("Value for the `{}' variable has been already assigned!".format(self.name))
1111+
raise SvProfileException(f"Value for the `{self.name}' variable has been already assigned!")
11041112
if self.name not in interpreter.input_names:
11051113
value = interpreter.eval_(self.value, variables)
11061114
interpreter.defaults[self.name] = value
@@ -1133,7 +1141,7 @@ class Interpreter(object):
11331141
NURBS = 'NURBS'
11341142
BEZIER = 'BEZIER'
11351143

1136-
def __init__(self, node, input_names, curves_form = None, force_curves_form = False, z_axis='Z'):
1144+
def __init__(self, node, input_names, curves_form = None, force_curves_form = False, z_axis='Z', logger=None):
11371145
self.position = (0, 0)
11381146
self.next_vertex_index = 0
11391147
self.segment_start_index = 0
@@ -1156,6 +1164,10 @@ def __init__(self, node, input_names, curves_form = None, force_curves_form = Fa
11561164
self.curves_form = curves_form
11571165
self.force_curves_form = force_curves_form
11581166
self.z_axis = z_axis
1167+
if logger is None:
1168+
self.logger = get_logger()
1169+
else:
1170+
self.logger = logger
11591171

11601172
def to3d(self, vertex):
11611173
if self.z_axis == 'X':
@@ -1175,7 +1187,7 @@ def to3d_np(self, vertex):
11751187

11761188
def assert_not_closed(self):
11771189
if self.closed:
1178-
raise Exception("Path was already closed, will not process any further directives!")
1190+
raise SvProfileException("Path was already closed, will not process any further directives!")
11791191

11801192
def relative(self, x, y):
11811193
x0, y0 = self.position
@@ -1210,14 +1222,14 @@ def new_curve(self, curve, statement):
12101222
curve = curve.to_nurbs()
12111223
else:
12121224
if self.force_curves_form:
1213-
raise Exception(f"Cannot convert curve to NURBS: {statement}")
1225+
raise SvProfileException(f"Cannot convert curve to NURBS: {statement}")
12141226
elif self.curves_form == Interpreter.BEZIER:
12151227
if not isinstance(curve, (SvBezierCurve, SvCubicBezierCurve)):
12161228
if hasattr(curve, 'to_bezier'):
12171229
curve = curve.to_bezier()
12181230
else:
12191231
if self.force_curves_form:
1220-
raise Exception("Cannot convert curve to Bezier: {statement}")
1232+
raise SvProfileException(f"Cannot convert curve to Bezier: {statement}")
12211233
self.curves.append(curve)
12221234

12231235
def new_line_segment(self, v1, v2):
@@ -1262,6 +1274,6 @@ def interpret(self, profile, variables):
12621274
if not profile:
12631275
return
12641276
for statement in profile:
1265-
sv_logger.debug("Interpret: %s", statement)
1277+
self.logger.debug("Interpret: %s", statement)
12661278
statement.interpret(self, variables)
12671279

utils/modules/profile_mk3/parser.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919
import re
2020

2121
from sverchok.utils.parsec import *
22-
from sverchok.utils.sv_logging import sv_logger
22+
from sverchok.utils.sv_logging import get_logger
2323
from sverchok.utils.modules.profile_mk3.interpreter import *
2424

25+
logger = get_logger()
26+
2527
#########################################
2628
# DSL parsing
2729
#########################################
@@ -32,7 +34,7 @@
3234

3335
def parse_expr(src):
3436
for string, rest in parse_regexp(expr_regex)(src):
35-
expr = Expression.from_string(string)
37+
expr = Expression.from_string(string, logger=logger)
3638
if expr is not None:
3739
yield expr, rest
3840

@@ -261,6 +263,6 @@ def parse_profile(src):
261263
cleaned = cleaned + " " + line
262264

263265
profile = parse(parse_definition, cleaned)
264-
sv_logger.debug(profile)
266+
logger.debug(profile)
265267
return profile
266268

utils/parsec.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,9 @@ def parse(func, s):
218218
s = s.strip()
219219
match = list(func(s))
220220
if len(match) != 1:
221-
raise ValueError("invalid syntax: " + str(match))
221+
raise SyntaxError("invalid syntax: " + str(match))
222222
result, rest = match[0]
223223
if rest.strip():
224-
raise ValueError("parsed: {}\nleftover: {}".format(result, rest))
224+
raise SyntaxError("parsed: {}\nunparsed part: {}".format(result, rest))
225225
return result
226226

0 commit comments

Comments
 (0)