serge77 Posté(e) le 4 janvier 2006 Posté(e) le 4 janvier 2006 Bonjour, j'ai recuperer un petit lisp pour change l'attribut DATEO dans mes cartouches, il marche très bien mais maintenant je voudrais le faire pour d'autres choses que la date.Pouvez vous me dire se que je dois changer dans ce lisp pour non plus changer l'ancienne date par la date actuelle dans l'attribut DATEO mais par exemple mettre Serge dans l'attribut NOM2 Je vous joins le lisp que j'ai récupéré et merci à son éditeur et à vous tous pour vos réponse (defun DATEO () (menucmd "M=$(edtime,$(getvar,date),DD/MO/YY)") ) (defun c:MAJDATE ( / AncVal LstEnt NomEnt) (setq NomEnt (entnext)) (while NomEnt (setq LstEnt (entget NomEnt)) (if (and (member '(0 . "ATTRIB") LstEnt) (member '(2 . "DATEO") LstEnt)) (progn (setq AncVal (cdr (assoc 1 LstEnt))) (setq LstEnt (subst (cons 1 (DATEO)) (cons 1 AncVal) LstEnt)) (entmod LstEnt) (entupd NomEnt) ) ) (setq NomEnt (entnext NomEnt)) ) (princ) )
bonuscad Posté(e) le 4 janvier 2006 Posté(e) le 4 janvier 2006 Comme ceci: (defun c:MAJNOM ( / AncVal LstEnt NomEnt) (setq NomEnt (entnext)) (while NomEnt (setq LstEnt (entget NomEnt)) (if (and (member '(0 . "ATTRIB") LstEnt) (member '(2 . "NOM2") LstEnt)) (progn (setq AncVal (cdr (assoc 1 LstEnt))) (setq LstEnt (subst (cons 1 "Serge") (cons 1 AncVal) LstEnt)) (entmod LstEnt) (entupd NomEnt) ) ) (setq NomEnt (entnext NomEnt)) ) (princ) ) Juste en remarque,Pas très utile de parcourir toute la base de donnée du dessin pour mettre à jour ton bloc.Parcourir une sélection ciblée serait mieux et plus rapide [Edité le 4/1/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
serge77 Posté(e) le 4 janvier 2006 Auteur Posté(e) le 4 janvier 2006 Merci beaucoup, ca marche impeccable, je vais étudier tous ca le dupliquer pour toutes les valeurs que je dois changer et le tour sera jour.Si ca marche pas en script il faut le faire en lispMerci encore bonuscad
serge77 Posté(e) le 4 janvier 2006 Auteur Posté(e) le 4 janvier 2006 Juste une derniere question, pour enchainer les deux scripts, comment je doit faire parce que j'essaie et il ne m'en fait qu'un à chaque fois
bonuscad Posté(e) le 4 janvier 2006 Posté(e) le 4 janvier 2006 Oui, Au lieu de faire une multitude de lisp similaires en faire un unique regroupant tes modif sera plus rapide. Au moins tu parcours la base de donnée qu'une seule fois ;) Les 2 précédent fusioné, a completer encore! (defun DATEO () (menucmd "M=$(edtime,$(getvar,date),DD/MO/YY)") ) (defun c:MAJATT ( / AncVal LstEnt NomEnt) (setq NomEnt (entnext)) (while NomEnt (setq LstEnt (entget NomEnt)) (if (member '(0 . "ATTRIB") LstEnt) (cond ((member '(2 . "DATEO") LstEnt) (setq AncVal (cdr (assoc 1 LstEnt))) (setq LstEnt (subst (cons 1 (DATEO)) (cons 1 AncVal) LstEnt)) (entmod LstEnt) (entupd NomEnt) ) ((member '(2 . "NOM2") LstEnt)) (setq AncVal (cdr (assoc 1 LstEnt))) (setq LstEnt (subst (cons 1 "Serge") (cons 1 AncVal) LstEnt)) (entmod LstEnt) (entupd NomEnt) ) ;;Autant de condition que l'on veut ici ;; sous la forme ;; ((condition vrai) ici member ;; (subst)(entmod)(entupd) ;; ) ) ) (setq NomEnt (entnext NomEnt)) ) (princ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
argilles Posté(e) le 5 janvier 2006 Posté(e) le 5 janvier 2006 Hello les boys and girls, J'ai regardé tes quetions réponses, et j'avias posé une question similaire et en voici le résultat des pensées de Cad Xp : ;*********** Permet de modifier tous les attributs dans un meme fichier ************(defun c:AZZ (/ bl ent js n modif sel tot) (vl-load-com) (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) ;(command "_.undo" "_group") (if (setq sel (nentsel "\nSélectionnez une étiquette : ")) (if (= (cdr (assoc 0 (entget (car sel)))) "ATTRIB") (if (setq val (getstring t "\nNouvelle valeur : ")) (progn (setq bl (tblnext "block" t) sel (entget (car sel)) tot 0) (while bl (if (and (= (logand (cdr (assoc 70 bl)) 2) 2) (/= (logand (cdr (assoc 70 bl)) 4) 4)) (progn (setq ent (cdr (assoc -2 bl))) (while ent (setq ent (entget ent)) (if (and (= (cdr (assoc 0 ent)) "ATTDEF") (= (cdr (assoc 2 ent)) (cdr (assoc 2 sel)))) (if (setq js (ssget "x" (list (cons 0 "INSERT") (assoc 2 bl)))) (progn (setq n 0) (while (ssname js n) (setq modif (entget (entnext (ssname js n)))) (while (/= (cdr (assoc 0 modif)) "SEQEND") (if (= (cdr (assoc 2 modif)) (cdr (assoc 2 sel))) (progn (setq modif (subst (cons 1 val) (assoc 1 modif) modif) tot (1+ tot)) (entmod modif) (entupd (cdr (assoc -1 modif))) ) ) (setq modif (entget (entnext (cdr (assoc -1 modif))))) ) (setq n (1+ n)) ) ) ) ) (setq ent (entnext (cdr (assoc -1 ent)))) ) ) ) (setq bl (tblnext "block")) ) (princ (strcat "\nModification de " (itoa tot) " étiquettes")) ) ) (princ "\nCe n'est pas une étiquette.") ) ) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) ;(command "_.undo" "_end") (princ)) C'est un petit programme qui te change le texte d'un attribut sélectionné au préalable et cela dans le bloc et l'attribut du même nom et magique dans toutes les présentations. Bye et bon lisp. @rgilles >>>>>>>>>> venez visiter mon nouveau site d’Architecture http://argile.archi.free.fr <<<<<<<<<
grandsteak44 Posté(e) le 12 mai 2006 Posté(e) le 12 mai 2006 Bonjour,J'ai essaye la fonction MAJATT mais cela ne semble pas marcher. J'ai pourtant cree un bloc avec les attributs DATEO et NOM2.Comment modifier le programme pour que l'attribut NOM2 corresponde au nom de l'utilisateur de l'ordinateur ?Merci d'avance
bonuscad Posté(e) le 12 mai 2006 Posté(e) le 12 mai 2006 En changeant la ligne (setq LstEnt (subst (cons 1 "Serge") (cons 1 AncVal) LstEnt)) en (setq LstEnt (subst (cons 1 (getvar "loginname")) (cons 1 AncVal) LstEnt)) Si j'ai bien compris la question? Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
grandsteak44 Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 Bonjour,Merci Bonuscad pour ta reponse qui correspond bien a ce que je voulais (t'avais bien compris la question). Ta modification marche bien avec la fonction MAJNOM mais par contre j'ai un probleme avec la fonction MAJATT (fusion de MAJNOM et MAJDATE) : lorsque je la lance il ne se passe rien et il n'y a pas de message d'erreur. A quoi cela peut il bien etre du ??
bonuscad Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 Faire la même modif pour le nom que pour le premier ET enlever une paranthèse en trop (il y avait une erreur, désolé) ((member '(2 . "NOM2") LstEnt))doit devenir((member '(2 . "NOM2") LstEnt) Et ça devrait fonctionner comme pour le 1er. ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
grandsteak44 Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 Merci BonuscadEffectivement ca marche beaucoup mieux comme ca !!J'ai complete le programme pour avoir aussi le nom du fichier dans un attribut FICHIER.Ca donne ca : (defun DATEO ()(menucmd "M=$(edtime,$(getvar,date),DD/MO/YY)")) (defun c:MAJATT ( / AncVal LstEnt NomEnt)(setq NomEnt (entnext))(while NomEnt(setq LstEnt (entget NomEnt))(if (member '(0 . "ATTRIB") LstEnt)(cond((member '(2 . "DATEO") LstEnt)(setq AncVal (cdr (assoc 1 LstEnt)))(setq LstEnt (subst (cons 1 (DATEO)) (cons 1 AncVal) LstEnt))(entmod LstEnt)(entupd NomEnt))((member '(2 . "NOM2") LstEnt)(setq AncVal (cdr (assoc 1 LstEnt)))(setq LstEnt (subst (cons 1 (getvar "loginname")) (cons 1 AncVal) LstEnt))(entmod LstEnt)(entupd NomEnt))((member '(2 . "FICHIER") LstEnt)(setq AncVal (cdr (assoc 1 LstEnt)))(setq LstEnt (subst (cons 1 (getvar "dwgname")) (cons 1 AncVal) LstEnt))(entmod LstEnt)(entupd NomEnt)) ;;Autant de condition que l'on veut ici;; sous la forme;; ((condition vrai) ici member;; (subst)(entmod)(entupd) ;; ) ))(setq NomEnt (entnext NomEnt)))(princ)) Maintenant j'aimerais avoir le chemin qui s'affiche avant le nom du fichier mais visiblement j'ai un probleme de syntaxe quand je remplace la ligne (setq LstEnt (subst (cons 1 (getvar "dwgname")) (cons 1 AncVal) LstEnt))par(setq LstEnt (subst (cons 1 (strcat (getvar "dwgprefix") (getvar "dwgname"))) (cons 1 AncVal) LstEnt)) Cherchez l'erreur ...
bonuscad Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 Cherchez l'erreur ... Je ne vois pas d'erreur de syntaxe :casstet: Cependant sous quelle version travaille tu?Car j'ai lu que sous 2007 l'interprétation des "\\" laissait à désirer (ce que renvoi généralement DWGPREFIX) Dans ce cas une solution, substituer "\\" par "/", à voir :exclam: Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
grandsteak44 Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 Je travaille sur autocad2004.Effectivement ca marche tres bien comme ca. J'ai du faire une maivaise manip'.( Je suis surtout très surpris d'avoir réussi un tel exploit de programmation !!)Une petite question : comment formater la variable date pour avoir l'heure en plus de la date ?Merci pour ton aide.
bonuscad Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 Une vieille fonction d'autodesk (defun def_date (td / j y d m) (setq j (- (fix td) 1721119.0)) (setq y (fix (/ (1- (* 4 j)) 146097.0))) (setq j (- (* j 4.0) 1.0 (* 146097.0 y))) (setq d (fix (/ j 4.0))) (setq j (fix (/ (+ (* 4.0 d) 3.0) 1461.0))) (setq d (- (+ (* 4.0 d) 3.0) (* 1461.0 j))) (setq d (fix (/ (+ d 4.0) 4.0))) (setq m (fix (/ (- (* 5.0 d) 3) 153.0))) (setq d (- (* 5.0 d) 3.0 (* 153.0 m))) (setq d (fix (/ (+ d 5.0) 5.0))) (setq y (+ (* 100.0 y) j)) (if (< m 10.0) (setq m (+ m 3)) (progn (setq m (- m 9)) (setq y (1+ y)) ) ) (strcat (itoa (fix d)) "/" (itoa (fix m)) "/" (itoa (fix y)) ) ) Exemples d'appel: (def_date (getvar "TDCREATE"))(def_date (getvar "TDUPDATE"))(def_date (getvar "DATE")) Je t'invite à regarder aussi ce SUJET , je pense qu'il peut t'interresser. ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bonuscad Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 Zut, je viens de percuter que c'est l'heure que tu voulais, Le lisp: ; Copyright (C) 1992 by Autodesk, Inc. ; ; Permission to use, copy, modify, and distribute this software ; for any purpose and without fee is hereby granted, provided ; that the above copyright notice appears in all copies and that ; both that copyright notice and this permission notice appear in ; all supporting documentation. ; ; THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED ; WARRANTY. ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR ; PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED. ; **************************************************************** ; AutoCAD Julian date to calendar date conversion ; Designed and implemented by Kelvin R. Throop ; Typed in by A. Hanspal. (defun C:HORLOGE ( / td time j y d m hh mm ss dcl_id) (setq td (getvar "date")) (setq time (* 86400.0 (- td (setq j (fix td))))) (setq j (- j 1721119.0)) (setq y (fix (/ (1- (* 4 j)) 146097.0))) (setq j (- (* j 4.0) 1.0 (* 146097.0 y))) (setq d (fix (/ j 4.0))) (setq j (fix (/ (+ (* 4.0 d) 3.0) 1461.0))) (setq d (- (+ (* 4.0 d) 3.0) (* 1461.0 j))) (setq d (fix (/ (+ d 4.0) 4.0))) (setq m (fix (/ (- (* 5.0 d) 3) 153.0))) (setq d (- (* 5.0 d) 3.0 (* 153.0 m))) (setq d (fix (/ (+ d 5.0) 5.0))) (setq y (+ (* 100.0 y) j)) (if (< m 10.0) (setq m (+ m 3)) (progn (setq m (- m 9)) (setq y (1+ y)) ) ) ; Determine the clock time from the fraction of the day (setq hh (fix (/ time 3600.0))) (setq time (- time (* hh 3600.00))) (setq mm (fix (/ time 60.0))) (setq ss (- time (* mm 60.0))) ; Now print the date. Year in Y, month in M, day in D and the time (setq dcl_id (load_dialog "julian.dcl")) (if (not (new_dialog "horloge" dcl_id)) (exit)) (set_tile "DATE" (strcat "DATE : " (itoa (fix d)) "/" (itoa (fix m)) "/" (itoa (fix y)) ) ) (set_tile "TIME" (strcat "HEURE: " (itoa hh) ":" (itoa mm) ) ) (action_tile "accept" "(done_dialog)") (start_dialog) (unload_dialog dcl_id) ) Le DCL horloge : dialog { label = "Horloge"; :boxed_row { :text { key = "DATE"; alignment = right; is_bold = true; width = 18; fixed_width = true; } } :boxed_row { :text { key = "TIME"; alignment = right; is_bold = true; width = 18; fixed_width = true; } } ok_only; } Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 En un peu plus simple pour la date (setq ma_date (menucmd "M=$(edtime,$(getvar,date),DD/MO/YYYY HH:MM)")) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 En un peu plus simple pour la date oui c'est sur, mais c'est pas moi qui l'ai pondu :P , c'est totodesk! Il faut dire qu'en 92, je ne sais pas si le diesel était à 75$ le baril. Mais pour être objectif, il faudrait faire un benchmark sur les 2 façons, il n'est pas certain que la vieille 2CV soit hors course... :exclam: Si quelqu'un veut s'amuser à comparer? Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 15 mai 2006 Posté(e) le 15 mai 2006 J'ai déjà fait un comparatif entre cette méthode et celle d'autodesk (dont le lisp s'appelait julian il me semble) et que je trouvais comme résultat une seconde d'écart. C'est surement le résultat de toutes les opérations avec leurs précisions plus ou moins grandes @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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