Zeus-94 Posté(e) le 24 novembre 2006 Posté(e) le 24 novembre 2006 Bonjour Voila j'aimerais changer trois attributs d'un meme bloc ,j'utilise le lisp de Lisps de Patrick_35 lisp MATle 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.
Patrick_35 Posté(e) le 26 novembre 2006 Posté(e) le 26 novembre 2006 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
yalta Posté(e) le 27 novembre 2006 Posté(e) le 27 novembre 2006 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
Patrick_35 Posté(e) le 27 novembre 2006 Posté(e) le 27 novembre 2006 Ca prends maintenant en compte les attributs invisible, donc ceux qui n'apparaissent pas à l'écran @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
yalta Posté(e) le 27 novembre 2006 Posté(e) le 27 novembre 2006 .... :P :P ....je n'avais pas relancé Autocad....
Zeus-94 Posté(e) le 27 novembre 2006 Auteur Posté(e) le 27 novembre 2006 Bonjour et merci pour cette super ameliorationLa 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) ) ) ) ) ) ) )
Patrick_35 Posté(e) le 27 novembre 2006 Posté(e) le 27 novembre 2006 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Zeus-94 Posté(e) le 27 novembre 2006 Auteur Posté(e) le 27 novembre 2006 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.
Patrick_35 Posté(e) le 28 novembre 2006 Posté(e) le 28 novembre 2006 Le lisp et le script sont genere automatiquement avec une macro sous excel. Tu as aussi Scriptor dans les routines lisp @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Zeus-94 Posté(e) le 28 novembre 2006 Auteur Posté(e) le 28 novembre 2006 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 aussiil 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.
Patrick_35 Posté(e) le 28 novembre 2006 Posté(e) le 28 novembre 2006 Je ne l'avais pas testé et il manquait deux parenthèsesLe 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Zeus-94 Posté(e) le 28 novembre 2006 Auteur Posté(e) le 28 novembre 2006 Re-bonjour Plus rien a dire , il fonctionne super bien Un tres grand Merci
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