Edouard Posté(e) le 5 juillet 2023 Posté(e) le 5 juillet 2023 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
didier Posté(e) le 5 juillet 2023 Posté(e) le 5 juillet 2023 Bonjour @Edouard Est-ce que les polylignes peuvent avoir plusieurs segments ? Ou bien est-ce que ce sont des polylignes avec seulement deux sommets (début/fin) ? Lorsque tu dis dit "alignées", est-ce que ça signifie même gisement ou bien colinéaires ? Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Edouard Posté(e) le 5 juillet 2023 Auteur Posté(e) le 5 juillet 2023 Bonjour Didier, Certaines polylignes ont plusieurs sommets, d'autres non. J'ai pensé que c'était plus simple de tout décomposer en lignes afin d'avoir des objets homogènes. Effectivement, ça s'apparente plutôt au terme colinéaires, puisque peu importe le sens de la ligne. Merci !
didier Posté(e) le 5 juillet 2023 Posté(e) le 5 juillet 2023 Bonjour @Edouard Si les polylignes ont plusieurs segments, on isole les segments de même orientation ou pas ? Dans cette image, les numéros indiquent des polylignes. Sont colinéaires les segments des polylignes 2 et 3. Sont dans le même direction les segment 1, 2,3 et le premier segment de la polyligne 5. Lesquels doivent passer en rouge ? Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Edouard Posté(e) le 6 juillet 2023 Auteur Posté(e) le 6 juillet 2023 Bonjour Didier, Dans votre exemple, ce ne sont que les segments 2 et 3 qui passent en rouge. La condition est que le point de début ET/OU le point de fin de ligne soit identiques, ET que les orientations soient similaires (avec une tolérance sur l'écart d'angle et à 180° près). Merci !
Luna Posté(e) le 6 juillet 2023 Posté(e) le 6 juillet 2023 Coucou, Dans ce cas faut-il considérer de mettre en rouge uniquement si 2 (ou plus) segments ont un sommet commun et sont colinéaires, autrement dit si le segment 1 était au niveau du point bas de la polyligne 5, tu aurais 4 segments en rouge, c'est bien cela ? Que se passe-t-il en cas de chevauchement entre les segments ? Ou en cas de doublon des segments ? Ensuite tu suggères de décomposer les polylignes en lignes, cela signifie qu'à la fin du programme tu acceptes le fait que tes objets aient été modifiés (polylignes > lignes) ou bien il faut que le programme reste transparent et donc "recompose" tes polylignes à la fin ? S'il faut recomposer, comment peut-on passer des segments spécifiques d'une polyligne en rouge ? Bisous, Luna
Edouard Posté(e) le 6 juillet 2023 Auteur Posté(e) le 6 juillet 2023 Bonjour Luna, Oui c'est bien ça ! Il ne devrait y avoir ni chevauchement ni doublon dans les fichiers que j'ai à traiter. Oui c'est accepté d'avoir des lignes à la fin du programme. 😊
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant