teste_docs / document /equations.py
gui-sparim's picture
Completa as equações de custo com legendas compactas
6bc379e verified
Raw History Blame Contribute Delete
4.13 kB
"""Editable Word equations with compact legends for cost and depreciation."""
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Pt, RGBColor
from .formatters.paragraph import criar_paragrafo_formatado
def _run(text, variable=False):
run = OxmlElement('m:r')
props = OxmlElement('m:rPr')
style = OxmlElement('m:sty'); style.set(qn('m:val'), 'i' if variable else 'p')
props.append(style); run.append(props)
font_props = OxmlElement('w:rPr')
font = OxmlElement('w:rFonts')
font.set(qn('w:ascii'), 'Cambria Math'); font.set(qn('w:hAnsi'), 'Cambria Math')
font_props.append(font)
size = OxmlElement('w:sz'); size.set(qn('w:val'), '28'); font_props.append(size)
run.append(font_props)
value = OxmlElement('m:t'); value.text = text
value.set(qn('xml:space'), 'preserve'); run.append(value)
return run
def _fraction(numerator, denominator):
fraction = OxmlElement('m:f')
for name, children in [('num', numerator), ('den', denominator)]:
node = OxmlElement('m:' + name)
for child in children: node.append(child)
fraction.append(node)
return fraction
def _script(kind, base, script):
node = OxmlElement('m:' + kind)
for name, child in [('e', base), ('sup' if kind=='sSup' else 'sub', script)]:
content = OxmlElement('m:' + name); content.append(child); node.append(content)
return node
def _formula_blocks(doc, formulas):
for index,(elements, legend) in enumerate(formulas):
paragraph = doc.add_paragraph()
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
paragraph.paragraph_format.space_before = Pt(10)
paragraph.paragraph_format.space_after = Pt(4)
paragraph.paragraph_format.keep_with_next = True
paragraph.paragraph_format.keep_together = True
math = OxmlElement('m:oMath')
for element in elements: math.append(element)
paragraph._p.append(math)
note = criar_paragrafo_formatado(doc,legend,tamanho=8,cor=RGBColor(70,70,70),
alinhamento=WD_ALIGN_PARAGRAPH.LEFT,espaco_depois=8)
note.paragraph_format.keep_together = True
note.paragraph_format.keep_with_next = index < len(formulas)-1
def cost_equations(doc):
_formula_blocks(doc,[
([_run('CUNIT'),_run(' = '),_run('CUB'),_run(' × '),
_fraction([_run('% CUB')],[_run('100')])],
'CUNIT: custo unitário após a adequação (R$/m²); CUB: custo unitário básico histórico (R$/m²); % CUB: percentual de adequação aplicado ao CUB.'),
([_run('VC'),_run(' = '),_run('A',True),_run(' × '),_run('CUNIT'),_run(' × (1 + '),
_fraction([_run('BDI')],[_run('100')]),_run(') × '),_script('sSub',_run('K',True),_run('d',True))],
'VC: valor da construção após a depreciação (R$); A: área de cálculo (m²); CUNIT: custo unitário após a adequação (R$/m²); BDI: benefícios e despesas indiretas, em percentual; Kd: fator remanescente com consideração do valor residual.'),
])
def depreciation_equations(doc):
formulas = [
([_run('Ross',True), _run(' = '), _fraction([_run('q',True), _run(' + '), _script('sSup',_run('q',True),_run('2'))],[_run('2')])],
'Ross: parcela de depreciação associada à idade; q: fração de vida útil consumida, obtida dividindo o percentual de vida útil consumida por 100.'),
([_run('K',True),_run(' = 1 − (1 − '),_run('Ross',True),_run(') × (1 − '),_run('H',True),_run(')')],
'K: coeficiente de depreciação de Ross-Heidecke; H: coeficiente correspondente ao estado de conservação adotado.'),
([_script('sSub',_run('K',True),_run('d',True)),_run(' = '),_run('R',True),_run(' + (1 − '),_run('K',True),_run(') × (1 − '),_run('R',True),_run(')')],
'Kd: fator remanescente aplicado ao custo de reedição, com consideração do valor residual; R: valor residual em forma decimal (percentual ÷ 100); K: coeficiente de depreciação.'),
]
_formula_blocks(doc,formulas)