Aller au contenu

le Lisp Mat de Patrick_35 sans la selection


Messages recommandés

Posté(e)

Bonjour

 

Voila j'aimerais changer trois attributs d'un meme bloc ,

j'utilise le lisp de Lisps de Patrick_35 lisp MAT

le probleme il faut selectionne un attribut puis le modifier "les attributs sont invisible".

est t-il possible d'evite cette selection en rentrent directement les noms des attributs a modier et les valeurs dans le lisp.

Nom du bloc " electricite"

Attribut nom " etage, situation , gaine"

 

Merci d'avance car j'ai deja fait une 30 de plans et il m'en reste autant.

 

Posté(e)

Personne pour prendre la suite ?

Bon , tant pis cela aurait été un bon excercice

 

Donc MAT a été mis à jour pour fonctionner maintenant avec une boite de dialogue et prendre ainsi les attributs invisible

 

@+

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

Posté(e)

Bonjour à toutes et à tous,

 

...une question en appelle une autre.

En partant du bloc de Zeus comme exemple, supposons que jusqu'à aujourd'hui les attributs "étage" et "situation" aient une valeur mais pas "gaine" et que je décide maintenant de lui en attribuer une...... :P

Comment faire alors puisque aucune étiquette n'apparaît à l'écran......? :exclam:

 

Merci d'avance,

 

Sylvain

Posté(e)

Bonjour et merci pour cette super amelioration

La gestion des attributs invisible est un plus , et avec le boite de dialogue super.

 

Par contre cela ne m'aide pas dans mon probleme , car le but est de genere le lisp avec excel et de change les valeurs des attributs et du bloc dans le lisp directement .

 

 

