Aller au contenu

Annoter une polyligne ou multiligne


Messages recommandés

Posté(e)

Bonjour,

je chercher une lisp qui me permet d annoter l épaisseur d une polygyne ou multiligne sur un plan, et que le texte ou bloc change si l'épaisseur change des lignes.

Merci

Posté(e)

Hello @Max73

 

1) C facile pour la Largeur globale d'une Polyligne 2D en utilisant un champ dynamique qui "reflete" la propriete : Largeur globale !

Et si tu parles de la notion d'Epaisseur de ligne forcee alors IDEM !

 

2) Et pour les Multi-Lignes, a ma connaissance il n'y a pas de notion de Largeur globale !

Par contre, tu peux avoir une "Epaisseur de ligne" forcee sur toutes les Lignes de la multi-ligne

et donc dans CE cas, un Champ dynamique peut refleter l'Epaisseur de ligne "forcee" de la Multi-ligne ...

 

Bye, lecrabe

 

Autodesk Expert Elite Team

  • 2 semaines après...
Posté(e)

bonjour,

et comment je peut pour une Polyligne que le texte soit liée à la polyligne pour que lorsque je change l épaisseur de la Polyligne le texte crée pas la lisp change avec ?

Posté(e)

mettre un identifiant unique dans le texte qui le "lie" à la polyligne.

Par exemple, je donne un numéro à une polyligne

Ce numéro est dans l’annotation au moment de l’annoter et donc quand je modifies ma polyligne (ou mes polylignes) :

Je clique sur un bouton de mise à jour et le programme boucle sur mes polylignes pour mettre à jour les annotations correspondantes

Posté(e)

@Max73,

La proposition d'utiliser un champ dynamique n'utilise pas de LISP ! De plus, il s'agit de la propriété objet "Largeur globale", autrement-dit, ton texte est directement lié à l'ID de ta polyligne !! Donc si tu modifies la largeur globale de ta polyligne, le texte se mettra à jour automatiquement après un REGEN ou REGENTOUT. En revanche si tu as 2000 polylignes dans ce cas là, je peux comprendre qu'il faut passer par un peu de programmation pour créer les textes avec champ dynamiques pour chaque polylignes... Mais dans ce cas il faut faire la demande explicitement avec un .dwg d'exemple.

Je te joins un exemple de texte avec utilisation d'un champ dynamique lié à la polyligne. Si tu changes une valeur puis que tu fais REGEN, le texte associé à la polyligne modifiée sera mis à jour.

Bisous,
Luna

Exemple Champs Dynamiques.dwg

Posté(e)

Bonjour,

oui il me faut la largeur globale pour une polyligne et l échelle global si c'est une multiligne.

Par contre le résultat que je souhaiterai et je ne sais pas ci c'est possible c'est que en fonction du largeur cela me donne une texte. exemple tableau dans fichier joint.

Merci.

annotation polyligne et multiligne.dwg

Posté(e)

Je ne comprends pas très bien ce qui doit être renseigné avec ton .dwg d'exemple...
Faut-il remplir le tableau d'annotation (faisant du coup la moyenne de l'ensemble des polylignes/multilignes pour chaque ligne d'annotation pour connaître l'épaisseur de tracé) ? Faut-il, à partir du tableau définir les propriétés de toutes les polylignes/multilignes pour faire correspondre la largeur globale/échelle globale en fonction du calque ? Faut-il créer une ligne de repère pour chaque polyligne/multiligne indiquant la valeur de largeur globale/échelle globale et ainsi vérifier si cela correspond bien au tableau ci-contre ?

S'il s'agit du tableau à remplir, alors il n'y a aucun lien direct entre le texte et un objet, car dans ton exemple, tu as 1 polyligne et 1 multiligne qui appartiennent au calque "Dn125" donc si la polyligne à une largeur globale de 139.7 mais que tu as oublié de définir l'échelle globale de la multiligne (qui imaginons est à 0.0), que faudrait-il rentrer dans le tableau du coup ? 139.7 ? 0.0 ? 139.7, 0.0 ? 69.85 ?

Bisous,
Luna

Posté(e)

