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.