exemple de lisp permettant de modifier un attribut de bloc ou MAT

 (defun c:ch_attribut(/ ordre blocd etiquetted nouvelle ancienne filtre selection ptr nbrmod entite pripriete actuelle k a)
(write-line "\nTéléchargé depuis le site Internet http://www.decker-cs.com")
(write-line "Auteur : Christian Decker")
;
(write-line "Changer la valeur d'un attribut.")
;
(while              ;Attend la sélection d'une méthode.
 (and              
  (/= ordre "CHA")
  (/= ordre "SUB")
  (/= ordre "DWG")
  (/= ordre "PRE")
  (/= ordre "SUF")
 )
 (setq ordre(strcase(getstring "Méthode (CHAnger / SUBstituer / DWGname / PREfixe / SUFfixe) : ")))
 (if (> (strlen ordre) 3)             ;La chaîne contient au moins quatre caractères.
  (setq ordre(substr ordre 1 3))      ;Préserve uniquement les trois premiers caractères de la chaîne.
 )
)
(if
 (or
  (= ordre "CHA")
  (= ordre "PRE")
  (= ordre "DWG")
  (= ordre "SUF")
  (= ordre "SUB")
 )
 (progn
  (if (= ordre "CHA")                ;Saisie des données avec l'option Changer.
   (progn
    (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))
    (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))  
    (setq nouvelle(getstring "Nouvelle valeur : " 1))
   )
  )
  (if (= ordre "SUB")                ;Saisie des données avec l'option Substituer.
   (progn
    (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))
    (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))
    (setq ancienne "")
    (while (= ancienne "")              ;Attend une occurrence de texte non nulle.
     (setq ancienne(getstring "Ancienne chaîne de caractères : " 1))
     (if (= ancienne "")                   ;La chaîne est vide.
      (write-line "L'ancienne chaîne de caractères doit être non nulle.")
     )
    )
    (setq nouvelle(getstring "Nouvelle chaîne de caractères : " 1))
   )
  )
  (if (= ordre "DWG")                ;Saisie des données avec l'option Dwgname.
   (progn
    (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))
    (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))
   )
  )
  (if (= ordre "PRE")                ;Saisie des données avec l'option Préfixe.
   (progn
    (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))
    (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))
    (setq nouvelle(getstring "Préfixe : " 1))
   )
  )
  (if (= ordre "SUF")                ;Saisie des données avec l'option Suffixe.
   (progn
    (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))
    (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))
    (setq nouvelle(getstring "Suffixe : " 1))
   )
  )
  (if (/= (tblsearch "BLOCK" blocd) nil)  ;La définition du bloc recherché existe dans le dessin.
   (progn
    (setq filtre(list (cons '0 "INSERT") (cons '2 blocd)))
    (setq selection(ssget "X" filtre))       ;Crée un jeu de sélection.
    (if (/= selection nil)                   ;Au moins un bloc trouvé dans le dessin.
     (progn
      (setq ptr 0)
      (setq nbrmod 0)
      (while (< ptr (sslength selection))       ;Pour chaque bloc dans le jeu de sélection...
       (setq entite(entnext(ssname selection ptr)))  ;Extraction du bloc.
       (while (and (/= entite nil) (/= (cdr(assoc '0 (entget entite))) "SEQEND"))   ;Pour chaque attribut du bloc...
        (setq propriete(entget entite))                 ;Extraction des propriétés de l'attribut.
        (if (= (cdr(assoc '2 propriete)) etiquetted)    ;L'attribut doit être modifié.
         (progn                                                   
          (if (= ordre "CHA")                              ;Option Changer.
           (progn
            (setq propriete(subst(cons '1 nouvelle) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
          (if (= ordre "SUB")                              ;Option Substituer.
           (progn
            (setq actuelle(cdr(assoc '1 propriete)))          ;Extrait la valeur de l'attribut.
            (setq k 1)                                        ;Positionne le pointeur sur le 1er caractère de la valeur de l'attribut.
            (setq a 0)                                        ;Sera égal à 1 si l'attribut est modifié.
            (while (and (<= k (strlen actuelle)) (>= (- (strlen actuelle) (- k 1)) (strlen ancienne)))
             ;
             ;Tant que k est inférieure ou égale à la longueur de la chaîne actuelle, et tant que
             ;(la longueur de la chaîne actuelle - (la position du pointeur - 1)) est égale ou
             ;supérieure à la longueur de l'occurrence du texte à rechercher.
             ;
             (if (= (substr actuelle k (strlen ancienne)) ancienne)
              (progn
               ;        
               ;Le pointeur est sur le 1er caractère de l'occurrence du texte recherché.
               ;
               ;Remplace l'occurrence de texte par la nouvelle valeur :
               ;1) Récupère les caractères situés en amont du pointeur.
               ;2) Ajoute la nouvelle valeur.
               ;3) Récupère les caractères situés en aval de l'occurrence de texte.
               ;
               (setq actuelle
                (strcat
                 (substr actuelle 1 (- k 1))
                 nouvelle
                 (substr actuelle (+ k (strlen ancienne)) (- (strlen actuelle) (+ (- k 1) (strlen ancienne))))
                )
               )
               ;Ajuste la position du pointeur sur le dernier caractère de la nouvelle valeur insérée.
               (setq k(+ (- k 1) (strlen nouvelle)))   
               (setq a 1)           ;La valeur de l'attribut est modifiée.
              )
             )
             (setq k(+ k 1))     ;Incrémente l'index du pointeur.
            )
            (if (= a 1)
             (progn
              (setq propriete(subst(cons '1 actuelle) (assoc '1 propriete) propriete))
              (entmod propriete)
              (entupd entite)
              (setq nbrmod(+ nbrmod 1))
             )
            )
           )
          )
          (if (= ordre "DWG")                              ;Option Dwgname.
           (progn
            (setq propriete(subst(cons '1 (getvar "DWGNAME")) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
          (if (= ordre "PRE")                              ;Option Préfixe.
           (progn
            (setq propriete(subst(cons '1 (strcat nouvelle (cdr(assoc '1 propriete)))) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
          (if (= ordre "SUF")                              ;Option Suffixe.
           (progn
            (setq propriete(subst(cons '1 (strcat (cdr(assoc '1 propriete)) nouvelle)) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
         )
        )    
        (setq entite(entnext entite))      ;Sélectionne l'attribut suivant du bloc.
       )
       (setq ptr(+ ptr 1))              ;Incrémente l'index du jeu de sélection des blocs.
      )
      (write-line (strcat "Nombre de blocs trouvés : " (itoa (sslength selection))))
      (write-line (strcat "Nombre d'attributs modifiés : " (itoa nbrmod)))
      (princ)
     )
    )
   )
  )
 )
)
)

 

 

lisp modifier avec dedant les valeurs des attributs, sauf qu'il ne le fait que pour un attribut et qu'il ne fonctionne pas .

 

 (defun c:ch_attribut(/ ordre blocd etiquetted nouvelle ancienne filtre selection ptr nbrmod entite pripriete actuelle k a)
(write-line "\nTéléchargé depuis le site Internet http://www.decker-cs.com")
(write-line "Auteur : Christian Decker")
;
(write-line "Changer la valeur d'un attribut.")
;
(while              ;Attend la sélection d'une méthode.
   (progn
    (setq blocd(strcase(getstring " [b] electrique [/b]")))
    (setq etiquetted(strcase(getstring " [b] etage "[/b] 1)))  
    (setq nouvelle(getstring " [b] 1etage[/b] " 1))
   )

  (if (/= (tblsearch "BLOCK" blocd) nil)  ;La définition du bloc recherché existe dans le dessin.
   (progn
    (setq filtre(list (cons '0 "INSERT") (cons '2 blocd)))
    (setq selection(ssget "X" filtre))       ;Crée un jeu de sélection.
    (if (/= selection nil)                   ;Au moins un bloc trouvé dans le dessin.
     (progn
      (setq ptr 0)
      (setq nbrmod 0)
      (while (< ptr (sslength selection))       ;Pour chaque bloc dans le jeu de sélection...
       (setq entite(entnext(ssname selection ptr)))  ;Extraction du bloc.
       (while (and (/= entite nil) (/= (cdr(assoc '0 (entget entite))) "SEQEND"))   ;Pour chaque attribut du bloc...
        (setq propriete(entget entite))                 ;Extraction des propriétés de l'attribut.
        (if (= (cdr(assoc '2 propriete)) etiquetted)    ;L'attribut doit être modifié.
         (progn                                                   
          (if (= ordre "CHA")                              ;Option Changer.
           (progn
            (setq propriete(subst(cons '1 nouvelle) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
          (if (= ordre "SUB")                              ;Option Substituer.
           (progn
            (setq actuelle(cdr(assoc '1 propriete)))          ;Extrait la valeur de l'attribut.
            (setq k 1)                                        ;Positionne le pointeur sur le 1er caractère de la valeur de l'attribut.
            (setq a 0)                                        ;Sera égal à 1 si l'attribut est modifié.
            (while (and (<= k (strlen actuelle)) (>= (- (strlen actuelle) (- k 1)) (strlen ancienne)))
             ;
             ;Tant que k est inférieure ou égale à la longueur de la chaîne actuelle, et tant que
             ;(la longueur de la chaîne actuelle - (la position du pointeur - 1)) est égale ou
             ;supérieure à la longueur de l'occurrence du texte à rechercher.
             ;
             (if (= (substr actuelle k (strlen ancienne)) ancienne)
              (progn
               ;        
               ;Le pointeur est sur le 1er caractère de l'occurrence du texte recherché.
               ;
               ;Remplace l'occurrence de texte par la nouvelle valeur :
               ;1) Récupère les caractères situés en amont du pointeur.
               ;2) Ajoute la nouvelle valeur.
               ;3) Récupère les caractères situés en aval de l'occurrence de texte.
               ;
               (setq actuelle
                (strcat
                 (substr actuelle 1 (- k 1))
                 nouvelle
                 (substr actuelle (+ k (strlen ancienne)) (- (strlen actuelle) (+ (- k 1) (strlen ancienne))))
                )
               )
               ;Ajuste la position du pointeur sur le dernier caractère de la nouvelle valeur insérée.
               (setq k(+ (- k 1) (strlen nouvelle)))   
               (setq a 1)           ;La valeur de l'attribut est modifiée.
              )
             )
             (setq k(+ k 1))     ;Incrémente l'index du pointeur.
            )
            (if (= a 1)
             (progn
              (setq propriete(subst(cons '1 actuelle) (assoc '1 propriete) propriete))
              (entmod propriete)
              (entupd entite)
              (setq nbrmod(+ nbrmod 1))
             )
            )
           )
          )
          (if (= ordre "DWG")                              ;Option Dwgname.
           (progn
            (setq propriete(subst(cons '1 (getvar "DWGNAME")) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
          (if (= ordre "PRE")                              ;Option Préfixe.
           (progn
            (setq propriete(subst(cons '1 (strcat nouvelle (cdr(assoc '1 propriete)))) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
          (if (= ordre "SUF")                              ;Option Suffixe.
           (progn
            (setq propriete(subst(cons '1 (strcat (cdr(assoc '1 propriete)) nouvelle)) (assoc '1 propriete) propriete))
            (entmod propriete)
            (entupd entite)
            (setq nbrmod(+ nbrmod 1))
           )
          )
         )
        )    
        (setq entite(entnext entite))      ;Sélectionne l'attribut suivant du bloc.
       )
       (setq ptr(+ ptr 1))              ;Incrémente l'index du jeu de sélection des blocs.
      )
      (write-line (strcat "Nombre de blocs trouvés : " (itoa (sslength selection))))
      (write-line (strcat "Nombre d'attributs modifiés : " (itoa nbrmod)))
      (princ)
     )
    )
   )
  )
 )
)
)

 

 

Posté(e)

Je ne sais pas ce que recherches exactement, je te donne un exemple avec des commenttaires :casstet:

 

(if (setq js (ssget "x" (list (cons 0 "INSERT") (cons 2 "electricite")))) ;Je créé un jeu de sélection du bloc que je veux traiter (dans une condition, histoire de voir qu'au moins un bloc est inséré dans le dessin)
 (progn
   (setq n 0) ; je commence le jeu de sélection
   (while (ssname js n) ; je parcours le jeu de sélection
     (setq ent (entget (entnext (ssname js n))) ; je récupère les valeurs d'un bloc du jeu de sélection
     (while (/= (cdr (assoc 0 ent)) "SEQEND") ; Je parcours les attributs du bloc tant que je n'arrive pas à la fin --> SEQEND
     (cond 
       ((eq (strcase (cdr (assoc 2 ent))) "ETAGE") ; Si c'est l'Attribut ETAGE
         (setq ent (subst (cons 1 "Valeur Etage") (assoc 1 ent) ent) ; Je lui donne une nouvelle valeur
         (entmod ent) ; je modifie dans le dessin l'attribut
         (entupd (cdr (assoc -1 ent))) ; je met à jour visuellement l'attribut
       )
       ((eq (strcase (cdr (assoc 2 ent))) "SITUATION") ; Idem SITUATION que pour ETAGE
         (setq ent (subst (cons 1 "Valeur Situation") (assoc 1 ent) ent)
         (entmod ent)
         (entupd (cdr (assoc -1 ent)))
       )
       ((eq (strcase (cdr (assoc 2 ent))) "GAINE")) ; Idem GAINE que pour ETAGE
         (setq ent (subst (cons 1 "Valeur Gaine") (assoc 1 ent) ent)
         (entmod ent)
         (entupd (cdr (assoc -1 ent)))
       )
     )
     (setq ent (entget (entnext (cdr (assoc -1 ent))))) ; Je passe à l'attribut suivant
   )
   (setq n (1+ n) ; je passe au bloc suivant
 )
)

 

@+

 

ps : lisp non testé

 

[Edité le 27/11/2006 par Patrick_35]

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

Posté(e)

Bonsoir

 

Pas a dire tu es un chef, je fais un essai demain et je poste la reponse .

Pour info le tous et de cree un script qui lance ce lisp , ouverture autocad modification des blocs "partie lisp" et fermeture du dessin .

Le lisp et le script sont genere automatiquement avec une macro sous excel.

 

 

 

Posté(e)

Bonjour

 

Pour info

apres avoir teste le lisp il y a une erreur au chargement

"erreur: structure incorrecte de la liste en entrée "

 

Le feuil sous excel que j'utilise existe , les macros aussi

il me manque que le lisp pour me simplifier la vie.

De plus, je suis sur un poste informatique ou je n'ai aucun controle " impossible d'installe ou de supprime des logiciels"

 

Mais merci pour l'info.

 

 

 

Posté(e)

Je ne l'avais pas testé et il manquait deux parenthèses

Le voici débuggé

 

(if (setq js (ssget "x" (list (cons 0 "INSERT") (cons 2 "electricite")))) ;Je créé un jeu de sélection du bloc que je veux traiter (dans une condition, histoire de voir qu'au moins un bloc est inséré dans le dessin)
 (progn
   (setq n 0) ; je commence le jeu de sélection
   (while (ssname js n) ; je parcours le jeu de sélection
     (setq ent (entget (entnext (ssname js n)))) ; je récupère les valeurs d'un bloc du jeu de sélection
     (while (/= (cdr (assoc 0 ent)) "SEQEND") ; Je parcours les attributs du bloc tant que je n'arrive pas à la fin --> SEQEND
       (cond
         ((eq (strcase (cdr (assoc 2 ent))) "ETAGE") ; Si c'est l'Attribut ETAGE
           (setq ent (subst (cons 1 "Valeur Etage") (assoc 1 ent) ent)) ; Je lui donne une nouvelle valeur
           (entmod ent) ; je modifie dans le dessin l'attribut
           (entupd (cdr (assoc -1 ent))) ; je met à jour visuellement l'attribut
         )
         ((eq (strcase (cdr (assoc 2 ent))) "SITUATION") ; Idem SITUATION que pour ETAGE
           (setq ent (subst (cons 1 "Valeur Situation") (assoc 1 ent) ent))
           (entmod ent)
           (entupd (cdr (assoc -1 ent)))
         )
         ((eq (strcase (cdr (assoc 2 ent))) "GAINE") ; Idem GAINE que pour ETAGE
           (setq ent (subst (cons 1 "Valeur Gaine") (assoc 1 ent) ent))
           (entmod ent)
           (entupd (cdr (assoc -1 ent)))
         )
       )
       (setq ent (entget (entnext (cdr (assoc -1 ent))))) ; Je passe à l'attribut suivant
     )
     (setq n (1+ n)) ; je passe au bloc suivant
   )
 )
)

 

@+

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

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é