walterkrunch Posté(e) le 15 mai 2008 Posté(e) le 15 mai 2008 salutje bosse sur une routine qui affiche des vecteurs avec (grdraw) pour visualiser des choses.Le problème est que ces vecteurs sont effacés dès que la vue est modifiée (zoom ou pan), donc il faudrait pouvoir les retracer si la vue a bougé. Sinon avec une invite utilisateur (getPoint) ce n'est pas très satisfaisant puisqu'il faut souvent aller chercher un point non visible. J'ai pensé à 2 solutions mais aucune ne marche :- un réacteur qui détecte les modifs de vue : apparemment y'a pas.. et (vlr-sysvar-reactor) ne détecte que les modifs qui passent par la ligne de commande (il se déclenche pas avec le ZOOM et PAN de la molette)- refaire une boucle d'invite qui renvoie le pointage avec (grread), ce qui permettrait de vérifier si la vue a bougé : seulement avec grread on n'a pas l'accrochage aux objets, ce qui est bien sûr indispensable pour un point Qq'un voit une solution ?
Patrick_35 Posté(e) le 15 mai 2008 Posté(e) le 15 mai 2008 Salut Ton réacteur me parait bien avec la variable viewctrSinon, pourquoi ne pas directement dessiner les lignes et les conserver dans un jeu de sélection ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
walterkrunch Posté(e) le 15 mai 2008 Auteur Posté(e) le 15 mai 2008 Le réacteur serait l'idéal mais apparemment, comme d'autres, il ne se déclenche que si une variable a été modifiée à la ligne de commande. En tous cas il ne se déclenche pas avec les modifs de vue dues à la souris. Si tu as un moyen pour qu'il détecte un PAN ou ZOOM de molette ça m'intéresse...Sinon remplacer les vecteurs par des entités moui, pourquoi pas.. J'y avais pas pensé... Disons que les vecteurs ont un côté éphémère qui va bien avec l'usage, juste entre 2 clics..
Patrick_35 Posté(e) le 16 mai 2008 Posté(e) le 16 mai 2008 Salut Logiquement, dès qu'une variable change, le réacteur (vlr-sysvar-reactor...) réagit, et pas seulement sur une commande. Un lisp, un arx ou une appli externe peut faire changer une variable.Avec la variable viewctr, tu devrais le voir. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
walterkrunch Posté(e) le 16 mai 2008 Auteur Posté(e) le 16 mai 2008 SalutLogiquement oui... mais en fait à moitié, et pour la variable VIEWCTR pas du tout.. chez moi en tous cas il ne la détecte pas.Quand je fais tourner le code suivant je n'ai aucune réponse pour les modifs de vue, sauf DYNMODE pour les double-clic molette et pour les zooms depuis les icones.. Pour VIEWDIR ou VIEWSIZE rien.. Merci et a++ (defun connect () (vl-load-com) (vlr-sysvar-reactor nil '((:vlr-sysVarChanged . action))) ) (defun action (reac var) (print)(princ(car var)) )
(gile) Posté(e) le 16 mai 2008 Posté(e) le 16 mai 2008 Salut, Faute de solution, peut-être une explication ici.Si les variables liées à la fenêtre active semblent bien être automatiquement mises à jour (j'interroge VIEWSIZE, je fais un zoom, je ré interroge VIEWSIZE : elle à changé), par contre, les propriétés de la fenêtre (Height par exemple qui correspond à VIEWSIZE) ne sont mises à jour qu'après un (vla-delete (vla-get-ActiveViewport *acdoc*)). Pour le problème qui te concerne, je pense que je ferais comme le suggère Patrick_35, des lignes stockées dans une liste pour pouvoir être supprimées par la suite. Le côté éphémère (léger) des vecteurs ne compense pas, à mon avis la "lourdeur" de l'usage d'un réacteur dans ce cas là. À moins que ce soit un exercice de style, auquel cas, je ne peux que respecter... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
walterkrunch Posté(e) le 19 mai 2008 Auteur Posté(e) le 19 mai 2008 Oui j'ai pensé à une ces bizarreries incompréhensibles, qu'on rencontre en général quand on est sûr de tenir une solution...Pour ce qui est des lignes, moui.. décidément j'aime pas trop... peut être pour le style. Et puis il faut aussi mettre des réacteurs pour effacer les lignes en cas d'annulation, c'est aussi lourd.En tous cas merci pour vos réponses..
(gile) Posté(e) le 19 mai 2008 Posté(e) le 19 mai 2008 Salut, Et puis il faut aussi mettre des réacteurs pour effacer les lignes en cas d'annulation, c'est aussi lourd. Non, ce n'est pas nécessaire, une gestion des erreurs (annulations) peut très bien faire l'affaire. (defun draw-pt (pt) (list (entmakex (list '(0 . "LINE") (cons 10 (polar pt (* 1.25 pi) len)) (cons 11 (polar pt (* 0.25 pi) len)) ) ) (entmakex (list '(0 . "LINE") (cons 10 (polar pt (* 0.75 pi) len)) (cons 11 (polar pt (* 1.75 pi) len)) ) ) ) ) (defun c:test (/ *error* pt len lst) (defun *error* (msg) (and lst (mapcar 'entdel lst)) (princ) ) (setq len (/ (getvar 'viewsize) 40)) (while (setq pt (getpoint "\Spécifiez un point: ")) (setq lst (append (draw-pt (trans pt 1 0)) lst)) ) (princ) ) [Edité le 20/5/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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