Símbolos SVG portátiles
Componer y compartir símbolos SVG estáticos con vínculos Ganter seguros y bornes de conexión con tipo.
Los símbolos de Ganter mantienen separados el dibujo y los datos en vivo. El dibujo es SVG corriente y estático. Ganter Lab es el dueño de toda correspondencia de valores y de toda animación, así que un archivo importado no puede ejecutar scripts, ni controladores de eventos, ni código de animación incrustado, ni peticiones de red. Esta página es la referencia completa del modelo de autoría: qué declara un símbolo, qué acepta y qué rechaza la importación, y cómo viajan los símbolos entre estaciones.
Un símbolo declara tres cosas por encima de su dibujo:
- Zonas activas: entradas con nombre (relleno, trazo, movimiento, texto, visibilidad) que una instancia colocada en un panel de control alimenta después desde una dirección de Logic o desde un valor fijo.
- Bornes: puntos de conexión con tipo en el perímetro, para que el panel de control pueda encaminar tuberías, conductos, cables y ejes entre símbolos.
- Sugerencias: composiciones opcionales con otros símbolos, con la pose declarada de forma explícita.
Símbolos del sistema y Mis símbolos
El catálogo tiene dos orígenes, filtrables en todos los sitios donde se listan símbolos:
| Origen | Referencia | Qué es |
|---|---|---|
| Sistema | system:<stable-key> |
Las bibliotecas integradas que vienen con la aplicación. Se pueden inspeccionar y exportar, y nunca se editan en el sitio. |
| Míos | user:<guid> |
Los símbolos que usted creó, importó o duplicó. Se pueden editar y eliminar. |
Todos los símbolos del sistema ofrecen Duplicar en Mis símbolos: la copia es un recurso de usuario congelado y de propiedad independiente (con el dibujo, el cuadro de vista, el ajuste, la huella, las zonas activas, las configuraciones de tipo, los bornes y las sugerencias copiados juntos), así que se sigue comportando como se eligió aunque una actualización posterior de la aplicación cambie el original. Eliminar un símbolo de usuario pide confirmación; los paneles de control que lo sigan referenciando muestran un marcador de posición en vez de romperse.
Formas de crear un símbolo
- Importar un archivo: Logic > Recursos > Símbolos > Importar símbolo acepta un
.svga secas o un paquete.ganter-symbol.jsoncompleto. Toda importación crea un recurso nuevo con identidad propia; nunca sobrescribe un símbolo existente, y un choque de nombres se resuelve con un sufijo (" 2", " 3", …) en vez de fallar. El selector rechaza los archivos de más de 1 MB antes de leer ningún byte. Tras la importación de un SVG a secas, la aplicación informa de cuántos elementos no seguros quitó, si es que quitó alguno. - Componerlo en la aplicación: Nuevo símbolo de usuario abre un editor para el nombre, el marcado SVG, la disposición en el panel de control (ajuste y huella inicial) y las zonas activas; una vez que el símbolo existe, los cambios válidos se guardan solos. La geometría de los bornes no se puede editar en la aplicación, a propósito: los bornes con tipo solo los puede aportar un paquete, y los bornes definidos por un paquete se conservan de solo lectura a través de las ediciones posteriores.
- Pedírselo a una IA: dos vías comparten exactamente el mismo contrato. Por el punto de conexión MCP integrado, la herramienta
symbol_validatehace un ensayo en seco de la importación ysymbol_importguarda un recurso nuevo; las dos llevan el contrato completo en sus descripciones. Desde un chat externo sin ningún acceso a la aplicación, Copiar la instrucción para el chat en el panel de Símbolos copia una consigna autónoma; guarde el SVG o el paquete que devuelva como archivo e impórtelo aquí.
Véase Logic para el espacio de trabajo de recursos que lo rodea.
Preparar un SVG a secas
Dé a cada parte que quiera vincular un id de SVG estable. Después de importar, esos ids aparecen en los selectores de destino de las zonas activas. Los ids y los nombres de zona activa comparten una misma gramática: empiezan por una letra o por _, siguen con letras, dígitos, _, ., : o -, y tienen 128 caracteres como mucho.
Los atributos opcionales data-ganter-* son el único marcado propio de Ganter que puede llevar un símbolo:
| Atributo | En | Qué declara |
|---|---|---|
data-ganter-pivot="x y" |
cualquier elemento vinculable | El punto de pivote exacto (en coordenadas del cuadro de vista) para las zonas activas de rotación, escala y giro. Obligatorio en el elemento de destino de esas tres clases. |
data-ganter-spin-ratio |
un hijo de un elemento que gira | La velocidad relativa de un rotor hijo visible. Finita, distinta de cero y de magnitud 100 como mucho; en negativo gira al revés. Se quita salvo que el elemento declare además su propio pivote. |
data-ganter-role |
cualquier elemento | Un papel semántico estable para las herramientas de autoría. Solo informativo. |
data-ganter-fit-width |
<text> / <tspan> |
Visor acotado opcional para una zona activa de texto: cuando el texto vinculado mide más ancho que esas unidades del cuadro de vista, la fuente se encoge para caber. |
data-ganter-fit-min-font-size |
<text> / <tspan> |
El tamaño de fuente más pequeño al que puede encoger el ajuste. Por debajo de él, el elemento muestra el texto de reserva mientras el valor completo se queda en el nombre accesible y en la información emergente. |
data-ganter-fit-fallback |
<text> / <tspan> |
El texto que se muestra cuando ni siquiera el tamaño de fuente mínimo permite que quepa el valor. |
Los bornes de conexión no viven en el SVG y no apuntan a ids de elemento SVG. Los atributos llamados data-ganter-port o data-ganter-port-* no forman parte del formato: una importación de SVG a secas los quita, y un paquete estricto que los lleve se rechaza.
Una importación de SVG a secas produce siempre un símbolo solo visual válido: cero bornes y cero zonas activas. El inspector informa de que no existe ningún borne conectable porque el papel, el tipo, la orientación externa y el recorrido interno no se declararon. Ganter no deduce esos campos del nombre del archivo, ni de la categoría, ni del dibujo, y no abre ningún editor interno de bornes o de recorridos.
Qué acepta el depurador
La misma política de SVG se aplica a todas las vías (importación de archivo, editor de la aplicación, MCP, paquete). Es a propósito más pequeña que el SVG:
- Se conserva: la geometría y la estructura inertes:
svg,g,defs,symbol,use,path,rect,circle,ellipse,line,polyline,polygon,text,tspan,title,desc,clipPath,mask,linearGradient,radialGradient,stop,pattern,marker, con los atributos de presentación (relleno, trazo, opacidad, transformación, estilo) y las etiquetas ARIA. - Se quita o se rechaza:
<script>,<style>,<foreignObject>, los controladores de eventos, la animación incrustada, y cualquier URL externa odata:/file:/http(s). Solo sobreviven las referencias internasurl(#id)yhref="#id". - Límites: el marcado puede tener como mucho 512 KB y 4096 elementos.
Las pinturas seguras son los colores hexadecimales, los colores con nombre de CSS, rgb()/rgba()/hsl()/hsla() y las fichas de tema de la aplicación var(--color-<name>) (por ejemplo var(--color-success), var(--color-symbol-off)). Las fichas de tema son la forma en que un mismo dibujo se adapta al claro y al oscuro: entregue un solo dibujo que referencie fichas, y nunca dos variantes de tema.
Cómo se tratan las violaciones depende de la vía: un SVG a secas se repara (los elementos no seguros se quitan y cada eliminación se informa como advertencia); un paquete es estricto y se rechaza nombrando las primeras violaciones, en vez de repararse en silencio.
El paquete portátil v2
Exportar un símbolo crea un archivo .ganter-symbol.json. Todos los campos de la envoltura son obligatorios; los tres arreglos del contrato pueden estar vacíos, pero tienen que estar presentes:
| Campo | Requisito |
|---|---|
$schema |
Exactamente https://ganterlab.com/schemas/ganter-symbol-v2.schema.json. |
format |
Exactamente ganter-symbol. |
version |
Exactamente 2. Los paquetes de la versión 1 se rechazan, en vez de pasarse por un analizador heredado. |
name |
El nombre visible. Una importación lo puede sustituir, y un choque recibe un sufijo automático. |
svg |
SVG estático depurado cuyo elemento raíz lleva un viewBox igual al campo viewBox. |
viewBox |
minX minY width height: cuatro números finitos con anchura y altura positivas. |
fit |
contain, stretch, stretch-x o stretch-y. |
footprint |
{ "width": 1..24, "height": 1..12 }, las celdas sugeridas en el panel de control. |
slots |
Arreglo de declaraciones de zona activa (más abajo). |
typeConfigurations |
Arreglo de elecciones de tipo de borne compartidas (más abajo). |
terminals |
Arreglo de hasta 16 bornes completos (más abajo). |
suggestions |
Arreglo de composiciones declaradas y ordenadas (más abajo). |
El esquema JSON público de Ganter symbol v2 valida la envoltura de transporte. El importador hace después las comprobaciones semánticas que un esquema JSON no puede expresar: que el destino exista en el SVG, la geometría del recorrido interno, la compatibilidad de las sugerencias. Un paquete es estricto en todas las dimensiones: el marcado no seguro, los campos desconocidos, las entradas nulas de un arreglo y los antiguos contratos ports[], anchors[], profile y connectionStyle se rechazan en vez de repararse.
El paquete no contiene nunca una dirección de estación, ni un vínculo de panel de control, ni una elección de tipo por instancia, ni un GUID de base de datos, ni una identidad de usuario. Una zona activa que lleva una dirección de Logic ni siquiera se puede exportar: la dirección pertenece a la instancia colocada, no al símbolo reutilizable.
Tamaño, cuadro de vista y ajuste
El cuadro de vista es el espacio de coordenadas natural del símbolo. Los bornes y los recorridos internos se declaran en él, y tiene que coincidir exactamente con el viewBox propio de la raíz del SVG; un paquete cuyos dos cuadros de vista no concuerdan se rechaza. Los cuadros de vista que no son cuadrados se admiten por completo, así que una cinta transportadora larga no tiene que vivir dentro de un cuadrado.
El modo de ajuste dice cómo usa el dibujo el rectángulo del panel de control que dibuja el operador:
| Ajuste | Comportamiento |
|---|---|
contain |
Conserva la proporción; el dibujo deja bandas dentro del rectángulo de la celda. El valor por defecto. |
stretch |
Llena el rectángulo en los dos ejes, distorsionando si hace falta. |
stretch-x |
Estira en horizontal y conserva la proporción vertical natural. |
stretch-y |
Estira en vertical y conserva la proporción horizontal natural. |
La huella es el tamaño inicial en celdas de la rejilla del panel de control cuando el símbolo se coloca por primera vez: anchura de 1 a 24, altura de 1 a 12 (el editor parte de 4 × 4). Es una sugerencia, no una restricción; el operador cambia el tamaño libremente después.
Dos puertas independientes acotan el tamaño de una importación: el selector de archivos rechaza cualquier cosa de más de 1 MB antes de leerla, y el depurador rechaza el marcado de más de 512 KB o de más de 4096 elementos.
Zonas activas: la superficie de vínculo
Una zona activa declara una entrada: a qué elemento gobierna, qué le hace, y cómo se corresponden los valores de entrada con la salida. La instancia colocada en el panel de control elige después el origen de cada zona activa (una dirección de Logic o un valor fijo); el símbolo en sí no guarda nunca un origen.
Cada zona activa lleva:
| Campo | Significado |
|---|---|
name |
El nombre del parámetro que se muestra a quien compone el panel de control. Con la gramática de identificador de arriba; único entre las zonas activas del símbolo. |
elementId |
El id de un elemento SVG existente. Un elemento admite como mucho una zona activa por canal, así que dos zonas activas no pueden pelearse por el relleno del mismo elemento. |
kind |
Una de las trece clases de abajo. |
inMin, inMax |
El rango de entrada: los dos valores que se corresponden con outMin/outMax. Números finitos; los usan las clases continuas, y fill/stroke los usan como punto medio del umbral. |
outMin, outMax |
El rango de salida en la unidad de la clase (grados, unidades del cuadro de vista, de 0 a 1, grados por segundo). Números finitos. |
outMinSecondary, outMaxSecondary |
Segundo eje de salida opcional, solo en translate y en scale: la salida primaria es la X y la secundaria es la Y. Se dan los dos o ninguno. |
onColor, offColor |
Pinturas seguras para fill/stroke (los dos estados del umbral). En fillColor/strokeColor, onColor es el color de la vista previa del inspector. |
Las trece clases de zona activa:
| Clase | Qué gobierna | Notas |
|---|---|---|
rotate |
Gira el elemento; la entrada se corresponde linealmente con grados. | El destino tiene que declarar data-ganter-pivot. |
opacity |
La opacidad del elemento; la entrada se corresponde con el rango de 0 a 1. | |
fill |
Pinta el relleno con offColor por debajo del punto medio del rango de entrada y con onColor en él o por encima. Una entrada booleana conmuta directamente. |
Apunta a formas que se pueden rellenar (no a <line>). |
visible |
Muestra u oculta el elemento según si el valor es verdadero. | |
text |
Sustituye el contenido de texto del elemento por el valor con formato. | Apunta solo a <text>/<tspan>; combínelo con los atributos data-ganter-fit-* para un visor acotado. |
translate |
Mueve el elemento en unidades del cuadro de vista; la salida primaria es la X y la secundaria, opcional, es la Y. | |
scale |
Escala el elemento; la salida primaria es la X y la secundaria es la Y (omitida significa uniforme). | El destino tiene que declarar data-ganter-pivot. |
stroke |
Pinta el trazo con la misma regla de umbral que fill. |
|
spin |
Rotación continua en el tiempo; la entrada se corresponde con una velocidad angular en grados por segundo. Los hijos con data-ganter-spin-ratio giran con ellos en la proporción que declaran. |
El destino tiene que declarar data-ganter-pivot. El movimiento lo planifica el anfitrión y no depende de las preferencias de animación del sistema operativo. |
spinEnabled |
Pausa o reanuda la zona activa spin del mismo elemento sin ocultarlo. |
Necesita una zona activa spin que apunte al mismo elemento. |
fillColor |
Fija el relleno directamente desde el valor de color vinculado (un recurso de color, una variable de color o un color CSS seguro). | |
strokeColor |
Fija el trazo directamente desde el valor de color vinculado. | |
strokeWidth |
Fija el grosor del trazo directamente, en unidades de usuario SVG de 0,5 a 32; no se acepta ningún sufijo de unidad ni CSS. | Una entrada no válida, sin resolver o de mala calidad restaura el stroke-width que trae el dibujo; y lo mismo hacen Restablecer, el remontaje y la eliminación. |
Estas zonas activas dan estilo al dibujo; nunca dan estilo a los trazos de un panel de control, cuyo color y cuya anchura son globales por tipo de trazo.
De quién es el vínculo
El símbolo declara parámetros y elecciones de tipo permitidas, no orígenes en vivo ni la selección de una instancia. Tras colocar un componente Símbolo, el operador asigna cada zona activa a una dirección de Logic o a un valor fijo y elige cada tipo de trazo configurable en esa instancia. Esas elecciones se quedan dentro de la estación y no se exportan nunca con el símbolo reutilizable. Las zonas activas sin asignar se quedan neutras: el elemento conserva el aspecto con el que se dibujó.
Posiciones globales y tipos de trazo
Todos los bornes referencian una posición del catálogo fijo de dieciséis anclajes del perímetro. Un paquete guarda solo el anchorId; nunca repite ni sustituye coordenadas. Las posiciones, como fracciones normalizadas del cuadro de vista:
- arriba:
top-left(0, 0),top-25(0.25, 0),top-50(0.5, 0),top-75(0.75, 0),top-right(1, 0); - derecha:
right-25(1, 0.25),right-50(1, 0.5),right-75(1, 0.75); - abajo, en el sentido de las agujas del reloj:
bottom-right(1, 1),bottom-75(0.75, 1),bottom-50(0.5, 1),bottom-25(0.25, 1),bottom-left(0, 1); - izquierda, siguiendo en el mismo sentido:
left-75(0, 0.75),left-50(0, 0.5),left-25(0, 0.25).
Son posiciones del perímetro, no una rejilla de 5×5. Un símbolo no puede añadir otra posición ni guardar sus propias coordenadas de anclaje.
Los ocho tipos de trazo globales son liquid, gas, air-duct, electrical, signal, network, material y mechanical-shaft. Use Logic > Recursos > Tipos de trazo para configurar el color y la anchura visual del trazo asociados a cada tipo. Los símbolos y los trazos conservan el id estable del tipo, así que un cambio global vuelve a dar estilo a todos los recorridos que lo usan. Un paquete no copia nunca el color ni la anchura, y no tiene variantes de recorrido pequeño, estándar ni grande.
Dos extremos forman un trazo definido cuando resuelven al mismo tipo. El papel del borne ayuda a la autoría y a la revisión, pero por sí solo no prohíbe ninguna disposición de la red.
Elecciones de tipo compartidas
Un símbolo que puede trabajar con más de un medio declara una configuración de tipo compartida en lugar de duplicar su dibujo:
{
"id": "process-type",
"name": "Process type",
"allowedTypes": ["liquid", "gas"],
"defaultType": "liquid"
}
El id es una clave estable: letras minúsculas y dígitos con guiones sueltos, empezando y terminando en un carácter alfanumérico (las mayúsculas se rechazan). allowedTypes no está vacío y contiene ids de tipo global únicos; defaultType tiene que pertenecer a él; name es obligatorio. Todos los bornes que referencian process-type siguen una única elección hecha en la instancia colocada en el panel de control. Una definición puede llevar varias configuraciones independientes, como el medio de proceso y el de venteo, mientras otros bornes se quedan fijos.
Bornes completos
Cada borne conectable declara una posición global, un papel, exactamente un tipo fijo o una configuración compartida, una orientación hacia fuera en la orientación original, y un recorrido interno de llegada:
{
"anchorId": "left-50",
"role": "input",
"typeConfiguration": "process-type",
"direction": "west",
"internalPath": [
{ "x": 18, "y": 50 },
{ "x": 36, "y": 50 },
{ "x": 48, "y": 62 }
]
}
Las reglas, todas impuestas al importar:
- 16 bornes como mucho, y cada id de anclaje usado una vez como mucho.
roleesinput,outputobidirectional;directionesnorth,east,southowest.- Exactamente uno de
type(un tipo de trazo global) otypeConfiguration(el id de una configuración declarada): nunca los dos, nunca ninguno. - El anclaje global convertido al cuadro de vista natural del SVG es el inicio implícito de
internalPath; no lo repita como primer punto. Las coordenadas son valores absolutos del cuadro de vista, no fracciones normalizadas, y el recorrido tiene al menos un punto. - Todos los segmentos se quedan dentro del cuadro de vista, tienen longitud distinta de cero, y son horizontales, verticales o de exactamente 45°; los segmentos consecutivos giran 90° como mucho.
- Los bornes exigen que el SVG lleve un cuadro de vista.
El panel de control dibuja el recorrido interno por debajo del dibujo del equipo, lo transforma con el cambio de tamaño, con los giros de cuarto de vuelta y con las simetrías, y conserva la anchura visual del tipo de trazo global en lugar de escalarla con el símbolo, para que un solo trazo continuo corra desde dentro de un cuerpo hasta dentro del otro.
Un borne es todo o nada. Un paquete estricto con un borne parcial no es válido; un paquete solo visual usa en su lugar un arreglo terminals vacío. Nunca se deduce nada para rellenar un hueco.
Sugerencias ordenadas
Una sugerencia registra una composición intencionada, incluida la pose exacta del destino:
{
"sourceAnchorId": "right-75",
"targetSymbol": "system:capping-station",
"targetAnchorId": "left-75",
"targetRotationDegrees": 0,
"targetFlipHorizontal": false,
"targetFlipVertical": false,
"connectionType": "material"
}
Validación: sourceAnchorId tiene que ser uno de los bornes de este mismo símbolo; targetSymbol tiene que ser una referencia cualificada por su origen y, en un paquete portátil, solo puede ser system:<stable-key> (un GUID de usuario solo tiene sentido dentro de la estación que lo posee) nombrando un símbolo que exista en el catálogo del sistema con un borne en targetAnchorId; la rotación es 0, 90, 180 o 270 y las dos banderas de simetría son obligatorias; cada sugerencia tiene que ser única. connectionType solo se puede omitir cuando los tipos fijos iguales de los dos extremos resuelven el caso sin ambigüedad; es obligatorio cuando cualquiera de los dos extremos es configurable, y entonces tiene que estar permitido en los dos.
Las sugerencias son direccionales y el orden del arreglo fija la prioridad, pero nunca son una lista de lo permitido para los trazos corrientes de un panel de control. Con un arreglo suggestions vacío, el inspector informa de que no existe ninguna composición sugerida, en vez de inventarse un compañero del catálogo.
Lo que la importación rechaza
Una lista rápida de las negativas, para que una importación fallida se pueda leer en lugar de adivinarse. En un SVG a secas solo aplica el primer grupo, y dentro de él solo los topes de tamaño, el XML mal formado y la falta de una raíz <svg> rechazan la importación: el marcado no permitido se repara con una advertencia. En un paquete, todo lo de abajo es un rechazo duro.
Dibujo
- Un archivo de más de 1 MB, un marcado de más de 512 KB, o más de 4096 elementos.
- XML mal formado, o una raíz que no es un
<svg>depurado. - En un paquete: cualquier marcado que la lista de lo permitido habría tenido que quitar (scripts, controladores de eventos, referencias externas, elementos o atributos no permitidos).
- Un
viewBoxque no son cuatro números finitos con anchura y altura positivas, o que difiere del de la raíz del SVG; un paquete sin ningún cuadro de vista en la raíz.
Envoltura
- Un esquema, un formato o una versión distintos del contrato v2; campos desconocidos en cualquier sitio; la falta de
name, defit, defootprinto de cualquiera de los tres arreglos; una entrada nula dentro de un arreglo. - Un
fitfuera de los cuatro modos; una huella fuera de 1 a 24 × 1 a 12.
Zonas activas
- Un nombre o un id de elemento fuera de la gramática de identificador; un nombre de zona activa duplicado; un id de destino que el SVG no contiene; una clase que el elemento de destino no admite (texto sobre un elemento que no es de texto, relleno sobre un
<line>). - Una zona activa
rotate,spinoscalecuyo destino no tiene undata-ganter-pivotfinito; una zona activaspinEnabledsin una zona activaspinsobre el mismo elemento. - Dos zonas activas sobre el mismo canal de un elemento. Cada clase es su propio canal, salvo que
fillyfillColorcomparten el canal del relleno ystrokeystrokeColorcomparten el del trazo, así que un elemento no admite dos rotaciones igual que no admite dos rellenos. - Números de rango no finitos; una salida secundaria con un solo extremo, o en una clase distinta de
translate/scale; una pintura no segura; una zona activa que lleva una dirección de Logic.
Trazos
- Más de 16 bornes; un id de anclaje repetido o desconocido; un borne con los dos o con ninguno de
type/typeConfiguration; un tipo o un id de configuración desconocidos; un recorrido interno no válido (fuera del cuadro de vista, con segmentos de longitud cero o con ángulos indebidos, con un giro de más de 90°). - Una configuración de tipo con un id no válido, sin nombre, con tipos permitidos duplicados o desconocidos, o con un valor por defecto fuera de su propia lista.
- Una sugerencia cuyo borne de origen no existe, cuyo destino no es un símbolo del sistema con el borne nombrado, cuya pose no es un cuarto de vuelta, o cuyo tipo de trazo no se acepta en los dos extremos.
symbol_validate en el punto de conexión MCP ejecuta exactamente esta importación como ensayo en seco e informa de todos los errores, todas las advertencias y todas las notas sin guardar nada.
Empaquetar y compartir
Exportar el paquete (disponible igual para los símbolos del sistema y para los de usuario) descarga <name>.ganter-symbol.json con el dibujo depurado y el contrato completo: $schema, format, version, name, svg, viewBox, fit, footprint, slots[], typeConfigurations[], terminals[] y suggestions[], con los tres arreglos de trazos presentes aunque estén vacíos. Lo que no viaja nunca: las direcciones de la estación, las elecciones de tipo por instancia, la identidad en la base de datos, la identidad del usuario, y los colores y las anchuras de los tipos de trazo de la estación.
En la estación que lo recibe, ese mismo archivo pasa por Importar símbolo (o por symbol_import sobre MCP) y aterriza como un símbolo de usuario nuevo, con sus bornes y todo. Como la identidad del tipo es un id estable y el aspecto es global, los trazos de un símbolo importado siguen de inmediato el estilo de tipos de trazo de la estación que lo recibe.