bonuscad Posté(e) le 14 février 2006 Posté(e) le 14 février 2006 Suite à cette Discussion , cela m'a donné une idée pour essayer de faire une fonction pour remonter dans le sens inverse de création du dessin afin de voir les dernière entités crées. Je pensais que la dernière entité dessiné (entlast) me donnerais l'identificateur de maintien le plus élevé. Mais après quelque test, j'ai l'impression que non. Donc j'aurais voulu plus d'amples renseignements à ce sujet. (rien trouvé dans l'aide) :( Je vous livre le code (certainement imparfait), normalement ce code ne modifie rien dans la base de donnée du dessin. Il active simplement l'espace objet, car je n'ai ciblé que l'espace objet pour faire une exploration. Dans un dessin ou de nombreux "U" ou effacements ont été effectués, il peut y avoir un temps de latence avant qu'il ce passe quelquechose lors de l'appui sur la touche "-/+". La touche "-" remonte vers le début du dessin et "+" dans le sens inverse.Dans la barre d'état vous pouvez voir le nom de la dernière entité affiché et son calque . Les fonctions de convertion Hexadécimal < - > Décimal ne sont pas de moi. (defun dechex (nb / r i) (setq r "") (while (and (= (type nb) 'INT) (> nb 0)) (setq i (rem nb 16)) (setq nb (lsh nb -4)) (setq r (strcat (if (< i 10) (itoa i) (chr (+ 55 i )) ) r ) ) ) ) (defun hexdec (nb / r i s) (if (= (type nb) 'INT) (setq nb (itoa nb)) ) (setq r 0 i 0) (while (and (= (type nb) 'STR) (< i (strlen nb))) (setq i (1+ i)) (setq s (strcase (substr nb i 1 ))) (setq r (+ (lsh r 4) (- (ascii s) (if (<= s "9") 48 55 ) ) ) ) ) ) (defun c:back_trace ( / js_swap n_swap ent hd_ent op dxf_ent dxf_67 dxf_0 dxf_8 key) (setvar "cmdecho" 0) (setq js_swap (ssget "_X" '((-4 . ""))) n_swap 0) (cond (js_swap (setvar "ctab" "Model") ; (command "_.zoom" "_all") (repeat (sslength js_swap) (setq ent (ssname js_swap n_swap)) (redraw ent 2) (setq n_swap (1+ n_swap)) ) ) ) (if (entlast) (setq hd_ent (cdr (assoc 5 (entget (entlast)))) op '1-)) (princ "\n<+/-> pour choix; /[Espace] pour finir!.") (while hd_ent (setq ent (handent hd_ent)) ;(print hd_ent) (setq hd_ent (dechex ((eval op) (hexdec hd_ent)))) (if ent (progn (setq dxf_ent (entget ent) dxf_67 (assoc 67 dxf_ent) dxf_0 (cdr (assoc 0 dxf_ent)) dxf_8 (cdr (assoc 8 dxf_ent)) ) (cond ((and (or (not dxf_67) (zerop (cdr dxf_67))) (member dxf_0 (list "3DFACE" "3DSOLID" "ACAD_PROXY_ENTITY" "ARC" "ARCALIGNEDTEX" "ATTDEF" "ATTRIB" "BODY" "CIRCLE" "DIMENSION" "ELLIPSE" "HATCH" "IMAGE" "INSERT" "LEADER" "LINE" "LWPOLYLINE" "MLINE" "MTEXT" "OLEFRAME" "OLE2FRAME" "POINT" "POLYLINE" "RAY" "REGION" "RTEXT" "SHAPE" "SOLID" "SPLINE" "TEXT" "TOLERANCE" "TRACE" "WIPEOUT" "XLINE" ) ) ) (setq key (grread nil 2 1)) (cond ((member key '((2 13) (2 32))) (setq hd_ent nil) ) ((eq (cadr key) 43) (setq op '1+) (redraw ent 2) ) ((eq (cadr key) 45) (setq op '1-) (redraw ent) ) ) (grtext -1 (strcat "Entité: " dxf_0 " - Calque: " dxf_8)) ) ) ) ) (if (eq (hexdec hd_ent) "1") (setq hd_ent nil)) (if (> (hexdec hd_ent) (hexdec (cdr (assoc 5 (entget (entlast)))))) (setq hd_ent (cdr (assoc 5 (entget (entlast)))) op '1-) ) ) (command "_.regenall") (setvar "cmdecho" 1) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 14 février 2006 Posté(e) le 14 février 2006 Salut BonusPour connaître les entités qui sont créées à un moment donné tu fais par exemple(setq der (entlast))puis tu fais d'autres entités et un (entnext der) te donneras la première entité qui à été créée depuis ton setq et tu continues avec les entnext pour trouver la suite exemple non testé(setq n der js (sadd))) (while n (setq n (entnext n) js (sadd n)) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 14 février 2006 Auteur Posté(e) le 14 février 2006 Salut Patrick_35, J'avais bien pensé au départ de monter le code avec (entnext), mais comme j'ai voulu parcourir la base de donnée dans les 2 sens, il m'était plus facile d'incrementer ou décrementer les Handles. Ma question reformulé: Est-ce qu'il est possible qu'un identificateur de maintien est une valeur PLUS elevée que la dernière entité ajouté au dessin? Lors de mon essai infructueux j'ai trouvé le handle d'un xref plus grand que la dernière entité rajouté à la base de donnée graphique.Est ce spécifique aux xrefs, où ais-je révé? :casstet: Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 14 février 2006 Posté(e) le 14 février 2006 Tu me diras, ca ne réponds pas à ta question. Mais pour l'anecdote, voici comment je me débrouille avec ce genre de question aujourd'hui : (setq doc (vla-get-activedocument (vlax-get-acad-object))) (setq espac(vla-get-modelspace doc)) ;entre (vla-item espac 0); premier objet (vla-item espac(-(vla-get-count espac)1)); dernier Je ne me sers des HANDLE que très rarement, pour trouver quel segment de ligne m'intéresses après un break, c'est par habitude, mais en Vlisp, ca peut aussi être efficace. Peut-être ces codes peuvent-ils t'aider mais je ne sais pas comment sont générés les Handles donc ne peux répondre à la question précise. [Edité le 14/2/2006 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 14 février 2006 Posté(e) le 14 février 2006 BonusDu moment que tu as un jeu de sélection, rien n'interdit de faire une liste que l'on peut parcourir dans un sens comme dans l'autre. Par contre, pour ce qui est des handles, je n'ai jamais regardé de près @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 14 février 2006 Auteur Posté(e) le 14 février 2006 Oui Patrick_35, mais dans l'optique que je me suis fixé; parcourir la base dans l'ordre de création, je suis pas sûr qu' un jeu de sélection soit parcouru de la même manière. (La logique voudrait que oui) Je pense aussi que manipuler une liste peut être vite pénalisant aux niveaux des temps de réponse, surtout si tu fait ça dans un dessin énorme. En fait mon code ne bug pas, mais il est difficile de savoir s'il fonctionne correctement. Je vais prendre le temps de faire des test suivis et pas au hasard comme je l'ai fais jusqu'à maintenant. Tramber, je vais regarder si tes lignes peuvent m'apporter quelque choses. Je suis encore à découvrir les fonctions vl et vlax au coup par coup. Donc toujours instructif ;) Je vous remercie de vos réponses :D Même mais recherche sur le Net, Les Handles ont l'air d'être peu utilisé. On se demande même pourquoi ils ont été crés :casstet: Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bonuscad Posté(e) le 3 mai 2006 Auteur Posté(e) le 3 mai 2006 Du moment que tu as un jeu de sélection, rien n'interdit de faire une liste que l'on peut parcourir dans un sens comme dans l'autre. Le voici refait dans cet optique, ça fonctionne déjà mieux!Quelques problèmes d'affichage dans l'EP mais bon, c'est pas super important vu l'utilité du code. Ca ma permis de voir qu'en remontant la base avec (entnext) depuis (entlast) on obtient les entités de l'EO ET celles du dernier onglet activé dans l'EP. Comme c'est étrange :P Autre chose que j'ai remarqué, c'est que (redraw [ent] [mode]) ne fonctionne qu'en mode filaire 2D.Voilà si ces remarques peuvent vous evitez de vous cassez la tête... dans d'autres situations. Rappel: ce code permet de se "ballader" dans l'ordre chonologigue pour voir à quel moment a pu être créé une entité. Les infos de l'entité en court d'affichage à l'écran sont donnés dans la barre d'état.Ce code ne modifie en rien le dessin. (defun c:back_trace ( / e_first dxf_ent name_ent hd_ent lst_hd lght_lst n ent dxf_67 dxf_0 dxf_8 dxf_410 key) (if (setq e_first (entnext)) (setq dxf_ent (entget e_first) name_ent (cdar dxf_ent) hd_ent (cdr (assoc 5 dxf_ent)) lst_hd (list hd_ent) ) ) (while name_ent (if (setq e_next (entnext name_ent)) (setq dxf_ent (entget e_next) name_ent (cdar dxf_ent) hd_ent (cdr (assoc 5 dxf_ent)) lst_hd (cons hd_ent lst_hd) ) (setq name_ent nil) ) ) (cond (lst_hd (setvar "cmdecho" 0) (if (eq (getvar "ctab") "Model") (command "_.shademode" "_2d") ) (foreach n lst_hd (redraw (handent n) 2)) (setq lght_lst (length lst_hd) n 0) (princ "\n<+/-> pour remonter ou redescendre la base du dessin; < Entrée >/[Espace] pour finir!.") (while (and (>= n 0) (< n lght_lst)) (setq ent (handent (nth n lst_hd)) dxf_ent (entget ent) dxf_67 (assoc 67 dxf_ent) dxf_0 (cdr (assoc 0 dxf_ent)) dxf_8 (cdr (assoc 8 dxf_ent)) dxf_410 (cdr (assoc 410 dxf_ent)) ) (if (/= (getvar "ctab") dxf_410) (progn (setvar "ctab" dxf_410) (if (eq (getvar "ctab") "Model") (command "_.shademode" "_2d") ) (foreach n lst_hd (redraw (handent n) 2)) ) ) (cond ((and (= (getvar "ctab") dxf_410) (member dxf_0 (list "3DFACE" "3DSOLID" "ACAD_PROXY_ENTITY" "ARC" "ARCALIGNEDTEX" "ATTDEF" "BODY" "CIRCLE" "DIMENSION" "ELLIPSE" "HATCH" "IMAGE" "INSERT" "LEADER" "LINE" "LWPOLYLINE" "MLINE" "MTEXT" "OLEFRAME" "OLE2FRAME" "POINT" "POLYLINE" "RAY" "REGION" "RTEXT" "SHAPE" "SOLID" "SPLINE" "TEXT" "TOLERANCE" "TRACE" "VIEWPORT" "WIPEOUT" "XLINE" ) ) ) (setq key (grread nil 2 1)) (cond ((member key '((2 13) (2 32))) (setq n -1) ) ((eq (cadr key) 43) (setq n (1- n)) (redraw ent 2) (if (< n 0) (progn (setq n 0) (alert "Dernière entité du dessin atteinte!") ) ) ) ((eq (cadr key) 45) (setq n (1+ n)) (redraw ent 1) (if (= n lght_lst) (progn (setq n (1- n)) (alert "Première entité du dessin atteinte!") ) ) ) ) (grtext -1 (strcat "Entité: " dxf_0 " - Calque: " dxf_8)) ) (T (cond ((eq (cadr key) 43) (setq n (1- n)) (if (< n 0) (setq n 0) ) ) ((eq (cadr key) 45) (setq n (1+ n)) (if (= n lght_lst) (setq n (1- n)) ) ) (T (setq n (1+ n)) ) ) ) ) ) (grtext) (command "_.regenall") (setvar "cmdecho" 1) ) (T (alert "Le dessin est vide!")) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant