Saltar al contenido
SheetForge

Referencia de la API — La superficie pública

Esta página enumera todos los tipos públicos de los ensamblados del producto. Cualquier cosa que no aparezca aquí es internal por diseño; la superficie pública es deliberadamente estrecha.

  • Core (SheetForge.Core + SheetForge.Core.Tooling): 137 tipos públicos (Core: 131, Core.Tooling: 6). Core.Tooling es la mitad exclusiva del editor que contiene servicios en tiempo de importación como el reporting y la planificación de Push — nada de ella se distribuye en las builds del jugador.
  • Editor: 53 tipos públicos de nivel superior más sus tipos anidados públicos.
  • Runtime: 7 tipos, más las salidas generadas.

Esta es exactamente la superficie contra la que compilan las pruebas de simulación de consumidor (sin InternalsVisibleTo).

Contrato de detección (no es un tipo): un asset independiente también puede detectar que SheetForge está instalado en tiempo de compilación mediante el símbolo de definición de scripting SHEETFORGE que autorregistra el ensamblado Editor. Es un define, no un tipo público, así que no aparece en las tablas de abajo — consulta Creación de plugins ▸ Detectar SheetForge desde otro asset. (Distinto de SHEETFORGE_ADDRESSABLES, un version-define interno que solo indica si el paquete Addressables está presente.)

Convenciones: las firmas están abreviadas ( = consulta los documentos XML del código fuente); "puro" significa sin UnityEngine / sin E/S.


Ensamblado Core (SheetForge.Core) — C# puro

Sin UnityEngine, sin E/S, sin red, sin conocimiento de dominio. Impuesto por el compilador: Core no hace referencia a nada.

Contratos de registro de plugin (SheetForge.Core.Plugins)

TipoClaseRol y miembros clave
ISheetForgePlugininterfaceEl contrato base de plugin de dominio. string Name · RegisterEnums(EnumRegistry) · RegisterCellParsers(CellParserRegistry)
ISheetForgeValidatorPlugininterfaceComplemento opcional para reglas de validación. RegisterValidators(DomainValidatorRegistry)
ISheetForgeEdgePlugininterfaceComplemento opcional para declaraciones de aristas. RegisterEdgeContributors(EdgeContributorRegistry)
ISheetForgeMarkerPlugininterfaceComplemento opcional para marcadores estructurales personalizados. RegisterStructuralMarkers(MarkerRegistry)
ISheetForgeTemplatePlugininterfaceComplemento opcional para plantillas de "Crear hoja". RegisterTemplates(TemplateRegistry)
ISheetForgeGraphPlugininterfaceComplemento opcional que registra overrides de lienzo de Data Studio por pestaña. RegisterGraphShapes(GraphShapeRegistry)
ISheetForgeCodeRegistryPlugininterfaceComplemento opcional para destinos de referencia propiedad del código (pestañas virtuales bloqueadas). RegisterCodeRegistries(CodeRegistryCatalog)
ISheetForgeThemePlugininterfaceComplemento opcional para preajustes de color de ventana. RegisterThemes(ThemeRegistry)
ISheetForgeStudioPlugininterfaceComplemento opcional para superficies de creación declarativas (acciones, paneles, insignias de columna, pistas de editor de celda). RegisterStudioUi(StudioUiRegistry). En Core en lugar de Editor, así que un solo registro se renderiza tanto en el editor de UIToolkit como en el navegador
ISheetForgeStringsPlugininterfaceComplemento opcional que registra las propias cadenas de UI del paquete por idioma. RegisterStrings(StringOverlayRegistry). Reemplaza el par ISheetForgeLocPlugin / PluginLocRegistry del lado del Editor, ya retirado, que solo podía llegar al editor
ISheetForgePipelinePlugininterfaceComplemento opcional que registra observadores de canalización. RegisterPipelineObservers(PipelineObserverRegistry)

Composición y compatibilidad (SheetForge.Core.Plugins)

El descubrimiento es por host — TypeCache de Unity en el editor, el escaneo del ensamblado subido del navegador en la web. Todo lo que viene después (instanciación, ordenamiento, aislamiento y la barrera de compatibilidad) es una única función compartida del Core, que es lo que evita que los dos hosts se desalineen slot por slot.

TipoClaseRol y miembros clave
PluginCompositionstatic classLa única vía de ensamblaje. Una instancia por tipo, con cast a cada contrato que implementa. Los dos miembros y la separación de diagnósticos están debajo de la tabla
PluginSetsealed classEl resultado ensamblado — doce slots: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes · Strings · StudioUi · PipelineObservers. Un slot nuevo llega a ambos hosts al añadirse aquí
SheetForgePluginCompatAttributesealed attribute (assembly)[assembly: SheetForgePluginCompat(SheetForgePluginFormat.Current, MinHostVersion = "…", PluginVersion = "…")]. int FormatVersion · string MinHostVersion (comparación numérica por puntos; null/vacío = sin requisito) · string PluginVersion (solo visualización, nunca se compara). Se lee sin instanciar nada, y se juzga por ensamblado — un ensamblado rechazado pierde todos los registros en lugar de cargar a medias. Ausente = generación Minimum, sin requisito de host
SheetForgePluginFormatstatic classLas constantes de generación: const int Current · const int Minimum. Solo se mueve si el propio formato de plugin se reemplaza — el crecimiento puramente aditivo mantiene el número donde está

PluginComposition — los dos miembros:

  • IReadOnlyList<Type> ContractTypes — el filtro de descubrimiento. Su orden es fijo, porque decide el orden en que aparecen los diagnósticos.
  • PluginSet Compose(IReadOnlyList<Type> candidateTypes, string hostVersion, ErrorCollector errors, ICollection<string> failures, Func<string,bool> isProductKey = null) — la propia llamada de ensamblaje.

Se mantienen separados dos tipos de problema. Los conflictos de registro y los rechazos de compatibilidad se convierten en diagnósticos estructurados en errors; los errores de implementación — fallo de construcción, un callback que lanza una excepción — se convierten en líneas en inglés en failures, y pasar null ahí los descarta.

El predicado final isProductKey es cómo se impone la regla "un plugin no puede sobrescribir una clave del producto" de la superposición de cadenas sin que Core llegue a ver nunca las tablas de idioma: la regla vive aquí, el host solo suministra el material. Omite el predicado y solo esa regla se salta.

Registros (SheetForge.Core.Model / .Validation / .Edges)

TipoRol y miembros clave
EnumRegistryNombre de enum → tipo CLR (material para el codegen). Register<TEnum>() · Register(name, memberNames) · TryGetMembers · TryGetClrTypeName · TryGetClrAssemblyName · RegisteredEnumNames. Otros tres miembros se detallan debajo de la tabla
CellParserRegistryNombre de tipo → analizador de celda (abierto-cerrado). Un registro duplicado lanza una excepción. Register(ICellValueParser) · TryGet · TryGetCustomRenderer · RegisteredTypeNames · RegisterWrapper(ICellWrapperType) · TryGetWrapper · RegisteredWrapperNames (tipos wrapper)
DomainValidatorRegistryLista de validadores de solo adición, con el orden preservado. Register(IDomainValidator) · Validators
EdgeContributorRegistryLista de contribuyentes de solo adición, con el orden preservado. Register(IEdgeContributor) · Contributors
MarkerRegistryNombre de marcador (sin @) → marcador estructural personalizado. Una colisión con un marcador integrado (SheetSyntax.ReservedMarkers@name/@type/@desc/@overlap/@style/@enum/@loc) / un duplicado / un identificador inválido lanza una excepción. Register(IStructuralMarkerDefinition) · TryGet · IsEmpty · RegisteredMarkerNames · AppendMarkerTokens
TemplateRegistryClave de plantilla de "Crear hoja" → plantilla. Una clave vacía/duplicada, un nombre de visualización vacío, cero pestañas, o un TSV de pestaña vacío lanzan una excepción. Register(DataTemplate) · TryGet · Templates · IsEmpty

EnumRegistry — los tres miembros en detalle:

  • EnumRegistry(EnumRegistry parent) — un hijo que lee a través de un padre y solo se registra en sí mismo. El padre contiene los enums CLR registrados por plugin durante todo el domain reload, el hijo los definidos en hoja de esta importación, así que una importación nunca muta la caché compartida. Registrar un nombre que el padre ya posee lanza una excepción en lugar de sombrearlo.
  • Contains(name) — propio y luego el padre, Ordinal.
  • SetClrTypeName(name, fullTypeName) — rellena un nombre CLR después de un registro solo de string. El nombre de ensamblado queda vacío porque el tipo todavía no existe.

Plantillas de "Crear hoja" (SheetForge.Core.Model)

TipoRol y miembros clave
DataTemplateUna plantilla registrada por un plugin: string Key (identidad de registro) · string DisplayName (texto propiedad del plugin) · IReadOnlyList<DataTemplateTab> Tabs (una o más)
DataTemplateTabUna pestaña de una plantilla: string TabName · string Tsv (un TSV normalizado completo — filas de marcador más datos de ejemplo)

Tipos de celda personalizados (SheetForge.Core.Model)

