Un peu de méthodologie.
Quand on effectue une tâche "complexe", il est d'usage de la décomposer en plusieurs tâches plus simples testables séparément.
Ici, la "complexité" de la tâche est de modifier la longueur de plusieurs lignes à condition que ce là n'ait pas été déjà fait.
On peut donc décomposer en plusieurs tâches :
sélectionner des lignes
tester si une ligne a déjà été raccourcie
raccourcir une ligne
marquer la ligne comme "déjà raccourcie"
Les tâches 2, 3 et 4 peuvent être définies dans des fonctions séparées testables indépendamment. Pour que la tâche 4 fonctionne correctement après la tâche 3, il faut que la ligne passée en argument à la tâche 3 soit juste modifiée, pas remplacée par une autre entité.
2.
(defun dejaRaccourcie (ligne)
(= (vlax-ldata-get ligne "DecoupPli") 1)
)
3.
(defun raccourcirLigne (ligne longCoupe / ptA ptB long ang)
(setq ptA (getpropertyvalue ligne "StartPoint")
ptB (getpropertyvalue ligne "EndPoint")
ang (angle ptA ptB)
)
(if (<= (distance ptA ptB) (* 2 longCoupe))
(entmod (subst '(62 . 7) '(62 . 1) (entget ligne)))
(progn
(setq ptC (polar ptA ang longCoupe)
ptD (polar ptB ang (- longCoupe))
)
(setpropertyvalue ligne "StartPoint" ptC)
(setpropertyvalue ligne "EndPoint" ptD)
(entmake
(list '(0 . "LINE") (cons 10 ptA) (cons 11 ptC) '(62 . 7))
)
(entmake
(list '(0 . "LINE") (cons 10 ptB) (cons 11 ptD) '(62 . 7))
)
)
)
)
4.
(defun marquerRaccourcie (ligne)
(vlax-ldata-put ligne "DecoupPli" 1)
)
Chacune de ces fonctions peut être testée séparément dans AutoCAD avec les expressions suivantes :
(dejaRaccourcie (car (entsel)))
(raccourcirLigne (car (entsel)) 3.)
(marquerRaccourcie (car (entsel)))
Une fois qu'on est satisfait du fonctionnement de ces fonctions, on peut les intégrer dans le traitement d'un jeu de sélection.
(defun c:test (/ s i l)
(if (setq s (ssget '((0 . "LINE") (62 . 1))))
(repeat (setq i (sslength s))
(setq l (ssname s (setq i (1- i))))
(if (not (dejaRaccourcie l))
(progn
(raccourcirLigne l 3.)
(marquerRaccourcie l)
)
)
)
)
(princ)
)