Aller au contenu

Echelle de type de ligne et présentation


zebulon_

Messages recommandés

Bonjour,

 

La question de l'affichage des types de lignes selon qu'on est en objet ou en présentation revient très souvent.

Aussi, la réponse donnée le plus souvent est de changer la variable PSLTSCALE à la valeur 0, afin d'avoir des affichages qui ne tiennent pas compte des échelles des fenêtres FMULT. Personnellement, cette réponse ne me satisfait pas, parce que je fais fréquemment des fenêtres à des échelles très différentes sur le même plan (une au 1:10ème, l'autre au 1:200ème par exemple) et je souhaite que les tirets aient le même aspect sur toutes les fenêtres quelle que soit l'échelle de la fenêtre. Mon PSLTSCALE est donc toujours à 1 pour cette raison.

 

Mon problème est, lorsque PSLTSCALE est à 1, qu'il est très difficile d'avoir un ECHLTP (LTSCALE) qui permet d'avoir quelque chose d'exploitable à la fois en espace papier et en espace objet. Afin d'y voir clair, je suis toujours obligé de changer la valeur de l'ECHLTP selon que je sois en espace papier ou en espace objet. Et ça me fatigue de changer et je voudrais que ça se fasse tout seul.

 

Il y a très longtemps, lorsque Autocad n'avait encore qu'un seul espace papier, j'avais fais un simple bouton qui servait à changer d'espace et qui changeait à la fois la variable TILEMODE et la variable LTSCALE. Maintenant qu'il y a plusieurs espaces papiers, ce n'est évidemment plus suffisant.

 

J'ai pensé que les réacteurs seraient un bon moyen pour me permettre d'avoir un ECHLTP différent selon l'espace de travail.

 

 ;;; Lisp à charger uniquement ... ne pas exécuter !!!
