Aller au contenu

Contrôle sur la commande DECALER


bonuscad

Messages recommandés

Bonjour à tous

 

Est-il possible de savoir par un quelconque moyen, le succés de l'achèvement d'une commande.

Ici, il s'agirait de la commande décaler. Je voudrais savoir si l'objet a put être décalé.

Ce problème se pose pour des arcs (ou autre courbe: ellipse, spline) décalés vers le centre.

Ces renseignements me seraient utile pour essayer de finaliser une routine lisp dont en voici une ébauche.

Bien que la routine n'avorte pas dans ce cas précis, je voudrait que ma variable dis_off ne soit pas incrémenté.

Comme d'hab. elle utilise (grread) ;)

 

Merci

 

(defun draw_pt (pt / pt1 pt2 pt3 pt4)
(setq
	rap (/ (getvar "viewsize") 50)
	pt1 (list (+ (car pt) rap) (+ (cadr pt) rap))
	pt2 (list (+ (car pt) rap) (- (cadr pt) rap))
	pt3 (list (- (car pt) rap) (- (cadr pt) rap))
	pt4 (list (- (car pt) rap) (+ (cadr pt) rap))
)
(grdraw pt pt1 -1)
(grdraw pt pt2 -1)
(grdraw pt pt3 -1)
(grdraw pt pt4 -1)
)
(defun c:dyn_offset ( / sel_ent pt_sel e_sel dis_off borne loop sav_osm key pt)
(while (null (setq sel_ent (entsel "\nChoix de l'objet à décaler: "))))
(setq
	pt_sel (cadr sel_ent)
	e_sel (car sel_ent)
	borne (entlast)
	loop T
	sav_osm (getvar "osmode")
)
(if (< (getvar "offsetdist") 0.0) (initget 7) (initget 6))
(setq dis_off (getdist (strcat "\nDistance de décalage<" (rtos (getvar "offsetdist")) ">: ")))
(if (not dis_off) (setq dis_off (getvar "offsetdist")) (setvar "offsetdist" dis_off))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(while (and (setq key (grread T 4 0)) (/= (car key) 3) loop)
	(cond
		((eq (car key) 5)
			(setq pt (cadr key))
			(draw_pt pt_sel)
			(cond
				((>= (distance pt_sel pt) dis_off)
					(command "_.offset" "" sel_ent pt "")

;;ICI je voudrais savoir si la commande a pu se réaliser

					(setq
						sel_ent (entlast)
						dis_off (+ dis_off (getvar "offsetdist"))
					)
				)
				((and
					(< (distance pt_sel pt) dis_off)
					(> (distance pt_sel pt) 0.0)
					(not (eq (entlast) borne))
					(not (eq (entlast) e_sel))
				 )
					(entdel sel_ent)
					(setq
						sel_ent (entlast)
						dis_off (- dis_off (getvar "offsetdist"))
					)
				)
			)
		)
		((or (member key '((2 13) (2 32))) (eq (car key) 25)) (setq loop nil))
	)
)
(redraw)
(setvar "osmode" sav_osm)
(setvar "cmdecho" 1)
(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

Salut Bonus

 

Le plus simple avec une comparaison par (entlast) du style

(setq der (entlast))
(ma_routine)
(if (eq (entlast) der)
 (princ "\nCa ne s'est pas bien passé :-(")
 (princ "\nCommande réussie :-)")
)
(princ)

 

Ou encore par les réacteurs avec :vlr-commandEnded pour vérifier que la commande s'est bien déroulée, mais ça ne veux pas dire que la commande decaler a créé une nouvelle entité. Tout dépend à quel niveau tu souhaites faire ton analyse d'erreur

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Salut Patrick

 

J'ai posé ma question un peu trop vite, dans ma tête je pensais trouver la réponse dans ERRNO ou une fonction comme (bherr) mais en fait; après une illumination, j'en suis arrivé au même raisonnement que toi (par entlast).

Malgré t'avoir lu après, je te remercie de ta réponse qui a confirmé ma démarche.

 

Pour ceux que ça interesseraient, voici le code plus abouti.

Celui permet un décalage répétitif d'un objet sans faire d'innombrables clicks, il suffit juste de glisser le curseur et de clicker ou entrée pour achever le décalage à l'endroit voulu.

Cela peut être pratique pour faire les lignes et colonnes d'un tableau.

 

(defun draw_pt (pt / pt1 pt2 pt3 pt4)
(setq
	rap (/ (getvar "viewsize") 50)
	pt1 (list (+ (car pt) rap) (+ (cadr pt) rap))
	pt2 (list (+ (car pt) rap) (- (cadr pt) rap))
	pt3 (list (- (car pt) rap) (- (cadr pt) rap))
	pt4 (list (- (car pt) rap) (+ (cadr pt) rap))
)
(grdraw pt pt1 -1)
(grdraw pt pt2 -1)
(grdraw pt pt3 -1)
(grdraw pt pt4 -1)
)
(defun c:dyn_offset ( / sel_ent pt_sel e_sel dxf_ent e_mark e_borne loop sav_osm dis_off key pt)
(while (null (setq sel_ent (entsel "\nChoix de l'objet à décaler: "))))
(setq
	pt_sel (osnap (cadr sel_ent) "_near")
	e_sel (car sel_ent)
	dxf_ent (entget e_sel)
	e_mark e_sel
	e_borne (entlast)
	loop T
	sav_osm (getvar "osmode")
)
(cond
	((and
		(member (cdr (assoc 0 dxf_ent)) '("LWPOLYLINE" "POLYLINE" "LINE" "XLINE" "RAY" "ARC" "CIRCLE" "ELLIPSE" "SPLINE"))
		(if (cdr (assoc 70 dxf_ent))
			(< (rem (cdr (assoc 70 dxf_ent)) 128) 8)
			T
		)
	 )
		(if (< (getvar "offsetdist") 0.0) (initget 7) (initget 6))
		(setq dis_off (getdist (strcat "\nDistance de décalage<" (rtos (getvar "offsetdist")) ">: ")))
		(if (not dis_off) (setq dis_off (getvar "offsetdist")) (setvar "offsetdist" dis_off))
		(setvar "cmdecho" 0)
		(setvar "osmode" 0)
		(while (and (setq key (grread T 4 0)) (/= (car key) 3) loop)
			(cond
				((eq (car key) 5)
					(setq pt (cadr key))
					(draw_pt pt_sel)
					(cond
						((>= (distance pt_sel pt) dis_off)
							(command "_.offset" "" e_sel pt "")
							(if (not (eq (entlast) e_sel))
								(setq
									e_sel (entlast)
									dis_off (+ dis_off (getvar "offsetdist"))
								)
							)
						)
						((and
							(< (distance pt_sel pt) (- dis_off (getvar "offsetdist")))
							(> (distance pt_sel pt) 0.0)
							(not (eq e_mark e_sel))
				 		)
							(entdel e_sel)
							(if (eq e_borne (entlast))
								(setq e_sel (car sel_ent))
								(setq e_sel (entlast))
							)
							(setq dis_off (- dis_off (getvar "offsetdist")))
						)
					)
				)
				((or (member key '((2 13) (2 32))) (eq (car key) 25)) (setq loop nil))
			)
		)
		(redraw)
		(setvar "osmode" sav_osm)
		(setvar "cmdecho" 1)
	)
	(T (princ "\nL'objet ne peut pas être décalé."))
)
(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

après une illumination

Il faut bosser en électricité, on a plein d'ampoules ;)

 

Juste deux/trois remarques si tu le permets Bonus

1) Ton lisp n'accepte pas la le clic droit de la souris (entrée)

2) Si je bascule une première fois vers la droite (vive grread) et que je vais ensuite sur la gauche, il me reste des lignes sur la droite de celle d'origine

3) La commande réseau est très pratique, mais ton lisp à l'avantage d'être plus visuel

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Sous 2002, click droit ou gauche fonctionnent indifféremment :casstet:

 

Lorque tu bascule d'un coté à l'autre de la ligne, il faut que le curseur passe par le point de sélection de l'objet. Une croix virtuelle est dessinée pour te rappeler là où il se trouve!

 

La distance est calculée par rapport à ce point, se déplacer en conséquence... ;)

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

Sous 2002, click droit ou gauche fonctionnent indifféremment

Apparemment pas sous la 2000, il n'en veut pas

 

Une croix virtuelle est dessinée pour te rappeler là où il se trouve!

Ce qui est bien pratique

 

La distance est calculée par rapport à ce point, se déplacer en conséquence...

J'avais bien compris, mais il me reste des traits, surtout quand je bascule de droite à gauche et en plus, je viens de constater qu'il y a des traits qui se superposent. Après réflexion, ça ma parait logique vu qu'il n'efface pas tout

 

 

Ps : je remet les espaces où il faut dans ton lisp et je regarde de plus près

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Tu dois avoir une souris avec plein de bouton ;)

 

avec la ligne suivante pour tester les codes retournés

(while (and (setq key (grread T 4 0)) (not (member key '((2 13) (2 32))))) (print key))

 

Sous 2002 avec une souris 2 boutons et molette (d'ailleurs la molette n'est pas pris en charge par grread)

j'ai pour :

ckick gauche: (3 (x y z)) et CTRL+click gauche (3 (x y z))

click droit (25 n) et CTRL+Click droit (11 n) (12 (x y z)) (5 (x y z)) (25 n)

 

Je pense que si on utilise une souris ou une tablette avec un nombre de boutons plus important le code de (grread) serait encore différent suivant comment ceux-ci sont affectés.

 

Ha, je viens de trouver en rédigeant, la variable "SHORTCUTMENU" a une incidence sur l'interprétation des boutons (logique!)

Ben volilà plus rien à ajouter, a part de faire le controle de cette variable dans la routine si on veut qu'elle reste homogème.

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

avec la ligne suivante pour tester les codes retournés

(while (and (setq key (grread T 4 0)) (not (member key '((2 13) (2 32))))) (print key))

 

Les grands esprits se rejoignent :cool:

 

un clic droit me retourne (11 0)

un shift+clic droit (11 1000)

et un crtl+clic droit (11 2000)

 

Et j'ai compris pourquoi tout ne s'efface pas en bougeant le curseur de la souris

Je trace un trait en ortho (ex 0,0 à 0,30) et si je bouge ma souris entre les y 0 et 30, ça fonctionne correctement. Par contre, si je bouge en y < 0 ou en y > 30, là tout ne s'efface pas correctement :o

 

@+

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

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é