Aller au contenu

[Résolu] Longueurs de segments dans un polygone


pierrevigneux

Messages recommandés

Coucou,

Je me souviens avoir écrit une fonction dans ce principe il y a longtemps :

  ; Permet de récupérer les coordonnées et données associées d'un point situé à une distance spécifiée d'un élément linéaire :
;--- La fonction (get-AlignPoint-AtDist) possède 3 arguments
;--- curve-obj correspond au nom d'entité de l'objet servant de référence (peut être le nom d'entité ou le VLA-Object)
;--- dist correspond à l'emplacement du point situé sur la courbe pour une distance donnée depuis le point de départ
;--- e correspond au décalage de la courbe de référence. Une valeur positive placera le point calculé au-dessus de la courbe de référence et une valeur négative
; placera le point calculé au-dessous de la courbe de référence (dans le sens de lecture de la courbe)

;---Renvoie une liste de paire pointée de la forme
;  ((-1 . <Nom d'entité>) (10 . PointOnCurve) (11 . PointOutsideCurve) (50 . Angle-Rad_Tangente) (1041 . DistanceOnCurve))
; si l'objet n'est pas un objet linéaire, retourne nil
(defun get-AlignPoint-AtDist (curve-obj dist e / lg u a b pt Ang Align)

  (cond
    ((= (type curve-obj) 'VLA-OBJECT) (setq curve-obj (vlax-vla-object->ename curve-obj)))
    ((= (type curve-obj) 'ENAME) (setq curve-obj curve-obj))
    (t ((exit) (princ)))
  )
  (if (wcmatch (cdr (assoc 0 (entget curve-obj))) "ARC,CIRCLE,ELLIPSE,*LINE")
    (progn
      (cond
        ((> dist (setq lg (vlax-curve-getdistatparam curve-obj (vlax-curve-getendparam curve-obj))))
          (setq dist lg)
        )
        ((< dist 0)
          (setq dist 0.0)
        )
      )
      (setq u (vlax-curve-getfirstderiv curve-obj (vlax-curve-getparamatdist curve-obj dist))
            a (car u)
            b (cadr u)
            pt (vlax-curve-getpointatdist curve-obj dist)
            Align (polar pt (setq Ang (angle '(0.0 0.0 0.0) (list (- b) a 0.0))) e)
      )
      (list (cons -1 curve-obj) (cons 10 pt) (cons 11 Align) (cons 50 (cond ((not (minusp e)) (- Ang (/ pi 2.0))) ((minusp e) (+ Ang (/ pi 2.0))))) (cons 1041 dist))
    )
  )

)

Donc si on épure la fonction pour pouvoir ensuite l'intégrer dans le programme SEGLEN, on peut avoir ceci :

(defun AlignPoint (curve pt d / u a b)
  (setq
    u (vlax-curve-getFirstDeriv curve (vlax-curve-getParamAtPoint curve pt))
    a (car u)
    b (cadr u)
    pt (polar pt (angle '(0.0 0.0 0.0) (list (- b) a 0.0)) d)
  )
)

Et du coup il te suffit de remplacer les lignes

	 (vlax-3d-point pt)

par

	 (vlax-3d-point (AlignPoint obj pt d))

et d'ajouter la ligne

(setq d 0.15)

(ou autre valeur, car je ne sais pas dans quelle unité de dessin tu travailles..) au début du programme, voire si besoin si tu veux avoir le choix pour la distance 😉

(setq d (getreal "\nSpécifier la distance entre chaque segment et le texte implanté : "))

Ne pas oublier de rajouter la variable 'd' dans les variables locales et la fonction (AlignPoint) si tu veux que chat marche !
Si c'est trop compliqué à faire ou si tu as peur d'oublier quelque chose, je peux aussi re-poster le programme modifié si besoin 🙂
Autre information importante, si 'd' est positif alors le décalage se fera à gauche du segment (en suivant le sens de lecture de la polyligne), et si 'd' est négatif alors le décalage se fera à droite du segment (en suivant le sens de lecture).

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Salut Luna, 

Tout d'abord, merci pour ton aide précieuse... ça a fonctionné, mais j'ai maintenant un "problème" :
Quand la polyligne est orienté de droite à gauche, le décalage du texte de 15cm (ou de la valeur définie) fait que celui-ci se retrouve "sur la ligne"

(par exemple pour 7.02, 1.94, 4.92, 0.58....)

image.thumb.png.d76880bbbac73319f2368dd787012de7.png

 

Je pense que cela est dû au problème que tu évoques quand à la valeur de "d".

***********************

Rien ne sert de courrir, il faut partir à point.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an 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é