zebulon_ Posté(e) le 28 janvier 2010 Posté(e) le 28 janvier 2010 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 ? MerciSalutationsVincent 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)
Tramber Posté(e) le 28 janvier 2010 Posté(e) le 28 janvier 2010 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 ./__\. (.°=°.)
zebulon_ Posté(e) le 28 janvier 2010 Auteur Posté(e) le 28 janvier 2010 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) AmicalementVincent 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)
(gile) Posté(e) le 30 janvier 2010 Posté(e) le 30 janvier 2010 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.lspTu 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
CADZEB Posté(e) le 1 février 2010 Posté(e) le 1 février 2010 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 AmicalementZebulon_
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant