Aller au contenu

Cloner dynamiquement un objet


bonuscad

Messages recommandés

Hé oui encore moi avec ce fameux (grread) ;)

 

Ceci pour vous montrer que l'on peut faire une commande pour cloner une entité sans toucher au clavier, rien qu'avec un click

 

Cette commande clone les paramétres: calque, type de ligne, couleur, épaisseur de ligne, échelle du type de ligne

et lance la commande pour créer l'entité qui est sous le curseur.

Le click-gauche verrouille/déverrouille la reconnaissance faite au dernier emplacement du curseur. (pas forcément utile)

Le click-droit lance la commande approprié à l'objet lu sous le curseur ou dernier objet verrouillé par le click-droit

 

NB:L'info du type d'objet (code DXF 0) apparait dans la barre d'état (quand le curseur est positionné dessus) à la place des coordonnées.

 

Bien sur on pourrait encore sophistiquer le lisp, mais le rapport complexité efficacité ne me semble pas mauvais.

Et puis c'est juste un amusement, à moins que certain apprécie à utiliser ce genre de routine?

 

(defun c:dyn_clone ( / sv_shmnu loop key ent dxf_ent nam_bl typ_ent lay_ent lin_ent col_ent wid_ent sct_ent flag tabl_dxf cmd_clone)
(setq
	sv_shmnu (getvar "SHORTCUTMENU")
	loop 0
)
(setvar "SHORTCUTMENU" 11)
(while (and (setq key (grread T 4 0)) (not (member key '((2 13) (2 32)))) (/= (car key) 25))
	(cond
		((and (eq (car key) 3) ent)
			(setq loop (rem (1+ loop) 2))
		)
		(T
			(setq ent (nentselp "" (cadr key)))
		)
	)
	(cond
		((and ent (zerop loop))
			(if (eq (type (car (last ent))) 'ENAME)
				(setq
					dxf_ent (entget (car (last ent)))
					nam_bl (cdr (assoc 2 dxf_ent))
				)
				(setq dxf_ent (entget (car ent)) nam_bl nil)
			)
			(if (eq (cdr (assoc 0 dxf_ent)) "VERTEX")
				(setq dxf_ent (entget (cdr (assoc 330 dxf_ent))))
			)
			(setq
				typ_ent (cdr (assoc 0 dxf_ent))
				lay_ent (cdr (assoc 8 dxf_ent))
				lin_ent (cdr (assoc 6 dxf_ent))
				col_ent (cdr (assoc 62 dxf_ent))
				wid_ent (cdr (assoc 370 dxf_ent))
				sct_ent (cdr (assoc 48 dxf_ent))
			)
			(grtext -2 typ_ent)
		)
	)
)
(cond
	((eq typ_ent "LWPOLYLINE")
		(setq typ_ent "PLINE")
	)
	((eq typ_ent "POLYLINE")
		(setq flag (rem (cdr (assoc 70 dxf_ent)) 128))
		(cond
			((< flag 6)
				(setq typ_ent "PLINE")
			)
			((and (> flag 7) (< flag 14))
				(setq typ_ent "3DPOLY")
			)
			((> flag 15)
				(setq typ_ent "3DMESH")
			)
		)
	)
	((or (eq typ_ent "HATCH") (eq typ_ent "SHAPE"))
		(setq nam_bl (cdr (assoc 2 dxf_ent)))
	)
	((eq typ_ent "DIMENSION")
		(setq nam_bl nil)
		(cond
			((eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 0)
				(setq typ_ent "DIMLINEAR")
			)
			((eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 1)
				(setq typ_ent "DIMALIGNED")
			)
			((or (eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 2) (eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 5))
				(setq typ_ent "DIMANGULAR")
			)
			((eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 3)
				(setq typ_ent "DIMDIAMETER")
			)
			((eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 4)
				(setq typ_ent "DIMRADIUS")
			)
			((or (eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 6) (eq (boole 6 (rem (cdr (assoc 70 dxf_ent)) 128) 32) 70))
				(setq typ_ent "DIMORDINATE")
			)
			(T (setq typ_ent "DIM"))
		)
	)
	((eq typ_ent "VIEWPORT")
		(setq typ_ent "VPORTS")
	)
	((eq typ_ent "3DSOLID")
		(initget 1 "BOîte Sphère CYlindre CÔne BIseau Tore _Box Sphere CYlinder COne Wedge Torus")
		(setq typ_ent (getkword "\n[bOîte/Sphère/CYlindre/CÔne/BIseau/Tore]: "))
	)
)
(grtext -2 "")
(setvar "SHORTCUTMENU" sv_shmnu)
(cond
	(typ_ent
		(setvar "clayer" lay_ent)
		(if lin_ent (setvar "celtype" lin_ent) (setvar "celtype" "ByLayer"))
		(if col_ent (setvar "cecolor" (itoa col_ent)) (setvar "cecolor" "256"))
		(if wid_ent (setvar "celweight" wid_ent) (setvar "celweight" -1))
		(if sct_ent (setvar "celtscale" sct_ent) (setvar "celtscale" 1.0))
		(setq cmd_clone (strcat "_." typ_ent))
		(if nam_bl
			(progn
				(if (and (setq tabl_dxf (tblsearch "BLOCK" nam_bl)) (eq (boole 1 (cdr (assoc 70 tabl_dxf)) 4) 4))
					(command "_.-XREF" "_attach" nam_bl)
					(command cmd_clone nam_bl)
				)
			)
			(command cmd_clone)
		)
	)
	(T (prin1))
)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

hello,

 

Bonuscad, dis moi il est bien ton lisp, mais j'ai un petit soucis,

pourquoi je réussi a cloner une entité qui se trouve sur un calque vérrouillé :casstet:

est ce normal??

 

Tiens, , ca me rappelle un truc ...!

Tramber, moi aussi ça me rappelle un fameux Autospeed, je prère la version de Bonuscad avec la source qui est plus instructive

 

 

 

Laurent Falla

Venez visiter mon site, c' est gratuit :)

http://www.lfaconsulting.com'>

Lien vers le commentaire
Partager sur d’autres sites

avec la source qui est plus instructive

 

Moi j'ai pu apprendre grâce aux sources d'autres concepteurs.

Celles qui m'ont permis de décoller rapidement en lisp étaient les SOURCES d'une application payante.

UniTab III pour AutoCad V10 (les dinosaures se rapelleront peut être!)

 

Il me semble essentiel pour moi de livrer ses sources pour de petites applications, de cette manière les plus passionnés pourront progresser (même pour les plus désargentés, ce qui n'est pas rare dans notre profession de DAO voir la discussion sur les salaires) :mad:

 

Et je trouve que ce sont les utilisateurs qui sont le plus à même de personnaliser cet formidable outil qu'est AutoCad. On connait nos besoins, ce qui n'est pas forcément le cas de développeurs payé pour fabriquer un produit, par contre nous n'avons pas ou peu la culture et le temps pour faire ce genre de chose. Y a pas comme un HIC ???

 

Concernant la routine, elle ne modifie pas une entité existante sur un calque verrouilé (ce qui serait refusé), mais pompe les infos pour en créer une nouvelle, ce qui n'est pas incompatible avec un calque verrouillé.

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

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é