Le Coin des AutoCADiens

Le site français des développeurs pour AutoCAD

Vous pourrez ici apprendre à programmer en Visual Basic pour AutoCAD.
VBA Descript 2 VBA

D'AutoCAD vers Access


On a vu par le programme Descript comment il était facile d'envoyer des informations vers Excel. Vers Access c'est aussi facile, sinon plus.
Le programme Descript2 qui suit fait la même chose que Descript mais avec le SGDB Access.
Ce programme devrait vous être très utile, à condition de l'adapter à vos besoins réels.

Révision du 2/12/98 : Indexation de certains champs dans la base modèle, code non modifié.

Ne pas confondre DAO et DAO


DA0 Pour accéder à Access on va utiliser le moteur de base de données Microsoft Jet à l'aide de la bibliothèque DAO.
DAO signifie ici Data Access Objects - Objets d'accès aux données.

Pour commencer, cochez la case Microsoft DAO 3.5 Object Library dans la boîte Références du menu Outils de VBA.

  • L'objet DBEngine est l'objet de niveau supérieur du modèle objet DAO. Il contient et contrôle tous les objets de la hiérarchie DAO.
  • L'objet Database correspond à la base de données ouverte dans l'objet Workspace.
  • La méthode OpenDatabase ouvre la base de données indiquée dans l'objet Workspace et renvoie une référence à l'objet Database qui la représente.
  • Un objet Recordset représente les enregistrements d'une table de base ou les enregistrements résultant de l'exécution d'une requête. Avec DAO, les données sont manipulées à l'aide des objets Recordset.
  • La méthode OpenRecordset crée l'objet Recordset.

Créer la base modèle DESCRIPT.mdb

Descript2

Tout d'abord, vous aurez évidemment besoin d'Access.
Le programme n'a pas été testé avec des versions antérieures à Access 97, mais il ne devrait y avoir aucun problème.

On va tout d'abord créer une base de données modèle que nous appellerons desript.mdb avec les tables et les champs suivants :
  • Table Blocs
    Nom du blocTexteTaille 50 caractIndexé avec doublons
    CalqueTexteTaille 20 caract
    EchelleNumériqueRéel simple
    Coord en XNumériqueRéel double
    Coord en YNumériqueRéel double
    Attribut 1TexteTaille 50 caract
    Attribut 2TexteTaille 50 caract
    Attribut 3TexteTaille 50 caract
    Attribut 4TexteTaille 50 caract
    Attribut 5TexteTaille 50 caract
    Nota :Ajouter autant d'attributs que leur nombre maximum dans vos blocs


  • Table Calques
    NomCalqueTexteTaille 50 caractIndexé sans doublons
    CouleurTexteTaille 10 caract
    TypeLigneTexteTaille 50 caract
    GeléOui/NonRéel double
    VerrouilléOui/NonRéel double

  • Table StylesTexte
    Style de texteTexteTaille 50 caractIndexé sans doublons
    Nom de fichierTexteTaille 50 caract
    HauteurNumériqueRéel double
    Facteur ExtensionNumériqueRéel double
    InclinaisonNumériqueRéel simple
    VerrouilléOui/NonRéel double

  • Table TypesLigne
    Type de LigneTexteTaille 50 caractIndexé sans doublons
    DescriptionTexteTaille 255 caract

    Nota :
  • Si vous modifiez les noms des tables ou des champs, n'oubliez pas de les modifier dans le programme.

Ce programme copiera automatiquement le modèle, ouvrira Access, remplira les tables, sauvegardera le fichier sous le même nom que le dessin et dans le même répertoire puis refermera Access, le tout de manière invisible.

En spécifiant une indexation du premier champ de chaque table, vous obtiendrez automatiquement un classement par ordre alphabétique suivant ce champ.

Exactement de la même manière, vous pourrez ajouter d'autres tables pour les listes de dictionnaires, de styles de cotation, de SCU etc.

Une petite forme (bis)

Form
Feuille exactement identique à la feuille UserForm1 de Descript Commencez par insérer un nouveau module, puis dans ce Module1, ouvrez une nouvelle feuille "UserForm1" et placez les quelques contrôles suivant le modèle et les indications ci-dessous.

La feuille UserForm1
  • On conserve le nom UserForm1
  • Modifiez la propriété Caption par Description du dessin en cours

NOTA : La liste ci-dessous donne le nom des contrôles ; respectez ces noms qui sont donnés ici, ils doivent correspondre au code source, sinon modifiez-les dans le code également.

Controles La case à cocher Blocs
Propriété (Name) : chkBlocs

La case à cocher Calques
Propriété (Name) : chkCalques

La case à cocher Types de Lignes
Propriété (Name) : chkTypLignes

La case à cocher Styles de Texte
Propriété (Name) : chkStyleText

Le bouton de commande Créer les listes
Propriété (Name) : cmdAction

Le bouton de commande Annuler
Propriété (Name) : cmdAnnuler

