Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PythonRebrickable APILicence MIT

🧱 LegoLab

LegoLab est un ensemble d'outils Python permettant de créer des œuvres artistiques à partir de briques LEGO. Le projet s'appuie sur l'API Rebrickable pour récupérer en temps réel les pièces et couleurs disponibles dans le catalogue LEGO officiel.


📋 Table des matières


🎯 Sous-projets

1. Lego Mosaic

Transformez n'importe quelle photo en tableau LEGO en approximant les couleurs de chaque pixel vers les couleurs de briques réellement disponibles.

Fonctionnalités prévues :

  • Import d'une image (JPG, PNG)
  • Choix de la taille de grille parmi les formats officiels LEGO
  • Approximation colorimétrique configurable
  • Faire un fichier LDraw
  • Export de la liste des pièces nécessaires

2. My Own BrickHead

Créez une BrickHead personnalisée à partir de photos d'une personne. Le programme analyse les proportions du visage, des cheveux, des vêtements, etc.

Fonctionnalités prévues :

  • Analyse de photos (visage, cheveux, habits)
  • Génération du visuel 3D de la BrickHead
  • Export de la liste de pièces complète
  • Génération de la notice de montage

Roadmap

Le développement suit 4 phases. Chaque phase produit un livrable fonctionnel.

Phase 0 — Fondations (package data/) ✅

Objectif : centraliser l'accès aux données LEGO pour tous les sous-projets.

TâcheStatut
Client HTTP Rebrickable (auth, throttle, pagination)
Moteur de cache JSON local avec expiration
Catalogue des couleurs LEGO (fetch, cache 7j, modèle Color)
Recherche de pièces, détails, couleurs par pièce
Estimation de prix + liens marchands (BrickLink, BrickOwl)
Fonction find_closest_color(r, g, b) (distance RGB)

Phase 1 — Lego Mosaic 🎨

Objectif : transformer une image en mosaïque LEGO avec notice de montage.

Étape 1.1 — Traitement d'image

TâcheDépendanceStatut
Charger une image (JPG, PNG)Pillow
Redimensionner selon la grille choisie (ex: 48×48, 32×32)Pillow
Quantification des couleurs → palette LEGOdata.colors + K-means (scikit-learn)
Aperçu de la mosaïque (rendu pixel-art)Pillow ou matplotlib

Étape 1.2 — Mapping vers les pièces LEGO

TâcheDépendanceStatut
Mapper chaque pixel → couleur LEGO la plus prochedata.find_closest_color
Choisir le type de pièce (plate 1×1, tile 1×1, ou d'autre taille pour l'optimisation des pieces)data.parts
Générer la BOM (Bill of Materials / liste de pièces)data.prices
Estimer le coût total du projetdata.estimate_cost

Étape 1.3 — Export LDraw & notice

TâcheDépendanceStatut
Générer un fichier .ldr (format LDraw)pyldraw
Visualisation 3D (optionnel, via LDView ou Studio 2.0)externe
Notice de montage : rendu couche par couche en imagesPillow / matplotlib
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 2 — My Own BrickHead 🧑‍🎨

Objectif : générer une BrickHead personnalisée à partir de photos.

Étape 2.1 — Analyse du visage

TâcheDépendanceStatut
Détection de visage dans la photoOpenCV + Haar Cascade ou MediaPipe
Extraction des zones : peau, cheveux, yeux, boucheMediaPipe Face Mesh
Extraction des couleurs dominantes par zoneK-means (scikit-learn)
Mapping couleurs dominantes → couleurs LEGOdata.find_closest_color

Étape 2.2 — Génération du modèle BrickHead

TâcheDépendanceStatut
Template BrickHead paramétrique (grille 3D voxels)NumPy
Placement des couleurs sur le template (peau, cheveux, habits)
Choix automatique des briques selon la géométriedata.parts
Rendu visuel 3D en voxelsmatplotlib (3D) ou export LDraw

Étape 2.3 — Export et notice

TâcheDépendanceStatut
Export fichier .ldr (LDraw) de la BrickHeadpyldraw
Génération BOM + estimation de prixdata.prices
Notice de montage étape par étape (couche par couche)Pillow / reportlab
Export PDF via LPub3D (optionnel)LPub3D (externe)
Export PDF de la notice (alternatif)reportlab ou matplotlib

Phase 3 — Améliorations ✨

TâcheProjetPriorité
Amélioration colorimétrique (distance CIE-Lab au lieu de RGB)CommunMoyenne
Support des plates 1×2, 1×3, 1×4 pour optimiser la mosaïqueMosaicMoyenne
Détection du style vestimentaire (T-shirt, costume, etc.)BrickHeadBasse
Interface web locale simple (upload photo → résultat)CommunBasse
Compatibilité directe BrickLink Studio (.io)CommunBasse

Technologies retenues

CatégorieOutilRôle
Données LEGOAPI Rebrickable + cache localCouleurs, pièces, prix
Traitement imagePillow, OpenCVChargement, redim, détection visage
Analyse couleursscikit-learn (K-means)Quantification, couleurs dominantes
Analyse visageMediaPipe Face MeshSegmentation zones du visage
Modélisation 3DNumPy (voxels)Template BrickHead paramétrique
Export LEGOpyldraw (format LDraw .ldr)Génération programmatique de modèles LDraw
InstructionsLPub3D (externe)Génération de notices PDF depuis un fichier .ldr
Notice/PDFPillow, matplotlib, reportlabRendu couche par couche