TipoRol y miembros clave
ICellValueParserAnaliza una celda escalar. Fallo = recopilar en context.Errors + devolver false (nunca lanzar una excepción). string TypeName · bool TryParse(CellParseContext, string, out object)
ICustomCellTypeAyudante opcional de codegen/ciclo de ida y vuelta. Type ValueType · bool TryRender(object, out string text, out string reason)
IReferencingCellTypeCapacidad opcional que un ICellValueParser registrado también puede implementar para que una clave enterrada en su propia notación reciba el tratamiento completo de RecordId@Tab — integridad + sugerencias, propagación de renombrado de clave que preserva la carga útil, aristas y puertos de grafo, el selector , detección de huérfanos, reglas de listas desplegables exportadas. Se descubre haciendo cast del parser ya registrado (sin canal de registro separado). bool TryGetTokenKey(elementText, out key) · string MakeToken(key) · bool TryRetargetToken(elementText, newKey, out newText) · bool TryRemoveToken(elementText, key, out newText) (resultado vacío = el elemento desaparece) · bool TryRewriteKeys(elementText, IReadOnlyDictionary<string,string> renames, out newText). Una llamada = un elemento (toda la celda, o un elemento separado por ;), así que una carga útil no puede contener ;; @target debe nombrar una pestaña de hoja real (UnknownTargetTab en caso contrario). Nunca lanza — false/null significa "no se puede interpretar", y las reescrituras preservan el residuo
IRefBearingValueLa mitad del lado del valor de lo anterior, implementada por el valor analizado: IEnumerable<string> ReferencedKeys (el orden de declaración = orden de diagnóstico y de presupuesto de sugerencias; las entradas null/vacías se omiten). El escáner lee esto; los hooks de texto de arriba reescriben la celda. Se necesitan ambos — un valor analizado no puede restaurar la notación del autor, y el texto no se puede validar sin leerse
ICellWrapperTypeUna forma de valor wrapper genérica MyWrapper<T> (p. ej., Pair<int> = 1~2) — el wrapper posee la sintaxis externa y el Core analiza el tipo interno recursivamente. string Name · bool TrySplit(string, out IReadOnlyList<string> pieces, out string reason) · string JoinCanonical(IReadOnlyList<string>) · Type OpenClrType · object Assemble(IReadOnlyList<object>, Type closed) · bool TryDisassemble(object, out IReadOnlyList<object>, out string reason)
WrapperValueEl IR analizado de una celda wrapper — lleva la estrategia del wrapper + expone los CellValue internos (de modo que las referencias internas pasan por la validación, el renombrado de clave/pestaña y la exportación). ICellWrapperType Wrapper · IReadOnlyList<CellValue> Inner
IStructuralMarkerDefinitionUna fila @marker personalizada (valores por columna, validados columna por columna — generaliza @overlap). string MarkerName (sin @) · string Description · void ValidateCell(MarkerCellContext)
MarkerCellContextUna llamada de validación de celda de marcador. string MarkerName · string RawText · string FieldName · CellCoordinate Coordinate · void Reject(string reason, string suggestion = null) (→ MarkerCellInvalid)
CellParseContextEl contexto de una llamada de análisis. TypeToken Type · CellCoordinate Coordinate · ErrorCollector Errors · EnumRegistry Enums

Constantes de la gramática de hoja (SheetForge.Core.Model)

Un paquete que lee o escribe texto de celda funciona con la misma gramática que usa el importador — dividir una celda de lista, componer una cadena @type, comprobar si un nombre ya está en uso.

Estas constantes son la única fuente de verdad de esa gramática, así que un paquete nunca vuelve a declarar su propio separador: un carácter copiado se desincroniza el día que la gramática cambie. Las listas se entregan de solo lectura, así que nada de lo que haga un paquete puede cambiar la gramática en sí. La notación que describen está documentada por completo en la página Sintaxis de la hoja — esto es el asidero programático sobre ella.

TipoClaseFunción
SheetSyntaxclase estáticaLa gramática de la hoja como constantes, agrupadas más abajo

