Aller au contenu

bonuscad

Membres
  • Compteur de contenus

    5 029
  • Inscription

  • Dernière visite

  • Jours gagnés

    56

Tout ce qui a été posté par bonuscad

  1. bonuscad

    encercle texte

    La modification est très simple pour inclure les définitions d'attributs (les codes DXF sont équivalents aux textes). donc pour modifier arround_text, il suffit de modifier (setq js (ssget '((0 . "*TEXT") (-4 . "=") (210 0.0 0.0 1.0))) n -1) en (setq js (ssget '((0 . "*TEXT,ATTDEF") (-4 . "=") (210 0.0 0.0 1.0))) n -1) et ((eq (cdr (assoc 0 dxf_ent)) "TEXT")) en ((or (eq (cdr (assoc 0 dxf_ent)) "TEXT") (eq (cdr (assoc 0 dxf_ent)) "ATTDEF")) De même pour box_text en modifiant ((or (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "TEXT")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTRIB")) ) en ((or (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "TEXT")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTRIB")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTDEF")) ) C'est vrai que l'utilisation de définitions d'attribut en dehors des blocs est surprenante ;)
  2. Que cela ne tienne! :P ((lambda ( / ) (command "_.rectang" "_none" (getvar "vsmin") "_none" (getvar "vsmax")) (command "_.scale" (entlast) "" "_none" (getvar "viewctr") (/ (getvar "viewsize") (- (cadr (getvar "vsmax")) (cadr (getvar "vsmin"))))) ))
  3. Bonjour, Ceci ?? (command "_.rectang" "_none" (getvar "vsmin") "_none" (getvar "vsmax"))
  4. bonuscad

    encercle texte

    J'ai édité le code, cela devrait aller mieux, merci pour le retour. ;) Là, je n'ai pas trop saisi... pourrais tu faire un (entget (car (entsel))) sur le type d'entité que tu voudrais traiter et me coller le retour d'info DXF Si tu veux pouvoir traiter les Attributs dans les bloc, c'est non, autrement il faut reprendre le mode sélection comme fait dans "arround_text". Cependant j'ai commencé à réfléchir à une solution de sélection (objet-unique-imbriqué/objet-multiple/implicite) dont voici une épure, je te laisse chercher (toi ou d'autre) dans cette voie. ((lambda ( / js tmp e_sel js_tmp n) (setq js (ssadd) n -1) (if (setq js_tmp (ssget "_I" '((0 . "*TEXT")))) (repeat (sslength js_tmp) (ssadd (ssname js_tmp (setq n (1+ n))) js) (redraw (ssname js_tmp n) 3) ) ) (princ "\nChoix des MultiTEXTE ou TEXTE: ") (while (or (= 5 (car (setq tmp (grread t 5 2)))) (= 3 (car tmp)) (null js)) (cond ((= 3 (car tmp)) (setq e_sel (nentselp (cadr tmp))) (if e_sel (progn (ssadd (car e_sel) js) (redraw (car e_sel) 3) ) (progn (setq js_tmp (ssget '((0 . "*TEXT"))) n -1) (cond (js_tmp (repeat (sslength js_tmp) (ssadd (ssname js_tmp (setq n (1+ n))) js) (redraw (ssname js_tmp n) 3) ) ) ) ) ) ) ) ) (if js (sssetfirst nil js)) (prin1) ))
  5. Ca c'est OK, mais où est le (close file) ?? Laisser un descripteur de fichier ouvert, surtout un dwg déjà ouvert par Autocad, risque d'engendrer des erreurs de droits d'écriture dans le fichier par la suite, ou même un "crash". "VIOLATION ACCESS" :( Même un enregistrement du fichier risque de provoquer un message du style "le fichier est actuellement utilisé, voulez vous enregistrer vos modification sous...." Enfin des trucs pas catholique.... ;)
  6. bonuscad

    encercle texte

    Essayes le code suivant qui devrait répondre à tes souhaits. Il bosse dans les blocs pour les attributs, mais cela oblige à faire une sélection unique en boucle. Pour l'écart, dans le code, il est fixé à ces lignes (j'ai fais un rapport de 5): ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0) PS: outre le calque, je pompe aussi la couleur et l'épaisseur de trait attribué au texte (defun transpts (apt matrix / ) (list (+ (* (car (nth 0 matrix)) (car apt)) (* (car (nth 1 matrix)) (cadr apt)) (* (car (nth 2 matrix)) (caddr apt)) (cadddr (nth 0 matrix)) ) (+ (* (cadr (nth 0 matrix)) (car apt)) (* (cadr (nth 1 matrix)) (cadr apt)) (* (cadr (nth 2 matrix)) (caddr apt)) (cadddr (nth 1 matrix)) ) (+ (* (caddr (nth 0 matrix)) (car apt)) (* (caddr (nth 1 matrix)) (cadr apt)) (* (caddr (nth 2 matrix)) (caddr apt)) (cadddr (nth 2 matrix)) ) ) ) (defun v_matr (dpt alphax alphay alphaz echx echy echz / ) (list (list (* echx (cos alphaz) (cos alphay)) (- (sin alphaz)) (sin alphay) (car dpt) ) (list (sin alphaz) (* echy (cos alphaz) (cos alphax)) (- (sin alphax)) (cadr dpt) ) (list (- (sin alphay)) (sin alphax) (* echz (cos alphax) (cos alphay)) (caddr dpt) ) (list 0.0 0.0 0.0 1.0) ) ) (defun c:box_text ( / ent_txt dxf_ent ins_point ht_txt lg_box ht_box ang_box pt_just lst_box transform diag_box) (while (null (setq ent_txt (nentsel "\nChoix d'un MultiTEXTE ou TEXTE: ")))) (setq dxf_ent (entget (car ent_txt))) (cond ((and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "MTEXT")) (setq ins_point (cdr (assoc 10 dxf_ent)) ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0) lg_box (cdr (assoc 42 dxf_ent)) ht_box (cdr (assoc 43 dxf_ent)) ang_box (atan (/ (caddr (assoc 11 dxf_ent)) (cadr (assoc 11 dxf_ent)))) pt_just (cdr (assoc 71 dxf_ent)) ) (if (< (cadr (assoc 11 dxf_ent)) 0) (setq ang_box (+ pi ang_box))) (setq lst_box (list (list (- ht_txt) ht_txt 0.0) (list (+ lg_box ht_txt) ht_txt 0.0) (list (+ lg_box ht_txt) (- 0.0 ht_box ht_txt) 0.0) (list (- ht_txt) (- 0.0 ht_box ht_txt) 0.0) ) ) (cond ((eq pt_just 1) (setq transform (v_matr (list 0.0 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 2) (setq transform (v_matr (list (- (/ lg_box 2.0)) 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 3) (setq transform (v_matr (list (- lg_box) 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 4) (setq transform (v_matr (list 0.0 (+ (/ ht_box 2.0)) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 5) (setq transform (v_matr (list (- (/ lg_box 2.0)) (/ ht_box 2.0) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 6) (setq transform (v_matr (list (- lg_box) (/ ht_box 2.0) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 7) (setq transform (v_matr (list 0.0 ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 8) (setq transform (v_matr (list (- (/ lg_box 2.0)) ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 9) (setq transform (v_matr (list (- lg_box) ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ) (setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box)) (setq transform (v_matr ins_point 0.0 0.0 (- ang_box) 1.0 1.0 1.0)) (setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box)) ) ((or (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "TEXT")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTRIB")) ) (setq diag_box (textbox dxf_ent) ins_point (cdr (assoc 10 dxf_ent)) ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0) ang_box (cdr (assoc 50 dxf_ent)) ) (setq lst_box (list (list (- (caar diag_box) ht_txt) (- (cadar diag_box) ht_txt) 0.0) (list (+ (caadr diag_box) ht_txt) (- (cadar diag_box) ht_txt) 0.0) (list (+ (caadr diag_box) ht_txt) (+ (cadadr diag_box) ht_txt) 0.0) (list (- (caar diag_box) ht_txt) (+ (cadadr diag_box) ht_txt) 0.0) ) ) (setq transform (v_matr ins_point 0.0 0.0 (- ang_box) 1.0 1.0 1.0)) (setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box)) ) (T (princ "\nN'est pas un TEXTE/TEXTE MultiLigne, ou non parallèle au SCG.") (setq lst_box nil) ) ) (cond (lst_box (entmake (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (assoc 67 dxf_ent) (assoc 410 dxf_ent) (assoc 8 dxf_ent) (if (assoc 62 dxf_ent) (assoc 62 dxf_ent) (cons 62 256)) (if (assoc 6 dxf_ent) (assoc 6 dxf_ent) (cons 6 "BYLAYER")) (if (assoc 370 dxf_ent) (assoc 370 dxf_ent) (cons 370 -1)) (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) ) (apply 'append (mapcar '(lambda (x10) (list (list 10 (car x10) (cadr x10)) '(42 . 0)) ) lst_box ) ) '((210 0.0 0.0 1.0)) ) ) ) ) (princ) ) [Edité le 8/11/2007 par bonuscad]
  7. Bonjour, Je pense que cela vient de la valeur de la variable "DIMZIN", sa valeur doit être à 8 ou 12 pour produire ce résultat ! Soit tu la fixe avant utilisation du lisp (< 4), soit tu rajoutes quelques lignes de code pour la fixer temporairement dans le lisp et la restorer en fin de procédure (pour ne pas mettre le bazar dans la cotation après une mise à jour...de celle-ci).
  8. bonuscad

    Petit challenge

    Expert n'est pas une commande, mais une variable (qui influe sur certaines commandes) Les variables acceptants d'être entrées directement au clavier sans passer par la commande "MODIFVAR" ("_SETVAR"), ceci pour faire un script le plus condensé possible. et l'aide pointe dessus si tu fais F1 au lieu d'entrer une valeur à la variable expert.
  9. bonuscad

    Petit challenge

    Essayes de passer par la commande "_.saveas" au lieu de "_.qsave". En fait mets au point ton propre script. Tu essayes manuellement tes commandes (mettre "filedia" à 0 pour bien être en situation de script), de façon à pouvoir reproduire la séquence en adaptant le lisp. La pas de solution rapide pour adapter. Ou tourne toi vers des développements de scripts plus poussés qui prévoient ceci.
  10. Transformes (defun c:test () ... en (defun test () ..... et lance ta fonction par (test) et non test, tu verras que dans ce cas le "Commande:" est absent. Donc si l'appel se fait par des menus, pas problème, mais si c'est l'utilisateur qui doit taper la commande, pas cool :(
  11. bonuscad

    Petit challenge

    Pour une gestion facile, je pense que le mieux est d'introduire ce qui suit dans le code. (pas testé) (write-line (strcat "\"" prefix folder "\\" dwg "\"") file_scr) (write-line "_.expert" file_scr) (write-line "2" file_scr) (write-line "_.zoom" file_scr)
  12. bonuscad

    encercle texte

    Je n'avais jamais vue cette question, désolé :( Je viens de tester en copiant directement en ligne de commande, et je n'ai pas de soucis. La commande est "ARROUND_TEXT" Comme il n'y a pas de DCL ou autres fichiers de support, le chemin n'a donc pas d'importance. Comme le Vlisp n'est pas utilisé, il devrait y avoir moins de problème entre les versions d'autocad. En tout cas pour moi entre 2000 à 2005, cela fonctionne, au delà, je ne sais pas.
  13. bonuscad

    Petit challenge

    Le code est pour des dossiers de 1er niveaux (le précédent était de 2 niveaux) (defun c:make_script ( / prefix file_scr folder) (setq prefix (strcat (vl-filename-directory (getfiled "Sélectionner un fichier dessin TEMOIN" "" "dxf" 16)) "\\") file_scr (open (strcat prefix "open_folder.scr") "w") ) (foreach folder (cddr (vl-directory-files prefix nil -1)) (foreach dwg (vl-directory-files (strcat prefix folder "\\") "*.dxf" 1) (write-line "_.open" file_scr) (write-line (strcat "\"" prefix folder "\\" dwg "\"") file_scr) (write-line "_.zoom" file_scr) (write-line "_extent" file_scr) (write-line "_.qsave" file_scr) (write-line "2004" file_scr) (write-line (strcat "\"" "C:\\ELLIONEL\\" folder "\\" (substr dwg 1 (- (strlen dwg) 4)) "\"") file_scr) (write-line "_.close" file_scr) ) ) (close file_scr) (princ (strcat "\Vous pouvez lancer le SCRIPT :" prefix "open_folder.scr")) (prin1) ) La variable: prefix contient le chemin du dossier racine de référence file_scr est le non du fichier script à écrire folder est le/les dossiers trouvé dans le chemin prefix dwg est le dxf trouvé dans chaque dossier j'ai modifié "2000" en "2004" et mis pour exemple "C:\\ELLIONEL\\" en dossier cible. Donc tu devrais pouvoir tester la génération du script en lançant le code. (pour ce faire tu peux directement copier-coller le code en ligne de commande autocad, puis tu tapes MAKE_SCRIPT) NB: avant de lancer le script généré regarde le contenu du fichier open_folder.scr s'il te semble correct et si il peut fonctionner.
  14. bonuscad

    Délimitation arrière

    La seule astuce qui fonctionne (jusqu'à la prochaine régénération) serait un truc de ce genre. Par exemple cacher (temporairement) toute tes entités 2D dans ta fenêtre 3D ((lambda ( / ss n ent) (setq ss (ssget "_X" '( (67 . 0) (-4 . "<OR") (-4 . "*,*,=") (10 0.0 0.0 0.0) (-4 . "*,*,=") (11 0.0 0.0 0.0) (-4 . "*,*,=") (12 0.0 0.0 0.0) (-4 . "*,*,=") (13 0.0 0.0 0.0) (-4 . "OR>") (210 0.0 0.0 1.0) ) ) n -1 ) (cond (ss (repeat (sslength ss) (setq ent (ssname ss (setq n (1+ n)))) (redraw ent 2) ) ) ) )) Pas testé en profondeur. :P
  15. bonuscad

    Petit challenge

    Bonjour, Je viens de faire une chose similaire, transformer du DXF14 en DWG2000. Je devais faire un dossier (vide) avec tous ses sous-dossiers (contenant 1 DXF) 1er niveau seulement! J'ai donc créé un dxf dans mon dossier vide pour qu'il me serve de référence. puis à l'aide de ces quelque lignes, créé un script en pointant mon dxf de référence en ouverture. puis dans la foulée je lance derrière le script généré. Les lignes qui suivent sont a adapter à ton besoin. (dwg 2004) (defun c:make_script ( / prefix file_scr folder under_folder) (setq prefix (strcat (vl-filename-directory (getfiled "Sélectionner un fichier dessin TEMOIN" "" "dxf" 16)) "\\") file_scr (open (strcat prefix "open_folder.scr") "w") ) (foreach folder (cddr (vl-directory-files prefix nil -1)) (foreach under_folder (cddr (vl-directory-files (strcat prefix folder "\\") nil -1)) (foreach dwg (vl-directory-files (strcat prefix folder "\\" under_folder "\\") "*.dxf" 1) ;(print dwg) (write-line "_.open" file_scr) (write-line (strcat "\"" prefix folder "\\" under_folder "\\" dwg "\"") file_scr) (write-line "_.zoom" file_scr) (write-line "_extent" file_scr) (write-line "_.qsave" file_scr) (write-line "2000" file_scr) (write-line (strcat "\"" prefix folder "\\" under_folder "\\" (substr dwg 1 (- (strlen dwg) 4)) "\"") file_scr) (write-line "_.close" file_scr) ) )) (close file_scr) (princ (strcat "\Vous pouvez lancer le SCRIPT :" prefix "open_folder.scr")) (prin1) ) Voilà si ça peut t'aider et si tu as des questions ?....
  16. Salut richard-c Ben, on a chacun ses occupations qui font que ... ;) Un petit commentaire (en francais) sur _:S & _:E S est pour (Single) sélection simple ou 1 seul objet uniquement si tu préfères. E est pour (Everything) Tout objet compris dans la cible de sélection. La combinaison permet de dire que l'on veut un seul objet correspondant au filtre parmi tout les objets contenus dans la cible de sélection. Ce mode est influencé par la variable PICKBOX (taille de la cible de sélection) Bonne journée.
  17. Hé bien la même adaptation que (gile) pour ma première réponse! Copies-colles le code directement en ligne de commande, (recolle en ligne de commande pour refaire un test) ((lambda ( / js) (while (null (setq js (ssget "_:S:E" '((0 . "INSERT") (2 . "point-a") (-4 . "*,*,>") (10 0.0 0.0 0.0)))))) (cdr (assoc 10 (entget (ssname js 0)))) ))
  18. Salut, La seule fois que j'ai rencontré ce problème, c'était sur un traceur HP. Il imprimait des bandes noires lorsqu'une image (lourde) était présente dans le dessin. La mise à jour du Firmware du traceur avait résolu le problème... Je dis ça, vu le peu d'info que tu donnes... Le problème est peut être tout autre.
  19. Et on pourrait "pousser le bouchon un peu plus loin", en utilisant des filtres logiques sur les coordonnées pour écarter les points 2D éventuels.... ((lambda ( / js) (while (null (setq js (ssget "_:S:E" '((0 . "POINT") (-4 . "*,*,>") (10 0.0 0.0 0.0)))))) (cdr (assoc 10 (entget (ssname js 0)))) ))
  20. bonuscad

    Conversion HEX to DEC

    Je ne sais plus où j'ai pu glané ces lignes de code, ni qui est l'auteur.. :( ;;;-----------------------------------------------------------------;;; ;;; Convertion Hexadecimal ---> Decimal ;;; ;;;---------------------------------------------------------- ------- (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 ))) ) ) ) (hexdec "7deb0198") -> 2112553368
  21. bonuscad

    (ssget (getpoint))

    Le mode "Capture" ("_Crossing") de ssget accepte des points confondus donc: (initget 1) (ssget "_C" (setvar "LASTPOINT" (getpoint "\nPoint de sélection: ")) (getvar "LASTPOINT")) devrait fonctionner comme tu l'espère. activer "OSMODE" et y mettre la valeur booléenne 32 auparavant, serait peut être aussi plus fonctionnel.
  22. Dans le 1er message qui a lancé le sujet. Seul l'auteur du fil de discussion peut activer les différentes balises en éditant son message.
  23. Tout à fait :P Alors bien sur, soit on désactive le calque du maillage gênant, soit on améliore le lisp en testant si le point à l'intérieur est vérifié plusieurs fois pour le même jeu de sélection et si oui on calcule le delta z.
  24. Salut Tant que la commande en cours n'est pas achevée, rien n'est inscrit dans la base de donnée d'autocad, tout est en mémoire tampon. Donc un (entget (entlast)) sur une entité en cours d'élaboration n'est pas possible (puisque par encore écrite dans la base). (entlast) est la dernière entité crée complètement. Accéder et lire(et décoder) les mémoire utilisé par Autodesk est une autre paire de manche.... L'avantage avec (entmake), c'est que tu peux avoir toute les définitions, puisque c'est toi qui construit la base de donnée. Mais c'est plus laborieux qu'un command ...
  25. bonuscad

    Ligne brisée pour TN

    En espérant avoir compris ta demande, tu peux essayer le lispRoughen
×
×
  • 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é