Aller au contenu

Cotation de Polyligne


willy95

Messages recommandés

Comment faire en lisp pour ecrire un simple texte justifier au milieu centre en arial qui recupere toutes les distance d'une polyligne automatiquement et qui les ecrits directement au centre de la ligne et cela pour chaque segment de polyligne ?

 

 

12.23

--------------------------------------------

 

Quelqu'un peut il m'aider ?

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Un début de piste => "CurveLength_Field " de bonuscad

 

(vl-load-com)
(defun c:CurveLength_Field ( / js obj AcDoc Space nw_style pt htx rtx unit_key unit_draw dxf_cod n ename m-param deriv nw_obj lremov)
(princ "\nSélectionnez un objet curviligne.")
(while
	(null
		(setq js
			(ssget "_+.:E:S"
				(list
					'(0 . "*POLYLINE,LINE,ARC,CIRCLE")
					(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
					(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
					'(-4 . "							'(-4 . "&")
						'(70 . 112)
					'(-4 . "NOT>")
				)
			)
		)
	)
	(princ "\nCe n'est pas un objet curviligne valable pour cette fonction!")
)
(initget 6)
(setq htx (getdist (getvar "VIEWCTR") (strcat "\nSpécifiez la hauteur du champ : ")))
(if htx (setvar "TEXTSIZE" htx))
(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" "Id-Longueurs"))
		(vlax-put (vla-add (vla-get-layers AcDoc) "Id-Longueurs") 'color 96)
	)
)
(cond
	((null (tblsearch "STYLE" " [surligneur] Romand-Field[/surligneur]"))
		(setq nw_style (vla-add (vla-get-textstyles AcDoc) " [surligneur] Romand-Field[/surligneur]"))
		(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)
		)
	)
)
(if (or (eq (getvar "USERS5") "") (not (eq (substr (getvar "USERS5") 1 2) "qz")))
	(progn
		(initget "KM ME CM MM")
		(if (not (setq unit_key (getkword "\nDessin réalisé en [KM/ME/CM/MM] : ")))
			(setq unit_key "ME")
		)
		(cond
			((eq unit_key "KM")
				(setq unit_draw 1000000)
			)
			((eq unit_key "ME")
				(setq unit_draw 1000 unit_key "M")
			)
			((eq unit_key "CM")
				(setq unit_draw 10)
			)
			((eq unit_key "MM")
				(setq unit_draw 1)
			)
		)
		(setvar "USERS5" (strcat "qz" (itoa unit_draw)))
	)
	(progn
		(setq unit_draw (atoi (substr (getvar "USERS5") 3)))
		(cond
			((eq unit_draw 1000000)
				(setq unit_key "KM")
			)
			((eq unit_draw 1000)
				(setq unit_key "M")
			)
			((eq unit_draw 10)
				(setq unit_key "CM")
			)
			((eq unit_draw 1)
				(setq unit_key "MM")
			)
		)
	)
)
(initget "Unique Multiple _Single Multiple")
(if (eq (getkword "\nSélection filtrée [unique/Multiple]: ") "Single")
   (setq n -1)
   (setq
     dxf_cod (entget (ssname js 0))
     js
     (ssget "_X" 
       (foreach m (foreach n dxf_cod (if (not (member (car n) '(0 67 410 8 6 62 48 420 70))) (setq lremov (cons (car n) lremov))))
         (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
       )
     )
     n -1
   )
 )
(repeat (sslength js)
   (setq
     obj (ssname js (setq n (1+ n)))
     ename (vlax-ename->vla-object obj)
     pt
     (vlax-curve-getPointAtDist
       ename 
       (* (vlax-get ename
         (cond
           ((eq (vla-get-ObjectName ename) "AcDbArc") 'ArcLength)
           ((eq (vla-get-ObjectName ename) "AcDbCircle") 'Circumference)
           (T 'Length)
         )
       ) 0.5)
     )
     deriv (vlax-curve-getFirstDeriv ename (vlax-curve-getParamAtPoint ename pt))
     rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
   )
   (if (or (> rtx (* pi 0.5)) (	(setq nw_obj
	(vla-addMtext Space
		(vlax-3d-point (setq pt (polar pt (+ rtx (* pi 0.5)) (getvar "TEXTSIZE"))))
		0.0
		(strcat
			"%				(itoa (vla-get-ObjectID (vlax-ename->vla-object obj)))
			">%)."
			(cond
				((eq (vla-get-ObjectName (vlax-ename->vla-object obj)) "AcDbArc")
					"ArcLength"
				)
				((eq (vla-get-ObjectName (vlax-ename->vla-object obj)) "AcDbCircle")
					"Circumference"
				)
				(T
					"Length"
				)
			)
			" \\f \"%lu2%pr2%ps[L=,"
			(strcase unit_key T)
			"]\">%"
		)
	)
)
(mapcar
	'(lambda (pr val)
		(vlax-put nw_obj pr val)
	)
	(list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation)
	(list 5 (getvar "TEXTSIZE") 5 pt " [surligneur] Romand-Field[/surligneur]" "Id-Longueurs" rtx)
)
)
(prin1)
) 

 

Tu peux modifier le texte "" [surligneur] Romand-Field"[/surligneur] par [surligneur] Arial [/surligneur]si tu le souhaites,...

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

C la routine SEGLEN qu'il te faut : :)

 

http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=16871#pid67906

 

A priori elle correspondond parfaitement a ta demande :D

Je l'utilise de temps en temps ... Encore Merci à Gilles :cool:

 

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Merci pour toute cette réactivité...

 

La routine de Gile "Seglen" me donne la bonne piste, mais je n'arrive pas a comprendre ou il insere le texte pour que je puisse orienter chaque texte dans la direction des lignes.

 

De plus j'ai beaucoup de mal à inserer des fleches sur chaque sommet automatiquement , sans selectionner chaqu'un d'entre eux un par un.

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai modifié SegLen, les textes seront créés dans le style de texte courant.

 

(defun c:seglen	(/ ss ht n ent len pa txt)
 (vl-load-com)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (if (and
(setq ss (ssget	'((-4 . "[b]			  (0 . "LINE")
		  (-4 . "[b]			  (0 . "*POLYLINE")
		  (-4 . "[b]			  (-4 . "&")
		  (70 . 112)
		  (-4 . "NOT>")
		  (-4 . "AND>")
		  (-4 . "OR>")
		 )
	 )
)
(	   (setq ht (getdist "\nSpécifiez la hauteur de texte: "))
)
     )
   (progn
     (vla-StartUndoMark acdoc)
     (repeat (setq n (sslength ss))
(setq ent (ssname ss (setq n (1- n))))
(if (= "LINE" (cdr (assoc 0 (entget ent))))
  (progn
    (setq len (vlax-curve-getDistAtParam
		ent
		(vlax-curve-getEndParam ent)
	      )
    )
    (vla-addText
      (vla-get-ModelSpace acdoc)
      (rtos len)
      (vlax-3d-point
	(vlax-curve-getPointAtDist ent (/ len 2.0))
      )
      ht
    )
  )
  (repeat (setq pa (fix (vlax-curve-getEndParam ent)))
    (setq
      len (- (vlax-curve-getDistAtParam ent pa)
	     (vlax-curve-getDistAtParam ent (setq pa (1- pa)))
	  )
    )
    (setq txt
	   (vla-addText
	     (vla-get-ModelSpace acdoc)
	     (rtos len)
	     (vlax-3d-point '(0 0 0))
	     ht
	   )
    )
    (vla-put-Alignment txt acAlignmentMiddleCenter)
    (vla-put-TextAlignmentPoint
      txt
      (vlax-3d-point
	(vlax-curve-getPointAtparam ent (+ pa 0.5))
      )
    )
    (vla-put-Rotation
      txt
      (angle (vlax-curve-getPointAtParam ent pa)
	     (vlax-curve-getPointAtParam ent (1+ pa))
      )
    )
  )
)
     )
     (vla-EndUndoMark acdoc)
   )
 )
 (princ)
) 

 

PS : lili2006, met plutôt des liens, en copiant le code, le formatage a altéré le filtre de sélection.

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles / lili2006

 

Je viens de tester la nouvelle version de SEGLEN sur MAP 2004 & sur MAP 2009

 

c OK comme d'hab, merci Gilles ! :)

 

SVP je suggère une petite amélioration :

Décalage éventuel (Defaut 0.00) = xx.xx

Ainsi le texte sera éventuellement au dessus du segment de la polyligne ...

 

Pour les polylignes qui tournent dans le mauvais sens,

j'utilise ton R_PLINE depuis longtemps ! :P

 

http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=10953#pid

 

Bientot la routine R_PLINE ne sera plus du tout utile ... ;)

 

Le Decapode (grippé)

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Encore une fois MERCI Gile pour ton aide

 

J'ai beaucoup de difficultées a tout conprendre avec les "vla" , je me bat pour conprendre...

 

Doucement mais surement....

 

 

Je me bat aussi pour inserer la surface et le périmètre total de la polyligne selectionnée dans un fichier txt, dans le pline2txt que Gile à ecrit.

Lien vers le commentaire
Partager sur d’autres sites

C'est à dire ?

 

lili2006 les signes "> " sont mal interprétés et font disparaitre du code.

 

Je n'avais pas proposé cette solution car dans la demande il était dit de vouloir coter les SEGMENTS.

Ce que ne fait pas "CurveLength_Field.lsp"

 

Les champs de s'appliquent pas entre les sommets mais sur la totalité de la polyligne.

 

Voir le code original ici en bas de page.

 

J'ai essayé de réfléchir à une solution pour modifier ce code, ce serait de dupliquer en entité simple (Arc, ligne) et de mettre l'attribut invisible et de leur appliquer les champs dynamique.

L'inconvénient du code d'invisibilté, c'est que celle ci ne réagiraient plus aux champ dynamique car la sélection lors de modification ne pourrait s'appliquer de façon classique.

 

Donc bof!...

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

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Ok, merci bonuscad !

 

Si j'ai besoin de coter des segments, j'explose la polyligne mais c'est vrai que ce n'est pas tip-top, mais mieux que rien !

 

Quand j'ai besoin de garder les polylignes, je les copies sur un calque,...

 

Double travail, certes mais résultat tout de même ok !

 

Bon dimanche @ tous,

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Voilà une nouvelle version plus élaborée.

L'utilisateur choisi le style de texte, la justification, la hauteur et l'orientation dans une petite boite de dialogue.

 

Version (un peu) commentée

 

;;; SEGLEN (gile)
;;; Crée un texte sur chaque segment de ligne ou polyligne sélectionné
;;; dont la valeur est la longueur du segment.

(defun c:seglen	(/ acdoc temp	file dcl_id slst st jlst ju ht ro fs stat ss n obj len
	 pa txt fs ent pt)
 (vl-load-com)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))

 ;; sous routine de formatage du texte : justification et rotation
 (defun format	(txt / ang)
   (vla-put-Alignment
     txt
     (cond
((= ju "Gauche") acAlignmentLeft)
((= ju "Centre") acAlignmentCenter)
((= ju "Droite") acAlignmentRight)
((= ju "Milieu") acAlignmentMiddle)
((= ju "Haut Gauche") acAlignmentTopLeft)
((= ju "Haut Centre") acAlignmentTopCenter)
((= ju "Haut Droite") acAlignmentTopRight)
((= ju "Milieu Gauche") acAlignmentMiddleLeft)
((= ju "Milieu Centre") acAlignmentMiddleCenter)
((= ju "Milieu Droite") acAlignmentMiddleRight)
((= ju "Bas Gauche") acAlignmentBottomLeft)
((= ju "Bas Centre") acAlignmentBottomCenter)
((= ju "Bas Droite") acAlignmentBottomRight)
     )
   )
   (or	(= ju "Gauche")
(vla-put-TextAlignmentPoint txt (vlax-3d-point pt))
   )
   (and
     (= ro "al")
     (setq ang	(angle '(0. 0. 0.)
	       (vlax-curve-getfirstDeriv
		 obj
		 (vlax-curve-getParamAtPoint obj pt)
	       )
	)
     )
     (if (and (= fs "1") (minusp (cos ang)))
(vla-put-Rotation txt (+ pi ang))
(vla-put-Rotation txt ang)
     )
   )
 )

 ;; création de la boite de dialogue (écriture dans un fichier temporaire)
 (setq	temp (vl-filename-mktemp "Tmp.dcl")
file (open temp "w")
 )
 (write-line
   (strcat
     "IncTxt:dialog{"
     "label=\"Longueurs de segments\";"
     ":boxed_column{"
     "label=\"Mise en forme\";"
     ":popup_list{"
     "label=\"Style\";key=\"st\";edit_width=16;}"
     ":popup_list{"
     "label=\"Justification\";key=\"ju\";edit_width=16;}"
     ":edit_box{"
     "label=\"Hauteur\";key=\"ht\";edit_width=5;allow_accept=true;}"
     ":boxed_column{label=\"Orientation\";"
     ":radio_row{key=\"ro\";"
     ":radio_button{label=\"Horizontal\";key=\"ho\";}"
     ":radio_button{label=\"Aligné\";key=\"al\";}}"
     ":toggle{label=\"Forcer le sens de lecture\";key=\"fs\";}}}"
     "ok_cancel;}"
    )
   file
 )
 (close file)

 ;; initialisation et chargement de la boite de dialogue
 (setq dcl_id (load_dialog temp))
 (if (not (new_dialog "IncTxt" dcl_id))
   (exit)
 )
 (while (setq st (tblnext "STYLE" (not st)))
   (if	(/= (cdr (assoc 2 st)) "")
     (setq slst (cons (cdr (assoc 2 st)) slst))
   )
 )

 ;; liste déroulante "Style"
 (setq slst (reverse slst))
 (start_list "st")
 (mapcar 'add_list slst)
 (end_list)

 ;; liste déroulante "Justification"
 (setq	jlst '("Gauche"		 "Centre"	   "Droite"
       "Milieu"		 "Haut Gauche"	   "Haut Centre"
       "Haut Droite"	 "Milieu Gauche"   "Milieu Centre"
       "Milieu Droite"	 "Bas Gauche"	   "Bas Centre"
       "Bas Droite"
      )
 )
 (start_list "ju")
 (mapcar 'add_list jlst)
 (end_list)

 ;; initialisation des variables
 (setq st (getvar "TEXTSTYLE")) ; style de texte
 (setq ju "Bas Centre") ; justification (voir liste)
 (setq ht (getvar "TEXTSIZE")) ; hauteur de texte
 (setq ro "al") ; rotation ("al" ou "ho")
 (setq fs "1") ; sens écriture ("1" ou "0")

 ;; affichage des éléments en fonction des variables
 (set_tile "st" (itoa (vl-position st slst)))
 (set_tile "ju" (itoa (vl-position ju jlst)))
 (set_tile "ht" (rtos ht))
 (set_tile "ro" ro)
 (set_tile "fs" fs)

 ;; définitions des actions des éléments
 (action_tile "st" "(setq st (nth (atoi $value) slst))")
 (action_tile "ju" "(setq ju (nth (atoi $value) jlst))")
 (action_tile
   "ht"
   "(if (and (numberp (distof $value))
    (     (setq ht (distof $value))
    (progn
    (alert \"Nécessite un nombre réel strictement positif\")
    (set_tile \"ht\" (rtos ht))
    (mode_tile \"ht\" 2))))"
 )
 (action_tile "ho" "(setq ro $key) (mode_tile \"fs\" 1)")
 (action_tile "al" "(setq ro $key) (mode_tile \"fs\" 0)")
 (action_tile "fs" "(setq fs $value)")
 (action_tile "accept" "(done_dialog 1)")
 (action_tile "cancel" "(done_dialog 0)")
 (setq stat (start_dialog))

 ;; déchargemet de la boite de dialogue et suppression du fichier DCL
 (unload_dialog dcl_id)
 (vl-file-delete temp)

 ;; Sélection des polylignes et lignes
 (if (and (= stat 1)
   (setq ss (ssget '((-4 . "			     (0 . "LINE")
		     (-4 . "			     (0 . "*POLYLINE")
		     (-4 . "			     (-4 . "&")
		     (70 . 112)
		     (-4 . "NOT>")
		     (-4 . "AND>")
		     (-4 . "OR>")
		    )
	    )
   )
     )
   (progn
     (vla-StartUndoMark acdoc)

     ;; traitement du jeu de sélection
     (vlax-for obj (setq ss (vla-get-ActiveSelectionSet acdoc))
(if (= (vla-get-ObjectName obj) "AcDbLine")
  ;; lignes
  (progn
    (setq len (vlax-curve-getDistAtParam
		obj
		(vlax-curve-getEndParam obj)
	      )
	  pt  (vlax-curve-getPointAtDist obj (/ len 2.0))
    )
    (format
      (vla-addText
	(vla-get-ModelSpace acdoc)
	(rtos len)
	(vlax-3d-point pt)
	ht
      )
    )
  )
  ;; polylignes
  (repeat (setq pa (fix (vlax-curve-getEndParam obj)))
    (setq
      len (- (vlax-curve-getDistAtParam obj pa)
	     (vlax-curve-getDistAtParam obj (setq pa (1- pa)))
	  )
      pt  (vlax-curve-getPointAtparam obj (+ pa 0.5))
    )
    (format
      (vla-addText
	(vla-get-ModelSpace acdoc)
	(rtos len)
	(vlax-3d-point pt)
	ht
      )
    )
  )
)
     )
     (vla-EndUndoMark acdoc)
   )
 )
 (princ)
)  

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

Lien vers le commentaire
Partager sur d’autres sites

Tu as trouvé cette ruse où ? The swamp peut être !?

 

Oui, TheSwamp est vraiment une mine, avec des programmeurs du monde entier.

Tous les langages de programmations y sont abordé, c'est juste un peu difficile pour moi, parce qu'on en parle en anglais...

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

Lien vers le commentaire
Partager sur d’autres sites

Je le fais avant qu'on me le demande :cool:

 

J'ai ajouté une case à cocher "Forcer le sens de lecture" accessible uniquement en mode aligné.

Si cette case est décochée, les textes sont alignés à la polyligne et suivent son sens (donc certains peuvent se retrouver "à l'envers".

En cochant cette case, on force le sens des textes dans le sens de lecture.

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

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Je le fais avant qu'on me le demande

 

Il est vrai que je fais parti de ceux qui aiment bien les BD,... ;)

 

Je pense qu'en utilisation "poussée" de AutoCAD (disons 35h00 / semaine minimum) je changerai ma méthode,..

 

Mais je ne me sers pas assez d'AutoCAD en temps normal pour me rappeler de tous les noms de commande Lisp !

 

Pour les fonctions natives AutoCAD, je pense avoir assez "optimiser" les raccourcis clavier,...

 

Merci encore, :P

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Test rapide (même très rapide,... ;) ) =>

 

Commande: _appload seglen.LSP correctement chargé(s)

seglen.LSP correctement chargé(s)

Commande: ; erreur: cdrs supplémentaire dans la paire pointée en entrée

Commande: ; erreur: cdrs supplémentaire dans la paire pointée en entrée

Commande:

Commande: seglen

Commande inconnue "SEGLEN". Appuyez sur F1 pour obtenir de l'aide.

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Je ne parlais pas de devancer une demande de boite de dialogue (je pense qu'à partir d'un certain nombre d'options, c'est plus pratique), mais la demande concernant l'orientation des textes dans le sens de lecture.

 

J'avais encore oublié un "

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

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Oups !

 

Comme quoi, ne jamais interpréter ce que pense les autres,....

 

Et je passe ma vie à répéter ça à mon entourage, j'ai l'air malin maintenant ! :mad:

 

Mais bon, rien de grave à partir du moment ou la communication existe,... :P

 

En ce qui concerne "SEGLEN ", tout fonctionne Nickel !

 

Tip-top cette nouvelle routine,...

 

Merci encore (gile),

 

Bonne soirée,

 

 

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Vous etes vraiement génial et vous m'impressionner ENORMEMENT, de plus par rapport au peu de language que je commence tous juste a comprendre et mettre en pratique, la je suis vraiement perdu et le résultat en est encore plus spectaculaire.

 

Alors tant qu'a faire peut on avoir le choix du Calque ?

 

Pour ma part j'essai ce type de ligne, mais sans succes :

 

(IF (= (TblSearch "Layer" "Cotes") nil))

(command "_Layer" "_N" "Cotes" "_CO" "2" "Cotes" ""))

(command "_Layer" "_S" "Cotes" "")

 

 

Ps: je suis sur qu'un menu deroulant pour le calque comme le choix de style serait mieux.

 

 

Lien vers le commentaire
Partager sur d’autres sites

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é