A quoi servent les intitulés @+ ?
Indispensables, ils servent d'anti-bugs. Mais si, c'est vrai ! :-)


Le code de Module1

Déclarations dans Module1
Quelques explications sur le code :
  • Option Explicit oblige à déclarer les variables, ce qui permet de réduire les conséquences des fautes de frappe.
  • Public : les valeurs de ces variables sont utilisées dans plusieurs procédures.
  • Dans Sub Descript2 on recherche le nom du dessin puis on copie la base modèle (personnalisez le chemin) en prenant le nom du dessin.
    Si une base de ce nom existe déjà, elle sera effacée, sans mise en garde.
  • Set dbAcc = OpenDatabase(FichAccess) ouvre la base de données que l'on vient de copier.

    Option Explicit
    'Initialisation des variables
    Public dbAcc As Database            ' Variable objet de la base de données
    Public FichAccess As String         ' Nom du fichier avec le chemin
 
Public Sub Descript2()
    On Error Resume Next
    ' on récupère le nom du dessin
    FichAccess = ThisDrawing.FullName
    ' Pour être sûr que ce n'est pas un dessin sans nom
    If FichAccess <> "" Then
      ' on retire l'extension dwg à la fin du nom
      FichAccess = Left$(FichAccess, Len(FichAccess) - 3)
      ' on ajoute l'extension pour Access
      FichAccess = FichAccess + "mdb"
     Else
      FichAccess = "SansNom.mdb"
    End If
    ' Copie de la base modèle dans le répertoire de travail
    ' modifiez le chemin en fonction de l'emplacement de votre modéle
    FileCopy "c:\acadr14\vbamacro\descript.mdb", FichAccess
    Set dbAcc = OpenDatabase(FichAccess)
    UserForm1.Show
    
End Sub
    


Le code de la feuille UserForm1

Procédure Private Sub cmdAction_Click()
    Quand on clique sur le bouton Créer les listes :
  • Enregistrement des tables choisies
  • Fermeture et déchargement de la base de données.

Private Sub cmdAction_Click()
        
    On Error GoTo 0
    ' Vers Procédure d'élaboration de la liste des blocs
    If chkBlocs = True Then
        ListBlocs
    End If
    ' Vers Procédure d'élaboration de la liste des calques
    If chkCalques = True Then
        ListCalques
    End If
    ' Vers Procédure d'élaboration de la liste des types de lignes
    If chkTypLignes = True Then
        ListTypLignes
    End If
    ' Vers Procédure d'élaboration de la liste des styles de texte
    If chkStyleText = True Then
        ListStyleText
    End If
    ' Tout est fini ! Fermeture de l'application Access
    dbAcc.Close
    Set dbAcc = Nothing
    Unload Me

End Sub


Procédure Private Sub ListBlocs()
  • Ouverture du Recordset de la table Blocs.
    Un recordset est un jeu d'enregistrements qui correspondent aux critères que vous spécifiez. Si on ne spécifie que la table, le recordset contient tous les enregistrements de cette table.
  • Enregistrement de chaque champ sous la forme recordset!champ = valeur ou recordset![champ de foire] = valeur
    Notez le séparateur "!"

  • ou sous la forme recordset(champ) = valeur si on utilise des variables.

Private Sub ListBlocs()
    ' Procédure d'élaboration de la liste des blocs
    Dim Blocs As Recordset
    Dim objElem As Object           ' objet Elément du dessin
    Dim tablAttrib As Variant       ' tableau des attributs
    Dim Cpt1 As Integer             ' compteur
    Dim PtInsert As Variant         ' point d'insertion du bloc
    Dim chmAttrib                   ' champ attribut
    ' on travaille avec la table Calques
    Set Blocs = dbAcc.OpenRecordset("Blocs", dbOpenDynaset)
    ' on balaye le dessin entier
    For Each objElem In ThisDrawing.ModelSpace
      ' si l'élément est un bloc
      If objElem.EntityType = acBlockReference Then
         Blocs.AddNew
         ' Enregistre le nom du bloc
         Blocs![Nom du bloc] = objElem.Name
         ' Enregistre le nom du calque d'insertion du bloc
         Blocs!Calque = objElem.Layer
         ' Enregistre l'éhelle du bloc
         Blocs!Echelle = objElem.XScaleFactor
         ' Enregistre le nom du bloc
         PtInsert = objElem.insertionPoint
          ' Enregistre les coord. du point d'insertion du bloc
         Blocs![Coord en X] = PtInsert(0)
         Blocs![Coord en Y] = PtInsert(1)
         ' les attributs sont stockés dans un tableau
         tablAttrib = objElem.GetAttributes
         For Cpt1 = LBound(tablAttrib) To UBound(tablAttrib)
           chmAttrib = "Attribut " & (Cpt1 + 1)
           ' si vous préférez avoir la liste des étiquettes au lieu
           ' de leur valeur, remplacez TextString par TagString
           If IsNull(tablAttrib(Cpt1).TextString) Or _
            tablAttrib(Cpt1).TextString = "" Then
              Blocs(chmAttrib) = " "
            Else
              ' Enregistre la valeur de l'attribut du bloc
              Blocs(chmAttrib) = tablAttrib(Cpt1).TextString
           End If
         Next Cpt1
         Blocs.Update
      End If
    Next objElem
    Blocs.Close
    Set Blocs = Nothing
   
