htmx/backend/services/html_generator.py
2026-04-01 21:13:58 +02:00

87 lines
No EOL
3.4 KiB
Python

from pathlib import Path
from typing import Optional
from config import EPT_DIR, POTREE_URL
import config
def generate_viewer_html(pc_id: str, ept_dir: Optional[str],
embed: bool = False, potree_url: Optional[str] = None) -> str:
# Fallback : cherche ept.json si le manifest est absent
if not ept_dir:
out_dir = EPT_DIR / pc_id
ept_json = out_dir / "ept.json"
if ept_json.exists():
ept_dir = pc_id
else:
return "<h3>Erreur : ept.json introuvable pour cet ID</h3>"
height_style = "100vh" if embed else "800px"
base_url = "/static/potree"
potree_url = potree_url or config.POTREE_URL
# L'URL vers ept.json servi via le montage statique /ept_data
ept_json_url = f"/ept_data/{ept_dir}/ept.json"
return f"""<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>EPT Viewer - {pc_id}</title>
<link rel="stylesheet" href="{base_url}/build/potree/potree.css">
<link rel="stylesheet" href="{base_url}/libs/jquery-ui/jquery-ui.min.css">
<link rel="stylesheet" href="{base_url}/libs/spectrum/spectrum.css">
<link rel="stylesheet" href="{base_url}/libs/jstree/themes/mixed/style.css">
</head>
<body>
<script src="{base_url}/libs/jquery/jquery-3.1.1.min.js"></script>
<script src="{base_url}/libs/spectrum/spectrum.js"></script>
<script src="{base_url}/libs/jquery-ui/jquery-ui.min.js"></script>
<script src="{base_url}/libs/other/BinaryHeap.js"></script>
<script src="{base_url}/libs/tween/tween.min.js"></script>
<script src="{base_url}/libs/d3/d3.js"></script>
<script src="{base_url}/libs/proj4/proj4.js"></script>
<script src="{base_url}/libs/openlayers3/ol.js"></script>
<script src="{base_url}/libs/i18next/i18next.js"></script>
<script src="{base_url}/libs/jstree/jstree.js"></script>
<script src="{base_url}/libs/copc/index.js"></script>
<script src="{base_url}/build/potree/potree.js"></script>
<script src="{base_url}/libs/plasio/js/laslaz.js"></script>
<div class="potree_container" style="position:absolute;width:100%;height:{height_style};left:0;top:0;">
<div id="potree_render_area"></div>
<div id="potree_sidebar_container"></div>
</div>
<script type="module">
window.viewer = new Potree.Viewer(document.getElementById("potree_render_area"));
viewer.setEDLEnabled(true);
viewer.setFOV(60);
viewer.setPointBudget(1_000_000);
viewer.loadSettingsFromURL();
viewer.setBackground("skybox");
viewer.setDescription("EPT - {pc_id}");
viewer.loadGUI(() => {{
viewer.setLanguage('en');
$("#menu_tools").next().show();
viewer.toggleSidebar();
}});
// Potree 2.x charge EPT directement via l'URL de ept.json
const eptUrl = "{ept_json_url}";
console.log("Chargement EPT depuis:", eptUrl);
Potree.loadPointCloud(eptUrl, "{pc_id}", e => {{
let pointcloud = e.pointcloud;
let material = pointcloud.material;
material.size = 1;
material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
material.shape = Potree.PointShape.SQUARE;
viewer.scene.addPointCloud(pointcloud);
viewer.fitToScreen();
console.log("EPT chargé avec succès");
}});
</script>
</body>
</html>"""