fabcad Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Bonjour aux Vlispeurs,J'ai créé cette routine et je souhaiterais l'améliorer et la simplifier en VisualLisp.Merci d'avance,Fabcad ;;;------------------------------------------------------------------------ ;;; Fonction pour ajouter des zéros à gauche d'une valeur de texte mais en conservant 4 caractères Version 1.0 ;;; par Fabcad ;;; le 14/11/2008 ;;;------------------------------------------------------------------------ (defun traite-js (js / nbr obj-numero ent-obj-numero index debut-coup lg-index-bis index-bis index-ter) (setvar "cmdecho" 0) (setq nbr (sslength js)) (setq i 0) (while (<= i (- nbr 1)) (setq obj-numero (ssname js i)) (setq ent-obj-numero (entget obj-numero)) ;Récupération de la valeur de la chaine de caractères par ade_expreval de l'analyseur d'expressions d'AutoCAD MAP (setq index (ade_expreval obj-numero ".STRING" "string")) (setq index-bis (strcat "000000" index)) (setq lg-index-bis (strlen index-bis)) (setq debut-coup (+ 1 (- lg-index-bis 4))) (setq index-ter (substr index-bis debut-coup 4)) (setq ent-obj-numero (subst (cons 1 index-ter) (assoc 1 ent-obj-numero) ent-obj-numero)) (entmod ent-obj-numero) (command "chprop" obj-numero "" "couleur" "bleu" "") (setq i (+ i 1)) ); fin while nil ); fin defun ;;;------------------------------------------------------------------------ ; FONCTION MAITRE (defun c:AJOUT-ZEROS () (setvar "cmdecho" 0) (setq js (ssget)) (traite-js js) (setq js nil) (prompt "\n---COPYRIGHT 14/11/2008 Par Fabcad---") nil );fin ;;;------------------------------------------------------------------------ (prompt "\npour lancer Tapez : AJOUT-ZEROS")
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Salut, Je ne suis pas sûr que l'utilisation des fonctions vla-* permettent de "simplifier" beaucoup.Tout dépend de ce qu'on entend par là.D'après ce que je comprends la fonction ade_expreval requiert un ename comme argument, ça oblige donc à une reconversion de vla-object en ename. Je me suis amusé à essayer de "simplifier" à ma manière, en AutoLISP et en Visual LISP.PS je n'ai pas pu tester, je n'ai pas la fonction ade_expreval, mais ça devrait fonctionner. ;;; AutoLISP (defun c:AJOUT-ZEROS (/ js i obj-numero index ent-obj-numero lg-index) (setq i 0) (if (setq js (ssget '((0 . "MTEXT,TEXT")))) (while (setq obj-numero (ssname js i)) (setq ent-obj-numero (entget obj-numero) index (cdr (assoc 1 ent-obj-numero)) i (1+ i) ) (if ( (setq index (substr index (- lg-index 3))) (repeat (- 4 lg-index) (setq index (strcat "0" index))) ) (entmod (subst (cons 1 index) (assoc 1 ent-obj-numero) (cons '(62 . 5) (vl-remove-if '(lambda (x) (= (car x) 62)) (entget obj-numero) ) ) ) ) ) ) (princ) ) ;;; Visual LISP (defun c:AJOUT-ZEROS (/ js obj-numero index lg-index) (vl-load-com) (if (ssget '((0 . "MTEXT,TEXT"))) (progn (vlax-for obj-numero (setq js (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) (setq index (vla-get-TextString obj-numero)) (if ( (setq index (substr index (- lg-index 3))) (repeat (- 4 lg-index) (setq index (strcat "0" index))) ) (vla-put-TextString obj-numero index) (vla-put-Color obj-numero 5) ) (vla-delete js) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Bonsoir à toutes et tous, Je ne sais pas ce qu'est exactement cette fonction " ade_expreval" mais ma V2008 pleine répond : Commande: AJOUT-ZEROSChoix des objets: 1 trouvé(s)Choix des objets: 1 trouvé(s), 2 au totalChoix des objets: 1 trouvé(s), 3 au totalChoix des objets: 1 trouvé(s), 4 au totalChoix des objets:; erreur: no function definition: ADE_EXPREVALCommande: Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Salut ade_expreval est une fonction LISP propre à AutoCAD MAP, Fabcad a mis une ligne de commentaire dans son code : ;Récupération de la valeur de la chaine de caractères par ade_expreval de l'analyseur d'expressions d'AutoCAD MAP D'après ce que je comprends ça serait une fonction qui récupère la partie d'une chaîne qui représente une valeur numérique, mais je n'en suis pas sûr, je n'ai fait que ré écrire "à ma façon" le code qu'il y avait autour. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
fabcad Posté(e) le 14 novembre 2008 Auteur Posté(e) le 14 novembre 2008 Bonsoir Gile Bonsoir lili2006,J'ai bien précisé que cette fonction fait partie de la librairie de fonctions de l'analyseur d'expressions d'AutoCAD MAP. J'utilise cette fonction pour éviter l'utilisation des cdr et assoc d'entget. Peut-on la remplacer par un Vla-get-"chaine ou string" en visual lisp pour remplacer cette ligne. J'attends la suite. merci fabcad
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Si cette fonction ne fait que retourner la valeur de la chaîne d'un objet texte, genre :(cdr (assoc 1 (entget LeTexte))), c'est bien vla-get-TextString l'équivalent en vlisp.Je modifie les codes en conséquence. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Re, Ok (gile) & fabcad, Je viens de tester sur MAP 2009, cela fonctionne, et ça sert à quoi au juste ? (Je suis un "jeune" utilisateur du MAP,..), ou bien est-ce une "sous-routine" dont tu te sers pour d'autre programme , Merci d'avance, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Les codes tels que je les ai modifiés fonctionnent maintenant avec les versions AutocAD "de base". Si j'ai bien compris ce que fait ade_expreval sur un objet texte, l'expression : (ade_expreval (car (entsel)) ".STRING" "string") retourne la valeur du texte. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
fabcad Posté(e) le 14 novembre 2008 Auteur Posté(e) le 14 novembre 2008 Re bonsoir,Toutes les fonctions MAP de base peuvent être intégrées dans d'autres routines LISP ou des requetes externes d'extension QRY mais dont le contenu est de l'autolisp avec ces fonctions supplémentaires. La copie de données d'objets que tu as utilisé dans un programme pour Pat-Lecrabe utilise ces fonctions LISP MAP.Il y a un fichier chm spécifique pour créer des programmes LISP dans le dossier help d'AutoCAD MAP. (ade_expreval (car (entsel)) ".STRING" "string") retourne la valeur d'un texte.(ade_expreval (car (entsel)) ".LAYER" "string") retourne le calque d'un objet.(ade_expreval (car (entsel)) ".COLOR" "integer") retourne la couleur d'un objet dans un format integer.(ade_expreval (car (entsel)) ".CENTER" "point") retourne le point centre d'un objet. Ma petite fonction permet de mettre des textes de numéros d'ordre de poteaux d'incendie sur 4 chiffres afin de connecter une base de données d'hydrants puis de générer des liens de façon automatique par rapport à la clé d'un base de données (excel ou access ou dbf). Mais j'essaie de me mettre au visual lisp et c'est un bon moyen pour avancer. Tu as aussi la possibilité de mettre quelques fonctions dans n'importe quel champ des cases de dialogue des requêtes DWG lorsque tu modifies des proprités sur des objets requetés. Si tu as d'autres question sur map n'hesites pas envoie un message privé et je donnerai mes coordonnées professionnelles. Bonsoir,Merci Gile pour ton travail Remarquable.Je décortiquerai lundi,Fabcad
lili2006 Posté(e) le 15 novembre 2008 Posté(e) le 15 novembre 2008 Bonjour à toutes et tous, Merci pour ces commentaires fabcad, Si tu as d'autres question sur map n'hesites pas envoie un message privé et je donnerai mes coordonnées professionnelles. Merci, je n'hésiterai pas alors,.... Bon WE, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
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