Aller au contenu

Macro VBA, dans Access, pour exportation de propriétés de bloc (via ChatGPT...)


Messages recommandés

Posté(e)

Salut,

J'ai énormément à apprendre, en VBA, et je passe par ChatGPT, pour développer une macro à titre d'exercice.

Le but est d'importer dans deux tables d'une DB Access, entre autres propriétés, les coordonnées des sommets de toutes les polylignes d'un DWG ainsi que les coordonnées des points d'insertion de tous les blocs de ce DWG.

Pour les polylignes, j'ai fini par trouver l'erreur de ChatGPT, qui devait juste remplacer les virgules par des points, avant d'importer dans la table, et ça marche.

Pour les blocs, par contre, il tourne en rond pour en extraire les coordonnées. La macro m'en affiche bien la liste complète mais avec des coordonnées X,Y à 0,0 pour chaque bloc.

 

Si quelqu'un voit la faille, voici la macro :

 

 

Sub ExportVerticesAndPoints()
    Dim acadApp As Object
    Dim acadDoc As Object
    Dim entity As Object
    Dim polyline As Object
    Dim vertices As Variant
    Dim i As Integer
    Dim dbPath As String
    Dim accessConn As Object
    Dim sql As String
    Dim dwgFile As String
    Dim eHandle As String
    Dim order As Integer ' Numéro d'ordre des sommets

    ' Chemin vers la base de données Access
    dbPath = "C:\JMS\Formations\Chat-GPT\Création de hachures et polylignes\Infer.accdb"

    ' Se connecter à AutoCAD déjà ouvert
    On Error Resume Next
    Set acadApp = GetObject(, "AutoCAD.Application")
    If acadApp Is Nothing Then
        MsgBox "AutoCAD n'est pas ouvert. Veuillez ouvrir AutoCAD et réessayer.", vbCritical
        Exit Sub
    End If
    On Error GoTo 0

    ' Récupérer le document actif dans AutoCAD
    If acadApp.Documents.Count = 0 Then
        MsgBox "Aucun document ouvert dans AutoCAD. Veuillez ouvrir un fichier DWG.", vbCritical
        Exit Sub
    End If
    Set acadDoc = acadApp.ActiveDocument

    ' Obtenir le nom du fichier DWG
    dwgFile = acadDoc.FullName

    ' Créer une connexion à Access
    Set accessConn = CreateObject("ADODB.Connection")
    accessConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & ";Mode=Share Deny None;"

    ' Vider les tables Sommets et Points avant d'insérer de nouvelles données
    Dim deleteSQL As String
    deleteSQL = "DELETE FROM Sommets"
    accessConn.Execute deleteSQL
    Debug.Print "Table Sommets vidée."

    deleteSQL = "DELETE FROM Points"
    accessConn.Execute deleteSQL
    Debug.Print "Table Points vidée."

    ' Parcourir toutes les entités dans le modèle
    For Each entity In acadDoc.ModelSpace
        If entity.ObjectName = "AcDbPolyline" Then
    ' Gestion des polylignes
    Set polyline = entity
    eHandle = polyline.Handle

    ' Essayer d'obtenir les coordonnées
    On Error Resume Next
    vertices = polyline.coordinates
    If Err.Number <> 0 Then
        MsgBox "Impossible de récupérer les coordonnées pour le Handle : " & eHandle
        Err.Clear
        On Error GoTo 0
        GoTo NextEntity
    End If
    On Error GoTo 0

    ' Parcourir les sommets si des coordonnées existent
    If Not IsEmpty(vertices) Then
        order = 1 ' Initialiser le numéro d'ordre pour chaque polyligne
        For i = LBound(vertices) To UBound(vertices) Step 2
            If IsNumeric(vertices(i)) And IsNumeric(vertices(i + 1)) Then
                ' Formater les valeurs X et Y pour SQL avec un point décimal
                Dim xValue As String, yValue As String
                xValue = Replace(CStr(vertices(i)), ",", ".")
                yValue = Replace(CStr(vertices(i + 1)), ",", ".")

                ' Insérer dans la table Sommets
                sql = "INSERT INTO Sommets (X, Y, FichierDWG, eHandle, Ordre) VALUES (" & _
                      xValue & ", " & yValue & ", '" & Replace(dwgFile, "'", "''") & "', '" & Replace(eHandle, "'", "''") & "', " & order & ")"
                Debug.Print sql ' Affiche la requête SQL
                accessConn.Execute sql

                ' Incrémenter le numéro d'ordre
                order = order + 1
            Else
                Debug.Print "Coordonnées invalides : X=" & vertices(i) & ", Y=" & vertices(i + 1)
            End If
NextVertex:
        Next i
    Else
        MsgBox "Aucun sommet trouvé pour le Handle : " & eHandle
    End If


        ElseIf entity.ObjectName = "AcDbBlockReference" Then
    ' Gestion des blocs
    Dim blockX As Double, blockY As Double
    Dim layer As String
    Dim blockHandle As String

    ' Essayer de récupérer les coordonnées d'insertion
    On Error Resume Next
    If Not IsEmpty(entity.InsertionPoint) Then
        ' Extraire les coordonnées du point d'insertion
        blockX = entity.InsertionPoint(0)
        blockY = entity.InsertionPoint(1)
        Debug.Print "Bloc trouvé - Coordonnées X: " & blockX & ", Y: " & blockY
    Else
        ' Si les coordonnées sont introuvables
        Debug.Print "Impossible de récupérer les coordonnées du bloc : " & entity.Handle
        blockX = 0
        blockY = 0
    End If
    On Error GoTo 0

    ' Vérification des autres propriétés
    layer = entity.layer
    blockHandle = entity.Handle

    ' Convertir les coordonnées pour qu'elles utilisent une virgule décimale
    Dim formattedX As String, formattedY As String
    formattedX = Replace(CStr(blockX), ".", ",")
    formattedY = Replace(CStr(blockY), ".", ",")

    ' Insérer dans la table Points
    sql = "INSERT INTO Points (ehandle_pt, X, Y, layer, ehandle_pline) VALUES ('" & Replace(blockHandle, "'", "''") & "', " & _
          formattedX & ", " & formattedY & ", '" & Replace(layer, "'", "''") & "', NULL)"
    Debug.Print sql ' Affiche la requête SQL
    accessConn.Execute sql
End If

NextEntity:
    Next entity

    ' Fermer la connexion Access
    accessConn.Close

    ' Libérer les objets
    Set accessConn = Nothing
    Set acadDoc = Nothing
    Set acadApp = Nothing

    MsgBox "Exportation des polylignes et des blocs terminée.", vbInformation
End Sub


 

Posté(e)

Bonjour @jms

Plusieurs choses :

J'ai énormément à apprendre, en VBA, et je passe par ChatGPT Il est clair que pour apprendre ChatGPT (ou autre) est une vraie fausse bonne idée.

J'ai fini par trouver l'erreur de ChatGPT  la preuve !
Et si vous ne l'aviez pas trouvée, vous vous seriez sérieusement agacé, alors qu'en programmant "à la main"
mais surtout avec votre propre intelligence pas artificielle du tout, vous n'auriez JAMAIS fait cette erreur.

Passons à la réponse :

Est-ce une réelle obligation de passer directement du DWG dans Access ?
Access acceptant aisément un format csv, voire xls il est très facile de faire ça en quelques lignes robustes.

Et aussi est-ce une obligation de passer par VBA ?

Merci de répondre à ces questions avant de s'attaquer au code

Amicalement

PS: sur mon site, je ne parle pas que de LSP, je donne aussi des méthodes pour débuter en VBA.
J'espérais ne pas avoir écrit tout ça pour rien.

Posté(e)

Bonjour Didier,

Je comprends fort bien ce retour, et je peux confirmer que l'apprentissage via ChatGPT n'est sans doute pas la meilleure solution. Depuis une semaine que je "dialogue" avec cette I.A., j'ai eu plusieurs fois l'occasion de la corriger. Par exemple en lui notant qu'une fonction proposée dans une macro n'existe tout simplement pas ("Vous avez raison, cette fonction n'existe pas. Nous allons essayer une autre méthode..."). Mais c'est peut-être aussi ces imperfections qui peuvent être prises positivement, dans la mesure où je dois rester vigilant et donc, apprendre à comprendre chaque ligne de code.
Quant à Access, je voudrais passer par cette interface, comme point de départ, car elle sera suceptible d'être utilisée par d'autres personnes, qui ne travaillent pas nécessairement sur Autocad. Et aussi parce qu'elle inclut des tables liées à une DB SQL Server qui alimente Archibus. 

 

  • Like 1
Posté(e)

Bonjour @jms

Arguments critiquables, mais après tout ce n'est pas l'objet de ce site.

Je reviens à la question et je lis : car elle sera susceptible d'être utilisée par d'autres personnes qui ne travaillent pas nécessairement sur Autocad

Qu'est-ce que ça signifie ? Est-ce qu'il faut lire ces données dans un DWG fermé ?
Si les gens n'ont pas AutoCAD comment extraire les données ?
Si c'est vous qui extrayez ces données pour eux, on s'en moque du langage de prog.

Le souci, c'est que je n'ai pas Access, quelle alternative puis-je utiliser pour vous avancer dans votre code ?

Merci de clarifier

Posté(e)

Il y a plusieurs collaborateurs, autour de moi, qui disposent d'une licence Autocad, mais ne l'utilisent que pour de simples consultations (TrieView serait tout aussi efficace !)

Je cherche juste à centraliser un maximum d'outils dans une interface commune. 

Posté(e)

Bonjour @jms

Désolé, mais les questions restent sans réponse, que puis-je faire de plus ?

Écrire un VBA un LSP qui extrait les coordonnées des polylignes et des blocs dans un fichier texte ?
Je n'ai pas compris qu'il y avait des valeurs d'attributs à extraire.
Le tout depuis un fichier AutoCAD ouvert.

Est-ce plus clair ainsi ?

Si oui, merci de faire passer un fichier DWG avec des exemples de blocs et de polylignes.

Amicalement

Posté(e)

