Aller au contenu

Modifier temporairement l’affichage des lignes discontinues en continues


VDH-Bruno

Messages recommandés

Bonjour,

 

Suite à une récente réflexion que je me suis fait au sujet d’un de mes premiers codes..

 

Le seul bémol, c’est que même si dans les faits rien n’empêche la transparence de la fonction pour que la régénération de l’affichage prenne effet, il faut hélas mais logiquement que ce soit en dehors de tout appel à la fonction commande.

 

;; VDH-Bruno

;; Transforme à l'affichage des lignes discontinues en continues

;; (Fonction réversible au 2nd appels)

(defun c:ldis ()

(cond

(*LD-LTSCALE* (command "'_.ltscale" *LD-LTSCALE*) (setq *LD-LTSCALE* nil))

((setq *LD-LTSCALE* (getvar 'LTSCALE)) (command "'_.ltscale" 1.0e+99))

)

(princ)

)

 

 

Je me suis "amusé" à revisiter ce code pendant la pose déjeuné, voilà à tester si cela vous dit..

 

;;VDHBruno                                           le :   05-09-2012
;; Transforme temporairement l'affichage les lignes discontinues en continue
(defun c:ldis () (vl-load-com) (ldis-callback nil nil))
(defun-q ldis-callback (rea svgvar)
        nil
        (cond (svgvar (setvar 'LTSCALE svgvar)
                      (vlr-remove rea)
                      (setq ldis-callback (cons (car ldis-callback) (cons nil (cddr ldis-callback))))
              )
              ((setq ldis-callback
                      (cons (car ldis-callback)
                            (cons (list 'setq
                                        'svgvar
                                        (getvar 'LTSCALE)
                                        'rea
                                        (vlr-command-reactor
                                          nil
                                          '((:vlr-commandEnded . ldis-callback)
                                            (:vlr-commandCancelled . ldis-callback)
                                            (:vlr-commandFailed . ldis-callback)
                                           )
                                        )
                                  )
                                  (cddr ldis-callback)
                            )
                      )
               )
                (setvar 'LTSCALE 1.0e+99)
              )
        )       
        (bv:ssmap 'entupd (ssget "_C" '(-1e99 -1e99) '(1e99 1e99)))
        (princ)
)

;; Variation de la fonction ssmap (extraite de la stdlib de Reini Urban)
(defun bv:ssmap (fun ss / i)
 (if (= (type ss) 'PICKSET)
   (repeat (setq i (sslength ss)) ((eval fun) (ssname ss (setq i (1- i)))))
 )
)

 

Au cours d’une commande AutoCAD faire précéder la fonction d’une apostrophe ‘ldis

 

A+

 

 

________________________________________

Edit du 05-09-2012 -Mise à jour du code -

  • Rectifié affichage sur ligne de commande.
  • Localisé la régénération du dessin à l’affichage écran de la fenêtre active.
  • Renommé arguments et noms de fonctions de façon plus explicite (et suppression d'une variable globale).

  • Upvote 1

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Bonjour VDH-BRUNO,

 

Je viens de tester la fonction en transparence et elle fonctionne parfaitement.

En revanche lorsque je lance la commande normalement, je ne parviens pas à faire revenir l'affichage initiale, autrement qu'avec annulation. Un second appel ne change rien.

 

Je doit avoir loupé quelques chose.

 

Sinon ta commande correspond exactement à une demande que j'avais faites dernièrement.

Mon lien

 

La réponse de Christian posait un problème pour les objets courbes.

 

Merci encore. :)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

En revanche lorsque je lance la commande normalement, je ne parviens pas à faire revenir l'affichage initiale, autrement qu'avec annulation. Un second appel ne change rien.

 

Je doit avoir loupé quelques chose.

 

Contrairement à la première version, celle-ci utilise des objets réacteurs d’évènements, pour éviter d’avoir à rappeler la fonction (et économiser une saisie), en clair s’il n’y a pas d’action de commande l’affichage n’est pas rétablie.

 

Dans ton cas lance la commande une première fois, puis à la sortie de la prochaine commande AutoCAD ton affichage sera rétabli.

 

Cette version a été écrite un peu à la volée pour faire didactique et ludique (defun-q & réacteur de commande) pour moi-même et éventuellement d’autres, si elle a un peu d’échos, je verrais pour la sécuriser d’avantage et l’optimiser un peu, il y a moyen j’ai déjà deux ou trois idée à tester mais cela sera un peu plus tard..

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Compliment à l'artiste,

 

Un seul problème, qui n'est pas lié à ton code.

Par exemple j'ai un type de ligne personnalisé utilisant une forme mais qui n'utilise aucune longueur de tiret, ex:

A,0,-1,[FORME,forme.shx,x=0,s=1]

 

à contrario d'un autre de cette forme:

A,.25,-.1,[FORME,forme.shx,x=0,s=1],-.5,1

 

Et bien malgré ton code, pour la première définition je n'aurais pas une ligne continue mais des pointillés, ceci avec la version basique et la version avec réacteur.

 

Mais bon y a que moi pour faire des définitions biscornues comme cela.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir et merci

 

Une nouvelle version un peu plus concise..

;; VDH-Bruno 
;; Transforme temporairement l'affichage les lignes discontinues en continue 
(defun-q ldis (rea lst)
 nil
 (cond (*ldis-commandreactor*
	(setvar 'LTSCALE rea)
	(vlr-remove *ldis-commandreactor*)
	(setq *ldis-commandreactor* nil)
       )

       ((setq ldis
	       (cons (car ldis)
		     (cons (list 'setq 'rea (getvar 'LTSCALE)) (cddr ldis))
	       )
	)
	(setq *ldis-commandreactor*
	       (vlr-command-reactor
		 nil
		 '((:vlr-commandEnded . ldis)
		   (:vlr-commandCancelled . ldis)
		   (:vlr-commandFailed . ldis)
		  )
	       )
	)
	(setvar 'LTSCALE 1.0e+99)
       )
 )
 (vla-regen (vla-get-ActiveDocument (vlax-get-acad-object))
	    acActiveViewport
 )
 (princ)
)

(defun c:ldis () (vl-load-com) (ldis nil nil))

 

-Olivier-

En revanche lorsque je lance la commande normalement, je ne parviens pas à faire revenir l'affichage initiale, autrement qu'avec annulation. Un second appel ne change rien.

Voilà qui devrait être résolu, merci du retour.

 

Tramber

Le code est optimisé et propre, bravo

Maintenant il l’est un peu plus ;) , à l’occasion je me pencherai sur les invites de la ligne de commande, en mode transparent car l’affichage ne me plait pas trop...

 

PHILPHIL

Merci pour de tes encouragements.

 

bonuscad

Compliment à l'artiste

Venant de ta part c’est très plaisant à lire, quoiqu’un peu exagéré..

Mais bon y a que moi pour faire des définitions biscornues comme cela.

Ca me rassure :D , blague à part j’ai jamais apprécié les fichiers de formes heureusement que cela tend à disparaitre.. Je me souviens à mes débuts, quelques fichiers qui m’ont écœuré à force d’en abuser.

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Chapeau l'artiste !

Si tu continues à LISPer au lieu de dormir tu vas finir comme moi...

 

Juste un truc qui devrait te plaire. On peut lier des données à un réacteur (premier argument de vlr-command-reactor), par ailleurs un utilisant une fonction de retro-appel (callback) on peut récupérer l'objet réacteur et donc les données qui lui sont liées.

 

Donc, sans setq ni defun-q :

(defun c:ldis ()
 (vlr-command-reactor
   (getvar 'ltscale)
   '((:vlr-commandEnded . ldis-callback)
     (:vlr-commandCancelled . ldis-callback)
     (:vlr-commandFailed . ldis-callback)
    )
 )
 (setvar 'ltscale 1e99)
 (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object))
     acActiveViewport
 )
 (princ)
)

(defun ldis-callback (rea cmd)
 (setvar 'ltscale (vlr-data rea))
 (vlr-remove rea)
 (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object))
     acActiveViewport
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

VDH-BRUNO Je n'ai pas encore testé la mise à jour mais merci d'avoir tenu compte de mon commentaire.

 

philsogood Pour répondre à ta question, utiliser le lisp en transparence permet de l'utiliser pendant l'exécution d'une autre commande. Comme par exemple la commande 'cal pour pouvoir calculer une distance au moment ou autocad là demande.

 

Lance la commande ligne sélectionne ton premier point puis tape 'ldis, l'affichage des types de lignes sera modifié pour pouvoir sélectionner le second point. Lorsque termine ta commande ligne, l'affichage reviens automatiquement à l'origine. Magique !! B)

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

lance une commande, polyligne par exemple, saisie quelques points et , sans quitter tape 'DI (avec l'apostrophe sinon ça marche pas), tu peux te renseigner sur la distance et poursuivre tes travaux sur la poly. C'est ça la transparence.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Bonjour (gile)

 

Bien sûr que cela me plait :) :) :) , c’est exactement ce à quoi je m’exerçais cette nuit, lier les données au premier argument du réacteur d’événement.. Et faire un peu plus rationnel et AutoCADémique.

 

Mais dans cette solution tout comme dans ton code, je n’étais pas parvenu à gérer le cas d’écrit par -Olivier- (à savoir lancer la commande 2 fois de suite) sans déclarer/introduire une variable global supplémentaire (voilà la raison de cette recherche nocturne très formatrice).

 

C’est pour cela que j’ai finalement gardé la solution du defun-q et sur le plan de la réflexion je trouvais amusant de définir le réacteur dans la fonction de retro-appel (de la pseudo récursivité).

 

Sur la fonction il y a encore peut-être 2 petites choses qui me chagrine les invites sur la ligne de commande, et le vla-Regen qu’il faudrait peut être réaliser de façon moins étendu (avec une fonction maison pour une meilleur performance. Mais au final ce serai beaucoup de codes pour pas grand-chose..

 

 

A+

Ps : Sinon si l’idée te plait je n’ai aucune objection à ce que tu l’intègre à ton Osnap Palette (je pense qu’il y a une demande pour ce type de fonctionnalité), même si dans l’esprit je ne saurais pas dire si elle y a vraiment sa place, la fonction agissant sur l’affichage ce qui a pour effet d’émuler l’accroche objet et la sélection.

 

Ps bis : Ta version est tout de même un peu plus concise que ce à quoi j’étais arrivé dans ma version non publier, et m’a permis de vérifier un ou deux petits points sur lequel je me questionnais. Notamment que d’attacher des données au réacteur permettait de le supprimer en rappelant son premier argument plutôt que de le déclarer dans une variable global...

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Ah! Voilà un lisp qu'il est bien.

 

Je me suis fait un bouton

^Cldis

: ça marche

 

mais

 

- par erreur, j'ai cliqué 2 fois sur ce bouton et

impossible de revenir en arrière ; La commande annuler n'y fait rien.

2 fois ldis au clavier : même résultat.

 

- la transparence 'ldis fait planter Autocad

 

ça c'est pour Autocad Map 2004

 

Pour Map 2008 et Map 2012 j'ai :

 

; erreur: no function definition: VLR-COMMAND-REACTOR

 

PS : j'ai utilisé la version (gile)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour kallain,

 

Ne connaissant pas AutoCAD Map (ni aucun applicatif métier) je ne peux rien certifier, mais je pense que le problème vient de là:

 

Mais dans cette solution tout comme dans ton code, je n’étais pas parvenu à gérer le cas d’écrit par -Olivier- (à savoir lancer la commande 2 fois de suite) sans déclarer/introduire une variable global supplémentaire (voilà la raison de cette recherche nocturne très formatrice).

 

Test avec la version précédente et tien nous au courant.

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Pour ton probleme sous 2008/2011, as tu bien fais un (vl-load-com)

avant de charger/executer la routine de Gilles ?

 

Tu peux aussi l'ajouter en debut de routine ...

 

Les versions MAP d'AutoCAD sont tres proches de l'AutoCAD standard

(car il n'y a AUCUN objet/entite METIER specifique - A part le FDO, mais c un autre sujet)

et en general ne pose aucun probleme particulier !

Alors que CIVIL, AA (ex Autodesk Architectural Desktop), MEP sont deja un peu plus eloignees d'AutoCAD ...

 

Pour MAP/CIVIL, il y a souvent un probleme sur la commande WBLOC !

A cause d'une question debile (Oui/non) qui ne sert a rien !!

 

Par contre faire tourner des routines de competition sur de vieux AutoCAD,

c souvent pas possible !

 

Beaucoup de routines aujourd'hui, exigent un AutoCAD 2007 (ou plus) ...

 

lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Oui, pour tes versions récentes suit les conseils donnés par lecrabe..

Pour ton probleme sous 2008/2011, as tu bien fais un (vl-load-com)

avant de charger/executer la routine de Gilles ?

 

Depuis le version 2008 il me semble que les fonctions Visual Lisp ActiveX/COM ne sont accessible qu’après un chargement explicite au moyen de la fonction de chargement (vl-load-com).

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Merci Bruno pour l'astuce...

depuis longtemps je cherchais comment lancer une autre commande pdt q'une tourne déjà avec le apostrophe ya plus de pb...

 

Ce n’est pas toujours si simple toutes les commandes ne supportent pas le mode transparent (), il en est de même pour les routines lisp, le fait que celle-ci y parvienne c’est parce que la routine n’utilise pas la fonction lisp command dans sa définition (cela vaut mieux avec les fonctions réacteurs du code).

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci pour cette routine, je la "pique" bien volontier.

C’était l’occasion pour moi de me familiariser un peu avec les objets réacteurs au travers d’une application pratique…

 

Et je t’en remercie car je rappellerai que cela découle plus ou moins directement de notre discussion précédente :

http://cadxp.com/index.php?/topic/35821-selection-dune-polyligne-non-continue/page__p__194968__fromsearch__1#entry194968

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

 

Chapeau l'artiste !

Si tu continues à LISPer au lieu de dormir tu vas finir comme moi...

Bon flatté dans mon égo, je me devais de relever le défi suivant "avec la manière c.a.d. avec un code minimaliste.." ;)

 

 

Sur la fonction il y a encore peut-être 2 petites choses qui me chagrine les invites sur la ligne de commande, et le vla-Regen qu’il faudrait peut être réaliser de façon moins étendu (avec une fonction maison pour une meilleur performance.

Voilà qui est réglé, les invites de la ligne de commande sont plus cohérentes et l’affichage écran plus fluide indépendamment de la taille du fichier

 

 

Mais au final ce serai beaucoup de codes pour pas grand-chose..

Hé finalement non! Il suffit de substituer la ligne suivante

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

 

Par celle-ci

(bv:ssmap 'entupd (ssget "_C" '(-1e99 -1e99) '(1e99 1e99)))

Pour un code relativement robuste quel que soit l’orientation du scu et de la vue. Et quelque soit l’état des objets verrouillé ou pas.. :)

 

 

Nota : Mise à jour complète du code dans le premier message

A+

Apprendre => Prendre => Rendre

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é