Aller au contenu

Messages recommandés

Posté(e)

Pour retrouver tous les codes dxf 5

(cdr (vl-remove-if-not '(lambda(x)(eq (car x) 5)) (dictsearch dict "Ma_Roue_01")))

 

Si tu souhaites modifier un enregistrement, avec entmod.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Non mais j'ai envie d'apprendre les ditctionnaires j'ai le temps :rolleyes:

 

j'ai compris la hiérarchie des dictionnaires nommés mais j'ai pas compris ou pouvait ce metre les dictionnaires d'extension. Et quand est ce qu'on les utilise?

 

Si tu as le temps et l'envie d'apprendre, je ne peux que t'encourager.

Pour manipuler les dictionnaires avec AutoLISP, il faut bien maîtriser l'utilisation des listes DXF et les fonctions afférentes (entmake(x), entmod, etc.) ainsi que les fonctions de manipulations de listes (car, cdr, member, assoc, etc.)

 

Les dictionnaires d'extension sont liés à des objets (graphiques ou non) comme les xdatas. Dans le sujet "Les dictionnaires" j'ai donné deux routines pour obtenir le dictionnaire d'extension d'un objet (gc:GetextDict) et pour obtenir ou créer dictionnaire d'extension d'un objet (gc:GetOrCreateExtDict). une fois le dictionnaire d'extension obtenu (ou créé) on peu lui ajouter des entrées (dictionnaire ou Xrecord).

 

Dans les exemples que j'ai donné avec les ldatas, pour un ensemble "roue" (deux cercles et douze lignes) un ldata est attaché à chaque entité de l'ensemble qui contient l'index de la "roue", ce ldata est l'équivalent d'un dictionnaire d'extension pour chaque entité. L'index de la "roue" attaché à chacune des entités est la clé qui permet de retrouver le ldata nommé contenant la liste des noms d'entités des composants de la roue. Ce ldata ci est l'équivalent d'un dictionnaire nommé (entrée du dictionnaire racine).

 

Pour stocker les noms d'entités dans le ldata il suffit d'en faire une liste. Avec un dictionnaire classique, il faut créer un Xrecord qui contient soit les maintiens (handle) des entités avec le code de groupe 5 soit directement les noms d'entité (ename) avec un code 330 à 349.

 

Petites précisions sur les différences entre handle et ename (ou l'équivalent appelé ObjectId dans d'autres environnements).

Chaque objet AutoCAD possède un handle et un ename.

 

Chaque handle est unique dans un dessin et pérenne (un objet aura toujours le même handle à chaque ouverture du dessin.

 

Chaque ename est unique dans la session (si plusieurs dessins sont ouverts tous les enames sont différents) et est réattribué avec une valeur parfois différente à chaque ouverture.

 

Donc, si les données sont conservées dans un fichier externe, seuls les handles garantissent de pointer sur le même objet du dessin à chaque ouverture.

Il en va différemment si les données sont conservées dans le dessin (dans un dictionnaire par exemple). Dans ce cas, AutoCAD utilise des "identificateurs de pointeur" (codes 330 à 349) et "identificateurs de propriétaire" (codes 350 à 369). À la fermeture du dessin ces enames sont remplacés par les handles correspondant et un nouveau ename sera attribué à la réouverture.

Les "pointeurs" sont utilisé pour les relations "non hiérarchiques", les "propriétaires" pour les relations d'appartenance, par exemple le ename du dictionnaire d'extension d'un objet se trouve dans un groupe 360 parce qu'il "appartient" à l'objet.

Les pointeurs ou propriétaires peuvent être "logiciels" ou "matériels" (traductions hasardeuses à mon avis de "soft" et "hard"). La différence est que les liaisons "logicielles" ne sont pas conservées lors des opérations de deep cloning (wbloc par exemple) quand les les liaisons "matérielles" sont conservées.

 

Extrait de l'aide

330-339

Identificateur de pointeur logiciel ; les pointeurs logiciels arbitraires sont liés à d'autres objets dans le même dessin ou fichier DXF. Traduit lors des opérations INSERER et XREF

 

340-349

Identificateur de pointeur matériel ; les pointeurs matériels arbitraires sont liés à d'autres objets dans le même dessin ou fichier DXF. Traduit lors des opérations INSERER et XREF

 

350-359

Identificateur de propriétaire logiciel ; les propriétaires logiciels arbitraires sont liés à d'autres objets dans le même dessin ou fichier DXF. Traduit lors des opérations INSERER et XREF

 

360-369

Identificateur de propriétaire matériel ; les propriétaires matériels arbitraires sont liés à d'autres objets dans le même dessin ou fichier DXF. Traduit lors des opérations INSERER et XREF

 

En résumé, tu peux stocker dans ton dictionnaire soit des paires (5 . ) soit des paires (330 . ).

 

En espérant ne pas avoir été trop confus.

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

Posté(e)
La différence est que les liaisons "logicielles" ne sont pas conservées lors des opérations de deep cloning (wbloc par exemple) quand les les liaisons "matérielles" sont conservées.

C'est à dire que si j'ai des objects qui ont des pointeurs ou propriétaires logiciel et que je fait un wbloc avec ces objets les pointeurs ou propriétaires seront perdus alors qui si j'aurais eu des pointeurs ou propriétaires matériels, j'aurai put les retrouver dans le wbloc ?

Posté(e)

Je fais des essais pour apprendre à manipuler les dictionnaires.

 

J'ai un petit souci avec entmod

Voila j'ai ecrit çà

(defun c:vv ()
 (setq dict  (dictsearch (namedobjdict) "text_essai"))
 (setq data (dictsearch (cdr (assoc -1 dict)) "essai"))
(setq data (subst  (cons 1 "plus un essai") (assoc 1 data)  data))
(entmod data)
 (setq data (dictsearch (cdr (assoc -1 dict)) "essai"))
 )

quand j'espione la valeur data j'ai :

 

(setq data (dictsearch (cdr (assoc -1 dict)) "essai"))

--> initialement j'ai (1 ."essai")

 

(setq data (subst  (cons 1 "plus un essai") (assoc 1 data)  data))

--> essai est remplacé par "plus un essai"

 

(dictsearch (cdr (assoc -1 dict)) "essai"))
 )

--> j'ai deux groupe de code 1 (1 ."essai") (1 ."plus essai")

 

 

Alors que dans l'aide il arrive pasà ça

 

Set the en1 variable to the name of the first entity in the drawing:

 

Command: (setq en1 (entnext))

 

<Entity name: 2c90520>

 

Set a variable named ed to the entity data of entity en1:

 

Command: (setq ed (entget en1))

 

((-1 . <Entity name: 2c90520>) (0 . "CIRCLE") (5 . "4C") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 3.45373 6.21635 0.0) (40 . 2.94827) (210 0.0 0.0 1.0))

 

Changes the layer group in ed from layer 0 to layer 1:

 

Command: (setq ed (subst (cons 8 "1") (assoc 8 ed) ed ))

 

((-1 . <Entity name: 2c90520>) (0 . "CIRCLE") (5 . "4C") (100 . "AcDbEntity") (67 . 0) (8 . "1") (100 . "AcDbCircle") (10 3.45373 6.21635 0.0) (40 . 2.94827) (210 0.0 0.0 1.0))

 

Modify the layer of the en1 entity in the drawing:

 

Command: (entmod ed)

 

((-1 . <Entity name: 2c90520>) (0 . "CIRCLE") (5 . "4C") (100 . "AcDbEntity") (67 . 0) (8 . "1") (100 . "AcDbCircle") (10 3.45373 6.21635 0.0) (40 . 2.94827) (210 0.0 0.0 1.0))

Posté(e)

J'ai testé les deux routines (gc:GetextDict) (gc:GetOrCreateExtDict)j'ai compris comment on le faisait mais dans qu'elle cas et pour qu'elle but on peut utilisé ces dictionnaires d'extensions, qu'est ce qu'il apporte de plus ?

Posté(e)
C'est à dire que si j'ai des objects qui ont des pointeurs ou propriétaires logiciel et que je fait un wbloc avec ces objets les pointeurs ou propriétaires seront perdus alors qui si j'aurais eu des pointeurs ou propriétaires matériels, j'aurai put les retrouver dans le wbloc ?

 

Oui, mais avec quelques restriction suivant ce qui est cloné. Voir ma réponse dans ce sujet.

 

J'ai un petit souci avec entmod

Il faut écraser l'ancien Xrecord avec un nouveau. Par exemple en utilisant les routines gc:GetXrecData et gc:SetXrecData dans le sujet donné en lien ci-dessus.

 

(defun c:zz (/ dict data)
 (setq dict (cdr (assoc -1 (dictsearch (namedobjdict) "text_essai"))))
 (setq data (gc:GetXrecData dict "essai"))
 (setq data (subst '(1 . "plus un essai") (assoc 1 data) data))
 (gc:SetXrecData dict  "essai" data)
 (setq data (gc:GetXrecData dict "essai"))
)

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

Posté(e)

Bonjour,

 

J'ai hésité à créer un nouveau fil de discussion, mais c'est en relation directe avec les dictionnaires.

 

Je dois stocker des informations de "projet" qui associe des objets autocad à travers un ensemble de relation. Je pensais stocker cela dans un dictionnaire, mais il me semble que les dictionnaires sont perdus lorsque l'on insère un dessin dans un autre (comme les groupes AutoCAD).

Comme mon projet est global au dessin, je ne peux pas l'attacher à une entité graphique.

Par contre, au vue des différents messages, je me demandais si je pouvais attacher le Hard Pointer de mon dictionnaire sur chacun des objets impactés par le "projet". Ainsi si j'insère mon dessin, wbloc ou autre manip, est-ce que le dictionnaire va forcément suivre?

Si j'ai 2 dessins qui contiennent chacun un dictionnaire propre et que je les insère l'un dans l'autre que se passera-t-il? Est-ce que la définition du second sera ignorée? cumulée?

 

Si les dictionnaires ne peuvent pas être utilisés, y a-t-il un moyen de stocker des informations globale par dessin qui seront transférés lors des opérations d'insertion ou de wbloc?

 

Merci

 

Olivier

Posté(e)

Salut Oliver,

 

Quand "on insère une dessin dans un autre", c'est en fait le bloc espace objet du dessin qu'on insère. Le dictionnaire des objets nommés (NOD) n'est donc pas importé avec l'espace objet.

Ce sachant, j'ai pensé qu'on pourrait utiliser le dictionnaire d'extension de l'espace objet, mais les tests que j'ai fait n'ont pas été concluant non plus : le dictionnaire ou le xrecord attaché au dictionnaire d'extension de l'espace objet du dessin source n'est pas conservé quand on l'insère dans le dessin cible...

Reste la solution du fichier externe avec les maintiens (Handle) des objets...

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

Posté(e)

Petite question

quand je fais ça:

(cdr (vl-remove-if-not '(lambda(x)(eq (car x) 5)) (dictsearch dict "Ma_Roue_01")))

sur ce dictionnaire :

((-1 . <Nom d'entité: 7ef06518>) (0 . "XRECORD") (5 . "223") (102 . 
"{ACAD_REACTORS") (330 . <Nom d'entité: 7ef064d8>) (102 . "}") (330 . <Nom 
d'entité: 7ef064d8>) (100 . "AcDbXrecord") (280 . 1) (5 . "222") (5 . "221") (5 
. "220"))

il me ressort

ça :

((5 . "222") (5 . "221") (5 . "220"))

Mais pourquoi y me donne pas (5 . "223") qui est le handle du dictionnaire ? alors qu'il est bien dans le dictionnaire ?

Posté(e)

Salut Gilles

 

Merci pour les tests et les idées, je vais voir ce que je peux faire.

Avec le fichier externe qui contient les handles de mes objets et si je stocke en plus en Xdata mais sous forme de texte le Handle de chaque objet sur lui-même, ça devrait me permettre de "reconstruire" les liens si je déplace mes objets dans un autre dessin. Ca devrait fonctionner.

 

Olivier

Salut Oliver,

 

Quand "on insère une dessin dans un autre", c'est en fait le bloc espace objet du dessin qu'on insère. Le dictionnaire des objets nommés (NOD) n'est donc pas importé avec l'espace objet.

Ce sachant, j'ai pensé qu'on pourrait utiliser le dictionnaire d'extension de l'espace objet, mais les tests que j'ai fait n'ont pas été concluant non plus : le dictionnaire ou le xrecord attaché au dictionnaire d'extension de l'espace objet du dessin source n'est pas conservé quand on l'insère dans le dessin cible...

Reste la solution du fichier externe avec les maintiens (Handle) des objets...

  • 4 semaines après...
Posté(e)

Bonjour,

 

Je reviens sur ce sujet pour cette ligne :

(vl-remove-if-not '(lambda(x)(eq (car x) 5)) (dictsearch dict "Ma_Roue_01")))

c'est possible de récupérer que le handle de la paire pointé, j'ai essayé d'introduire un cdr un peu par tout mais sans résultat.

Jusqu'a maintenant je faisais une boucle pour récuperer chaque cdr des éléments de la liste mais si c'est possible directement avec cette ligne de code ça m'aiderais.

 

Merci

Posté(e)

Bonjour,

 

Je reviens sur ce sujet pour cette ligne :

(vl-remove-if-not '(lambda(x)(eq (car x) 5)) (dictsearch dict "Ma_Roue_01")))

c'est possible de récupérer que le handle de la paire pointé, j'ai essayé d'introduire un cdr un peu par tout mais sans résultat.

Jusqu'a maintenant je faisais une boucle pour récuperer chaque cdr des éléments de la liste mais si c'est possible directement avec cette ligne de code ça m'aiderais.

 

Merci

 

Par composition de fonction prédifinie

(mapcar 'cdr (vl-remove-if-not '(lambda(x)(eq (car x) 5)) (dictsearch dict "Ma_Roue_01")))	

 

Sinon en définissant une fonction spécifique

(defun lstHandent (lst)
 (cond ((null lst) nil)
((eq (caar lst) 5) (cons (cdar lst) (lstHandent (cdr lst))))
((lstHandent (cdr lst)))))

 

_$ (lstHandent (dictsearch dict "Ma_Roue_01"))

 

("223" "222" "221" "220")

_$

 

A+

Apprendre => Prendre => Rendre

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é