Un plugin qui intègre une interface web dans AutoCAD pour créer des modèles 3D à partir d'une simple description textuelle, et les importer en un clic dans l'espace de dessin.
Décris l'objet que tu veux modéliser en français ou anglais. Le plugin envoie ta description à l'API Meshy.
Meshy génère un modèle 3D complet (fichier .obj) en 1 à 2 minutes grâce à l'intelligence artificielle.
D'un seul clic, le modèle est téléchargé et importé directement dans l'espace de dessin AutoCAD 2027.
L'interface est une page HTML/CSS/JS affichée dans une palette AutoCAD via WebView2 de Microsoft.
Le plugin ouvre une palette dans AutoCAD. Tu décris ton objet, l'IA génère le modèle, et il est importé automatiquement.
GEN3D dans AutoCADGuide pas à pas pour créer un plugin AutoCAD avec interface web, destiné aux débutants complets sous Visual Studio 2022.
Va sur meshy.ai, crée un compte gratuit, puis dans les paramètres du compte cherche API Key. Copie cette clé — tu en auras besoin dans le fichier JavaScript.
Avant de toucher à Visual Studio, on crée l'interface visuelle du plugin. C'est une page web normale.
Crée un dossier sur ton bureau appelé Web. À l'intérieur, crée trois fichiers : index.html, style.css et script.js
Lance VS Code → Fichier → Ouvrir le dossier → sélectionne ton dossier Web
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AI 3D Generator</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="plugin-container">
<h1>Générateur 3D</h1>
<div class="input-section">
<label for="promptInput">Description de l'objet :</label>
<textarea id="promptInput"
placeholder="Ex: Une chaise moderne en bois..."></textarea>
</div>
<button id="generateBtn">Générer le modèle 3D</button>
<div id="loader" class="hidden">
<div class="spinner"></div>
<p>Création en cours... (peut prendre 1-2 min)</p>
</div>
<div id="statusMsg" class="hidden"></div>
<div id="resultArea" class="hidden">
<p class="success-msg">✓ Modèle prêt !</p>
<button id="importBtn" class="secondary">Importer dans AutoCAD</button>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: Arial, sans-serif;
background: #1e1e1e;
color: #ffffff;
padding: 20px;
}
.plugin-container { max-width: 460px; }
h1 { font-size: 18px; margin-bottom: 20px; color: #4fc3f7; }
.input-section { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-size: 13px; color: #aaaaaa; }
textarea {
width: 100%; height: 100px;
background: #2d2d2d; border: 1px solid #444;
color: #ffffff; padding: 10px;
border-radius: 4px; font-size: 13px; resize: vertical;
}
button {
width: 100%; padding: 10px;
background: #4fc3f7; color: #000000;
border: none; border-radius: 4px;
font-size: 14px; cursor: pointer; font-weight: bold;
}
button:hover { background: #81d4fa; }
button.secondary {
background: #2d2d2d; color: #4fc3f7;
border: 1px solid #4fc3f7; margin-top: 10px;
}
.hidden { display: none; }
#loader { margin-top: 15px; text-align: center; }
.spinner {
width: 30px; height: 30px;
border: 3px solid #444;
border-top: 3px solid #4fc3f7;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto 10px auto;
}
@keyframes spin { to { transform: rotate(360deg); } }
#statusMsg {
margin-top: 10px; padding: 10px;
background: #2d2d2d; border-radius: 4px; font-size: 13px;
}
.success-msg { color: #81c784; font-weight: bold; }
#resultArea { margin-top: 15px; }
Va sur meshy.ai, crée un compte, connecte-toi, puis dans les paramètres cherche API Key. Copie-la.
const MESHY_API_KEY = "TA_CLE_API_MESHY";
document.getElementById("generateBtn")
.addEventListener("click", async () => {
const prompt = document.getElementById("promptInput").value.trim();
if (!prompt) { alert("Décris d'abord l'objet !"); return; }
document.getElementById("loader").classList.remove("hidden");
document.getElementById("resultArea").classList.add("hidden");
document.getElementById("statusMsg").classList.add("hidden");
document.getElementById("generateBtn").disabled = true;
try {
const response = await fetch("https://api.meshy.ai/v2/text-to-3d", {
method: "POST",
headers: {
"Authorization": `Bearer ${MESHY_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
mode: "preview",
prompt: prompt,
art_style: "realistic"
})
});
const data = await response.json();
const taskId = data.result;
const modelUrl = await pollForResult(taskId);
document.getElementById("loader").classList.add("hidden");
document.getElementById("resultArea").classList.remove("hidden");
document.getElementById("importBtn").onclick = () => {
window.chrome.webview.postMessage("IMPORT:" + modelUrl);
};
} catch (err) {
document.getElementById("loader").classList.add("hidden");
document.getElementById("statusMsg").classList.remove("hidden");
document.getElementById("statusMsg").textContent = "Erreur : " + err.message;
}
document.getElementById("generateBtn").disabled = false;
});
async function pollForResult(taskId) {
while (true) {
await new Promise(r => setTimeout(r, 5000));
const res = await fetch(
`https://api.meshy.ai/v2/text-to-3d/${taskId}`,
{ headers: { "Authorization": `Bearer ${MESHY_API_KEY}` } }
);
const data = await res.json();
if (data.status === "SUCCEEDED") return data.model_urls.obj;
if (data.status === "FAILED") throw new Error("La génération a échoué");
}
}
Lance Visual Studio 2022 → Créer un projet → cherche "Bibliothèque de classes" → sélectionne Bibliothèque de classes (.NET) → Suivant
Nom : AutoCAD3DPlugin → choisis un dossier → Créer
Dans l'Explorateur de solutions, double-clique sur AutoCAD3DPlugin (l'icône C#). Remplace tout le contenu par :
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<Platforms>x64</Platforms>
<PlatformTarget>x64</PlatformTarget>
<Nullable>enable</Nullable>
<ImplicitUsings>disable</ImplicitUsings>
<NoWarn>$(NoWarn);MSB3277;CS1705</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="acdbmgd">
<HintPath>C:\Program Files\Autodesk\AutoCAD 2027\acdbmgd.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="acmgd">
<HintPath>C:\Program Files\Autodesk\AutoCAD 2027\acmgd.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="accoremgd">
<HintPath>C:\Program Files\Autodesk\AutoCAD 2027\accoremgd.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3967.48" />
</ItemGroup>
<ItemGroup>
<Content Include="Web\index.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Web\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Web\script.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
Clic droit sur le projet → Ajouter → Nouveau dossier → nomme-le Web. Puis clic droit sur Web → Ajouter → Élément existant → sélectionne tes 3 fichiers HTML/CSS/JS.
Dans Properties → AssemblyInfo.cs, remplace tout le contenu par :
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
[assembly: Guid("25f5afd5-83cb-4839-bd3a-dfdc2f1ecbd2")]
Supprime Class1.cs. Clic droit sur le projet → Ajouter → Nouvel élément → Classe → nomme-le PalettePanel.cs. Colle ce code :
using System;
using System.IO;
using System.Windows.Forms;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;
namespace AutoCAD3DPlugin
{
public class PalettePanel : UserControl
{
private WebView2 webView;
public PalettePanel()
{
webView = new WebView2();
webView.Dock = DockStyle.Fill;
this.Controls.Add(webView);
this.Load += PalettePanel_Load;
}
private async void PalettePanel_Load(object? sender, EventArgs e)
{
await webView.EnsureCoreWebView2Async(null);
string pluginDir = Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location)!;
string htmlPath = Path.Combine(pluginDir, "Web", "index.html");
webView.CoreWebView2.Navigate(
"file:///" + htmlPath.Replace("\\", "/"));
}
}
}
Même procédure → Classe → Commands.cs
using System;
using System.Drawing;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
namespace AutoCAD3DPlugin
{
public class Commands
{
private static PaletteSet? _paletteSet;
[CommandMethod("GEN3D")]
public void ShowGenerator()
{
try
{
if (_paletteSet == null)
{
_paletteSet = new PaletteSet("Générateur 3D");
_paletteSet.Size = new Size(500, 700);
_paletteSet.Add("Générateur", new PalettePanel());
}
_paletteSet.Visible = true;
}
catch (System.Exception ex)
{
Autodesk.AutoCAD.ApplicationServices.Application
.DocumentManager.MdiActiveDocument
.Editor.WriteMessage("\nErreur : " + ex.Message);
}
}
}
}
Génération → Regénérer la solution. Tu dois voir Build : 1 réussite(s), 0 échec(s) en bas de Visual Studio.
Le fichier compilé se trouve dans : bin\x64\Debug\net10.0-windows\AutoCAD3DPlugin.dll
Ouvre AutoCAD → tape NETLOAD dans la barre de commandes → navigue jusqu'au .dll → sélectionne-le → clique "Load Once" si AutoCAD demande si tu lui fais confiance.
Tape GEN3D dans la barre de commandes. La palette du générateur 3D doit s'ouvrir sur le côté.
Tous les problèmes rencontrés pendant le développement du plugin, et comment ils ont été résolus.
Visual Studio signalait 3 erreurs dans index.html : "La balise n'a pas été fermée", "Balise de fin </meta> attendue", "Balise de fin </link> attendue". La liste d'erreurs affichait 13 erreurs et 165 avertissements.
Il y avait deux balises <meta charset> : une ancienne sans /> et une nouvelle correcte. Le code avait été copié deux fois.
<meta charset="UTF-8" /> avec la fermeture correcte. Les balises <meta> et <link> en HTML5 doivent se fermer avec />.
Après compilation, Visual Studio affichait 165 avertissements du type :
AutoCAD 2027 est compilé avec .NET 10, mais le projet ciblait .NET 8. Cette incompatibilité de version génère des avertissements MSB3277.
<NoWarn>$(NoWarn);MSB3277</NoWarn> dans le fichier .csproj pour ignorer ces avertissements inévitables. Les conflits de version entre AutoCAD et le projet sont normaux et n'affectent pas le fonctionnement du plugin.
Les avertissements de version se transformaient en erreurs bloquantes CS1705 qui empêchaient complètement la compilation :
Le projet ciblait .NET 8 ou .NET 9, trop éloigné de .NET 10 utilisé par AutoCAD 2027. L'écart de version était trop grand pour être toléré par le compilateur.
net10.0-windows. En ciblant exactement la même version que AutoCAD, les conflits disparaissent complètement.
Visual Studio signalait plusieurs erreurs d'attributs en double :
Les projets .NET SDK (style moderne) génèrent automatiquement ces attributs. Le fichier AssemblyInfo.cs de l'ancien style les déclarait une deuxième fois, créant des doublons.
ComVisible(false) et Guid(...).
Après avoir testé le plugin dans AutoCAD et voulu recompiler, Visual Studio affichait cette erreur répétée 10 fois :
AutoCAD était encore ouvert et avait chargé le .dll en mémoire. Windows empêche la modification d'un fichier en cours d'utilisation.
acad.exe.
Lors de la création du fichier PalettePanel.cs, Visual Studio l'avait créé comme un composant WinForms avec un designer visuel. Cela causait des erreurs de conception et des conflits avec le code.
Au lieu de choisir "Classe" dans les modèles, un modèle WinForms avait été sélectionné, ce qui génère des fichiers .cs et .resx supplémentaires incompatibles.
Après avoir tapé GEN3D dans AutoCAD, le logiciel crashait avec une erreur fatale :
WebView2 (le composant qui affiche la page web) est incompatible avec certaines versions d'AutoCAD Education. La tentative d'initialiser un moteur de rendu web dans le processus AutoCAD cause un conflit mémoire.