non c'est beaucoup plus simple, en faite il faut que la valeur Dn125 (par exemple) apparaisse sur le polyligne ou la multigne  lorsque je vient clique dessus.

il faudrait que le texte soit dans un calque texte aussi.

Et le tableau et la pour indication ce sont les valeurs d épaisseur qui correspond (par exemple 139.7 il faut indiqué DN125 sur la polyligne ou multiligne).

la position du texte faudrait quelle soit défini a l endroit ou je sélection la polyligne ou la multiligne. Et il faudrait que le texte soit lier a la polyligne ou multiligne pour que ci il y a changement de largeur ou échelle on puisse mettre a jour après une regen.

Désolé pour mon manque de précision. 

Merci.

Posté(e)

Oki, bon je pense avoir compris le besoin. Etant donné qu'il n'y a pas de calcul ou logique mathématique derrière le tableau d'équivalence, l'utilisation des champs dynamiques ne me semble malheureusement pas faisable...
En passant par de la programmation c'est possible de créer les textes mais ils ne pourront pas être liés à ta polyligne... Je peux essayer de voir pour développer 2 programmes : le premier pour créer les textes et le second pour les mettre à jour de temps à autre.

Pour cela je vais avoir besoin de quelques infos :
  1°) Les textes souhaités correspondent parfaitement aux textes que tu as mis dans ton .dwg d'exemple d'un point de vue propriétés (style de texte, annotativité, calque, hauteur de texte, masque d'arrière-plan, ...), ou bien cela peut varier ?
  2°) Pour créer les textes, désires-tu sélectionner les polylignes une par une afin de spécifier un emplacement de texte précis ou bien tu préfères que le programme prenne le milieu des polylignes mais que cela puisse traiter plusieurs polyligne à la fois ?
  3°) Pour la mise à jour des textes, les polylignes peuvent-elles être déplacées, copiées, modifiées graphiquement, etc... ? En clair, faut-il uniquement prévoir de modifier la valeur du texte si la largeur est différente ou bien il faut aussi prévoir le fait que le texte doit être déplacé graphiquement si la polyligne a bougé ?
  4°) Je vais dans un premier temps m'occuper que des polylignes, vérifier que le programme réponde à ton besoin puis je verrais comment intégrer les multilignes ensuite (car le procédé auquel je pense est différent entre ces deux types d'objets), oki ?

Si j'ai d'autres questions en cours de route, je reviendrais vers toi. A savoir tout de même que je n'ai pas beaucoup de temps en ce moment et que ce n'est pas un programme rapide puisqu'il faut prévoir la liaison entre objets, donc je ne pourrais pas forcément pondre quelque chose de concluant rapidement ^^"

Bisous,
Luna

Posté(e)

bonjour Luna,

je te remercie et pas de soucis se n'est pas forcement percé j ai pris l habitude de le faire manuellement donc c'est juste pour améliore. et je comprend toute a fait que c'est pas simple, j aurais bien aime le faire moi même mais j ai vraiment du mal a comprend le langage lisp. j essais de me former mais j ai plein idée malheureusement, mais j ai pas les compétence pour les réalisé.

pour répondre a tes questions pas de soucis ci tu a besoin de plus de précision.

Q1: oui les propriété des textes correspond bien a mon plan exemple il faut juste que le texte reste annotatif pour qu il puisse être sur différente fenêtre et échelle.

Q2: je préféré les sélectionnés moi 1 pas 1, par contre ca serai intéressent de positionne le texte a l endroit ou je clique avec la sourie.

Q3: non il faut juste modifie la valeur du texte 

Q4: ok pas de soucis et je te remercie pour le temps que tu passe.

question perso a tu un livre ou méthode afin que je puisse utilisé afin de m amélioré dans la programmation de lisp .

Apres il y a le lisp de gille qui permet d avoir la longueur et qui et lier a la polyligne je voulais essaye de repartir de celle la mais je suis perdu. je sais pas si ca peut t aider.

Merci.

Bisous.

TotalPerim.zip

Posté(e)

On pourrait voir les choses avec les XData et/ou ldata.

Voici un exemple de code de départ de ce que l'on pourrait faire...

Essaye d'abords le lisp dans un nouveau dessin avec des unités identique de ton travail habituel pour te rendre compte.

