VDH-Bruno Posté(e) le 23 août 2012 Posté(e) le 23 août 2012 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). 1 Apprendre => Prendre => Rendre
-Olivier- Posté(e) le 23 août 2012 Posté(e) le 23 août 2012 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. :)
VDH-Bruno Posté(e) le 23 août 2012 Auteur Posté(e) le 23 août 2012 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
-Olivier- Posté(e) le 23 août 2012 Posté(e) le 23 août 2012 Super, Effectvement cela marche tout seul...Bon, eh bien je crois que je rentre en bonne place dans le classement du boulet du jour. :D Merci encore !
Tramber Posté(e) le 23 août 2012 Posté(e) le 23 août 2012 Excellent, on peut la lancer avant ou en transparence. Le code est optimisé et propre, bravo. B) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 23 août 2012 Posté(e) le 23 août 2012 Je viens de tout comprendre, c'est brillant car pas compliqué :P Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
PHILPHIL Posté(e) le 23 août 2012 Posté(e) le 23 août 2012 hello bravo aussi +1et surtout mercii phil FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
bonuscad Posté(e) le 23 août 2012 Posté(e) le 23 août 2012 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
VDH-Bruno Posté(e) le 23 août 2012 Auteur Posté(e) le 23 août 2012 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. bonuscadCompliment à 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
(gile) Posté(e) le 24 août 2012 Posté(e) le 24 août 2012 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
philsogood Posté(e) le 24 août 2012 Posté(e) le 24 août 2012 helloen effet un lisp tout bonnement indispensable!par contre qu'appelez vous lancer le "lisp en transparence"OK moi je suis toujours derrière un peu le peloton mais je m'accroche (desfois!)++Phil Projeteur Revit Indépendant - traitement des eaux/CVC
-Olivier- Posté(e) le 24 août 2012 Posté(e) le 24 août 2012 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
Tramber Posté(e) le 24 août 2012 Posté(e) le 24 août 2012 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 ./__\. (.°=°.)
VDH-Bruno Posté(e) le 24 août 2012 Auteur Posté(e) le 24 août 2012 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
kallain Posté(e) le 24 août 2012 Posté(e) le 24 août 2012 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 etimpossible 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)
VDH-Bruno Posté(e) le 24 août 2012 Auteur Posté(e) le 24 août 2012 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
lecrabe Posté(e) le 24 août 2012 Posté(e) le 24 août 2012 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
VDH-Bruno Posté(e) le 24 août 2012 Auteur Posté(e) le 24 août 2012 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
VDH-Bruno Posté(e) le 24 août 2012 Auteur Posté(e) le 24 août 2012 Re, Je me suis fait un bouton ^Cldis: ça marche Si tu fait un bouton dans ce cas préfère la syntaxe avec transparence‘ldis à la manière de la commande ‘_pan Apprendre => Prendre => Rendre
philsogood Posté(e) le 24 août 2012 Posté(e) le 24 août 2012 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...Et encore merci pour le lisp!!Phil Projeteur Revit Indépendant - traitement des eaux/CVC
VDH-Bruno Posté(e) le 24 août 2012 Auteur Posté(e) le 24 août 2012 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
alala Posté(e) le 28 août 2012 Posté(e) le 28 août 2012 Merci pour cette routine, je la "pique" bien volontier. Vraiment une mine d'or ce forum! C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
VDH-Bruno Posté(e) le 28 août 2012 Auteur Posté(e) le 28 août 2012 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
VDH-Bruno Posté(e) le 5 septembre 2012 Auteur Posté(e) le 5 septembre 2012 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 messageA+ Apprendre => Prendre => Rendre
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