Aller au contenu

LISP permettant d'afficher les segments alignés


Edouard

Messages recommandés

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

propriétés_ligne.JPG

test.lsp

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

2023-07-05_16-09-41.png.cbb6640a0a7767e79035fe52779d982c.png

 

Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é