Aller au contenu

Incrémenter des suffixes


(gile)

Messages recommandés

Salut,

 

Dans un soucis de plus grande polyvalence, j'ai un peu peaufiné la routine donnée ici.

L'argument alpha, qui permet de déterminer quels caractères doivent être considérés comme suffixe, accepte désormais comme valeur un entier de 1 à 7 : la somme des codes binaires suivant:

1 pour les caractères numériques [0-9]

2 pour les caractères alphabétiques majuscules [A-Z]

4 pour les caractères alphabétiques minuscules [a-z]

Ceci permet donc toutes les combinaisons possibles.

 

Un exemple d'utilisation est joint après la routine.

INCSUF (avec un seul F), qui permet d'incrémenter les suffixes de textes, mtextes et attributs sélectionnés en fonctions des paramètres courant (modifiables évidemment).

 

EDIT : le changement des paramètre se fait dans une petite boite de dialogue.

 

EDIT 2 : améliorations de l'interface de INCSUF.

 

EDIT 3 : Nouvelle boite de dialogue pour les modifications de paramètres

 

;; INCSUFF (version 1.2) -Gilles Chanteau- 15/01/08
;; Incrémente le suffixe d'une chaîne de caractères de la valeur spécifiée.
;; Est pris en compte comme suffixe, l'ensemble des caractères [0-9] et/ou [A-Z]
;; et/ou [a-z] depuis la fin du texte, en fonction de la valeur de alpha
;;
;; Arguments
;; str : une chaîne avec un suffixe valide
;; inc : un entier positif
;; alpha : un entier, somme des codes binaires suivant
;; 1 pour les caractères [0-9]
;; 2 pour les caractères [A-Z]
;; 4 pour les caractères [a-z]
;;
;; Retour
;; la chaîne avec son suffixe incrémenté (ou nil si aucun suffixe valide)
;;
;; Exemples :
;; (incsuff "N°002" 12 1) = "N°014"
;; (incsuff "Dessin9" 1 1) = "Dessin10"
;; (incsuff "test_ZZ9" 1 3) = "test_AAA0"
;; (incsuff "test_ZZ9" 1 1) = "test_ZZ10"
;; (incsuff "12-" 1 1) = nil
;;
;; Modification (13/02/08) : codes binaires pour l'argument alpha

