J'ai reçu un message de Cédric qui me demande un exemple de pilotage d'AutoCAD à partir de Excel :

J'ai l'idée de créér un programme afin de dessiner des éléments paramétriques dans autocad.
Voilà comment ça fonctionne, je prend l'exemple d'un rectangle :
Les paramètres sont décrits dans Excel. Pour un rectangle, je rentre a et b dans Excel (largeur et longueur). Toujours dans excel, ces paramètres sont traduits en 4 lignes dont les cellules contiennent les infos suivantes :
ligne point1x point1y point2x point2y, couleur, epaisseur type de trait
puis j'execute une procedure qui lit ces 4 lignes et trace les lignes dans AutoCAD.
Ma question : comment donner des instructions dans le programme autocad depuis un programme excel?

Voici une solution qui correspond à cette demande. J'ai utilisé au maximum les fonctions d'Excel pour limiter les objets à utiliser avec AutoCAD. Par exemple, je pilote les codes des couleurs et d'épaisseurs des traits directement dans le tableur, ainsi la procédure n'a plus qu'à les lire pour les utiliser directement dans la routine (on aurait pu faire la traduction directement dans la procédure en vba).

La première chose à faire est de programmer la feuille Excel pour obtenir les valeurs qui seront lues et traitées par la procédure sous Excel.

On commence par indiquer les données d'entrée :

  • Longueur du rectangle
  • Hauteur du rectangle
  • Point d'insertion du rectangle
  • Couleur et épaisseur des traits

Pour les valeurs de la longueur, hauteur et les coordonnées du point d'insertion (x et y), pas de difficulté particulière.

Pour la définition de la couleur et de l'épaisseur, j'ai choisi d'utiliser des listes déroulantes donnant les valeurs en clair (Rouge, Vert, Du calque etc.) qu'il faut ensuite traduire en code couleur ou code épaisseur pour qu'AutoCAD puisse les interpréter directement dans le programme.

Codes couleur :

On défini la couleur d'une entité d'AutoCAD par cette fonction :

Entité.Couleur = Numéro d'une couleur

  • Entité étant un objet d'AutoCAD (ligne, cercle, arc, texte etc.)
  • Couleur étant la propriété de l'objet.
  • Numéro d'une couleur étant un nombre de type Integer (un entier) ou directement une variable prédéfinie dans AutoCAD, du type acXxx

Notes : ce nombre est défini par une variable AutoCAD. Par exemple la couleur rouge (code couleur 1) est définie par la variable AcRed.
On peut trouver la liste de ces variables dans l'aide AutoCAD : Menu ? > Aide aux développeurs > Onglet Index > Color property (CAO)

Certaines couleurs sont particulières : Par exemple, la couleur DuCalque est définie par le code 256 ou par la variable acByLayer

Exemple : Pour mettre une ligne en rouge on peut indifféremment faire :

 

  • Ligne.Color = AcRed

ou

  • Ligne.Color = 1

 

La "traduction" de la couleur indiquée en clair (par exemple Rouge) en code interprétable par AutoCAD se fait directement dans Excel en utilisant la fonction RECHERCHE(Valeur recherchée;Matrice) (voir Tableau 1 du fichier Excel ci-dessous).
Note : Il y a deux listes de couleurs dans ce tableau : Une est ordonnée pour l'affichage de la liste déroulante, une seconde est ordonnée pour la fonction RECHERCHE qui exige que les valeurs recherchées soient triées dans l'ordre alphabétique pour trouver la bonne valeur correspondante.

La valeur sélectionnée dans la cellule D15 est ainsi traduite dans la cellule I38. C'est dans cette dernière cellule que le programme ira lire la valeur de la couleur à tracer dans AutoCAD.

Codes pour les épaisseurs de lignes :

On défini l'épaisseur d'une entité d'AutoCAD par cette fonction :

Entité.Epaisseur = Numéro d'une épaisseur

  • Entité étant un objet d'AutoCAD (ligne, cercle, arc, texte etc.)
  • Epaisseur étant la propriété de l'objet.
  • Numéro d'une épaisseur étant un nombre de type Integer (un entier) ou directement une variable prédéfinie dans AutoCAD, du type acLnWtXXX

C'est le même principe que pour les couleurs, à chaque épaisseur de trait correspond une variable AutoCAD du type acLnWtXXX qui peut aussi être indiquée directement par un nombre entier.

Exemple : Pour mettre une ligne en épaisseur 0,13 mm on peut indifféremment faire :

  • Ligne.Lineweight = acLnWt013

ou

  • Ligne.Lineweight = 013

Les types de traits spéciaux (DuBloc, DuCalque, Défaut) ont des valeurs numériques négatives :
Exemple : DuBloc -> acLnWtByBlock -> -2
(Voir Tableau 2 du fichier Excel ci-dessous).

Les autres épaisseurs des traits sont numériquement définies par leur épaisseurs réelles multipliées par 100
Exemple : Largeur 0,13 mm -> acLnWt013 -> 13

Le code du programme :

Ces différentes variables définies dans Excel, on peut maintenant écrire la procédure qui va successivement :

  1. Déclarer l'objet AutoCAD dans Excel (ne pas oublier de référencer AutoCAD dans Excel en allant dans le menu Outils > Références de l'éditeur vba).
  2. Créé l'objet AutoCAD
  3. Déclarer les différentes variables objet utilisées par AutoCAD : Objet Document AutoCAD et objet Ligne.
  4. Déclarer les différentes variables numériques utilisées par AutoCAD : les points (du type tableau à 3 "cases" de type numérique Double, les codes couleur et épaisseurs.
  5. Calculer et définir les valeurs nécessaires aux programme.
  6. Tracer le rectangle
  7. Fermer les objets pour les libérer de la mémoire de l'ordinateur.

Note : On aurait pu rajouter un gestionnaire d'erreur, mais ceci reste un exemple que je ne veux pas compliquer.

Ce qui donne comme code :


Sub Rectangle()
'Nécessite la référence Autocad xxx Type Library (Menu Outils > Références)
Dim AcadApp As AcadApplication, AcadPlan As AcadDocument

'Création de l'objet AutoCAD dans Excel :
Set AcadApp = AcadApplication
'Si ACAD n'est pas ouvert, il faut créer une nouvelle application comme si dessous :
'Set AcadApp = New AcadApplication

'Rend AutoCAD visible
AcadApp.Visible = True

'Ci dessous, ouvre un document précis :
'Set AcadPlan = AcadApp.Documents.Open("D:\Temp\test.dwg")
'ou sinon, utilise le document ouvert :
Set AcadPlan = AcadApp.ActiveDocument

'Définition des variables des points composant le rectangle :
Dim Pori(0 To 2As Double 'Point origine
Dim P1(0 To 2As Double
Dim P2(0 To 2As Double
Dim P3(0 To 2As Double
'Définition des variables définissant la couleur et l'épaisseur du trait
Dim Couleur As AcColor
Dim Epaisseur As AcLineWeight
'Définition de l'objet ligne
Dim Ligne As AcadLine

'Définition des coordonnées des points du rectangle lues dans Excel
Pori(0= Cells(104):  Pori(1= Cells(105'Point d'origine avec z=0 par défaut (pori(2)=0)
P1(0= Cells(114):  P1(1= Cells(115)
P2(0= Cells(124):  P2(1= Cells(125)
P3(0= Cells(134):  P3(1= Cells(135)

'Définition de la valeur de la couleur
Couleur = Cells(389'Lecture du code de la couleur choisie dans Excel

'Définition de l'épaisseur du trait
Epaisseur = Cells(399'Lecture du code de l'épaisseur choisie dans Excel

'Traçage du rectangle dans l'espace objet d'AutoCAD
Set Ligne = AcadPlan.ModelSpace.AddLine(Pori, P1) 'Traçage de la 1ere ligne
Ligne.Color = Couleur 'Donne la couleur choisie
Ligne.Lineweight = Epaisseur 'Donne l'épaisseur choisie
'2e ligne
Set Ligne = AcadPlan.ModelSpace.AddLine(P1, P2)
Ligne.Color = Couleur
Ligne.Lineweight = Epaisseur
'3e ligne
Set Ligne = AcadPlan.ModelSpace.AddLine(P2, P3)
Ligne.Color = Couleur
Ligne.Lineweight = Epaisseur
'4e ligne
Set Ligne = AcadPlan.ModelSpace.AddLine(P3, Pori)
Ligne.Color = Couleur
Ligne.Lineweight = Epaisseur

'Rafraichir l'affichage de la fenêtre active
AcadPlan.Regen acActiveViewport

'Libérer la mémoire des objets ouverts
Set Ligne = Nothing
Set AcadApp = Nothing
Set AcadPlan = Nothing

'AcadPlan.Save 'Sauvegarde le dessin
'AcadPlan.Close 'Ferme le dessin
'AcadApp.Quit 'Ferme l'application AutoCAD

End Sub


et le fichier Excel correspondant : télécharger ici (il va falloir me faire confiance en acceptant de charger les macros lorsque vous aurez le message de sécurité donné par Excel quand il va détecter la présence de code dans le classeur ! Il n'y a pas de code malicieux !)