Aller au contenu

Messages recommandés

Posté(e)

Salut à tous!

 

Pour les besoins d'un lisp, j'ai développé quelques fonctions utilisant les réacteurs,

mais uniquement sur les variables système d'autocad.

 

Ayant des petits problème de santé et physique, je n'ai pas pu attaquer mon super challenge :( .

 

Voici le code en complet bien-sûr:

;| CONSEILS D'UTILISATION
Les réacteurs créés et testés, ne sont que ceux sur les variables système d'autocad

fonctions à utiliser:
- force_sysvar          (2 arguments)
- stop_force_sysvar     (1 argument)
- stop_all_force_sysvar (0 argument)
- liste_force_sysvar    (0 argument)

Appeler force_sysvar avec le nom de la variable système et la valeur voulue en forcage
exemple (setq rr (force_sysvar "osmode" 15039))
Si vous tentez de créer un réacteur sur une variable ayant déjà un réacteur, l'existant
sera détruit pour être remplacer par le nouveau.

Pour stopper un réacteur (stop_force_sysvar rr)
Pour stopper tous les réacteurs (stop_all_force_sysvar)

La fonction liste_force_sysvar renvoie le nombre de réacteurs et donc
de variables systèmes qui sont forcées sous la forme d'une liste:
((var_name1 var_valeur1) (var_name2 var_valeur2)...)

BLAES Sébastien 07/08/2008
|;


;---------------------------------------;
; nom: modif_sysvar                     ;
; role: callback des réacteurs sur les  ;
;       variables systèmes              ;
;       FONCTION A NE PAS MODIFIER      ;
; param: a1 => réacteur appelant        ;
;        a2 => variable système modifiée;
;             sous cette forme:         :
;             (nom bool) => nom = nom de;
;             la variable, bool = si la ;
;             modification a réussie    ;
; retour: aucun                         ;
; date: 07/08/2008                      ;
; BLAES Sébastien                       ;
;---------------------------------------;
(defun modif_sysvar( a1 a2)
 	(cond
  	; on test si la variable modifiée est celle gérer par ce réacteur
  	; mais aussi si la valeur de cette variable n'est pas celle voulue au forcage
  	((and (= (car a2) (car (vlr-data a1))) (/= (getvar (car (vlr-data a1))) (cadr (vlr-data a1))))
	 	; on force la variable à la valeur voulue
	 	(setvar (car (vlr-data a1)) (cadr (vlr-data a1)))
	)
) ; cond

 	(print)
) ; modif_var

;-------------------------------------;
; nom: force_sysvar_existe            ;
; role: test si un réacteur de forcage;
;       sur la variable système sysvar;
;       existe ou non                 ;
; param: sysvar => nom de la variable ;
;                  système forcée     ;
; retour: un réacteur                 ;
;         nil sinon                   ;
; date: 07/08/2008                    ;
; BLAES Sébastien                     ;
;-------------------------------------;
(defun force_sysvar_existe( sysvar / res)
 	(setq res nil)
 
 	(cond
  	; on test s'il y a encore des réacteurs sur des sysvar
  	((= (setq vlr_sysvar (vlr-reactors :VLR-SysVar-Reactor)) nil)
	)
	(t
	 	; on récupère la liste des réacteurs sur des sysvar
	 	(setq vlr_sysvar_liste (car vlr_sysvar)
		      vlr_sysvar_liste (cdr vlr_sysvar_liste))

	 	; on boucle sur la liste afin de tous les arrêter
	 	(foreach elem vlr_sysvar_liste
		  	(if (= (car (vlr-data elem)) sysvar)
		  		(setq res elem)
			) ; if
		) ; foreach
	 
	)
) ; cond
 
 	res	
) ; force_sysvar_existe

