chris_mtp Posté(e) le 3 août 2008 Posté(e) le 3 août 2008 Bonjour à tous JE me trouve confronter à un pb sur des écritures de surfaces sos forme de texte.Est il possible de créer en fait une chaîne de caractéres à partir d'une propriété d'un objet autpcad ? Je m'explique : Je voudrais en fait en cliquant sur une polyligne avoir sa surface en ares et que celle ci s'écrive sous forme de texte en cliquant au centre de la polyligne. J'ai essayé de modifier le lisp de Patrick Rea qui permet d'écrire la surface d'un objet sous forme d'un champ dynamique mais je n'ai trouvé pas de solution. Rien non plus en consultant l'aide d'AutoACAD sur les chaines de caractères sur des champs. Attention pour ce qui ne le savent pas ; 1 are = 100m2 donc une surface de 6358m2 fait 63a58ca. Ca ne rien a rien de mettre des decimales. Arrondit les surfaces à l'entier supérieur est suffisant. Ci dessous un lsp simple que j'ai trouvé sur le site d'Autodesk (defun c:AT (/ entObject entObjectID InsertionPoint) (vl-load-com) (setq entObject (vlax-ename->vla-object(car (entsel))) entObjectID (vla-get-objectid entObject) InsertionPoint (vlax-3D-Point (getpoint "Select point: ")) ) (vla-addMText (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)) ) InsertionPoint 0.0 (strcat "%<\\AcObjProp Object(%<\\_ObjId " (rtos entObjectID 2 2) ">%).Area \\f \"%pr2%lu2%ct4%qf1 SQ. FT.\">%" )) mais que je n'arrive pas à modifier surtout pour avoir la surface en ares et si possible décomposer le champ créer en texte Merci par avance.
bonuscad Posté(e) le 3 août 2008 Posté(e) le 3 août 2008 Bonjour, Voici une fonction de conversion: usage(surf_cadastrale arg ) arg devant être sous forme d'entier ou réel (sous-entendu en m² pour un résultat correct)Retour sous forme de chaine (peut être vide "" si 0) ou nil si incorrect. (defun surf_cadastrale (xs / h a ca) (cond ((and xs (numberp xs)) (setq h (fix (cvunit xs "mètre_carré" "hectare")) a (fix (cvunit xs "mètre_carré" "are")) ca (fix (cvunit xs "mètre_carré" "centare")) ) (strcat (if (not (zerop h)) (strcat (itoa h) "h ") "") (if (not (zerop a)) (strcat (itoa (if (not (zerop h)) (- a (* h 100)) a)) "a ") "") (if (not (zerop ca)) (strcat (itoa (if (not (zerop a)) (- ca (* a 100)) ca)) "ca") "") ) ) ) ) Tu dois pouvoir l'insèrer dans le lisp REA de Patrick NB:pour cvunits tu peux voir le fichier AutoCAD.unt situé généralement à:C:\Documents and Settings\[surligneur]login[/surligneur]\Application Data\Autodesk\AutoCAD 2008\R17.1\fra\Support\acad.unt [Edité le 3/8/2008 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
chris_mtp Posté(e) le 10 août 2008 Auteur Posté(e) le 10 août 2008 Bonjour Bonuscad Je n'arrive pas à insérer correctement le bout de commande dans le lisp de Patrick.Je ne connais pas assez bien le lisp. Je vois dans le lisp de Patrick une commande refaire_reacteurs mais pas plus. Autocad me met le message d'erreur suivant Commande: _appload Rea.lsp correctement chargé(s)Commande: ; erreur: nombre d'arguments insuffisants J'ai insérer ta commande après celle de refaire_reacteurs . Pas à la bonne place probablement. Voici le lisp que j'ai modifié : (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) (rtos (vla-get-area obj))) (vla-put-textstring (vlr-data rea) (strcat (rtos (vla-get-area obj) 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(/ n sel_poly sel_text) (while (not sel_poly) (setq sel_poly (car (entsel "\nSélection de la polyligne : "))) (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")) (progn (setq sel_poly (vlax-ename->vla-object sel_poly)) (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 déjà associé à un texte") (setq sel_poly nil) ) ) ) ) (progn (alert "Ce n'est pas une Polyligne/Spline") (setq sel_poly nil) ) ) ) ) (if sel_poly (progn (vla-highlight sel_poly :vlax-true) (while (not sel_text) (setq sel_text (car (entsel "\nSélection du texte : "))) (if sel_text (if (or (= (cdr (assoc 0 (entget sel_text))) "TEXT") (= (cdr (assoc 0 (entget sel_text))) "MTEXT")) (progn (setq sel_text (vlax-ename->vla-object sel_text)) (if (vlax-ldata-get sel_text "Patrick_35") (progn (alert "Texte déjà associé à une Polyligne/Spline") (setq sel_text nil) ) ) ) (progn (setq sel_text nil) (alert "Ce n'est pas un texte") ) ) ) ) (if sel_text (progn (vla-highlight sel_poly :vlax-false) (vla-put-textstring sel_text (rtos (vla-get-area sel_poly))) (vlr-pers (vlr-object-reactor (list sel_poly) sel_text '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt)))) (vlr-pers (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) (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)) (if (setq entt (vlax-ldata-get entp "Patrick_35")) (progn (vla-put-textstring entt (strcat (rtos (/ (vla-get-area entp) 10000) 2 2) "M2")) (vlr-object-reactor (list entp) entt '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt))) (vlr-object-reactor (list entt) entp '((:vlr-erased . effacer_pt))) ) (vlax-ldata-delete entp "Patrick_35") ) (setq n (1+ n)) ) ) ) ) ) (princ)) (refaire_reacteurs)(defun surf_cadastrale (xs / h a ca)(cond((and xs (numberp xs))(setqh (fix (cvunit xs "mètre_carré" "hectare"))a (fix (cvunit xs "mètre_carré" "are"))ca (fix (cvunit xs "mètre_carré" "centare")))(strcat(if (not (zerop h)) (strcat (itoa h) "h ") "")(if (not (zerop a)) (strcat (itoa (if (not (zerop h)) (- a (* h 100)) a)) "a ") "")(if (not (zerop ca)) (strcat (itoa (if (not (zerop a)) (- ca (* a 100)) ca)) "ca") "")))))(surf_cadastrale)(princ "\nREA.LSP chargé. Tapez REA pour l'exécuter")(princ) De plus, serait il possible au lieu de cliquer sur un texte pour avoir la surface de cliquer sur la polyligne, pointez n'importe où dans celle ci et avoir la surface directment. Merci pour ton aide. John.
bonuscad Posté(e) le 11 août 2008 Posté(e) le 11 août 2008 L'adaptation du lisp REA de Patrick_35 selon tes souhaits. De plus, serait il possible au lieu de cliquer sur un texte pour avoir la surface de cliquer sur la polyligne, pointez n'importe où dans celle ci et avoir la surface directement. Lors de la première utilisation, la hauteur du texte ainsi que la rotation te sera demandé, ensuite ces paramètres seront appliqués par défaut. (la hauteur utilisée provient de la variable "TEXTSIZE" et la rotation de "USERR1") ;;; Original modifié par bonuscad le 11/08/08 pour écriture en hectare are centare ;;; Style de texte fixé et création du texte au point désigné ;;;================================================================= ;;; ;;; REA.LSP V1.01 ;;; ;;; Associer un texte à une poly fermée ;;; ;;; Copyright (C) Patrick_35 ;;; ;;;================================================================= (defun surf_cadastrale (xs / h a ca) (cond ((and xs (numberp xs)) (setq h (fix (cvunit xs "mètre_carré" "hectare")) a (fix (cvunit xs "mètre_carré" "are")) ca (fix (cvunit xs "mètre_carré" "centare")) ) (strcat (if (not (zerop h)) (strcat (itoa h) "h ") "") (if (not (zerop a)) (strcat (itoa (if (not (zerop h)) (- a (* h 100)) a)) "a ") "") (if (not (zerop ca)) (strcat (itoa (if (not (zerop a)) (- ca (* a 100)) ca)) "ca") "") ) ) ) ) (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) (rtos (vla-get-area obj))) (vla-put-textstring (vlr-data rea) (surf_cadastrale (vla-get-area obj))) (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(/ n sel_poly sel_text AcDoc Space htx rtx nw_style) (while (not sel_poly) (setq sel_poly (car (entsel "\nSélection de la polyligne : "))) (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")) (progn (setq sel_poly (vlax-ename-[b]>[/b]vla-object sel_poly)) (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 déjà associé à un texte") (setq sel_poly nil) ) ) ) ) (progn (alert "Ce n'est pas une Polyligne/Spline") (setq sel_poly nil) ) ) ) ) (if sel_poly (progn (vla-highlight sel_poly :vlax-true) (while (not sel_text) (initget 9) (setq pt (getpoint "\nPosition du texte: ")) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (cond ((null (tblsearch "LAYER" "Surfaces-Cadastrale")) (vlax-put (vla-add (vla-get-layers AcDoc) "Surfaces-Cadastrale") 'color 96) ) ) (cond ((null (tblsearch "STYLE" "Romand-Surf")) (initget 6) (setq htx (getdist pt (strcat "\nSpécifiez la hauteur du texte <" (rtos (getvar "TEXTSIZE")) "[b]>[/b]: "))) (if htx (setvar "TEXTSIZE" htx)) (if (not (setq rtx (getorient pt "\nSpécifiez l'orientation du texte <0.0[b]>[/b]: "))) (setq rtx 0.0)) (setvar "USERR1" rtx) (setq nw_style (vla-add (vla-get-textstyles AcDoc) "Romand-Surf")) (mapcar '(lambda (pr val) (vlax-put nw_style pr val) ) (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag) (list "romand.shx" 0.0 (/ (* 15.0 pi) 180) 1.0 0.0) ) ) ) (setq sel_text (vla-addMtext Space (vlax-3d-point pt) 0.0 " " ) ) (mapcar '(lambda (pr val) (vlax-put sel_text pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation) (list 5 (getvar "TEXTSIZE") 5 pt "Romand-Surf" "Surfaces-Cadastrale" (getvar "USERR1")) ) (setq sel_text (vlax-ename-[b]>[/b]vla-object (entlast))) ) (if sel_text (progn (vla-highlight sel_poly :vlax-false) (vla-put-textstring sel_text (surf_cadastrale (vla-get-area sel_poly))) (vlr-pers (vlr-object-reactor (list sel_poly) sel_text '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt)))) (vlr-pers (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) (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-[b]>[/b]vla-object entp)) (if (setq entt (vlax-ldata-get entp "Patrick_35")) (progn (vla-put-textstring entt (surf_cadastrale (/ (vla-get-area entp) 10000))) (vlr-object-reactor (list entp) entt '((:vlr-modified . modif_poly)(:vlr-erased . effacer_pt))) (vlr-object-reactor (list entt) entp '((:vlr-erased . effacer_pt))) ) (vlax-ldata-delete entp "Patrick_35") ) (setq n (1+ n)) ) ) ) ) ) (princ) ) (refaire_reacteurs) (princ "\nREA.LSP chargé. Tapez REA pour l'exécuter") (princ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
chris_mtp Posté(e) le 12 août 2008 Auteur Posté(e) le 12 août 2008 Merci BonuscadCa marche du tonerre mais si j'ai bien compris dans le lispquand tu fais une fonction defun, u=il n'est obligé d'indiquer la fonction au bas du lisp pour l'appeller ensuite.Dans l'aide, defun est décrit comme une fonction d'appel si j'ai bien compris. Serieux, c'est chaud d'apprendre le lisp. Merci en tout cas.John.
bonuscad Posté(e) le 12 août 2008 Posté(e) le 12 août 2008 Serieux, c'est chaud d'apprendre le lisp. Or mis les parenthèses appariées, qui est un peu pénible au début, le lisp (pour ma part) est un langage assez facile à apprendre. Il n'est pas aussi structuré que d'autre langage, il est assez souple dans la construction du code. Tu définis un defun (definir une fonction) généralement où tu veux dans ton code.Elle peut être au début, à la fin, imbriqué,récursive cela n'a guère d'importance...lambda est aussi une définition de fonction, à la différence que celle ci s'emploie seulement là où elle a été définie dans le code. (setq) est pareil, tu l'utilise ou tu veux, du moment que la variable soit défini au moment ou tu va l'employer. En règle générale, il faut que les fonctions ou les variables soient disponibles en mémoire pour pouvoir les utiliser, l'ordre de chargement n'a peu d'importance. Mais il peut y avoir des subtilité d'usage (employer une même variable, dès que celle ci n'est plus utile pour la réaffecter a un autre usage, cela pour réduire le nombre de variable déclarées dans la fonction). La fonction set dans le même genre par exemple est aussi assez subtile.Dans ces cas bien précis l'ordre de déclaration a bien sur son importance. A l'usage j'ai pris l'habitude de placer ma fonction principale (defun C:MaFonction (....)) en dernier, comme celle ci sera chargé en dernier en mémoire (lecture séquentielle du code), j'ai le retour en ligne de commande C:Mafonction.Ainsi je sais quelle commande est à taper au clavier pour l'exécution.Cela m'évite de mettre (princ "\nFonction Mafonction chargée, taper MaFonction pour execution") en fin de code pour informer l'utilisateur. Mais c'est comme tout, il faut pratiquer pour se sentir de plus en plus à l'aise.... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
daemge Posté(e) le 8 juillet 2009 Posté(e) le 8 juillet 2009 Bonjour à tous, je viens de decouvrir le Lisp de Bonuscad et c'est impec pour mon boulot , par contre je souhaiterai utilisé ce lisp pour l'associer a un champ , est ce possible ?? merci de vos reponses
(gile) Posté(e) le 8 juillet 2009 Posté(e) le 8 juillet 2009 Salut, Le LISP REA utilise un réacteur qui met automatiquement le texte à jour quand la polyligne est modifiée. Remplacer le texte par un champ serait superfétatoire*. *superfétatoire : mettre une ceinture avec des bretelles. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
daemge Posté(e) le 8 juillet 2009 Posté(e) le 8 juillet 2009 merci Gile , je me sens un peu bete mais bon , suis content c'est le principal bonne journée a toi
daemge Posté(e) le 8 juillet 2009 Posté(e) le 8 juillet 2009 Bon , j'ai encore une petite question , j'ai essayé mais ça marche pas ou plutot j'y arrive pas ..... voilà je voudrais par exemple avoir 2 surfaces et une 3 expressions qui soit l'addition des 2 surfaces , et bien sur le tout etant liée merci de vos eclaircissements
(gile) Posté(e) le 8 juillet 2009 Posté(e) le 8 juillet 2009 Re, Essaye avec TotalArea qui permet de lier un ou plusieurs objets à un attribut "dynamique". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
daemge Posté(e) le 8 juillet 2009 Posté(e) le 8 juillet 2009 Re, Essaye avec TotalArea qui permet de lier un ou plusieurs objets à un attribut "dynamique". merci gile, TotalArea marche super bien mais comment avoir la meme chose avec les surfaces en ha / a / ca .. ??
(gile) Posté(e) le 8 juillet 2009 Posté(e) le 8 juillet 2009 La variable AREACONV permet d'affecter un facteur de conversion à l'aire en unités de dessin.Tu peux donc afficher l'aire dans l'unité que tu veux hectares ou ares ou centiares décimaux mais pas en hectares,ares et centiares. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
daemge Posté(e) le 9 juillet 2009 Posté(e) le 9 juillet 2009 merci Gile , tant pis pour moi , j'aurai essayé .... bonne journée
(gile) Posté(e) le 9 juillet 2009 Posté(e) le 9 juillet 2009 Salut, Regarde ici :) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
daemge Posté(e) le 9 juillet 2009 Posté(e) le 9 juillet 2009 Salut, Regarde ici :) genial , un grand merci ... trop fort
daemge Posté(e) le 9 juillet 2009 Posté(e) le 9 juillet 2009 encore moi .... voilà je me sers avec plaisir du Lisp 'surf' avec la commande REA j'ai cependant un petit soucis , je me sers de ce lisp pour afficher la surface dans la legende qui se trouve en espace papier , et quand je copie la surface sur une autre presentation , la surface n'est plus lié avec le polygone comment faire ?? merci de vos réponses
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