Copy link to clipboard
Copied
Bonjour,
je souhaite mettre au point un logiciel de vérification de plan. j'ai déjà créé une bonne partie qui me permet de selectionner les fichier à importer sur le logiciel et de les afficher. Le logiciel réussi à récupérer les dimensions du fichier pour les afficher mais par contre dans la section adresse il n'arrive pass à récuperer les zones de texte contenues dans un <groupe> du calque titre sur mon fichier illustrator...Voici mon index, mon css, et mon main, merci de votre aide
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>FirePlan Checker</title>
<link rel="stylesheet" href="../styles/main.css">
<link rel="icon" href="../assets/icons/favicon.svg" type="image/svg+xml">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap" rel="stylesheet">
</head>
<body>
<header>
<img src="../assets/icons/shield-red.svg" alt="Shield Icon">
<h1>FirePlan Checker</h1>
<p>Vérifiez facilement vos plans de sécurité incendie</p>
</header>
<nav>
<button id="validation-tab">
<img src="../assets/icons/check-green.svg" alt="Check Icon"> Validation des calques
</button>
<button id="address-tab">
<img src="../assets/icons/alert-red.svg" alt="Alert Icon"> Vérification des adresses
</button>
<button id="vei-tab">
<img src="../assets/icons/vei-check.svg" alt="VEI Icon"> Nombre de Vous Êtes Ici
</button>
</nav>
<main id="upload-section">
<div id="upload-zone">
<input type="file" id="file-input" multiple style="display: none;">
<img src="../assets/icons/upload-pink.svg" alt="Upload Icon">
<p>Déposez vos plans ici ou cliquez pour sélectionner des fichiers</p>
<p class="small">Formats acceptés : .ai, .pdf</p>
<div id="file-list"></div>
<button id="analyze-button" class="analyze-button">Analyser</button>
</div>
</main>
<main id="analysis-section" style="display: none;">
<header class="analysis-header">
<h2 style="color: #333;">Résultats de l’analyse</h2>
<div class="analysis-info">
<span class="plans-conformity">0/1 plan conforme</span>
<button class="info-button non-conform">Non conforme</button>
<button class="generate-report-button">Générer un compte rendu</button>
</div>
</header>
<div id="analysis-content" class="analysis-content">
<!-- Les résultats de l'analyse seront ajoutés ici dynamiquement -->
</div>
</main>
<!-- Conteneur pour le mode plein écran -->
<div id="fullscreen-preview" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: black; z-index: 9999;">
<canvas id="fullscreen-canvas"></canvas>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf-lib/1.17.1/pdf-lib.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.9.359/pdf.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@psdjs/psd@1.0.0/dist/psd.min.js"></script>
<script src="../scripts/main.js"></script>
<footer>
<div id="sai-logo">
<img src="../assets/icons/sai-logo.svg" alt="SAI">
</div>
</footer>
<!-- Ajout du script pour exécuter le script ExtendScript -->
<script src="../scripts/runExtendScript.js"></script>
</body>
</html>
body {
font-family: 'Poppins', sans-serif;
background-color: white;
color: #333;
text-align: center;
}
header {
padding: 5px 20px; /* Réduire encore l'écart */
}
header img {
width: 50px;
vertical-align: middle;
display: inline-block;
}
header h1 {
display: inline-block;
color: red;
font-weight: 600;
vertical-align: middle;
margin-left: 10px;
}
header p {
color: gray;
font-size: 0.9em;
margin-top: 5px;
}
nav button {
background-color: white;
color: #555;
border: 1px solid #ccc;
padding: 10px 20px;
border-radius: 15px;
margin: 0 10px;
display: inline-flex;
align-items: center;
}
nav button img {
width: 30px;
margin-right: 10px;
}
#upload-zone {
border: 2px dashed #ccc;
padding: 20px;
border-radius: 20px;
margin: 20px auto;
cursor: pointer;
width: 80%;
max-width: 600px;
color: #333;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
}
#upload-zone img {
width: 100px;
animation: pulse 1s infinite;
}
#upload-zone p {
margin: 10px 0;
}
#upload-zone .small {
color: gray;
font-size: 0.8em;
}
#file-list {
max-height: 200px;
overflow-y: auto;
text-align: center;
padding: 20px;
font-size: 12px;
margin-top: 5px;
flex-grow: 1; /* Permet à la liste des fichiers de prendre tout l'espace disponible */
display: flex;
flex-direction: column; /* Aligne les fichiers verticalement */
gap: 10px; /* Espacement entre les fichiers */
}
#sai-logo img {
width: 50px;
}
.file-item {
display: flex;
align-items: center;
padding: 10px;
border-bottom: 1px solid #ccc;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.file-item img {
width: 40px;
height: 40px;
margin-right: 10px;
}
.file-item .file-name {
flex-grow: 1;
text-align: left; /* Aligner le texte à gauche */
}
.file-item .file-size {
background-color: #e0e0e0;
border-radius: 5px;
padding: 2px 5px;
font-size: 12px;
color: #333;
display: inline-block;
margin-left: 10px;
}
.remove-icon {
width: 10px;
height: 10px;
cursor: pointer;
margin-left: 10px;
}
/* Styles pour un défilement moderne et minimaliste */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
/* Animation pulse */
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
/* Classe pour réduire la taille de l'icône */
#upload-zone img.small-icon {
width: 50px;
height: 50px;
}
/* Styles pour le bouton Analyser */
.analyze-button {
background-color: rgb(73, 158, 68);
color: white;
border: none;
padding: 10px 20px;
border-radius: 15px;
font-size: 16px;
margin-top: 10px;
display: none; /* Masquer par défaut */
cursor: pointer;
transition: background-color 0.3s ease;
}
.analyze-button:hover {
background-color: rgb(60, 130, 55);
}
/* Styles pour la section d'analyse */
.analysis-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
background-color: white;
border-bottom: 1px solid #ccc;
}
.analysis-header h2 {
color: #333;
font-size: 24px;
margin: 0;
}
.analysis-info {
display: flex;
align-items: center;
}
.analysis-info .plans-conformity {
color: gray;
margin-right: 10px;
}
.analysis-info .info-button {
background-color: red;
color: white;
border: none;
padding: 5px 10px;
border-radius: 10px;
margin-right: 10px;
}
.analysis-info .generate-report-button {
background-color: blue;
color: white;
border: none;
padding: 5px 10px;
border-radius: 10px;
}
.analysis-content {
display: flex;
flex-direction: column;
gap: 20px;
padding: 20px;
}
.analysis-block {
background-color: #f9f9f9;
border-radius: 20px;
padding: 20px;
border: 1px solid #ccc;
}
.file-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.file-header .file-name {
font-weight: bold;
}
.file-header .conformity-status {
background-color: red;
color: white;
padding: 3px 8px; /* Réduire la taille de l'indicateur de conformité */
border-radius: 10px;
}
.content-block {
display: flex;
justify-content: space-between;
gap: 20px; /* Ajouter un espace entre les sections */
}
.details-block {
flex: 1;
display: flex;
flex-direction: column;
gap: 20px;
text-align: left; /* Aligner le texte à gauche */
}
.details-item {
background-color: #fff;
border-radius: 20px;
padding: 10px 20px;
border: 1px solid #ccc;
}
.details-header {
display: flex;
align-items: center;
margin-bottom: 10px; /* Espace entre le titre et les détails */
}
.details-header img.status-icon {
margin-right: 10px;
}
.details-content {
text-align: left; /* Aligner le texte à gauche */
background-color: #f1f1f1; /* Couleur de fond du bloc */
padding: 10px;
border-radius: 10px;
}
/* Nouveau style pour aligner les blocs infos avec le titre */
.details-item .details-content-wrapper {
display: flex;
align-items: flex-start;
}
.details-item .details-content-wrapper h3 {
display: flex;
align-items: center;
margin: 0;
}
.details-item .details-content-wrapper img {
width: 24px; /* Taille adaptée pour les logos */
height: 24px; /* Taille adaptée pour les logos */
margin-right: 10px;
}
.details-item .details-content-block {
margin-left: 30px;
}
.preview-block {
flex: 1;
text-align: center;
background-color: #fff;
border-radius: 20px;
padding: 10px 20px;
border: 1px solid #ccc;
text-align: center; /* Aligner le texte au centre */
position: relative;
}
.preview-block h3 {
margin-bottom: 10px;
}
.plan-preview-canvas {
max-width: 100%;
max-height: 400px;
display: block;
margin: 0 auto; /* Centrer le canvas */
cursor: pointer; /* Changer le curseur pour indiquer que c'est cliquable */
}
.fullscreen-button {
position: absolute;
top: 10px;
right: 10px;
background-color: #007bff;
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
display: none; /* Masquer le bouton plein écran car le canvas est cliquable */
}
.fullscreen-button:hover {
background-color: #0056b3;
}
#fullscreen-preview {
display: flex;
justify-content: center;
align-items: center;
}
#fullscreen-canvas {
max-width: 100%;
max-height: 100%;
}
/* Styles pour les check-icons */
.check-icon {
width: 48px !important; /* Taille des check-icons */
height: 48px !important; /* Taille des check-icons */
margin-right: 10px;
flex-shrink: 0; /* Empêcher le rétrécissement des check-icons */
}
document.addEventListener('DOMContentLoaded', function () {
const uploadSection = document.getElementById('upload-section');
const analysisSection = document.getElementById('analysis-section');
const uploadZone = document.getElementById('upload-zone');
const fileInput = document.getElementById('file-input');
const fileList = document.getElementById('file-list');
const uploadIcon = uploadZone.querySelector('img');
const uploadText = uploadZone.querySelectorAll('p');
const analyzeButton = document.getElementById('analyze-button');
const headerDescription = document.querySelector('header p');
const navButtons = document.querySelectorAll('nav button');
const analysisContent = document.getElementById('analysis-content');
const fullscreenPreview = document.getElementById('fullscreen-preview');
const fullscreenCanvas = document.getElementById('fullscreen-canvas');
// Configurer pdf.js worker
pdfjsLib.GlobalWorkerOptions.workersrc='https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.9.359/pdf.worker.min.js';
// Ouvrir l'explorateur de fichiers lors du clic sur la zone de téléchargement
uploadZone.addEventListener('click', () => {
fileInput.click();
});
// Gérer les fichiers sélectionnés via l'explorateur de fichiers
fileInput.addEventListener('change', (event) => {
handleFiles(event.target.files);
});
// Gérer les fichiers déposés via le glisser/déposer
uploadZone.addEventListener('dragover', (event) => {
event.preventDefault();
uploadZone.classList.add('dragover');
});
uploadZone.addEventListener('dragleave', () => {
uploadZone.classList.remove('dragover');
});
uploadZone.addEventListener('drop', (event) => {
event.preventDefault();
uploadZone.classList.remove('dragover');
handleFiles(event.dataTransfer.files);
});
// Fonction pour gérer et afficher les fichiers
function handleFiles(files) {
// Réduire la taille de l'icône d'upload et masquer le texte
uploadIcon.classList.add('small-icon');
uploadText.forEach(p => p.style.display = 'none');
// Obtenir la liste des fichiers déjà importés
const existingFiles = Array.from(fileList.getElementsByClassName('file-name')).map(span => span.textContent);
for (const file of files) {
// Vérifier si le fichier a déjà été importé
if (existingFiles.includes(file.name)) {
alert(`Le fichier "${file.name}" a déjà été importé.`);
continue;
}
const fileItem = document.createElement('div');
fileItem.classList.add('file-item');
const fileIcon = document.createElement('img');
fileIcon.src='../assets/icons/file-icon.svg';
fileIcon.alt = 'File Icon';
fileItem.file = file; // Attacher l'objet fichier à l'élément fileItem
const fileName = document.createElement('span');
fileName.textContent = file.name;
fileName.classList.add('file-name');
const fileSize = document.createElement('span');
fileSize.textContent = `${(file.size / 1024).toFixed(1)} Ko`;
fileSize.classList.add('file-size');
const removeIcon = document.createElement('img');
removeIcon.src='../assets/icons/remove-icon.svg'; // Assurez-vous que cette icône existe
removeIcon.alt = 'Remove Icon';
removeIcon.classList.add('remove-icon');
removeIcon.addEventListener('click', (event) => {
event.stopPropagation(); // Empêche la propagation de l'événement de clic
fileItem.remove();
if (!fileList.hasChildNodes()) {
// Restaurer la taille de l'icône d'upload et réafficher le texte si aucun fichier n'est présent
uploadIcon.classList.remove('small-icon');
uploadText.forEach(p => p.style.display = 'block');
analyzeButton.style.display = 'none'; // Masquer le bouton Analyser
}
});
fileItem.appendChild(fileIcon);
fileItem.appendChild(fileName);
fileItem.appendChild(fileSize);
fileItem.appendChild(removeIcon);
fileList.appendChild(fileItem);
}
// Afficher le bouton Analyser si des fichiers sont importés
if (fileList.hasChildNodes()) {
analyzeButton.style.display = 'block';
}
}
// Ajouter un gestionnaire d'événements pour le bouton "Analyser"
analyzeButton.addEventListener('click', (event) => {
event.preventDefault();
event.stopPropagation();
// Masquer les éléments spécifiques
if (headerDescription) {
headerDescription.style.display = 'none';
}
navButtons.forEach(button => {
button.style.display = 'none';
});
// Masquer la section de téléchargement et afficher la section d'analyse
uploadSection.style.display = 'none';
analysisSection.style.display = 'block';
// Générer les blocs d'analyse pour chaque fichier importé
generateAnalysisBlocks();
});
function generateAnalysisBlocks() {
// Obtenir la liste des fichiers déjà importés
const importedFiles = Array.from(fileList.getElementsByClassName('file-item'));
importedFiles.forEach(fileItem => {
const fileName = fileItem.querySelector('.file-name').textContent;
const analysisBlock = document.createElement('div');
analysisBlock.classList.add('analysis-block');
const fileHeader = document.createElement('div');
fileHeader.classList.add('file-header');
fileHeader.innerHTML = `
<span class="file-name">${fileName}</span>
<span class="conformity-status">Non conforme</span>
`;
const contentBlock = document.createElement('div');
contentBlock.classList.add('content-block');
const detailsBlock = document.createElement('div');
detailsBlock.classList.add('details-block');
detailsBlock.innerHTML = `
<div class="details-item">
<div class="details-content-wrapper">
<img src="../assets/icons/error-icon.svg" alt="Error Icon" class="check-icon">
<div class="details-content-block">
<h3><img src="../assets/icons/dimensions-icon.svg" alt="Dimensions Icon"> Dimensions du plan :</h3>
<div class="details-content">
<p><strong>Format:</strong> <span class="format-value">A2</span></p>
<p><strong>Orientation:</strong> <span class="orientation-value">Horizontal (Paysage)</span></p>
<p><strong>Dimensions:</strong> <span class="dimensions-value">1191,0 x 842,00 mm</span></p>
</div>
</div>
</div>
</div>
<div class="details-item">
<div class="details-content-wrapper">
<img src="../assets/icons/error-icon.svg" alt="Error Icon" class="check-icon">
<div class="details-content-block">
<h3><img src="../assets/icons/address-icon.svg" alt="Address Icon"> Vérification du nom du site et de l’adresse :</h3>
<div class="details-content">
<p><strong>Nom du site détecté:</strong> <span class="site-name-value">Nom du site non détecté</span></p>
<p><strong>Adresse du site détectée:</strong> <span class="site-address-value">Adresse du site non détectée</span></p>
</div>
</div>
</div>
</div>
<div class="details-item">
<div class="details-content-wrapper">
<img src="../assets/icons/ok-icon.svg" alt="Ok Icon" class="check-icon">
<div class="details-content-block">
<h3><img src="../assets/icons/vei-icon.svg" alt="VEI Icon"> Vérification des groupes VEI :</h3>
<div class="details-content">
<p><strong>Nombre de pastilles détectées:</strong> 1</p>
</div>
</div>
</div>
</div>
`;
const previewBlock = document.createElement('div');
previewBlock.classList.add('preview-block');
previewBlock.innerHTML = `
<h3>Aperçu du plan</h3>
<canvas class="plan-preview-canvas"></canvas>
`;
const canvas = previewBlock.querySelector('.plan-preview-canvas');
canvas.addEventListener('click', () => {
displayFullscreen(fileItem.file);
});
contentBlock.appendChild(detailsBlock);
contentBlock.appendChild(previewBlock);
analysisBlock.appendChild(fileHeader);
analysisBlock.appendChild(contentBlock);
analysisContent.appendChild(analysisBlock);
// Afficher l'aperçu du plan et analyser les informations
displayPreviewAndAnalyze(fileItem.file, canvas, analysisBlock);
});
}
async function displayPreviewAndAnalyze(file, canvas, analysisBlock) {
const fileReader = new FileReader();
fileReader.onload = async function () {
const arrayBuffer = this.result;
let pdfData = arrayBuffer;
// Si le fichier est un .ai, convertir en PDF (simulé ici)
if (file.name.endsWith('.ai')) {
pdfData = await convertAiToPdf(arrayBuffer);
if (!pdfData) {
console.error('Erreur lors de la conversion du fichier .ai en PDF');
return;
}
}
try {
const pdfDoc = await pdfjsLib.getDocument({ data: pdfData }).promise;
const page = await pdfDoc.getPage(1);
const viewport = page.getViewport({ scale: 1 });
const context = canvas.getContext('2d');
canvas.width = viewport.width;
canvas.height = viewport.height;
await page.render({ canvasContext: context, viewport: viewport }).promise;
// Analyser le format, l'orientation et les dimensions
const width = viewport.width;
const height = viewport.height;
const format = getPaperSize(pointsToMm(width), pointsToMm(height));
const orientation = width > height ? 'Horizontal (Paysage)' : 'Vertical (Portrait)';
const dimensions = `${pointsToMm(width).toFixed(2)} x ${pointsToMm(height).toFixed(2)} mm`;
// Mettre à jour les informations analysées dans l'interface utilisateur
analysisBlock.querySelector('.format-value').textContent = format;
analysisBlock.querySelector('.orientation-value').textContent = orientation;
analysisBlock.querySelector('.dimensions-value').textContent = dimensions;
// Mettre à jour l'icône de vérification en fonction du format détecté
const checkIcon = analysisBlock.querySelector('.details-content-wrapper img.check-icon');
if (format === "Format inconnu") {
checkIcon.src="../assets/icons/error-icon.svg";
checkIcon.alt = "Error Icon";
} else {
checkIcon.src="../assets/icons/ok-icon.svg";
checkIcon.alt = "Ok Icon";
}
// Analyser les informations du calque TITRE
if (file.name.endsWith('.ai')) {
await analyzeTitleLayerAi(arrayBuffer, analysisBlock);
} else {
await analyzeTitleLayer(pdfDoc, analysisBlock);
}
// Vérifier la conformité du plan
checkConformity(analysisBlock);
} catch (error) {
console.error('Erreur lors de l\'affichage de l\'aperçu :', error);
}
};
fileReader.readAsArrayBuffer(file);
}
async function analyzeTitleLayer(pdfDoc, analysisBlock) {
try {
const page = await pdfDoc.getPage(1);
const content = await page.getTextContent();
let siteName = "Nom du site non détecté";
let siteAddress = "Adresse du site non détectée";
// Parcourir les éléments de texte pour trouver ceux du calque TITRE
for (const item of content.items) {
if (item.str.includes("TITRE")) {
const textItems = content.items;
if (textItems.length > 1) {
siteName = textItems[1].str;
}
if (textItems.length > 2) {
siteAddress = textItems[2].str;
}
break;
}
}
// Mettre à jour les informations de vérification d'adresse dans l'interface utilisateur
analysisBlock.querySelector('.site-name-value').textContent = siteName;
analysisBlock.querySelector('.site-address-value').textContent = siteAddress;
} catch (error) {
console.error('Erreur lors de l\'analyse du calque TITRE :', error);
}
}
async function analyzeTitleLayerAi(arrayBuffer, analysisBlock) {
try {
const psd = await PSD.fromArrayBuffer(arrayBuffer);
psd.parse();
let siteName = "Nom du site non détecté";
let siteAddress = "Adresse du site non détectée";
// Parcourir les calques pour trouver le calque TITRE
const titleLayer = psd.tree().childrenAtPath('TITRE')[0];
if (titleLayer) {
const textLayers = titleLayer.children();
if (textLayers.length > 0) {
siteName = textLayers[0].get('text').value;
}
if (textLayers.length > 1) {
siteAddress = textLayers[1].get('text').value;
}
}
// Mettre à jour les informations de vérification d'adresse dans l'interface utilisateur
analysisBlock.querySelector('.site-name-value').textContent = siteName;
analysisBlock.querySelector('.site-address-value').textContent = siteAddress;
} catch (error) {
console.error('Erreur lors de l\'analyse du calque TITRE du fichier .ai :', error);
}
}
async function displayFullscreen(file) {
const fileReader = new FileReader();
fileReader.onload = async function () {
const arrayBuffer = this.result;
let pdfData = arrayBuffer;
// Si le fichier est un .ai, convertir en PDF (simulé ici)
if (file.name.endsWith('.ai')) {
pdfData = await convertAiToPdf(arrayBuffer);
if (!pdfData) {
console.error('Erreur lors de la conversion du fichier .ai en PDF');
return;
}
}
try {
const pdfDoc = await pdfjsLib.getDocument({ data: pdfData }).promise;
const page = await pdfDoc.getPage(1);
const viewport = page.getViewport({ scale: 1 });
const context = fullscreenCanvas.getContext('2d');
// Ajuster la taille du canvas pour le plein écran
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const imgRatio = viewport.width / viewport.height;
const windowRatio = windowWidth / windowHeight;
let scale;
if (imgRatio > windowRatio) {
scale = windowWidth / viewport.width;
} else {
scale = windowHeight / viewport.height;
}
fullscreenCanvas.width = viewport.width * scale;
fullscreenCanvas.height = viewport.height * scale;
const scaledViewport = page.getViewport({ scale: scale });
await page.render({ canvasContext: context, viewport: scaledViewport }).promise;
fullscreenPreview.style.display = 'flex';
} catch (error) {
console.error('Erreur lors de l\'affichage en plein écran :', error);
}
};
fileReader.readAsArrayBuffer(file);
}
// Fermer le mode plein écran en cliquant sur le plan
fullscreenCanvas.addEventListener('click', () => {
fullscreenPreview.style.display = 'none';
});
// Simuler la conversion .ai vers PDF (remplacez par une vraie API)
async function analyzeTitleLayerAi(arrayBuffer, analysisBlock) {
try {
// Utiliser une API ou une bibliothèque pour lire le fichier .ai
const aiData = await convertAiToReadableFormat(arrayBuffer);
let siteName = "Nom du site non détecté";
let siteAddress = "Adresse du site non détectée";
// Parcourir les calques pour trouver le groupe spécifique
const titleGroup = aiData.layers.find(layer => layer.name === 'TITRE');
if (titleGroup) {
const textLayers = titleGroup.children.filter(child => child.type === 'text');
if (textLayers.length > 0) {
siteName = textLayers[0].text;
}
if (textLayers.length > 1) {
siteAddress = textLayers[1].text;
}
}
// Mettre à jour les informations de vérification d'adresse dans l'interface utilisateur
analysisBlock.querySelector('.site-name-value').textContent = siteName;
analysisBlock.querySelector('.site-address-value').textContent = siteAddress;
} catch (error) {
console.error('Erreur lors de l\'analyse du groupe TITRE du fichier .ai :', error);
}
}
async function convertAiToReadableFormat(arrayBuffer) {
// Utiliser une API comme CloudConvert pour convertir .ai en un format lisible
// Ceci est une simulation. Implémentez une vraie conversion via une API ou un serveur.
console.warn('Conversion .ai vers un format lisible non implémentée.');
return {
layers: [
{
name: 'TITRE',
children: [
{ type: 'text', text: 'Nom du site' },
{ type: 'text', text: 'Adresse du site' }
]
}
]
};
}
function getPaperSize(width_mm, height_mm) {
const sizes = {
"A0": [841, 1189],
"A1": [594, 841],
"A2": [420, 594],
"A3": [297, 420],
"A4": [210, 297]
};
for (const [size, [w, h]] of Object.entries(sizes)) {
if (Math.abs(width_mm - w) < 5 && Math.abs(height_mm - h) < 5) {
return `${size} Vertical`;
} else if (Math.abs(width_mm - h) < 5 && Math.abs(height_mm - w) < 5) {
return `${size} Horizontal`;
}
}
return "Format inconnu";
}
function checkConformity(analysisBlock) {
const checkIcons = analysisBlock.querySelectorAll('.details-content-wrapper img.check-icon');
const conformityStatus = analysisBlock.querySelector('.conformity-status');
let isConform = true;
checkIcons.forEach(icon => {
if (icon.alt === 'Error Icon') {
isConform = false;
}
});
if (isConform) {
conformityStatus.textContent = 'Conforme';
conformityStatus.style.backgroundColor = 'green';
} else {
conformityStatus.textContent = 'Non conforme';
conformityStatus.style.backgroundColor = 'red';
}
}
});
Have something to add?