Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
GraphEdit
Успадковує: Control < CanvasItem < Node < Object
Редактор графоподібних структур із використанням GraphNode.
Опис
GraphEdit надає інструменти для створення, обробки та відображення різноманітних графіків. Його основне призначення в движку — підтримка систем візуального програмування, таких як візуальні шейдери, але він також доступний для використання в проектах користувачів.
GraphEdit сам по собі є лише порожнім контейнером, що представляє нескінченну сітку, де можна розмістити GraphNode. Кожен GraphNode представляє вузол у графі, окрему одиницю даних у підключеній схемі. GraphEdit, у свою чергу, допомагає контролювати різні взаємодії з вузлами та між вузлами. Коли користувач намагається підключити, відключити або видалити GraphNode, у GraphEdit видається сигнал, але за замовчуванням не виконується жодна дія. Програміст, який використовує цей елемент керування, відповідає за реалізацію необхідної логіки, щоб визначити, як слід обробляти кожен запит.
Продуктивність: настійно рекомендується ввімкнути режим використання низького процесора (див. OS.low_processor_usage_mode) під час використання GraphEdits.
Примітка: Майте на увазі, що Node.get_children() також повертатиме вузол рівня підключення під назвою _connection_layer через технічні обмеження. Така поведінка може змінитися в наступних випусках.
Властивості
clip_contents |
|
|
|
||
|
||
|
||
|
||
focus_mode |
|
|
|
||
|
||
|
||
Vector2 |
|
|
|
||
|
||
Vector2 |
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Методи
PackedVector2Array |
_get_connection_line(from_position: Vector2, to_position: Vector2) virtual const |
_is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual |
|
_is_in_output_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual |
|
_is_node_hover_valid(from_node: StringName, from_port: int, to_node: StringName, to_port: int) virtual |
|
void |
add_valid_connection_type(from_type: int, to_type: int) |
void |
|
void |
|
void |
|
void |
attach_graph_element_to_frame(element: StringName, frame: StringName) |
void |
|
connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false) |
|
void |
detach_graph_element_from_frame(element: StringName) |
void |
disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int) |
void |
|
Array[StringName] |
get_attached_nodes_of_frame(frame: StringName) |
get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const |
|
get_connection_count(from_node: StringName, from_port: int) |
|
PackedVector2Array |
get_connection_line(from_node: Vector2, to_node: Vector2) const |
get_connection_list_from_node(node: StringName) const |
|
get_connections_intersecting_with_rect(rect: Rect2) const |
|
get_element_frame(element: StringName) |
|
is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) |
|
is_valid_connection_type(from_type: int, to_type: int) const |
|
void |
remove_valid_connection_type(from_type: int, to_type: int) |
void |
|
void |
|
void |
set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float) |
void |
set_selected(node: Node) |
Властивості теми
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Texture2D |
||
Texture2D |
||
Texture2D |
||
Texture2D |
||
Texture2D |
||
Texture2D |
||
Texture2D |
||
StyleBox |
||
StyleBox |
||
StyleBox |
Сигнали
begin_node_move() 🔗
На початку руху GraphElement.
connection_drag_ended() 🔗
Видається в кінці перетягування з’єднання.
connection_drag_started(from_node: StringName, from_port: int, is_output: bool) 🔗
Видається на початку перетягування з’єднання.
connection_from_empty(to_node: StringName, to_port: int, release_position: Vector2) 🔗
Видається, коли користувач перетягує з’єднання з вхідного порту в порожній простір графіка.
connection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Надсилається до GraphEdit, коли намагається створити з’єднання між from_port from_node GraphNode і to_port to_node GraphNode.
connection_to_empty(from_node: StringName, from_port: int, release_position: Vector2) 🔗
Видається, коли користувач перетягує з’єднання з вихідного порту в порожній простір графіка.
copy_nodes_request() 🔗
Видається, коли цей GraphEdit фіксує дію ui_copy (Ctrl + C за замовчуванням). Загалом цей сигнал вказує на те, що вибрані елементи GraphElement слід скопіювати.
cut_nodes_request() 🔗
Видається, коли цей GraphEdit фіксує дію ui_cut (Ctrl + X за замовчуванням). Загалом, цей сигнал вказує на те, що вибрані елементи GraphElement слід вирізати.
delete_nodes_request(nodes: Array[StringName]) 🔗
Видається, коли цей GraphEdit фіксує дію ui_graph_delete (Видалити за замовчуванням).
nodes — це масив імен вузлів, які слід видалити. Зазвичай вони включають усі вибрані вузли.
disconnection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Надсилається до GraphEdit, коли з’єднання між from_port from_node GraphNode і to_port to_node GraphNode намагається видалити.
duplicate_nodes_request() 🔗
Видається, коли цей GraphEdit фіксує дію ui_graph_duplicate (Ctrl + D за замовчуванням). Загалом цей сигнал вказує на те, що вибрані елементи GraphElement слід дублювати.
end_node_move() 🔗
Випробувано в кінці руху GraphElement.
frame_rect_changed(frame: GraphFrame, new_rect: Rect2) 🔗
Увімкнено, коли GraphFrame frame має значення new_rect.
graph_elements_linked_to_frame_request(elements: Array, frame: StringName) 🔗
Випускається, коли один або кілька елементів GraphElement опускаються на GraphFrame під назвою frame, якщо вони раніше не були приєднані до жодного іншого.
elements – це масив GraphElement, який потрібно приєднати.
node_deselected(node: Node) 🔗
Увімкнено, коли надана GraphElement вершина знезаражується.
node_selected(node: Node) 🔗
Увімкнено, коли вибрано даний вузол GraphElement.
paste_nodes_request() 🔗
Видається, коли цей GraphEdit фіксує дію ui_paste (Ctrl + V за замовчуванням). Загалом цей сигнал вказує на те, що попередньо скопійовані елементи GraphElement слід вставити.
popup_request(at_position: Vector2) 🔗
Видається, коли запитується спливаюче вікно. Відбувається після клацання правою кнопкою миші в GraphEdit. at_position — це положення вказівника миші під час надсилання сигналу.
scroll_offset_changed(offset: Vector2) 🔗
Видається, коли користувач змінює зсув прокручування. Він не буде виданий при зміні коду.
Переліки
enum PanningScheme: 🔗
PanningScheme SCROLL_ZOOMS = 0
Колесо миші збільшить масштаб, Ctrl + Колесо миші перемістить перегляд.
PanningScheme SCROLL_PANS = 1
Коліщатко миші пересуне перегляд, Ctrl + Коліщатко миші збільшить масштаб.
enum GridPattern: 🔗
GridPattern GRID_PATTERN_LINES = 0
Намалюйте сітку суцільними лініями.
GridPattern GRID_PATTERN_DOTS = 1
Намалюйте сітку за допомогою точок.
Описи властивостей
bool connection_lines_antialiased = true 🔗
Якщо true, лінії між вузлами використовуватимуть згладжування.
float connection_lines_curvature = 0.5 🔗
Кривизна ліній між вузлами. 0 призводить до прямих ліній.
float connection_lines_thickness = 4.0 🔗
Товщина ліній між вузлами.
Array[Dictionary] connections = [] 🔗
void set_connections(value: Array[Dictionary])
Array[Dictionary] get_connection_list()
Зв’язки між GraphNode.
З’єднання представлено як Dictionary у формі:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
З’єднання з keep_alive, встановленим на false, можуть автоматично видалятися, якщо під час перемальовування є недійсними.
GridPattern grid_pattern = 0 🔗
void set_grid_pattern(value: GridPattern)
GridPattern get_grid_pattern()
Шаблон, який використовується для малювання сітки.
Якщо true, міні-карта видима.
float minimap_opacity = 0.65 🔗
Непрозорість прямокутника мінікарти.
Vector2 minimap_size = Vector2(240, 160) 🔗
void set_minimap_size(value: Vector2)
Vector2 get_minimap_size()
Розмір прямокутника мінікарти. Сама карта базується на розмірі сітки та масштабується відповідно до цього прямокутника.
PanningScheme panning_scheme = 0 🔗
void set_panning_scheme(value: PanningScheme)
PanningScheme get_panning_scheme()
Визначає схему керування панорамуванням за допомогою колеса миші.
bool right_disconnects = false 🔗
Якщо true, увімкнено роз’єднання існуючих з’єднань у GraphEdit шляхом перетягування правого кінця.
Vector2 scroll_offset = Vector2(0, 0) 🔗
void set_scroll_offset(value: Vector2)
Vector2 get_scroll_offset()
Зсув прокручування.
bool show_arrange_button = true 🔗
Якщо true, відображається кнопка для автоматичного впорядкування вузлів графа.
Якщо true, сітку видно.
bool show_grid_buttons = true 🔗
Якщо true, відображаються кнопки, які дозволяють налаштувати сітку та параметри прив’язки.
Якщо true, панель інструментів меню буде видимою.
bool show_minimap_button = true 🔗
Якщо true, кнопка для перемикання міні-карти відображається.
bool show_zoom_buttons = true 🔗
Якщо true, відображаються кнопки, які дозволяють змінювати та скидати рівень масштабування.
bool show_zoom_label = false 🔗
Якщо true, буде видно мітку з поточним рівнем масштабування. Рівень масштабування відображається у відсотках.
Відстань прив’язки в пікселях також визначає відстань між лініями сітки.
bool snapping_enabled = true 🔗
Якщо true, вмикає прив’язку.
Dictionary type_names = {} 🔗
void set_type_names(value: Dictionary)
Dictionary get_type_names()
Dictionary назв типів портів, зрозумілих для людини.
Поточне значення масштабу.
Верхня межа масштабування.
Нижня межа масштабування.
Крок кожного рівня масштабування.
Описи методів
PackedVector2Array _get_connection_line(from_position: Vector2, to_position: Vector2) virtual const 🔗
Віртуальний метод, який можна змінити, щоб налаштувати спосіб малювання з’єднань.
bool _is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual 🔗
Повертає, чи знаходиться mouse_position у гарячій зоні введення.
За замовчуванням гаряча зона — це Rect2, розташована таким чином, що її центр знаходиться в in_node.GraphNode.get_input_port_position()(in_port) (Для випадку виведення замість цього викличте GraphNode.get_output_port_position()). Ширина гарячої зони вдвічі перевищує властивість теми port_grab_distance_horizontal, а її висота вдвічі перевищує port_grab_distance_vertical.
Нижче наведено зразок коду, який допоможе почати:
func _is_in_input_hotzone(in_node, in_port, mouse_position):
var port_size = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical"))
var port_pos = in_node.get_position() + in_node.get_input_port_position(in_port) - port_size / 2
var rect = Rect2(port_pos, port_size)
return rect.has_point(mouse_position)
bool _is_in_output_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual 🔗
Повертає, чи знаходиться mouse_position у гарячій зоні виведення. Для отримання додаткової інформації про гарячі зони див. _is_in_input_hotzone().
Нижче наведено зразок коду, який допоможе почати:
func _is_in_output_hotzone(in_node, in_port, mouse_position):
var port_size = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical"))
var port_pos = in_node.get_position() + in_node.get_output_port_position(in_port) - port_size / 2
var rect = Rect2(port_pos, port_size)
return rect.has_point(mouse_position)
bool _is_node_hover_valid(from_node: StringName, from_port: int, to_node: StringName, to_port: int) virtual 🔗
Цей віртуальний метод можна використовувати для введення додаткового виявлення помилок, коли користувач перетягує з’єднання через дійсний порт.
Поверніть true, якщо з’єднання справді дійсне, або false, якщо з’єднання неможливе. Якщо підключення неможливе, прив’язка до порту і, отже, запит на підключення до цього порту не відбудеться.
У цьому прикладі з’єднання з тим самим вузлом пригнічено:
func _is_node_hover_valid(from, from_port, to, to_port):
return from != to
public override bool _IsNodeHoverValid(StringName fromNode, int fromPort, StringName toNode, int toPort)
{
return fromNode != toNode;
}
void add_valid_connection_type(from_type: int, to_type: int) 🔗
Дозволяє підключення між двома різними типами портів. Тип порту визначається окремо для лівого та правого портів кожного слота за допомогою методу GraphNode.set_slot().
Дивіться також is_valid_connection_type() і remove_valid_connection_type().
void add_valid_left_disconnect_type(type: int) 🔗
Дозволяє відключати вузли під час перетягування з лівого порту слота GraphNode, якщо він має вказаний тип. Дивіться також remove_valid_left_disconnect_type().
void add_valid_right_disconnect_type(type: int) 🔗
Дозволяє відключати вузли під час перетягування з правого порту слота GraphNode, якщо він має вказаний тип. Дивіться також remove_valid_right_disconnect_type().
void arrange_nodes() 🔗
Змінює розташування вибраних вузлів у макеті з мінімальними перетинами між з’єднаннями та рівномірним горизонтальним і вертикальним проміжками між вузлами.
void attach_graph_element_to_frame(element: StringName, frame: StringName) 🔗
Приєднує element GraphElement до frame GraphFrame.
void clear_connections() 🔗
Видаляє всі зв'язки між вузлами.
Error connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false) 🔗
Створіть з’єднання між from_port from_node GraphNode і to_port to_node GraphNode. Якщо підключення вже існує, підключення не створюється.
З’єднання з keep_alive, встановленим на false, можуть автоматично видалятися, якщо під час перемальовування є недійсними.
void detach_graph_element_from_frame(element: StringName) 🔗
Від’єднує element GraphElement від GraphFrame, до якого він зараз прикріплений.
void disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Видаляє з’єднання між from_port from_node GraphNode і to_port to_node GraphNode. Якщо з’єднання не існує, жодне з’єднання не видаляється.
void force_connection_drag_end() 🔗
Завершує створення поточного підключення. Іншими словами, якщо ви перетягуєте з’єднання, ви можете використати цей метод, щоб перервати процес і видалити рядок, який слідує за курсором.
Це найкраще використовувати разом із connection_drag_started і connection_drag_ended, щоб додати спеціальну поведінку, як-от додавання вузлів за допомогою ярликів.
Примітка. Цей метод пригнічує будь-які інші сигнали запиту на з’єднання, крім connection_drag_ended.
Array[StringName] get_attached_nodes_of_frame(frame: StringName) 🔗
Повертає масив імен вузлів, які приєднані до GraphFrame із заданим іменем.
Dictionary get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const 🔗
Повертає найближче з’єднання з заданою точкою простору екрана. Якщо з’єднання не знайдено в межах max_distance пікселів, повертається порожній Dictionary.
З’єднання представлено як Dictionary у формі:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
Наприклад, отримати з’єднання в заданому положенні миші можна таким чином:
var connection = get_closest_connection_at_point(mouse_event.get_position())
int get_connection_count(from_node: StringName, from_port: int) 🔗
Повертає кількість підключень від from_port до from_node.
PackedVector2Array get_connection_line(from_node: Vector2, to_node: Vector2) const 🔗
Повертає точки, які створюють з’єднання між from_node і to_node.
Array[Dictionary] get_connection_list_from_node(node: StringName) const 🔗
Повертає Array, що містить список усіх з'єднань для node.
З'єднання представлено як Dictionary у вигляді:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
Приклад: Отримати всі з’єднання на певному порту:
func get_connection_list_from_port(node, port):
var connections = get_connection_list_from_node(node)
var result = []
for connection in connections:
var dict = {}
if connection["from_node"] == node and connection["from_port"] == port:
dict["node"] = connection["to_node"]
dict["port"] = connection["to_port"]
dict["type"] = "left"
result.push_back(dict)
elif connection["to_node"] == node and connection["to_port"] == port:
dict["node"] = connection["from_node"]
dict["port"] = connection["from_port"]
dict["type"] = "right"
result.push_back(dict)
return result
Array[Dictionary] get_connections_intersecting_with_rect(rect: Rect2) const 🔗
Повертає Array, що містить список з’єднань, які перетинаються з заданим Rect2.
З’єднання представлено як Dictionary у формі:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
GraphFrame get_element_frame(element: StringName) 🔗
Повертаємо GraphFrame, що містить GraphElement з вказаною назвою.
Отримує HBoxContainer, який містить елементи керування масштабуванням і прив’язкою сітки у верхньому лівому куті графіка. Ви можете використовувати цей метод, щоб змінити розташування панелі інструментів або додати до неї власні елементи керування.
Попередження: Це обов’язковий внутрішній вузол, його видалення та звільнення може призвести до збою. Якщо ви бажаєте приховати його чи будь-який із його дочірніх елементів, скористайтеся властивістю CanvasItem.visible.
bool is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Повертає true, якщо from_port from_node GraphNode підключено до to_port to_node GraphNode.
bool is_valid_connection_type(from_type: int, to_type: int) const 🔗
Повертає, чи можливо встановити з’єднання між двома різними типами портів. Тип порту визначається окремо для лівого та правого портів кожного слота за допомогою методу GraphNode.set_slot().
Дивіться також add_valid_connection_type() і remove_valid_connection_type().
void remove_valid_connection_type(from_type: int, to_type: int) 🔗
Забороняє з’єднання між двома різними типами портів, раніше дозволене add_valid_connection_type(). Тип порту визначається окремо для лівого та правого портів кожного слота за допомогою методу GraphNode.set_slot().
Дивіться також is_valid_connection_type().
void remove_valid_left_disconnect_type(type: int) 🔗
Забороняє відключення вузлів під час перетягування з лівого порту слота GraphNode, якщо він має вказаний тип. Використовуйте це, щоб вимкнути відключення, яке раніше було дозволено за допомогою методу add_valid_left_disconnect_type().
void remove_valid_right_disconnect_type(type: int) 🔗
Забороняє відключення вузлів під час перетягування з правого порту слота GraphNode, якщо він має вказаний тип. Використовуйте це, щоб вимкнути відключення, яке раніше було дозволено за допомогою методу add_valid_right_disconnect_type().
void set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float) 🔗
Встановлює колір з’єднання між from_node from_port і to_node to_port кольором, наданим у властивості теми activity. Колір лінійно інтерполюється між кольором з’єднання та кольором активності, використовуючи amount як вагу.
void set_selected(node: Node) 🔗
Встановлює вказаний node як обраний.
Описи тематичної нерухомості
Color activity = Color(1, 1, 1, 1) 🔗
Колір, до якого інтерполюється лінія з’єднання на основі значення активності з’єднання (див. set_connection_activity()).
Color connection_hover_tint_color = Color(0, 0, 0, 0.3) 🔗
Колір, який зливається з лінією з’єднання, коли миша наводиться на неї.
Color connection_rim_color = Color(0.1, 0.1, 0.1, 0.6) 🔗
Колір обідка навколо кожної лінії з’єднання, який використовується для того, щоб лінії, що перетинаються, були більш помітними.
Color connection_valid_target_tint_color = Color(1, 1, 1, 0.4) 🔗
Колір, який змішується з лінією з’єднання, коли поточне перетягнуте з’єднання наводиться на дійсний цільовий порт.
Color grid_major = Color(1, 1, 1, 0.2) 🔗
Колір основних ліній/точок сітки.
Color grid_minor = Color(1, 1, 1, 0.05) 🔗
Колір другорядних ліній/точок сітки.
Color selection_fill = Color(1, 1, 1, 0.3) 🔗
Колір заливки прямокутника виділення.
Color selection_stroke = Color(1, 1, 1, 0.8) 🔗
Колір контуру виділеного прямокутника.
int connection_hover_thickness = 0 🔗
Розширює лінію з'єднання на певний відсоток, коли на неї наведено курсор миші. Значення 0 вимикає підсвічування. Значення 100 подвоює ширину лінії.
int port_hotzone_inner_extent = 22 🔗
Горизонтальний діапазон, у межах якого можна захопити порт (внутрішня сторона).
int port_hotzone_outer_extent = 26 🔗
Горизонтальний діапазон, у межах якого можна захопити порт (зовнішня сторона).
Texture2D grid_toggle 🔗
Піктограма кнопки перемикання сітки.
Texture2D layout 🔗
Піктограма кнопки макета для автоматичного впорядкування графіка.
Texture2D minimap_toggle 🔗
Піктограма кнопки перемикання міні-карти.
Texture2D snapping_toggle 🔗
Значок кнопки перемикання прив’язки.
Texture2D zoom_in 🔗
Піктограма для кнопки збільшення.
Texture2D zoom_out 🔗
Піктограма для кнопки зменшення.
Texture2D zoom_reset 🔗
Значок кнопки скидання масштабу.
There is currently no description for this theme property. Please help us by contributing one!
StyleBox panel 🔗
Фон, намальований під сіткою.
StyleBox panel_focus 🔗
StyleBox використовується, коли фокусовано GraphEdit (при використанні з допоміжними програмами).