brunomu Posté(e) le 20 novembre 2014 Posté(e) le 20 novembre 2014 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) )
Dinosor Posté(e) le 21 novembre 2014 Posté(e) le 21 novembre 2014 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
(gile) Posté(e) le 21 novembre 2014 Posté(e) le 21 novembre 2014 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
Dinosor Posté(e) le 21 novembre 2014 Posté(e) le 21 novembre 2014 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
brunomu Posté(e) le 21 novembre 2014 Auteur Posté(e) le 21 novembre 2014 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 ) ?
(gile) Posté(e) le 21 novembre 2014 Posté(e) le 21 novembre 2014 @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
brunomu Posté(e) le 21 novembre 2014 Auteur Posté(e) le 21 novembre 2014 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.
(gile) Posté(e) le 21 novembre 2014 Posté(e) le 21 novembre 2014 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
brunomu Posté(e) le 21 novembre 2014 Auteur Posté(e) le 21 novembre 2014 Ç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...!
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant