jms Posté(e) le 4 décembre Posté(e) le 4 décembre 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 Citer
didier Posté(e) le 4 décembre Posté(e) le 4 décembre 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. Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
jms Posté(e) le 4 décembre Auteur Posté(e) le 4 décembre 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. 1 Citer
didier Posté(e) le 4 décembre Posté(e) le 4 décembre 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 Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
jms Posté(e) le 4 décembre Auteur Posté(e) le 4 décembre 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. Citer
didier Posté(e) le 4 décembre Posté(e) le 4 décembre 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 Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
jms Posté(e) le 4 décembre Auteur Posté(e) le 4 décembre 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 Citer
didier Posté(e) le 4 décembre Posté(e) le 4 décembre Bonjour @jms OK, merci, je vais regarder ça. Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 5 décembre Posté(e) le 5 décembre 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 1 Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
jms Posté(e) le 5 décembre Auteur Posté(e) le 5 décembre 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 Citer
didier Posté(e) le 5 décembre Posté(e) le 5 décembre 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 Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
jms Posté(e) le 5 décembre Auteur Posté(e) le 5 décembre 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 Citer
Messages recommandés