On pourrait essayer un LSP (j'arriverai à le lancer depuis Access).

Voici un exemple quelconque de DWG, qui ne correspond à rien, dans mes activités, mais qui suffit pour le test.

Les deux fichiers Xlsx contiennent ce que la macro me produit actuellement dans Access. La table sommets produit correctement les coordonnées des sommets des polylignes. La table Points me liste bien les blocs mais il manque les coordonnées, qui restent à 0,0.
Drawing1.dwgPoints.xlsxSommets.xlsx

Posté(e)

Bonjour @jms

Voici la première version de ma façon de voir les choses.

La sélection est globale, c'est-à-dire toutes les polylignes du dessin, même si elles ont dans un calque inactif ou gelé.
Idem pour les blocs. Il va peut-être falloir prévoir des filtres, mais j'attends vos indications.
Création des deux fichiers texte avec l'extension CSV, ils sont donc ouvrables dans Excel aisément.
Ces fichiers s'écrivent dans le dossier du dessin en cours.

Le nom de la commande est jms01.

Dans l'attente de vos commentaires.
Je n'ai pas tenu compte de la colonne ehandle_pline dans le fichier des blocs, car je n'ai aucune idée de quoi il est question.

Dois-je prévoir de faire la même chose en VBA ?

Amicalement

 

 

 

jms-01.lsp

  • Like 1
Posté(e)

Merci Didier !

Je viens de tester et me suis permis une adaptation indispensable dans mon environnement, du moins si je veux l'ouvrir dans Excel. Pour les coordonnées des blocs, j'ai remplacé les points par des virgules (bon...j'ai un peu ChatGPTé pour trouver la bonne syntaxe !).

Je vais prendre le temps de lire chaque ligne pour en apprendre davantage, vu que je sais encore très peu de chose sur la syntaxe en Autolisp. Rien que définir sans faute mon jeu de sélection : je ne connais pas les signification des codes numériques dans l'expression (cons ... J'imagine (cons 0 ... indique le type d'objet ; con 1... je ne sais pas ; cons 2 visiblement le nom du bloc (mais si le type d'objet n'est pas un bloc, quid cons 2 ?) etc... On dirait que je viens enfin de mettre un doigt dans l'engrenage LSP, continent vierge où j'ai tout à découvrir !

Je n'ai pas encore trouvé de lexique complet et j'ai malheureusement peu de temps à y consacrer. Comme on disait quand je travaillais en atelier d'architecture, je suis "en charrette", ces temps-ci 😉

Pour l'équivalent en VBA, ce n'est pas nécessaire; j'ai pu faire un module dans Access qui lance le LSP.

jms-02.lsp

Posté(e)

Bonjour @jms

Pour les coordonnées des blocs, j'ai remplacé les points par des virgules
Je me demande bien pourquoi ! à moins que le séparateur décimal soit mal configuré sur votre machine, c'est une hérésie qui risque d'engendrer bien des erreurs !

Arrêtez d'aller interroger ChatGPT, apprenez, le reste, c'est du temps perdu.

Je n'ai pas encore trouvé de lexique complet
Et ma signature, elle est là pour faire joli ? Je me suis décarcassé pour aider les apprenants.
Enfin ceux qui veulent apprendre, les autres, je les laisse se faire éblouir par le marketing de ChatGPT.

J'ai malheureusement peu de temps à y consacrer.
Tout le temps que vous passez à apprendre n'est jamais perdu.

Je suis "en charrette", ces temps-ci
Il est urgent de s'arrêter pour avancer plus vite après, Rien n'est jamais bien fait en charrette.

À votre disposition si questions.
Amicalement

Posté(e)
Il y a 3 heures, didier a dit :

Bonjour @jms

Pour les coordonnées des blocs, j'ai remplacé les points par des virgules
Je me demande bien pourquoi ! à moins que le séparateur décimal soit mal configuré sur votre machine, c'est une hérésie qui risque d'engendrer bien des erreurs !

Arrêtez d'aller interroger ChatGPT, apprenez, le reste, c'est du temps perdu.

Je n'ai encore jamais pesé le pour et le contre, pour la question du séparateur.

Pour ChatGPT, vous pensez vraiment que je l'approche comme un idiot sans discernement qui a découvert les saintes écritures ? J'ai vu ,sinon ses limites, ses nombreuses erreurs et reste vigilant mais pas aveuglément réfractaire. Après tout, je suis passé un jour de ma planche à dessin à Autocad 2.5 et, si je savais remplir un réservoir de Rotring, voire même déboucher une plume 0,13, je suis toujours incapable de réparer un microprocesseur.

 

Je n'ai pas encore trouvé de lexique complet
Et ma signature, elle est là pour faire joli ? Je me suis décarcassé pour aider les apprenants.
Enfin ceux qui veulent apprendre, les autres, je les laisse se faire éblouir par le marketing de ChatGPT.

Fameux site, je commence à le parcourir (et y reviendrai souvent). Merci pour le lien, ça ressemble à ce que j'attendais.

 

J'ai malheureusement peu de temps à y consacrer.
Tout le temps que vous passez à apprendre n'est jamais perdu.

Entièrement d'accord avec vous, mais je n'envoie pas sur les roses un client qui me demande un résultat immédiat en prétextant que, s'il veut bien attendre quelques jours, je serai autrement mieux formé pour lui répondre. Si je peux l'aider avec mes connaissances actuelles, je le fais de suite; je décide juste de mes priorités.

 

Je suis "en charrette", ces temps-ci
Il est urgent de s'arrêter pour avancer plus vite après, Rien n'est jamais bien fait en charrette.

Ce n'est pas de ces charrettes, dont je parlais. Quelles que soient nos compétences et leur niveau, si on sacrifie presque tout, l'espace du temps qui nous est imparti pour les exploiter au profit d'un projet, il y a des chances qu'il soit très bien fait. On ne gagne pas des prix d'architecture en déposant son Rotring parce qu'il est 20h00 et qu'il temps de rentrer à la maison. Ces charrettes me ramènent à mes débuts en 1988 et les outils ont bien changé, mais la règle pour tenter d'approcher la qualité reste inchangée et exige des sacrifices. 

Merci pour ces échanges.

 

Il y a 3 heures, didier a dit :

 

À votre disposition si questions.
Amicalement

 

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité