Crear diagramas
Vea todos los problemas a la vez
diagnoseSchematic informa de todos los problemas de un documento en una llamada, cada uno con su línea, su intervalo de columnas y un código estable.
Todos los problemas en orden de aparición
compileSchematic se detiene en el primer problema, porque un compilador que ha encontrado un error no puede dibujar el documento. Un editor necesita todos los errores a la vez, cada uno señalando los caracteres exactos que debe subrayar. diagnoseSchematic proporciona esa información.
import { diagnoseSchematic, parseSchematicFence } from '@schemd/core';
const fence = parseSchematicFence('schemd bounds="760x420" title="Filter"')!;
const diagnostics = diagnoseSchematic(source, fence);
// [{ code, message, line, column, endColumn, severity }, …]Solo lanza una excepción para argumentos que no sean un documento. Para cualquier problema dentro del documento devuelve una lista en orden de aparición; una lista vacía significa que el documento se compila. Dado este código fuente:
source:VDC "V_{dc}" at (90, 170) #blue [type=voltage-dc]
inductor:L2 "100 \mu H" at (300, 170) #purple [core=ferrite]
capacitor:C3 "220 \mu F" below L9 by 80 #cyan [orientation=down]ambos problemas se devuelven juntos, cada uno con las columnas del elemento que falla:
2:39–61 option Option core is not supported.
3:32–34 placement C3 is placed relative to L9, which the document never declares.
Declare L9 anywhere in the document, or place C3 with at (x, y).Las columnas comienzan en uno y endColumn es exclusivo. Por tanto, line.slice(column - 1, endColumn - 1) es exactamente el texto que causa el problema. En la línea 2 es la parte final de la declaración, #purple [core=ferrite], donde se encuentra la opción incorrecta; en la línea 3 es L9. Cada mensaje indica cómo corregir el problema, además de explicar qué está mal.
source:VDC "V_{dc}" at (90, 170) #blue [type=voltage-dc]
inductor:L2 "100 \mu H" at (300, 170) #purple
capacitor:C3 "220 \mu F" below L2 by 80 #cyan [type=polarized orientation=down]
ground:G3 "0 V" below C3 by 20 aligned-x with C3 #slate
VDC.positive -> L2.in #blue [ortho]
L2.out -> C3.in #purple [ortho]
C3.out -> G3.in #slate [ortho]
VDC.negative -> G3.in #slate [ortho]Un código estable para cada tipo de problema
Cada diagnóstico incluye un code que el entorno puede usar para decidir su comportamiento sin analizar la prosa. SCHEMATIC_DIAGNOSTIC_CODES enumera los códigos en el orden en que los encuentra el compilador:
| Código | Lo produce |
|---|---|
syntax |
una línea que no es una declaración, una conexión ni sintaxis de bloque |
option |
una opción desconocida, duplicada o con un tipo incorrecto para el componente indicado |
limit |
un documento que supera uno de sus límites de recursos |
reference |
una conexión a un componente o terminal que no existe |
topology |
redes incompatibles en un terminal o una anchura de bus que no coincide |
placement |
una relación sin referencia válida, un ciclo, una distancia negativa o una cadena demasiado larga |
geometry |
un componente fuera de los límites del bloque, cuerpos que se solapan o un ajuste imposible |
routing |
un cable que el trazador no pudo colocar, con indicaciones sobre qué mover |
Dos reglas mantienen la precisión de la lista. Primero, una declaración que falla no genera errores en cascada. Su ID se reserva, de modo que un tipo mal escrito en una línea no reaparece como componente desconocido en todas las líneas que se conectan a él. Segundo, la geometría y el trazado solo se ejecutan en documentos cuyas declaraciones son válidas. Dibujar un documento con una declaración defectuosa mostraría algo que el autor nunca escribió.
Las referencias reciben un tratamiento distinto. El nombre de un terminal depende del tipo de su componente, nunca de dónde se sitúe. Por ello, una colocación relativa defectuosa no oculta un terminal mal escrito en otra parte, y todas las conexiones se siguen comprobando.
port:REQ at (100, 120) #blue
and:G8 "AND" right-of REQ by 160 #purple [inputs=2]
port:GRANT right-of G8 by 160 #emerald
clock:SCK "SAMPLE" below G8 by 110 aligned-x with G8 #amber
REQ.out -> G8.in1 #blue [ortho digital]
SCK.out -> G8.in2 #amber [ortho digital]
G8.out1 -> GRANT.in #emerald [ortho digital]Subraye el problema donde se escribió
Una excepción incluye los mismos campos. SchematicSyntaxError tiene line, column, endColumn y code, por lo que un entorno que compila directamente puede subrayar el único problema recibido sin llamar a la API de diagnósticos:
try {
compileSchematic(source, fence);
} catch (error) {
if (error instanceof SchematicSyntaxError) {
underline(error.line, error.column, error.endColumn, error.message);
}
}Una línea reescrita por un parámetro de subcircuito no incluye columna, porque sus columnas señalarían un texto que el autor nunca escribió. Su línea sigue apuntando a la declaración.
El área de pruebas hace exactamente esto mientras se escribe. Subraya todos los intervalos notificados y enumera los problemas junto al código fuente. Hasta que el documento vuelva a ser válido, el último dibujo que se compiló permanece en pantalla, atenuado.
port:DRV "D" at (100, 150) #violet
resistor:RB8 "1 k\Omega" right-of DRV by 150 #amber
load:BZ8 "buzzer" right-of RB8 by 150 #emerald [type=buzzer]
DRV.out -> RB8.in #violet [ortho]
RB8.out -> BZ8.in #amber [ortho]