Aller au contenu

Amélioration et simplification en vlisp


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

Bonsoir à toutes et tous,

 

Je ne sais pas ce qu'est exactement cette fonction " ade_expreval" mais ma V2008 pleine répond :

 

Commande: AJOUT-ZEROS

Choix des objets: 1 trouvé(s)

Choix des objets: 1 trouvé(s), 2 au total

Choix des objets: 1 trouvé(s), 3 au total

Choix des objets: 1 trouvé(s), 4 au total

Choix des objets:

; erreur: no function definition: ADE_EXPREVAL

Commande:

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é