from idecomp.decomp.modelos.dadgnl import LeituraDadGNL
from idecomp.decomp.modelos.dadgnl import TG, GS, NL, GL
from idecomp._utils.arquivo import ArquivoRegistros
from idecomp._utils.dadosarquivo import DadosArquivoRegistros
from idecomp._utils.escritaregistros import EscritaRegistros
from typing import Type, List, Optional, TypeVar, Any
[documentos]class DadGNL(ArquivoRegistros):
"""
Armazena os dados de entrada das térmicas de
despacho antecipado do DECOMP.
Esta classe lida com as informações de entrada fornecidas ao
DECOMP no `dadgnl.rvx`. Possui métodos para acessar individualmente
cada registro, editá-lo e também cria alguns novos registros.
É possível ler as informações existentes em arquivos a partir do
método `le_arquivo()` e escreve um novo arquivo a partir do método
`escreve_arquivo()`.
"""
T = TypeVar("T")
def __init__(self,
dados: DadosArquivoRegistros) -> None:
super().__init__(dados)
# Override
[documentos] @classmethod
def le_arquivo(cls,
diretorio: str,
nome_arquivo="dadgnl.rv0") -> 'DadGNL':
"""
Realiza a leitura de um arquivo "dadgnl.rvx" existente em
um diretório.
:param diretorio: O caminho relativo ou completo para o diretório
onde se encontra o arquivo
:type diretorio: str
:param nome_arquivo: Nome do arquivo a ser lido, potencialmente
especificando a revisão. Tem como valor default "dadgnl.rv0"
:type nome_arquivo: str, optional
:return: Um objeto :class:`DadGNL` com informações do arquivo lido
"""
leitor = LeituraDadGNL(diretorio)
r = leitor.le_arquivo(nome_arquivo)
return cls(r)
[documentos] def escreve_arquivo(self,
diretorio: str,
nome_arquivo="dadgnl.rv0"):
"""
Realiza a escrita de um arquivo com as informações do
objeto :class:`DadGNL`
:param diretorio: O caminho relativo ou completo para o diretório
onde será escrito o arquivo.
:type diretorio: str
:param nome_arquivo: Nome do arquivo a ser escrito.Tem como valor
default "dadgnl.rv0"
:type nome_arquivo: str, optional
"""
escritor = EscritaRegistros(diretorio)
escritor.escreve_arquivo(self._dados, nome_arquivo)
def __obtem_registro_do_estagio(self,
tipo: Type[T],
codigo: int,
estagio: int) -> Optional[T]:
regs: List[Any] = self.__obtem_registros(tipo)
for r in regs:
if all([r.codigo == codigo,
r.estagio == estagio]):
return r
return None
def __obtem_registros(self,
tipo: Type[T]) -> List[T]:
registros = []
for b in self._registros:
if isinstance(b, tipo):
registros.append(b)
return registros
[documentos] def tg(self, codigo: int, estagio: int) -> TG:
"""
Obtém um registro que define uma usina termelétrica existente
no estudo descrito pelo :class:`DadGNL`.
:param codigo: código que especifica o registro
da UTE
:type codigo: int
:param estagio: Índice do estágio para o qual foi cadastrado
o despacho da UTE
:type estagio: int
:return: Um registro do tipo :class:`TG`
"""
reg = self.__obtem_registro_do_estagio(TG,
codigo,
estagio)
if reg is None:
raise ValueError("Não foi encontrado registro TG com" +
f" código {codigo} no estágio {estagio}")
return reg
[documentos] def gs(self, mes: int) -> GS:
"""
Obtém um registro que define o número de semanas em cada
mês de estudo no :class:`DadGNL`.
:param mes: índice do mês no estudo
:type mes: int
:return: Um registro do tipo :class:`GS`
"""
regs: List[GS] = self.__obtem_registros(GS)
for r in regs:
if r.mes == mes:
return r
raise ValueError("Não foi encontrado registro GS" +
f" para o mês {mes}")
[documentos] def nl(self, codigo: int) -> NL:
"""
Obtém um registro que define o número de lags para o despacho
de uma UTE.
:param codigo: código da UTE
:type codigo: int
:return: Um registro do tipo :class:`NL`
"""
regs: List[NL] = self.__obtem_registros(NL)
for r in regs:
if r.codigo == codigo:
return r
raise ValueError("Não foi encontrado registro GS" +
f" para o código {codigo}")
[documentos] def gl(self, codigo: int, estagio: int) -> GL:
"""
Obtém um registro que define o despacho por patamar
e a duração dos patamares para uma UTE GNL.
:param codigo: código que especifica o registro
da UTE
:type codigo: int
:param estagio: Índice do estágio para o qual foi cadastrado
o despacho da UTE
:type estagio: int
:return: Um registro do tipo :class:`GL`
"""
reg = self.__obtem_registro_do_estagio(GL,
codigo,
estagio)
if reg is None:
raise ValueError("Não foi encontrado registro GL com" +
f" código {codigo} no estágio {estagio}")
return reg