Bonjour à tous,
Je suis débutant en LISP, j'ai commencé à chercher par moi-même mais je bloque.
Je souhaite créer une LISP qui prend en compte les polylignes (ou lignes) d'un calque donné dans mon dessin dwg, et qui m'affiche en couleur (rouge par exemple) celles qui sont alignées entre elles.
Mon approche pour cela est la suivante : le code va décomposer les polylignes de mon calque afin d'en faire des lignes (des segments), puis il va analyser les propriétés de ces lignes, et changer la couleur de celles dont les coordonnées XY "début de ligne" et/ou "extrémité" sont identiques, ET dont l'angle est similaire à 0.005 ± 200 grades (ou 0.00008 ± 𝝅 rad).
Je vous ai mis en fichier joint les propriétés des lignes dans AutoCAD.
À préciser que je travaille sur AutoCAD MAP 2014, avec Covadis 14. J'espère que ça n'est pas une grosse contrainte pour ce code...
Jusqu'à maintenant, j'ai un code qui décompose mes polylignes et change la couleur des lignes résultantes en rouge :
(vl-load-com)
(defun c:color-align ()
;; charger les fonctions Visual LISP
(vl-load-com)
;; démarrer le chrono
(setq t0 (* 84600 (getvar 'tdusrtimer)))
;; créer une variable globale pour le document actif si elle n'existe pas déjà
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))))
(if (ssget "_X" (list '(0 . "LWPOLYLINE") (cons 410 (getvar 'ctab))))
(progn
;; démarrer un groupe d'annulation
(vla-StartUndoMark *acdoc*)
;; pour chaque polyligne sélectionnée
(vlax-for pl (setq ss (vla-get-ActiveSelectionSet *acdoc*))
(vla-Explode pl) ; décomposer la polyligne
(vla-Delete pl) ; supprimer la polyligne
)
(vla-Delete ss); supprimer le jeu de sélection (libérer les ressources)
;; terminer le groupe d'annulation
(vla-EndUndoMark *acdoc*)
)
)
;Ajoute à la variable ss les objets du calque PARCELLES.
(setq ss
(ssget "_X" '((8 . "*PARCELLES"))))
; Applique la couleur Rouge dans les propriétés des objets de la sélection.
(command "chprop" ss "" "CO" "Rouge" "")
;; arréter le chrono et afficher le temps d'exécution
(setq t1 (* 84600 (getvar 'tdusrtimer)))
(princ (strcat "\nTemps d'exécution : " (rtos (- t1 t0)) " secondes"))
(princ)
)
(c:color-align)
; (equal '(1.12345 12.0) '(1.12346 12.0) 0.00001) -> tolérance
Merci d'avance pour votre aide 😇
Edouard
test.lsp