Aller au contenu

SVP Micro-Amelioration sur Routine SSETVAL


lecrabe

Messages recommandés

Hello Vaillants Lispeurs

 

Voir ci dessous une routine sympa de VDH-Bruno : SSETVAL

qui permet de rechercher les Blocs par Valeur/Contenu d Attribut

et surtout meme par Valeur/Contenu = VIDE

 

DEJA MERCI a Mr VDH-Bruno !

 

SAUF que a priori, SSETVAL ne traite pas les Blocs dynamiques !?

 

DONC SVP si qq'un pouvait l'ameliorer ...

 

Merci d'avance, Bye, lecrabe "triste"

 


;; 
;; http://cadxp.com/index.php?/topic/37573-faire-une-selection-dun-bloc-en-fonction-de-deux-de-ses-attributs/page__pid__207342#entry207342 
;; 
;; VDH-Bruno                                         le: 28/05/2013
;; ================================================================
;;
;; Sélection des références de bloc en fonction 
;; des Etiquettes d'attribut et de leurs valeurs spécifiques 
;; 


(defun c:ssEtVal (/ lstTagAtt tagAtt doc ss1 ss2 inclu-p inputval)
 (vl-load-com)
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
       ss2 (ssadd)
 )

 ;; liste les noms des définition d'attribut de la table des blocs
 (vlax-for b (vla-get-Blocks doc)
   (if (and (= (vla-get-IsLayout B) :vlax-false)
            (= (vla-get-IsXref B) :vlax-false)
            (not (wcmatch (vla-get-Name B) "*|*"))
       )
     (vlax-for o b
       (and (= (vla-get-ObjectName o) "AcDbAttributeDefinition")
            (not (member (setq tagAtt (vla-get-TagString o)) lstTagAtt))
            (setq lstTagAtt (cons tagAtt lstTagAtt))
       )
     )
   )
 )

 ;; Affiche la liste dans une zone de liste pour un choix multiples
 (setq
   lstTagAtt (listbox
               "Etiquettes des Definitions d Attributs "
               "Selectionnez les Etiquettes a filtrer ... "
               (mapcar 'cons (setq lstTagAtt (vl-sort lstTagAtt '<)) lstTagAtt)
               2
             )
 )

 ;; Valeurs à associer aux étiquettes correspondantes
 (defun inputval (l)
   (if l
     (cons
       (cons
         (car l)
         (getstring (strcat "Valeur a rechercher pour l Etiquette choisie " (car l) ": ")
         )
       )
       (inputval (cdr l))
     )
   )
 )

 (cond
   ((setq lstTagAtt (inputval lstTagAtt))

    ;; Définition de la zone de sélection
    (princ "\nSelectionnez les Blocs classiques ou <tout> : ")
    (or (ssget (list '(0 . "INSERT") '(66 . 1)))
        (ssget "_X" (list '(0 . "INSERT") '(66 . 1)))
    )

    ;; Prédicat d'inclusion d'une liste l1 dans une autre liste l2
    (defun inclu-p (l1 l2)
      (cond ((null l1) t)
            ((member (car l1) l2) (inclu-p (cdr l1) l2))
            (t nil)
      )
    )

    ;; Filtrage de la sélection
    (vlax-for b (setq ss1 (vla-get-ActiveSelectionSet doc))
      ;; vérifie que les critères de filtres liste (Tag .Val) sont compris dans le bloc
      (if (inclu-p
            lstTagAtt
            ;; Liste les couples (Tag .Val) de la référence de bloc   
            (mapcar
              '(lambda (x) (cons (vla-get-TagString x) (vla-get-TextString x)))
              (vlax-invoke b 'GetAttributes)
            )
          )
        (ssadd (vlax-vla-object->ename B) ss2)
      )
    )
    (vla-delete ss1)
    (sssetfirst nil ss2)
   )
 )
 (princ)
)


;;;;;;;;;;;;;;; 
;; Les routines associés à charger avant la fonction principale
;;;;;;;;;;;;;;; 

;;============================================================================;;

;; STR2LST
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur

;;
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3)

(defun str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)


;; ListBox par GC 
;; 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
;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1)


(defun 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
) 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Sans avoir testé quoi que que ce soit, je tenterai de remplacer simplement

(not (wcmatch (vla-get-Name B) "*|*"))

par

(not (wcmatch (vla-get-EffectiveName B) "*|*"))

à voir si cela suffit

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour Patrice

 

Merci pour ces remerciements (pour cette routine que j’avais complètement oublié), bien que je ne réponde plus beaucoup à des questions de code propre au fonctionnement des entités Autocad, la seule version en ma possession est obsolète (AutoCAD 2007), et nombreux sujets me sont maintenant étranger.

 

 

J’ai tout de même tenté de jeté un œil sur le code pour répondre à la question suivante :

SAUF que a priori, SSETVAL ne traite pas les Blocs dynamiques !?

A priori chez moi en 2007 cela fonctionne aussi sur des blocs dynamiques, car pour établir la liste des étiquettes le code scanne la table des blocs donc toutes les étiquettes d’attributs du dessin sont théoriquement listé.

Puis la sélection filtre toutes les références de bloc ayant des attributs, donc les références de blocs et les référence de blocs anonyme (comme les références de bloc dynamique).

 

 

A la lecture du code le seul bémol que je peux déceler et qui n’est pas explicitement précisé dans l’entête. C’est dans le cas d’une sélection de plusieurs étiquettes dans la boite de dialogue, pour rester dans l’esprit de la discussion d’origine, ne seront sélectionnés que les références de bloc qui répondent à tous les critères (c.a.d. contenant toutes les étiquettes et valeurs d’attribut spécifié et ce qq soit le nom de la référence du bloc).

 

Ne seront pas sélectionné les références de bloc contenant ne répondant pas à tous les critères de sélection (étiquette et valeur d’attribut). Je rassure si c’est cela le souci de l’échec de ta sélection cela peut être modifié aisément dans le code et donner lieu à une nouvelle routine.

 

 

Après si le souci est ailleurs, éventuellement pense à joindre un extrait de fichier exemple au format 2007 de la sélection que tu souhaiterais, à l’occasion j’essayerai d’y jeter un œil.

 

Amicalement Bruno

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Hello Mr VDH-Bruno

 

1) MERCI de t'interesser a mon souci !

 

2) En reflechissant je me suis peut etre PLANTE ?! ... La Honte !!

 

3) Je vais refaire des tests plus pousses ...

Car en effet suivant que l'on selectionne 1 ou N attributs

j'ai l'impression que les Blocs retenus pour traitement !?

 

4) Il faut que je cree un super DWG de tests melangeant des blocs classiques et blocs dynamiques

avec 1/2/3 attributs communs pour voir ...

MAIS je n'ai pas AutoCAD sous la main ce soir ... Donc on verra ce WE ...

 

Que la Force soit avec Toi !

 

Bye, lecrabe "triste"

Autodesk Expert Elite Team

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é