Aller au contenu

reacteur changement calque


Messages recommandés

Posté(e)

Bonjour,

 

je fais pas mal de béton armé et pour les plan de ferraillage, je trace des polylignes dont les épaisseurs correspondent au diamètre extérieur des aciers. Comme chaque nuance d'acier est sur un calque à part, je souhaite avoir le bon PLINEWID dès que change le calque courant.

 

ex : le calque courant est "HA12", PLINEWID devient 0.014

 

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

(vlr-sysvar-reactor
 nil
 '((:vlr-sysvarchanged . plinewidcallback))
)

(defun plinewidcallback	(event parameter / lst CLAY)
 (setq	lst '(("HA6" 0.007)
      ("HA8" 0.010)
      ("HA10" 0.012)
      ("HA12" 0.014)
      ("HA14" 0.016)
      ("HA16" 0.019)
      ("HA20" 0.024)
      ("HA25" 0.030)
      ("HA32" 0.038)
      ("HA40" 0.048)
     )
 )
 (If (eq (car parameter) "CLAYER")
   (progn
     (setq CLAY (strcase (getvar "CLAYER")))
     (if (member CLAY (mapcar 'car lst))
(setvar "PLINEWID" (cadr (assoc CLAY lst)))
(setvar "PLINEWID" 0)
     )
   )
 )
) 

 

Par ailleurs, quel est le réacteur que je pourrais utiliser pour modifier l'épaisseur d'une polyligne existante dont je viens de changer le calque ?

 

Merci

Salutations

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Je suis prompt à réagir mais je ne vais pas te donner de code, je suis top peu sur, en adaptant le code de l'aide :

 

(setq polyReactor (vlr-object-reactor (list mypoly)

"poly Reactor" '((:vlr-modified . polymod))))

 

Dans ta fonction polymod, tu dois juste faire le changement d'épaisseur en fonction de tes critères.

 

Ton deuxième réacteur est tout bêtement un :VLR-SysVar-Reactor sur CLAYER ! Mais pour ça je pense qu'on est d'accord.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Si j'ai bien compris, les vlr-object-reactor sont un peu différent des autres réacteurs, puisqu'il faut "associer" un objet avec le réacteur. Quand l'objet est modifié, le réacteur se met en route.

 

Par défaut, cette association n'est pas persistante et on la perd quand on quitte le fichier, sauf si on rend ce réacteur persistant avec la commande (vlr-pers reactor)

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Tu as bien compris.

 

Mais, attention, les vlr-object-reactor sont assez délicats à utiliser.

 

Si la fonction de rétro-appel (polymod dans l'exemple de Tramber) modifie un objet propriétaire du réacteur, le réacteur est relancé et on entre dans une boucle sans fin.

Un méthode consiste à, dans la fonction de rétro-appel, supprimer le réacteur (ou l'objet concerné de la liste owners), créer un nouveau réacteur (vlr-command-reactor par exemple) et dans la fonction de rétro-appel du nouveau réacteur : modifier l'objet, recréer le vlr-object-reactor (ou rajouter l'objet dans la liste owners) et détruire le vlr-command-reactor).

 

Personnellement, je n'arrive plus à me souvenir exactement pourquoi, mais j'avais trouvé plus facile de créer un réacteur par objet que de gérer une liste d'objets pour un seul réacteur.

 

Concernant les réacteurs persistants, il présentent l'inconvénient de provoquer des erreurs s'il sont modifiés alors que la fonction de rétro-appel n'est pas chargée (transmission du fichier par exemple).

De mon côté, je préfère conserver dans le dessin (dictionnaire traditionnel ou vlax-ldata) la liste des Handle des objets concernés et reconstruire le (ou les) réacteur(s) au chargement de la routine.

 

Tu peux voir un exemple de ma façon de procéder dans Rectangle.lsp

Tu peux aussi lire le chapitre "Utilisation des réacteurs" du (très mauvais à mon avis) Didacticiel AutoLISP de l'Aide aux développeurs.

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

Posté(e)

Mais, attention, les vlr-object-reactor sont assez délicats à utiliser.

 

J'ai essayé avec les réacteurs AcDb

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

(vlr-acdb-reactor nil '((:vlr-objectModified . ObjChangeProp)))

(defun ObjChangeProp (calling-reactor ModObjLst / lst)
 (setq	lst '(("HA6" 0.007)
      ("HA8" 0.010)
      ("HA10" 0.012)
      ("HA12" 0.014)
      ("HA14" 0.016)
      ("HA16" 0.019)
      ("HA20" 0.024)
      ("HA25" 0.030)
      ("HA32" 0.038)
      ("HA40" 0.048)
     )
 )
 (setq eobj (vlax-ename->vla-object (cadr ModObjLst)))
 (if (= (vla-get-objectname eobj) "AcDbPolyline")
   (progn
     (setq LAY (strcase (vla-get-layer eobj)))
     (if (member LAY (mapcar 'car lst))
      (vla-put-ConstantWidth eobj (cadr (assoc LAY lst)))
     )
   )
 )
) 

 

Pas de chance. On n'a pas le droit de faire le vla-put sur eobj :casstet: Dommage

 

Amicalement

Zebulon_

 

 

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é