t.erie Posté(e) le 14 janvier 2011 Posté(e) le 14 janvier 2011 Bonjour, je recherche une routine qui par le biais d'une liste de blocs (modifiable) me permettrai d'attribuer tel ou tel état de visibilité.Merci de bien vouloir m'aider. Au fait meilleurs vœux à tous. Thierry
lili2006 Posté(e) le 14 janvier 2011 Posté(e) le 14 janvier 2011 Bonsoir à toutes et tous, Pas sur d'avoir bien compris, mais avec SSD de (gile) peut-être ? Une fois les blocs grippés, il suffit de passer par la palette des propriétés pour faire les modifs désirées,.. http://img.ahst.fr/data/images/ssd.jpg ;;; SSD version 2.6 (gile) 14/07/08 (dernière révision 17/01/2011) ;;; Sélection de blocs dynamiques par des valeurs de paramètres dynamiques ;;; ;;; Utilisations : ;;; - Pour créer un jeu de sélection, entrer SSD, sélectionner un bloc source ;;; puis choisir les valeurs à filtrer dans la boite de dialogue. ;;; - A l'intérieur d'un commande de modification, à l'invite "Choix des objets: " ;;; entrer (SSD). ;;; Le filtre peut se faire sur tout le dessin ou à l'intérieur d'une sélection (defun ssd (/ *error* ToString DynBlkPropValue dz ss ent blk name pop fuzz ret sel res) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (defun *error* (msg) (if (/= msg "Fonction annulée") (princ (strcat "Erreur: " msg)) ) (and blk (not (redraw (vlax-vla-object->ename blk) 4))) (setvar 'dimzin dz) (princ) ) (defun ToString (v u) (cond ((= 0 u) (vl-princ-to-string v)) ((= 1 u) (angtos v (getvar 'aunits) 16)) ((if ( (rtos v 1 6) (rtos v (getvar 'lunits) 12) ) ) ) ) ;; DynBlkPropValue ;; Boite de dialogue pour choisir des valeurs de paramètres dynamiques ;; ;; Argument : la liste des paramètres dynamiques (defun DynBlkPropValue (lst / tmp file pn unt av dcl_id val) (setq tmp (vl-filename-mktemp "Tmp.dcl") file (open tmp "w") ) (write-line (strcat "DynBlkProps:dialog{label=\"Filtre de blocs dynamiques\";" ":text{label=\"Nom du bloc : \"" (vl-prin1-to-string name) ";}spacer;:boxed_column{label=\"Propriétés dynamiques\";" ) file ) (foreach p lst (setq pn (vla-get-PropertyName p) unt (vla-get-UnitsType p) ) (cond ((setq av (vlax-get p 'AllowedValues)) (setq av (mapcar '(lambda (x) (ToString x unt)) av) pop (cons (vl-list* pn "*" av) pop) ) (write-line (strcat ":popup_list{label=" (vl-prin1-to-string pn) ";key=" (vl-prin1-to-string pn) ";value=" (itoa (1+ (vl-position (ToString (vlax-get p 'Value) unt) av))) ";edit_width=25;allow_accept=true;}" ) file ) ) ((/= pn "Origin") (setq fuzz (cons pn fuzz)) (write-line (strcat ":row{:edit_box{label=" (vl-prin1-to-string pn) ";key=" (vl-prin1-to-string pn) ";value=" (vl-prin1-to-string (ToString (vlax-get p 'Value) unt)) ";edit_width=18;allow_accept=true;}" ":edit_box{label=\"Tolérance\";key=" (vl-prin1-to-string (strcat pn "_fuzz")) ";value=\"1e-12\";edit_width=6;allow_accept=true;}}" ) file ) ) ) ) (write-line (strcat "}spacer;:radio_row{key=\"selset\";" ":radio_button{label=\"Tout le dessin\";key=\"all\";value=\"1\";}" ":radio_button{label=\"Sélection\";key=\"sel\";}}" "spacer;ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "DynBlkProps" dcl_id)) (exit) ) (foreach p pop (start_list (car p)) (mapcar 'add_list (cdr p)) (end_list) ) (action_tile "accept" "(foreach p (mapcar 'vla-get-PropertyName lst) (if (assoc p pop) (setq val (nth (atoi (get_tile p)) (cdr (assoc p pop)))) (setq val (get_tile p))) (if (and val (/= val \"\") (/= val \"*\")) (setq ret (cons (cons p val) ret)))) (setq fuzz (mapcar (function (lambda (x) (cons x (get_tile (strcat x \"_fuzz\"))))) fuzz)) (and (not ret) (setq ret T)) (setq sel (get_tile \"selset\")) (done_dialog)" ) (action_tile "cancel" "(setq ret nil)") (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) ret ) ;;----------------------------------------------------;; (setq dz (getvar 'dimzin)) (setvar 'dimzin 8) (and (or (and (setq ss (cadr (ssgetfirst))) (= 1 (sslength ss)) (setq ent (ssname ss 0)) (sssetfirst nil nil) ) (and (sssetfirst nil nil) (setq ent (car (entsel))) ) ) (setq blk (vlax-ename->vla-object ent)) (= (vla-get-ObjectName blk) "AcDbBlockReference") (= (vla-get-IsDynamicBlock blk) :vlax-true) (not (redraw ent 3)) (setq name (vla-get-EffectiveName blk)) (or (DynBlkPropValue (vlax-invoke blk 'getDynamicBlockProperties)) (redraw ent 4) ) (not (redraw ent 4)) (if (= sel "all") (ssget "_X" (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*"))) ) (ssget (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*"))) ) ) (setq res (ssadd)) (vlax-for b (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (if (and (= (vla-get-EffectiveName b) name) (or (= ret T) ((lambda (lst) (apply '= (cons T (mapcar (function (lambda (p / n v l u f) (setq n (car p) l (assoc n lst) u (vla-get-UnitsType (caddr l)) ) (equal (cond ((= 0 u) (cdr p)) ((= 1 u) (angtof (cdr p))) (T (distof (cdr p))) ) (if (= u 0) (vl-princ-to-string (cadr l)) (cadr l) ) (if (and (setq f (cdr (assoc n fuzz))) (numberp (read f)) ) (atof f) 1e-12 ) ) ) ) ret ) ) ) ) (mapcar (function (lambda (p / n v) (list (setq n (vla-get-PropertyName p)) (vlax-get p 'Value) p ) ) ) (vlax-invoke b 'getDynamicBlockProperties) ) ) ) ) (ssadd (vlax-vla-object->ename b) res) ) ) (vla-delete ss) ) (setvar 'dimzin dz) res ) (defun c:ssd () (sssetfirst nil (ssd)) (princ) ) Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
t.erie Posté(e) le 17 janvier 2011 Auteur Posté(e) le 17 janvier 2011 Bonjour,J'avais bien récupéré ce LISP mais j'obtiens ce message: Erreur: valeur d'argument incorrecte: mode angtos: 16.Pour vous éclairer un peu je vais vous expliquer mes besoins:Dans mes blocs menuiseries j'ai une polyligne accessible par un état de visibilité qui me ferme le trou dans le mur afin de pouvoir hachurer une zone.L'idéal pour moi serait d'avoir la possibilité via un bouton de pouvoir à souhait activer tel ou tel état de visibilité.Début pièce, Fin pièce par exemple.Merci de m'avoir répondu.CordialementThierry
lili2006 Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 Bonjour à toutes et tous, J'ai du mal à comprendre ton besoin,... Un p'tit fichier ou une image ? Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 J'avais bien récupéré ce LISP mais j'obtiens ce message: Erreur: valeur d'argument incorrecte: mode angtos: 16. Il y avait une erreur dans la routine 'ToString', c'est corrigé dans le code ci-dessus et dans Special_Selections sur cette page. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
t.erie Posté(e) le 17 janvier 2011 Auteur Posté(e) le 17 janvier 2011 Je vais essayer d'être plus clair:Mes menuiseries contiennent une polyligne qui est visible grâce à un état de visibilité.Cette polyligne me sert à fermer une zone afin que je puisse insérer une hachure dans une pièce.L'idéal serait que je puisse ajouter dans un lisp le nom de mes blocs, et grâce à une commande activer ou pas cet état de visibilité.Dans tous mes bloc cet état de visibilité porte le même nom.Ce message d'erreur: Erreur: valeur d'argument incorrecte: mode angtos: 16. dans le lisp de gile est-il du ma config ?
lili2006 Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 Bonjour à toutes et tous, Salut Gilles, Par curiosité, c'était quoi cette erreur ? Je n'ai jamais eu de pb d'utilisation de SSD,.. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 lili2006, Par curiosité, c'était quoi cette erreur ? Je n'ai jamais eu de pb d'utilisation de SSD,.. Pour afficher dans la boite de dialogue les valeurs des propriétés dynamiques qui peuvent être de différent types (chaines de caractères, distances, angles, etc.) il faut convertir ces valeurs en chaines. J'ai défini une fonction 'ToString' qui converti ces valeurs en chaînes en fonction de leur type. Il y avait une faute de frappe dans le code qui concernait la conversion des angles.Si tu n'as jamais utilisé SSD sur des blocs ayant une propriété 'angle', c'est normal que tu n'aies jamais eu cette erreur. t.erie, Ta demande est très spécifique et si tu ne donnes pas toutes les informations nécessaires (nom des blocs, nom des états de visibilité), ni le LISP, ni celui qui pourrait te l'écrire ne peuvent les deviner... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
t.erie Posté(e) le 17 janvier 2011 Auteur Posté(e) le 17 janvier 2011 Comment vous envoyer un bloc exemple ?
lili2006 Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 Re, sur des blocs ayant une propriété 'angle', c'est normal que tu n'aies jamais eu cette erreur. C'est en fait le cas,.. Merci pour ces explications,... Comment vous envoyer un bloc exemple ? Depuis ce site d'hébergement , par exemple, Colles ensuite le lien généré directement dans ton post, comme ceci : http://file.ahst.fr/ Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
t.erie Posté(e) le 17 janvier 2011 Auteur Posté(e) le 17 janvier 2011 Dans l'ordre:Mes blocs: Porte réglablePorte double réglablePorte tierce réglable---------------------------------------------------------Mes états: Sans trait de calcul1 traitLoi Carrez
t.erie Posté(e) le 17 janvier 2011 Auteur Posté(e) le 17 janvier 2011 Ci après un bloc test: http://file.ahst.fr/get.php?id=4d3417b32731d
Patrick_35 Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 Salut Avec le lisp de (giles) SSD, tu sélectionnes tes blocs dynamiques, puis avec les propriétés (ctrl+1), tu appliques le paramètre de visibilité souhaité @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 Tu peux essayer ça, je pense que ça devrait marcher malgré les noms de blocs et d'états de visibilité contenant des espaces et des accents (à éviter absolument si tu veux pouvoir facilement programmer). ;; gc:ListBox (gile) ;; Boite de dialogue permettant un ou plusieurs choix dans une liste ;; ;; Arguments ;; title : le titre de la boite de dialogue (chaîne) ;; msg ; message (chaîne), "" ou nil pour aucun ;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...) ;; flag : 0 = liste déroulante ;; 1 = liste choix unique ;; 2 = liste choix multipes ;; ;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2) ;; ;; Exemple d'utilisation ;; (gc:listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1) (defun gc:ListBox (title msg keylab flag / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{key=\"lst\";") (T "spacer;:list_box{key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ListBox" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list (mapcar 'cdr keylab)) (end_list) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))) (setq choice (reverse choice))) (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab))))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) (defun c:terie (/ ss vis) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (if (and (ssget "_X" (list '(0 . "INSERT") (cons 410 (getvar 'ctab)) '(2 . "Porte réglable,Porte double réglable,Porte tierce réglable,`*U*") ) ) (setq vis (gc:ListBox "Visiblité" nil '(("vis1" . "Sans trait de calcul") ("vis2" . "1 trait") ("vis3" . "Loi Carrez") ) 0 ) ) (setq vis (cond ((= vis "vis1") "Sans trait de calcul") ((= vis "vis2") "1 trait") ("Loi Carrez") ) ) ) (progn (vlax-for blk (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (if (member (vla-get-EffectiveName blk) '("Porte réglable" "Porte double réglable" "Porte tierce réglable") ) (foreach prop (vlax-invoke blk 'getDynamicBlockProperties) (if (= (vla-get-PropertyName prop) "Visibilité") (vla-put-Value prop vis) ) ) ) ) (vla-Delete ss) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 Avec le lisp de (giles) SSD, tu sélectionnes tes blocs dynamiques, puis avec les propriétés (ctrl+1), tu appliques le paramètre de visibilité souhaité Bien sûr, ça marche, mais comme la boite de dialogue de SSD affiche les valeurs des propriétés du bloc source (dernière demande sur TheSwamp), pour sélectionner tous les blocs de même nom, il faut mettre * (pour "toute valeur") dans chaque case...SSD est devenu trop sophistiqué pour sélectionner les blocs dynamiques uniquement suivant leur nom. Ci dessous SSB qui sélectionne tous les blocs de même nom (y compris les blocs anonymes). (defun ssb (/ dyn ent elst name ss) (vl-load-com) (setq dyn ( (if (and (setq ent (car (entsel "\nSélectionnez le bloc source: "))) (setq elst (entget ent)) (setq name (if dyn (vla-get-EffectiveName (vlax-ename->vla-object ent)) (cdr (assoc 2 elst)) ) ) (= (cdr (assoc 0 elst)) "INSERT") (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*")) ) ) ) ) (if ( (repeat (setq n (sslength ss)) (setq blk (ssname ss (setq n (1- n))) obj (vlax-ename->vla-object blk) ) (if (/= (vla-get-EffectiveName obj) name) (progn (ssdel blk ss) ) ) ) ) ) ss ) (defun c:ssb () (sssetfirst nil (ssb)) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
t.erie Posté(e) le 17 janvier 2011 Auteur Posté(e) le 17 janvier 2011 Je viens de tester votre lisp, du tonnerre, merci beaucoup d'avoir bien voulu consacrer du temps pour moi. J'espère que cela profitera à d'autres personnes.Merci encore
(gile) Posté(e) le 17 janvier 2011 Posté(e) le 17 janvier 2011 J'espère que cela profitera à d'autres personnes. Le LISP 'terie' ne profitera qu'à ceux qui ont des blocs dynamiques nommés "Porte réglable", "Porte double réglable", "Porte tierce réglable" ayant un paramètre de visibilité nommé "Visibilité" avec les états "Sans trait de calcul", "vis2" et "Loi Carrez".Je crains que ça ne fasse pas beaucoup de monde. :cool: Par contre SSB est beaucoup plus polyvalent et permet de faire ce que proposait Patrick_35 quelque soit le nom du bloc source et les propriétés à modifier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
t.erie Posté(e) le 17 janvier 2011 Auteur Posté(e) le 17 janvier 2011 En renommant certains paramètre cela doit être possible non ?
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