Aller au contenu

Calcul de surfaces


CADastrophe

Messages recommandés

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:

 

 

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 51
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

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)

 

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour

J'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.

Lien vers le commentaire
Partager sur d’autres sites

Salut

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

 

@+

 

ps : On ne donne pas ses sources à ses petits camarades ;)

 

pps : As tu regardé ce lisp

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

Lien vers le commentaire
Partager sur d’autres sites

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 important

J 'ai donc créée une polilygne et un bloc avecles deux attributs, local et surface.

Mais lorsque je charge le rea.lsp

j'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 mal

Merci de votre aide

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Salut Esbe

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

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

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

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Genial !!!!

Ca deconne sur la 2004 mais sur la 2005 c 'est nickel

Oui je n 'avais pas capté pour rea-att c'est ok

 

Merci à vous

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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 programme

Pourtant je selectionne l' attribut (rea), "identique", je clic sur le 2éme bloc " je valide ! c 'est magique

 

@+

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

 

@+

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 10 mois aprè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 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é