(defun incsuff (str inc alpha / lst crt pas ind dep quo ret)
 (setq lst (reverse (vl-string->list str)))
 (while
   (and
     (setq crt (car lst))
     (cond
((and (	 (setq pas 10
       ind 48
 )
)
((and (	 (setq pas 26
       ind 65
 )
)
((and (	 (setq pas 26
       ind 97
 )
)
((	 (setq crt (if (= 10 pas)
	     ind
	     (1- ind)
	   )
       lst (cons (car lst) lst)
 )
)
     )
   )
    (setq dep (- crt ind)
   quo (/ (+ dep inc) pas)
   ret (cons (+ ind (rem (+ dep inc) pas)) ret)
    )
    (if (zerop quo)
      (setq ret (append (reverse (cdr lst)) ret)
     lst nil
      )
      (if (cdr lst)
 (setq lst (cdr lst)
       inc quo
 )
 (setq lst (list ind)
       inc (if (= 10 pas)
	     quo
	     (1- quo)
	   )
 )
      )
    )
 )
 (if ret
   (vl-list->string ret)
 )
)

;;==================================================;;

;; INCSUF (gile) 13/02/08
;; Incrémente le suffixe des textes, mtextes ou attributs successivement sélectionnés.
;; Le suffixe est déterminé automatiquement en fonction de la nature des caracères qui
;; le compose et du paramètre "Type(s) de caratère du suffixe" courant.
;; L'utilisateur peut modifier les paramètres courants dans une boite dialogue.

(defun c:incsuf	(/ ValidSel IncsuffInputbox ent elst typ val suf inc tag save input)

 (defun ValidSel (elst / val)
   (setq val (cdr (assoc 1 elst))
  val (ascii (substr val (strlen val)))
   )
   (or
     (and (= 1 (logand 1 *suffixbin*)) (      (and (= 2 (logand 2 *suffixbin*)) (      (and (= 4 (logand 4 *suffixbin*)) (    )
 )

 (defun IncsuffInputbox (typ inc / temp file dcl_id lst)
   (setq temp (vl-filename-mktemp "Tmp.dcl")
  file (open temp "w")
   )
   (write-line
     (strcat
"IncsuffInputbox:dialog{label=\"Paramètres\";"
":boxed_column{label=\"Type(s) de caractère du suffixe\";"
":toggle{label=\"Nombres [0-9]\";key=\"num\";}"
":toggle{label=\"Majuscules [A-Z]\";key=\"maj\";}"
":toggle{label=\"Minuscules [a-z]\";key=\"min\";}}"
"spacer;:edit_box{label=\"Incrément\";key=\"inc\";"
"edit_width=6;allow_accept=true;}spacer;ok_cancel; }")
     file
   )
   (close file)
   (setq dcl_id (load_dialog temp))
   (if	(not (new_dialog "IncsuffInputbox" dcl_id))
     (exit)
   )
   (if	(= 1 (logand 1 typ))
     (set_tile "num" "1")
   )
   (if	(= 2 (logand 2 typ))
     (set_tile "maj" "1")
   )
   (if	(= 4 (logand 4 typ))
     (set_tile "min" "1")
   )
   (set_tile "inc" (itoa inc))
   (action_tile
     "accept"
     "(setq typ (+
     (if (= (get_tile \"num\") \"1\") 1 0)
     (if (= (get_tile \"maj\") \"1\") 2 0)
     (if (= (get_tile \"min\") \"1\") 4 0))
     inc (read (get_tile \"inc\")))
     (done_dialog)"
   )
   (start_dialog)
   (unload_dialog dcl_id)
   (vl-file-delete temp)
   (list typ inc)
 )

 (or *suffixbin* (setq *suffixbin* 1))
 (or *incrvalue* (setq *incrvalue* 1))
 (princ
   (strcat "\nParamètres courants: Suffixe (code binaire) = "
    (itoa *suffixbin*)
    ", Incrément = "
    (itoa *incrvalue*)
   )
 )
 (while
   (not
     (and
(or
  (initget 1 "Paramètres")
  (setq	ent (nentsel
	      "\nSélectionnez le texte de départ ou [Paramètres]: "
	    )
  )
)
(= (type ent) 'LIST)
(setq elst (entget (car ent)))
(setq typ (cdr (assoc 0 elst)))
(member typ '("ATTRIB" "TEXT" "MTEXT"))
(setq val (cdr (assoc 1 elst)))
     )
   )
    (if (= ent "Paramètres")
      (while
 (not
   (and
     (setq input (IncsuffInputbox *suffixbin* *incrvalue*))
     (	     (setq *suffixbin* (car input))
     (= (type (cadr input)) 'INT)
     (	     (setq *incrvalue* (cadr input))
   )
 )
  (if (zerop (car input))
    (alert "Au moins un type de caractère doit être coché.")
    (alert "L'incrément doit être un entier positif non nul.")
  )
      )
    )
 )
 (if (ValidSel elst)
   (progn
     (if (= typ "ATTRIB")
(setq tag (cdr (assoc 2 elst)))
     )
     (while (or (initget 1 "annUler")
	 (setq ent (nentsel
		     (strcat "\nSélectionnez le texte suivant"
			     (if save
			       " ou [annUler]: "
			       ":"
			     )
		     )
		   )
	 )
     )
(if (= ent "annUler")
  (if save
    (progn
      (setq elst (entget (caar save)))
      (entmod (subst (cons 1 (cdar save)) (assoc 1 elst) elst))
      (entupd (cdr (assoc 330 elst)))
      (setq val	 (incsuff val (- *incrvalue*) *suffixbin*)
	    save (cdr save)
      )
    )
    (princ "\nPlus rien à annuler.")
  )
  (if (and (setq elst (entget (car ent)))
	   (= (cdr (assoc 0 elst)) typ)
      )
    (if	(= typ "ATTRIB")
      (and (= (cdr (assoc 2 elst)) tag)
	   (setq save (cons (cons (car ent) (cdr (assoc 1 elst))) save)
		 val  (incsuff val *incrvalue* *suffixbin*)
	   )
	   (entmod (subst (cons 1 val) (assoc 1 elst) elst))
	   (entupd (cdr (assoc 330 elst)))
      )
      (and (setq save (cons (cons (car ent) (cdr (assoc 1 elst))) save)
		 val  (incsuff val *incrvalue* *suffixbin*)
	   )
	   (entmod (subst (cons 1 val) (assoc 1 elst) elst))
      )
    )
  )
)
     )
   )
   (princ "\nParamètre de suffixe incorrect.")
 )
 (princ)
) 

[Edité le 13/2/2008 par (gile)][Edité le 13/2/2008 par (gile)]

 

[Edité le 14/2/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

bonjour (gille)

 

incsuf fonctionne bien, il faut penser à mettre incsuff dans le premier pour que cela fonctionne.

 

une petite case de dialogue (avec un exemple) au lancement pour régler les paramètres serait peut être la bienvenue, car certains utilisateurs (qui ne font pas de lisp ) ne vont jamais dans un programme ou ne lisent pas les info que tu donnes. (exmple : moi, je ne les ai pas lu la 1ère fois que j'ai lancé le lisp.)

 

c'est super.

 

A+

Lien vers le commentaire
Partager sur d’autres sites

Non, Richard, ce sont des codes binaires, c'est donc bien 4 pour les minuscules. Si tu met 3 comme valeur, ça correspond à 1+2 soit les nombres (1) plus les majuscules (2) et sera considéré comme suffixe l'ensemble des caractères numériques et/ou minuscules à partir de la fin du texte.

 

1 -> Nombres [0-9]

2 -> Majuscules [A-Z]

3 -> (1.2) Nombres et/ou Majuscules [0-9,A-Z]

4 -> Minuscules [a-z]

5 -> (1+4) Nombres et/ou Minuscules [0-9,a-z]

6 -> (2+4) Majuscules et/ou Minuscules [A-Z,a-z]

7 -> (1+2+4) Nombres et/ou Majuscules et/ou Minuscules [0-9,A-Z,a-z]

 

[Edité le 13/2/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

encore moi,

 

ne serait il pas possible que la case de dialogue arrive quand on lance le programme plutot que de taper P au clavier, pour éviter la phrase Paramètre de suffixe incorrect si on se trompe.

 

De même, quand on active une case, n'est il pas possible que la case cochée précedement se décoche.

 

A+

Lien vers le commentaire
Partager sur d’autres sites

Salut Richard,

 

Tout d'abord excuse moi, j'avais lu ta réponse à l'envers :P

 

ne serait il pas possible que la case de dialogue arrive quand on lance le programme plutot que de taper P au clavier

 

Oui, c'est possible, j'avais fait le choix de ne la mettre qu'en option parce que je pense que dans l'immense majorité des cas, le suffixe est un nombre et l'incrément 1 et que les dernières valeurs sont conservées dans le dessin pendant la session.

Les valeurs courantes étant indiquées sur la ligne de commande à chaque lancement de la fonction.

Ce choix évite d'avoir à valider la boite de dialogue à chaque fois.

Je met quand même ci-dessous une version qui ouvre systématiquement sur la boite de dialogue.

 

quand on active une case, n'est il pas possible que la case cochée précedement se décoche

 

Ça aussi c'est possible, en remplaçant les cases à cocher (toggle) par des boutons radio (radio_button).

Mais en faisant cela on s'enlève toute possibilité de combiner différents types de caractères (un seul bouton à la fois).

donc je ne ferais pas cette modif, mais libre à chacun de le faire en remplaçant les 3 toggle par 3 radio_button dans l'expression :

 

(write-line

(strcat

"IncsuffInputbox:dialog{label=\"Paramètres\";"

":boxed_column{label=\"Type(s) de caractère du suffixe\";"

":toggle{label=\"Nombres [0-9]\";key=\"num\";}"

":toggle{label=\"Majuscules [A-Z]\";key=\"maj\";}"

":toggle{label=\"Minuscules [a-z]\";key=\"min\";}}"

"spacer;:edit_box{label=\"Incrément\";key=\"inc\";"

"edit_width=6;allow_accept=true;}spacer;ok_cancel; }")

file

)

 

 

Version avec ouverture systématique de la boite de dialogue au lancement de la commande.

 

;; INCSUFF (version 1.2) -Gilles Chanteau- 15/01/08
;; Incrémente le suffixe d'une chaîne de caractères de la valeur spécifiée.
;; Est pris en compte comme suffixe, l'ensemble des caractères [0-9] et/ou [A-Z]
;; et/ou [a-z] depuis la fin du texte, en fonction de la valeur de alpha
;;
;; Arguments
;; str : une chaîne avec un suffixe valide
;; inc : un entier positif
;; alpha : un entier, somme des codes binaires suivant
;; 1 pour les caractères [0-9]
;; 2 pour les caractères [A-Z]
;; 4 pour les caractères [a-z]
;;
;; Retour
;; la chaîne avec son suffixe incrémenté (ou nil si aucun suffixe valide)
;;
;; Exemples :
;; (incsuff "N°002" 12 1) = "N°014"
;; (incsuff "Dessin9" 1 1) = "Dessin10"
;; (incsuff "test_ZZ9" 1 3) = "test_AAA0"
;; (incsuff "test_ZZ9" 1 1) = "test_ZZ10"
;; (incsuff "12-" 1 1) = nil
;;
;; Modification (13/02/08) : codes binaires pour l'argument alpha

(defun incsuff (str inc alpha / lst crt pas ind dep quo ret)
 (setq lst (reverse (vl-string->list str)))
 (while
   (and
     (setq crt (car lst))
     (cond
((and (	 (setq pas 10
       ind 48
 )
)
((and (	 (setq pas 26
       ind 65
 )
)
((and (	 (setq pas 26
       ind 97
 )
)
((	 (setq crt (if (= 10 pas)
	     ind
	     (1- ind)
	   )
       lst (cons (car lst) lst)
 )
)
     )
   )
    (setq dep (- crt ind)
   quo (/ (+ dep inc) pas)
   ret (cons (+ ind (rem (+ dep inc) pas)) ret)
    )
    (if (zerop quo)
      (setq ret (append (reverse (cdr lst)) ret)
     lst nil
      )
      (if (cdr lst)
 (setq lst (cdr lst)
       inc quo
 )
 (setq lst (list ind)
       inc (if (= 10 pas)
	     quo
	     (1- quo)
	   )
 )
      )
    )
 )
 (if ret
   (vl-list->string ret)
 )
)

;;==================================================;;

;; INCSUF (gile) 14/02/08 -version 2.0-
;; Incrémente le suffixe des textes, mtextes ou attributs successivement sélectionnés.
;; Le suffixe est déterminé automatiquement en fonction de la nature des caracères qui
;; le compose et du paramètre "Type(s) de caratère du suffixe" courant.
;; L'utilisateur peut modifier les paramètres courants dans une boite dialogue.

(defun c:incsuf	(/ ValidSel IncsuffInputbox ent elst typ val suf inc tag save)

 (defun ValidSel (elst / val)
   (setq val (cdr (assoc 1 elst))
  val (ascii (substr val (strlen val)))
   )
   (or
     (and (= 1 (logand 1 *suffixbin*)) (      (and (= 2 (logand 2 *suffixbin*)) (      (and (= 4 (logand 4 *suffixbin*)) (    )
 )

 (defun IncsuffInputbox (typ inc / temp file dcl_id lst)
   (setq temp (vl-filename-mktemp "Tmp.dcl")
  file (open temp "w")
   )
   (write-line
     (strcat
"IncsuffInputbox:dialog{label=\"Paramètres\";"
":boxed_column{label=\"Type(s) de caractère du suffixe\";"
":toggle{label=\"Nombres [0-9]\";key=\"num\";}"
":toggle{label=\"Majuscules [A-Z]\";key=\"maj\";}"
":toggle{label=\"Minuscules [a-z]\";key=\"min\";}}"
"spacer;:edit_box{label=\"Incrément\";key=\"inc\";"
"edit_width=6;allow_accept=true;}spacer;ok_only; }")
     file
   )
   (close file)
   (setq dcl_id (load_dialog temp))
   (if	(not (new_dialog "IncsuffInputbox" dcl_id))
     (exit)
   )
   (if	(= 1 (logand 1 typ))
     (set_tile "num" "1")
   )
   (if	(= 2 (logand 2 typ))
     (set_tile "maj" "1")
   )
   (if	(= 4 (logand 4 typ))
     (set_tile "min" "1")
   )
   (set_tile "inc" (itoa inc))
   (action_tile
     "accept"
     "(setq typ (+
     (if (= (get_tile \"num\") \"1\") 1 0)
     (if (= (get_tile \"maj\") \"1\") 2 0)
     (if (= (get_tile \"min\") \"1\") 4 0))
     inc (read (get_tile \"inc\")))
     (done_dialog)"
   )
   (start_dialog)
   (unload_dialog dcl_id)
   (vl-file-delete temp)
   (list typ inc)
 )

 (or *suffixbin* (setq *suffixbin* 1))
 (or *incrvalue* (setq *incrvalue* 1))
 (while
   (not
     (and
(setq input (IncsuffInputbox *suffixbin* *incrvalue*))
(	(setq *suffixbin* (car input))
(= (type (cadr input)) 'INT)
(	(setq *incrvalue* (cadr input))
     )
   )
    (if (zerop (car input))
      (alert "Au moins un type de caractère doit être coché.")
      (alert "L'incrément doit être un entier positif non nul.")
    )
 )
 (while
   (not
     (and
  (setq	ent (nentsel
	      "\nSélectionnez le texte de départ: "
	    )
  )
(setq elst (entget (car ent)))
(setq typ (cdr (assoc 0 elst)))
(member typ '("ATTRIB" "TEXT" "MTEXT"))
(setq val (cdr (assoc 1 elst)))
     )
   )
 )
 (if (ValidSel elst)
   (progn
     (if (= typ "ATTRIB")
(setq tag (cdr (assoc 2 elst)))
     )
     (while (or (initget 1 "annUler")
	 (setq ent (nentsel
		     (strcat "\nSélectionnez le texte suivant"
			     (if save
			       " ou [annUler]: "
			       ":"
			     )
		     )
		   )
	 )
     )
(if (= ent "annUler")
  (if save
    (progn
      (setq elst (entget (caar save)))
      (entmod (subst (cons 1 (cdar save)) (assoc 1 elst) elst))
      (entupd (cdr (assoc 330 elst)))
      (setq val	 (incsuff val (- *incrvalue*) *suffixbin*)
	    save (cdr save)
      )
    )
    (princ "\nPlus rien à annuler.")
  )
  (if (and (setq elst (entget (car ent)))
	   (= (cdr (assoc 0 elst)) typ)
      )
    (if	(= typ "ATTRIB")
      (and (= (cdr (assoc 2 elst)) tag)
	   (setq save (cons (cons (car ent) (cdr (assoc 1 elst))) save)
		 val  (incsuff val *incrvalue* *suffixbin*)
	   )
	   (entmod (subst (cons 1 val) (assoc 1 elst) elst))
	   (entupd (cdr (assoc 330 elst)))
      )
      (and (setq save (cons (cons (car ent) (cdr (assoc 1 elst))) save)
		 val  (incsuff val *incrvalue* *suffixbin*)
	   )
	   (entmod (subst (cons 1 val) (assoc 1 elst) elst))
      )
    )
  )
)
     )
   )
   (princ "\nParamètre de suffixe incorrect.")
 )
 (princ)
) 

 

[Edité le 14/2/2008 par (gile)]

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

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é