GraphEdit
Experimental: This class may be changed or removed in future versions.
Hereda: Control < CanvasItem < Node < Object
Un editor para estructuras tipo grafo, que utiliza GraphNodes.
Descripción
GraphEdit proporciona herramientas para la creación, manipulación y visualización de varios gráficos. Su propósito principal en el motor es potenciar los sistemas de programación visual, como los shaders visuales, pero también está disponible para su uso en proyectos de usuario.
GraphEdit por sí solo es solo un contenedor vacío, que representa una cuadrícula infinita donde se pueden colocar los GraphNodes. Cada GraphNode representa un nodo en el gráfico, una sola unidad de datos en el esquema conectado. GraphEdit, a su vez, ayuda a controlar varias interacciones con los nodos y,entre los nodos. Cuando el usuario intenta conectar, desconectar o eliminar un GraphNode, se emite una señal en el GraphEdit, pero no se realiza ninguna acción de forma predeterminada. Es responsabilidad del programador que utiliza este control implementar la lógica necesaria para determinar cómo se debe gestionar cada solicitud.
Rendimiento: Se recomienda encarecidamente activar el modo de bajo uso del procesador (véase OS.low_processor_usage_mode) al utilizar GraphEdits.
Nota: Ten en cuenta que Node.get_children() también devolverá el nodo de la capa de conexión llamado _connection_layer debido a limitaciones técnicas. Este comportamiento puede cambiar en futuras versiones.
Propiedades
clip_contents |
|
|
|
||
|
||
|
||
|
||
focus_mode |
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Métodos
_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 |
|
get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const |
|
get_connection_count(from_node: StringName, from_port: int) |
|
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) |
Propiedades del Tema
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Señales
begin_node_move() 🔗
Emitida al comienzo del movimiento de un GraphElement.
connection_drag_ended() 🔗
Emitida al final de un arrastre de conexión.
connection_drag_started(from_node: StringName, from_port: int, is_output: bool) 🔗
Emitida al comienzo de un arrastre de conexión.
connection_from_empty(to_node: StringName, to_port: int, release_position: Vector2) 🔗
Emitida cuando el usuario arrastra la conexión del puerto de entrada al espacio vacío del gráfico.
connection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Emitida al GraphEdit cuando se intenta crear la conexión entre el from_port del from_node GraphNode y el to_port del to_node GraphNode.
connection_to_empty(from_node: StringName, from_port: int, release_position: Vector2) 🔗
Emitida cuando el usuario arrastra una conexión desde un puerto de salida hacia el espacio vacío del gráfico.
copy_nodes_request() 🔗
Emitida cuando este GraphEdit captura una acción ui_copy (Ctrl + C por defecto). En general, esta señal indica que los GraphElements seleccionados deben copiarse.
cut_nodes_request() 🔗
Emitida cuando este GraphEdit captura una acción ui_cut (Ctrl + X por defecto). En general, esta señal indica que los GraphElements seleccionados deben cortarse.
delete_nodes_request(nodes: Array[StringName]) 🔗
Emitida cuando este GraphEdit captura una acción ui_graph_delete (Delete por defecto).
nodes es un array de nombres de nodos que deben eliminarse. Estos usualmente incluyen todos los nodos seleccionados.
disconnection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Emitida al GraphEdit cuando se intenta eliminar la conexión entre from_port de from_node GraphNode y to_port de to_node GraphNode.
duplicate_nodes_request() 🔗
Emitida cuando este GraphEdit captura una acción ui_graph_duplicate (predeterminadamente Ctrl + D). En general, esta señal indica que los GraphElements seleccionados deben ser duplicados.
end_node_move() 🔗
Emitida al final del movimiento de un GraphElement.
frame_rect_changed(frame: GraphFrame, new_rect: Rect2) 🔗
Emitida cuando el GraphFrame frame se redimensiona a new_rect.
graph_elements_linked_to_frame_request(elements: Array, frame: StringName) 🔗
Emitida cuando uno o más GraphElements se sueltan en el GraphFrame llamado frame, cuando no estaban previamente adjuntos a ningún otro.
elements es un array de GraphElements que se adjuntarán.
Emitida cuando el nodo GraphElement dado es deseleccionado.
Emitida cuando el nodo GraphElement dado es seleccionado.
paste_nodes_request() 🔗
Emitida cuando este GraphEdit captura una acción ui_paste (predeterminadamente Ctrl + V). En general, esta señal indica que los GraphElements copiados previamente deben pegarse.
popup_request(at_position: Vector2) 🔗
Emitida cuando se solicita un popup. Ocurre al hacer clic derecho en GraphEdit. at_position es la posición del puntero del ratón cuando se envía la señal.
scroll_offset_changed(offset: Vector2) 🔗
Emitida cuando el desplazamiento de la pantalla es cambiado por el usuario. No se emitirá cuando se cambie el código.
Enumeraciones
enum PanningScheme: 🔗
PanningScheme SCROLL_ZOOMS = 0
Mouse Wheel hará zoom, Ctrl + Mouse Wheel moverá la vista.
PanningScheme SCROLL_PANS = 1
Mouse Wheel moverá la vista, Ctrl + Mouse Wheel hará zoom.
enum GridPattern: 🔗
GridPattern GRID_PATTERN_LINES = 0
Dibuja la cuadrícula usando líneas sólidas.
GridPattern GRID_PATTERN_DOTS = 1
Dibuja la cuadrícula usando puntos.
Descripciones de Propiedades
bool connection_lines_antialiased = true 🔗
Si es true, las líneas entre nodos utilizarán antialiasing.
float connection_lines_curvature = 0.5 🔗
La curvatura de las líneas entre los nodos. 0 da como resultado líneas rectas.
float connection_lines_thickness = 4.0 🔗
El grosor de las líneas entre los nodos.
Array[Dictionary] connections = [] 🔗
void set_connections(value: Array[Dictionary])
Array[Dictionary] get_connection_list()
Las conexiones entre GraphNodes.
Una conexión se representa como un Dictionary de la forma:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
Las conexiones con keep_alive establecido en false pueden ser eliminadas automáticamente si no son válidas durante un redibujado.
GridPattern grid_pattern = 0 🔗
void set_grid_pattern(value: GridPattern)
GridPattern get_grid_pattern()
El patrón utilizado para dibujar la cuadrícula.
Si es true, el minimapa es visible.
float minimap_opacity = 0.65 🔗
La opacidad del rectángulo del minimapa.
Vector2 minimap_size = Vector2(240, 160) 🔗
El tamaño del rectángulo del minimapa. El mapa en sí se basa en el tamaño del área de la cuadrícula y se escala para que quepa en este rectángulo.
PanningScheme panning_scheme = 0 🔗
void set_panning_scheme(value: PanningScheme)
PanningScheme get_panning_scheme()
Define el esquema de control para el paneo con la rueda del ratón.
bool right_disconnects = false 🔗
Si es true, permite la desconexión de las conexiones existentes en el GraphEdit arrastrando el extremo derecho.
Vector2 scroll_offset = Vector2(0, 0) 🔗
El desplazamiento del scroll.
bool show_arrange_button = true 🔗
Si es true, el botón para organizar automáticamente los nodos del gráfico será visible.
Si es true, la cuadrícula es visible.
bool show_grid_buttons = true 🔗
Si es true, los botones que permiten configurar las opciones de cuadrícula y ajuste son visibles.
Si es true, la barra de herramientas del menú será visible.
bool show_minimap_button = true 🔗
Si es true, el botón para alternar el minimapa será visible.
bool show_zoom_buttons = true 🔗
Si es true, serán visibles los botones que permiten cambiar y restablecer el nivel de zoom.
bool show_zoom_label = false 🔗
Si es verdadero, la etiqueta con el nivel de zoom actual es visible. El nivel de zoom se muestra en porcentajes.
La distancia de encaje en píxeles, también determina la distancia de la línea de la cuadrícula.
bool snapping_enabled = true 🔗
Si es true, habilita el snapping.
Dictionary type_names = {} 🔗
void set_type_names(value: Dictionary)
Dictionary get_type_names()
Dictionary de nombres de tipo de puerto legibles por humanos.
El valor de zoom actual.
El límite superior del zoom.
El límite inferior del zoom.
El paso de cada nivel de zoom.
Descripciones de Métodos
PackedVector2Array _get_connection_line(from_position: Vector2, to_position: Vector2) virtual const 🔗
Método virtual que puede ser sobreescrito para personalizar cómo se dibujan las conexiones.
bool _is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual 🔗
Returns whether the mouse_position is in the input hot zone.
By default, a hot zone is a Rect2 positioned such that its center is at in_node.GraphNode.get_input_port_position()(in_port) (For output's case, call GraphNode.get_output_port_position() instead). The hot zone's width is twice the Theme Property port_grab_distance_horizontal, and its height is twice the port_grab_distance_vertical.
Below is a sample code to help get started:
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 🔗
Returns whether the mouse_position is in the output hot zone. For more information on hot zones, see _is_in_input_hotzone().
Below is a sample code to help get started:
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 🔗
This virtual method can be used to insert additional error detection while the user is dragging a connection over a valid port.
Return true if the connection is indeed valid or return false if the connection is impossible. If the connection is impossible, no snapping to the port and thus no connection request to that port will happen.
In this example a connection to same node is suppressed:
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) 🔗
Permite la conexión entre dos tipos de puerto diferentes. El tipo de puerto se define individualmente para el puerto izquierdo y el derecho de cada ranura con el método GraphNode.set_slot().
Véase también is_valid_connection_type() y remove_valid_connection_type().
void add_valid_left_disconnect_type(type: int) 🔗
Permite desconectar nodos al arrastrar desde el puerto izquierdo de la ranura del GraphNode si tiene el tipo especificado. Véase también remove_valid_left_disconnect_type().
void add_valid_right_disconnect_type(type: int) 🔗
Permite desconectar nodos al arrastrar desde el puerto derecho de la ranura del GraphNode si tiene el tipo especificado. Véase también remove_valid_right_disconnect_type().
void arrange_nodes() 🔗
Reorganiza los nodos seleccionados en un diseño con cruces mínimos entre conexiones y un espacio horizontal y vertical uniforme entre los nodos.
void attach_graph_element_to_frame(element: StringName, frame: StringName) 🔗
Adjunta el element GraphElement al frame GraphFrame.
void clear_connections() 🔗
Elimina todas las conexiones entre los nodos.
Error connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false) 🔗
Crea una conexión entre el from_port del from_node GraphNode y el to_port del to_node GraphNode. Si la conexión ya existe, no se crea ninguna conexión.
Las conexiones con keep_alive establecido en false pueden eliminarse automáticamente si no son válidas durante un redibujo.
void detach_graph_element_from_frame(element: StringName) 🔗
Desvincula el element GraphElement del GraphFrame al que está actualmente adjunto.
void disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Elimina la conexión entre el from_port del from_node GraphNode y el to_port del to_node GraphNode. Si la conexión no existe, no se elimina ninguna conexión.
void force_connection_drag_end() 🔗
Finaliza la creación de la conexión actual. En otras palabras, si estás arrastrando una conexión, puedes usar este método para abortar el proceso y eliminar la línea que seguía a tu cursor.
Esto se usa mejor junto con connection_drag_started y connection_drag_ended para agregar un comportamiento personalizado como la adición de nodos a través de atajos.
Nota: Este método suprime cualquier otra señal de solicitud de conexión aparte de connection_drag_ended.
Array[StringName] get_attached_nodes_of_frame(frame: StringName) 🔗
Devuelve un array de nombres de nodos que están adjuntos al GraphFrame con el nombre dado.
Dictionary get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const 🔗
Devuelve la conexión más cercana al punto dado en el espacio de la pantalla. Si no se encuentra ninguna conexión dentro de max_distance píxeles, se devuelve un Dictionary vacío.
Una conexión se representa como un Dictionary de la forma:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
Por ejemplo, obtener una conexión en una posición dada del ratón se puede lograr así:
var connection = get_closest_connection_at_point(mouse_event.get_position())
int get_connection_count(from_node: StringName, from_port: int) 🔗
Devuelve el número de conexiones desde from_port de from_node.
PackedVector2Array get_connection_line(from_node: Vector2, to_node: Vector2) const 🔗
Devuelve los puntos que formarían una conexión entre from_node y to_node.
Array[Dictionary] get_connection_list_from_node(node: StringName) const 🔗
Returns an Array containing a list of all connections for node.
A connection is represented as a Dictionary in the form of:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
Example: Get all connections on a specific port:
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 🔗
Returns an Array containing the list of connections that intersect with the given Rect2.
A connection is represented as a Dictionary in the form of:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
GraphFrame get_element_frame(element: StringName) 🔗
Devuelve el GraphFrame que contiene el GraphElement con el nombre dado.
Gets the HBoxContainer that contains the zooming and grid snap controls in the top left of the graph. You can use this method to reposition the toolbar or to add your own custom controls to it.
Warning: This is a required internal node, removing and freeing it may cause a crash. If you wish to hide it or any of its children, use their CanvasItem.visible property.
bool is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Devuelve true si el from_port del from_node GraphNode está conectado al to_port del to_node GraphNode.
bool is_valid_connection_type(from_type: int, to_type: int) const 🔗
Devuelve si es posible realizar una conexión entre dos tipos de puerto diferentes. El tipo de puerto se define individualmente para el puerto izquierdo y el derecho de cada ranura con el método GraphNode.set_slot().
Véase también add_valid_connection_type() y remove_valid_connection_type().
void remove_valid_connection_type(from_type: int, to_type: int) 🔗
Disallows the connection between two different port types previously allowed by add_valid_connection_type(). The port type is defined individually for the left and the right port of each slot with the GraphNode.set_slot() method.
See also is_valid_connection_type().
void remove_valid_left_disconnect_type(type: int) 🔗
Disallows to disconnect nodes when dragging from the left port of the GraphNode's slot if it has the specified type. Use this to disable disconnection previously allowed with add_valid_left_disconnect_type().
void remove_valid_right_disconnect_type(type: int) 🔗
Disallows to disconnect nodes when dragging from the right port of the GraphNode's slot if it has the specified type. Use this to disable disconnection previously allowed with add_valid_right_disconnect_type().
void set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float) 🔗
Establece la coloración de la conexión entre el from_port de from_node y el to_port de to_node con el color proporcionado en la propiedad del tema activity. El color se interpola linealmente entre el color de la conexión y el color de actividad utilizando amount como peso.
void set_selected(node: Node) 🔗
Establece el node especificado como el seleccionado.
Descripciones de las propiedades del tema
Color activity = Color(1, 1, 1, 1) 🔗
El color de la línea de conexión se interpola en función del valor de actividad de una conexión (véase set_connection_activity()).
Color connection_hover_tint_color = Color(0, 0, 0, 0.3) 🔗
Color que se mezcla con la línea de conexión cuando el ratón se sitúa sobre ella.
Color connection_rim_color = Color(0.1, 0.1, 0.1, 0.6) 🔗
Color del borde alrededor de cada línea de conexión utilizado para hacer que las líneas que se cruzan sean más distinguibles.
Color connection_valid_target_tint_color = Color(1, 1, 1, 0.4) 🔗
Color que se mezcla con la línea de conexión cuando la conexión que se está arrastrando se sitúa sobre un puerto de destino válido.
Color grid_major = Color(1, 1, 1, 0.2) 🔗
Color de las líneas/puntos principales de la cuadrícula.
Color grid_minor = Color(1, 1, 1, 0.05) 🔗
Color de las líneas/puntos menores de la cuadrícula.
Color selection_fill = Color(1, 1, 1, 0.3) 🔗
El color de relleno del rectángulo de selección.
Color selection_stroke = Color(1, 1, 1, 0.8) 🔗
El color del contorno del rectángulo de selección.
int connection_hover_thickness = 0 🔗
Ensancha la línea de la conexión cuando el ratón se sitúa sobre ella en un factor porcentual. Un valor de 0 desactiva el resaltado. Un valor de 100 duplica el ancho de la línea.
int port_hotzone_inner_extent = 22 🔗
El rango horizontal dentro del cual se puede agarrar un puerto (lado interno).
int port_hotzone_outer_extent = 26 🔗
El rango horizontal dentro del cual se puede agarrar un puerto (lado externo).
El icono del botón de alternancia de la cuadrícula.
El icono para el botón de diseño para organizar automáticamente el grafo.
El icono para el botón de alternar el minimapa.
El icono para el botón de alternar el ajuste.
El icono para el botón de acercamiento del zoom.
El icono para el botón de alejamiento del zoom.
El icono del botón de reinicio del zoom.
There is currently no description for this theme property. Please help us by contributing one!
El fondo dibujado bajo la cuadrícula.
StyleBox utilizado cuando el GraphEdit está enfocado (cuando se usa con aplicaciones de asistencia).