Le Coin des AutoCADiens

Le site français des développeurs pour AutoCAD

Vous pourrez ici apprendre à programmer en Visual Basic pour AutoCAD.
VBA + loin en VBA

D'AutoCAD vers Access avec Création de tables


Dans le programme précédent, Descript2, on copie une base existante modèle et on remplit les tables ensuite.
L'exemple de ce chapître, Descript3, n'a nul besoin de base modèle, il crée lui-même la base de données, les tables et les différents champs qu'il complète ensuite.

DAO toujours


DA0 Pour accéder à Access on continuera à utiliser le moteur de base de données Microsoft Jet à l'aide de la bibliothèque DAO.

Pour commencer, vérifiez si la case Microsoft DAO 3.5 Object Library dans la boîte Références du menu Outils de VBA est bien cochée.

  • Au sommet de la hiérarchie DAO, l'objet DBEngine qui contrôle tous les objets sous sa descendance.
  • L'objet Database correspond à la base de données qui sera créée dans l'objet Workspace. à l'aide de la méthode CreateDatabase.
  • Pour créer les tables dans l'objet Database on dispose de la méthode CreateTableDef qui génère un objet TableDef dépourvu de tout champ.
  • L'objet TableDef possède la méthode CreateField qui permet d'ajouter des champs dans la table.
  • L'objet Field nécessite d'être attaché à l'objet TableDef. Pour cela, on utilise la méthode Append de la collection Fields de l'objet TableDef. A faire pour chaque champ.
  • On procède de la même manière pour créer un objet Index.
  • Pour terminer la création d'une table, il faut ajouter l'objet TableDef à la collection TableDefs à l'aide de la méthode Append.


  • Pour remplir les tables, on utilisera, comme avec Descript2, les objets Recordset à l'aide de la méthode OpenRecordset.

Le but de DESCRIPT3

Descript3

Le résultat que vous obtiendrez est quasiment identique à celui obtenu par Descript2.

Ce programme ouvrira automatiquement Access, créera la base, les tables, les différents champs et les index, 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.

Grâce à l'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.

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

Une petite forme (ter)

Form
Feuille exactement identique aux feuilles UserForm1 de Descript et Descript2.
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 @+ ?
Un pins pour la meilleur réponse !


Le code de Module1

Déclarations dans Module1
Quelques explications sur le code :
  • Dans Sub Descript3 on recherche le nom du dessin pour donner le même nom la base de donnée.
  • Si une base de ce nom existe déjà, elle sera effacée, sans mise en garde.
  • Set dbAcc = wrkDefault.CreateDatabase(FichAccess, dbLangGeneral, dbVersion30) crée la base de données.
    • FichAccess : Nom de la base, avec éventuellement le chemin
    • dbLangGeneral : variable concernant l'odre de tri - Toujours ça en français ou anglais. On peut y ajouter un mot de passe : dbLangGeneral & ";pwd=sesame"
    • dbVersion30 : version du format de données.

    Option Explicit
    'Initialisation des variables
    Public wrkDefault As Workspace      '
    Public dbAcc As Database            ' Variable objet de la base de données
    Public FichAccess As String         ' Nom du fichier avec le chemin

Public Sub Descript3()
    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"	' si le dessin n'a pas encore de nom
    End If
    
    ' Obtient l'objet Workspace par défaut.
    Set wrkDefault = DBEngine.Workspaces(0)
    ' Vérifie qu'aucun fichier ne porte le nom de la nouvelle base de données.
    If Dir(FichAccess) <> "" Then Kill FichAccess
    ' Crée une nouvelle base de données
    Set dbAcc = wrkDefault.CreateDatabase(FichAccess, dbLangGeneral, dbVersion30)
    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 :
  • Création puis enregistrement des tables choisies
  • Fermeture et déchargement de la base de données.
  • Procédure inchangée par rapport à Descript2 .

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()
  • Création de la table Blocs
  • Création des champs
  • Création de l'index
  • 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 TBlocs As TableDef
    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
    Dim idxNom As Index             ' index de la table
    ' Création de la table Blocs
    Set TBlocs = dbAcc.CreateTableDef("Blocs")
    ' Création des champs et ajout dans la collection fields
    With TBlocs
        .Fields.Append .CreateField("Nom du bloc", dbText, 50)
        .Fields.Append .CreateField("Calque", dbText, 20)
        .Fields.Append .CreateField("Echelle", dbSingle)
        .Fields.Append .CreateField("Coord en X", dbDouble)
        .Fields.Append .CreateField("Coord en Y", dbDouble)
        .Fields.Append .CreateField("Attribut1", dbText, 50)
        .Fields.Append .CreateField("Attribut2", dbText, 50)
        .Fields.Append .CreateField("Attribut3", dbText, 50)
        .Fields.Append .CreateField("Attribut4", dbText, 50)
        .Fields.Append .CreateField("Attribut5", dbText, 50)
        ' on ajoute un index pour avoir d'office un classement par ordre alphabétique
        Set idxNom = .CreateIndex("IndexNom")
        With idxNom
            .Fields.Append .CreateField("Nom du bloc")
        End With
        .Indexes.Append idxNom
    End With
    ' on ajoute le tout dans la collection TableDefs
    dbAcc.TableDefs.Append TBlocs
    ' Permission d'avoir un champ nul pour les attributs
    TBlocs("Attribut1").AllowZeroLength = True
    TBlocs("Attribut2").AllowZeroLength = True
    TBlocs("Attribut3").AllowZeroLength = True
    TBlocs("Attribut4").AllowZeroLength = True
    TBlocs("Attribut5").AllowZeroLength = True
    ' Fin de la partie création de la table 
    ' Ouverture du Recordset
    Set Blocs = dbAcc.OpenRecordset("Blocs")
    ' 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 (tablAttrib(Cpt1).TextString) <> "" Then
               ' 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 TdCalques As TableDef
    Dim Calques As Recordset
    Dim objCalque As AcadLayer    ' objet Calque
    Dim NumColor As Integer
    Dim CoulCalc As Variant
    Dim Couleurs(7) As String
    Dim idxNom As Index             ' index de la table

    Couleurs(1) = "rouge"
    Couleurs(2) = "jaune"
    Couleurs(3) = "vert"
    Couleurs(4) = "cyan"
    Couleurs(5) = "bleu"
    Couleurs(6) = "magenta"
    Couleurs(7) = "blanc"
    
     ' on crée la table Calque
    Set TdCalques = dbAcc.CreateTableDef("Calques")
    With TdCalques
        .Fields.Append .CreateField("NomCalque", dbText, 50)
        .Fields.Append .CreateField("Couleur", dbText, 10)
        .Fields.Append .CreateField("TypeLigne", dbText, 50)
        .Fields.Append .CreateField("Gelé", dbText, 10)
        .Fields.Append .CreateField("Verrouillé", dbText, 10)
        ' on ajoute un index pour avoir d'office un classement par ordre alphabétique
        Set idxNom = .CreateIndex("IndexNom")
        With idxNom
            .Fields.Append .CreateField("NomCalque")
        End With
        .Indexes.Append idxNom
     End With
    ' on ajoute dans la collection TableDefs
    dbAcc.TableDefs.Append TdCalques
    ' 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é = "Gelé"
       End If
       If objCalque.Lock = True Then
            Calques!Verrouillé = "Verrouillé"
       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 TdLignes As TableDef
    Dim TypesLigne As Recordset
    Dim objElem As Object           ' objet collection type de lignes
    Dim idxNom As Index             ' index de la table

    ' on crée la table TypesLigne
    Set TdLignes = dbAcc.CreateTableDef("TypesLigne")
    With TdLignes
        .Fields.Append .CreateField("Type de Ligne", dbText, 50)
        .Fields.Append .CreateField("Description", dbText, 255)
        ' on ajoute un index pour avoir d'office un classement par ordre alphabétique
        Set idxNom = .CreateIndex("IndexNom")
        With idxNom
            .Fields.Append .CreateField("Type de Ligne")
        End With
        .Indexes.Append idxNom
    End With
    ' on ajoute les champs dans la collection TableDefs
    dbAcc.TableDefs.Append TdLignes
    ' Permission d'avoir un champ nul
    TdLignes("Description").AllowZeroLength = True
    ' 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 TdStyles As TableDef
    Dim StylesTexte As Recordset
    Dim objElem As Object           ' objet collection style de texte
    Dim idxNom As Index             ' index de la table
    
    ' on crée la table StylesTexte
    Set TdStyles = dbAcc.CreateTableDef("StylesTexte")
    
    With TdStyles
        .Fields.Append .CreateField("Style de texte", dbText, 50)
        .Fields.Append .CreateField("Nom de fichier", dbText, 50)
        .Fields.Append .CreateField("Hauteur", dbDouble)
        .Fields.Append .CreateField("Facteur Extension", dbDouble)
        .Fields.Append .CreateField("Inclinaison", dbSingle)
        .Fields.Append .CreateField("Reflété", dbText, 10)
        .Fields.Append .CreateField("Renversé", dbText, 10)
        Set idxNom = .CreateIndex("IndexNom")
        With idxNom
            .Fields.Append .CreateField("Style de texte")
        End With
        .Indexes.Append idxNom
    End With
    ' on ajoute dans la table
    dbAcc.TableDefs.Append TdStyles
    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é = "Reflété"
       End If
       If objElem.TextGenerationFlag = 4 Or objElem.TextGenerationFlag = 6 Then
          StylesTexte!Renversé = "Renversé"
       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 Descript3.dvb.


-----

NoteCAD : Utiliser des fonctions API ...


--

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

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