Aller au contenu

Messages recommandés

Posté(e)

salut

je 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 ?

 

Posté(e)

Salut

 

Ton réacteur me parait bien avec la variable viewctr

Sinon, pourquoi ne pas directement dessiner les lignes et les conserver dans un jeu de sélection ?

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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..

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut

Logiquement 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))
)

Posté(e)

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

Posté(e)

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..

Posté(e)

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

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é