Aller au contenu

AcDb reactor


CADZEB

Messages recommandés

Bonjour,

 

suite à la demande de quelqu'un qui souhaite que ses hachures soient toujours sur le même calque, sans tenir compte du calque courant, j'ai bien entendu pensé aux réacteurs.

 

La première idée est de passer par 2 réacteurs de commande.

Le premier réacteur qui s'enclenche au début de la commande hachure, qui met de côté la valeur du calque courant et qui change cette valeur en ce qui m'intéresse.

Le second réacteur s'enclenche à la fin de la commande hachure pour remettre la valeur du calque courant.

;;; Lisp à charger uniquement ... ne pas exécuter !!!

(vl-load-com)

(vlr-command-reactor "Debut Hachure" '((:vlr-commandWillStart . StartHatch)))
(vlr-command-reactor "Fin Hachure" '((:vlr-commandEnded . EndHatch)))


(defun StartHatch (calling-reactor commandInfo / thecommand e)
 (setq thecommand (nth 0 commandInfo))
 (if (or (= thecommand "BHATCH") (= thecommand "-BHATCH"))
   (progn
     (setq OldCLAYER (getvar "CLAYER"))
     (if (setq e (tblobjname "layer" "FV_hachures"))
       (progn
         (setq e (vlax-ename->vla-object e))
         (vla-put-Freeze e :vlax-false)
         (vla-put-LayerOn e :vlax-true)
         (setvar "CLAYER" "FV_hachures")
       )
     )
   )
 )
)

(defun EndHatch (calling-reactor commandInfo / thecommand)
 (setq thecommand (nth 0 commandInfo))
 (if (or (= thecommand "BHATCH") (= thecommand "-BHATCH"))
   (if OldCLAYER
     (setvar "CLAYER" OldCLAYER)
   )
 )
) 

 

Ok, c'est de la grosse artillerie pour pas grand chose, mais c'est aussi pour mieux comprendre les réacteurs.

 

La deuxième idée me paraissait plus séduisante. Elle consiste à repérer la création d'une nouvelle hachure et changer son calque en ce qui m'intéresse. Là, il me semblait intéressant d'utiliser un acdb-reactor

;;; Lisp à charger uniquement ... ne pas exécuter !!!
(vl-load-com)

(vlr-acdb-reactor "calque hachure" '((:vlr-objectAppended . AppendHatch)))

(defun AppendHatch (calling-reactor AcDbInfo / e)
 (setq e (vlax-ename->vla-object (nth 1 AcDbInfo)))
 (if (= (vla-get-ObjectName e) "AcDbHatch")
   (if (setq lay (tblobjname "layer" "FV_hachures"))
     (progn
       (setq lay (vlax-ename->vla-object lay))
       (vla-put-Freeze lay :vlax-false)
       (vla-put-LayerOn lay :vlax-true)
       (vla-put-Layer e "FV_hachures")
     )
   )
 )
) 

 

Mais l'entité e récupérée par le biais de la fonction callback n'est pas modifiable parce que ouverte en lecture uniquement. Donc, la fonction vla-put-layer renvoie une erreur.

 

Amicalement

Vincent

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Une solution serait de créer un CommandReactor/:vlr-commandEnded dans la fonction callback du AcDbReactor en lui passant l'objet hachure. La fonction callback du CommandReactor change le calque de la hachure et détruit le CommandReactor.

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

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Quelque chose dans ce style

 

(defun patrick_35:changer_hachures (rea cde)
 (vla-put-layer (vlr-data rea) "FV_hachures")
 (vlr-remove un_reacteur_tempo_hachures)
)

(defun patrick_35:ajout_hachures (rea cde / obj)
 (and (= (vlr-data rea) "calque hachure")
      (tblsearch "layer" "FV_hachures")
      (setq obj (vlax-ename->vla-object (cadr cde)))
      (= (vla-get-objectname obj) "AcDbHatch")
      (setq un_reacteur_tempo_hachures
      (vlr-editor-reactor
	obj
	(list
	  (cons	:vlr-commandended
		(function
		  patrick_35:changer_hachures
		)
	  )
	)
      )
      )
 )
)

(setq mon_reacteur_hachures
      (vlr-acdb-reactor
 "calque hachure"
 (list
   (cons :vlr-objectappended
	 (function patrick_35:ajout_hachures)
   )
 )
      )
)

 

@+

 

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

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é