Aller au contenu

[Résolu] Création de plusieurs présentations


Giropode

Messages recommandés

Bonjour à tous !

 

Ayant marre de me cogner toutes les présentations d'un plan sous forme de plusieurs feuillets, je me suis lancé dans la création d'une routine (la première de ma vie !) qui le fasse à ma place (duplication d'une présentation, attribution d'un nom sous la forme d'un nombre, décalage de l'espace objet dans la fenêtre de présentation).

 

J'ai réussi à sortir quelque chose de potable (pour moi). Je vous la soumets pour que vous me fassiez des remarques/suggestions.

 

Déjà quelques pistes d'évolution auxquelles j'ai pensé:

  • Reprendre à la suite d'un feuillet (ajout de feuillets)
  • Ajouter dans le nom de la présentation le numéro de plan (par exemple)

 

; Ce LISP permet de copier une présentation dans le cadre de la réalisation d'un carnet
; Fonctionnement : Copie de la présentation -> Décalage dans la fenêtre d'une valeur donnée -> Itération selon le nombre de page souhaitée

;-----------------------------------------------------------------------------
; Début de la commande permettant de réaliser un duplication des présentations
(defun c:FEUILLET ()
 (setq FEUILLET_NomOriginal (getstring "\nDonnez le nom de la présentation à dupliquer :") ) 				; Nom de la présentation dupliquée
 (initget 1)
 (setq FEUILLET_Nb (getint "\nDonnez le nombre de feuillets à créer :") ) 									; Nombre de feuillets que l'on veut créer
 (initget 1)
 (setq FEUILLET_DecalageX (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant X :") ) 	; Distance entre les feuillets dans l'espace objet suivant X
 (initget 1)
 (setq FEUILLET_DecalageY (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant Y :") ) 	; Distance entre les feuillets dans l'espace objet suivant X
 (setq FEUILLET_Num 1)
 (setq FEUILLET_NomPrecedent (eval FEUILLET_NomOriginal) )

 (setq FEUILLET_DecalageX (- FEUILLET_DecalageX) )
 (setq FEUILLET_DecalageY (- FEUILLET_DecalageY) )
 (setq FEUILLET_Pan (list (eval FEUILLET_DecalageX) (eval FEUILLET_DecalageY) ) )

(while (<= FEUILLET_Num FEUILLET_Nb)
	(if (= FEUILLET_NomPrecedent FEUILLET_NomOriginal)
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )

			; On "crée" le feuillet
			(FEUILLET_Duplique FEUILLET_NomOriginal FEUILLET_NomFinal FEUILLET_Pan)
		); fin de progn
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )
			
			(FEUILLET_Duplique FEUILLET_NomPrecedent FEUILLET_NomFinal FEUILLET_Pan)
		);fin de progn
	); fin de if
	
	(setq FEUILLET_NomPrecedent (eval FEUILLET_NomFinal))
	(setq FEUILLET_Num (eval (1+ FEUILLET_Num)))
); fin de while

 (command)

); fin de defun
;-----------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------
; Fonction pour vérifier et corriger, si nécessaire, la disponibilité d'un nom de présentation
(defun FEUILLET_Verif (FEUILLET_Verif_Num / FEUILLET_Verif_Nom FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations FEUILLET_Verif_Msg FEUILLET_Verif_Reponse FEUILLET_Verif_n)

; Dans un premier temps on corrige le nom  de la présentation
(setq FEUILLET_Verif_Nom (FEUILLET_CorrectionInf10 FEUILLET_Verif_Num) )

; On récupère la liste de présentations existantes
(setq FEUILLET_Verif_ListePresentations (layoutlist) )

(if (member FEUILLET_Verif_Nom FEUILLET_Verif_ListePresentations)
	(progn
		(setq FEUILLET_Verif_Msg (strcat "La présentation " FEUILLET_Verif_Nom " existe déjà. Souhaitez-vous effacer l'existante ? [Oui/Non]: ") )
		
		(initget 1 "Oui Non")
		(setq FEUILLET_Verif_Reponse (getkword FEUILLET_Verif_Msg)) ; On propose d'effacer la présentation existante
		
		(if (= FEUILLET_Verif_Reponse "Oui")
			(progn ; Si l'utilisateur accepte, on efface la présentation existante et on la remplace par la nouvelle
				(command "_layout" "effacer" FEUILLET_Verif_Nom)
				(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
			); fin de progn
			(progn ; Sinon on cherche un nom de substitution
				(setq FEUILLET_Verif_n 0)
				(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
				
				(while (member FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations)
					(setq FEUILLET_Verif_n (1+ FEUILLET_Verif_n) )
					(setq FEUILLET_Verif_NomFinal (eval (strcat FEUILLET_Verif_Nom " (" (rtos FEUILLET_Verif_n 2 0) ")") ) )				  	
				); fin du while
			)
		); fin du if
	); fin de progn
	(progn
  		(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
	); fin de progn
)

); fin de defun
;---------------------------------------------------------------------------------------------


;------------------------------------------------------------------------
; Fonction pour ajouter un zéro devant les présentations inférieures à 10
(defun FEUILLET_CorrectionInf10 (FEUILLET_CorrectionInf10_Num / FEUILLET_CorrectionInf10_Nom)

; Si le numéro de la présentation que l'on va créer est inférieure à 10, on ajoute un 0 devant
(if (< FEUILLET_CorrectionInf10_Num 10)
	(progn
		(setq FEUILLET_CorrectionInf10_Nom (strcat "0" (rtos FEUILLET_CorrectionInf10_Num 2 0) ) )
	); fin de progn
	(progn
		(setq FEUILLET_CorrectionInf10_Nom (eval FEUILLET_CorrectionInf10_Num))
	); fin de progn
); fin de if

); fin de defun
;------------------------------------------------------------------------


;--------------------------------------------------------------------------------------------
; Fonction servant à dupliquer les présentation est à déplacer l'espace objet dans la fenêtre
(defun FEUILLET_Duplique (FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal FEUILLET_Duplique_Pan)

(command "_layout" "copier" FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal)
(command "_ctab" FEUILLET_Duplique_NomFinal)
(command "_mspace")
(command "-pan" FEUILLET_Duplique_Pan "")
(command "_pspace")

); fin de defun
;--------------------------------------------------------------------------------------------
 

 

Bonne journée à tous !

 

P.S: merci à (gile) pour son cours d'introduction à AutoLISP, ça ma bien aidé (en plus du manuel fournis par Autodesk.

 

  • Upvote 1

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

Re-bonjour,

 

Petite question à 5 balle. Comment faire pour que cette routine fonctionne sur tous les AutoCAD quelques soient la langue système ?

 

Il me semble qu'il ne manque pas grand chose, mais j'ai du faire un peu des mélanges dans les noms de commande.

 

Merci et bon WE à tous !

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

bonjour et bien venu sur le forum

c'est pas si courant qu'un nouveau membre arrive avec une solution plutôt qu'un problème :)

 

pour en revenir aux commandes, je crois qu'il faut lancer la commande de la version anglaise pour que ça marche avec le préfixe "_."

 

j'avais noté ici un lien avec les traduction et un fil de discutions ou (gile) et Patrick_35 donnait des trucs pour choper les options

http://joch04.free.fr/achtml/lisps.htm#an

Lien vers le commentaire
Partager sur d’autres sites

Bonjourà tous,

 

Petite mise à jour :

  • Maintenant on peut ajouter des pages à la suite d'un carnet
  • On peut donner un numéro du plan (facultatif)
  • Normalement (à vérifier) le script est international (mais j'en suis pas du tout sûr)

 

Au sujet de l'internationalisation, j'ai compris comment faire pour appeler la commande, mais pour l'option de la commande (dans mon cas "Copier"), lorsque je met "Copy", sur AutoCAD en français cela ne fonctionne pas. Y'a-t-il quelque chose de particulier à faire ?

 

 

; Ce LISP permet de copier une présentation dans le cadre de la réalisation d'un carnet
; Fonctionnement : Copie de la présentation -> Décalage dans la fenêtre d'une valeur donnée -> Itération selon le nombre de page souhaitée

;-----------------------------------------------------------------------------
; Début de la commande permettant de réaliser un duplication des présentations
(defun c:FEUILLET ()
 (setq FEUILLET_NomOriginal (getstring "\nDonnez le nom de la présentation à dupliquer : ") ); Nom de la présentation dupliquée
 (initget 1 "Oui Non")
 (setq FEUILLET_TypeOriginal (getstring "\nS'agit-il de la première page du carnet ? [Oui/Non] : ") )  
 (setq FEUILLET_NumPlan (getstring "\nNuméro du plan (facultatif) ? ") )
 (initget 1)
 (setq FEUILLET_Nb (getint "\nDonnez le nombre de présentations à créer : ") ) ; Nombre de feuillets que l'on veut créer
 (initget 1)
 (setq FEUILLET_DecalageX (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant X : ") ) ; Distance entre les feuillets dans l'espace objet suivant X
 (initget 1)
 (setq FEUILLET_DecalageY (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant Y : ") ) ; Distance entre les feuillets dans l'espace objet suivant X
 (setq FEUILLET_NomPrecedent (eval FEUILLET_NomOriginal) )

 (setq FEUILLET_DecalageX (- FEUILLET_DecalageX) )
 (setq FEUILLET_DecalageY (- FEUILLET_DecalageY) )
 (setq FEUILLET_Pan (list (eval FEUILLET_DecalageX) (eval FEUILLET_DecalageY) ) )

(cond
	( (= FEUILLET_TypeOriginal "N") (setq FEUILLET_TypeOriginal 1) )
	( (= FEUILLET_TypeOriginal "n") (setq FEUILLET_TypeOriginal 1) )
	( (= FEUILLET_TypeOriginal "Non") (setq FEUILLET_TypeOriginal 1) )		
	( (= FEUILLET_TypeOriginal "O") (setq FEUILLET_TypeOriginal 0) )		
	( (= FEUILLET_TypeOriginal "o") (setq FEUILLET_TypeOriginal 0) )
	( (= FEUILLET_TypeOriginal "Oui") (setq FEUILLET_TypeOriginal 0) )
); fin de cond

(if (= FEUILLET_TypeOriginal 1)
	(progn
		(if (/= FEUILLET_NumPlan "")
			(progn
				(setq FEUILLET_PrefixePresentation (strcat FEUILLET_NumPlan "-") )
				(setq FEUILLET_NumOriginal (vl-string-left-trim (eval FEUILLET_PrefixePresentation) (eval FEUILLET_NomOriginal) ) )
				(setq FEUILLET_Num (rtos (read FEUILLET_NumOriginal) 2 0) )
			  	(setq FEUILLET_Num (eval (read FEUILLET_Num ) ) )
			  	(setq FEUILLET_Nb (+ FEUILLET_Num FEUILLET_Nb) )
			  	(setq FEUILLET_Num (eval (1+ FEUILLET_Num) ) )
			); fin de progn
			(progn				
				(setq FEUILLET_Num (rtos (read FEUILLET_NomOriginal) 2 0) )
			  	(setq FEUILLET_Num (eval (read FEUILLET_Num ) ) )
			  	(setq FEUILLET_Num (eval (1+ FEUILLET_Num) ))
			  	(setq FEUILLET_Nb (+ FEUILLET_Num FEUILLET_Nb) )
			); fin de progn
		); fin de if
	); fin de progn
	(progn
		(setq FEUILLET_Num 1)
	); fin de progn
)
(while (<= FEUILLET_Num FEUILLET_Nb)
	(if (= FEUILLET_NomPrecedent FEUILLET_NomOriginal)
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )

			; On "crée" le feuillet
			(FEUILLET_Duplique FEUILLET_NomOriginal FEUILLET_NomFinal FEUILLET_Pan)
		); fin de progn
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )
			
			(FEUILLET_Duplique FEUILLET_NomPrecedent FEUILLET_NomFinal FEUILLET_Pan)
		);fin de progn
	); fin de if
	
	(setq FEUILLET_NomPrecedent (eval FEUILLET_NomFinal))
	(setq FEUILLET_Num (eval (1+ FEUILLET_Num)))
); fin de while

); fin de defun
;-----------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------
; Fonction pour vérifier et corriger, si nécessaire, la disponibilité d'un nom de présentation
(defun FEUILLET_Verif (FEUILLET_Verif_Num / FEUILLET_Verif_Nom FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations FEUILLET_Verif_Msg FEUILLET_Verif_Reponse FEUILLET_Verif_n)

; Dans un premier temps on corrige le nom  de la présentation
(setq FEUILLET_Verif_Nom (FEUILLET_CorrectionInf10 FEUILLET_Verif_Num) )
 	(if (/= FEUILLET_NumPlan "")
  	(progn
	  	(if (= (type FEUILLET_Verif_Nom) 'STR )
		  	(progn
	  			(setq FEUILLET_Verif_Nom (strcat FEUILLET_NumPlan "-" FEUILLET_Verif_Nom) )
			); fin de progn
		  	(progn
	  			(setq FEUILLET_Verif_Nom (strcat FEUILLET_NumPlan "-" (rtos FEUILLET_Verif_Nom 2 0) ) )
			); fin de progn
		); fin de if
	); fin de progn
); fin de if
; On récupère la liste de présentations existantes
(setq FEUILLET_Verif_ListePresentations (layoutlist) )

(if (member FEUILLET_Verif_Nom FEUILLET_Verif_ListePresentations)
	(progn
		(setq FEUILLET_Verif_Msg (strcat "La présentation " FEUILLET_Verif_Nom " existe déjà. Souhaitez-vous effacer l'existante ? [Oui/Non]: ") )
		
		(initget 1 "Oui Non")
		(setq FEUILLET_Verif_Reponse (getkword FEUILLET_Verif_Msg)) ; On propose d'effacer la présentation existante
		
		(if (= FEUILLET_Verif_Reponse "Oui")
			(progn ; Si l'utilisateur accepte, on efface la présentation existante et on la remplace par la nouvelle
				(command "_.layout" "delete" FEUILLET_Verif_Nom)
				(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
			); fin de progn
			(progn ; Sinon on cherche un nom de substitution
				(setq FEUILLET_Verif_n 0)
				(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
				
				(while (member FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations)
					(setq FEUILLET_Verif_n (1+ FEUILLET_Verif_n) )
					(setq FEUILLET_Verif_NomFinal (eval (strcat FEUILLET_Verif_Nom " (" (rtos FEUILLET_Verif_n 2 0) ")") ) )					  
				); fin du while
			)
		); fin du if
	); fin de progn
	(progn
	  	(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
	); fin de progn
)

); fin de defun
;---------------------------------------------------------------------------------------------


;------------------------------------------------------------------------
; Fonction pour ajouter un zéro devant les présentations inférieures à 10
(defun FEUILLET_CorrectionInf10 (FEUILLET_CorrectionInf10_Num / FEUILLET_CorrectionInf10_Nom)

; Si le numéro de la présentation que l'on va créer est inférieure à 10, on ajoute un 0 devant
(if (< FEUILLET_CorrectionInf10_Num 10)
	(progn
		(setq FEUILLET_CorrectionInf10_Nom (strcat "0" (rtos FEUILLET_CorrectionInf10_Num 2 0) ) )
	); fin de progn
	(progn
		(setq FEUILLET_CorrectionInf10_Nom (eval FEUILLET_CorrectionInf10_Num))
	); fin de progn
); fin de if

); fin de defun
;------------------------------------------------------------------------


;--------------------------------------------------------------------------------------------
; Fonction servant à dupliquer les présentation est à déplacer l'espace objet dans la fenêtre
(defun FEUILLET_Duplique (FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal FEUILLET_Duplique_Pan)

(command "_.layout" "c" FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal)
(command "ctab" FEUILLET_Duplique_NomFinal)
(command "_.mspace")
(command "_.pan" FEUILLET_Duplique_Pan "")
(command "_.pspace")

); fin de defun
;--------------------------------------------------------------------------------------------
 

 

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

Re-bonjour,

 

En fait c'est bon, en lisant l'aide développeur d'autocad, ils disent qu'il faut mettre un "_" devant le nom de la commande en anglais et aussi devant le nom de l'option.

 

Ci-joint le code final.

; Ce LISP permet de copier une présentation dans le cadre de la réalisation d'un carnet
; Fonctionnement : Copie de la présentation -> Décalage dans la fenêtre d'une valeur donnée -> Itération selon le nombre de page souhaitée

;-----------------------------------------------------------------------------
; Début de la commande permettant de réaliser un duplication des présentations
(defun c:FEUILLET ()
 (setq FEUILLET_NomOriginal (getstring "\nDonnez le nom de la présentation à dupliquer : ") ); Nom de la présentation dupliquée
 (initget 1 "Oui Non")
 (setq FEUILLET_TypeOriginal (getstring "\nS'agit-il de la première page du carnet ? [Oui/Non] : ") )  
 (setq FEUILLET_NumPlan (getstring "\nNuméro du plan (facultatif) ? ") )
 (initget 1)
 (setq FEUILLET_Nb (getint "\nDonnez le nombre de présentations à créer : ") ) ; Nombre de feuillets que l'on veut créer
 (initget 1)
 (setq FEUILLET_DecalageX (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant X : ") ) ; Distance entre les feuillets dans l'espace objet suivant X
 (initget 1)
 (setq FEUILLET_DecalageY (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant Y : ") ) ; Distance entre les feuillets dans l'espace objet suivant X
 (setq FEUILLET_NomPrecedent (eval FEUILLET_NomOriginal) )

 (setq FEUILLET_DecalageX (- FEUILLET_DecalageX) )
 (setq FEUILLET_DecalageY (- FEUILLET_DecalageY) )
 (setq FEUILLET_Pan (list (eval FEUILLET_DecalageX) (eval FEUILLET_DecalageY) ) )

(cond
	( (= FEUILLET_TypeOriginal "N") (setq FEUILLET_TypeOriginal 1) )
	( (= FEUILLET_TypeOriginal "n") (setq FEUILLET_TypeOriginal 1) )
	( (= FEUILLET_TypeOriginal "Non") (setq FEUILLET_TypeOriginal 1) )		
	( (= FEUILLET_TypeOriginal "O") (setq FEUILLET_TypeOriginal 0) )		
	( (= FEUILLET_TypeOriginal "o") (setq FEUILLET_TypeOriginal 0) )
	( (= FEUILLET_TypeOriginal "Oui") (setq FEUILLET_TypeOriginal 0) )
); fin de cond

(if (= FEUILLET_TypeOriginal 1)
	(progn
		(if (/= FEUILLET_NumPlan "")
			(progn
				(setq FEUILLET_PrefixePresentation (strcat FEUILLET_NumPlan "-") )
				(setq FEUILLET_NumOriginal (vl-string-left-trim (eval FEUILLET_PrefixePresentation) (eval FEUILLET_NomOriginal) ) )
				(setq FEUILLET_Num (rtos (read FEUILLET_NumOriginal) 2 0) )
			  	(setq FEUILLET_Num (eval (read FEUILLET_Num ) ) )
			  	(setq FEUILLET_Nb (+ FEUILLET_Num FEUILLET_Nb) )
			  	(setq FEUILLET_Num (eval (1+ FEUILLET_Num) ) )
			); fin de progn
			(progn				
				(setq FEUILLET_Num (rtos (read FEUILLET_NomOriginal) 2 0) )
			  	(setq FEUILLET_Num (eval (read FEUILLET_Num ) ) )
			  	(setq FEUILLET_Num (eval (1+ FEUILLET_Num) ))
			  	(setq FEUILLET_Nb (+ FEUILLET_Num FEUILLET_Nb) )
			); fin de progn
		); fin de if
	); fin de progn
	(progn
		(setq FEUILLET_Num 1)
	); fin de progn
)
(while (<= FEUILLET_Num FEUILLET_Nb)
	(if (= FEUILLET_NomPrecedent FEUILLET_NomOriginal)
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )

			; On "crée" le feuillet
			(FEUILLET_Duplique FEUILLET_NomOriginal FEUILLET_NomFinal FEUILLET_Pan)
		); fin de progn
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )
			
			(FEUILLET_Duplique FEUILLET_NomPrecedent FEUILLET_NomFinal FEUILLET_Pan)
		);fin de progn
	); fin de if
	
	(setq FEUILLET_NomPrecedent (eval FEUILLET_NomFinal))
	(setq FEUILLET_Num (eval (1+ FEUILLET_Num)))
); fin de while

); fin de defun
;-----------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------
; Fonction pour vérifier et corriger, si nécessaire, la disponibilité d'un nom de présentation
(defun FEUILLET_Verif (FEUILLET_Verif_Num / FEUILLET_Verif_Nom FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations FEUILLET_Verif_Msg FEUILLET_Verif_Reponse FEUILLET_Verif_n)

; Dans un premier temps on corrige le nom  de la présentation
(setq FEUILLET_Verif_Nom (FEUILLET_CorrectionInf10 FEUILLET_Verif_Num) )
 	(if (/= FEUILLET_NumPlan "")
  	(progn
	  	(if (= (type FEUILLET_Verif_Nom) 'STR )
		  	(progn
	  			(setq FEUILLET_Verif_Nom (strcat FEUILLET_NumPlan "-" FEUILLET_Verif_Nom) )
			); fin de progn
		  	(progn
	  			(setq FEUILLET_Verif_Nom (strcat FEUILLET_NumPlan "-" (rtos FEUILLET_Verif_Nom 2 0) ) )
			); fin de progn
		); fin de if
	); fin de progn
); fin de if
; On récupère la liste de présentations existantes
(setq FEUILLET_Verif_ListePresentations (layoutlist) )

(if (member FEUILLET_Verif_Nom FEUILLET_Verif_ListePresentations)
	(progn
		(setq FEUILLET_Verif_Msg (strcat "La présentation " FEUILLET_Verif_Nom " existe déjà. Souhaitez-vous effacer l'existante ? [Oui/Non]: ") )
		
		(initget 1 "Oui Non")
		(setq FEUILLET_Verif_Reponse (getkword FEUILLET_Verif_Msg)) ; On propose d'effacer la présentation existante
		
		(if (= FEUILLET_Verif_Reponse "Oui")
			(progn ; Si l'utilisateur accepte, on efface la présentation existante et on la remplace par la nouvelle
				(command "_layout" "_d" FEUILLET_Verif_Nom)
				(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
			); fin de progn
			(progn ; Sinon on cherche un nom de substitution
				(setq FEUILLET_Verif_n 0)
				(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
				
				(while (member FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations)
					(setq FEUILLET_Verif_n (1+ FEUILLET_Verif_n) )
					(setq FEUILLET_Verif_NomFinal (eval (strcat FEUILLET_Verif_Nom " (" (rtos FEUILLET_Verif_n 2 0) ")") ) )					  
				); fin du while
			)
		); fin du if
	); fin de progn
	(progn
	  	(setq FEUILLET_Verif_NomFinal (eval FEUILLET_Verif_Nom) )
	); fin de progn
)

); fin de defun
;---------------------------------------------------------------------------------------------


;------------------------------------------------------------------------
; Fonction pour ajouter un zéro devant les présentations inférieures à 10
(defun FEUILLET_CorrectionInf10 (FEUILLET_CorrectionInf10_Num / FEUILLET_CorrectionInf10_Nom)

; Si le numéro de la présentation que l'on va créer est inférieure à 10, on ajoute un 0 devant
(if (< FEUILLET_CorrectionInf10_Num 10)
	(progn
		(setq FEUILLET_CorrectionInf10_Nom (strcat "0" (rtos FEUILLET_CorrectionInf10_Num 2 0) ) )
	); fin de progn
	(progn
		(setq FEUILLET_CorrectionInf10_Nom (eval FEUILLET_CorrectionInf10_Num))
	); fin de progn
); fin de if

); fin de defun
;------------------------------------------------------------------------


;--------------------------------------------------------------------------------------------
; Fonction servant à dupliquer les présentation est à déplacer l'espace objet dans la fenêtre
(defun FEUILLET_Duplique (FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal FEUILLET_Duplique_Pan)

(command "_layout" "_c" FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal)
(command "_ctab" FEUILLET_Duplique_NomFinal)
(command "_mspace")
(command "_pan" FEUILLET_Duplique_Pan "")
(command "_pspace")

); fin de defun
;--------------------------------------------------------------------------------------------
 

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

C'est sympa de partager ses codes. Le principal est qu'il fonctionne et qu'il te satisfasse.

 

Comme tu le demandes, quelques pistes

(cond
               ( (= FEUILLET_TypeOriginal "N") (setq FEUILLET_TypeOriginal 1) )
               ( (= FEUILLET_TypeOriginal "n") (setq FEUILLET_TypeOriginal 1) )
               ( (= FEUILLET_TypeOriginal "Non") (setq FEUILLET_TypeOriginal 1) )              
               ( (= FEUILLET_TypeOriginal "O") (setq FEUILLET_TypeOriginal 0) )                
               ( (= FEUILLET_TypeOriginal "o") (setq FEUILLET_TypeOriginal 0) )
               ( (= FEUILLET_TypeOriginal "Oui") (setq FEUILLET_TypeOriginal 0) )
       )

Par exemple

(if (vl-position FEUILLET_TypeOriginal '("N" "n" "Non"))
 (setq FEUILLET_TypeOriginal 1)
 (setq FEUILLET_TypeOriginal 0)
)

ou encore, pour simplifier (a placer avant la question)

(initget 1 "Oui Non")

 

Tu peux intégrer une gestion des erreurs, redéfinir la variable cmdecho afin de ne pas voir le défilement des commandes (variable que l'on restaure à l'état initial en fin de programme ou en cas d'erreur, d'où la gestion des erreurs)

J'ai remarqué aussi que si tu as juste une fonction après un if, inutile d'ajouter un progn.

Une dernière chose est que tu utilises abondamment des eval et read. A la lecture de ton lisp, ces fonctions n'apportent rien. Tu sais si tes variables sont des chaines de caractères, des réels ou autres.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

(cond
               ( (= FEUILLET_TypeOriginal "N") (setq FEUILLET_TypeOriginal 1) )
               ( (= FEUILLET_TypeOriginal "n") (setq FEUILLET_TypeOriginal 1) )
               ( (= FEUILLET_TypeOriginal "Non") (setq FEUILLET_TypeOriginal 1) )              
               ( (= FEUILLET_TypeOriginal "O") (setq FEUILLET_TypeOriginal 0) )                
               ( (= FEUILLET_TypeOriginal "o") (setq FEUILLET_TypeOriginal 0) )
               ( (= FEUILLET_TypeOriginal "Oui") (setq FEUILLET_TypeOriginal 0) )
       )

Par exemple

(if (vl-position FEUILLET_TypeOriginal '("N" "n" "Non"))
 (setq FEUILLET_TypeOriginal 1)
 (setq FEUILLET_TypeOriginal 0)
)

 

Parfait !

 

ou encore, pour simplifier (a placer avant la question)

(initget 1 "Oui Non")

A ce sujet, j'étais partis avec cette solution de base, mais en faisant un test en mettant juste o en minuscule, ça ne fonctionnait pas...

Erreur de ma part, j'avais mis getstring au lieu de getkword...

 

Tu peux intégrer une gestion des erreurs, redéfinir la variable cmdecho afin de ne pas voir le défilement des commandes (variable que l'on restaure à l'état initial en fin de programme ou en cas d'erreur, d'où la gestion des erreurs)

Il va falloir que je me penche sur le sujet.

 

J'ai remarqué aussi que si tu as juste une fonction après un if, inutile d'ajouter un progn.

J'en ai un peu abusé. Il faut que je me relise. Petite question à ce sujet, je peux imbriqué un if dans un autre if sans utiliser progn ?

 

Une dernière chose est que tu utilises abondamment des eval et read. A la lecture de ton lisp, ces fonctions n'apportent rien. Tu sais si tes variables sont des chaines de caractères, des réels ou autres.

 

@+

Je pense que c'est une mauvaise compréhension de ma part de ces fonctions...

Modifié par Giropode

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Ton lisp semble bien fonctionner Giropode.;). Comme le dis Patrick (que je salut au passage'B)) il est très certainement perfectible (et on peut lui faire confiance !)

 

En ce qui me concerne, un cadre représentatif en espace objet des présentations ainsi créées serait pas mal afin de mieux visualiser les folios après création des feuilles de présentation, le tout sur un calque unique facilement gelable.

 

Je l'ai fait "manuellement" sur un petit fichier en créant un rectangle sur la fenêtre et en modifiant d'espace ce rectangle (_chspace) afin de visualiser la vue dans l'espace objet

Civil 3D 2024 - COVADIS_18.2

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

Lien vers le commentaire
Partager sur d’autres sites

A ce sujet, j'étais partis avec cette solution de base, mais en faisant un test en mettant juste o en minuscule, ça ne fonctionnait pas...

Par exemple

(initget 1 "Oui Non")
(setq question (getkword "Êtes-vous content [Oui/Non] : "))

J'en ai un peu abusé. Il faut que je me relise. Petite question à ce sujet, je peux imbriqué un if dans un autre if sans utiliser progn ?

Oui

 

@lili2006 : V

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

En ce qui me concerne, un cadre représentatif en espace objet des présentations ainsi créées serait pas mal afin de mieux visualiser les folios après création des feuilles de présentation, le tout sur un calque unique facilement gelable.

 

Je l'ai fait "manuellement" sur un petit fichier en créant un rectangle sur la fenêtre et en modifiant d'espace ce rectangle (_chspace) afin de visualiser la vue dans l'espace objet

Un cadre qui sert uniquement à dire : "Eh coco ! T'as fait les présentations de seuelement ces pages ?" ^^

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

J'avoue que je n'ai jamais était trop confronté au problème. En effet, dans les carnets de ferraillage, les feuillets dépassent rarement la cinquantaine de pages ^^.

En plus généralement, on fait notre mise en page à la fin.

 

Mais l'idée est bonne et me donne un autre défi : dessiner un rectangle et jouer avec pour le modifier ^^

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Bonjour à tous,

 

Ci-joint une mise à jour du LISP.

P.S. : @lili2006, je ne gère toujours pas l'histoire du rectangle. Un jour ! :rolleyes:

 

; Ce LISP permet de dupliquer des présentations en plusieurs exemplaires et de les renommer
; Fonctionnement : Copie de la présentation -> Décalage des fenêtres d'une valeur donnée -> Itération selon le nombre de pages souhaitées

;-----------------------------------------------------------------------------
; Début de la commande permettant de réaliser la duplication des présentations
(defun c:FEUILLET (/ *error*)

(setq FEUILLET_CMDECHO (getvar 'CMDECHO) )

(defun *error* (MsgErreur)
	(setvar 'CMDECHO FEUILLET_CMDECHO)
  	(princ "\nErreur : ")
  	(princ MsgErreur)
  	(princ)
)

(setvar 'CMDECHO 0)

(setq FEUILLET_ListePresentations (FEUILLET_ListerPresentations) ) ; On liste les présentations de l'espace papier
(setq FEUILLET_ListePresentationsMsg (vl-string-translate " " "/" FEUILLET_ListePresentations) ) ; On les espaces par des / pour le getkword
(setq FEUILLET_ListePresentationsMsg (strcat "\nDonnez le nom de la présentation à dupliquer [" FEUILLET_ListePresentationsMsg "] : ") ) ; On finalise la question pour le getkword

(initget 1 FEUILLET_ListePresentations)
(setq FEUILLET_NomOriginal (getkword FEUILLET_ListePresentationsMsg) ); On demande le nom de la présentation à dupliquer
(initget 1 "Oui Non")
(setq FEUILLET_TypeOriginal (getkword "\nS'agit-il de la première page du carnet ? [Oui/Non] : ") )  ; On demande si il s'agit de la première présentation d'un carnet
(setq FEUILLET_NumPlan (getstring "\nNuméro du plan (facultatif) ? ") ) ; On propose l'ajout d'un numéro de plan (si plusieurs carnet dans la même fichier)
(initget 1)
(setq FEUILLET_Nb (getint "\nDonnez le nombre de présentations à créer : ") ) ; On demande le nombre de présenations à créer
(setq FEUILLET_NbString (rtos FEUILLET_Nb 2 0) )
(setq FEUILLET_MsgFinal (strcat FEUILLET_NbString " présentation(s) créée(s)"))
(initget 1)
(setq FEUILLET_DecalageX (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant X : ") ) ; Distance entre les feuillets dans l'espace objet suivant X
(initget 1)
(setq FEUILLET_DecalageY (getreal "\nDonnez la valeur de décalage entre chaque feuillet suivant Y : ") ) ; Distance entre les feuillets dans l'espace objet suivant X
(setq FEUILLET_NomPrecedent FEUILLET_NomOriginal )

(setq FEUILLET_DecalageX (- FEUILLET_DecalageX) )
(setq FEUILLET_DecalageY (- FEUILLET_DecalageY) )
(setq FEUILLET_Pan (list FEUILLET_DecalageX FEUILLET_DecalageY ) )

(if (= FEUILLET_TypeOriginal "Non")
	(if (/= FEUILLET_NumPlan "")
		(progn
			(setq FEUILLET_PrefixePresentation (strcat FEUILLET_NumPlan "-") )
			(setq FEUILLET_NumOriginal (vl-string-trim FEUILLET_PrefixePresentation FEUILLET_NomOriginal ) )
			(setq FEUILLET_Num (atoi FEUILLET_NumOriginal) )
			(setq FEUILLET_Nb (+ FEUILLET_Num FEUILLET_Nb) )
			(setq FEUILLET_Num (+ FEUILLET_Num 1) )
		); fin de progn
		(progn		
			(setq FEUILLET_Num (atoi FEUILLET_NomOriginal) )
			(setq FEUILLET_Nb (+ FEUILLET_Num FEUILLET_Nb) )
			(setq FEUILLET_Num (+ FEUILLET_Num 1) )
		); fin de progn
	); fin de if
	(setq FEUILLET_Num 1)
)
(while (<= FEUILLET_Num FEUILLET_Nb)
	(if (= FEUILLET_NomPrecedent FEUILLET_NomOriginal)
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )

			; On "crée" le feuillet
			(FEUILLET_Duplique FEUILLET_NomOriginal FEUILLET_NomFinal FEUILLET_Pan)
		); fin de progn
		(progn
			; On vérifie le nom du feuillet
			(setq FEUILLET_NomFinal (FEUILLET_Verif FEUILLET_Num) )
			
			(FEUILLET_Duplique FEUILLET_NomPrecedent FEUILLET_NomFinal FEUILLET_Pan)
		);fin de progn
	); fin de if
	
	(setq FEUILLET_NomPrecedent FEUILLET_NomFinal)
	(setq FEUILLET_Num (1+ FEUILLET_Num) )
); fin de while

(setvar 'CMDECHO 1)
(alert FEUILLET_MsgFinal)

); fin de defun
;-----------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------
; Fonction pour vérifier et corriger, si nécessaire, la disponibilité d'un nom de présentation
(defun FEUILLET_Verif (FEUILLET_Verif_Num / *error* FEUILLET_Verif_Nom FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations FEUILLET_Verif_Msg FEUILLET_Verif_Reponse FEUILLET_Verif_n)

(defun *error* (MsgErreur)
  	(princ "\nErreur : ")
  	(princ MsgErreur)
  	(princ)
)

; Dans un premier temps on corrige le nom  de la présentation
(setq FEUILLET_Verif_Nom (FEUILLET_CorrectionInf10 FEUILLET_Verif_Num) )
 	(if (/= FEUILLET_NumPlan "")
	(if (= (type FEUILLET_Verif_Nom) 'STR )
		(setq FEUILLET_Verif_Nom (strcat FEUILLET_NumPlan "-" FEUILLET_Verif_Nom) )
		(setq FEUILLET_Verif_Nom (strcat FEUILLET_NumPlan "-" (rtos FEUILLET_Verif_Nom 2 0) ) )
	); fin de if
); fin de if
; On récupère la liste de présentations existantes
(setq FEUILLET_Verif_ListePresentations (layoutlist) )

(if (member FEUILLET_Verif_Nom FEUILLET_Verif_ListePresentations)
	(progn
		(setq FEUILLET_Verif_Msg (strcat "La présentation " FEUILLET_Verif_Nom " existe déjà. Souhaitez-vous effacer l'existante ? [Oui/Non]: ") )
		
		(initget 1 "Oui Non")
		(setq FEUILLET_Verif_Reponse (getkword FEUILLET_Verif_Msg)) ; On propose d'effacer la présentation existante
		
		(if (= FEUILLET_Verif_Reponse "Oui")
			(progn ; Si l'utilisateur accepte, on efface la présentation existante et on la remplace par la nouvelle
				(command "_layout" "_d" FEUILLET_Verif_Nom)
				(setq FEUILLET_Verif_NomFinal FEUILLET_Verif_Nom )
			); fin de progn
			(progn ; Sinon on cherche un nom de substitution
				(setq FEUILLET_Verif_n 0)
				(setq FEUILLET_Verif_NomFinal FEUILLET_Verif_Nom )
				
				(while (member FEUILLET_Verif_NomFinal FEUILLET_Verif_ListePresentations)
					(setq FEUILLET_Verif_n (1+ FEUILLET_Verif_n) )
					(setq FEUILLET_Verif_NomFinal (strcat FEUILLET_Verif_Nom " (" (rtos FEUILLET_Verif_n 2 0) ")") )					  
				); fin du while
			); fin de progn
		); fin du if
	); fin de progn
	(setq FEUILLET_Verif_NomFinal FEUILLET_Verif_Nom )
)

); fin de defun
;---------------------------------------------------------------------------------------------


;------------------------------------------------------------------------
; Fonction pour ajouter un zéro devant les présentations inférieures à 10
(defun FEUILLET_CorrectionInf10 (FEUILLET_CorrectionInf10_Num / *error* FEUILLET_CorrectionInf10_Nom)

(defun *error* (MsgErreur)
  	(princ "\nErreur : ")
  	(princ MsgErreur)
  	(princ)
)

; Si le numéro de la présentation que l'on va créer est inférieure à 10, on ajoute un 0 devant
(if (< FEUILLET_CorrectionInf10_Num 10)
	(setq FEUILLET_CorrectionInf10_Nom (strcat "0" (rtos FEUILLET_CorrectionInf10_Num 2 0) ) )
	(setq FEUILLET_CorrectionInf10_Nom FEUILLET_CorrectionInf10_Num)
); fin de if

); fin de defun
;------------------------------------------------------------------------


;--------------------------------------------------------------------------------------------
; Fonction servant à dupliquer les présentation est à déplacer l'espace objet dans la fenêtre
(defun FEUILLET_Duplique (FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal FEUILLET_Duplique_Pan / *error*)

(defun *error* (MsgErreur)
  	(princ "\nErreur : ")
  	(princ MsgErreur)
  	(princ)
)

(command "_layout" "_c" FEUILLET_Duplique_NomPrecedent FEUILLET_Duplique_NomFinal)
(command "_ctab" FEUILLET_Duplique_NomFinal)
(command "_mspace")
	; Fonction permettant de modifier plusieurs fenêtres dans l'espace papier, récupérée sur CADXP, je n'arrive pas à la comprendre, mais elle fonctionne !
	(if
 			(setq ss
   				(ssget "_X"
     					(list
       					(cons 0 "viewport")
       					(if (getvar "ctab")
         						(cons 410 (getvar "ctab"))
         						(cons 67 (- 1 (getvar "tilemode")))
       					); fin de if
     					); fin de list
   				); fin de ssget
 			); fin de setq
 			(foreach n (mapcar 'cdr (mapcar '(lambda (x) (assoc 69 x)) (mapcar 'entget (mapcar 'cadr (ssnamex ss)))))
   				(if (not (eq n 1))
			      (progn
			        (setvar "cvport" n)
			        (command "_pan" FEUILLET_Duplique_Pan "")
			      )
  				); fin de if
 			); fin de foreach
	); fin de if

(command "_pspace")

); fin de defun
;--------------------------------------------------------------------------------------------


;------------------------------------------------------------------
; Fonction servant à récupérer la liste des présentations du projet
(defun FEUILLET_ListerPresentations (/ *error*)

(defun *error* (MsgErreur)
  	(princ "\nErreur : ")
  	(princ MsgErreur)
  	(princ)
)

(setq FEUILLET_Presentations (layoutlist) )
(setq FEUILLET_ListePresentations "")

(foreach FEUILLET_Iteration FEUILLET_Presentations
	(if (/= FEUILLET_ListePresentations "")
		(setq FEUILLET_ListePresentations (strcat FEUILLET_ListePresentations " ") )
	); fin de if
	(setq FEUILLET_ListePresentations (strcat FEUILLET_ListePresentations FEUILLET_Iteration))
); fin de foreach
); fin de defun
;------------------------------------------------------------------
 

Mon pense bête : Mon blog fourre-tout

Ma bible : Aide AutoCAD

Mon futur calvaire : Revit

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

Salut à tous !

 

Désolé de déterrer le sujet ... mais ce lisp est tout simplement GENIAL !

 

Il fait PRESQUE ce que je veux ...

 

Pour faire simple je suis en train de modéliser un carnet de Bordures avec ... 560 bordures différentes ...

Chaque bordure est donc un Solide 3D dans mon fichier, et chaque onglet de présentation affiche ce solide sous tous les angles.

 

Du coup quand je crée des onglet via le lisp, ça me décale correctement la fenêtre "vue en plan".

 

Ma question est simple : Est-il possible de modifier ce lisp pour lui faire appliquer un décalage différent en fonction de la fenêtre ?

Ou plus simple, Décaler une seule fenêtre dans chaque onglet sans devoir créer de nouveaux onglets ?

 

Je sais pas si je suis très clair ...

 

:D

AutoCAD Map 3D 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

Lien vers le commentaire
Partager sur d’autres sites

Etttttt voilà j'ai trouvé comment faire :)

 

Il suffit de mettre l'ensemble de mes fenêtres (vue de haut/bas/gauche/droite/face/ ...) dans le SCG et on pas dans le SCU de la vue ... et nickel chrome !

 

 

100000000 merci pour ce lisp ! il est tout simplement dingue pour créer des carnets !

AutoCAD Map 3D 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

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é