Automatically calculate PDF width
This commit is contained in:
		| @@ -74,16 +74,18 @@ export function ComplexFamilyTree(p: { | ||||
|   }; | ||||
|  | ||||
|   const exportPDF = async () => { | ||||
|     const docWidth = treeWidth(p.tree) * 60; | ||||
|     const docHeight = treeHeight(p.tree) * 41; | ||||
|  | ||||
|     const doc = new jsPDF({ | ||||
|       orientation: "l", | ||||
|       format: [docHeight, 351], | ||||
|       format: [docHeight, docWidth], | ||||
|     }); | ||||
|  | ||||
|     // Clone the SVG to manipulate it | ||||
|     const container = document.createElement("div"); | ||||
|     container.classList.add("f3", "f3-export"); | ||||
|     container.style.width = docWidth + "px"; | ||||
|     container.style.height = docHeight + "px"; | ||||
|     document.body.appendChild(container); | ||||
|     applyTree(container); | ||||
| @@ -114,7 +116,7 @@ export function ComplexFamilyTree(p: { | ||||
|  | ||||
|     await doc.svg(target, { | ||||
|       height: docHeight, | ||||
|       width: 351, | ||||
|       width: docWidth, | ||||
|     }); | ||||
|  | ||||
|     container.remove(); | ||||
| @@ -154,6 +156,22 @@ function treeHeight(node: FamilyTreeNode): number { | ||||
|   return res + 1; | ||||
| } | ||||
|  | ||||
| function treeWidth(node: FamilyTreeNode): number { | ||||
|   const values = new Array(treeHeight(node)).fill(0); | ||||
|   treeWidthRecurse(node, values, 0); | ||||
|   return Math.max(...values); | ||||
| } | ||||
|  | ||||
| function treeWidthRecurse(node: FamilyTreeNode, vals: number[], level: number) { | ||||
|   vals[level] += 1 + (node.couples?.length ?? 0) + (node.down ? 1 : 0); | ||||
|  | ||||
|   node.down?.forEach((n) => treeWidthRecurse(n, vals, level + 1)); | ||||
|  | ||||
|   node.couples?.forEach((c) => | ||||
|     c.down.forEach((n) => treeWidthRecurse(n, vals, level + 1)) | ||||
|   ); | ||||
| } | ||||
|  | ||||
| function treeToF3Data(node: FamilyTreeNode, isUp: boolean): f3Data[] { | ||||
|   const availableMembers = new Set<number>(); | ||||
|   getAvailableMembers(node, availableMembers); | ||||
|   | ||||
| @@ -107,6 +107,5 @@ | ||||
|   left: 0px; | ||||
|   /*width: 3508px; | ||||
|   height: 2480px;*/ | ||||
|   width: 351px; | ||||
|   opacity: 0; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user