Guigues Posté(e) le 5 juillet 2010 Posté(e) le 5 juillet 2010 Bonjour J'avance toujours sur mon projet de creation d'iso sous autocad et de nomenclatures automatiques. J'ai décidé de changer de portage sur la gestion des metrees et je voudrais savoir si un coup de pouce peut m etre donnée vis a vis de l exemple que je vais donner ci dessous : Dans mon dessin DWG j'ai plusieurs Blocs identiques appelés "BLOC.Dwg" qui contiennent 2 attributs :ATT1 = Designation (je le renseigne par du texte)ATT2 = Métrée (je le renseigne par une valeur numerique) La designation est la meme pour tous les blocs (qui portent le meme nom) et les valeurs de ATT2 different d'un bloc a l autre. Dans mon dessin DWG j'ai également un Bloc qui appartient a mon gabarit vierge et donc présent des le debut, il s'appelle TOTAL.dwg (il est present qu'une fois) et il contient 2 attributs :ATT1 = DesignationATT2 = somme Est-il possible de mettre en oeuvre un lisp qui copie la valeur de ATT1 de Bloc.dwg vers ATT1 de TOTAL.Dwg et qui recupere toutes les valeurs de ATT2 de Bloc.dwg, en fait la somme et copie cette valeur vers ATT2 de TOTAL.dwg ??? C'est la derniere piece du puzzle donc merci d'avance pour l'aide !!! :)
Patrick_35 Posté(e) le 5 juillet 2010 Posté(e) le 5 juillet 2010 Salut Oui, avec un lisp Est-il possible de mettre en oeuvre un lisp qui copie la valeur de ATT1 de Bloc.dwg vers ATT1 de TOTAL.Dwg et qui recupere toutes les valeurs de ATT2 de Bloc.dwg, en fait la somme et copie cette valeur vers ATT2 de TOTAL.dwg ??? Pourquoi ne pas se garder la possibilité d'avoir des Att1 différents et donc avoir plusieurs Total ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Guigues Posté(e) le 5 juillet 2010 Auteur Posté(e) le 5 juillet 2010 Je comptais utiliser x fois ce systeme avec des familles de blocs differentes pour chaque type de ligne que l'utilisateur importera ... Mais si il est possible d'identifier les ATT1 differents et de faire 1 total des ATT2 pour chaque famille de ATT1 identiques alors cela allege le systeme... Par contre il faut plusieurs fois le bloc TOTAL.dwg et il faut que le lisp renseigne de maniere dynamique les ATT1 en fonction du nombre de BLOCS.DWG ayant un ATT1 different. Si c'est impossible (mise en place d'un systeme de lecture de la chaine de caractere etc etc...) ... je pourrai sans soucis retrouver mes petits avec le schema exposé initialement... :)
Patrick_35 Posté(e) le 5 juillet 2010 Posté(e) le 5 juillet 2010 Mais si il est possible d'identifier les ATT1 differents et de faire 1 total des ATT2 pour chaque famille de ATT1 identiques alors cela allege le systeme... Oui, mais cet attribut est renseigné une première fois pas l'utilisateur ou c'est le lisp qui écrit dedans en voyant qu'il n'est pas renseigné ? ps : tu commences à faire le lisp, on t'aidera @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Patrick_35 Posté(e) le 6 juillet 2010 Posté(e) le 6 juillet 2010 C'est mon jour de bonté (defun c:toa(/ blo bloc_1 bloc_2 doc ent lgn lst lst1 lst2 sel tot nombl reliq total) (defun nombl(bl) (if (vlax-property-available-p bl 'effectivename) (vla-get-effectivename bl) (vla-get-name bl) ) ) (defun total(blo / att) (setq tot 0) (foreach att (vl-remove-if-not '(lambda(x)(eq (strcase (caar blo)) (strcase (caar x)))) lst2) (setq tot (+ tot (atof (cadar att)))) ) ) (defun reliq(lst txt / blo tes) (and (setq lst (vl-sort lst '(lambda(a b)(< (caar a) (caar b))))) (princ (strcat "\nIl " txt " un/des bloc(s) " bloc_1 " dans le plan.\n\tAvec comme référence de valeur d'attribut(s) : ")) (while lst (setq blo (caaar lst)) (and tes (princ ", ")) (princ blo) (setq lst (vl-remove-if '(lambda(x)(eq blo (caar x))) lst) tes T ) ) ) ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object)) bloc_1 "TOTAL" bloc_2 "BLOCS" ) (vla-startundomark doc) (and (ssget "x" (list (cons 0 "insert") (cons 2 (strcat bloc_1 "," bloc_2)) (cons 66 1))) (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (setq lst (mapcar 'vla-get-textstring (vlax-invoke ent 'getattributes))) (if (eq (strcase (nombl ent)) (strcase bloc_1)) (setq lst1 (cons (cons lst ent) lst1)) (setq lst2 (cons (cons lst ent) lst2)) ) ) (vla-delete sel) (foreach blo lst1 (total blo) (setq lgn (length lst2) lst2 (vl-remove-if '(lambda(x)(eq (caar blo) (caar x))) lst2) ) (or (eq lgn (length lst2)) (progn (vla-put-textstring (cadr (vlax-invoke (cdr blo) 'getattributes)) (rtos tot)) (setq lst1 (vl-remove-if '(lambda(x)(eq (caar blo) (caar x))) lst1)) ) ) ) (while (and lst1 lst2) (total (setq blo (car lst2))) (mapcar '(lambda(a b) (vla-put-textstring a b) ) (vlax-invoke (cdar lst1) 'getattributes) (list (caar blo) (rtos tot)) ) (setq lst1 (cdr lst1) lst2 (vl-remove-if '(lambda(x)(eq (caar blo) (caar x))) lst2) ) ) (reliq lst1 "reste") (reliq lst2 "manque") ) ) (vla-endundomark doc) (princ) ) @+ [Edité le 6/7/2010 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
Guigues Posté(e) le 7 juillet 2010 Auteur Posté(e) le 7 juillet 2010 Merci... Ca marche parfaitement Je posterai un fichier .Zip du menu complet... la tu viens de decoincer la situation et de m ouvrir en grand le chemin pour que j'accomplisse ce projet (qui me trotte dans la tete depuis plus d'un an) !! Tu l'as entendu souvent.... mais bravo ! quel talent...
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