Aller au contenu

Changer le SCU sans changer de zoom


Messages recommandés

Posté(e)

Bonjour,

 

J'aimerais améliorer une routine (ci-dessous) qui me permet de changer de SCU avec rotation de l'affichage, et de retrouver un cadrage sur la zone où je travaillais avec le même facteur de zoom.

Problème : l'affichage passe fugitivement par un zoom étendu. Comment faire pour éviter cet affichage intermédiaire inutile ?

 

Merci !

 

 

(defun c:ui ()
 (setvar "cmdecho" 0)
 (setq h (getvar "viewsize"))
 (setq ce (trans (getvar "viewctr") 1 0))
 (command "_ucs" "_n" "_z" "-90")
 (command "_plan" "")
 (command "_zoom" "_c" (trans ce 0 1) h)
 (princ)
) 

Posté(e)

Hello,

 

En mettant USCFOLLOW à 0, sinon, je ne vois pas.

 

Bonne journée.

Seuls nous allons vite, ensemble nous allons plus loin...

CPU Intel 3,5Go / Nvidia RTX-3090

AutoCad (Architecture) 2022 - Lumion PRO

BMW R-1200-RT, c'est moche, oui... je sais...

 

www.neda.ch

Posté(e)

Salut,

 

Je ne pense pas que UCSFOLLOW y soit pour quoi que ce soit, c'est la commande REPERE (_PLAN) qui fait systématiquement un zoom étendu.

 

Une autre solution, sans modifier le SCU, juste en basculant la vue avec la commande VUEDYN (_DVIEW)

 

(defun c:ui ()
 (command "_.dview" "_all" "" "_twist" (angtos (- (getvar 'viewtwist) (/ pi 2.))) "")
 (princ)
)

 

Et si basculer le SCU est aussi nécessaire, on peut le faire a posteriori avec l'option Vue (_View) de la commande SCU (_UCS).

 

(defun c:ui ()
 (command "_.dview" "_all" "" "_twist" (angtos (- (getvar 'viewtwist) (/ pi 2.))) "")
 (command "_.ucs" "_view")
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Au temps pour moi, merci (gile).

 

Je n'avais clairement pas compris la demande.

 

Une fois de plus, je ferais mieux d'apprendre à fermer ma gueu.., surtout lorsque l'on ne me demande rien ! :D

 

Bonne ;)

Seuls nous allons vite, ensemble nous allons plus loin...

CPU Intel 3,5Go / Nvidia RTX-3090

AutoCad (Architecture) 2022 - Lumion PRO

BMW R-1200-RT, c'est moche, oui... je sais...

 

www.neda.ch

Posté(e)

Bonjour,

 

Merci à tous les 2 pour votre contribution.

 

@dinosor : si, si, je demandais quelquechose ;o)

 

@gile : j'ai testé ton code. J'obtiens bien une rotation, mais pas à 90° comme souhaité (je dirais ≈ 92° ?!), et l'affichage ne reste pas centré sur le même point qu'avant l'exécution du LISP... (avec UCSFOLLOW = 0 ou = 1 c'est pareil).

 

Il n'y a pas dans AutoLisp la possibilité de ne pas recalculer l'affichage pendant certaines instructions, comme en VBA on a : Application.ScreenUpdating=False ) ?

Posté(e)
@gile : j'ai testé ton code. J'obtiens bien une rotation, mais pas à 90° comme souhaité (je dirais ≈ 92° ?!), et l'affichage ne reste pas centré sur le même point qu'avant l'exécution du LISP...

J'en suis fort étonné, l'option Basculer (_Twist) de la commande VUEDYN (_DVIEW) utilise le centre de la vue (variable système VIEWCTR) comme pivot et bascule la vue de manière à ce que la valeur entrée soit celle retournée par la variable système VIEWTWIST. Le lisp calcule l'angle passé en soustrayant pi/2 radians (soit 90°) à la valeur courante de VIEWTWIST.

 

Chez moi les deux routines (celle que tu as posté et celle que je propose) produisent le même résultat.

 

 

Il n'y a pas dans AutoLisp la possibilité de ne pas recalculer l'affichage pendant certaines instructions, comme en VBA on a : Application.ScreenUpdating=False ) ?

On accède avec Visual LISP aux mêmes fonctionnalités qu'avec le VBA AutoCAD, mais la méthode Application.ScreenUpdating n'existe pas en VBA AutoCAD.

 

PS : j'ai l'impression qu'on est en train de mobiliser beaucoup d'énergie pour un problème somme toute bien mineur : un passage éclair en zoom étendu que je ne vois même pas sur mon poste.

 

PPS : dans le LISP que tu a posté les variables ne sont pas déclarées localement et, plus dommageable, la variable système CMDECHO est forcée à 0 sans être restituée à sa valeur initiale.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Rebonjour et merci pour ta réponse.

 

Avant tout, oui, tu as raison dans ton PS : il s'agit juste d'améliorer qqch qui fonctionne (mais avec des fichiers lourds et un ordi poussif, le réaffichage inutile du zoom étendu est du temps perdu). Disons que c'est pour la beauté du geste, mais je vais sans doute m'arrêter là.

 

J'en suis fort étonné...

Je ne sais pas pourquoi, mais c'est comme ça sur mon poste. A tout hasard j'ai testé en changeant les unités (en radians, en grades,...) mais ce n'est pas ça le pb.

 

dans le LISP que tu a posté les variables ne sont pas déclarées localement et, plus dommageable, la variable système CMDECHO est forcée à 0 sans être restituée à sa valeur initiale.

Ça c'est dû à mon manque de connaissances en programmation en général et en LISP en particulier. Je me contente de bricoler des bouts de code que je glane.

Si tu as qqes améliorations à me proposer, c'est bien volontiers (mais je ne sais pas rectifier le code dans le sens que tu indiques).

 

En tous cas merci pour ton aide.

Posté(e)

Ton code "corrigé"

(defun c:ui (/ echo h ce) ; <- déclaration des variables locales
 (setq echo (getvar "cmdecho")) ; <- enregistrement de la valeur initiale
 (setvar "cmdecho" 0) ; <- forçage de la variable système
 (setq h (getvar "viewsize"))
 (setq ce (trans (getvar "viewctr") 1 0))
 (command "_ucs" "_n" "_z" "-90")
 (command "_plan" "")
 (command "_zoom" "_c" (trans ce 0 1) h)
 (setvar "cmdecho" echo) ; <- restauration de la valeur initiale
 (princ)
)

 

Pour les angles, il faut savoir qu'en interne AutoCAD utilise les radians - (getvar 'viewtwist) retourne une valeur en radians - et l'unité angulaire courante (AUNITS) pour la ligne de commande. La fonction LISP angtos convertit un angle (nombre réel) exprimé en radians en une chaîne de caractère qui est l'expression de l'angle dans l'unité courante :

(angtos (/ pi 2.)) retourne "90" si l'unité courante est le degré "100g" si c'est le grade, etc.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Ça marche parfaitement, merci beaucoup !!!

(et merci pour les petits commentaires dans le code)

 

 

 

 

Cela dit, Autodesk devrait avoir implémenté cette possibilité en base depuis Autocad 5 ou 6...!

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é