Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

J'aimerais commencer à créer mes propres lisp et je me retrouve bloqué par une chose, je ne sais pas comment récupérer les infos d'objets sélectionnés.

 

En parcourant le fofo j'ai trouvé cela pour récupérer les coordonnées (qui est un extrait d'un lisp un peu plus long):

 

(setq ptcoord (cdr (assoc 10 (entget ptname)))

 

Mais j'aimerais avoir quelques explications sur la fin de la ligne. Je ne comprend pas quelle est le rôle des fonctions (cdr) (assoc) et (entget) pour la récupération des coordonnées.

 

Est-il également possible de récupérer d'autres info comme la hauteur d'un texte ou sa rotation.

 

D'avance merci.

Posté(e)

Salut,

 

Le moyen 'traditionnel' utilisé en LISP pour récupérer les propriétés des objets est de lire les données DXF de l'objet (voir l'aide aux développeurs d'AutoCAD > Manuel d'utilisation DXF (en français).

 

On obtient ces données avec la fonction entget qui requiert un nom d'entité (type ENAME) comme argument et retourne une liste d'association.

Les liste d'associations sont utilisées en LISP pour faciliter l'accès aux éléments de la liste à l'aide d'une 'clé'. Chaque élément d'une liste d'association est une paire pointée ou une liste. C'est le premier élément de la paire pointée ou de la liste qui sert de clé.

Les fonctions LISP fondamentales car et cdr retournent, respectivement, le premier élément de la liste et la liste privée du premier élément.

La fonction assoc retourne la première occurrence d'une liste d'association dont le 'car' est égal au premier argument d'assoc.

Voir l'aide aux développeurs d'AutoCAD > AutoLISP Reference > AutoLISP functions (en anglais).

 

Un petit exemple simple avec la liste de données DXF retournée par entget pour un cercle(ent) :

(setq elst (entget ent))

retourne :

((-1 . )
 (0 . "CIRCLE")
 (330 . )
 (5 . "1E2E")
 (100 . "AcDbEntity")
 (67 . 0)
 (410 . "Model")
 (8 . "Calque7")
 (100 . "AcDbCircle")
 (10 10.0 20.0 0.0)
 (40 . 12.0)
 (210 0.0 0.0 1.0)
)

 

Cette liste est constituée de paires pointées ex : (0 . "CIRCLE") et de listes ex : (10 10.0 20.0 0.0)

Dans les deux cas le premier élément (0 ou 10) sert de clé pour y accéder directement avec assoc :

(assoc 0 elst)

retourne :

(0 . "CIRCLE")

 

(assoc 10 elst)

retourne :

(10 10.0 20.0 0.0)

 

Dans les deux cas, pour obtenir la donné depuis la paire pointée ou la liste on utilise cdr :

(cdr (assoc 0 elst))

retourne :

"CIRCLE"

les paires pointées sont des listes spéciales dont le cdr est un atome et non une liste.

 

(cdr (assoc 10 elst))

retourne :

(10.0 20.0 0.0)

dans ce cas le cdr est une liste.

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

Posté(e)

Bonjour,

 

Génial, merci beaucoup pour les explications c'est bien clair maintenant!

 

Je mettrais mon lisp si j'arrive à le finir pour vos avis critiques ;)

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é