Aller au contenu

Autocad <-> Python <-> L' infini et au-delà


Messages recommandés

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

 

 

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Et bien Ouais c'est claire les langages dans autocad c'est le top

sacré logiciel...le temps passe et les possibilités de développement sont de plus en plus Vastes

VBA, LISPS,VLISPS,C++,C#NET,PYTHON, SQL

Aujourd'hui il faut d'abord apprendre a codé avant de ce servir de ces soft ça aide énormément

Lien vers le commentaire
Partager sur d’autres sites

Salut,

si j'ai bien compris, la seule manière de passer des argument entre lisp et python c'est le presse papier ?

du moins celle que tu utilise dans tes codes,

car si Python sait faire un "hello world", il doit bien être capable de lire ou d'écrire dans un dictionnaire ou une astuce comme ça ?

(peut être pas finalement, car com est nul en dictionnaires ....)

a+

Gégé

 

 

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

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

il y a 7 minutes, GEGEMATIC a dit :

passer des argument entre lisp et python c'est le presse papier

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..

 

Lien vers le commentaire
Partager sur d’autres sites

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.

 

Lien vers le commentaire
Partager sur d’autres sites

il y a 28 minutes, Fraid a dit :

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')

Quel intérêt puisque PyAutoCAD utilise la même interface COM/ActiveX. Ne peut on pas faire directement :

accad = Autocad() 
doc = accad.ActiveDocument
doc.PurgeAll()
doc.Save()

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

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 

Lien vers le commentaire
Partager sur d’autres sites

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.

 

Lien vers le commentaire
Partager sur d’autres sites

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.

 

 

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é