brunomu Posté(e) le 14 mai 2006 Posté(e) le 14 mai 2006 Merci ô vénérable maître. :) Cependant, moi qui ne suis qu'un misérable lispeur débutant, déshonoré par sa ceinture blanche, je me permets d'objecter qu'il faut remplacer : (vla-put-textstring (vlr-data rea) (strcat (rtos (vla-get-area obj) 2 2) "M2")) par (vla-put-textstring (vlr-data rea) (strcat (rtos (/ (vla-get-area obj) 10000) 2 2) "M2")) pour que la conversion cm2 > m2 soit correcte. :cool:
Patrick_35 Posté(e) le 14 mai 2006 Posté(e) le 14 mai 2006 Merci ô vénérable maître. C'est un peu exagéré Tu peux remplacer ce qui te convient, mais il me semble que 100cm=1m et que 10000mm=1m @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
brunomu Posté(e) le 14 mai 2006 Posté(e) le 14 mai 2006 Pardonnez-moi d'avoir exagéré vénérable maître.Je vous appellerai désormais maître. Pour ce qui nous préoccupe: 1m = 100cm, donc 1m2 = 10000cm2
Patrick_35 Posté(e) le 14 mai 2006 Posté(e) le 14 mai 2006 Ah oui, exact petit padawan. Je crois qu'il est temps que j'aille me coucher @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
grandsteak44 Posté(e) le 19 mai 2006 Posté(e) le 19 mai 2006 Bonjour à tous Je me suis permit de modifier le lisp REA pour pouvoir lier la surface de la polyligne à un attribut de bloc (dans lequel il y a une etiquette avec le nom du local et une autre avec la surface). Dans mon cas la surface est affichée en métres carré avec 2 chiffres après la virgule et je dessine en cm. (defun modif_poly(obj rea arg-list)(if (and (vlax-read-enabled-p obj)(vlax-read-enabled-p (vlr-data rea)))(vla-put-textstring (vlr-data rea) (strcat (rtos (/ (vla-get-area obj) 10000) 2 2) "M2"))(vlr-remove rea))) (defun effacer_pt(obj rea arg-list)(vlax-ldata-delete obj "Patrick_35" (vlr-data rea))(vlax-ldata-delete (vlr-data rea) "Patrick_35" obj)(vlr-remove rea)) (defun c:rea-att(/ n sel_poly sel_text)(while (not sel_poly)(setq sel_poly (car (entsel "\nSélection de la polyligne/spline/cercle : ")))(if sel_poly(if (or (= (cdr (assoc 0 (entget sel_poly))) "POLYLINE")(= (cdr (assoc 0 (entget sel_poly))) "LWPOLYLINE")(= (cdr (assoc 0 (entget sel_poly))) "SPLINE")(= (cdr (assoc 0 (entget sel_poly))) "CIRCLE"))(progn(setq sel_poly (vlax-ename->vla-object sel_poly))(if (/= (vla-get-objectname sel_poly) "AcDbCircle")(if (= :vlax-false (vla-get-closed sel_poly))(progn(alert "Cette Polyligne/Spline n'est pas fermée")(setq sel_poly nil))))(if sel_poly(if (vlax-ldata-get sel_poly "Patrick_35")(progn(alert "Polyligne/Spline/Cercle déjà associé à un attribut")(setq sel_poly nil)))))(progn(alert "Ce n'est pas une Polyligne/Spline/Cercle")(setq sel_poly nil)))))(if sel_poly (progn (while (not sel_text) (setq sel_text (car (nentsel "\nSélection de l'attribut : "))) (if sel_text (if (= (cdr (assoc 0 (entget sel_text))) "ATTRIB") (progn (setq sel_text (vlax-ename->vla-object sel_text)) (if (vlax-ldata-get sel_text "Patrick_35") (progn (alert "Attribut déjà associé à une Polyligne/Spline/Cercle") (setq sel_text nil) ) ) ) (progn (setq sel_text nil) (alert "Ce n'est pas un attribut") ))))(if sel_text(progn(vla-put-textstring sel_text (rtos (vla-get-area sel_poly)))(vlr-object-reactor (list sel_poly) sel_text '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt)))(vlr-object-reactor (list sel_text) sel_poly '((:vlr-erased . effacer_pt)))(vlax-ldata-put sel_poly "Patrick_35" sel_text)(vlax-ldata-put sel_text "Patrick_35" sel_poly)))))(princ)) (defun refaire_reacteurs(/ entp entt n)(vl-load-com)(if (not appli_patrick_35)(progn(setq appli_patrick_35 (ssget "x" (list (cons 102 "{ACAD_XDICTIONARY"))))(if appli_patrick_35(progn(setq n 0)(while (setq entp (ssname appli_patrick_35 n))(setq entp (vlax-ename->vla-object entp))(setq entt (vlax-ldata-get entp "Patrick_35"))(vlr-object-reactor (list entp) entt '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt)))(vlr-object-reactor (list entt) entp '((:vlr-erased . effacer_pt)))(setq n (1+ n)))))))(princ)) (refaire_reacteurs)
grandsteak44 Posté(e) le 30 mai 2006 Posté(e) le 30 mai 2006 BonjourJ'utilise maintenant la commande rea-att qui marche tres bien mais je trouve qu'il y a encore un probleme.Je m'explique : si qqun modifie la polyligne associée a un attribut sans avoir charge le lisp, l'attribut ne se met pas a jour (evidemment !!). J'aimerais donc pouvoir lancer une fonction (ou l'intregrer directement dans la fonction rea-att) qui remet a jour tous les attributs presents dans le fichier qui ont ete au prealable liaisonnes a des polylignes.Ma question est la suivante : comment faire ??Merci d'avance pour vos brillantes reponses.
Patrick_35 Posté(e) le 30 mai 2006 Posté(e) le 30 mai 2006 SalutJe t'ai fais la modif en gras sur le listing pour que si la surface ne correspond pas au texte, que cela se remette à jour @+ ps : On ne donne pas ses sources à ses petits camarades ;) pps : As tu regardé ce 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
esbe Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Bonjour à tous et bravo , c"est vraiment génial d' offrir des programmes comme celui là. J 'ai essaye utiliser, à défaut de le comprendre, ce lisp .... Je suis sur une 2004 (je ne sais pas si c'est importantJ 'ai donc créée une polilygne et un bloc avecles deux attributs, local et surface.Mais lorsque je charge le rea.lspj'ai Commande: APPLOAD rea.lsp correctement chargé(s)Commande: ; erreur: no function definition: OBJ est-ce lier à mon copier/coller du lisp ds le bloc note ou je m'y prends malMerci de votre aide
esbe Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Au fait si je tape rea en commande , il me met commande inconnue !!!
esbe Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Désolée d être aussi nulle Cà il y est J "ai compris en retrouvant le programme de Patrick qui lié un texte et une ligne Mais je ne comprend pas comment vous integrez la surface crée comme attribut de bloc si le bloc existe il ne le reconnait pas comme texte, et je ne peux pas tranformer ce texte en attribut avant la création du bloc Merci de votre aide
Patrick_35 Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Salut EsbeSur la réponse N° 29,grandsteak44 a modifié le lisp pour une utilisation avec des attributs ps : à lui de faire aussi la même modif que la mienne par rapport à sa remarque @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
grandsteak44 Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Merci Patrick de ton aide Je t'ai fais la modif en gras sur le listing pour que si la surface ne correspond pas au texte, que cela se remette à jourJ'ai rajoute une ligne a mon code suivant tes indications (en gras sur le code ci-joint) mais ca ne semble pas resoudre mon probleme. (peut etre ai-je fait une erreur ou je n'ai pas ete tres clair).Je vais essayer de comprendre le code de latt (fonction tres utile soit dit en passant)pour voir si je peux y trouver mon bonheur. Bonjour Esbe Mais je ne comprend pas comment vous integrez la surface crée comme attribut de bloc si le bloc existe il ne le reconnait pas comme texte, et je ne peux pas tranformer ce texte en attribut avant la création du bloc Dans une reponse que j'ai prededemment laissee je mettais le code pour une fonction rea-att qui permet de lier une polyligne a un attribut de bloc au prealable insere. C'est en fait une adaptation (j'ai change une ligne...) du code que Patrick avait donne pour la fonction rea qui elle associe une polyligne a un texte.Essaye en recopiant le code suivant et en lancant la commande rea-att (defun modif_poly(obj rea arg-list) (if (and (vlax-read-enabled-p obj)(vlax-read-enabled-p (vlr-data rea))) (vla-put-textstring (vlr-data rea) (strcat "S=" (rtos (/ (vla-get-area obj) 10000) 2 2) "M2")) (vlr-remove rea) ) ) (defun effacer_pt(obj rea arg-list) (vlax-ldata-delete obj "Patrick_35" (vlr-data rea)) (vlax-ldata-delete (vlr-data rea) "Patrick_35" obj) (vlr-remove rea) ) (defun c:rea-att(/ n sel_poly sel_text) (while (not sel_poly) (setq sel_poly (car (entsel "\nSélection de la polyligne/spline/cercle : "))) (if sel_poly (if (or (= (cdr (assoc 0 (entget sel_poly))) "POLYLINE") (= (cdr (assoc 0 (entget sel_poly))) "LWPOLYLINE") (= (cdr (assoc 0 (entget sel_poly))) "SPLINE") (= (cdr (assoc 0 (entget sel_poly))) "CIRCLE")) (progn (setq sel_poly (vlax-ename->vla-object sel_poly)) (if (/= (vla-get-objectname sel_poly) "AcDbCircle") (if (= :vlax-false (vla-get-closed sel_poly)) (progn (alert "Cette Polyligne/Spline n'est pas fermée") (setq sel_poly nil) ) ) ) (if sel_poly (if (vlax-ldata-get sel_poly "Patrick_35") (progn (alert "Polyligne/Spline/Cercle déjà associé à un attribut") (setq sel_poly nil) ) ) ) ) (progn (alert "Ce n'est pas une Polyligne/Spline/Cercle") (setq sel_poly nil) ) ) ) ) (if sel_poly (progn (while (not sel_text) (setq sel_text (car (nentsel "\nSélection de l'attribut : "))) (if sel_text (if (= (cdr (assoc 0 (entget sel_text))) "ATTRIB") (progn (setq sel_text (vlax-ename->vla-object sel_text)) (if (vlax-ldata-get sel_text "Patrick_35") (progn (alert "Attribut déjà associé à une Polyligne/Spline/Cercle") (setq sel_text nil) ) ) ) (progn (setq sel_text nil) (alert "Ce n'est pas un attribut") ) ) ) ) (if sel_text (progn (vla-put-textstring sel_text (rtos (vla-get-area sel_poly))) (vlr-object-reactor (list sel_poly) sel_text '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt))) (vlr-object-reactor (list sel_text) sel_poly '((:vlr-erased . effacer_pt))) (vlax-ldata-put sel_poly "Patrick_35" sel_text) (vlax-ldata-put sel_text "Patrick_35" sel_poly) ) ) ) ) (princ) ) (defun refaire_reacteurs(/ entp entt n) (vl-load-com) (if (not appli_patrick_35) (progn (setq appli_patrick_35 (ssget "x" (list (cons 102 "{ACAD_XDICTIONARY")))) (if appli_patrick_35 (progn (setq n 0) (while (setq entp (ssname appli_patrick_35 n)) (setq entp (vlax-ename->vla-object entp)) (setq entt (vlax-ldata-get entp "Patrick_35")) [b] (vla-put-textstring ent (strcat "S=" (rtos (/ (vla-get-area obj) 10000) 2 2) "M2"))[/b] (vlr-object-reactor (list entp) entt '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt))) (vlr-object-reactor (list entt) entp '((:vlr-erased . effacer_pt))) (setq n (1+ n)) ) ) ) ) ) (princ) ) (refaire_reacteurs)
esbe Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Genial !!!!Ca deconne sur la 2004 mais sur la 2005 c 'est nickelOui je n 'avais pas capté pour rea-att c'est ok Merci à vousJe vais gagné un temps fou bonne journée PS juste une question Est-ce normal lorsqu'on copie le bloc pour un tableau par exemple, la surface ne se met pas à jour apres une modification ??
Patrick_35 Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 grandsteak44 (vla-put-textstring ent (strcat "S=" (rtos (/ (vla-get-area obj) 10000) 2 2) "M2")) En version corrigé (vla-put-textstring ent[b]t[/b] (strcat "S=" (rtos (/ (vla-get-area obj) 10000) 2 2) "M2")) esbe Est-ce normal lorsqu'on copie le bloc pour un tableau par exemple, la surface ne se met pas à jour apres une modification ?? Oui, pour cela, utilise ce 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
esbe Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Merci Patrick_35 C 'est vraiment Noel aujourd'hui , moi qui avez le moral à 0 à cause ma déclaration d 'impots Tu me mets du baume au coeur !!! PS: pour être sur d'avoir bien compris la liaison avec LASS est unique, si je rends identique deux attributs apres copie d'un bloc, si remodifie la polyligne , il faut refaire Lass, parce que la copie du bloc ne se modifie pas automatiquement , C' est normal ???
Patrick_35 Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 La commande LATT est pour faire des liaisons de trois types : Identique, croissant ou somme.Si un attribut est lié avec la commande rea et qu'ensuite tu lies cette attribut avec un autre (avec latt du type identique), le second prends la même valeur que le premier (qui se modifient donc logiquement tous si tu bouges ta poly). Maintenant, si tu fais une copie du bloc avec l'attribut lié, la liaison avec l'attribut du bloc copié se fait automatiquement (et comme elle est du type identique, ce sera donc la même valeur pour l'attribut) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
esbe Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Ben non Chez moi , j'ai cree un bloc avec les deux attributs, avec rea je lie la polyligne, puis j 'ai copié ce bloc ds un tableau Apres modif avec Latt je rend identique le bloc du tableau mais si remodifie ma polyligneil ne change pas !!!! Donc j 'ai un bugg quelque ou j 'utilise mal ton programmePourtant je selectionne l' attribut (rea), "identique", je clic sur le 2éme bloc " je valide ! c 'est magique @+
Patrick_35 Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Ah oui, c'est exact. Ca ne change pas. :( Apparemment, la modification par un réacteur sur un objet n'est pas pris en compte par un autre réacteur sur le même objet :casstet: Si un spécialiste lit le post, je passe pourtant par :vlr-modified et j'ai testé aussi avec :vlr-subObjModified et au cas où par :vlr-modifiedXData, mais rien ??? :mad: Je continue de chercher et je vous tiens au courant @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
grandsteak44 Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Chez moi c'est pareil : la laison est bel et bien creee mais l'attribut ne se met pas a jour.Je pense que ca rejoint le probleme que j'evoquais plus haut concernant une mise a jour globale de toutes les liaisons. (j'en sais rien en fait)Peut etre qu'une compilation des 2 programmes en un seul resoudrait le probleme. Pourquoi pas rajouter une option a la fonction latt pour creer une chaine avec des attributs et des polylignes (ca commence peut etre a devenir compliqué !!!) Tout ca c'est idees en l'air @+
Patrick_35 Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 C'est bon, j'ai trouvé. C'étaiit un bug dans LATT. Je verrouillais un peu trop mes vérifications @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
brunomu Posté(e) le 11 juillet 2006 Posté(e) le 11 juillet 2006 Merci à tous les contributeurs, c'est super de pouvoir disposer enfin d'un moyen de tenir à jour les surfaces d'un projet sans galérer. Petits problèmes non résolus cependant : - si je copie la polyligne et/ou le texte, par exemple parce que dans un projet il y a plusieurs locaux identiques, les copies ne sont plus réactives, ce que je peux comprendre, mais elles ne peuvent même plus être associées : il faut en fait créer une nouvelle polyligne et l'associer à un nouveau texte pour chaque local. Y aurait-il un moyen simple pour pouvoir associer polyligne et texte produits par copie ? - si je crée un wbloc avec des polylignes et des textes liés et que j'insère ce wbloc dans un fichier, soit AutoCad plante illico, soit les textes cessent d'être réactifs... Mystère. HELP !
Ckycia Posté(e) le 19 juillet 2006 Posté(e) le 19 juillet 2006 BonjourLorsque je cherche la surface de mon "TN ou Terrain Naturel" ou autre, La méthode la plus simple: je fais une coupe (3D), puis je fais une extrusion de 1m, alors j'ouvre "renseignement" : au lieu de lire par exemple " x m3" j'ai aussi " x m2" ...Merci
brunomu Posté(e) le 19 juillet 2006 Posté(e) le 19 juillet 2006 Merci pour cette réponse, mais ça ne correspond pas à ce que je recherche. Les lisps énoncés dans les posts précédents permettent de créer un lien réactif entre une polyligne et un texte. Ça permet par exemple de modifier des plans de bâtiments sans avoir à recalculer la surface de toutes les pièces. Le problème (non résolu) est que, si on copie un texte ou une polyligne liés, les exemplaires copiés sont inutilisables pour la création d'un nouveau lien...
Patrick_35 Posté(e) le 19 juillet 2006 Posté(e) le 19 juillet 2006 SalutJe vais regarder ce que je peux faire, mais pas tout de suite @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
blizard Posté(e) le 7 juin 2007 Posté(e) le 7 juin 2007 histoire de finasser, comment pourait-on modifié le lisp rea pour avoir mes m² avec un ² au lieu d'un 2, et n'avoir qu'un chiffre après la virgule? merci d'avance
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