Aller au contenu

Messages recommandés

Posté(e)

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.

 

Posté(e)

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

Posté(e)

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

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

)

)

)

)

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

 

Posté(e)

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

Posté(e)

Merci Bonuscad

Ca marche du tonerre mais si j'ai bien compris dans le lisp

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

Posté(e)

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

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

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

Posté(e)

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

Posté(e)

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

Posté(e)
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 .. ??

Posté(e)

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

Posté(e)

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

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é