-
Compteur de contenus
5 029 -
Inscription
-
Dernière visite
-
Jours gagnés
56
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par bonuscad
-
Touche "TAB" 1 seule fois puis "ENTREE" TAB parcours les boutons "CTRL+TAB permet de changer d'onglet
-
Nous dirons simplement qu'il est bien de se donner la peine de chercher ses erreurs pendant un petit moment avant de crier au secour :P Sans rancune ;) A+
-
Lutter contre les artefacts
bonuscad a répondu à un(e) sujet de Tramber dans Pour aller plus loin en LISP
Ce genre de truc m'arrive aussi (sans spécialement programmer) Un cas que je me souviens : Décalage d'une polyligne ET BIEN impossible de sélectionner la polyligne qui est bien sous mes yeux à l'écran. La parade la commande repere (ou _plan) qui remet de l'ordre dans tout ça Elle est bien cette commande :) -
Il faut faire attention aux paranthèses :casstet: et se débrouiller seul si on veut personnaliser. aller va les 2 lignes (setq last_ent (entlast) n 1000) (setq name_image (strcat (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 4)) "-" (substr (itoa (setq n (1+ n))) 2 3)))
-
Disons qu'il y a (setq last_ent (entlast) n 0) ce qui est pareil On peut metrtre plusieurs variable dans un (setq n1 0 n2 2 etc.. ) ca évite de mettre plusieurs ligne avec un (setq) par variable ;)
-
Bonjour tout le monde, C'est pas une découverte, mais un rappel d'une fonctionnalité qui est passée à la trappe depuis l'usage des boutons et menus. En effet pour executer cette astuce, elle ne sera acceptée que de la ligne de commande. Donc tapez : -FHACH puis P donnez le nom de votre de modèle puis au message Spécifiez l'échelle du modèle: Entrez par exemple 0.5XP votre échelle de hachures sera alors ajustée dans l'espace Objet pour avoir une échelle de 0.5 dans l'espace papier.
-
Si tu penses rester dans une fourchette précise. Exemple de 000 à 100 remplace (setq n 0 ) par (setq n 1000) et (itoa (setq n (1+ n))) par (substr (itoa (setq n (1+ n))) 2 3)
-
C'est dommage de parcourir 2 fois ton jeu de sélection! :( Pourquoi ne pas l'avoir fais dans ta fonction injecto dans ta boucle avec ton index i ? ;) Je t'avais proposé (entdel) car j'avais penser que cela passerais outre certaines obligations, mais je me suis foutu le doigt dans l'oeil. En effet Si tu as le malheur de sélectionner des entités d'un calque verrouillé, celle-ci ne seront pas effacés. Je pensais que (entdel) le ferais, mais non :(
-
Salut On peut faire ça en lisp, je te donne un exemple , mais il faudra certainement que tu l'ajuste à tes besoins propre car beaucoup de paramètres rentrent en compte. Je t'invite à regarder l'aide d'autocad. *Documentation du développeur -> Référence AutoLISP -> Externally Defined Commands Dans cette section tu auras toutes les commandes avec les toute les options de rendu possible. Le programme qui suit réclame une 3Dpoly (splinée ou non) comme parcours. Il te donne déjà une structure principale, mais il peut être adapté à une situation plus sophistiqué. A toi d'y réfléchir (defun c:make_clip ( / om e_sel dxf_ent last_ent n d_fence key_target d_target a_target l_ptcam pt_cam pt_target) (if (not (member "acrender.arx" (arx))) (arxload "acrender.arx")) (setq om (getvar "osmode")) (while (not (setq e_sel (entsel "\nChoix de la 3Dpoly pour parcours: ")))) (setq dxf_ent (entget (car e_sel))) (cond ((and (eq (cdr (assoc 0 dxf_ent)) "POLYLINE") (eq (logand (cdr (assoc 70 dxf_ent)) 8) 8)) (setq last_ent (entlast) n 0) (initget 7) (setq d_fence (getdist "\nPas de déplacement de la caméra: ")) (initget 1 "Fixe Relatif") (setq key_target (getkword "\nPoint de visée [Fixe/Relatif] à la caméra: ")) (if (eq key_target "Fixe") (progn (initget 1) (setq pt_target (getpoint "\nPoint fixe de la visée: ")) ) (progn (initget 7) (setq d_target (getdist "\nDistance relative à la camèra: ")) ) ) (setvar "osmode" 0) (command "_.measure" (car e_sel) d_fence) (while (and (= (cdr (assoc 0 (entget (entlast)))) "POINT") (not (equal (entlast) last_ent)) ) (setq l_ptcam (cons (cdr (assoc 10 (entget (entlast)))) l_ptcam)) (entdel (entlast)) ) (cond ((and l_ptcam (> (length l_ptcam) 1)) (c:rpref "DEST" "FILE") (c:rpref "STYPE" "ARAY") (c:rpref "TOGGLE" "FINISH" "ON") (c:rpref "TOGGLE" "SKIPRDLG" "ON") (C:RFILEOPT "TIFF" 1024 768 1.0 "C24") (while l_ptcam (setq pt_cam (car l_ptcam)) (if (and (eq key_target "Relatif") (cadr l_ptcam)) (setq a_target (angle (car l_ptcam) (cadr l_ptcam)) pt_target (polar (car l_ptcam) a_target d_target) ) ) (command "_.dview" e_sel "" "_point" pt_target pt_cam "_distance" "" "") (setq name_image (strcat (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 4)) "-" (itoa (setq n (1+ n))))) (c:render name_image) (setq l_ptcam (cdr l_ptcam)) ) ) ) (setvar "osmode" om) ) (T (princ "\nN'est pas une 3DPOLY!")) ) (prin1) )
-
Pas mal, pas mal ;) Simple, concis et efficace, (sous réserve, car pas testé en profondeur) Tu remplaces "_erase" par un (entdel (ssname ....etc.) et c'est 100% pur jus de Lisp. :D
-
Tu dois tout rebalancer. Un exemple sera plus parlant usage (make_block "Tramber") puis pour faire une copie (make_block "Bertrand") créeras donc 2 blocs identiques de nom différent avec la même défintion d'attribut. (defun make_block (name_block / ) (if (not (tblsearch "LAYER" "Tramber")) (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Tramber") (70 . 0) (62 . 7) (370 . -3) (6 . "Continuous") ) ) ) (if (not (tblsearch "STYLE" "Tramber")) (entmake '((0 . "STYLE") (5 . "40") (100 . "AcDbSymbolTableRecord") (100 . "AcDbTextStyleTableRecord") (2 . "Tramber") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (71 . 0) (42 . 1.54508) (3 . "simplex.shx") (4 . "") ) ) ) (if (not (tblsearch "BLOCK" name_block)) (progn (entmake (append '((0 . "BLOCK") (8 . "0")) (list (cons 2 name_block)) '((70 . 2) (4 . "") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (10 0.0 0.0 0.0))) ) (entmake '( (0 . "LWPOLYLINE") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbPolyline") (90 . 8) (70 . 1) (43 . 0.618034) (38 . 0.0) (39 . 0.0) (10 0.999998 0.0) (40 . 0.618034) (41 . 0.618034) (42 . 0.0) (10 60.8034 0.0) (40 . 0.618034) (41 . 0.618034) (42 . 0.414214) (10 61.8034 0.999998) (40 . 0.618034) (41 . 0.618034) (42 . 0.0) (10 61.8034 37.1966) (40 . 0.618034) (41 . 0.618034) (42 . 0.414214) (10 60.8034 38.1966) (40 . 0.618034) (41 . 0.618034) (42 . 0.0) (10 0.999998 38.1966) (40 . 0.618034) (41 . 0.618034) (42 . 0.414214) (10 0.0 37.1966) (40 . 0.618034) (41 . 0.618034) (42 . 0.0) (10 0.0 0.999998) (40 . 0.618034) (41 . 0.618034) (42 . 0.414214) (210 0.0 0.0 1.0) ) ) (entmake '( (0 . "TEXT") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbText") (10 12.3265 19.0983 0.0) (40 . 1.54508) (1 . "Membre de CAD Xp") (50 . 0.0) (41 . 0.75) (51 . 0.0) (7 . "Tramber") (71 . 0) (72 . 0) (11 12.3265 19.8708 0.0) (210 0.0 0.0 1.0) (100 . "AcDbText") (73 . 2) ) ) (entmake '( (0 . "ATTDEF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbText") (10 30.9017 19.0983 0.0) (40 . 1.54508) (1 . "CAD Xp") (50 . 0.0) (41 . 0.5) (51 . 0.0) (7 . "Tramber") (71 . 0) (72 . 0) (11 30.9017 19.8708 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (3 . "Membre de CAD Xp ?:") (2 . "MEMBER_CADXP") (70 . 0) (73 . 0) (74 . 2) ) ) (entmake '((0 . "ENDBLK") (8 . "0") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2))) ) ) )
-
Pour Maximilien: Si tu veux modier StripMText pour qu' il soit compatible VL, modifie : (defun c:StripMtext ( / ; Functions *error* AcceptButton ClearAllButton MainDialog SelectAllButton Setup StripMtext Unformat ; Variables dcl_id dclfilemsg dclfilename dialogmsg keylist modcnt save settings space ss tilemsg versionmsg ) En (defun c:StripMtext ( / ; Functions ; *error* ; AcceptButton ; ClearAllButton ; MainDialog ; SelectAllButton ; Setup ; StripMtext ; Unformat ; Variables dcl_id dclfilemsg dclfilename dialogmsg keylist modcnt save settings space ss tilemsg versionmsg ) En fait tu met simplement en remarque à l'aide d'un point virgule devant les noms de fonction définies en variables . Personnellement ce n'est pas du tout ma façon de faire, je ne déclare jamais mes sous-fonctions en variables locales, j'utilise simplement (setq ma_fonction nil) en fin de programme pour libérer la mémoire (ceci dans le cas où je sais que le programme ne sera lancé qu'une seule fois, autrement je laisse la fonction dispo). Rappel: le DCL doit être dans un chemin de recherche, ou alors spécifier le chemin dans le programe StipMtext. Pour Tramber: Pour Ultra-Edit, jette un oeil à: ftp://ultraedit.com/wf/autolisp.txt ou http://www.kpsoft.be/mirror/downloads/wf/autolisp.txt Il faut simplement rajouter les lignes proposées au fichier wordfile.txt dans le dossier d'UltraEdit. Puis dans le logiciel choisir dans le menu affichage -> Afficher avec (coloration syntaxique) ->Autolisp
-
Pourquoi le charge tu sous Visual Lisp? Fait simplement la commande "APPLOAD" et sélectionne le lisp à charger. Le charger sous visual peut servir à le débugger, a priori ici il y a un problème de définition de variable locale., mais cela n'empêche pas son execution basique (sans passer par l'éditeur VL.) Personellement j'utilise rarement l'éditeur VL, je suis un dinosaure qui préfère simplement un bon éditeur tel que "UltraEdit" configuré pour la syntaxe Lisp.
-
Y a rien à rajouter, tu as tout compris ;) Bien que l'on pourrait faire une boucle en relançant le 1er script dans le dernier script. Ex dans cercle.scr tu peux rajouter : _.script rectangle&cercle.scr Mais cela vas t'envoyer dans une boucle sans fin que seul 'ESC" pourra interrompre. A moins qu'il y ai une astuce pour éviter cela, mais elle ne me vient pas à l'esprit. Le script est limité car il ne permet pas d'entrée utilisateur ou de controle Avec une version pleine j'avais une astuce avec la fonction Lisp (grread) pour interpreter une entrée. J'ai évoquer cette possibilité dans un post concernant des insertions d'images par script. Mais ça devient de la bidouille (qui peut quand même rendre service)
-
Je donne les info qui me sont retournéees: Kaspersky AV Scanner Fichier dxf2xyz52.ZIP/dxf2xyz13.exe/WISE0004.BIN Infecté par le virus: not-a-virus:Tool.Win32.Reboot Quant à interpréter....
-
Je ne sais pas si c'est grave mais j'ai une une ALERTE VIRALE sur le fichier "dxf2xyz52.ZIP" donné en lien par Sylvain Je vous en fait part au cas où!
-
Il y a bien le site www.3dcafee.com où une bibliothéque 3DStudio est bien founis. Le site n'a plus l'air de répondre (est ce temporaire?) Avec la commande "3DSIN" tu pouvait importer pas mal de modéles 3D. Personellement j'en ai importé très peu donc....
-
Dans : Documentation du développeur ->Visual LISP Developer's Guide ->Appendixes ->AutoLISP Function Synopsis ->Basic Functions ->String-Handling Functions Au fait StripMText ne fonctionne pas? Car il fait ce que tu désire (il enléve toutes les séquences de contrôle d'un MText)
-
Salut, Première chose, tu peux appeler un autre script depuis un script MAIS là la fin de l'exécution de celui ci, il ne reviendras PAS au script appelant. Donc le 1er script ne seras pas continué s'il possède des instruction En illustrant ton exemple cela donnerais (en suppossant que tes fichier .SCR soit enregistrés dans un chemin de recherche d'Autocad) fichier rectangle&cercle.scr _.script rectangle.scr fichier rectangle.scr _.rectang 0.0,0.0 50.0,50.0 _.script cercle.scr fichier cercle.scr _.circle 25.0,25.0 25.0 Est ce que cette forme de script peut te rendre service?
-
Une ligne par son point milieu
bonuscad a répondu à un(e) sujet de Eric dans AutoCAD, liste de souhaits
Il serait bien qu'AutoDesk vienne s'inspirer des idées, car leur développement serait nettement meilleur que le mien. ;) Voir http://www.cadxp.com/sujetXForum-4728.htm pour le souhait En fait il serait mieux d'avoir un copyrigth pour les idées, que pour le code, je suis sur que ca payerais plus, là c'est vraiment pour la gloire :exclam: D'ailleurs c'est pour ça que je laisse mon code sans référence car je trouve ça un peu inutile (j'ai bien reproduit la gomme de Patrick sans pirater son code, qui été compilé d'ailleurs, par contre je lui ai piqué son idée.) -
Bien, on prend les mêmes et on recommence. A la différence des précédentes celle-ci fonctionne en 3D. Cette fonctionnalité ma permis de voir que ma fonction (gr-osmode) était mal écrite pour la 3D. (je modifie les post précédents). Malgré tout il me reste un problème avec cette fonction. Je l'explique pour qu'éventuellement quelqu'un puisse m'aider car je bloque. (le problème n'est que visuel, le résultat est bon) (gr-osmode arg1 arg2) est donc appelé avec pour: arg1 : le point dynamique fourni par (grread) de la fonction principal sous forme de liste (x y z) arg2 : le mode d'accrobj en cours sous forme de chaine de caractère ex: "_end,_int_,_mid" La fonction se charge de vérifier si le point fourni peut éventuellement correspondre à un mode d'accrochage en cours et si oui dessiner le petit symbole en rouge d'accrochage correspondant. (Il faut savoir que (grread) ne répond pas à la variable osmode) (grread) ne pouvant fournir plusieurs entrées, ou alors le code deviendrait plus compliqué, j'ai limité les accroches objets aux plus classiques (osmode <= 512) et abandonner les acrobj par "tracking" . Mon problème est que ces symboles sont mal représentés si je suis en vue cavalière:, variable lièes "VIEWDIR" et "VIEWTWIST". Voilà je n'arrive pas a calculer les coordonnées des petits symboles pour les redressé par rapport à la vue orthogonale de l'écran. Voilà le code (defun gr-osmode (pt-i str-md / n pt md rap pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt56 pt67 pt78 pt85 one_o ) (setq n (/ (cadr (getvar "screensize")) 5.0)) (setq pt (osnap pt-i str-md)) (while (and (eq (strlen (setq md (substr str-md 1 4))) 4) (not one_o) ) (repeat 3 (setq rap (/ (getvar "viewsize") n) pt1 (list (- (car pt) rap) (- (cadr pt) rap) (caddr pt)) pt2 (list (+ (car pt) rap) (- (cadr pt) rap) (caddr pt)) pt3 (list (+ (car pt) rap) (+ (cadr pt) rap) (caddr pt)) pt4 (list (- (car pt) rap) (+ (cadr pt) rap) (caddr pt)) pt5 (list (car pt) (- (cadr pt) rap) (caddr pt)) pt6 (list (+ (car pt) rap) (cadr pt) (caddr pt)) pt7 (list (car pt) (+ (cadr pt) rap) (caddr pt)) pt8 (list (- (car pt) rap) (cadr pt) (caddr pt)) pt56 (polar pt (- (/ pi 4.0)) rap) pt67 (polar pt (/ pi 4.0) rap) pt78 (polar pt (- pi (/ pi 4.0)) rap) pt85 (polar pt (+ pi (/ pi 4.0)) rap) n (- n 16) ) (if (equal (osnap pt-i md) pt) (setq one_o T) ) (cond ((and (eq "_end" md) one_o) (grdraw pt1 pt2 1) (grdraw pt2 pt3 1) (grdraw pt3 pt4 1) (grdraw pt4 pt1 1) ) ((and (eq "_mid" md) one_o) (grdraw pt1 pt2 1) (grdraw pt2 pt7 1) (grdraw pt7 pt1 1) ) ((and (eq "_cen" md) one_o) (grdraw pt5 pt56 1) (grdraw pt56 pt6 1) (grdraw pt6 pt67 1) (grdraw pt67 pt7 1) (grdraw pt7 pt78 1) (grdraw pt78 pt8 1) (grdraw pt8 pt85 1) (grdraw pt85 pt5 1) (grdraw pt5 pt7 7) (grdraw pt6 pt8 7) ) ((and (eq "_nod" md) one_o) (grdraw pt5 pt56 1) (grdraw pt56 pt6 1) (grdraw pt6 pt67 1) (grdraw pt67 pt7 1) (grdraw pt7 pt78 1) (grdraw pt78 pt8 1) (grdraw pt8 pt85 1) (grdraw pt85 pt5 1) (grdraw pt1 pt3 1) (grdraw pt2 pt4 1) ) ((and (eq "_qua" md) one_o) (grdraw pt5 pt6 1) (grdraw pt6 pt7 1) (grdraw pt7 pt8 1) (grdraw pt8 pt5 1) ) ((and (eq "_int" md) one_o) (grdraw pt1 pt3 1) (grdraw pt2 pt4 1) ) ((and (eq "_ins" md) one_o) (grdraw pt5 pt2 1) (grdraw pt2 pt6 1) (grdraw pt6 pt8 1) (grdraw pt8 pt4 1) (grdraw pt4 pt7 1) (grdraw pt7 pt5 1) ) ((and (eq "_per" md) one_o) (grdraw pt1 pt2 1) (grdraw pt1 pt4 1) (grdraw pt8 pt 1) (grdraw pt pt5 1) ) ((and (eq "_tan" md) one_o) (grdraw pt5 pt56 1) (grdraw pt56 pt6 1) (grdraw pt6 pt67 1) (grdraw pt67 pt7 1) (grdraw pt7 pt78 1) (grdraw pt78 pt8 1) (grdraw pt8 pt85 1) (grdraw pt85 pt5 1) (grdraw pt3 pt4 1) ) ((and (eq "_nea" md) one_o) (grdraw pt1 pt2 1) (grdraw pt2 pt4 1) (grdraw pt4 pt3 1) (grdraw pt3 pt1 1) ) ) ) (setq str-md (substr str-md 6) n (/ (cadr (getvar "screensize")) 5.0) ) ) ) (defun c:line_mid (/ o mod ptx loop value key pt_e1 dz pt_e2) (setq o (getvar "osmode")) (if (or (zerop o) (eq (boole 1 o 16384) 16384)) (setq mod "_none") (progn (setq mod "") (mapcar '(lambda (xi xs) (if (not (zerop (boole 1 o xi))) (if (zerop (strlen mod)) (setq mod (strcat mod xs)) (setq mod (strcat mod "," xs)) ) ) ) '(1 2 4 8 16 32 64 128 256 512) '("_end" "_mid" "_cen" "_nod" "_qua" "_int" "_ins" "_per" "_tan" "_nea") ) ) ) (initget 1) (setq ptx (getpoint "\nSpécifiez le milieu de la ligne: ") loop T value "" ) (princ "\nSpécifiez une extrémité de la ligne: ") (while (and (setq key (grread T 4 0)) (/= (car key) 3) loop) (cond ((eq (car key) 5) (setq pt_e1 (cadr key)) (redraw) (if (and (/= mod "_none") (osnap pt_e1 mod)) (progn (gr-osmode pt_e1 mod) (setq pt_e1 (osnap pt_e1 mod)) ) ) (setq dz (- (caddr pt_e1) (caddr ptx)) pt_e2 (polar (list (car ptx) (cadr ptx)) (+ (angle (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) pi ) (distance (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) ) pt_e2 (list (car pt_e2) (cadr pt_e2) (- (caddr ptx) dz)) ) (grdraw pt_e1 pt_e2 7) ) ((or (member key '((2 13) (2 32))) (eq (car key) 25)) (if (null pt_e1) (setq pt_e1 (polar (list (car ptx) (cadr ptx)) (angle '(0.0 0.0) (list (car (getvar "UCSXDIR")) (cadr (getvar "UCSXDIR")) ) ) (getvar "VIEWSIZE") ) ) ) (setq d_z 0.0) (if (and (not (zerop (strlen value))) (or (eq (type (read value)) 'INT) (eq (type (read value)) 'REAL) ) ) (setq pt_e1 (polar (list (car ptx) (cadr ptx)) (angle (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) (read value) ) pt_e2 (polar (list (car ptx) (cadr ptx)) (+ (angle (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) pi ) (distance (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) ) pt_e1 (list (car pt_e1) (cadr pt_e1) (- (caddr ptx) dz)) pt_e2 (list (car pt_e2) (cadr pt_e2) (- (caddr ptx) dz)) loop nil ) ) (princ "\n") ) (T (if (eq (cadr key) 8) (progn (setq value (substr value 1 (1- (strlen value)))) (princ (chr 8)) (princ (chr 32)) ) (setq value (strcat value (chr (cadr key)))) ) (princ (chr (cadr key))) ) ) ) (redraw) (setvar "osmode" 0) (command "_.line" pt_e1 pt_e2 "") (setvar "osmode" o) (setvar "cmdecho" 1) (prin1) )
-
Bon ben 2002 c'est OK (enfin pour moi), 2004 ca vas pas. C'est bien 2004 que tu utilise? Tu peux regarder quand même (pour info) si le fichier "$ordrecalque.txt" a été écrit dans le dossier temporaire de ta machine ("TEMP"). Si oui essaye , après avoir chargé (load"go_ordlay") de taper (go_ordlay) au message commande. Dans ton dessin concerné bien sur. Si non, j'ai pas de suite à donner a ton problème. pour l'instant.
-
Je crois avoir compris ce qui bloque. En fait, je pense que la fautive est la case de dialogue car j'ai essayer de faire fonctionner la routine sans la boite de dialogue et la régénération n'a plus d'incidence sur l'appel de la commande "_draworder". Pour pouvoir utiliser malgré tout la boite de dialogue, c'est quand même plus pratique pour classer, j'ai fait une routine indépendante qui récupère la liste des calques dans un fichier. En tout cas sous 2002 c'est OK, a voir avec les versions supérieures Et ça reste encore en évaluation ... Donc voici les 2 routines lisp, le DCL ne change pas par rapport au précédent. OrdreCalque.lsp (remplace le précédent) (defun ordclqerr (ch) (cond ((eq ch "Function cancelled") nil) ((eq ch "quit / exit abort") nil) ((eq ch "console break") nil) (T (princ ch)) ) (command "_.undo" "_end") (if (<= sv_und 3) (command "_.undo" "_control" "_one")) (command "_.undo" "1") (setq *error* olderr) (setvar "cmdecho" 1) (princ) ) (defun lst2listbox ( lststr lstbox / ) (start_list lstbox) (mapcar 'add_list lststr) (end_list) ) (defun lay_add ( lstlay lstlf / lstnum) (setq lstnum (read (strcat "(" (get_tile "lst_all_lay") ")"))) (foreach num lstnum (if (not (member (nth num lstlay) lstlf)) (setq lstlf (cons (nth num lstlay) lstlf)) ) ) (lst2listbox lstlf "lst_sel_lay") lstlf ) (defun lay_sub ( lstlf / lstnum lstote) (setq lstnum (read (strcat "(" (get_tile "lst_sel_lay") ")"))) (setq lstote (mapcar '(lambda (num) (nth num lstlf)) lstnum)) (foreach layername lstote (setq lstlf (append (reverse (cdr (member layername (reverse lstlf)))) (cdr (member layername lstlf)) ) ) ) (lst2listbox lstlf "lst_sel_lay") lstlf ) (defun makelaylists (/ layname ss cvpname xdlist vpldata sortlist name templist) (if (= (setq tilemode (getvar "tilemode")) 0) (progn (setq ss (ssget "_x" (list (cons 0 "VIEWPORT") (cons 69 (getvar "CVPORT")) ) ) ) (setq cvpname (ssname ss 0)) (setq xdlist (assoc -3 (entget cvpname '("acad")))) (setq vpldata (cdadr xdlist)) ) ) (setq sortlist nil) (setq templist (tblnext "LAYER" T)) (while templist (setq name (cdr (assoc 2 templist))) (setq sortlist (cons name sortlist)) (setq templist (tblnext "LAYER")) ) (if (>= (getvar "maxsort") (length sortlist)) (setq sortlist (acad_strlsort sortlist)) (setq sortlist (reverse sortlist)) ) ) (defun c:ordrecalque ( / sv_und olderr dcl_id lstlay lstlf t_xwt ok_cmd lst_order file_o) (setvar "CMDECHO" 0) (if (<= (setq sv_und (getvar "undoctl")) 3) (command "_.undo" "_control" "_all") ) (command "_.undo" "_group") (setq olderr *error* *error* ordclqerr) (setq dcl_id (load_dialog "ordrecalque.dcl")) (if (new_dialog "ordrecalque" dcl_id) (progn (setq lstlay (makelaylists) lstlf '()) (lst2listbox lstlay "lst_all_lay") (lst2listbox lstlf "lst_sel_lay") (action_tile "pick_add" "(setq lstlf (lay_add lstlay lstlf))") (action_tile "pick_sub" "(setq lstlf (lay_sub lstlf))") (action_tile "xwt_frt" "(setq t_xwt $value)") (action_tile "accept" "(done_dialog 1)") (setq ok_cmd (start_dialog)) (if (= ok_cmd 1) (setq lst_order lstlf) ) ) ) (cond (lst_order (setq file_o (open (strcat (getvar "TEMPPREFIX") "$ordrecalque.txt") "w")) (if t_xwt (write-line "T" file_o) (write-line "nil" file_o)) (foreach n lst_order (write-line n file_o)) (close file_o) ) (T (princ "\nLa commande a échouée.")) ) (command "_.undo" "_end") (if (<= sv_und 3) (command "_.undo" "_control" "_one")) (command "_.undo" "1") (setq *error* olderr) (if (not go_ordlay) (load "go_ordlay.lsp")) (go_ordlay) (setvar "CMDECHO" 1) (princ) ) Et le nouveau go_ordlay.lsp (defun go_ordlay ( / file_o file_ini lay lst_order t_xwt dxf_67 js) (cond ((findfile (setq file_o (strcat (getvar "TEMPPREFIX") "$ordrecalque.txt"))) (setq file_ini (open file_o "r") lst_order (list)) (while (setq lay (read-line file_ini)) (setq lst_order (cons lay lst_order)) ) (if (read (car lst_order)) (setq t_xwt T) (setq t_xwt nil) ) (close file_ini) (if (eq (getvar "CVPORT") 1) (setq dxf_67 '(67 . 1)) (setq dxf_67 '(67 . 0)) ) (while lst_order (setq js (ssget "_X" (list dxf_67 (cons 8 (car lst_order))))) (if (not (null js)) (progn (sssetfirst nil js) (ai_draworder "_front") ) ) (setq lst_order (cdr lst_order)) ) (cond (t_xwt (setq js (ssget "_X" (list dxf_67 '(0 . "WIPEOUT")))) (if (not (null js)) (progn (sssetfirst nil js) (ai_draworder "_front") ) ) (setq js (ssget "_X" (list dxf_67 '(0 . "TEXT")))) (if (not (null js)) (progn (sssetfirst nil js) (ai_draworder "_front") ) ) (setq js (ssget "_X" (list dxf_67 '(0 . "MTEXT")))) (if (not (null js)) (progn (sssetfirst nil js) (ai_draworder "_front") ) ) ) ) ) (T (princ "\nIl n'y a pas de liste de calques.")) ) (prin1) )
-
En effet :mad: J'avais bien dis que c'était une ébauche (Je n'ai pas fait de tests approfondis) Désolé :exclam: En tout cas je ne comprends pas pourquoi tout est perdu après un REGEN. Manuellement la commande "_.draworder" fonctionne et une régénération n'affecte pas le résultat. Tout ce que je sais, c'est que la commande fixe systématiquement la variable "SORTENTS" à 127. J'ai essayé auusi d'appeler la fonction en changeant ma ligne: (command "_.draworder" js "" "_front") par: (progn (sssetfirst nil js) (ai_draworder "_front") ) Mais nibe, que dal Si quelqu'un trouve le pourquoi du comment .....
-
Sylvain, Attention avec tes 2 filtres (ssget "_X" '((62 . 256)))) et (ssget "_X" '((6 . "DUCALQUE")))) car ce type d'information n'est pas forcément présent dans la définition DXF de l'entité. Cela rique de fausser tes résultats. Pour t'en assurer fait un (entget (car (entsel))) sur une entité tracé avec la couleur "Ducalque" et le type de ligne "Ducalque" et tu verras que la liste reournée ne contient aucune information sur le code DXF 62 et 6.
