-
Compteur de contenus
2 523 -
Inscription
-
Dernière visite
-
Jours gagnés
23
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Fraid
-
Une machine peut-elle avoir une conscience?
Fraid a répondu à un(e) sujet de Patrick Emin dans Pause café
Bonjour, Et si on demandais l'avis d'une IA. l’intelligence artificielle est-elle intelligente? Copilot L’intelligence artificielle (IA) est considérée comme “intelligente” dans le sens où elle peut apprendre, raisonner, percevoir, prédire, et résoudre des problèmes. Cependant, il est important de noter que l’IA n’est pas intelligente de la même manière qu’un être humain. L’IA n’a pas de conscience, d’émotions, ni la capacité de comprendre le contexte de la même manière que les humains. Elle fonctionne sur la base des données qu’elle a été formée à analyser et des algorithmes qui guident son apprentissage et sa prise de décision. Donc, bien que l’IA puisse sembler “intelligente”, elle est en réalité un outil créé et guidé par l’intelligence humaine. -
Texte avec Champ sans Visual Lisp
Fraid a répondu à un(e) sujet de David06 dans Pour aller plus loin en LISP
Bonjour, Je ne vois pas ce que veulent dire tes trois petit points. ...est plus performant? Si tu achète un PC au même prix qu'un Mac, tu auras autant sinon plus de performance. ...est plus sécurisé? Non, maintenant il y a des virus pour tout le monde. ...c'est de la frime? Tout à fait d'accord. -
supprimer les champs dynamique dans les attributs
Fraid a répondu à un(e) sujet de kitto dans AutoCAD 2020-2024
Bonjour, J'ai rajouté, le chargement des fonctions VLA/Activex. (vl-load-com) si cdd ne fonctionne toujours pas, donne moi un exemple de bloc, car avec les bloc dynamique que j'ai sous la main, cela fonctionne. Pour la deuxième routine, c'est f2t qu'il faut taper dans Autocad. C'est indiqué en clair dans le code. -
supprimer les champs dynamique dans les attributs
Fraid a répondu à un(e) sujet de kitto dans AutoCAD 2020-2024
Bonjour, Pour supprimer les dynamismes (à faire en premier) ; Chargement des fonctions VLA/Activex. (vl-load-com) ;;;Supprime le dynamisme des blocs (defun c:ddn (/ nom) (vlax-for blk (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for obj blk (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference")(= (vla-get-IsDynamicBlock obj) :vlax-true)) (progn (setq nom (strcat(vla-get-effectivename obj)"_ND")) (vla-ConvertToAnonymousBlock obj) (vla-converttostaticblock obj nom) ) ) ) ) (princ) ) Pour supprimer les champs ;;;field2txt Conversion des champs en textes ;;;Supprime les champs et les remplace par leurs valeurs ;;;acdc, (vla-get-activedocument (vlax-get-acad-object)) ou ObjectDBX ;;;tapper f2t pour traiter le dessin courant ou f2tindir pour traiter un dossier ;;;Converti les Textes, Mtextes, repères, repères multiples, cotations, Attributs et tableaux ;;;dans chaques présentations et les blocks (defun field2txt ( acdc / delfield getconstantatt) (defun delfield (ob / objname objlay lays dic ind atts lconst ctc ctr lver) (setq objname (vla-get-objectname ob) objlay (vla-get-layer ob) lays (vla-get-layers acdc) ) (and (= (vla-get-freeze (vla-item lays objlay)) :vlax-false) (= (vla-get-lock (vla-item lays objlay)) :vlax-false) ;(not (member objlay '("0" "EXCLU")));option d'exclusion de calques (progn (and (wcmatch objname "*Text,AcDbMLeader");Texte, Mtextes, repères et repères multiples (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD")) (setq ind (vla-get-textstring ob)) (progn (vla-put-textstring ob " ") (vla-put-textstring ob ind) ) ) (and (wcmatch objname "*Dimension");Cotations (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD")) (setq ind (vla-get-textoverride ob)) (progn (vla-put-textoverride ob " ") (vla-put-textoverride ob ind) ) ) (and (eq objname "AcDbBlockReference");Attributs (setq atts (vlax-invoke ob 'GetAttributes) lconst (getconstantatt ob)) (foreach att atts (and (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary att) "ACAD_FIELD")) (not (member (vla-get-TagString att) lconst)) (setq ind (vla-get-textstring att)) (progn (vla-put-textstring att " ") (vla-put-textstring att ind) ) ) ) ) (and (eq objname "AcDbTable");Tableaux (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD")) (setq ctr 0 ctc 0 ) (while (< ctr (vla-get-rows ob)) (while (< ctc (vla-get-columns ob)) (and (/= (vla-GetCellState ob ctr ctc) 1) (/= (vla-GetCellState ob ctr ctc) 17) (setq ind (vlax-invoke ob 'getcellvalue ctr ctc)) (progn (vlax-invoke ob 'setcellvalue ctr ctc " ") (vlax-invoke ob 'setcellvalue ctr ctc ind) ) ) (setq ctc (1+ ctc)) ) (setq ctc 0 ctr (1+ ctr)) ) ) ) ) );fin delfield ;;;getconstantatt ;;;bl, vla objet (block) ;;;Retourne la liste des étiquettes des attributs constants (defun getconstantatt ( bl / lc) (setq lc '()) (vlax-for bls (vla-get-blocks acdc) (if (eq (vlax-get bls 'Name)(vlax-get bl 'Name)) (vlax-for obj bls (and (= (vla-get-ObjectName obj) "AcDbAttributeDefinition") (= (vla-get-Constant obj) :vlax-true) (setq lc (cons (vla-get-TagString obj) lc)) ) ) ) ) lc ) ;Définitions de blocks (vlax-for bl (vla-get-blocks acdc) (and (= (vla-get-islayout bl) :vlax-false) (= (vla-get-IsXRef bl) :vlax-false) (= (vla-get-IsDynamicBlock bl) :vlax-false) (not (wcmatch (vla-get-name bl) "`*T*")) (vlax-for obj bl (delfield obj) ) ) ) ;Chaque présentations (vlax-for layout (vlax-get-property acdc 'layouts) (vlax-for obj (vlax-get-property layout 'block) (delfield obj) ) ) (princ) );fin field2txt ;Commande pour dessin courant (defun c:f2t (/ ac) (field2txt (setq ac (vla-get-activedocument (vlax-get-acad-object)))) (vla-Regen ac acAllViewports)(princ)) ;Commande pour dossier (non récursif) (defun c:f2tindir ( / dir lf axdbdoc) (and (setq dir (getdir)) (setq lf (vl-directory-files dir "*.dwg" 1)) (foreach f lf (if (setq axdbdoc (getaxdbdoc (strcat dir f))) (field2txt axdbdoc) ) (vla-saveas axdbdoc (strcat dir f)) (vlax-release-object axdbdoc) ) ) (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun getdir( / shell rep) (setq shell (vlax-create-object "Shell.Application") rep (vlax-invoke shell 'browseforfolder 0 "Sélectionnez le dossier" 512 "") ) (vlax-release-object shell) (strcat (vlax-get-property (vlax-get-property rep 'self) 'path) "\\") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun getaxdbdoc (filename / axdbdoc release) (setq axdbdoc (vlax-create-object (if (< (setq release (atoi (getvar "ACADVER"))) 16) "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) ) (if (vl-catch-all-apply 'vla-open (list axdbdoc filename)) (not (vlax-release-object axdbdoc)) axdbdoc ) ) -
Mettre des texte dans un tableau
Fraid a répondu à un(e) sujet de benoitlacroix dans LISP et Visual LISP
Bonjour, Il y a peux être un moyen avec la position des textes d'écrire quelque chose. Par contre avec une copie du tableau explosé cela seras plus facile. -
Bonjour, Je suis désolé, mais en ce qui me concerne, c'est ce que veux le client, en premier, et ce n'est pas dans ta liste, ensuite le domaine d'activité, (c'est un peux la même chose.) le reste est pour moi du blabla sans intérêt, du remplissage de case.
-
Bonjour, Redémarre ton pc, si ça continu, c'est peut être le dessin qui à un problème voir ce lien
-
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Quelques modules - Ezdxf Pour Créer, modifier ou convertir des fichier DXF. Bien documenté et riche en possibilité. S'installe avec pip3 install ezdxf[all] pour profiter des Add-on. (pip3 est utilisé notamment pour les modules contenant des extensions C facultatives de PyPI) - Geopandas + Fiona Ce n'est pas une suite de Shrek, mais des modules qui vous permettent d'accéder aux données géospatiales. Exemple avec des GeoJSON : import geopandas from geopandas import GeoDataFrame import fiona def geoJSONToDxf(lgeo): for geo in lgeo: rgeo = geopandas.read_file(geo) rgeo.geometry.to_file(geo.lower().replace('.geojson','.dxf'), driver="DXF") Les modules ne semble pas être tous utilisés. Mais doivent bien être importés, je n'ai pas tout compris non plus. - Laspy Qui vous permet de lire, créer, modifier des nuages de points aux formats LAS, LAZ et LAZRS. S'installe avec pip install laspy[lazrs,laszip] Selon votre activité, il existe forcement des modules qui vous concernent. Lisez la doc avant d'installer un module, surtout l'installation. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Un mot sur les Class Certain doivent se demander pourquoi, dans mes exemples je n'ai pas créé de class. Si vous avez commencé à chercher des exemples Python vous avez certainement remarqué qu'il y a 2 principales écoles. Ceux qui travaillent avec des class et ceux avec des fonctions. C'est juste une question d'habitude, ceux qui viennent du c++ préférerons les class, de l'Autolisp, les fonctions. Ensuite, comme dit plus haut, tout est class, de ce fait, vous ne gagnez pas en performance en créant une classe à la place d'un dictionnaire. Personnellement, je réserve les class aux objets complexes (comportant des méthodes bien spécifiques et/ou de nombreuse propriétés intriquées). Mais attention, on arrive vite à construire des usines à gaz. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
ActiveX -> Python Gile m'a devancé pour le code python. Pour "traduire" les méthode ActiveX, c'est assez simple. Pour la méthode PurgeAll : Il suffit d'aller sur la page de l'aide du développeur ActiveX and VBA / ActiveX: Reference Guide / Methods / P / PurgeAll Vous avez un exemple de code VBA et Visual lisp. Le VBA: ThisDrawing.PurgeAll Python : doc.PurgeAll() Les majuscules sont importantes en Python. Allons voir les méthodes applicables à une Polyligne. ActiveX and VBA / ActiveX: Reference Guide / Objets / L / LWPolyline Object (ActiveX) (Attention, l'objet Polyline est la version obsolete qu'on peut encore trouver dans des vieux DXF R12 par exemple.) Les méthodes sont dans le bas de la page ainsi que les propriétés. Ce n'est pas exhaustif, il manque des méthodes comme Add(), et des propriétés comme Color. Cette aide n'est pas parfaite, il faut chercher, rien est tout cuit en programmation. De plus, après quelque tests, nous observons que certaines Méthodes ne fonctionnent pas en Python. C'est la que SendCommand nous rend service. Malheureusement, je n'en est pas fait de liste, à votre tours d'explorer. Des exemples sont sur le Github de Pyautocad. Je ne vous conseil pas de créer des programmes qui reste trop longtemps "connecté" à Autocad. Le lien Python / Autocad peut se rompre à tout moment sans prévenir. Quand j'ai beaucoup d'objets à créer, je crée un bloc dans Python qui se rempli d'objet à la place d'Autocad, et à la fin je l'envois et le décompose. Et je tient à revenir sur un détail Python, sans vouloir vous embrouiller : il n'y a pas de variables en Python, que des Objets. Démonstration simple. a = "Texte" print(type(a)) -> <class 'str'> Nous voyons bien, ici, que a est une classe, qui est un objet en Python. Vous me direz, et alors. a = ["Texte1", "Texte2"] b = a.append("Texte3") print(a) -> ['Texte1', 'Texte2', 'Texte3'] print(b) -> None a = ["Texte1", "Texte2"] b = a b.append("Texte3") print(a) -> ['Texte1', 'Texte2', 'Texte3'] print(b) -> ['Texte1', 'Texte2', 'Texte3'] a = ["Texte1", "Texte2"] b = a.copy() b.append("Texte3") print(a) -> ['Texte1', 'Texte2'] print(b) -> ['Texte1', 'Texte2', 'Texte3'] à bientôt -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Tout a fait, c'était juste pour montrer les possibilités hors ActiveX, je vais y venir. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Pyautocad Module qui existe depuis une dizaine d'année, qui permet d'agir dans Autocad, en utilisant l'interface ActiveX. Vous avez donc toute la documentation disponible dans l'aide du développeur. La base : # Du module on importe l'objet Autocad et APoint from pyautocad import Autocad, APoint # Instanciation de l'objet Autocad accad = Autocad() # ou accad = Autocad(create_if_not_exists=True) si on veut ouvrir Autocad le cas écheant. # le document actif doc = accad.ActiveDocument # l'application app = accad.Application # l'espace objet ms = doc.model Je rappelle qu'il n'y a rien à faire dans Autocad, il se laisse faire, aucune sécurité mise en place pour Python. A partir de là, tout le panel ActiveX est disponible, mais pas que. grace à la méthode SendCommand, tout Autolisp / Visual Lisp et toutes les commandes Autocad. Pour exécuter le code Python hors de l'EDI, il faudra double cliquer dessus. Et pour éviter que la console Python s'ouvre, enregistrer votre fichier avec l'extension pyw. Pour faire des tests, restez dans l'EDI. Exemple SendCommand comme en script : doc.SendCommand('-purger\ntout\n*\nn\n_qsave\n') ou pour lancer un script doc.SendCommand('_script\n"c:/mon_fichier.scr"\n') ou en autolisp doc.SendCommand('(command "-purger" "tout" "*" "n")\n(command "_qsave")\n') ou en Visual Lisp doc.SendCommand('(vl-load-com)\n(setq doc (vla-get-activedocument (vlax-get-acad-object)))(vla-purgeall doc)(vla-save doc)(setq doc nil)\n') Je pense que vous commencez à comprendre que c'est no limite. A bientôt, je revient en vous montrant la traduction ActiveX -> Python. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Bonjour, Non, pas du tout. On peut aussi les transmettre avec un .bat écrit par Autolisp comme ceci. python mon_fichier.py arg1 arg2 ... Ecrire un csv qui seras lu au démarrage du py. Le presse papier est le plus rapide (pas le plus sur, car peut refuser de fonctionner pour des raison obscure). Pour le retour, Python peut écrire du lisp qui seras lu par un (load) par exemple. Comme on est dans le cas ou c'est un lisp qui lance le py, Python ne peut pas accéder à Autocad tant que le lisp tourne. Par contre, si nous utilisons Pyautocad, nous pouvons interpoler avec les variables sans soucis et effectivement créer tout les objets Autocad que l'on veut.. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Bonjour, Le module Requests Abordé sur un autre post pour récupérer le temps internet, c'est un module de récupération de données à partir d’API web. Testons une API gouvernementale, documentée ici qui est un "Nominatim" FR. Ici, c'est le reverse qui va nous intéresser, car nous allons récupérer des infos en cliquant un point dans Autocad dans un plan géoréférencé . Créons un fichiers nominreverse.py, toujours dans le dossier transform. import pyperclip import requests def nominreverse(coord, key): rep = requests.get(f'https://api-adresse.data.gouv.fr/reverse/?lon={coord[0]}&lat={coord[1]}') dic = dict(rep.json()) ret = dic['features'][0]['properties'][key] pyperclip.copy(f'{ret}') if __name__ == "__main__": p = pyperclip.paste().split(' ') nominreverse((p[0], p[1]), p[2]) Le fichier nominreverse.lsp (defun nominreverse ( typ msg / pt ) (setq pt (getwsg (getpoint "\n Cliquez un point") (getvar 'cgeocs))) (trans-SetClip (strcat (car pt) " " (cadr pt) " " typ)) (trans-runscr (findfile "nominreverse.py")) (princ (strcat "\n " msg ": " (trans-GetClip))) ) (defun c:getinsse nil (nominreverse "citycode" "Numéro INSEE") (princ)) (defun c:getcom nil (nominreverse "city" "Commune") (princ)) (defun c:getadres nil (nominreverse "label" "Adresse") (princ)) (defun c:getregion nil (nominreverse "context" "Département et Région") (princ)) Chargez le .lsp dans Autocad, puis taper les commandes ci-dessus. Encore la, les possibilités sont immenses faces au nombre d'API Web qu'il y a. Par contre, ne compter pas faire tourner cela dans des boucles intensives sans devoir vous adapter au erreurs. Vous serez limité à un nombre d'appels par seconde pour cette API, d'autre un nombre d'appel par jour et aplli. ou le nombre d'appel consécutif régulier. Il y a toujours des parades, il faut s'adapter à chaque serveur, et pour finir, certaine API propose des solutions alternatives pour cette situation. à bientôt -
Une fonction Autolisp qui lance un petit Python Le Python à enregistrer à coté du .lsp gettime.py: import pyperclip import requests def gettime(): reponse = requests.get("http://just-the-time.appspot.com/") pyperclip.copy(reponse.text) if __name__ == "__main__": gettime() L'Autolisp (defun gettime nil (trans-runscr (findfile "gettime.py")) (trans-GetClip) ) cela renvois 2024-02-21 17:02:45 , il faut ajouter 1 heures. Encore un exemple de simplicité ultime. il manque les fonctions ; trans-GetClip, Récupère le contenu du Presse-papier ; Retour: str ou nil (defun trans-GetClip( / htm res) (setq res (vlax-invoke (vlax-get (vlax-get (setq htm (vlax-create-object "htmlfile")) 'ParentWindow ) 'ClipBoardData ) 'GetData "Text" ) ) (vlax-release-object htm) res ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; trans-SetClip, Copie un texte dans le Presse-papier. ; Arg: str ; Retour: str (defun trans-SetClip (text / htm) (vlax-invoke (vlax-get (vlax-get (setq htm (vlax-create-object "htmlfile")) 'ParentWindow ) 'ClipBoardData ) 'SetData "Text" text ) (vlax-release-object htm) text ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; trans-runscr, Exécute un script. ; Arg: str, nom du fichier ou chemin complet. ; Retour: T, si réussi sinon nil. (defun trans-runscr (file / obj ret) (setq ret T) (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke-method (list (setq obj (vlax-get-or-create-object "WScript.Shell")) "Run" file 0 :vlax-true ) ) ) (setq ret nil) (vlax-release-object obj) ) ret )
-
Bonjour, Effectivement, j'y avais pensé en premier, mais c'est hors sujet car il veut du Lisp. En fin de compte j'ai trouvé une solution avec un .bat @echo off w32tm /resync /force qui synchronise le PC avec le temps internet, il faut l'exécuter en tant qu'administrateur. puis tu utilise les fonctions qu'Olivier t'as indiqué.
-
Bonjour, Peut être trouveras tu une aide ici.
-
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Désolé, je me cite, car l'inverse n'est pas vrai. Pendant que Python agit dans AutoCAD, il peut lancer de l'AutoLisp / VisualLisp. Je ne veux pas vous embrouiller. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Heu, si si, intervient. Pas de soucis, ce n'est pas si facile à comprendre. Mais, je t'assure que cela vaut le coup d'apprendre le Python. Je suis encore jeune débutant, 2 ans que je l'apprend. (28 pour l'Autolisp ...j'ai vraiment eu du mal) -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Comme le dit GEGEMATIC, je n'ai qu'effleuré le sujet au début. Je comprend ta question, mais c'est justement l'alliance des deux que je veux présenter, car, à mes yeux, c'est comme cela qu'on profite vraiment de Python. Cela crée des mini-applications externes très légères qui te permettent d'enrichir Autolisp de fonctions pouvant interagir avec "l'extérieur" d'Autocad. Python, grâce à ces modules, voir le site Pypi, permet, entre autres, de lire / écrire énormément de formats en 3 ou 4 lignes de code. Je reviendrais sur l'utilisation de Python dans AutoCAD, promis. Par contre, il faut savoir, que si un Lisp est en route, Python ne peut pas accéder à AutoCAD. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Bonjour Didier, Si tu lis bien, c'est le contraire. C'est lancé depuis Autocad. Si tu est intéressé, prend bien le temps de lire. Convertir des coordonnées en coordonnées géographique est impossible ou très compliqué en Autolisp. Il faut une application externe comme Circébatch qui tourne comme une patate. En final c'est la fonction python transform qui fait le taf. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Tout d'abord la fonction Python qui seras lancé par Autolisp. Crée un fichier getepsg.py : # coding: utf-8 # python 3.12 # only for Windows """ getepsg.py, Lancé par Autolisp, permet de récupérer le code EPSG d'un système de coordonnée. Arg: past , str Nom Autocad du système dans le presse-papier DICSYS, dic Dictionnaire Nom Autocad/epsg (Variablle globale) Retour: str Code EPSG (dans presse-papier) Testé sur Windows 10 et Autocad 2015 """ import pyperclip from transConst import DICSYS from transGUI import tkListbox def main(past): lkeys = DICSYS.keys() if past and past in lkeys: epsg = DICSYS[past] else: epsg = DICSYS[tkListbox('Getepsg', 'Choisissez le Système.', lkeys)] pyperclip.copy(epsg) if __name__ == "__main__": main(pyperclip.paste()) Une fonction Autolisp, créez getwsg.lsp : ; ANSI-Windows 1252 ; Autolisp ;| getwsg, Convertion des coordonnées d'un point en WSG84. Si le dessin ne comporte pas d'emplacement géographique, choix du système. Dépendance: - getepsg.py - transform.lsp - transform-util.lsp Args: pt, liste de Str, Coordonnées d'un point cs, Str, Nom Autocad du système Retour: listes de Str. Testé sur Windows 10 et Autocad 2015 |; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Main (defun getwsg ( pt cs / ret sys) ; Nom du système dans le presse-papier, "" si aucun (argument de getepsg.py). (trans-SetClip cs) ; Si l'exécution de getepsg.py se passe bien. (if (trans-runscr (findfile "getepsg.py")) ; Colle le code epsg de départ (retour de getepsg.py). (setq sys (trans-GetClip) ; Utilisation de la fonction transform ret (transform (rtos (car pt)) (rtos (cadr pt)) sys "epsg:4326")) ) ret ) ; Launcher (defun c:wsg nil (if (getwsg (getpoint "\n Cliquez un point") (getvar 'cgeocs)) (princ (strcat "\n Coordonnées Géographiques : " (trans-GetClip) " (copié dans le presse-papier).")) (princ "\n Erreur: Vérifiez votre géoréférencement.")) (princ) ) Charger le lisp dans Autocad puis taper wsg. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Bonjour, Quelques commentaires avant une nouvelle collaboration. Si vous enlevez les commentaires, il ne reste pas grand chose. C'est ce que j'aime avec Python. J'ai choisi le presse-papier pour l'interpolation des arguments et retours. C'est ce qu'il a de plus rapide, ce qui permet de placer la fonction lisp transform dans une boucle foreach sans aucun soucis de synchronisation. Le choix de placer les fonctions Autolisp dans un domaine de nom (trans-) permet d'éviter des problèmes éponymiques de fonctions (effet de bord). Boites de dialogue Utilisons une boite de dialogue Python avec le module interne Tkinter. Bien plus facile à utiliser que DCL, Tkinter n'offre pas énormément de possibilités supplémentaires, et n'est pas beau. Si vous voulez des interfaces utilisateurs "pro", c'est QT qu'il faut utiliser. Personnellement, Tkinter me suffit. Si vous chercher des exemples Tkinter, vous allez forcement tomber sur cela: from tkinter import * Cela importe tout Tkinter, qui est énorme, ce n'est pas du tout recommandé. Le premier effet, est un temps de latence au démarrage du .py. La fonction Autolisp transform demande des code EPSG en arguments. Dans Autocad, même si ils apparaissent entre parenthèses à la fin de l'insertion d'un emplacement géographique, difficile de déduire le code EPSG par rapport au nom du système de coordonnée. Heureusement, nous utilisons toujours les mêmes généralement. Vous trouverez votre bonheur sur ce site officiel. C'est mondial tout comme la fonction transform de notre projet. Mais comme vous aurez la flemme, clique droit dans le vide de l'explorateur de votre EDI à gauche. Nouveau fichier et créer transConst.py et coller ceci dedans: # coding: utf-8 # Dictionnaire, Système de coordonnées : Code EPSG # Ce sont les noms des systèmes utilisés dans Autocad (variable "cgeocs") # Descriptions détaillées des systèmes https://epsg.io/ DICSYS = { "Lambert93": "epsg:2154", "NTF.Lambert-1-ClrkIGN": "epsg:27561", "NTF.Lambert-2-ClrkIGN": "epsg:27562", "NTF.Lambert-3-ClrkIGN": "epsg:27563", "NTF.Lambert-4-ClrkIGN": "epsg:27564", "NTF.Lambert-2C-ClrkIGN": "epsg:27572", #étendu "CC42": "epsg:3942", "CC43": "epsg:3943", "CC44": "epsg:3944", "CC45": "epsg:3945", "CC46": "epsg:3946", "CC47": "epsg:3947", "CC48": "epsg:3948", "CC49": "epsg:3949", "CC50": "epsg:3950", "ED50-UTM30": "epsg:23030", "ED50-UTM31": "epsg:23031", "ED50-UTM32": "epsg:23032", "WSG84": "epsg:4326", "WEB_MERCATOR": "epsg:3857" } ça c'est fait. Nous pouvons maintenant appeler ce dictionnaire avec un simple from transConst import DICSYS Créons une liste boxe simple choix. Crée le fichier transGUI.py et copier cela: # coding: utf-8 # python 3.12 # only for Windows """ tkListbox Boite de dialogue de type liste boxe à choix unique, de taille adaptative à la longueur de la liste. Utilisable par un programmme Autolisp. Args: tit: str , Titre de la boite. txt: str , Message lst: liste de texte , Choix Ret: str, L'élément choisi. Testé sur Windows 10 et Autocad 2015 """ from tkinter import Tk, Listbox, Label, Button import pyperclip def tkListbox(tit, txt, lst): # Fonction de validation def ok_clic(): # Globalisation du choix global sel # Récupération de la séléction. si = lb.curselection() sel = lb.get(si[0]) win.destroy() # Instanciation de l'objet Tk win = Tk() # Init de la boxe win.title(tit) win.geometry(f'250x{(len(lst) * 19)+25}+820+270') win.resizable(False, False) # Message Label(win,text = txt).pack() # Instanciation de l'objet Listbox lb = Listbox(win, width=30, height=len(lst)) # Insertion des éléments de la liste nb = 0 for key in lst: nb += 1 lb.insert(nb, key) # Séléction par defaut lb.select_set(0) lb.pack() # Bouton OK Button(win, text="Ok", command=ok_clic).pack(pady=10) # Fin propre si Echap win.bind('<Escape>', lambda e: win.destroy()) win.mainloop() # Copie du retour dans le presse-papier pyperclip.copy(sel) return sel a bientôt avec une fonction Autolisp qui utilise tout cela. -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Bonjour, Merci de nous montrer encore une autre façon de pénétrer discrètement Autocad. Sinon juste un petit truc, comme en autolisp if Autocad: suffit -
Autocad <-> Python <-> L' infini et au-delà
Fraid a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Je ne vais pas m'étendre sur l'utilisation de Pyautocad, Il y a des exemples d'utilisation sur cette page et celle-ci. Autolisp <-> Python Voici un exemple d'utilisation de Python au sein d'une fonction Autolisp. Nous allons créer une fonction autolisp de conversion de coordonnée en utilisant Python et le module pyproj Pour l'installer, taper en ligne de commande Windows pip install pyproj (N'ouvrez pas encore votre EDI) Nous allons choisir une architecture commune en créant ces dossiers : C:/Data/Python/transform/ Dans ce dossier créez 3 fichiers texte que vous renommerez : transform.py, transform.lsp et transform-util.lsp Cliquez droit dans le vide du dossier transform et Ouvrir avec <votre EDI> En fait, c'est comme cela qu'il faut ouvrir Visual studio code. Cela crée automatiquement un projet. Vos fichiers apparaissent sur l'explorateur à gauche. Cliquez sur transform.py, il s'ouvre dans l'éditeur. Important L'encodage des caractères des fichiers est indiqué en bas. Pour Python, il doit être UTF-8 comme le montre l'illustration. Si ce n'est pas le cas, cliquez dessus et vous serez amener à changer d'encodage (en haut). Voici le code python qui utilise le module pyproj. # coding: utf-8 # python 3.12 # only for Windows """ transform.py, Convertion des Coordonnées d'un système à l'autre. Les arguments doivent etres sous la forme d'un texte dans le presse papier. ex: '164080.02760466572 6797023.84783544 epsg:2154 epsg:4326' Args: xIn et yIn, floats, Coordonnées d'entrées. sysIn, str, Système d'entrée. sysOut, str, Système de sortie. Retour: tuple de deux floats, Coordonnées converties. et str dans presse papier. Exemple trans(5.355651287573366, 45.96240165432621, 'epsg:4326', 'epsg:2154') -> (882408.3, 6543019.60) et '882408.3 6543019.60' https://pyproj4.github.io/pyproj/stable/api/transformer.html#pyproj-transformer """ import pyperclip from pyproj import Transformer # Main def trans(x, y, sysIn, sysOut): try: # Instanciation de l'objet Transformer selon les systèmes. tr = Transformer.from_crs(sysIn, sysOut, always_xy=True) # Applique la méthode transform à l'objet avec les coordonnées d'entrée. xyt = tr.transform(float(x),float(y)) # Copie le retour en format texte dans le presse papier. pyperclip.copy(f'{xyt[0]} {xyt[1]}') return xyt except: return None # Launcher if __name__ == "__main__": # Colle les arguments du presse papier et transforme le texte en liste de textes. p = pyperclip.paste().split(' ') # Lance la fonction trans if not trans(p[0], p[1], p[2], p[3]): # Si trans ne renvois rien. pyperclip.copy('Error: Invalid projection') Sélectionnez maintenant transform.lsp Vérifier que le fichier soit encodé en Windows 1252. ; ANSI-Windows 1252 ; Autolisp ;| transform.lsp, Convertion des Coordonnées d'un système à l'autre. Dépendance: - transform-util.lsp - transform.py Arguments: x et y, str, Coordonnées d'entrées. sysIn, str, Système d'entrée.(code epsg) sysOut, str, Système de sortie.(code epsg) Retour: str, Coordonnées converties ou nil si échec. Testé sur Windows 10 et Autocad 2015 No copyright: (!) 2023 by Frédéric Coulon. No license: Do with it what you want. |; ; Ex: (transform "164080.02" "6797023.84" "epsg:2154" "epsg:4326") -> "-4.203120592065369 48.053447643549674" (defun transform (x y sysIn sysOut / ret) ; Copie des arguments dans le presse papier. (trans-SetClip (strcat x " " y " " sysIn " " sysOut)) ; Lancement de transform.py (and (trans-runscr (findfile "transform.py")) ; Si pas d'erreur. (/= (trans-GetClip) (setq ret "Error: Invalid projection")) ; Conversion du retour liste de texte. (setq ret (trans-str2lst (trans-GetClip) " "))) ret ) Le même chose pour transform-util.lsp ; ANSI-Windows 1252 ; Autolisp ; trans-GetClip, Récupère le contenu du Presse-papier ; Retour: str ou nil (defun trans-GetClip( / htm res) (setq res (vlax-invoke (vlax-get (vlax-get (setq htm (vlax-create-object "htmlfile")) 'ParentWindow ) 'ClipBoardData ) 'GetData "Text" ) ) (vlax-release-object htm) res ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; trans-SetClip, Copie un texte dans le Presse-papier. ; Arg: str ; Retour: str (defun trans-SetClip (text / htm) (vlax-invoke (vlax-get (vlax-get (setq htm (vlax-create-object "htmlfile")) 'ParentWindow ) 'ClipBoardData ) 'SetData "Text" text ) (vlax-release-object htm) text ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; trans-runscr, Exécute un script. ; Arg: str, nom du fichier ou chemin complet. ; Retour: T, si réussi sinon nil. (defun trans-runscr (file / obj ret) (setq ret T) (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke-method (list (setq obj (vlax-get-or-create-object "WScript.Shell")) "Run" file 0 :vlax-true ) ) ) (setq ret nil) (vlax-release-object obj) ) ret ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; trans-lst2str, Concatène une liste et un séparateur en une chaine. ; Arg: lst, Liste de texte ; sep, str Séparateur ; Retour: str (defun trans-lst2str (lst sep) (if (cdr lst) (strcat (vl-princ-to-string (car lst)) sep (trans-lst2str (cdr lst) sep)) (vl-princ-to-string (car lst)) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; trans-str2lst, Retourne une liste de texte à partir d'un texte. ; Arg: str, Texte ; sep, séparateur ; Retour: Liste de texte (defun trans-str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (trans-str2lst (substr str (+ (strlen sep) pos 1)) sep)) (list str) ) ) Vous enregistrez tout cela, biens sur. Ajouter dans Autocad le dossier Data comme approuvé. Chargez les 2 fichiers lsp. Testez avec (transform "164080.02" "6797023.84" "epsg:2154" "epsg:4326") A bientôt
