Aller au contenu

Champ aire objet - retrouver l'objet ensuite


Bobby_one

Messages recommandés

Bonjour,

 

 

J'utilise souvent la commande CHAMP (_Field) dans mes plans.

 

Je sélectionne l'aire de différentes polylignes que je mets dans du texte et je fais l'addition manuellement à la fin.

J'ai donc un élément de texte de ce type :

 

XXm2 + YYm2 + ZZm2 = AAAm2

 

Ma question :

 

Est-il possible de retrouver ensuite à quelle polyligne dans le plan correspond la valeur XX ou YY?

 

Il m'arrive souvent d'avoir une dizaine de surfaces différentes à additionner.

Et pour les autres intervenants sur le plan, ça pourrait être pratique de retrouver facilement les polylignes en question.

 

 

Je ne pense pas qu'Autocad puisse faire ça mais ça m'aiderai tellement que je tente ma chance ici :)

Merci à vous

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

As tu des champs "simples et separes" representant la Surface ou Longueur de Polylignes ?

 

Si OUI, veux tu savoir a quel objet est lie un champ "simple et separe" ??

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut Bobby_one,

 

Peut-être que ce lisp te serait utile.

Il met en surbrillance la polyligne du champ sélectionné.

 

 

 

FIELDOBJECT.gif

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup pour vos réponses.

 

Le crabe> Si je comprends bien ce que tu entends par champ "simple et séparé", non ce n'est pas le cas.

J'ai un élément texte global dans lequel je mets tous les champs.

 

a09y.png

 

Et j'en viens à la solution de Steven qui est top mais qui marche seulement si chaque champ est indépendant.

Edit :

J'avais pas vu ta vidéo, elle s'était pas chargée au début.

Tout tes champs sont dans le même objet texte? Je n'arrive pas a selectionner chaque champ comme toi

(J'avais pas fait gaffe que j'ai posté dans Autocad 2020 alors que je suis sur 2019, ca vient peut etre de là?)

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

As tu des champs "simples et separes" representant la Surface ou Longueur de Polylignes ?

Si OUI, veux tu savoir a quel objet est lie un champ "simple et separe" ??

 

J'avais ecrit CELA, car j'ai la MEME routine que Steven !

Et donc je sentais bien que cela ne te conviendra pas !?

 

La version d'AutoCAD n'a RIEN a VOIR !!

Les Champs dynamiques n'ont pas evolue dans AutoCAD depuis plus de 12 ans !!

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup pour vos réponses.

 

Le crabe> Si je comprends bien ce que tu entends par champ "simple et séparé", non ce n'est pas le cas.

J'ai un élément texte global dans lequel je mets tous les champs.

 

a09y.png

 

Et j'en viens à la solution de Steven qui est top mais qui marche seulement si chaque champ est indépendant.

Edit :

J'avais pas vu ta vidéo, elle s'était pas chargée au début.

Tout tes champs sont dans le même objet texte? Je n'arrive pas a selectionner chaque champ comme toi

(J'avais pas fait gaffe que j'ai posté dans Autocad 2020 alors que je suis sur 2019, ca vient peut etre de là?)

 

Salut,

 

Sur la démo que je t'ai fait, tous les champs sont dans un seul texte multiligne.

 

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Sur la démo que je t'ai fait, tous les champs sont dans un seul texte multiligne.

C'est exactement ce que je voudrais faire!

Tu arrives même a faire l'addition en automatique? tu peux me dire comment tu fais ça?

 

De mon côté si je mets plusieurs champs dans un texte multiligne, je ne peux pas selectionner le champ qui m'interesse.

Ca selectionne tout l'element texte et ca met en surbrillance uniquement la polyligne du 1er champ.

J'ai aussi un petit bug d'affichage, la polyligne reste surbrillance même en faisant "echap"

Je dois faire un "Regen" pour l'enlever

Lien vers le commentaire
Partager sur d’autres sites

De mon côté si je mets plusieurs champs dans un texte multiligne, je ne peux pas selectionner le champ qui m'interesse.

Ca selectionne tout l'element texte et ca met en surbrillance uniquement la polyligne du 1er champ.

 

Au temps pour moi.

En effet, lorsqu'on sélectionne le texte multiligne avec FIELDOBJECT, il ne met bien que la première polyligne en surbrillance. Pour palier à ce soucis, peut-être devrais-tu faire un tableau dans lequel tu peux, insérer dans les cellules, des champs assignés aux polylignes. De cette manière, lorsque tu uTilisera FIELDOBJECT sur un champ du tableau, il mettra la polyligne correspondante en surbrillance.

 

FIELDOBJECT2.gif

 

J'ai aussi un petit bug d'affichage, la polyligne reste surbrillance même en faisant "echap"

Je dois faire un "Regen" pour l'enlever

 

C'est normal.

 

Tu arrives même a faire l'addition en automatique? tu peux me dire comment tu fais ça?

Je créé un denier champ avec une formule dans laquelle j'insère des champs assignés aux polylignes

 

CHAMP-FORMULE.png

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Au temps pour moi.

En effet, lorsqu'on sélectionne le texte multiligne avec FIELDOBJECT, il ne met bien que la première polyligne en surbrillance. Pour palier à ce soucis, peut-être devrais-tu faire un tableau dans lequel tu peux, insérer dans les cellules, des champs assignés aux polylignes. De cette manière, lorsque tu uTilisera FIELDOBJECT sur un champ du tableau, il mettra la polyligne correspondante en surbrillance.

 

https://i.postimg.cc/FsXB4HgY/FIELDOBJECT2.gif

 

Ok je comprends, il faut donc que je passe obligatoirement par l'intermédiaire d'un tableau pour retrouver chaque polyligne.

Si les champs sont dans un élément seul texte, c'est impossible.

 

 

 

Je créé un denier champ avec une formule dans laquelle j'insère des champs assignés aux polylignes

 

CHAMP-FORMULE.png

J'ai pigé le principe par contre ça me demande des cellules de tableau.

Comment tu fais pour avoir les valeurs 65.80+87.01+.. au dessus du bouton "evaluer"?

Moi je vais avoir une formule comme ça "Sum(A2:C2)"

Lien vers le commentaire
Partager sur d’autres sites

Insérer un champ > Formule > Dans le cadre de la formule > clic droit > Insérer un champ > Objet > Sélection d'une polyligne > Ok > + > clic droit > Insérer un champ > Objet > Sélection d'une polyligne> + > clic droit > Insérer un champ > Objet > Sélection d'une polyligne > Etc > Quand tu as mis le nombre de champs que tu souhaites additionner, tu clique sur Evaluer pour voir si tout fonctionne > Valider.

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

DONC une routine Lisp qui ferait automatiquement la somme des N champs dynamiques serait interessante !?

 

Voire meme la somme dans un nouveau champ dynamique, ce serait le TOP !!

 

A priori, j'ai en stock !! MERCI au Grand Maitre Gilles !!!

 

Je dois farfouiller un peu dans "mes" 3000 routines !

Et si malheureusement je n'ai pas mis un bon mot cle, je risque de ne pas la retrouver !!

 

SVP Gilles si tu nous lis !?

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

ET voici la routine magique "AddFields" de notre Grand Maitre Gilles !

 

ATTENTION: il ne faut pas TROP cumuler de champs dans la selection !

 

Mais bon jusqu'a qq centaines (suivant la vitesse du PC) , ca passe !?

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

 

;;
;; J'ai fait une routine plus aboutie qui insère un champ 
;; dont la valeur est égale à la somme des valeurs des champs sélectionnés 
;; dans des textes, mtextes ou attributs pouvant être imbriqués dans des blocs ou des tableaux.
;;
;; ADDFIELDS par GC version 1.00 pour Patrice B.
;; 
;; Insère un texte contenant un champ dynamique dont la valeur
;; est égale à la somme des valeurs des champs des textes, mtextes
;; ou attributs sélectionnés
;;
;; NOTA : aucun contrôle sur la conformité des champs sélectionnés
;;

(defun c:AddFields (/ ent res code pos ins)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (while (setq ent (car (nentsel "\nSélectionnez un champ: ")))
   (if (and
         (setq code (gc:FieldCode ent))
         (setq pos (vl-string-search "%<" code))
         (setq code (substr code (1+ pos)))
         (setq pos (vl-string-position 37 code 1 T))
         (setq code (substr code 1 (1+ pos)))
       )
     (setq res (cons code res))
     (princ "\nEntité non valide")
   )
 )
 (if (and res
          (setq ins (getpoint "\nPoint d'insertion: "))
     )
   (progn
     (setq
       res (strcat "%<\\AcExpr "
                   (lst2str res " + ")
                   " "
                   (if (setq pos (vl-string-position (ascii "\\") code 1 T))
                     (substr code (1+ pos))
                     ">%"
                   )
           )
     )
     (vla-addText
         (if (= 1 (getvar 'cvport))
           (vla-get-PaperSpace *acdoc*)
           (vla-get-ModelSpace *acdoc*)
         )
         res
         (vlax-3d-point (trans ins 1 0))
         (getvar 'textsize)
       )  
   )
 )
 (princ)
)

;;========================= ROUTINES =========================;;

;; gc:FieldCode par GC
;; Retourne la chaîne de caractère d'un attribut, texte ou mtexte
;; avec le(s) code(s) de champ(s)
;;
;; Argument : nom d'entité de l'objet (ENAME)

(defun gc:FieldCode (ent / foo elst xdict dict field str)

 ;;--------------------------------------------------------;;
 (defun foo (field str / pos fldID objID)
   (setq pos 0)
   (if (setq pos (vl-string-search "\\_FldIdx " str pos))
     (while (setq pos (vl-string-search "\\_FldIdx " str pos))
       (setq fldId (entget (cdr (assoc 360 field)))
             field (vl-remove (assoc 360 field) field)
             str   (strcat
                     (substr str 1 pos)
                     (if (setq objID (cdr (assoc 331 fldId)))
                       (vl-string-subst
                         (strcat "ObjId " (itoa (gc:EnameToObjectId objID)))
                         "ObjIdx"
                         (cdr (assoc 2 fldId))
                       )
                       (foo fldId (cdr (assoc 2 fldId)))
                     )
                     (substr str (1+ (vl-string-search ">%" str pos)))
                   )
       )
     )
     str
   )
 )
 ;;--------------------------------------------------------;;
 
 (setq elst (entget ent))
 (if (and
(member (cdr (assoc 0 elst)) '("ATTRIB" "MTEXT" "TEXT"))
(setq xdict (cdr (assoc 360 elst)))
(setq dict (dictsearch xdict "ACAD_FIELD"))
(setq field (dictsearch (cdr (assoc -1 dict)) "TEXT"))
     )
   (setq str (foo field (cdr (assoc 2 field))))
 )
)

;;============================================================;;

;; gc:EnameToObjectId par GC
;; Retourne l'ObjectID correspondant à un ename
;;
;; Argument : un ename

(defun gc:EnameToObjectId (ename)
 ((lambda (str)
    (hex2dec
      (substr (vl-string-right-trim ">" str) (+ 3 (vl-string-search ":" str)))
    )
  )
   (vl-princ-to-string ename)
 )
)

;;============================================================;;

;; hex2dec par GC
;; conversion hexadécimal -> décimal
;;
;; Argument : un hexadédimal (chaîne)

(defun hex2dec (s / r l n)
 (setq	r 0 l (vl-string->list (strcase s)))
 (while (setq n (car l))
   (setq l (cdr l)
         r (+ (* r 16) (- n (if (<= n 57) 48 55)))
   )
 )
)

;;============================================================;;

;; lst2str par GC
;; Concatène une liste et un séparateur en une chaine
;;
;; Arguments
;; lst : la liste à transformer en chaine
;; sep : le séparateur

(defun lst2str (lst sep)
 (if (cdr lst)
   (strcat (vl-princ-to-string (car lst))
    sep
    (lst2str (cdr lst) sep)
   )
   (vl-princ-to-string (car lst))
 )
) 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut lecrabe,

Je l'ai retrouvé aussi mais il a l'air de ne plus fonctionner. Lorsque sélectionne des champs, que je valide et que je dois insérer le champ avec le total, je n'ai que des #### sad.gif

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Comme ça, ça semble marcher.

 

;;
;; J'ai fait une routine plus aboutie qui insère un champ 
;; dont la valeur est égale à la somme des valeurs des champs sélectionnés 
;; dans des textes, mtextes ou attributs pouvant être imbriqués dans des blocs ou des tableaux.
;;
;; ADDFIELDS par GC version 1.00 pour Patrice B.
;; 
;; Insère un texte contenant un champ dynamique dont la valeur
;; est égale à la somme des valeurs des champs des textes, mtextes
;; ou attributs sélectionnés
;;
;; NOTA : aucun contrôle sur la conformité des champs sélectionnés
;;

(vl-load-com)
(or *acad* (setq *acad* (vlax-get-acad-object)))
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

(defun c:AddFields (/ ent res code pos ins)
 (while (setq ent (car (nentsel "\nSélectionnez un champ: ")))
   (if	(and
  (setq code (gc:FieldCode ent))
  (setq pos (vl-string-search "%<" code))
  (setq code (substr code (1+ pos)))
  (setq pos (vl-string-position 37 code 1 T))
  (setq code (substr code 1 (1+ pos)))
)
     (setq res (cons code res))
     (princ "\nEntité non valide")
   )
 )
 (if (and res
   (setq ins (getpoint "\nPoint d'insertion: "))
     )
   (progn
     (setq
res (strcat "%<\\AcExpr "
	    (lst2str res " + ")
	    " "
	    (if	(setq pos (vl-string-position (ascii "\\") code 1 T))
	      (substr code (1+ pos))
	      ">%"
	    )
    )
     )
     (vla-addText
(if (= 1 (getvar 'cvport))
  (vla-get-PaperSpace *acdoc*)
  (vla-get-ModelSpace *acdoc*)
)
res
(vlax-3d-point (trans ins 1 0))
(getvar 'textsize)
     )
   )
 )
 (princ)
)

;;========================= ROUTINES =========================;;

;; gc:FieldCode par GC
;; Retourne la chaîne de caractère d'un attribut, texte ou mtexte
;; avec le(s) code(s) de champ(s)
;;
;; Argument : nom d'entité de l'objet (ENAME)

(defun gc:FieldCode (ent / foo elst xdict dict field str)

 (setq util (vla-get-Utility *acdoc*))
 ;;--------------------------------------------------------;;
 (defun foo (field str / pos fldID objID)
   (setq pos 0)
   (if	(setq pos (vl-string-search "\\_FldIdx " str pos))
     (while (setq pos (vl-string-search "\\_FldIdx " str pos))
(setq fldId (entget (cdr (assoc 360 field)))
      field (vl-remove (assoc 360 field) field)
      str   (strcat
	      (substr str 1 pos)
	      (if (setq objID (cdr (assoc 331 fldId)))
		(vl-string-subst
		  (strcat "ObjId "
			  (vla-GetObjectIdString util (vlax-ename->vla-object objID) :vlax-false)
		  )
		  "ObjIdx"
		  (cdr (assoc 2 fldId))
		)
		(foo fldId (cdr (assoc 2 fldId)))
	      )
	      (substr str (1+ (vl-string-search ">%" str pos)))
	    )
)
     )
     str
   )
 )
 ;;--------------------------------------------------------;;

 (setq elst (entget ent))
 (if (and
(member (cdr (assoc 0 elst)) '("ATTRIB" "MTEXT" "TEXT"))
(setq xdict (cdr (assoc 360 elst)))
(setq dict (dictsearch xdict "ACAD_FIELD"))
(setq field (dictsearch (cdr (assoc -1 dict)) "TEXT"))
     )
   (setq str (foo field (cdr (assoc 2 field))))
 )
)

;;============================================================;;

;; lst2str par GC
;; Concatène une liste et un séparateur en une chaine
;;
;; Arguments
;; lst : la liste à transformer en chaine
;; sep : le séparateur

(defun lst2str (lst sep)
 (if (cdr lst)
   (strcat (vl-princ-to-string (car lst))
    sep
    (lst2str (cdr lst) sep)
   )
   (vl-princ-to-string (car lst))
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Hello Gilles

 

1) MERCI - MAGNIFIQUE !

 

2) Eventuellement SVP serait il possible d'avoir une Selection classique !?

 

Car aller faire un clic sur des dizaines de champs dynamiques, c un peu penible !?

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Encore, une fois Gile, TOP !

 

 

content-29.gif

 

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

  • 3 ans après...
Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é