Commit ef14e1ff by Luciano Barletta

no errors with divtree method

1 parent f16fe041
......@@ -5,8 +5,10 @@ from flask import Flask, render_template, request, url_for
app = Flask(__name__)
data = {
"header" : {
"dominio" : "dom",
"fecha" : "07-01-2019",
},
"alineador" : {
"eje_delan" : "0.000"
},
......
const Position = {
"beggining" : 0,
"beggining_margin" : 5,
"quarter" : 25,
"third" : 33.33,
"middle" : 50,
"two_thirds" : 66.67,
"three_quarters" : 75,
"end_margin" : 95,
"end" : 100
}
"use strict";
/** Coordinate container that occupies the whole page **/
const A4 = new Div(
new Vector(0,0),
new Vector(210,297)
new Vector(0, 0),
new Vector(595, 842)
);
function divToPDF(div) {
let pdf = new jsPDF('portrait', 'mm', 'a4');
pdf.setFont("courier", "normal");
pdf.setFontSize(10);
const Position = {
"beggining": 0,
"beggining_margin": 5,
"quarter": 25,
"third": 33.33,
"middle": 50,
"two_thirds": 66.67,
"three_quarters": 75,
"end_margin": 95,
"end": 100
};
function generateDivTree(data) {
/**
* The lambdas serve as "apply" functions
* Each function processes an element, executed in order of appeareance in HTML.
* They all return a coordinate "pointer" to draw.
*/
functionMapping = [
(pointer, div, pdf) => headerToPDF(pointer, div, pdf),
(pointer, div, pdf) => alineadorToPDF(pointer, div, pdf),
(pointer, div, pdf) => suspensionToPDF(pointer, div, pdf),
(pointer, div, pdf) => frenosToPDF(pointer, div, pdf),
(pointer, div, pdf) => traseroToPDF(pointer, div, pdf),
(pointer, div, pdf) => gaseshumosToPDF(pointer, div, pdf),
const functionMapping = [
(pointer, data) => headerToPDF(pointer, data['header']),
(pointer, data) => alineadorToPDF(pointer, data['alineador']),
(pointer, data) => suspensionToPDF(pointer, data['suspension']),
(pointer, data) => frenosToPDF(pointer, data['frenos']),
(pointer, data) => traseroToPDF(pointer, data['trasero']),
(pointer, data) => gaseshumosToPDF(pointer, data['gaseshumos'])
];
/**
* We pass the pointer to each function, which then modify it and passes it to the next,
* We start with (20,20)
* f_it is a function iterator
* We start with (0%,0%)
*/
Array.from(div.children).reduce(
(pointer, child) => {
if (child.nodeName == "DIV") {
n_pointer = functionMapping[ pointer.f_it ](
/** Remove the function index **/
new Vector(pointer.x, pointer.y),
child,
pdf
)
/** Add it and add 1 to it **/
n_pointer.f_it = pointer.f_it + 1;
return n_pointer;
}
return pointer;
},
{"x" : 0, "y" : 0, "f_it" : 0}
functionMapping.reduce(
(pointer, treeMaker) => treeMaker(pointer, data),
A4.position
);
window.open(pdf.output('bloburl'));
return A4;
}
function headerToPDF(pointer, div, pdf) {
/** Header goes from pointer to 100% width and 5% heigth **/
header = A4.addChild("header", pointer, new Vector(Position.end, 3));
/** First part of the text goes 5% to the right and in the middle vertically. no size provided **/
dom = header.addChild("dominio", new Vector(Position.beggining_margin, Position.two_thirds), new Vector(0,0))
function headerToPDF(pointer, data) {
/** Second part of the text goes a third to the right and in the middle vertically. no size provided **/
fecha = header.addChild("fecha", new Vector(Position.third, Position.two_thirds), new Vector(0,0))
const header = A4.addChild(pointer, new Vector(Position.end, 3));
/** Get the first row that you find **/
tr = getDescendantByTag(div, "tr");
pdf.text(
tr.children[0].innerText,
dom.position.x,
dom.position.y,
{"align" : "left"}
)
pdf.text(
tr.children[1].innerText,
fecha.position.x,
fecha.position.y,
{"align" : "left"}
)
header.addText(
"Dominio: " + data['dominio'],
new Vector(Position.beggining_margin, Position.two_thirds)
);
//header.drawDivBox(pdf);
header.addText(
"Fecha: " + data['fecha'],
new Vector(Position.third, Position.two_thirds)
);
/** Next safe position to draw (in percentage). same x, next available y **/
return new Vector(pointer.x, pointer.y + 3);
}
function alineadorToPDF(pointer, div, pdf) {
/** Alineador goes from pointer to 100% width and 10% heigth **/
A4.addChild("alineador", pointer, new Vector(Position.end, 7));
/** Title goes to the left and up **/
title = A4.children.alineador.addChild("title", new Vector(Position.beggining_margin + 2, Position.third), new Vector(0,0))
function alineadorToPDF(pointer, data) {
/** Subtitle goes left and down **/
subtitle = A4.children.alineador.addChild("subtitle", new Vector(Position.beggining_margin + 2, Position.two_thirds), new Vector(0,0))
const alineador = A4.addChild(pointer, new Vector(Position.end, 5));
/** Value goes a little to the right and down **/
value = A4.children.alineador.addChild("value", new Vector(Position.quarter, Position.two_thirds), new Vector(0,0))
pdf.text(
"Resultado Pruebas de Alineador al Paso",
title.position.x,
title.position.y,
{"align" : "left"}
)
const title = alineador.addText(
"Resultado Pruebas en Banco de Alineador al Paso",
new Vector(Position.beggining_margin + 2, Position.third)
);
pdf.text(
const subtitle = alineador.addText(
"Eje Delantero",
subtitle.position.x,
subtitle.position.y,
{"align" : "left"}
)
n = div.innerText // take the whole text
.replace(/[\n]/g, "") // remove the new lines
.split(" ") // make array of words
.pop() // take the last one
pdf.text(
n,
value.position.x,
value.position.y,
{"align" : "left"}
)
//A4.children.alineador.drawDivBox(pdf);
return new Vector(pointer.x, pointer.y + 7);
}
function suspensionToPDF(pointer, div, pdf) {
suspension = A4.addChild("suspension", pointer, new Vector(100, 15));
new Vector(Position.beggining_margin + 2, Position.two_thirds)
);
eje1 = suspension.addChild("eje1", new Vector(Position.beggining_margin + 2, 0), new Vector(90,50))
eje2 = suspension.addChild("eje2", new Vector(Position.beggining_margin + 2, 50), new Vector(90,50))
const value = alineador.addText(
data['eje_delan'],
new Vector(Position.quarter, Position.two_thirds)
);
table = (container, pdf, eje, RI, p, RD) => {
return new Vector(pointer.x, pointer.y + 5);
}
title = container.addChild("title", new Vector(0, Position.third), new Vector(0,0))
function suspensionToPDF(pointer, data) {
ri = container.addChild("ri", new Vector(0, Position.two_thirds), new Vector(0,0))
ri_value = container.addChild("ri_value", new Vector(10, Position.end), new Vector(0,0))
const suspension = A4.addChild(pointer, new Vector(Position.end, 15));
peso = container.addChild("peso", new Vector(37, Position.two_thirds), new Vector(0,0))
peso_value = container.addChild("peso_value", new Vector(45, Position.end), new Vector(0,0))
const eje1 = suspension.addChild(new Vector(Position.beggining_margin + 2, 0), new Vector(86, 50))
const eje2 = suspension.addChild(new Vector(Position.beggining_margin + 2, 50), new Vector(86, 50))
rd = container.addChild("rd", new Vector(Position.three_quarters - 7, Position.two_thirds), new Vector(0,0))
rd_value = container.addChild("rd_value", new Vector(Position.three_quarters, Position.end), new Vector(0,0))
const table = (container, eje, RI, peso, RD) => {
pdf.text(
container.addText(
`Resultado Pruebas en Banco de Suspensión - Eje ${eje}`,
title.position.x,
title.position.y,
{"align" : "left"}
new Vector(0, Position.third)
);
pdf.text(
`Rendimiento Izquierdo`,
ri.position.x,
ri.position.y,
{"align" : "left"}
container.addText(
"Rendimiento Izquierdo",
new Vector(0, Position.two_thirds)
);
pdf.text(
container.addText(
RI,
ri_value.position.x,
ri_value.position.y,
{"align" : "left"}
new Vector(0, Position.end)
);
pdf.text(
`Peso Total del Eje`,
peso.position.x,
peso.position.y,
{"align" : "left"}
container.addText(
"Peso Total del Eje",
new Vector(37, Position.two_thirds)
);
pdf.text(
p,
peso_value.position.x,
peso_value.position.y,
{"align" : "left"}
container.addText(
peso,
new Vector(45, Position.end)
);
pdf.text(
`Rendimiento Derecho`,
rd.position.x,
rd.position.y,
{"align" : "left"}
container.addText(
"Rendimiento Derecho",
new Vector(80, Position.two_thirds)
);
pdf.text(
container.addText(
RD,
rd_value.position.x,
rd_value.position.y,
{"align" : "left"}
new Vector(90, Position.end)
);
};
table(eje1, pdf, 1, "0.000", "0.000", "0.000")
table(eje2, pdf, 2, "0.000", "0.000", "0.000")
table(eje1, 1, data[0]["ren_izq"], data[0]["peso"], data[0]["ren_der"])
table(eje2, 2, data[1]["ren_izq"], data[1]["peso"], data[1]["ren_der"])
//A4.children.suspension.drawDivBox(pdf);
return new Vector(pointer.x, pointer.y + 15);
}
function frenosToPDF(pointer, div, pdf) {
A4.addChild("frenos", pointer, new Vector(Position.end, 57));
//A4.children.frenos.drawDivBox(pdf);
return new Vector(pointer.x, pointer.y + 57);
function frenosToPDF(pointer, data) {
A4.addChild("frenos", pointer, new Vector(Position.end, 60));
return new Vector(pointer.x, pointer.y + 60);
}
function traseroToPDF(pointer, div, pdf) {
function traseroToPDF(pointer, data) {
A4.addChild("trasero", pointer, new Vector(Position.end, 9));
//A4.children.trasero.drawDivBox(pdf);
return new Vector(pointer.x, pointer.y + 9);
}
function gaseshumosToPDF(pointer, div, pdf) {
function gaseshumosToPDF(pointer, data) {
A4.addChild("gaseshumos", pointer, new Vector(Position.end, 9));
//A4.children.gaseshumos.drawDivBox(pdf);
return new Vector(pointer.x, pointer.y + 9);
}
function compile(tree, pdf) {
tree.children.forEach( child => {
switch (child.constructor.name) {
case "Text":
pdf.text(child.text, child.position.x, child.position.y);
break;
case "Div":
compile(child, pdf);
break;
}
});
}
\ No newline at end of file
......@@ -53,10 +53,10 @@ class Div {
constructor(position, size) {
this.position = position;
this.size = size;
this.children = {};
this.children = [];
}
addChild(id, position, size) {
addChild(position, size) {
if (position.x < 0 || position.x > 100)
console.error("position.x has to be an int between 0 and 100");
if (position.y < 0 || position.y > 100)
......@@ -66,21 +66,21 @@ class Div {
if (size.y < 0 || size.y > 100)
console.error("size.y has to be an int between 0 and 100");
this.children[id] = new Div (
let div = new Div(
this.getDrawCoordinates(position),
this.getSize(size)
);
return this.children[id];
this.children.push(div);
return div;
}
addText(id, position) {
addText(text, position) {
if (position.x < 0 || position.x > 100)
console.error("position.x has to be an int between 0 and 100");
if (position.y < 0 || position.y > 100)
console.error("position.y has to be an int between 0 and 100");
this.children[id] = new Text(position);
this.children.push(new Text(text, position));
}
/**
......
......@@ -12,7 +12,6 @@
<link rel="stylesheet" media="screen" href="https://fontlibrary.org/face/cmu-typewriter" type="text/css" />
<title>Pruebas de Alineamiento</title>
</head>
<!--<body onload="generateDivTree( {{ data }} )">-->
<body>
<div id = "pdf">
......@@ -90,7 +89,7 @@
</div>
<div class="PDFButtonContainer">
<button class="PDFButton" onclick="divToPDF(document.getElementById('pdf'))">
<button class="PDFButton" onclick="compile(generateDivTree( {{ data }} ), new jsPDF('portrait', 'pt', 'a4'))">
Convertir a PDF
</button>
</div>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!