Aller au contenu

ucsfollow et modifbloc (bedit)


Messages recommandés

Posté(e)

Bonjour,

Après une modification de bloc si ucsfollow est à 1, la fermeture de l'éditeur de bloc entraîne un retour au point 0.0. Problème connu d'Autodesk:

zoom avant après bclose

Voici un lisp qui m'a permis d'utiliser les réacteurs : Si ucsfollow à 1 = mise à 0 de ucsfollow automatique à l'ouverture de l'éditeur de bloc et mise à 1 de ucsfollow à la fermeture de l'éditeur de bloc.

(defun c:ucs1 () (kd:ucsfollow T)) ;;activation manuelle
(defun c:ucs0 () (kd:ucsfollow nil)) ;;désactivation manuelle

(defun kd:ucsfollow ( on )  

  ;;nettoyage des réacteurs
  (foreach grp (vlr-reactors :vlr-command-reactor)
    (foreach obj (cdr grp)
      (if (= "kd:ucsfollow" (vlr-data obj))
	(vlr-remove obj)
	)
      )
    )
  
  (or (and on
	   (vlr-command-reactor "kd:ucsfollow"
	     '(
	       (:vlr-commandwillstart . kd:ucs_off)
	       (:vlr-commandended     . kd:ucs_on)
	       (:vlr-commandcancelled . kd:ucs_on)
	       (:vlr-commandfailed    . kd:ucs_on)
	       )	     
	     )
	   (princ "\nreacteur ucsfollow sur bedit actif")
	   )
      (princ "\nreacteur ucsfollow sur bedit inactif")
      )
  (princ)
  )

;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun kd:ucs_off (reac arg )

  (if (and (wcmatch (car arg) "BEDIT,-BEDIT,BCLOSE")
	   (= 1 (getvar "ucsfollow"))
	   )
    (progn
      (setq *ucsfollow* T)
      (setvar "ucsfollow" 0)
      )    
    )
  (princ)
  )

;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
(defun kd:ucs_on (reac arg)  
  (if (and *ucsfollow*
	   (= (getvar "UCSFOLLOW") 0)
	   (wcmatch (car arg) "BEDIT,-BEDIT,BCLOSE")
	   )
    (setvar "UCSFOLLOW" 1)
    )  
  (setq *ucsfollow* nil)
  (princ)
  )
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;execution auto au lancement
;;à intégrer à acaddoc si existe,
;|((lambda ( ) (vl-load-com)
   (if (= 'list (type s::startup))
     (if (not (member '(kd:ucsfollow t) s::startup))
       (setq s::startup (append s::startup '((kd:ucsfollow t))))
       )
     (defun-q s::startup nil (kd:ucsfollow t))
     )
   (princ)
   )
  )|;

 

Posté(e)

Coucou,

Personnellement je ne travaille pas avec UCSFOLLOW car j'utilise très régulièrement la routine de @didier (merci à toi btw, cette routine est géniale !)

(defun c:RP2 (/ h ce)

	(setvar "CMDECHO" 0)
	(setq h (getvar "VIEWSIZE"))
	(setq ce (trans (getvar "VIEWCTR") 1 0))
	(command "_PLAN" "")
	(command "_ZOOM" "C" (trans ce 0 1) h)
	(princ)

)

Honnêtement je trouve l'utilisation d'UCSFOLLOW extrêmement énervante et frustrante car elle manque de logique. AutoCAD ferait mieux de copier le fonctionnement de RP2 pour UCSFOLLOW = 1 car cela ferait bien plus de sens à mes yeux. Donc pour utiliser cette commande il faut bien sûr avoir UCSFOLLOW = 0 et lorsque tu changes de SCU tu cliques/tapes la commande pour conserver ton état de zoom actuel pour "pivoter" le dessin.

Bisous,
Luna

  • Like 1
Posté(e)

Je me sers également de la routine de Didier (merci au passage pour ton site qui m'a servi et me sert encore  a mieux comprendre le langage) avec le lisp suivant pour changer de lisp (j'ai toujours la variable ucsfollow à 1 pour que d'autres puissent basculer les scu avec l'icone). Cela me permet de créer un menu déroulant reprenant la liste des mes scu et de valider par le chiffre devant le nom du scu. La bascule me permettant de rester au même endroit avec le même zoom.

;;changer le scu
(defun c:90 ( / *error* dyn ucs lst i lst2 a b c h )
   (defun *error* (msg)
     (if dyn (setvar "DYNMODE" dyn))
     (if ucs (setvar "UCSFOLLOW" ucs))
     
    (if (or (= msg "Fonction annulée")
	    (= msg "quitter / sortir abandon")
	    )
      (princ)
      (princ (strcat "\nErreur: " msg))
      )
    )   
  (vl-load-com);charge le support ActiveX Vlisp
  (setq dyn (getvar "DYNMODE")
	ucs (getvar "UCSFOLLOW")
	)  
  (setvar "DYNMODE" 3)
  (setvar "UCSFOLLOW" 1)
  (vlax-for n (vla-get-usercoordinatesystems (vla-get-activedocument (vlax-get-acad-object)))
    (setq lst (append lst (list (vla-get-name n))))
   )
  (setq lst (acad_strlsort (append (list "_SCG") lst))
	c (trans (getvar "viewctr") 1 0) ;;stocker centre de la vue en SCG
	h (getvar "viewsize") ;;stocker hauteur d'affichage
	i 0)
  (foreach n lst
    (setq n (strcat (itoa (setq i (1+ i))) " " n);; concatène chiffre " " et nom du scu
	  lst2 (cons n lst2);; crée la liste avec chiffre en préfixe
	  )
    );;fin de foreach
  (setq lst2 (reverse lst2))
  (initget 6)  
  (or (setq a (getint
		(strcat "choix du scu"
			" ["  (lst2str lst2 "/")  "] <"
			(nth 0 lst2)
			">")))
      (setq a (atoi;;convertit en entier
		(substr (nth 0 lst2)
			1;;début de la chaîne
			(vl-string-position (ascii " ") (nth 0 lst2));;position de " "
			)))
      )
  (foreach n lst2
    (if (= a;;si chiffre =
	   (atoi (substr n 1 (vl-string-position (ascii " ") n))));;chiffre de l'élément
      (setq b (substr n (+ 2 (vl-string-position (ascii " ") n)));;crée le nom du calque choisi
	    )))
  (and b
       (if (= b "_SCG")
	 (progn
	   (command "_ucs" "_world"); passer au scg
	   (command "_ZOOM" "_C" c h)
	   )
	 (progn
	   (command "_ucs" "_Named" "R" b)
	   (command "_ZOOM" "_C" (trans c 0 1) h)
	   )	  
	 )
       )
  (setvar "DYNMODE" dyn)  
  (setvar "UCSFOLLOW" ucs)
  (princ)
  )

 

Posté(e)

Coucou @Luna @eklundh80

Merci de ces remerciements !

Quand on voit comment c'est écrit il n'y a pas de quoi être fier, ça doit être une de mes premières routines, il y a quelques décennies.
Je me souviens aussi après l'avoir postée, ici je crois, que l'accueil fût pour le moins "tempéré", les commentaires semblaient exprimer l'inutilité de cette routine.

Aujourd'hui je suis revenu en grâce donc.

Amicalement

Posté(e)

Coucou @didier,

C'est justement les routines simples et répétitives qui sont les plus utiles au quotidien ! Et c'est justement parce qu'en retrouvant le post d'origine j'ai vu que ta routine n'avait pas reçu les éloges adéquats alors j'ai préféré prendre la peine de te donner un avis positif (parce qu'on le veuille ou non, chat fait toujours plaisir les retours positifs !) 😉

Bisous,
Luna

  • 1 an après...
Posté(e)

Bonjour,

@Luna@didier, est-il possible de revenir sur cette commande et expliquer son utilité ?

Après recherche dans leforum, je n'ai pas trouvé ou mal cherché, le poste.

  Effectivement, je cherchais une commande qui passait toutes les fenetres espace papier en espace papier ucsfollow = 0, et je suis tombé ici.

Merci de votre compréhension et temps,

bonne journée,

Le 04/11/2021 à 09:38, Luna a dit :
(defun c:RP2 (/ h ce)

	(setvar "CMDECHO" 0)
	(setq h (getvar "VIEWSIZE"))
	(setq ce (trans (getvar "VIEWCTR") 1 0))
	(command "_PLAN" "")
	(command "_ZOOM" "C" (trans ce 0 1) h)
	(princ)

)

 

Posté(e)

Coucou @drault,

La routine de @didier ci-dessus permet de conserver le zoom actuel lors d'un changement de SCU. Car actuellement le fonctionnement d'AutoCAD veut que avec UCSFOLLOW = 1, un changement de SCU applique automatiquement une rotation du dessin pour aligner les axes X, Y, Z aux axes horizontal, vertical, altitude mais cela effectue également un ZOOMTOUT (affichant l'origine SCG du dessin), posant ainsi de très gros problème lors de plans géolocalisés ou tout simplement lorsqu'on travail en détail et que l'on change le SCU momentanément pour mieux tracer un détail. Ce programme nécessite donc d'avoir UCSFOLLOW = 0, dissociant ainsi le changement de SCU avec la "rotation" du dessin mais à mes yeux, c'est tout bonnement un must have car il est primordial de conserver l'état de zoom actuel lorsqu'on dessine :3

Concernant ta demande pour le changement du UCSFOLLOW, tu peux te baser sur ce programme que j'avais fait pour modifier/harmoniser la valeur de PSLTSCALE sur l'ensemble des onglets de présentations :

Car comme PSLTSCALE, la variable UCSFOLLOW est indépendante pour chaque présentation. Cependant cela ne modifiera pas la valeur de UCSFOLLOW pour les fenêtres de présentations affichant l'espace objet. Si cela doit également être modifié, je verrais ce que je peux faire.

Bisous,
Luna

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é