;--------------------------------------;
; nom: force_sysvar                    ;
; role: créer et renvoi un réacteur qui;
;       permet de forcer la variable   ;
;       système de nom var_name à la   ;
;       valeur var_value               ;
; param: var_name => nom de la variable;
;        var_value => valeur voulue    ;
; retour: un réacteur                  ;
;         nil si erreur                ;
; date: 07/08/2008                     ;
; BLAES Sébastien                      ;
;--------------------------------------;
(defun force_sysvar( var_name var_value / res)

 	(setq res nil)
      
 	(cond
  	((/= (type var_name) 'STR)
	)
	((= var_value nil)
	)
	
	((= (setq var_name (strcase var_name)) nil)
	)
  	; on test si var_name est bien une variable système
  	((= (getvar var_name) nil)
	)
	; on test si le type de var_name et bien le même que var_value
	((/= (type var_value) (type (getvar var_name)))
	)
	; on test si un réacteur sur cette variable existe déjà
	((/= (setq rr (force_sysvar_existe var_name)) nil)
	 	; on désactive l'ancien réacteur
	 	(stop_force_sysvar rr)

	 	; on initialise la variable système
		(setvar var_name var_value)
	 
	 	; on créer le nouveau réacteur
	  	(setq res (vlr-sysvar-reactor (list var_name var_value) '((:vlr-sysvarchanged . modif_sysvar))))
	)
	(t
	 	; on initialise la variable système
		(setvar var_name var_value)
	 
	 	; on créer le nouveau réacteur
	  	(setq res (vlr-sysvar-reactor (list var_name var_value) '((:vlr-sysvarchanged . modif_sysvar))))
	)
) ; cond

 	res
) ; force_sysvar

;------------------------------;
; nom: stop_force_sysvar       ;
; role: stop le réacteur rea   ;
; param: rea => réacteur       ;
; retour: t si tout c'est passé;
;         nil si erreur        ;
; date: 07/08/2008             ;
; BLAES Sébastien              ;
;------------------------------;
(defun stop_force_sysvar( rea / res)
 	(setq res nil)
 
 	(cond
  	; si rea vaut nil
  	((= rea nil)
	)
	; si rea est un réacteur de sysvar
  	((= (type rea) 'VLR-SysVar-Reactor)
	 	(vlr-remove rea)
	 	(setq res t)
	)
) ; cond

 	res
) ; stop_force_sysvar

;--------------------------------------;
; nom: stop_all_force_sysvar           ;
; role: stop tous les réacteurs sur des;
;       variables système              ;
; param: aucun                         ;
; retour: t si tout c'est bien passé   ;
;         nil sinon                    ;
; date: 07/08/2008                     ;
; BLAES Sébastien                      ;
;--------------------------------------;
(defun stop_all_force_sysvar( / res vlr_sysvar vlr_sysvar_liste)
 	(setq res t)
 	(cond
  	; on test s'il y a encore des réacteurs sur des sysvar
  	((= (setq vlr_sysvar (vlr-reactors :VLR-SysVar-Reactor)) nil)
	)
	(t
	 	; on récupère la liste des réacteurs sur des sysvar
	 	(setq vlr_sysvar_liste (car vlr_sysvar)
		      vlr_sysvar_liste (cdr vlr_sysvar_liste))

	 	; on boucle sur la liste afin de tous les arrêter
	 	(foreach elem vlr_sysvar_liste
		  	(setq res (and res (stop_force_sysvar elem)))
		) ; foreach
	 
	)
) ; cond

 	res
) ; stop_all_force_sysvar

;--------------------------------------;
; nom: liste_force_sysvar              ;
; role:  renvoie le nombre de réacteurs;
;        sous la forme d'une liste:    ;
;        ((var_name1 var_valeur1)      ;
;         (var_name2 var_valeur2)...)  ;
; param: aucun                         ;
; retour: une liste                    ;
;         nil si aucun réacteur        ;
; date: 07/08/2008                     ;
; BLAES Sébastien                      ;
;--------------------------------------;
(defun liste_force_sysvar( / res)
 	(setq res nil)
 
 	(cond
  	; on test s'il y a encore des réacteurs sur des sysvar
  	((= (setq vlr_sysvar (vlr-reactors :VLR-SysVar-Reactor)) nil)
	)
	(t
	 	; on récupère la liste des réacteurs sur des sysvar
	 	(setq vlr_sysvar_liste (car vlr_sysvar)
		      vlr_sysvar_liste (cdr vlr_sysvar_liste))

	 	; on boucle sur la liste afin de tous les arrêter
	 	(foreach elem vlr_sysvar_liste
		  	(setq res (cons (list (car (vlr-data elem)) (cadr (vlr-data elem))) res))
		) ; foreach
	 
	)
) ; cond

res
) ; liste_force_sysvar

[Edité le 7/8/2008 par bseb67]

 

[Edité le 7/8/2008 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut

 

Merci de ton partage :)

 

Ayant des petits problème de santé et physique, je n'ai pas pu attaquer mon super challenge :( .

J'espère que ce n'est pas trop grave :(

 

@+

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

Posté(e)

en fait j'ai oublié juste une chose, c'est que je ne met pas la variable

à la valeur de forcage :cool: , je corrige cela

 

J'espère que ce n'est pas trop grave

Ben, après les multi angines, ce sont mes mollets qui s'y mettent. Crampes aux deux un matin, en me levant, donc je suis tombé par terre. Depuis les muscles se crispent régulièrement, et maintenant j'ai les chevilles enflées et des rougeurs sur la moitié de chaque tibia, le pire c'est que le médecin et le neurologue ne savent pas d'où ca vient, malgré les 400€ que je leur ai laché . :mad:

A part prendre des médoc qui n'ont pas vraiment effet (ca fait 3 semaines), ca ne va toujours pas mieux. :(

 

Donc comme dit, je corrige ou plutot j'ajoute le setvar qui manque.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

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é