End Sub


Procédure Private Sub ListCalques()

Private Sub ListCalques()
    ' Procédure d'élaboration de la liste des calques
    Dim Calques As Recordset
    Dim objCalque As AcadLayer    ' objet Calque
    Dim NumColor As Integer
    Dim CoulCalc As Variant
    Dim Couleurs(7) As String
    
    Couleurs(1) = "rouge"
    Couleurs(2) = "jaune"
    Couleurs(3) = "vert"
    Couleurs(4) = "cyan"
    Couleurs(5) = "bleu"
    Couleurs(6) = "magenta"
    Couleurs(7) = "blanc"
    
    ' on travaille avec la table Calques
    Set Calques = dbAcc.OpenRecordset("Calques", dbOpenDynaset)
    For Each objCalque In ThisDrawing.Layers
       Calques.AddNew
       ' Enregistrement du nom du calque
       Calques!NomCalque = objCalque.Name
       NumColor = objCalque.Color
       If NumColor < 8 Then
          ' remplace le numéro de couleur par son nom
          CoulCalc = Couleurs(NumColor)
          Else
          CoulCalc = Str(NumColor)
       End If
       ' Enregistrement de la couleur du calque
       Calques!Couleur = CoulCalc
       ' Enregistrement du type de ligne du calque
       Calques!TypeLigne = objCalque.Linetype
       ' si le calque est gelé
       If objCalque.Freeze = True Then
            Calques!Gelé = True
       End If
       If objCalque.Lock = True Then
            Calques!Verrouillé = True
       End If
       Calques.Update
    Next objCalque
    Calques.Close
    Set Calques = Nothing
End Sub



Procédure Private Sub ListTypLignes()

Private Sub ListTypLignes()
    ' Procédure d'élaboration de la liste des types de lignes
    Dim TypesLigne As Recordset
    Dim objElem As Object           ' objet collection type de lignes

    ' on travaille avec la table TypesLigne
    Set TypesLigne = dbAcc.OpenRecordset("TypesLigne", dbOpenDynaset)
    For Each objElem In ThisDrawing.Linetypes
       TypesLigne.AddNew
       ' Enregistrement du nom du type de ligne
       TypesLigne![Type de Ligne] = objElem.Name
       ' Enregistrement de la description
       TypesLigne![Description] = objElem.Description
       TypesLigne.Update
    Next objElem
    TypesLigne.Close
    Set TypesLigne = Nothing

End Sub



Procédure Private Sub ListStyleText()

Private Sub ListStyleText()
    ' Procédure d'élaboration de la liste des styles de texte
    Dim StylesTexte As Recordset
    Dim objElem As Object       ' objet collection style de texte
    
    Set StylesTexte = dbAcc.OpenRecordset("StylesTexte", dbOpenDynaset)
    For Each objElem In ThisDrawing.TextStyles
       StylesTexte.AddNew
       ' Enregistrement du nom du style de texte
       StylesTexte![Style de texte] = objElem.Name
       ' Enregistrement du nom du fichier
       StylesTexte![Nom de fichier] = objElem.fontfile
       ' Enregistrement de la hauteur
       StylesTexte!Hauteur = objElem.Height
       ' Enregistrement du facteur d'extension
       StylesTexte![Facteur Extension] = objElem.Width
       ' angle d'inclinaison en radians transformé en degrés
       StylesTexte!Inclinaison = objElem.ObliqueAngle * 57.295779513
       If objElem.TextGenerationFlag = 2 Or objElem.TextGenerationFlag = 6 Then
          StylesTexte!Reflété = True
       End If
       If objElem.TextGenerationFlag = 4 Or objElem.TextGenerationFlag = 6 Then
          StylesTexte!Renversé = True
       End If
       StylesTexte.Update
    Next objElem
    StylesTexte.Close
    Set StylesTexte = Nothing

End Sub



Procédure Private Sub cmdAnnuler_Click()

Private Sub cmdAnnuler_Click()
    Unload Me
End Sub



AutoLISP et menu de lancement

La procédure est exactement identique à Boutonnière. Il suffit de modifier les noms de fichier et de macro


Vous avez également à votre disposition le projet original Descript2.dvb ainsi que le modèle de base de données descript.mdb (version modifiée le 2/12/98).


-----

Descript3 : Pour apprendre à créer les tables ...


--


© 1998 - 2007 FASOFT - Roger Rosec Tous droits réservés. Reproduction strictement interdite sauf pour usage personnel
Google
 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------