Écarté volontairement : Flask/FastAPI (pas de serveur nécessaire), Flutter/React Native (pas d'appli mobile), U-Net/Mask R-CNN (surdimensionné), Three.js (on reste en Python), bricknil (pilotage moteurs LEGO Powered Up, hors sujet).


🀽 Prérequis

OutilVersionDescription
Python≥ 3.10Langage principal
pip≥ 22.0Gestionnaire de paquets Python
Git≥ 2.30Versionnement du code
Compte RebrickableGratuit — nécessaire pour obtenir une clé API

Dépendances Python

PaquetRôlePhase
requestsRequêtes HTTP vers l'API Rebrickable0 ✅
python-dotenvChargement des variables d'environnement0 ✅
pyldrawGénération de fichiers LDraw (.ldr) en Python1–2
PillowChargement, redimensionnement et rendu d'images1
numpyManipulation de tableaux / grilles de voxels1
scikit-learnK-means pour quantification des couleurs1
matplotlibAperçu mosaïque, rendu 3D voxels1–2
opencv-pythonDétection de visage, traitement image avancé2
mediapipeFace Mesh – segmentation zones du visage2
reportlabGénération de notices PDF1–2

🚀 Installation

# 1. Cloner le dépôt
git clone https://github.com/<votre-utilisateur>/LegoLab.git
cd LegoLab
# 2. Créer un environnement virtuel (recommandé)
python -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windows# 3. Installer les dépendances
pip install -r requirements.txt²

⚙️ Configuration

  1. Créer un compte gratuit sur rebrickable.com
  2. Accéder à la page API : rebrickable.com/api/
  3. Générer une clé API
  4. Copier le template et renseigner la clé :
cp .env.example .env

Puis éditer .env :

REBRICKABLE_API_KEY=votre_clé_ici

📦 Package data – Utilisation

Le package data/ centralise tous les accès à l'API Rebrickable. Les sous-projets n'appellent jamais l'API directement.

Import rapide

fromdataimportget_colors, find_closest_color, search_parts, estimate_cost

Couleurs

fromdataimportget_colors, find_closest_color, get_color_by_name# Toutes les couleurs (cache auto 7 jours)colors=get_colors()
# Trouver la couleur LEGO la plus proche d'un pixelclosest=find_closest_color(200, 50, 30) # RGBprint(closest[0]) # → Dark Red #720E0F [id=320]# Recherche par nomred=get_color_by_name("Red")
print(red.hex, red.rgb_tuple) # → #C91A09 (201, 26, 9)

Pièces

fromdataimportsearch_parts, get_part_colors, get_parts_by_nums# Rechercheresults=search_parts("brick 2x4")
# Couleurs dispo pour une pièce (cache 30 jours)colors=get_part_colors("3001")
forcincolors:
print(f"{c.color_name} #{c.color_rgb}{c.num_sets} sets")
# Batch : plusieurs pièces en un seul appelparts=get_parts_by_nums(["3001", "3002", "3003"])

Estimation de prix

fromdataimportestimate_cost, get_price_links# Liens marchands pour une piècelinks=get_price_links("3001", color_id=5)
print(links.bricklink_url)
# Estimation du coût d'un projetcost=estimate_cost([("3001", 100), ("3003", 50)])
print(f"Coût estimé : {cost['total_eur']} €")

Cache

Les données sont stockées automatiquement dans data/cache/ :

DonnéeFichier cacheDurée
Couleurs LEGOcolors.json30 jours
Couleurs par piècepart_colors_<num>.json30 jours
Catégoriespart_categories.json30 jours

Pour forcer un rafraîchissement :

fromdataimportrefresh_colorsrefresh_colors() # re-télécharge depuis l'API

🔧 Pipeline LDraw → Instructions

Le projet utilise le format LDraw (.ldr) comme format pivot pour l'export des modèles LEGO. Deux chemins sont possibles pour générer des instructions de montage :

Python (pyldraw) LPub3D (externe)
┌────────────┐ ┌──────────────────────────┐
│ Modèle │ │ 1. Ouvrir le .ldr │
│ → Piece() │ │ 2. Configurer les steps │
│ → Vector() │ ──▶ │ 3. Générer les images │
│ → .ldr │ │ 4. Export PDF │
└────────────┘ └──────────────────────────┘
OutilTypeRôle
pyldrawLib PythonGénération programmatique de fichiers .ldr (pièces, couleurs, positions)
LPub3DApp externeGénération de notices de montage PDF à partir d'un .ldr
LDViewApp externeVisualisation 3D d'un modèle .ldr (optionnel)
BrickLink Studio 2.0App externeÉdition / rendu 3D avancé (optionnel)

Exemple de génération LDraw avec pyldraw

fromldraw.piecesimportPiecefromldraw.geometryimportVector, Identityfromldraw.library.coloursimportRed, Blue# Placer une brique 2×4 rouge à l'origineprint(Piece(Red, Vector(0, 0, 0), Identity(), "3001"))
# Placer une brique 2×4 bleue au-dessusprint(Piece(Blue, Vector(0, -24, 0), Identity(), "3001"))

Note :pyldraw nécessite la bibliothèque de pièces LDraw, téléchargée automatiquement au premier import.


🌐 API Rebrickable

Ce projet utilise l'API REST v3 de Rebrickable.

Endpoints utilisés :

EndpointDescription
GET /lego/colors/Liste de toutes les couleurs
GET /lego/parts/Recherche de pièces
GET /lego/parts/{part_num}/Détails d'une pièce
GET /lego/parts/{part_num}/colors/Couleurs disponibles pour une pièce
GET /lego/part_categories/Catégories de pièces

Limites : 1 requête/seconde (gestion automatique du rate-limiting intégrée).


📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.


LEGO® est une marque déposée du groupe LEGO. Ce projet n'est ni affilié ni approuvé par LEGO.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages