Aller au contenu

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 09/07/2013 dans toutes les zones

  1. Généralités Les dictionnaires fournissent un moyen de lier des données au dessin ou à des objets de la base de donnée (entités graphiques ou objets non-graphiques). Ils peuvent contenir des données arbitraires et des objets non graphiques. De plus, contrairement aux objets Xdata, leur taille n'est pas limitée. Les données dans un dictionnaire sont stockées dans des objets Xrecord. Chaque dictionnaire peut contenir d'autres dictionnaires ainsi que plusieurs entrées Xrecord. Les dictionnaires se répartissent en deux types : les dictionnaires nommés et les dictionnaires d'extension. Les dictionnaires nommés Tout fichier DWG possède un "dictionnaire des objets nommés" Named Object Dictionary (NOD) qui est la racine de tous les dictionnaires nommés. AutoCAD (et plus encore les applications verticales) utilise ces dictionnaires pour stocker des données et des objets non graphiques (présentations, groupes, styles de multiligne, styles visuels, etc.). Chaque dictionnaire peut être considéré comme une entrée de son dictionnaire parent que ce soit le NOD ou un autre dictionnaire où son nom sert de clé pour le retrouver. Les dictionnaires d'extension Tout objet AutoCAD, graphique ou non, peut avoir un et un seul dictionnaire d'extension. Les dictionnaires d'extension n'ont pas de nom, c'est l'objet auquel ils sont lié qui sert de clé pour les retrouver. On retrouve le nom d'entité d'un dictionnaire d'extension dans la liste de données DXF de l'objet auquel il appartient, c'est la donnée du groupe 360 suivant le groupe (102 . "{ACAD_XDICTIONARY"). AutoCAD utilise aussi les dictionnaires d'extension, comme dans l'exemple ci-dessous, pour les objets annotatifs. ((-1 . <Nom d'entité: 7ffff706280>) (0 . "TEXT") (5 . "1D78") (102 . "{ACAD_XDICTIONARY") (360 . <Nom d'entité: 7ffff706290>) ; dictionnaire d'extension (102 . "}") (330 . <Nom d'entité: 7ffff7039f0>) (100 . "AcDbEntity") ...) Les objets XRecord Ce sont les conteneurs dans les quels sont stockées les données. Ce sont aussi des entrées nommées dans le dictionnaire parent, et là encore, leur nom qui sert de clé pour les retrouver dans l'arborescence. En LISP, les données dans un XRecord apparaissent sous forme de liste d'association dont les paires pointées utilisent les mêmes codes de groupe que les données DXF. Ce système offre une très grande souplesse et sa structure en arborescence avec un système de clés permet un accès très rapide aux données. En résumé, chaque dictionnaire (d'extension ou nommé) peut avoir plusieurs entrées de type Dictionary ou XRecord et chaque XRecord contenir plusieurs données. Les fonctions AutoLISP dédiées AutoLISP fournit des fonctions qui permettent d'accéder à ces dictionnaires et à leurs données, mais aussi d'en créer de nouveaux. namedobjdict Ne requiert aucun argument et retourne le nom d'entité du NOD du dessin courant. dictadd (dictadd dictkey entry) Ajoute une entrée de type Dictionary ou Xrecord à un dictionnaire. dict : le nom d'entité du dictionnaire auquel est ajouté l'objet. key : le nom de l'entée du nouvel objet, ce nom doit être unique. entry : le nom d'entité de l'objet ajouté. ;; Créer un objet dictionnaire (setq xname (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))) ;; Ajouter le dictonnaire au dictionnaire des objets nommés (dictadd (namedobjdict) "MON_SUPER_DICO" xname) ;; créer un objet XRECORD avec des données (setq xrec (entmakex '((0 . "XRECORD") (100 . "AcDbXrecord") (1 . "Ceci est un test") (40 . 3.14159) ) ) ) ;; ajouter l'objet XRecord au dictionnaire (dictadd xname "SUPER_DATA_1" xrec) dictsearch (dictsearch dict key [setnext]) Cherche l'entrée spécifiée dans le dictionnaire, et retourne sa liste DXF s'il existe (sinon nil). dict : le nom d'entité du dictionnaire key : le nom de l'entrée setnext : (optionnel) si spécifié et non nil, initialise dictnext avec cette entrée. ;; retrouver le dictionnaire (setq dict (dictsearch (namedobjdict) "MON_SUPER_DICO")) ;; retrouver les données (setq data (dictsearch (cdr (assoc -1 dict)) "SUPER_DATA_1")) (cdr (assoc 1 data)) retourne : "Ceci est un test" (cdr (assoc 40 data)) retourne : 3.14159 dictnext (dictnext dict[first]) Retourne la liste DXF de l'entrée suivante du dictionnaire si elle existe, sinon nil. dict : le nom d'entité du dictionnaire propriétaire. Si l'argument first est spécifié et non nil, dictnext retourne la première entrée. Ajoutons une nouvelle entrée XRecord à notre dictionnaire. (setq xname (cdr (assoc -1 (dictsearch (namedobjdict) "MON_SUPER_DICO"))) xrec (entmakex '((0 . "XRECORD") (100 . "AcDbXrecord") (70 . 256) ) ) ) (dictadd xname "SUPER_DATA_2" xrec) (cdr (member '(280 . 1) (dictnext xname T))) retourne : ((70 . 256)) (cdr (member '(280 . 1) (dictnext xname))) retourne : ((1 . "Ceci est un test") (40 . 3.14159)) dictrmove (dictremove dict key) Supprime l'entrée key du dictionnaire et retourne le nom d'entité de l'objet supprimé ou nil si un des arguments n'est pas valide. dict : nom d'entité du dictionnaire parent key : nom de la clé de lentrée à supprimer dictrename (dictrename dict oldKey newKey) Renomme une entrée d'un dictionnaire. Si tous les arguments sont valides, l'entrée oldKey est renommée newKey,et newKey est retourné, sinon nil est retourné. dict : nom d'entité du dictionnaire parent oldKey : clé à renommer newKey : nouvelle clé pour l'entrée Avec les dictionnaires d'extension Comme vu ci-dessus, on retrouve le dictionnaire d'extension d'un objet en interrogeant sa liste de données DXF et on ajoute un dictionnaire d'extension à un objet en modifiant sa liste de données DXF avec entmod : Deux petites routines pour illustrer ça (une petite bibliothèque de routines : Dictionaries.lsp au bas de cette page) : ;; gc:GetExtDict (gile) ;; Retourne le dictionnaire d'extension de l'entité (ou nil) ;; ;; Argument : ent (ENAME) (defun gc:GetExtDict (ent) (cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget ent))) ) ;; gc:GetOrCreateExtDict (gile) ;; Retourne le dictionnaire d'extension de l'entité ;; Le dictionnaire est créé s'il n'existe pas ;; ;; Argument : ent (ENAME) (defun gc:GetOrCreateExtDict (ent / dict) (cond ((cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget ent)))) ((setq dict (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")) ) ) (entmod (vl-list* (assoc -1 elst) (assoc 0 elst) (assoc 5 elst) (cons 102 "{ACAD_XDICTIONARY") (cons 360 dict) (cons 102 "}") (vl-remove-if (function (lambda (x) (member (car x) '(-1 0 5)))) elst) ) ) dict ) ) ) Pour clore cette première partie, une autre petite routine pour lister toutes les entrées dans un dictionnaire : ;; gc:GetDictEntries ;; Retourne la liste des entrées du dictionnaire ;; sous forme de paires pointées (key . ename) ;; ;; Argument : dict le dictionnaire (ENAME ou liste DXF) (defun gc:GetDictEntries (dict / result) (and (= (type dict) 'ENAME) (setq dict (entget dict))) (while (setq dict (vl-member-if (function (lambda (x) (= (car x) 3))) (cdr dict))) (setq result (cons (cons (cdar dict) (cdadr dict)) result)) ) (reverse result) ) Exemple d'utilisation : (gc:GetDictEntries (dictsearch (namedobjdict) "ACAD_LAYOUT")) À suivre...
    1 point
  2. Oui merci c'est bien ce que je pensais. je viens de refaire un sondage, en fait il faut mettre l'épaiseur de la couche et non l'altitude... merci tiphon, y'a les explication dans l'aide "F1"...
    1 point
  3. Bonjour Les sondages sont projetés sur l'axe (en fonction de la bande de recherche). Comme en effet l'altitude TN du lieu du sondage peut être (très) différente de celle du point de projection sur l'axe, c'est la profondeur des couches qui est alors utilisée pour dessiner le sondage sur le profil en long. Cordialement
    1 point
  4. Bonjour, Oui tiphon à raison! A l'inverse si un axe n'est pas reconnu, il faut verifier que la branche dans vrd est bien positionner sur l'axe (attention à l'accroche objet qui nous joue souvent des tours, il faut zoomer, regen, zoomer...) Cordialement.
    1 point
  5. Bonjour Il n'existe pas d'option (d'astuce) pour empêcher le logiciel de prendre en compte un axe en plan existant lors de la phase d'assistant de création de giratoire. A partir du moment où un axe a un point commun avec une branche, il sera automatiquement utilisé. PICKSTYLE ne sert à rien ici. On pourrait éventuellement envisager de déplacer provisoirement l'axe en plan avant de lancer la phase de d'assistant de création du giratoire en 3d. Sinon, on peut modifier la structure du giratoire en faisant bouton droit de la souris sur une branche.
    1 point
×
×
  • 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é