From bf1968c51a62ae0fb5823750397181ab05ba0b86 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 29 May 2024 11:09:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-rtr/pribor-rtr.gd | 44 ++++++++++----------------------- scripts/tools.gd | 43 ++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/scenes/pribor-rtr/pribor-rtr.gd b/scenes/pribor-rtr/pribor-rtr.gd index a95a3d9..d5eb2fa 100644 --- a/scenes/pribor-rtr/pribor-rtr.gd +++ b/scenes/pribor-rtr/pribor-rtr.gd @@ -4,12 +4,6 @@ extends "res://scenes/контроль/прибор.gd" static var json_parser: JSON = JSON.new() -func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int): - for i in range(i0, i1): - if s_in[i] != '\'': - s_out[0] += s_in[i] - - func get_paths(meta: String, paths: Array): paths.clear() var i_chs = [] @@ -24,7 +18,7 @@ func get_paths(meta: String, paths: Array): var i0 = 0 for i1 in i_chs: var ss: = [String()] - get_string_slice(meta, ss, i0, i1) + tools.get_string_slice(meta, ss, i0, i1) if ss[0].is_valid_int(): paths.append(ss[0].to_int()) else: @@ -47,30 +41,18 @@ func _on_request_rtr_request_completed(result, _response_code, _headers, body: P log.error('ошибка при разборе: \"%s\"' % err) return + for child in $konverter/grid.get_children(): + map_to_konverter_item(json_parser.data, child, 'path_value0', 'value0') + map_to_konverter_item(json_parser.data, child, 'path_value1', 'value1') + map_to_konverter_item(json_parser.data, child, 'path_value2', 'value2') + + +func map_to_konverter_item(data, item, meta_name: String, value_name: String): var paths: = Array() var ret_val: = [null] - var meta: = String() - - for child in $konverter/grid.get_children(): - meta = child.get_meta('path_value0') - get_paths(meta, paths) - get_value_by_path(json_parser.data, paths, ret_val) - child.value0 = ret_val[0] - - meta = child.get_meta('path_value1') - get_paths(meta, paths) - get_value_by_path(json_parser.data, paths, ret_val) - child.value1 = ret_val[0] - - meta = child.get_meta('path_value2') - get_paths(meta, paths) - get_value_by_path(json_parser.data, paths, ret_val) - child.value2 = ret_val[0] - - -func get_value_by_path(obj, indexes: Array, ret_val: Array): - var index = indexes.pop_at(0) - if indexes.size(): - get_value_by_path(obj[index], indexes, ret_val) + var meta: = item.get_meta(meta_name) as String + get_paths(meta, paths) + if tools.get_value_by_path(data, paths, ret_val): + item.set(value_name, ret_val[0]) else: - ret_val[0] = obj[index] + push_error('ошибка: поле по пути %s для \"%s:%s\" (\"%s\") не найдено' % [paths, item.name, meta_name, value_name]) diff --git a/scripts/tools.gd b/scripts/tools.gd index b82dfb5..3e5a485 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -15,7 +15,7 @@ func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) func radians(val: float): return (val * PI) / 180.0 -## Возвращает значение из байтового массива в 16 битном слове[br] +## Возвращает значение из байтового массива в 16 битном слове.[br] ## [i]Следует использовать встроенные в[/i] [b]PackedByteArray[/b] [i]методы вместо этой функции.[/i] func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256) @@ -25,7 +25,46 @@ func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y) ## Проверяет пересечение диапазона [param x1], [param x2] с диапазоном [param y1], [param y2] -func is_overlap(x1, x2, y1, y2): return max(x1, y1) <= min(x2, y2) +func is_overlap(x1, x2, y1, y2) -> bool: return max(x1, y1) <= min(x2, y2) + + +func _check_index(obj, index) -> bool: + if (obj is Dictionary) and not obj.has(index): + return false + elif (obj is Array) and (index is int): + if index < 0 and index >= obj.size(): + return false + return true + + +## Возвращает значение поля хранящегося по указанному пути внутри объекта.[br] +## [param obj] - Объект в котором хранится поле, должен быть [b]Dictionary[/b].[br] +## [param paths] - Массив содержащий путь к полю значения, включая его имя[br] +## [param ret_val] - Массив из одного элемента. После вызова, содержит значение искомого поля.[br] +func get_value_by_path(obj, paths: Array, ret_val: Array) -> bool: + var index = paths.pop_at(0) + if paths.size(): + if _check_index(obj, index): + get_value_by_path(obj[index], paths, ret_val) + else: + return false + else: + if _check_index(obj, index): + ret_val[0] = obj[index] + else: + return false + return true + + +## Возвращает часть от входной строки ограниченную индексами символов.[br] +## [param s_in] - Входная строка.[br] +## [param s_out] - Массив содержащий выходную строку.[br] +## [param i0] - Индекс начала части строки.[br] +## [param i1] - Индекс конца части строки. Возвращает все символы до этого индекса. +func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int): + for i in range(i0, i1): + if s_in[i] != '\'': + s_out[0] += s_in[i] ## Производит преобразование из декартовой в полярную систему координат