From 38816ff0b7ba193e81d8ec9b1e5b4bcda0972cf7 Mon Sep 17 00:00:00 2001 From: sebvtl Date: Mon, 25 Nov 2024 12:56:32 +0000 Subject: [PATCH] =?UTF-8?q?T=C3=A9l=C3=A9verser=20les=20fichiers=20vers=20?= =?UTF-8?q?"add-color-legendes"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../add-color-legendes-v2.2.jsx | 185 ++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 add-color-legendes/add-color-legendes-v2.2.jsx diff --git a/add-color-legendes/add-color-legendes-v2.2.jsx b/add-color-legendes/add-color-legendes-v2.2.jsx new file mode 100644 index 0000000..9d70b25 --- /dev/null +++ b/add-color-legendes/add-color-legendes-v2.2.jsx @@ -0,0 +1,185 @@ + +///////////////////////////////////////////////////////////////// +// Custom Swatch Information Script for Illustrator +// Copyright SebVTL +// Supports Pantone, RGB, CMYK, HSL, and Hex values. +// Handles Global Colors and renames temporary layers to "info-couleurs". +// Generates text with color details inside selected shapes. +// Adapts text color for strong contrast with background. +// Creates temporary layer directly above the selected shape's layer. +// Adds dynamic padding for text based on the size of the selected shape. +///////////////////////////////////////////////////////////////// + +var doc = app.activeDocument; + +if (doc.selection.length > 0) { + for (var i = 0; i < doc.selection.length; i++) { + var selectedItem = doc.selection[i]; + if (selectedItem.typename !== "PathItem") continue; + + var fillColor = selectedItem.fillColor; + var activeLayer = selectedItem.layer; + + // Unlock the active layer if locked + if (activeLayer.locked) activeLayer.locked = false; + + // Ensure a temporary layer is created above the active layer + var tempLayer = getOrCreateLayerAbove("info-couleurs", activeLayer); + + // Extract color details + var colorDetails = getColorDetails(fillColor); + if (!colorDetails) continue; + + // Create text frame with color information + createTextFrameWithPadding(selectedItem, colorDetails, tempLayer); + } +} + +// Function to create or get a layer directly above the specified layer +function getOrCreateLayerAbove(layerName, referenceLayer) { + var newLayer = null; + + // Check if a layer with the specified name already exists above the reference layer + for (var j = 0; j < doc.layers.length; j++) { + if (doc.layers[j].name === layerName && doc.layers[j].zOrderPosition > referenceLayer.zOrderPosition) { + return doc.layers[j]; // Return the existing layer + } + } + + // Create a new layer and move it above the reference layer + newLayer = doc.layers.add(); + newLayer.name = layerName; + newLayer.move(referenceLayer, ElementPlacement.PLACEBEFORE); + return newLayer; +} + +// Function to extract color details +function getColorDetails(color) { + var details = { + pantone: "N/A", + rgb: { red: 0, green: 0, blue: 0 }, + cmyk: { cyan: 0, magenta: 0, yellow: 0, black: 0 }, + hsl: "H:0 S:0 L:0", + hex: "#000000" + }; + + if (color.typename === "SpotColor" || color.typename === "GlobalColor") { + details.pantone = color.spot ? color.spot.name || "N/A" : "N/A"; + if (color.spot && color.spot.color.rgb) { + details.rgb = color.spot.color.rgb; + details.hex = rgbToHex(details.rgb.red, details.rgb.green, details.rgb.blue); + } + if (color.spot && color.spot.color.cmyk) details.cmyk = color.spot.color.cmyk; + if (color.spot && color.spot.color.hue !== undefined) { + details.hsl = "H:" + Math.round(color.spot.color.hue || 0) + + " S:" + Math.round(color.spot.color.saturation || 0) + + " L:" + Math.round(color.spot.color.lightness || 0); + } + } else if (color.typename === "RGBColor") { + details.rgb = color; + details.cmyk = convertToCMYK(color); + details.hsl = convertToHSL(color); + details.hex = rgbToHex(color.red, color.green, color.blue); + } else if (color.typename === "CMYKColor") { + details.cmyk = color; + details.rgb = convertToRGB(color); + details.hsl = convertToHSL(details.rgb); + details.hex = rgbToHex(details.rgb.red, details.rgb.green, details.rgb.blue); + } else { + return null; + } + + return details; +} + +// Function to create a text frame with dynamic padding +function createTextFrameWithPadding(item, colorDetails, targetLayer) { + var content = "Pantone: " + colorDetails.pantone + "\n" + + "RVB: " + Math.round(colorDetails.rgb.red) + ", " + Math.round(colorDetails.rgb.green) + ", " + Math.round(colorDetails.rgb.blue) + "\n" + + "CMJN: " + Math.round(colorDetails.cmyk.cyan) + "%, " + Math.round(colorDetails.cmyk.magenta) + "%, " + Math.round(colorDetails.cmyk.yellow) + "%, " + Math.round(colorDetails.cmyk.black) + "%\n" + + "TLS: " + colorDetails.hsl + "\n" + + "Hex: " + colorDetails.hex; + + // Calculate dynamic padding based on the item's dimensions + var paddingX = item.width * 0.1; // 10% of the item's width + var paddingY = item.height * 0.1; // 10% of the item's height + + + // Définir explicitement le calque temporaire comme calque actif + app.activeDocument.activeLayer = targetLayer; + if (targetLayer.locked) targetLayer.locked = false; + if (!targetLayer.visible) targetLayer.visible = true; + + var textFrame = doc.textFrames.add(); + + textFrame.contents = content; + textFrame.position = [item.left + paddingX, item.top - paddingY]; + + var textColor = new RGBColor(); + if (isDarkColor(colorDetails.rgb)) { + textColor.red = 255; + textColor.green = 255; + textColor.blue = 255; + } else { + textColor.red = 0; + textColor.green = 0; + textColor.blue = 0; + } + textFrame.textRange.fillColor = textColor; + + // Move the text frame to the target layer + textFrame.move(targetLayer, ElementPlacement.PLACEATBEGINNING); +} + +// Utility functions +function rgbToHex(r, g, b) { + function componentToHex(c) { + var hex = Math.round(c).toString(16); + return hex.length === 1 ? "0" + hex : hex; + } + return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); +} + +function convertToRGB(cmyk) { + return { + red: (1 - cmyk.cyan / 100) * (1 - cmyk.black / 100) * 255, + green: (1 - cmyk.magenta / 100) * (1 - cmyk.black / 100) * 255, + blue: (1 - cmyk.yellow / 100) * (1 - cmyk.black / 100) * 255 + }; +} + +function convertToCMYK(rgb) { + var r = rgb.red / 255, g = rgb.green / 255, b = rgb.blue / 255; + var k = 1 - Math.max(r, g, b); + if (k === 1) return { cyan: 0, magenta: 0, yellow: 0, black: 100 }; + return { + cyan: ((1 - r - k) / (1 - k)) * 100 || 0, + magenta: ((1 - g - k) / (1 - k)) * 100 || 0, + yellow: ((1 - b - k) / (1 - k)) * 100 || 0, + black: k * 100 + }; +} + +function convertToHSL(rgb) { + var r = rgb.red / 255, g = rgb.green / 255, b = rgb.blue / 255; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + + if (max == min) { + h = s = 0; + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return "H:" + Math.round(h * 360) + " S:" + Math.round(s * 100) + " L:" + Math.round(l * 100); +} + +function isDarkColor(color) { + return (color.red * 0.299 + color.green * 0.587 + color.blue * 0.114) < 128; +}