Aller au contenu

Copie vers un autre Calque


Messages recommandés

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

(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

Posté(e)

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

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é