Aller au contenu

Messages recommandés

Posté(e)

bonjour,

 

Voila j'essaie de faire un lisp pour incrementer un calque cf ci-dessous :

 

 (defun c:inclayer (/ nom_calque compteur)

(setq nom_calque (getvar "Clayer"));récupere le calque courant
(setq compteur 1)

(if (= tblsearch "LAYER" (strcat nom_calque (itoa compteur))nil)

(command "_-layer" "N" (strcat nom_calque (itoa compteur)) "")
	
	
		((setq compteur (1+ compteur)) 
                   		(command "_-layer" "N" (strcat nom_calque (itoa compteur)) "")
				)
);fin du if

);fin du defun

 

Mais il me manque quelques notion en lisp (voir beaucoup)

Le but c'est d'incrementer le calque courant ex: calque courant toto =>toto1

et que si toto1 existe => toto2.....etc

 

il faudrait aussi que le lisp gere : calque courant toto2 que ca me creé toto3.

 

Voila j'espere que j'ai été clair.

 

@plus

 

LB

Posté(e)

Salut lovecraft,

 

C'est bien ce qu'il m'avait semblé comprendre sur "TheSwamp".

Je te propose une fonction plus "générique" qui retourne le premier nom incrémenté qui n'existe pas dans la table.

 

(IncrName (getvar "clayer") "LAYER" 1) retournera "toto1" ou "toto2" etc...

 

;;; IncrName (gile)
;;; Retourne le premier nom incrémenté qui n'existe pas dans la table
;;;
;;; Arguments
;;; pref : le préfixe du nom (string)
;;; table : une table ("LAYER", "LTYPE", "VIEW", "STYLE", "BLOCK", "UCS", "APPID", "DIMSTYLE", "VPORT)
;;; start : l'incrément de départ (entier)

(defun IncrName	(pref table start / name)
 (while (tblsearch table
	    (setq name (strcat pref (itoa start)))
 )
   (setq start (1+ start))
 )
 name
) 

 

La même sous forme récursive :

 

(defun IncrName (pref table start)
 (if (tblsearch table (strcat pref (itoa start)))
   (IncrName pref table (1+ start))
   (strcat pref (itoa start))
 )
) 

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

Posté(e)

Si le calque toto2 est courant qu'il créé toto3 =>non toto21 comme actuellement.

 

Dans ce cas, il faut d'abord récupérer le préfixe et le suffixe ("toto" et"2"), convertir "2" en 2, puis utiliser la méthode donnée plus haut

 

(defun c:inclayer (/ pref suff ind)
 (setq	pref (getvar "CLAYER")
ind  ""
 )
 (while (numberp (read (setq suff (substr pref (strlen pref)))))
   (setq ind  (strcat suff ind)
  pref (substr pref 1 (1- (strlen pref)))
   )
 )
 (setq ind (1+ (atoi ind)))
 (while (tblsearch "LAYER"
	    (setq name (strcat pref (itoa ind)))
 )
   (setq ind (1+ ind))
 )
 (entmake
   (list '(0 . "LAYER")
  '(100 . "AcDbSymbolTableRecord")
  '(100 . "AcDbLayerTableRecord")
  (cons 2 name)
  '(70 . 0)
   )
 )
 (princ (strcat "\nLe calque \"" name "\" a été créé."))
 (princ)
) 

 

Merci pour la recursive

 

Cette routine n'apporte rien de plus par rapport à forme itérative (while ...), mais je pense que la compréhension de la récursivité est une étape importante dans l'apprentissage de la programmation (algorithmie).

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

Posté(e)

Re,

 

Après quelques tests je me suis aperçu que la commande ci dessus retourne une erreur si le nom du calque courant ne comporte que des caractères numériques (exemple le calque "0").

 

Je te propose une autre solution avec la routine incsuff (moins simple à comprendre mais intéressante à décortiquer).

 

(defun c:inclayer (/ name)
 (setq name (getvar "CLAYER"))
 (or (numberp (read (substr name (strlen name))))
     (setq name (strcat name "1"))
 )
 (while (tblsearch "LAYER" name)
   (setq name (incsuff name 1 1))
 )
 (entmake
   (list '(0 . "LAYER")
  '(100 . "AcDbSymbolTableRecord")
  '(100 . "AcDbLayerTableRecord")
  (cons 2 name)
  '(70 . 0)
   )
 )
 (princ (strcat "\nLe calque \"" name "\" a été créé."))
 (princ)
) 

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

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é