Marcadores

  • CommentPrefix (#) · MarkerPrefix (@).
  • Una constante por cada fila de marcador integrado: NameMarker · TypeMarker · DescMarker · OverlapMarker · StyleMarker · EnumMarker · LocMarker.
  • RequiredMarkers — los tres que toda hoja debe llevar.
  • ReservedMarkers — todos los nombres integrados. Consúltalo antes de nombrar un marcador personalizado: una colisión se rechaza en el registro.

Separadores

  • ListSeparator (;) — entre elementos de una lista.
  • EntrySeparator (,), FieldSeparator (:), SectionSeparator (|), KeyTimeSeparator (@) — las capas dentro de un solo valor, razón por la cual ; nunca aparece en el texto propio de un valor.
  • StyleKeyValueSeparator (=) — dentro de una celda @style.

Notación de @type

  • OptionalSuffix (?) · DefaultSeparator (=) · TargetSeparator (@, como en RecordId@Tab).
  • ListTypeName · ListOpen (List<) · ListClose (>).

Nombres de tipo

  • Una constante por cada nombre integrado: IntTypeName · FloatTypeName · BoolTypeName · StringTypeName · RecordIdTypeName · IntIdTypeName · AssetRefTypeName · LocRefTypeName · ColorTypeName · AnimationCurveTypeName · GradientTypeName · EnumTypeName.
  • BuiltinScalarTypes e IsBuiltinScalarTypeName(name) — responden "¿este nombre ya es integrado?" antes de que se registre un analizador con él.
  • StyleKeyNames (title, color) · LocReservedColumns (smart, comment).

Valores

  • TrueCanonical / FalseCanonical — el texto canónico de bool.
  • NumberCellStyles — el NumberStyles con el que se lee cada celda numérica. Los separadores de miles quedan excluidos y la cultura es siempre invariante, así que una coma decimal local falla de forma ruidosa en lugar de cambiar el número en silencio.

Validación de dominio (SheetForge.Core.Validation)

TipoRol y miembros clave
IDomainValidatorRegla entre columnas/entre pestañas. Las infracciones van a ctx.Errors como DomainRuleViolation con los 4 elementos. string Name · Validate(DomainValidationContext)
DomainValidationContextTables (pestaña → SheetTable) · KeyIndices · AssetKeys (null = omitido) · Errors

Costura de aristas (SheetForge.Core.Validation / .Edges)

TipoRol y miembros clave
ReferenceScanner (static)Única fuente de verdad para la enumeración de ocurrencias de referencias. Scan(tables) · ScanTable · ScanField · IsReferenceField(TypeToken), más los dos predicados de referencia detallados debajo de la tabla
RefKeyKind (enum)Si una referencia coincide con el espacio de clave de tipo string (RecordId) o entero (IntId). Lo devuelve ReferenceScanner.GetReferenceKind; los consumidores se ramifican según él. Solo adición
ReferenceOccurrence (struct)Una ocurrencia — Kind · FromTab · RowNumber · ColumnNumber · FieldName · TargetTab · TargetId · ToCoordinate()
ReferenceOccurrenceKind (enum)Scalar · ListElement · ExplicitDefault · WrapperElement · CustomElement (una referencia que un IRefBearingValue declaró fuera de su propia notación — coordenadas a nivel de celda, ya que el layout interno pertenece a ese tipo). Solo adición, así que los valores existentes conservan su significado
IEdgeContributorDeclara aristas que el escáner no puede ver. Sin diagnósticos. string Name · ContributeEdges(EdgeContributionContext, ICollection<EdgeSpec>)
EdgeSpecUna arista — FromTab/FromRecordId/ToTab/ToRecordId (+ opcionalmente FieldName, PayloadTab/PayloadRecordId para aristas de registro, Label)
EdgeContributionContextTables + KeyIndices de solo lectura (sin recolector de errores — las aristas no son validación)
IAuthorableEdgeContributorCapacidad opcional que un IEdgeContributor también puede implementar para que su arista se pueda editar en el lienzo de grafo. bool TryPlanConnect(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out EdgeCellWrite) · bool TryPlanDisconnect(EdgeAuthoringContext, RecordEdge, out EdgeCellWrite)false = no se prepara nada y la affordance se deshabilita con un motivo; ambos se ejecutan dentro de try/catch
IEdgeTokenEditorCapacidad opcional que un IEdgeContributor también puede implementar para que el resto de su token (todo lo que no es la clave) se pueda editar en el inspector de cable. bool TryDescribeToken(EdgeAuthoringContext, RecordEdge, out EdgeTokenDescription) · bool TryPlanSetModifier(EdgeAuthoringContext, RecordEdge, string newModifier, out EdgeCellWrite) — ambos leen la misma celda (una arista sabe a dónde apunta, no cómo se escribe hoy), false = la fila se oculta o se deshabilita honestamente; ambos se ejecutan dentro de try/catch
EdgeTokenDescriptionQué es un token y cómo editar su resto — TokenText (el fragmento a resaltar) · ModifierText · HasModifier · ModifierLabel · IsChoice · Options / OptionLabels. new EdgeTokenDescription(tokenText) = sin resto, así que no se dibuja ninguna fila; el constructor de elección recae en texto libre cuando la lista de opciones está vacía
IBatchAuthorableEdgeContributorCapacidad opcional, hermana de IAuthorableEdgeContributor (no una herencia): planes de conectar/desconectar como una lista de escrituras de celda, para datos donde un gesto debe cambiar varias celdas emparejadas a la vez. bool TryPlanConnectMany(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out IReadOnlyList<EdgeCellWrite>) · bool TryPlanDisconnectMany(EdgeAuthoringContext, RecordEdge, out IReadOnlyList<EdgeCellWrite>) — toda la lista se prepara como un solo paso de undo o ninguno; los contribuyentes singulares siguen funcionando (fallback), y el batch gana cuando una clase implementa ambos
IVirtualNodeFactoryCapacidad opcional: gestos de "crear" en el lienzo que no son una fila de hoja nueva. IReadOnlyList<VirtualNodeKind> KindsFor(EdgeAuthoringContext, tab, recordId) (se llama por cada construcción de menú — mantenlo ligero) · bool TryPlanCreate(EdgeAuthoringContext, tab, recordId, VirtualNodeKind, out IReadOnlyList<EdgeCellWrite>)false = la sesión queda intacta. Un plan no puede apuntar a un registro creado en el mismo gesto
VirtualNodeKind (struct)Un tipo creable — Id (se devuelve textualmente al elegir) · Label (texto de menú ya traducido; / anida) · IsUsable. Seguro ante null, seguro ante default
IEdgeSlotDeclarerCapacidad opcional: puertos que un nodo (virtual) abre sin necesitar una arista en vivo. IReadOnlyList<DeclaredSlot> DeclareSlots(EdgeAuthoringContext, nodeTab, nodeRecordId) — los slots declarados se suman al menú de conectar, al selector de puerto y a las filas de puerto de la tarjeta; se llama por cada render, así que las implementaciones deben ser ligeras y sin efectos secundarios
DeclaredSlot (struct)Un slot declarado — FieldName (único por nodo; debe coincidir con el FieldName de la arista del contribuyente para que los cables se anclen) · TargetTab · IsList · IsUsable. Seguro ante null, seguro ante default
EdgeAuthoringContextLa entrada de planificación — Tables + string CellText(tab, recordId, field), que devuelve la celda tal como se lee ahora (baseline más preparación), así que dos enlaces hechos seguidos se ven entre sí
EdgeCellWrite (struct)El plan: TabName · RecordId · FieldName · NewRawText (vacío = limpiar) · IsAddressable. Direccionado por clave, no por número de fila

ReferenceScanner — los dos predicados de referencia:

  • GetReferencedTab(TypeToken) — el único predicado que todo consumidor pregunta, "¿es esto una referencia, y hacia dónde?". Responde para RecordId@Tab, para IntId@Tab (el espacio de clave entero), para el interior de un wrapper, y para un tipo personalizado marcado IsCustomReference. Por eso una sola adhesión opcional — y, para IntId@Tab, una ampliación de este predicado — los activa todos a la vez.
  • GetReferenceKind(TypeToken)RefKeyKind — si la referencia compara contra el espacio de clave de tipo string o entero, así que la propagación de renombrado, la lista desplegable y el selector se ramifican correctamente.
  • GetReferenceKind(TypeToken, tables) — la sobrecarga consciente de la tabla.

Una referencia del core declara su propio espacio (RecordId / IntId). Un tipo personalizado de referencia no tiene notación para decirlo — MyType@Tab es la única forma de escribirlo — así que su espacio se deriva de la identidad de la pestaña destino: una clave propia RecordId significa espacio de tipo string, IntId solo significa espacio entero, y una pestaña desconocida o unas tables null recae en espacio de tipo string, la misma respuesta que da la sobrecarga que solo toma el token. Esa derivación es lo que permite que una implementación existente de IReferencingCellType apunte a una pestaña con clave IntId sin cambiar ni una línea.

Índice del grafo de referencias (SheetForge.Core.Edges)

Una instantánea inmutable que fusiona las referencias escaneadas por el core y las aristas de los contribuyentes en un solo modelo, indexado en ambos sentidos. Material de visualización — nunca produce diagnósticos (los Diagnostics de la proyección siguen siendo la única fuente de verdad para los problemas).

TipoClaseRol y miembros clave
RecordEdge (struct)valueUna arista. RecordEdgeOrigin Origin · FromTab · FromRecordId (vacío para aristas a nivel de campo) · FieldName · RowNumber / ColumnNumber (base 1; 0 = nivel de campo/pestaña) · ToTab · ToRecordId (el id pretendido incluso sin resolver) · bool IsDangling (fijado en el momento de construcción) · Label · PayloadTab / PayloadRecordId (aristas de registro)
RecordEdgeOrigin (enum)CoreReference (leído de una celda RecordId@Tab — tiene coordenadas) · Contributor (declarado por un IEdgeContributor — a nivel de registro)
ReferenceIndexsealed classLa instantánea. estático Build(tables, keyIndices, contributorEdges, codeRegistries, extraKeys = null) (los tres últimos pueden ser null; extraKeys = pestaña → claves que existen pero todavía no están analizadas, p. ej. filas que una superficie de creación acaba de preparar, así que los enlaces hacia ellas no se dibujan como rotos) · AllEdges (orden determinista: from-tab Ordinal → fila → columna → ocurrencia) · OutEdges(tab, recordId) / InEdges(tab, recordId) (nunca null) · int InCount(tab, recordId) · bool TryGetRowKey(tab, rowNumber, out recordId) · DanglingEdges

Lienzo de registros de Data Studio (SheetForge.Core.Graphing)

El lienzo decide qué dibujar por sí mismo: recorre el índice de referencias hacia afuera desde el registro que abriste (el término) y dispone el resultado de forma determinista. Un plugin no reemplaza esa imagen — la añade. Datos puros en todo momento: las columnas son celdas de cuadrícula, no píxeles, y los colores son un string Category libre que la ventana mapea a una paleta.

TipoClaseRol y miembros clave
IRecordCanvasAugmenterinterfaceEl override de lienzo de una pestaña, llamado después de que se ensambla el cierre. Augment(GraphBuildContext, CanvasAugmentBuilder, string terminusTab, string terminusRecordId). No añadir nada deja la imagen del core tal cual. Una excepción la captura la ventana y se convierte en una advertencia de consola en inglés. La identidad pertenece a los datos — un nodo virtual pierde ante un registro real de la misma clave. La presentación, el hint de visualización, no
CanvasAugmentBuildersealed classLa superficie de escritura, solo cuatro cosas — miembros y reglas debajo de la tabla
GraphShapeRegistrysealed classNombre de pestaña → override de lienzo. Register(tabName, IRecordCanvasAugmenter) (pestaña duplicada / nombre vacío / null lanzan excepción) · TryGet · IsEmpty
GraphBuildContextsealed classLa entrada de solo lectura del override. Tables (pestaña → SheetTable) · ReferenceIndex References · IReadOnlyList<CodeRegistrySource> CodeRegistries (vacío, nunca null). Sin recolector de errores — un lienzo es visualización, no validación
GraphSpecBuildersealed classEl ayudante de ensamblaje del grafo. constructor (GraphBuildContext) · estático NodeKey(tab, recordId) (la única verdad a la que apuntan los cables) · AddNode(GraphNodeSpec) (gana el primer (Key, Column)) · AddWire(GraphWireSpec) · AddWire(fromKey, toKey, label, fromTab, fromRecordId, fieldName, isCyclic = false, cyclicNote = null) (la sobrecarga que también nombra la celda en la que se escribe el enlace, que es lo que hace editable el cable)
GraphSpecsealed classEl resultado ensamblado que dibuja el lienzo — Nodes · Wires (el ensamblaje pasa por el builder; el constructor es internal)
GraphNodeSpecsealed classUn nodo. Key · Tab · RecordId · Title · Subtitle · Category · CellCoordinate Address · Column / Row (celdas de cuadrícula que el lienzo ya resolvió — se transportan aquí, no se eligen) · IsFocus (el término) · IsMissing · InCount · IsCyclic
GraphWireSpecsealed classUn cable. FromKey · ToKey · Label · IsCyclic · CyclicNote, más la celda propietaria opcional: FromTab · FromRecordId · FieldName · RecordEdge? SourceEdge (null = cable solo de visualización; el lienzo entonces dice que no se puede editar). Los cinco argumentos de visualización no cambian, así que las llamadas existentes compilan y se renderizan igual
IAuthorableGraphShapeinterfaceCapacidad opcional que un IRecordCanvasAugmenter también puede implementar. IReadOnlyList<string> CreatableTabs(GraphBuildContext, string tabName) — dónde puede el lienzo crear un registro (vacío = en ningún lugar). Los dos valores predeterminados sin ella están debajo de la tabla

CanvasAugmentBuilder — la superficie de escritura. Solo cuatro cosas:

  • AddNode(tab, recordId, title = null, category = null) / AddNode(tab, recordId, title, category, CellCoordinate address) — un nodo virtual para una identidad que no es un registro de hoja (una clave de evento, un átomo de código); la pestaña puede estar vacía.
  • AddEdge(fromTab, fromRecordId, toTab, toRecordId, label = null, fieldName = null, fieldOnTarget = false, isCyclic = false, cyclicNote = null) — una arista extra que el escáner del core no puede ver. Nombrar fieldName indica en qué celda se escribe el enlace, fieldOnTarget indica que esa celda está en la llegada en lugar de la salida, y el par de ciclo marca un bucle para visualización con la nota que solo el dominio conoce.
  • SetLayer(tab, recordId, layer) — un hint de capa absoluto (0 = más a la izquierda, negativo = más a la izquierda todavía, todo se desplaza a la derecha para compensar). SetLayerRelative(tab, recordId, offset) — lo mismo contado desde el término (−1 = una columna a su izquierda), resuelto contra la columna del término antes de que cualquier hint la moviera.
  • SetSubtitle(tab, recordId, subtitle) — un hint de visualización, lo único que se aplica a registros que ya existen y a registros que no están en pantalla (el selector de conectar los lee).

Los elementos con clave vacía se ignoran, y lo recopilado es interno, porque las reglas de fusión viven en un solo lugar. Cada ampliación es al final, así que un override escrito contra una superficie anterior sigue compilando.

IAuthorableGraphShape — los dos valores predeterminados sin ella:

  • La lista de pestañas creables que esta capacidad reemplaza — el eje que también decide si un lienzo se abre siquiera y hasta dónde llega el barrido de filas pendientes — cubre toda pestaña alcanzable desde la pestaña de foco siguiendo el esquema transitivamente.
  • La cascada de enlace que el usuario realmente ve empieza desde las pestañas a las que apuntan los puertos actualmente dibujados.

Ambas descartan las pestañas de registro de código y las pestañas sin columna clave. Una pestaña que esto devuelve y que ningún puerto dibujado acepta permanece listada en la cascada de enlace con su motivo adjunto, y las propias barreras de la ventana se siguen aplicando encima.

Preajustes de color (SheetForge.Core.Theming)

TipoRol y miembros clave
ThemeRegistryId de preajuste → tema. Los ids en blanco, los duplicados y los dos ids integrados reservados lanzan una excepción. Register(SheetForgeTheme) · TryGet · Themes · IsEmpty · IsBuiltInId(id) · BuiltInDefaultId · BuiltInHighContrastId
SheetForgeThemeUn preajuste de color. Id · DisplayName · DarkColors / LightColors (IReadOnlyDictionary<ThemeColorSlot, uint>, copiado en la construcción) · TryGetColor(dark, slot, out rgb) · IsEmpty
ThemeColorSlotenum — los 33 roles de color que un preajuste puede sobrescribir (superficies, líneas, texto, colores semánticos, marcas de preparación, superficies de fallo, scrim, grafo). Los colores son 0xRRGGBB: Core no hace referencia a ningún tipo del motor, y los rellenos translúcidos derivan de un color de slot más un alfa fijo. Solo adición.

Un preajuste sobrescribe solo los slots que nombra; todos los demás slots mantienen el valor predeterminado del producto, así que un preajuste se mantiene válido a medida que se añaden slots. Registrar nunca aplica un preajuste — el usuario elige uno en Preferences ▸ SheetForge ▸ Theme.

Superficies de creación declarativas (SheetForge.Core.Studio)

Un plugin describe qué mostrar — la carcasa como datos, el predicado y el efecto como delegados — y cada host lo dibuja con sus propios widgets: UIToolkit en el editor, React en el navegador. Ningún número de layout aparece en ningún lugar. Qué decir es del plugin, cómo colocarlo es del renderizador.

Cada enum aquí es de solo adición, así que un registro conserva su significado a medida que crece el vocabulario.

TipoClaseRol y miembros clave
StudioUiRegistrysealed classLo que llena RegisterStudioUi. AddAction(StudioActionDescriptor) · AddPanel(StudioPanelDescriptor) · AddColumnBadge(StudioColumnBadgeDescriptor) · AddCellEditorHint(StudioCellEditorHint) · Actions / Panels / ColumnBadges / CellEditorHints · IsEmpty
StudioUiNodesealed classUn fragmento descrito, inmutable, construido mediante fábricas estáticas — las fábricas, las propiedades de lectura y la regla de URL están debajo de la tabla
StudioUiNodeKindenumLos 13 tipos de arriba (RowLink)
StudioActionDescriptorsealed classUn verbo. Id (único) · LabelKey (una clave de Loc; no registrada se muestra textualmente) · StudioActionPlacement Placement · Func<StudioSurfaceContext,bool> AppliesTo · Action<StudioSurfaceContext> Execute · ConfirmKey (opcional — el host pregunta esa frase primero). El host vuelve a comprobar AppliesTo al invocar, así que una entrada de menú obsoleta responde con un no-op honesto y un redibujado
StudioActionPlacementenumInspector · RowContextMenu · TopbarMenu · ColumnHeaderMenu · CanvasNodeMenu. Cada asiento llena campos de contexto distintos — el asiento de fila lleva el registro, el de columna el nombre de columna, el de lienzo el registro de ese nodo
StudioPanelDescriptorsealed classUn panel en el panel derecho de Studio. Id · TitleKey · Func<StudioSurfaceContext,StudioUiNode> Build — reconstruido en cada ciclo de recálculo, así que no guarda estado. Sin ningún panel registrado, el panel no se dibuja en absoluto
StudioColumnBadgeDescriptorsealed classUna insignia junto a un encabezado de columna. Func<StudioSurfaceContext,string,string,StudioUiNode> Provide (contexto, pestaña, campo) — null significa nada en esa columna
StudioCellEditorHintsealed class"Usa este widget integrado para este tipo" — elegir un tipo en lugar de suministrar uno. TypeName (un nombre de tipo exacto de CellParserRegistry; una celda de lista coincide por el nombre de su elemento; las celdas wrapper conservan el texto canónico y nunca coinciden) · StudioCellEditorArchetype Archetype · GetOptions (solo dropdown — Func<context, tab, field, IReadOnlyList<StudioCellOption>>) · SliderMin / SliderMax · ToggleTrueValue / ToggleFalseValue. Cuatro constructores, uno por cada forma de material. Se consulta después de que un IStudioCellEditorProvider registrado decline y antes de las ramas integradas; la pista de un paquete se consulta antes que las pistas integradas de abajo, así que registrar una bajo Color, AnimationCurve o Gradient anula el editor predeterminado para ese tipo. Un List<> cuya pista de elemento sea ColorPicker, CurveEditor o GradientEditor se convierte en un editor de chips en ambos hosts
StudioCellEditorArchetypeenumDropdown · MultilineText · Slider · Toggle · ColorPicker (texto de celda #RRGGBB / #RRGGBBAA) · CurveEditor (texto de celda = la notación canónica de CurveValue) · GradientEditor (texto de celda = la notación canónica de GradientValue). Solo se añade — los dos más nuevos son 5 y 6
BuiltinCellEditorHintsstatic classLas tres pistas que el propio Core declara — ColorColorPicker, AnimationCurveCurveEditor, GradientGradientEditor — recorriendo el mismo camino que las pistas de un paquete, así que el editor y el navegador no pueden elegir widgets distintos para ellas. IReadOnlyList<StudioCellEditorHint> All (orden fijo) · bool TryGet(typeName, out hint) (Ordinal). Los hosts consultan primero StudioUiRegistry.CellEditorHints y recurren a esta tabla como respaldo
StudioCellOptionsealed classUn candidato de dropdown — Value (el texto canónico escrito en la celda) · Label (lo que lee una persona; por defecto Value)
StudioSurfaceContextsealed classLa única costura que una extensión ve y a través de la cual actúa. Lectura: Tables · ReferenceIndex References · CodeRegistries · Tab · RecordId · Field · ActionArgument (el valor que confirmó un nodo Input). Mutación mediada, y nada más: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells (un paso de Undo, todo o nada) · Action<string,string> FocusRecord · Action RequestRebuild. La preparación pasa por la propia barrera de la ventana, así que un origen de solo lectura, una canalización en ejecución o una pestaña respaldada por un libro la bloquean con un motivo (constructor internal: el host lo ensambla)

StudioUiNode — fábricas, lecturas y la regla de URL:

  • Fábricas: Row · Label · Chip · Badge · Button · Rule · Heading · KeyValue · Table(headerRow, rows) · List · Progress · Input · Link, más WithTooltip(text), que devuelve un nuevo nodo en lugar de cambiar este.
  • Lecturas: Kind · Text · Tooltip · ThemeColorSlot? Tone (nunca un color codificado, así que sigue el tema) · ActionId · Detail · Ratio · Url · Children.
  • estático bool IsAllowedUrl(url) — solo http/https. Un predicado que ambos hosts consultan, así que no pueden discrepar sobre qué es seguro abrir.

Cadenas de UI de plugin (SheetForge.Core.Model)

TipoRol y miembros clave
StringOverlayRegistryRecolector y superposición de consulta para las cadenas de UI registradas por plugin; Loc.Tr (editor) y t() (navegador) la consultan antes que las tablas del producto. Register(key, language, value) · Register(key, IReadOnlyDictionary<string,string> byLanguage) · bool TryGet(key, language, out value) · RegisteredKeys. La coincidencia de idioma y los cuatro rechazos están debajo de la tabla

StringOverlayRegistry — coincidencia y rechazos. language es un código IETF ("en", "ko", "zh-Hans", "pt-BR", …), comparado sin distinguir mayúsculas/minúsculas. La búsqueda recae en idioma solicitado → inglés → fallo, y el fallback vive aquí para que ambos hosts respondan de forma idéntica.

Se rechazan cuatro registros, cada uno registrando un motivo dirigido al desarrollador en lugar de fallar en silencio:

  • una clave integrada del producto — una superposición puede añadir claves, nunca sobrescribir las propias frases o rutas de menú del producto;
  • una clave+idioma que otro paquete ya registró — gana el primero encontrado, porque de lo contrario el orden de instalación decidiría la pantalla;
  • una clave o un valor vacíos;
  • un código de idioma que el producto no conoce, que nunca se pliega a inglés.

Observación de la canalización (SheetForge.Core.Plugins / .Model)

TipoRol y miembros clave
IPipelineObserverNotificación de solo lectura. void OnImportCompleted(PipelineRunView view) — una vez por cada ciclo de importación explícito, al final de este, con éxito o con fallo. Deliberadamente no hay ningún hook que altere un valor o añada un diagnóstico (eso le corresponde a un tipo de celda y a IDomainValidator), ni ninguno que se ejecute en el pre-flight de preparación. Una excepción se aísla con su motivo recopilado; la salida de la importación no cambia. Los puntos de observación futuros llegan como interfaces de capacidad hermanas, con cast desde el observador registrado, así que una implementación escrita hoy sigue compilando
PipelineObserverRegistryLista de observadores de solo adición, con el orden preservado. Register(IPipelineObserver) · Observers
PipelineRunViewLa instantánea inmutable que recibe un observador — Success (validación, es decir, si se ensambló un registro; los resultados de codegen/bake se leen de los diagnósticos) · Tables (las pestañas que se analizaron; en una ejecución fallida, solo faltan las pestañas que no se pudieron analizar, porque "sin ensamblaje parcial" es una regla de salida, no de observación) · Diagnostics (la misma lista que muestra el informe) · SkippedTabs · EnumTabs. Las colecciones se copian en la construcción, y el constructor es internal, así que ninguna instantánea a medio construir puede entregarse a un observador

Registros de código (SheetForge.Core.Graphing)

Destinos de referencia que viven en código, expuestos a la superficie de creación como pestañas virtuales bloqueadas. Consumidos por Data Studio (barra lateral / grafo / inspector), no por el validador de importación.

TipoClaseRol y miembros clave
CodeRegistryCatalogsealed classRaíz de registro. Register(CodeRegistrySource) (null / nombre de pestaña vacío / nombre de pestaña duplicado lanzan excepción) · TryGet(tabName, out source) · Sources · IsEmpty
CodeRegistrySourcesealed classUna pestaña virtual bloqueada. string TabName · IReadOnlyList<CodeRegistryEntry> Entries (el orden de registro = orden de visualización)
CodeRegistryEntrysealed classUna entrada. string Key (a qué puede apuntar una referencia) · string Label · IReadOnlyList<string> Raises (null se normaliza a vacío). Core trata los tres como strings opacos

El modelo de lectura del IR (SheetForge.Core.Model)

TipoRol y miembros clave
SheetTableLa salida de análisis de una pestaña. SheetSchema Schema · IReadOnlyList<SheetRecord> Records
SheetSchemastring TabName · Fields · TryGetField(name, out FieldSchema) · SheetStyle Style (los metadatos de visualización @style de la hoja) · bool IsLocalizationSheet (el marcador @loc está presente) · IReadOnlyList<LocaleColumn> LocaleColumns (las columnas de configuración regional en el orden de columna original — vacía en una hoja que no es una hoja de localización, nunca null) · TryGetLocaleColumn(localeCode, out LocaleColumn) (búsqueda por código, sin distinguir mayúsculas de minúsculas) · TryGetSourceLocale(out LocaleColumn) (la primera columna de configuración regional; false cuando no hay ninguna)
SheetStyleEl valor de la fila @style — metadatos de visualización de una hoja. string Title (etiqueta de grupo de la barra lateral) · string ColorHex (#RRGGBB tal como se escribió) · bool HasColor · estático None (sin estilo). Nunca lo leen el codegen, el bake ni la huella del esquema
LocaleColumn (struct)Una columna de configuración regional de una hoja de localización — lo que la fila @loc escribió en esa columna. string Code (el código exactamente tal como está escrito; el Core valida la forma de la ortografía, nunca si la configuración regional existe) · string FieldName · int ColumnNumber (base 1) · bool IsSource (la primera columna de configuración regional — la que leen las vistas previas en línea y en la que escribe la generación automática de claves)
SheetRecordint RowNumber (original, base 1) · Values (campo → CellValue) · TryGet · indexador
FieldSchemaName · TypeToken Type · Description · ColumnNumber · DefaultValue · AllowOverlap · IReadOnlyDictionary<string,string> MarkerValues (nombre de marcador personalizado → el texto de celda de esta columna)
TypeTokenLa celda @type analizada. RawText · TypeName · TypeArgument · TargetName · IsList · IsOptional · HasExplicitDefault · DefaultValueText · AllowsEmptyCell · IsSelfKey · IsIntId (solo la clave entera propia de esta pestaña — la forma de referencia IntId@Tab se lee mediante TargetName + ReferenceScanner.GetReferencedTab, igual que RecordId@Tab) · TypeToken InnerToken / IsWrapper (tipos wrapper — interno recursivo) · IsCustomReference (esta columna es MyType@Tab donde el parser implementa IReferencingCellType; ReferenceScanner.GetReferencedTab es el único predicado que lo lee, que es cómo cada consumidor se activó sin un cambio de firma) · AssetTypeName (el <Type> de AssetRef@Group<Type> tal como se escribió, null cuando no hay restricción; el Core solo almacena el nombre — resolverlo es tarea de IAssetTypeResolver — y también se estampa en el token AssetRef dentro de una lista o un wrapper). Los tres parámetros finales del constructor (innerToken, isCustomReference, assetTypeName) tienen valor predeterminado, así que las llamadas existentes compilan, y los constructores anteriores de 8 y 10 argumentos se conservan como sobrecargas, de manera que los ensamblados de plugin ya compilados siguen funcionando sin necesidad de recompilar
CellValue (struct)Un valor de celda tipado; sin nulls (IsDefaulted marca los valores predeterminados materializados). object Value · IsDefaulted · AsList · estático Of / Defaulted
RecordId (struct)Un valor de clave (igualdad Ordinal). string Value · IsEmpty
RecordRefValue (struct)El valor de una celda RecordId@Tab. TargetTab · Id
IntRefValue (struct)El valor de una celda IntId@Tab — el gemelo de clave entera de RecordRefValue. string TargetTab · int Id · bool IsEmpty · estático Empty(tab) (un IntId@Tab? opcional que no apunta a nada)
LocRefValue (struct)El valor de una celda LocRef@Tab — el gemelo de localización de RecordRefValue, mantenido como un tipo aparte para que un consumidor sepa con solo mirar el valor que apunta a una tabla de strings. string TargetTab · string Key · bool IsEmpty · estático Empty(tab) · ReferencedKeys. Implementa IRefBearingValue, así que el escáner de referencias lo trata exactamente igual que a una referencia del núcleo
AssetRefValue (struct)El valor de una celda AssetRef@Group. Group · Key (la clave de un sub-asset es parent[sub])
EnumValue (struct)El valor de una celda Enum<T> (un par de strings — la conversión a CLR es tarea del bake). EnumName · MemberName

Referencias de asset tipadas (SheetForge.Core.Model)

El <Type> en AssetRef@Group<Type> lo resuelve el host — el Core no conoce ni el motor ni los ensamblados del proyecto — y el Core solo juzga el resultado. Todo lo de aquí son datos puros.

TipoClaseRol y miembros clave
IAssetTypeResolverinterfaceAssetTypeResolution Resolve(string rawName) — un nombre entra, un veredicto sale; el mismo nombre siempre obtiene la misma respuesta (las implementaciones pueden cachear). Se inyecta en ImportPipeline por separado de AssetKeyIndex, así que los nombres de tipo se resuelven incluso en un proyecto que todavía no tiene ajustes de Addressables; cuando no se inyecta ningún resolver (headless, navegador) los diagnósticos de nombre de tipo simplemente no se producen. La implementación del Editor resuelve contra los tipos de asset derivados de UnityEngine.Object que el proyecto tiene cargados (sin lista blanca; componentes y tipos de solo editor excluidos)
AssetTypeResolutionsealed classEl veredicto para un nombre — RawName · AssetTypeResolutionStatus Status · FullName (nombre completo CLR, tipos anidados con +; solo Resolved y NotReferenceable) · AssemblyName (el ensamblado que el ensamblado complementario generado debe referenciar — establecido para tipos de definición de ensamblado, null para módulos del motor y nombres no resueltos) · Candidates (nunca null: los candidatos ambiguos, o sugerencias de coincidencia más cercana para un nombre desconocido). Fábricas Resolved(raw, fullName, assemblyName) · Unknown(raw, suggestions) · Ambiguous(raw, candidates) · NotReferenceable(raw, fullName, assemblyName)
AssetTypeResolutionStatusenumResolved · Unknown (no existe tal tipo) · Ambiguous (el nombre corto coincide con varios tipos — escribe el nombre completo) · NotReferenceable (el tipo vive en un ensamblado predefinido como Assembly-CSharp, que el código generado no puede referenciar)

El codegen lee el diccionario resuelto que produce la canalización y emite AssetReferenceT<global::FullName> para un nombre resuelto; un nombre que no encuentra en ese diccionario nunca se emite tal cual — el campo recae en AssetReference y se recopila una advertencia AssetTypeUnresolvedFallback. El nombre completo resuelto también se mezcla en la huella del esquema.

Tipos de valor visuales (SheetForge.Core.Model)

Modelos de valor libres del motor para los tres tipos visuales integrados. Cada uno es inmutable, IEquatable, y posee su propia forma de texto (TryParse / Render) — la misma notación que documenta la página de Sintaxis de la hoja — así que un tipo de plugin que almacena un color, una curva o un degradado puede reutilizarlos en lugar de inventar una segunda notación. El Editor hace bake de ellos en UnityEngine.Color / AnimationCurve / Gradient y los vuelve a leer; el navegador los muestrea mediante los evaluadores de abajo en lugar de reimplementar las matemáticas.

TipoClaseRol y miembros clave
ColorValuereadonly structCuatro bytes R · G · B · A · estático Default (#00000000) · estático TryParse(text, out value, out error) (acepta #RGB / #RGBA / #RRGGBB / #RRGGBBAA) · Render() (mayúsculas, seis dígitos cuando es opaco)
CurveValuesealed classKeys (ascendente en el tiempo) · PreWrap / PostWrap · estático Empty (sin claves — el único estado sin forma de texto; Render() da "") · estático Create(keys, preWrap, postWrap)la única vía de construcción: ordena por tiempo, rechaza tiempos duplicados, y aplica CurveTangentSolver para que "el modo gana" se cumpla desde el momento en que existe una curva · estático TryParse (claves de 2/4/7/8 campos, Once aceptado como alias de ClampForever, tangentes Infinity/-Infinity) · Render() (claves de 8 campos, sufijo de ajuste solo cuando se necesita)
CurveKeyreadonly structTime · Value · InTangent · OutTangent · InWeight · OutWeight · CurveWeightedMode WeightedMode · CurveTangentMode LeftMode / RightMode · bool Broken; un constructor de diez argumentos sin normalización propia
CurveWrapenumClampForever · Loop · PingPong · Default — el vocabulario de ajuste de Unity por nombre (el mapeo del valor a WrapMode es tarea del baker)
CurveTangentModeenumFree = 0 · Auto = 1 · Linear = 2 · Constant = 3 · ClampedAuto = 4 — nombre y valor idénticos a AnimationUtility.TangentMode, así que el baker mapea por nombre y nunca toca los bits de tangente empaquetados de Unity
CurveWeightedMode[Flags] enumNone = 0 · In = 1 · Out = 2 · Both = 3 — qué lado de una clave usa tangentes ponderadas (Bezier)
CurveTangentSolverstatic classCurveKey[] Apply(IReadOnlyList<CurveKey> sortedKeys) — deriva los números de tangente que dicta un modo, aplicando las etapas en el orden del motor (Linear en su propio lado → ClampedAuto en ambos lados → Auto en ambos lados → Constant en su propio lado), dejando intactos los lados Free y los pesos. CurveValue.Create lo llama, así que rara vez hace falta invocarlo directamente
CurveEvaluatorstatic classfloat Evaluate(CurveValue, float time) · float[] Sample(CurveValue, int count) (count ≥ 2, distribuidos uniformemente desde la primera hasta la última clave) — Hermite entre claves, Bezier ponderado en los lados cuyo indicador de peso está activado, una retención cuando una tangente es infinita, y los cuatro comportamientos de ajuste fuera del rango de claves; verificado contra AnimationCurve.Evaluate en curvas aleatorias
GradientValuesealed classColorKeys · AlphaKeys (de 1 a 8 cada una, ascendentes en el tiempo) · GradientBlend Mode · GradientColorSpace ColorSpace · estático Default (blanco, totalmente opaco, Blend) · estático Create(colorKeys, alphaKeys, mode, colorSpace) (valida los recuentos y los rangos 0…1, cuantiza los tiempos a 16 bits como hace Unity, ordena de forma estable) · estático TryParse (tres o cuatro secciones separadas por `
GradientColorKeyreadonly structColorValue Color (el alfa se ignora — el alfa tiene sus propias claves) · float Time
GradientAlphaKeyreadonly structfloat Alpha · float Time
GradientBlendenumBlend · Fixed · PerceptualBlend
GradientColorSpaceenumUninitialized (no escrito; se lee como Gamma) · Gamma · Linear — solo PerceptualBlend se ve afectado
GradientEvaluatorstatic classColorValue Evaluate(GradientValue, float time) · ColorValue[] Sample(GradientValue, int count) — mezcla lineal, escalonada o perceptual (Oklab), con las claves de alfa mezcladas por separado, redondeadas a bytes; verificado contra Gradient.Evaluate en degradados aleatorios

Errores y resultados (SheetForge.Core.Model / .Reporting)

TipoRol y miembros clave
ImportErrorError estructurado y neutral respecto a la configuración regional. Code · Severity · Coordinate · ActualValue · Expected · Suggestion
ImportErrorCode (enum, 105)El catálogo completo del "por qué" — las familias que cubre se listan debajo de la tabla. Solo adición, porque las tablas de renderizado se basan en los valores de los miembros
ImportSeverity (enum)Error (bloquea la salida) · Warning
CellCoordinate (struct)Pestaña · fila base 1 · columna base 1 · campo; calcula la letra de columna de la hoja de cálculo. Fábricas ForTab / ForRow
ErrorCollectorEl receptor de "recopilarlo todo". All · HasErrors · ErrorCount · Add
ImportResultLa salida de la canalización. Invariante: Success == false ⇔ Registry == null. Success · Registry · Diagnostics · SkippedTabs · EnumTabs (pestañas leídas como hojas de definición de enum, así que nunca se analizan como tablas de datos — se mantienen aparte de SkippedTabs, que significa "todavía sin tabla escrita", para que el recuento de omitidas del informe siga siendo veraz; ambos son conjuntos de preservación que conservan el código generado, los assets horneados y las direcciones de esas pestañas) · estático Succeeded / Failed
ImportReport (.Reporting, ensamblado SheetForge.Core.Tooling)La entrada de los renderizadores de informes — Timestamp · SourceDescription · TabCount · RecordCount · Success · Diagnostics · ErrorCount · WarningCount · SkippedTabCount (cuántas de TabCount fueron hojas vacías omitidas en lugar de importadas — el encabezado lo imprime para que un recuento de pestañas no se confunda con "todas importadas")
ImportReportText (.Reporting, ensamblado SheetForge.Core.Tooling, static)Renderiza un informe al propio string legible para humanos del producto, sin escribir nada en la consola y sin añadir enlace de salto ni línea de coordenadas de máquina (eso pertenece a la convención propia de la consola). string Render(ImportReport report, IReadOnlyDictionary<string,string> languageTable = null, string operationName = null) — omite la tabla para inglés; el nombre de la operación, cuando se omite, se lee de la misma tabla para que la frase nunca mezcle dos idiomas. Quien llama desde el Editor normalmente quiere SheetForgeActions.RenderReportText(report), que rellena el idioma actual del editor (un ensamblado puro no puede leer EditorPrefs)

ImportErrorCode — las familias que cubre:

  • marcadores, esquema, tipos, celdas, claves/referencias y claves de asset;
  • orígenes/archivos, csv/xlsx, identificadores de codegen, addressables, baseline/exportación, Google/autenticación/Push y plantillas;
  • plugins — PluginRegistrationConflict, más PluginIncompatible cuando la declaración de compatibilidad de un ensamblado cae fuera de lo que este host lee;
  • IntId — DuplicateIntId, y para referencias IntId@Tab: UnresolvedIntId · TargetTabHasNoIntId;
  • @overlap y DomainRuleViolation;
  • hojas de definición de enum — EnumSheetMarkerConflict · DuplicateEnumName · EnumSheetEmptyColumn · InvalidEnumIdentifier · InvalidEnumUnderlyingType · InvalidEnumMemberValue;
  • DropdownNotSupportedByFormat, que es una advertencia en lugar de un error;
  • referencias de asset tipadas — UnknownAssetType · AmbiguousAssetType · AssetTypeNotReferenceable (una vez por columna, en la fila @type), AssetTypeMismatch por celda, y la advertencia de codegen AssetTypeUnresolvedFallback.

Índices y utilidades (SheetForge.Core.Validation / .Model / .Parsing / .Unparse)

TipoRol y miembros clave
TabKeyIndexLa información de clave de una pestaña — la columna de clave de tipo string más el conjunto de clave entera IntId de la pestaña, así que tanto las referencias RecordId@Tab como IntId@Tab se resuelven contra él. TabName · KeyField · HasKeyColumn · Keys · Contains(id)
KeyIndexBuilder (static)Construye los índices de clave (las claves de tipo string y el conjunto de clave entera IntId, en una sola pasada), reporta errores de clave, valida columnas IntId. Build(SheetTable, ErrorCollector) · ValidateIntIdColumns
AssetKeyIndexGrupo → conjunto de claves válidas (el Editor lo llena a partir del catálogo de Addressables, incluidas las claves de sub-asset; inyectar null = omitir la validación de assets). Register(group, keys) · HasGroup · HasKey · KeysOf · GroupNames, más la capa de tipos que usa AssetRef@Group<Type>: RegisterTyped(group, key, satisfiedTypeFullNames) (la clave y la clausura de nombres completos de tipo bajo los que se puede cargar — su propio tipo, sus bases, sus interfaces, los tipos de sus sub-assets; volver a registrar une la clausura) · HasTypeInfo(group, key) · SatisfiesType(group, key, typeFullName). Una clave registrada con el Register simple no tiene clausura y queda exenta de la comprobación de tipo en lugar de fallarla
LocalizationCoverage (static)La cobertura por configuración regional y las claves huérfanas de una hoja de localización. Un cálculo puro que devuelve listas en lugar de recolectar errores, porque una celda sin traducir y una clave sin usar son estados normales y no salidas que haya que bloquear. IReadOnlyList<LocaleCoverage> Compute(SheetTable) · IReadOnlyList<string> FindOrphanKeys(locTabName, tables) (las claves a las que no apunta nada; deliberadamente conservador — toda forma de referencia que el escáner conoce cuenta como un uso, así que una traducción viva nunca se llama huérfana)
LocaleCoverage (sealed class)La cobertura de una configuración regional. LocaleColumn Locale · int TotalKeys · int TranslatedKeys · IReadOnlyList<string> MissingKeys (en el orden de fila de la hoja, nunca null) · bool IsComplete
TextSuggestion (static)Sugerencias de coincidencia más cercana (Levenshtein acotado, determinista). FindNearest · Distance · DistanceWithin
BuiltinCellParsers (static)CreateDefaultRegistry() — los 12 analizadores integrados (int, float, bool, string, Enum, RecordId, AssetRef, IntId, LocRef, Color, AnimationCurve, Gradient).
CanonicalValueRenderer (static)Valor → string de celda canónico (exportación/Push). TryRender(…) (delega un ColorValue / CurveValue / GradientValue a su propio Render(); una curva sin claves se renderiza como la celda vacía) · RenderFloat(float) (ida y vuelta más corta)

Plan de Push (SheetForge.Core.Unparse)

Públicos porque IPushApprover.Approve(PushPlan) los expone; datos puros.

TipoRol
PushPlan (ensamblado SheetForge.Core.Tooling, igual que las tres filas siguientes)El plan de envío completo. Tabs · HasWork
PushTabPlanUna pestaña: Writes · Appends · Deletes (clave + número de fila; DeleteNotices sigue siendo la vista de solo clave)
PlannedCellWriteUna escritura de celda — coordenadas, celda del baseline, nuevo valor/texto, indicador de familia de string
PlannedRowAppendUna fila añadida — textos de celda completos + columnas de familia de string

Ensamblado Editor (SheetForge.Editor)

Ajustes, localización, composición (SheetForge.Editor.Pipeline / .Localization)

TipoRol y miembros clave
SheetForgeSettings (SO)El asset de ajustes. Campos: sourceProviderId (único eje de selección de origen; vacío = LocalFile integrado) · localFolderPath · bakeOutputFolder · generatedCodeFolder · generatedNamespace · exportFolderPath · exportFormat · spreadsheetId · googleAccessMode · serviceAccountKeyPath · gidMap (lista de GidMapEntry { tabName, gid }). Propiedades resueltas Effective*.
Loc (static)El punto de entrada de la localización. Tr(key) · TrContent(…) · Table · constante MenuRoot. Tr se resuelve en cuatro pasos: string registrado por plugin (idioma actual, luego inglés — la superposición posee ese fallback, consulta StringOverlayRegistry) → tabla integrada (idioma actual, luego inglés) → la propia clave. Hay exactamente un canal de registro para las cadenas de plugin, así que "cuál registro gana" nunca se convierte en una pregunta
PluginRegistry (static)Descubre los plugins mediante TypeCache, y entrega los candidatos a PluginComposition.Compose. Build · BuildValidators · BuildEdgeContributors · BuildStructuralMarkers · BuildTemplates · BuildGraphShapes · BuildCodeRegistries · BuildThemes · BuildAll (paquete) · InvalidateCache() (descarta la caché de duración del reload — la misma convención que SourceProviderRegistry.InvalidateCache; también descarta la caché de la barrera de compatibilidad, así que un conjunto de descubrimiento cambiado se vuelve a juzgar). El paquete y el aislamiento de slots están debajo de la tabla
ImportEvents (static)Bus de eventos del lado del Editor — un contrato público: los assets externos pueden suscribirse. event Action<ImportCompletedArgs> ImportCompleted · RaiseImportCompleted(ImportCompletedArgs) se disparan solo cuando una importación se ejecutó hasta el final, pasando por el bake, así que un suscriptor puede leer los assets generados mediante bake. event Action<BaselineUpdatedArgs> BaselineUpdated · RaiseBaselineUpdated(BaselineUpdatedArgs) se disparan siempre que se guardó una instantánea de hoja — incluida una ejecución que falló la validación — que es cómo una superficie de creación se refresca ante una importación en cuarentena. Dos ejes, deliberadamente no fusionados: uno significa "las hojas se movieron", el otro "los assets se movieron"
BaselineUpdatedArgs (sealed)Carga útil de guardado de baseline. IReadOnlyList<string> Tabs (las pestañas escritas en la instantánea) · bool Quarantined (si la instantánea recién guardada falló la validación)
SheetForgeActions (static)La fachada de ejecución — el mismo ciclo que ejecuta un clic de menú, invocable desde un script de CI, un hook de build o tu propio botón. RunImport() · RunExport() · RunPush() · RunHealthCheck() · RunLocalizationSync() (cada uno delega; la resolución de ajustes, la barrera de Addressables, la exclusión mutua, los modales de confirmación, la barra de progreso y la reanudación codegen→compilación→bake se quedan todos dentro del producto) · bool IsBusy · bool TryBeginExclusiveScope(out IDisposable scope) (false + scope = null cuando algo ya está en ejecución; el scope es lo que libera, y un segundo Dispose no puede liberar la ejecución de otra persona) · string RenderReportText(ImportReport) (las propias frases del producto en el idioma actual del editor, sin escribir en la consola). La semántica de finalización está debajo de la tabla
SheetForgeEditorInfo (static, namespace SheetForge.Editor)Ancla del ensamblado Editor — const Version, el espejo de SheetForgeRuntimeInfo para activar funciones según la superficie del lado del editor
ImportCompletedArgs (sealed)Carga útil de finalización que se pasa a los suscriptores. IReadOnlyList<string> Tabs (pestañas incorporadas mediante bake en esta finalización) · string BakeFolder (carpeta de los Database-SO). Patrón de objeto de argumentos — los campos futuros no romperán la firma del evento.
GoogleSheetAccessMode (enum)SheetsApi (con autenticación, escribible) · ExportUrl (sin autenticación, de solo lectura)
ExportFormat (enum)Tsv · Csv · Xlsx · Json · MatchSource

PluginRegistry — el paquete y el aislamiento de slots. El PluginBundle anidado expone el PluginSet Set ensamblado — la única verdad de doce slots, que es cómo se lee un slot recién crecido sin ampliar el paquete — más nueve ventanas de conveniencia sobre él: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes. Los constructores anteriores de seis y ocho argumentos se mantienen como sobrecargas que ponen los registros posteriores en vacío por defecto, lo que se comporta igual que las versiones anteriores a esos contratos.

El aislamiento es del Core, no de este tipo: un plugin que lanza una excepción al registrarse se reporta por nombre y se omite, y todos los demás slots y plugins se siguen registrando.

SheetForgeActions — semántica de finalización. RunImport/RunPush son fire-and-forget. Sus cuerpos son async void porque el hilo principal del editor no puede bloquearse en E/S de red, así que el retorno no es la finalización — suscríbete a ImportEvents.ImportCompleted para eso. RunExport/RunHealthCheck/RunLocalizationSync se completan de forma síncrona — RunLocalizationSync recorre la ruta hoja → StringTable que recorre la finalización de una importación, y sin el paquete Unity Localization muestra el aviso de instalación y no cambia nada.

Costura de proveedor de origen (SheetForge.Editor.Sources)

TipoRol y miembros clave
ISheetSourceProviderEl contrato del proveedor. Id · DisplayNameKey · CreateTabSource(settings) · GetVisibility(settings) · CanAuthor(settings) · CreateReflectTarget(dispatcher, settings)
ISourceReflectTargetEl destino de escritura de vuelta. void Reflect()
SourceVisibilityQué campos de ajustes mostrar — 5 indicadores bool
SourceProviderRegistry (static)Descubrimiento/resolución. All · ResolveActive(SheetForgeSettings) y ResolveActive(string providerId) (resuelve directamente desde un id, sin tener un asset de ajustes a mano) · TryGet · InvalidateCache
ITabSourceLa abstracción de obtención (fetch). Description · Task<TabSourceResult> FetchAsync()
TabSourceResultPestañas (nombre → TSV en bruto) + diagnósticos + formatos por pestaña; se permite salida parcial. Create estático
TabSourceFormat (enum)Tsv · Csv · Xlsx · GoogleSheet

Puntos de extensión de Data Studio (SheetForge.Editor.Studio)

Del lado del Editor porque tocan UIElements / estado de ventana — la misma asimetría justificada que ISheetSourceProvider. Los cuatro contratos los descubre TypeCache (constructor sin parámetros; sin llamada de registro), y todos se llaman dentro de try/catch. La propia ventana (DataStudioWindow) es internal.

Cualquier cosa expresable como datos pertenece en su lugar al vocabulario ISheetForgeStudioPlugin del Core, que también se renderiza en el navegador. Estas son las vías de escape sin techo para lo que la descripción no puede decir.

Las últimas cuatro entradas no son contratos sino herramientas que un widget montado puede usar:

  • los propios valores de skin de solo lectura de la ventana, para que pueda parecer que pertenece ahí;
  • el menú desplegable de claves, para que un widget de celda elija claves de la misma manera que la celda integrada;
  • y el reinicio de la caché de descubrimiento, para que tus propias pruebas puedan volver a descubrir una sonda.
TipoClaseRol y miembros clave
IStudioGraphWidgetinterfaceUna franja de dominio encima del lienzo de grafo (Core no incluye ninguna). bool AppliesTo(StudioGraphContext) · VisualElement Create(StudioGraphContext) (se recrea en cada reconstrucción del grafo — no mantiene estado; null no añade nada)
StudioGraphContextsealed classSolo lectura: Tab y FocusRecordId (el término) · SheetRecord FocusRecord (null cuando no se resuelve) · Tables · ReferenceIndex References · CodeRegistries. Dos ejes retirados permanecen por compatibilidad de firma y están marcados [Obsolete]: ShapeId (siempre "record") y ModeId (siempre vacío). Comparar cualquiera de los dos compila y nunca es verdadero, así que ahora el compilador lo dice en lugar de dejar una rama muerta — elimina la comprobación. Sin superficie de preparación — los widgets son solo de visualización (constructor internal: la ventana lo ensambla)
IStudioCellEditorProviderinterfaceDibuja una celda de cuadrícula para un tipo con nombre. string TypeName (coincide con un tipo de CellParserRegistry o un nombre de wrapper, Ordinal; vacío se excluye) · VisualElement CreateEditor(StudioCellEditorContext) — devolver null declina esa celda y el widget integrado toma el control. Una reclamación duplicada sobre el mismo nombre de tipo avisa y conserva la primera encontrada
StudioCellEditorContextsealed classLo que recibe el widget de celda: Tab · FieldName · TypeToken Type · CurrentRawText (texto canónico con la preparación aplicada) · Action<string> Commit (un acto puntual — su propio paso de undo) · Action<string> CommitTyping (una ráfaga de teclas — se fusiona por celda) · Func<string,IReadOnlyList<string>> ReferenceKeys (las mismas claves candidatas que ofrece el selector integrado). Ambos commits pasan por la barrera de preparación de la ventana (constructor internal: la ventana lo ensambla)
IStudioInspectorActioninterfaceUn botón extra en el inspector de nodo. string LabelKey (clave de Loc; no registrada = se muestra textualmente, vacía = nombre del tipo) · bool AppliesTo(StudioInspectorContext) · void Execute(StudioInspectorContext)
StudioInspectorContextsealed classLectura: Tab · RecordId · SheetRecord Record · Tables · References · CodeRegistries. Mutación mediada: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells, ambos detallados debajo de la tabla. Servicios: Action<string,int,string> FocusCell · Action RequestRebuild. El AuthoringSession deliberadamente no se expone
IStudioPanelProviderinterfaceUn panel arbitrario de UIToolkit en el panel derecho de Studio — la vía de escape junto al StudioPanelDescriptor descriptivo. string Id · string TitleKey · bool AppliesTo(StudioSurfaceContext) · VisualElement CreatePanel(StudioSurfaceContext) (null no dibuja nada ese ciclo). Registra un panel descriptivo bajo el mismo Id y cada host toma lo que puede dibujar: el editor prefiere este, el navegador dibuja el descriptivo — así que "hasta donde llega el navegador, todo el camino en el editor" no necesita un segundo contrato. El elemento vive un ciclo de recálculo, así que no guarda estado
StudioPalettestatic classValores de color, espaciado y tipo de solo lectura con los que la propia ventana pinta, para que un widget que montes coincida con la ventana en lugar de codificar hex a mano. Cada slot se resuelve en el momento de la lectura, así que los widgets siguen el modo de brillo y el preajuste de color gratis. Elegir los valores (preajustes, brillo, predeterminados) permanece internal — los widgets siguen la paleta, no la repintan. La lista de miembros está debajo de la tabla
StudioThemestatic classSolo cuatro miembros: CategoryColor(category) (el mismo tono determinista que la ventana le da a esa categoría) · Np(text) (interpolación segura en una etiqueta de rich-text) · Mono / ApplyMono(element) (la política de fuente monoespaciada: solo claves, direcciones y números — las fuentes mono no tienen glifos CJK). Todo lo demás en este tipo es internal
StudioKeyPickerstatic classUn miembro: Show(Rect screenAnchor, string targetTab, IReadOnlyList<string> candidates, Action<string> picked, string acceptsLabel = null) — el mismo menú desplegable que abre la celda de referencia integrada, para un widget de celda que necesita llegar a una clave dentro de su propia notación. Elige una clave de los candidatos que suministras y la devuelve. Crear un registro, dejar la celda vacía, marcar varios elementos de una lista y preguntar qué puerto recibe la elección son reglas propias de la celda de referencia integrada, así que no están en esta fachada. picked es obligatorio (ArgumentNullException antes de crear ninguna ventana). Sin candidatos y sin nada que ofrecer, registra en el log en lugar de abrir una lista vacía. El tipo de ventana en sí permanece internal
StudioPluginRegistrystatic classUn miembro público: InvalidateCache() — descarta la caché de descubrimiento por reload para que una sonda que tus propias pruebas acaban de habilitar se vuelva a encontrar (la misma cortesía que ya ofrecían PluginRegistry y SourceProviderRegistry; este era el registro que faltaba). Las listas descubiertas permanecen internal: nada de fuera puede leer o reemplazar lo que la ventana va a montar

StudioInspectorContext — los dos delegados de preparación:

  • StageCell recibe tab, recordId, field y texto canónico en bruto. La ventana registra el paso de Undo, incrementa la generación de proyección y prepara la dirección lógica.
  • StageCells hace lo mismo para varias celdas que deben cambiar juntas: un solo paso de Undo nativo, todo o nada. Si una sola no se puede preparar, la sesión no se toca en absoluto.

Un fallo es silencioso en pantalla de todas formas, y solo la barrera se explica a sí misma. Un origen de solo lectura, una canalización ya en ejecución, o una pestaña respaldada por libro escriben su motivo en la consola. Una lista vacía, una escritura sin su pestaña o campo, y una clave de registro que no resuelve a ninguna fila no hacen nada y no dicen nada.

StudioPalette — los miembros:

  • 33 slots de color: Canvas · Panel · Band · Chrome · Surface · Chip · Selection · PendingCell · Line · LineSoft · GridLine · LineHover · Text · TextMuted · TextFaint · RefText · OnAccent · Accent · AccentDim · Warning · Danger · Ok · SheetTone · CodeTone · EditedCell · NewRowCell · NewRowLine · DangerChip · DangerPanel · Scrim · Wire · WireDot · GridDot.
  • IsDark.
  • Espaciado: SectionSpace · RowSpace · RuleHeight · ButtonHeight · PrimaryButtonHeight · GlyphWidth.
  • Tamaños de tipo: HeadingFontSize · SectionFontSize · CaptionFontSize.
  • FromRgb(uint) · ToHex(uint).

Aprobación de Push (SheetForge.Editor.Push)

TipoRol
IPushApproverbool Approve(PushPlan, string humanSummary) · bool ApproveStructureRewrite(string, bool hasLiveConflicts) — rechazar = cero envío
AutoPushApproverSiempre aprueba (para pruebas/automatización)

Motor de creación (SheetForge.Editor.Structure / .Pipeline / .Export)

TipoRol y miembros clave
AuthoringSessionEl propietario del estado en preparación (serializable — Undo gratuito + supervivencia a la recarga). Edits · IsolatedEdits · NewRows · StructOps · Reorders · TabRenames · EnumMembers (adiciones de miembro a hoja de enum en preparación) · AssetRegistrations (registros de Addressables preparados — a nivel de proyecto, así que no participan en las barreras por pestaña, pero sí cuentan para la entrada al reflejo, el descarte y el resumen del diff) · HasAssetRegistrations · StageAssetRegistration(r) (el mismo guid, o el mismo grupo para una creación de grupo, reemplaza en el sitio — gana la última intención; un registro sin identidad se rechaza) · RemoveAssetRegistrationsWhere(predicate) · SetStaged · ResolveBaselineEdits · RemapFieldName/RecordId/Tab · StageTabRename · EffectiveStructOps · PendingStructCount · TabNames · TryGetBaselineTable · LastProjectionResult · ClearAll (también limpia los registros)
AuthoringDispatcherEl orquestador del reflejo. Constructor (session, callbacks, baselines) · Reflect() · BuildProjectionResult() (consulta de proyección sin efectos secundarios) · IReadOnlyDictionary<string,string> BuildProjectedTabs() (la misma proyección como TSV por pestaña — lo que un destino de escritura de vuelta está a punto de enviar, previsualizable sin escribir) · void FinalizeReflectSuccess(IReadOnlyList<string> writtenTabs, IReadOnlyList<TabRenameEntry> committedRenames = null) (el final al que tiene que llegar la propia escritura de vuelta de un origen: la poda de retención para las pestañas que escribió, el límite ClearUndo, y la reimportación automática — las rutas integradas ejecutan el mismo cuerpo privado, así que un proveedor externo termina exactamente igual que ellas; una lista vacía es un no-op que mantiene la preparación intacta) · Session · Callbacks · Baselines
AuthoringDispatchCallbacks13 delegados generales de aspectos de la vista + IPushApproverResolveSettings · RenderReport (Action<ImportReport>, tolera null) · TriggerReimport · ConfirmKeyRenames · ConfirmTabRenames (tolera null) · ClearUndo · Rebuild · … Los delegados de diálogo integrados de Local/Google viven en el paquete opcional BuiltInSourceDialogs
BuiltInSourceDialogsPaquete opcional de 14 delegados de diálogo de los orígenes integrados Local/Google, separado de AuthoringDispatchCallbacks — los proveedores externos nunca los necesitan. NotifyLocalDone toma cinco argumentos; el último es la línea de resumen de registro de Addressables para el diálogo de finalización (null cuando no se preparó nada)
BaselineStore (.Export)Instantáneas de baseline en TSV normalizado, por pestaña

Tipos de valor de preparación (SheetForge.Editor.Structure; StagedCellEdit/StagedNewRow están en SheetForge.Editor.Windows)

TipoRol
StagedCellEdit (struct)Una edición en preparación — TabName · RowOrdinal · FieldName · RawText · RecordId (clave lógica)
StagedNewRowUna fila nueva en preparación — TabName · FieldNames · CellTexts
StructureOpUna operación de estructura — Kind · coordenadas · textos · permutación Order
StructureOpKind (enum)AddColumn · RemoveColumn · AddMarker · RemoveMarker · RemoveDataRow · ReorderColumns · ReorderDataRows · RenameColumn · EditColumnType · EditColumnDesc · SetColumnOverlap · SetSheetStyle
TabReorderEntryEl estado de reordenamiento por pestaña — Tab · ColOrder · RowOrder
TabRenameEntry (struct)OldName · NewName
StagedEnumMember (struct)Un "añadir este miembro a este enum" en preparación — TabName (qué hoja de enum; vacío = buscar en todas) · EnumName · Member. A nivel de sesión en lugar de un StructureOp, por la misma razón que un renombrado de pestaña: una hoja de enum no tiene tabla, ni esquema, ni columna clave, así que la dirección (pestaña, registro, campo) de una edición de celda no puede nombrar "el siguiente miembro de este enum". Público solo porque AuthoringSession.EnumMembers lo es (CS0050)
StagedAssetRegistration (struct)Un cambio en preparación a los ajustes de Addressables del proyecto, hecho al soltar o elegir un asset en una celda AssetRef@GroupStagedAssetRegistrationKind Kind · Guid (el asset; un sub-asset prepara a su padre) · Group · FromGroup (solo movimientos) · Address (el nombre del archivo sin extensión para una entrada nueva; un asset ya registrado conserva su dirección) · AssetPath (para mostrar). Fábricas Add(guid, group, address, assetPath) · Move(guid, fromGroup, group, address, assetPath) · CreateGroup(group). Se ejecuta después de que la escritura de la hoja tenga éxito, y luego se limpia. Público solo porque AuthoringSession.AssetRegistrations lo es (CS0050), igual que StagedEnumMember
StagedAssetRegistrationKind (enum)Add · Move · CreateGroup
TabBaselineAnchor (struct)TabName · Fingerprint · RecordCount
IsolatedEditUna edición cuyo reanclaje falló — Edit · Reason
IsolationReason (enum)Renombrado externo / eliminación externa / conflicto de clave

Ayudantes de creación (SheetForge.Editor.Windows / .Structure)

TipoRol
KeyRenamePlanner (static)Planificación de renombrado de clave + propagación entre pestañas. Plan(…) · KeyRenamePlan anidado · struct hermano KeyRename
RecordIdMinter (static, pure)Sugerencias de id. Suggest · DetectCommonPrefix · Uniquify · StagedNewRowKeys
IntIdMinter (static, pure)Sugerencia del siguiente IntId para un registro nuevo — Suggest(existingIds)max + 1. Un eje separado de RecordIdMinter, y nunca reutiliza un hueco eliminado
ProjectionErrorMapper (static, pure)Coordenada de error → dirección lógica. TryMap(…) · LogicalAddress anidado
EphemeralSoApply (static)Superposición temporal de valores en preparación sobre el SO. Apply(…) · InvalidateIndex(…) · Report / SkipReason / SkippedEdit anidados

Ensamblado Runtime (SheetForge.Runtime)

autoReferenced — utilizable desde el código del juego sin una referencia de asmdef.

TipoRol y miembros clave
SheetForgeDatabases (static)El cargador de runtime — la ruta de carga sancionada. const AddressPrefix = "SheetForge/" · AddressFor(tab) · LoadAsync(tab) · LoadAsync<TDatabase>(tab) · Release(handle) / Release<TDatabase>(db). Los ayudantes de dirección son strings simples y siempre compilan; LoadAsync y Release solo existen bajo SHEETFORGE_ADDRESSABLES, el version-define que se activa cuando com.unity.addressables está instalado — que es lo que permite que el producto compile sin el paquete
DefinitionDatabase (abstract SO)La base de todo Database generado por pestaña. abstract TabName · abstract Count · virtual IReadOnlyList<object> RecordsUntyped · virtual InvalidateIndex(). RecordsUntyped es la forma sancionada de enumerar una pestaña horneada (bake) sin conocer su tipo generado — un segundo baker o un inspector que recorre todas las pestañas solía tener que usar reflexión sobre el campo privado records, lo que convertía un nombre de campo en un contrato no declarado que se rompería en silencio el día que el codegen lo renombrara. Trata la lista como de solo lectura (la hoja es canónica). Su valor predeterminado es vacío, así que el código generado de antes de que este miembro existiera sigue compilando y funcionando; una reimportación emite el override
RecordRef (struct)El valor de referencia serializado dentro de los SO generados mediante bake (id de tipo string, resuelto en la consulta). Id · IsEmpty
IntRef (struct)El valor de referencia serializado de clave entera dentro de los SO generados mediante bake — el gemelo de RecordRef para los campos IntId@Tab. Como 0 es un id válido, un bit hasValue respalda IsEmpty. Id · IsEmpty. El codegen emite un campo IntId@Tab como IntRef, y TryGet(IntRef) en la Database generada lo consume
LocRef (struct)La referencia de localización serializada dentro de los SO generados mediante bake — una celda LocRef@Tab. Table (la pestaña de localización, que es el nombre de la colección StringTable) · Key · long KeyId (0 significa "aún no resuelto": una importación hace bake de 0 y el puente rellena el id real después de una sincronización de tabla, así que una referencia sobrevive al renombrado de una clave) · IsEmpty. Siempre compila — el código generado y los assets generados mediante bake nunca contienen un tipo del paquete de localización, que es lo que mantiene el paquete opcional
LocRefExtensions (static)Un único miembro: LocalizedString ToLocalizedString(this LocRef) — apunta por KeyId cuando ese no es 0 y por nombre de clave en caso contrario, y una referencia vacía se convierte en un LocalizedString vacío. Existe solo cuando com.unity.localization está instalado, bajo el version-define SHEETFORGE_LOCALIZATION — la misma disposición que usa SHEETFORGE_ADDRESSABLES para la capa de Addressables
SheetForgeRuntimeInfo (static)const Version

Tipos generados (patrón — por proyecto, no es API distribuida)

Para cada pestaña Foo, el codegen emite en tu generatedNamespace:

public sealed partial class FooDefinition    // one strongly-typed field per column; @desc → doc/tooltip
public sealed partial class FooDatabase : DefinitionDatabase
{
    // TabName, Count, SchemaFingerprint, Records, RecordsUntyped override,
    // lazy _byId/_byIntId lookups, InvalidateIndex override
}

Carga con SheetForgeDatabases.LoadAsync<FooDatabase>("Foo").

Ambas clases se emiten como partial, así que puedes añadir miembros derivados — una propiedad calculada, una implementación de interfaz, un operador — en tu propio archivo junto al generado, y una reimportación no lo sobrescribirá. Un límite: no añadas campos serializados en tu parte. El ScriptableObject horneado (bake) se reconstruye desde la hoja en cada importación, así que cualquier cosa que solo serialice tu parte vuelve a su valor predeterminado — si un valor pertenece a los datos, pertenece a una columna. (La palabra clave partial no afecta a SchemaFingerprint, que se calcula solo a partir del esquema, así que hacer las clases partial no invalidó ni un solo bake existente.)


Otros ensamblados

  • SheetForge.Setup — el bootstrap sin dependencias para la ausencia de Addressables. Sin API pública (todo internal; existe para mostrar una ventana de orientación).

  • SheetForge.PluginDemo (un asmdef combinado + un asmdef Demo.Editor; el namespace del contenido sigue siendo SheetForge.Skills) — el paquete de ejemplo de referencia, no es API del producto. Contiene:

    • SkillsPlugin (siete interfaces de plugin — base, validador, arista, plantilla, grafo, registro de código, tema);
    • Modifier + ModifierCellParser (tipo de celda personalizado), ModifierStatEdgeContributor (contribuyente de aristas);
    • ExamplePipelineAugmenter / ExampleReactiveAugmenter (overrides de lienzo), ExampleCodeAtoms (el registro de código _Refs);
    • ExampleStudioUi (acciones declarativas, panel, insignia de columna y pista de editor de celda), ExampleImportObserver (observador de canalización);
    • ExampleStageStripWidget / ExampleInspectorAction / ExampleStudioPanel (puntos de extensión del Editor de Data Studio, pintados desde la paleta pública), ExampleLocStrings (registra esas etiquetas en dos idiomas — en el ensamblado principal, así que el navegador también las muestra);
    • una declaración SheetForgePluginCompat a nivel de ensamblado;
    • SkillRunner (consumo en runtime), tipos Example* generados en el espacio de nombres predeterminado SheetForge.Generated (el aislamiento es mediante el prefijo Example*, no un espacio de nombres separado).

    El ejemplo sin plugin SheetForge.CoreDemo se distribuye con cero asmdefs (compila dentro de Assembly-CSharp).

Páginas relacionadas