- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hello,
I need to label polylines regarding the elevation. I have Civil 3d but I am not happy with the way it labels the contours. So I have now polylines with elevation and I want a label on interval, so I made lots of searches and ask to ChatGPT. Now I have a lisp that works but it is impossible to have labels parallel to the polylines; I have made several modifications but they are always perpendicular.
Can someone have a look and tell me what is wrong with the lisp?
thank you!!!
(defun c:AlignTextOnPolyline (/ *dist* dist height ss count ent obj chainage len point1 angle)
(vl-load-com)
;; Variable globale pour la distance par défaut
(setq *dist* 100.0)
;; Fonction pour créer un texte aligné sur la polyligne
(defun _text (p angle height content)
(entmake
(list
'(0 . "TEXT") ; Utiliser "TEXT" pour plus de simplicité
'(100 . "AcDbEntity")
'(8 . "C-CTRL_TXT") ; Calque pour les textes
(cons 10 p) ; Point d'insertion
(cons 40 height) ; Hauteur du texte
(cons 1 content) ; Contenu du texte
(cons 50 angle) ; Angle de rotation (aligné sur la polyligne)
(cons 7 (getvar "textstyle")) ; Style de texte courant
)
)
)
;; Fonction pour calculer l'angle de la tangente à la polyligne
(defun _tangent-angle (obj dist)
(angle (vlax-curve-getPointAtDist obj (- dist 0.001)) (vlax-curve-getPointAtDist obj dist))
)
;; Demander l'intervalle et la hauteur du texte
(initget 6)
(setq dist (getdist (strcat "\nIntervalle de texte <" (rtos *dist*) ">: ")))
(setq *dist* (if dist dist *dist*)) ; Utiliser la valeur par défaut si l'utilisateur n'entre rien
(setq height (getdist "\nHauteur du texte : "))
;; Sélectionner les polylignes
(setq ss (ssget '((0 . "LWPOLYLINE")))) ; Sélectionner uniquement des polylignes légères
(if ss
(progn
(setq count 0)
(repeat (sslength ss)
(setq ent (ssname ss count)
obj (vlax-ename->vla-object ent)
chainage *dist*) ; Commencer à l'intervalle spécifié
;; Obtenir la longueur totale de la polyligne
(setq len (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)))
;; Placer les textes à intervalles réguliers le long de la polyligne
(while (<= chainage len)
(setq point1 (vlax-curve-getPointAtDist obj chainage))
(if point1
(progn
;; Créer le texte aligné sur la polyligne (angle parallèle)
(setq angle (_tangent-angle obj chainage)) ; Calcul de l'angle parallèle à la polyligne
(_text point1 angle height (rtos chainage 2 2))
(setq chainage (+ chainage *dist*)) ; Passer à l'intervalle suivant
)
)
)
(setq count (1+ count))
)
)
(princ "\nAucune polyligne sélectionnée.")
)
(princ)
)
Solved! Go to Solution.