BIM G CO Posté(e) le 23 novembre 2006 Posté(e) le 23 novembre 2006 Un code qui a le droit d'exister : (defun c:COPYFOL (/ v1 v2 v3) (setq v1 (getstring "\nNumero du folio destination: ")) (if (tblsearch "layer" v1) (progn (setq v2 (entsel (strcat "Bloc à copier vers le folio " v1 ":"))) (if v2 (setq v2 (car v2)) (exit)) [b](command "_COPY" v2 "" (list 0.0 0.0) (list 0.0 0.0))[/b] (setq v3 (entlast)) (if v3 (setq v3 (entget v3)) (exit)) (if (numberp v1) (setq v1 (itoa v1))) (setq v3 (subst (cons 8 v1) (assoc 8 v3) v3)) (entmod v3)))(princ)) ce code copie (en superposant) l'élément sélectionner : Je m'en sers pour mon éditeur de Pages de schéma électrique. Malgré cette command en gras pour laquelle je butte! (pas moyen de trouver une parade pour copier n'importe quel éléments : groupes, blocs, cotations etc...) Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
Patrick_35 Posté(e) le 23 novembre 2006 Posté(e) le 23 novembre 2006 Je ne comprends pas.A lire le code, cela me parait correcte et je ne vois pas pourquoi tu ne peux copier que des blocs. Pour moi, ta copie fonctionne sur n'importe quelle entité @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 23 novembre 2006 Posté(e) le 23 novembre 2006 Salut, Si tu veux éviter le (command ...), tu peux faire directement un (entmake ...) avec la liste entget de l'objet sélectionné dans laquelle le calque est changé. (defun c:COPYFOL (/ v1 v2 v3) (setq v1 (getstring "\nNumero du folio destination: ")) (if (tblsearch "layer" v1) (progn (setq v2 (entsel (strcat "Bloc à copier vers le folio " v1 ":"))) (if v2 (setq v2 (car v2)) (exit) ) (if (numberp v1) (setq v1 (itoa v1)) ) [b](entmake (subst (cons 8 v1) (assoc 8 (entget v2)) (entget v2)))[/b] ) ) (princ) ) On peut même faire plus concis, en utilisant (and ...) si une des expressions retourne nil, la routine s'arrête (defun c:COPYFOL (/ v1 v2) (and (setq v1 (getstring "\nNumero du folio destination: ")) (tblsearch "layer" v1) (setq v2 (car (entsel (strcat "Bloc à copier vers le folio " v1 ":")))) (entmake (subst (cons 8 v1) (assoc 8 (entget v2)) (entget v2))) ) (princ) ) [Edité le 23/11/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 23 novembre 2006 Posté(e) le 23 novembre 2006 (entmake) est intéressant car on peut directement mettre la copie dans un nouveau calque, mais il faut traiter les "INSERT" et les anciennes "POLYLINE" On pourrait faire ceci: (defun Entsel_Getstring ( / ent key kstr) (setq kstr nil ent "") (princ "\nSélectionnez un objet / Entrez un nom de calque: ") (while (and (not (equal (setq key (grread T 4 2)) '(2 13))) (/= (car key) 3)) (if (eq (car key) 2) (if (eq (cadr key) 8) (progn (princ (chr 8)) (princ (chr 32)) (princ (chr 8)) (setq kstr (cdr kstr)) ) (progn (setq kstr (cons (cadr key) kstr)) (princ (chr (cadr key))) ) ) ) ) (if (eq (car key) 3) (if (setq ent (nentselp (cadr key))) (setq ent (cdr (assoc 8 (entget (car ent))))) (progn (princ "\nSélection vide!") (setq ent nil) (entsel_getstring)) ) (progn (foreach n kstr (setq ent (strcat (chr n) ent))) (if (or (eq ent "") (wcmatch ent "*[<>`?`,;:/`*\"|``\\=]*")) (progn (princ "\nEntrée invalide!") (entsel_getstring)) ent ) ) ) ) (defun c:dupliquer ( / to_lay js dxf_ent n dxf_nent) (setq js (ssget)) (cond (js (setq nam_lay (entsel_getstring)) (setq n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (setq dxf_ent (subst (cons 8 nam_lay) (assoc 8 dxf_ent) dxf_ent)) (entmake dxf_ent) (if (member (cdr (assoc 0 dxf_ent)) '("INSERT" "POLYLINE")) (progn (setq dxf_nent (entget (entnext (cdar dxf_ent)))) (while (/= (cdr (assoc 0 dxf_nent)) "SEQEND") (setq dxf_nent (subst (cons 8 nam_lay) (assoc 8 dxf_nent) dxf_nent)) (entmake dxf_nent) (setq dxf_nent (entget (entnext (cdar dxf_nent)))) ) (entmake dxf_nent) ) ) ) (princ (strcat "\n" (itoa (1+ n)) " objet(s) dupliqué(s) sur le calque \"" nam_lay "\"")) ) ) (prin1) ) (entsel_getstring) n'est pas nécessaire, je l'ai rajouté pour le confort d'utilisation pour la saisie du nom du calque.D'ailleurs si on pointe un bloc pour la référence du calque, c'est le calque de la sous-entité qui est récupéré. Inconvénient de (nentselp) :( Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 24 novembre 2006 Posté(e) le 24 novembre 2006 Bien vu Bonuccad, dans mon enthousiasme, j'ai oublié les entités complexes (il s'agissait pourtant de blocs au départ) :P Une autre façon, donc, en VisualLISP : (defun c:COPYFOL (/ v1 v2 v3) (vl-load-com) (and (setq v1 (getstring "\nNumero du folio destination: ")) (tblsearch "layer" v1) (setq v2 (car (entsel (strcat "Bloc à copier vers le folio " v1 ":")))) (setq v3 (vla-Copy (vlax-ename->vla-object v2))) (vla-put-Layer v3 v1) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
BIM G CO Posté(e) le 24 novembre 2006 Auteur Posté(e) le 24 novembre 2006 hum VLA-Copy et voilou la bonne idée :) ;) Patrick_35 ce code marche mais si AutoDesk change le fonctionnement de la command "_Copy" je serais obligé de revoir le code à chaque changement de version (tous les ans quoi). (gile) tu as vu là où je ne peux voir. Merci à bonuscad qui me donne encore un code permettant de revoir un large panel des codes VisualLisp (que je ne perde pas la main). C'est le projeteur électrique qui sera heureux ce matin. [Edité le 24/11/2006 par Maximilien] Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
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