Répond aux questions qui te seront posées et vois le résultat.

 

TUY_DN.lsp

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonuscad l idée de ton lisp et pas mal, mais il faudrait que je puisse mette plusieurs texte et pouvoir le positionné moi et pas qu' il ce mette automatiquement. 

Et ensuite qu' il ce remette a jour après modification de l épaisseur. 

Puis la fenêtre a la fin ne mais pas utile.

 

Posté(e) (modifié)

@Max73

Alors si tu trouve l'idée intéressante, voici le code un peu plus poussé.

Le texte / les textes seront positionnés à ta guise en suivant l'orientation des segments de la polyligne par un simple click-gauche et click-droit pour terminer.

Si tu sélectionne une polyligne déjà définie en tant que tuyau, tu pourra lui affecter un autre "Dn" et le/les textes existants seront alors mis à jour.

L'avantage de l'utilisation des Xdata et que tu peux faire des sélections ciblées sur le "Dn" (ou autre valeur d'une Xdata en adaptant le code) sur l'ensemble du dessin.

Voici un exemple de code pour faire apparaître les poignée sur tous les tuyaux correspondants.

Exemple d'usage du code à taper en ligne de commande (sel_dn "Dn350")

(defun sel_dn (typ_tuy / js_pl js nb_pl ent_pl)
	(setq js_pl (ssget "_X" '((0 . "LWPOLYLINE") (67 . 0) (-3 ("RESEAU_TUYAUX")))))
	(cond
		(js_pl
			(setq js (ssadd))
			(repeat (setq nb_pl (sslength js_pl))
				(setq ent_pl (ssname js_pl (setq nb_pl (1- nb_pl))))
				(if (eq (cdr (assoc 1000 (cdadr (assoc -3 (entget ent_pl (list "RESEAU_TUYAUX")))))) typ_tuy)
					(setq js (ssadd ent_pl js))
				)
			)
			(sssetfirst nil js)
		)
	)
)

 

Je met en pièce jointe le code revisité.

NOTE IMPORTANTE: Lors de l'utilisation de la commande TUY_DN veiller à que style courant de texte ne soit pas annotatif car dans ce cas mon programme plante, je ne sais pas gérer ce problème (si d'autre membre peuvent apporter la solution?...)

 

TUY_DN.lsp

Modifié par bonuscad
Remplacement du lisp en pièce jointe

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

bonuscad

ton dernier lisp et quasi parfait, le seul truc c'est que les textes doivent avoir une hauteur de 2.2 mm a l'échelle 1:1 et pas la hauteur de la polyligne, c'est peut être pour ca que l annotatif fonctionne pas. Sinon pour tous le reste c'est nickel franchement merci. le texte qui suit la polyligne super aussi 👍.

Il faudrait que les textes ce trouve sur le calque "texte" et non "dn??txt" comme ca cela me permet de gelé tout les textes si besoin.

Et le masque derrière le teste a 1.2 au lieu de 1.5.

 

Posté(e)

@Max73

J'ai modifié le lisp TUY_DN joint dans le mon message précédent.

Il devrait répondre à tes souhaits évoqués: J'ai eu un peu de mal avec les MTEXT annotatifs; c'est la 1ère fois que j’essaye de les manipuler en lisp, donc ... dis moi si ça te semble correct!

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

@bonuscad

merci déjà pour la modification.

bon j'ai regardez pour l'annotatif, c'est plus ou moins bon on va dire, je m'explique en fait je suis bon quand je trace la polyligne ou modif avec une échelle d annotation 1:50 par contre ci j ai mon échelle d annotation ai 1:100 par exemple la je suis plus bon sur ma hauteur de texte.

en faite il faut que ca soie la hauteur texte 3d que change et non la hauteur texte papier qui doit reste tjs a 2.2. Mais bon après je peut les sélections pour les modifié.

 

Posté(e)

Pour construire le code je me suis basé sur ton fichier exemple; qui ne possède que l'échelle d'annotation 1:50.

Maintenant que ces textes annotatifs sont sur le même calque: "_Texte" , il est très facile de les sélectionner et de leur rajouter toutes les échelles d'annotation que tu veux.

Par contre d'avoir travailler sur ce code m'a révélé, un mauvais usage de cette solution que j'avais proposé.

En effet si l'on utilise cette fonction qui supprime toutes les échelles et re-crée la liste, même si l'échelle utilisé dans l'annotation a bien été re-créer à l'identique, cela fait planter le code:

Citation

; erreur: Erreur Automation Echec de l'appel SetObjectId d'une méthode sur une interface IAcadBaseObject

En fait l'ID de l'échelle d'annotation a changé dans le dictionnaire et Autocad n'arrive plus à faire le lien avec l'ancienne ID.

Sacré poëme! 😵

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

@bonuscad

oui c'est bien l idée vu qu il sont tous sur le mem calque. 

J'ai changé quand même l échelle car je suis plus souvent en 1:100.

et merci encore pour ce code très pratique , en tout cas pour mon métier.

  • 3 semaines après...
Posté(e)

@Max73

Bonjour, je pense que c'est possible mais je suppose que tu veux que le bloc soit annotatif comme pour le texte précédemment?

Si c'est le cas je pense que ce sera un peut difficile pour moi de gérer ce bloc (de la création aux insertions multiple), déjà qu'avec le texte cela n'avait pas été simple...

Mais j'essaierais de regarder si j'y arrive à un moment d'inspiration. Mais si d'autre s'en sentent capable ... je laisse la main volontiers !

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

@bonuscad

Bonjour, merci pour ta réponse et je suis désole j ai pas eu le temps de donne plus d explication ce qui t airai évite de travail.

enfaite ce que je voulais c'était pas forcement de changer le lisp existant TUY_DN qui fonction très bien et qui me va très bien, ce que je voudrais c était savoir ci je pouvais insert un bloc existant sur la poly ligne et qui la suit comme dans ton lisp TUY_DN. j ai deux bloc diffèrent a pose la polyligne. mais ca c'est pas un soucis je pourrais change le nom du bloc dans la lisp. ou même peu être la choisir au début de la lisp avec plusieurs choix.

Voila Désolé de t avoir fait travail dans la mauvaise direction mais ce week end j ai pas put regarde les messages. Désole.

Posté(e)

Alors voici un petit bout de code écrit pour une autre demande:

Il demande de sélectionner un objet filaire, puis un bloc unique qu'il va aligner dynamiquement.

On peut facilement rajouter l'introduction du nom du bloc au lieu d'en sélectionner un.

A essayer tel quel

(defun c:anim_obj ( / js ent vla_obj js_obj tmp nw_pt param deriv alpha )
  (vl-load-com)
  (princ "\nSélectionner un objet curviligne sur lequel vous voulez effectuer une animation.")
  (while
    (not
      (setq js
        (ssget "_+.:E:S"
          (list
            (cons -4 "<OR")
              (cons -4 "<AND")
                (cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE")
                (cons -4 "<NOT")
                  (cons -4 "&") (cons 70 112)
                (cons -4 "NOT>")
              (cons -4 "AND>")
              (cons 0 "SPLINE")
            (cons -4 "OR>")
          )
        )
      )
    )
  )
  (setq
    ent (ssname js 0)
    vla_obj (vlax-ename->vla-object ent)
  )
  (redraw ent 3)
  (princ "\nSélectionner l'objet à animer.")
  (while (not (setq js_obj (ssget "_+.:E:S" '((0 . "INSERT"))))))
  (redraw ent 4)
  (princ "\nGuider votre objet")
  (while (= 5 (car (setq tmp (grread t 5 1))))
    (cond
      ((= 5 (car tmp))
        (setq
          nw_pt (vlax-curve-getClosestPointTo vla_obj (trans (cadr tmp) 1 0))
          param (vlax-curve-getparamatpoint vla_obj nw_pt)
          deriv (vlax-curve-getfirstderiv vla_obj param)
          alpha (atan (cadr deriv) (car deriv))
        )
        (vlax-put (vlax-ename->vla-object (ssname js_obj 0)) 'InsertionPoint nw_pt)
        (vlax-put (vlax-ename->vla-object (ssname js_obj 0)) 'Rotation alpha)
      )
      (T (princ "\nArrêt anormal de la commande "))
    )
  )
  (prin1)
)

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é