Aller au contenu

modification d\'attributs


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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 lisp

Merci encore bonuscad

 

 

Posté(e)

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

Posté(e)

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

Posté(e)

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 <<<<<<<<<

  • 4 mois après...
Posté(e)

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

Posté(e)

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

Posté(e)

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 ??

Posté(e)

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

Posté(e)

Merci Bonuscad

Effectivement 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 ...

Posté(e)

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

Posté(e)

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.

 

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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 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é