(vl-load-com)
(vlr-command-reactor "change layout" '((:vlr-commandEnded . EndChangeLayout)))

(defun EndChangeLayout (calling-reactor endcommandInfo / thecommandend)
 (setq thecommandend (nth 0 endcommandInfo))
 (if (= thecommandend "LAYOUT_CONTROL")
   (if (zerop (getvar "TILEMODE"))
     (setvar "LTSCALE" 5)	;; espace papier
     (setvar "LTSCALE" 0.5)	;; espace objet
   )
 )
)

 

Amicalement

Vincent

 

 

[Edité le 12/1/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Merciiiii infiniment pour ce lisp !!!

Je commençais à m'inquiéter. Je me suis dit : "je suis le seul à travailler comme ça : c'est donc que c'est une mauvaise manière". C'est rare d'être seul à avoir raison.

 

Je veux dire, sur quel(s) paramètre(s) agit-il ?

 

Il s'agit d'un réacteur qui réagit à la commande "LAYOUT_CONTROL" qui s'exécute lorsqu'on clique sur les onglets "Objet", "Présentation1", "Présentation2" etc... et qu'on souhaite passer de l'espace objet à l'espace papier, ou d'un présentation à une autre.

 

Personnellement, mon PSLTSCALE est toujours à 1 pour les raisons évoquées plus haut. Je ne fais varier que la variable LTSCALE (qui correspond à ECHLTP) suivant qu'on est en espace objet ou en espace papier. Et je ne fais surtout pas varier les échelles de type de ligne de chaque objet (cette propriété est toujours à 1 pour tous les objets dans mes fichiers), comme je vois souvent.

 

Les valeurs que j'applique (5 en espace papier et 0.5 en espace objet) fonctionne bien chez moi, mais dépendent de beaucoup de paramètres (unités de travail, fichier AutoCAD.lin ou acadiso.lin, echelle moyenne utilisée etc) et sont obtenues de façon assez empirique.

 

Peut-on alors le charger en toute quiétude sur le "acad.lsp" ?

Personnellement, je mets ces lisp dans "Charger/Décharger les applications" / "Au démarrage". Tu vois, la petite valise en bas à droite de la boite de dialogue ?

 

Amicalement

Vincent

 

PS : en passant, je trouve que ce serait pas mal d'avoir un LTSCALE pour l'espace papier et un autre pour l'espace objet. Genre LTSCALEM et LTSCALEP.

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir à toutes et tous,

 

Merci de ce complément d'infos zebulon_,

 

il ne me reste plus qu'à tester car je pense que l'on est nombreux à avoir ce "soucis" (

Je commençais à m'inquiéter. Je me suis dit : "je suis le seul à travailler comme ça : c'est donc que c'est une mauvaise manière".
)

 

C'est rare d'être seul à avoir raison.

 

Tu n'as pas tord, ;)

 

Les valeurs que j'applique (5 en espace papier et 0.5 en espace objet)

 

bien sur, modifiable dans le lisp en fonction des besoins,... A tester !

 

LTSCALEM et LTSCALEP.

 

C'est à dire ?

 

Merci encore,

Civil 3D 2025 - COVADIS_18.3a

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

C'est à dire ?

 

Je me demandais s'il était possible pour Autodesk de prévoir 2 variables LTSCALE pour ses versions futures, l'une agissant sur l'espace papier, l'autre sur l'espace objet. Ce qui éviterait de devoir "bricoler" comme je le fais.

 

Amicalement

Vincent

 

 

 

[Edité le 14/1/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je trouve l'idée très intéressante.

Il est assez facile de définir des espèces de variables système en LISP en enregistrant des valeurs dans la base de registre ou dans un dictionnaire (pour un enregistrement dans le dessin).

Et de définir des commandes pour pouvoir modifier les valeurs de ces variables.

 

Je fait donc une proposition "d'amélioration" : définition de deux "variables" LTSCALEM et LTSCALEP utilisée par un réacteur (j'utilise vlr-miscellaneous-reactor plutôt que vlr-command-reactor).

Les "variables" sont initialisées à 5 et 0.5 par défaut.

 

 

(vl-load-com)

;; Initalisation des valeurs pour LTSCALEM et LTSCALEP
;; si elle ne sont pas encore définies
(or (vlax-ldata-get "Z_LTSCALE" "ltscalem")
   (vlax-ldata-put "Z_LTSCALE" "ltscalem" 0.5)
)


(or (vlax-ldata-get "Z_LTSCALE" "ltscalep")
   (vlax-ldata-put "Z_LTSCALE" "ltscalep" 5)
)

;; Mise à jour de LTSCALE au chargement
(setvar 'ltscale
       (if (= (getvar 'cvport) 1)
         (vlax-ldata-get "Z_LTSCALE" "ltscalep")
         (vlax-ldata-get "Z_LTSCALE" "ltscalem")
       )
)

;; Définition du réacteur
(vlr-miscellaneous-reactor
 nil
 '((:vlr-layoutSwitched . ltscaleCallback))
)

;; fonction de rétro appel
(defun ltscaleCallback (rea lst)
 (setvar 'ltscale
         (if (= (car lst) "Model")
           (vlax-ldata-get "Z_LTSCALE" "ltscalem")
           (vlax-ldata-get "Z_LTSCALE" "ltscalep")
         )
 )
 (vla-regen (vla-get-ActiveDocument (vlax-get-acad-object)) acAllViewports)
)

;; Modification de la "variable" LTSCALEM
(defun c:LTSCALEM (/ scl)
 (initget 6)
 (if (setq scl (getreal
                 (strcat "\nEntrez une nouvelle valeur pour LTSCALEM                           (rtos (vlax-ldata-get "Z_LTSCALE" "ltscalem") 2 4)
                         ">: "
                 )
               )
     )
   (progn
     (vlax-ldata-put "Z_LTSCALE" "ltscalem" scl)
     (if (/= 1 (getvar 'cvport))
       (progn
         (setvar 'ltscale scl)
         (vla-regen (vla-get-ActiveDocument (vlax-get-acad-object))
                    acActiveViewport
         )
       )
     )
   )
 )
 (princ)
)

;; Modification de la "variable" LTSCALEP
(defun c:LTSCALEP (/ scl)
 (initget 6)
 (if (setq scl (getreal
                 (strcat "\nEntrez une nouvelle valeur pour LTSCALEP                           (rtos (vlax-ldata-get "Z_LTSCALE" "ltscalep") 2 4)
                         ">: "
                 )
               )
     )
   (progn
     (vlax-ldata-put "Z_LTSCALE" "ltscalep" scl)
     (if (= 1 (getvar 'cvport))
       (progn
         (setvar 'ltscale scl)
         (vla-regen (vla-get-ActiveDocument (vlax-get-acad-object))
                    acAllViewports
         )
       )
     )
   )
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Je trouve l'idée très intéressante.

Cela me rassure définitivement ;)

 

Je fait donc une proposition "d'amélioration"

Magnifique. J'avais pensé à la même chose mais en faisant de simples (setq LTSCALEM 5) et (setq LTSCALEP 0.5), ce qui en aurait fait des variables non enregistrées. Mais c'est mieux de les sauvegarder avec vlax-ldata, de manière à ce que cela deviennent des variables enregistrées dans le dessin (par ailleurs, je préfère que les variables soient enregistrées dans le fichier plutôt que dans le registre).

 

Et en prime, on a 2 commandes supplémentaires pour les modifier.

 

Le choix du réacteur vlr-miscellaneous-reactor est, sans aucun doute, plus judicieux puisqu'il réagit à l'action "changer de présentation", quelle que soit la manière (en changeant la valeur de la variable TILEMODE par exemple). vlr-command-reactor ne réagit qu'à la commande LAYOUT_CONTROL.

 

Si la communauté adopte cette façon de procéder, peut-être qu'un jour on trouvera ces variables dans autocad ?

 

Merci pour cette contribution

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

J'ai modifié le code pour ajouter des mises à jour automatiques en cas de changement de la valeur d'une variable. Une régénération semble inévitable pour afficher cette mise à jour.

 

lili2006,

Peut-on alors le charger en toute quiétude sur le "acad.lsp" ?

À moins d'avoir mi la variable ACADLISPASDOC à 1, le fichier AutoCAD.lsp n'est chargé qu'un fois par session au démarrage d'AutoCAD.

Il vaut donc mieux mettre la routine dans un fichier acadoc.lsp ou un fichier MNL du même nom que le fichier CUI principal pour que la routine soit chargée dans chaque document.

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

Lien vers le commentaire
Partager sur d’autres sites

Une régénération semble inévitable pour afficher cette mise à jour.

 

Oui, d'ailleurs lorsqu'on utilise la commande ECHLTP, elle provoque une régénération. Alors que, si on change la variable LTSCALE, il n'y a pas de régénération.

 

Amicalement

Vincent

 

 

[Edité le 14/1/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

au sujet des regen :

(vla-regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)

ne fait un regen que de l'espace papier et pas des fenêtres de l'espace papier.

 

Ne faudrait-il pas remplacer acActiveViewport par acAllViewports dans la fonction ltscaleCallback ?

 

Par ailleurs, il y a une inversion pour l'initialisation des variables. Au départ, j'avais mis LTSCALEP à 5 et LTSCALEM à 0.5.

 

Depuis quelques jours, je ne pense plus aux ECHLTP. C'est les vacances ! ;)

 

Salutations

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Ne faudrait-il pas remplacer acActiveViewport par acAllViewports dans la fonction ltscaleCallback ?

Tu as raison, je l'avais fait chez moi, j'ai oublié de corriger le code ici (je le fais immédiatement) .

 

Par ailleurs, il y a une inversion pour l'initialisation des variables. Au départ, j'avais mis LTSCALEP à 5 et LTSCALEM à 0.5.

Oups !...

Mais ça n'a pas vraiment d'importance puisque ces valeurs sont paramétrables...

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

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

 

la fonction Callback fait un regen, même si on ne change pas la valeur de LTSCALE. Je m'explique : si on passe du Model à une présentation (ou inversement) le regen s'impose, mais si on passe d'une présentation à une autre le regen semble inutile. Si c'est inutile et que ça prend du temps, autant éviter de faire ce regen.

 

Je propose de modifier la fonction callback de cette manière

(defun ltscaleCallback (rea lst / oldLTSCALE)
 (setq oldLTSCALE (getvar "LTSCALE"))
 (setvar 'ltscale
         (if (= (car lst) "Model")
           (vlax-ldata-get "Z_LTSCALE" "ltscalem")
           (vlax-ldata-get "Z_LTSCALE" "ltscalep")
         )
 )
 (if (/= oldLTSCALE (getvar "LTSCALE"))
   (vla-regen (vla-get-ActiveDocument (vlax-get-acad-object)) acAllViewports)  
 )
)

 

ou quelque chose du même style.

 

Amicalement

Zebulon_

 

Lien vers le commentaire
Partager sur d’autres sites

  • 3 ans après...

Bonjour Gile

 

J'ai trouver votre lisp intérésent,

 

Car moi j'ai plus au moins le même problème, c'est à dire que je voudrais appliquer a ma fenêtre de présentation qui auront 3 type d'échelles 1/200; 1/500; 1/1000 avec 3 types de variable echltp (0.2= 1/200; 0.5=1/500; 1= 1/1000)

 

Donc est-ce que c'est possible de faire un lisp qui activera automatiquement ces variable

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é