Quentin6713 Posté(e) mardi à 12:52 Posté(e) mardi à 12:52 Bonjour, Je me permets de venir vers vous car je rencontre un soucis... Je me suis lancé dans la création d'un lisp pour automatiser une étape dans la création d'un dessin mais j'avoue ne pas avoir de grande connaissance en ce domaine. Le Lisp en pièce jointe fonctionne mais pas de manière optimale et j'aimerai avoir vos avis pour l'améliorer / le corriger. En effet, une partie des polylignes créées sont correct mais d'autres sont incohérentes, certaines se superposent et enfin, il y en a qui ne sont tout simplement pas dessinées alors qu'elles le devraient. Dans l'idéal, je voudrais faire une recherche dans une zone de 5m (comme je l'explique plus bas) mais quand j'indique la valeur 5 comme distance, il ne se passe rien. Je suis obligé d'indiquer une valeur de 50 pour que le lisp fonctionne (sachant que je travaille avec comme unités le mètre et les grades) L'objectif de ce LISP est de projeter une polyligne en perpendiculaire sur une ligne à partir d'une référence de bloc. Mais à condition que cette réf de bloc soit proche d'une autre. Et ainsi de suite. Voici les grandes lignes du LISP : - Sélectionner les références de blocs (A) à traiter (bloc récupéré à partir d'un lisp que j'ai exposé dans un autre sujet) - faire une recherche de 5m autour de chacune des références (A) sélectionnées - Rechercher une autre référence de bloc (B) dans chacune de ces zones - Chercher la référence de bloc (B) la + proche de la référence de bloc (A) s'il en existe plusieurs - Si une référence de bloc (B) a été trouvée, rechercher dans une zone de 5m autour si une ligne (C) est présente - Rechercher la ligne (C) la plus proche s'il y en a plusieurs - Faire une projection en perpendiculaire à partir du bloc (B) sur une ligne (C) En pièce jointe le lisp et le fichier dwg sur lequel je travaille. Merci d'avance pour vos retours ! (Si jamais, je travaille sur Autocad Map 3D 2020) Test_projection_perp.lsp Test_projection_perp.dwg Citer
Quentin6713 Posté(e) jeudi à 06:44 Auteur Posté(e) jeudi à 06:44 J'ai pas pensé à indiquer le lisp en question directement ici, pour ceux qui veulent jeter un coup d'œil rapide, le voici : (defun c:proj-bloc () (setq rayon 50) ; Rayon de 5 mètres ;; Sélectionner tous les blocs "TCPOINT" sur le calque "$TEST" (setq sel-tcpoints (ssget "X" '((0 . "INSERT") (2 . "TCPOINT") (8 . "$TEST")))) ;; Vérifier si des "TCPOINT" existent (if (not sel-tcpoints) (progn (princ "\nAucun 'TCPOINT' trouvé sur le calque '$TEST'.") (exit) ) ) ;; Parcourir chaque "TCPOINT" (setq i 0) (while (< i (sslength sel-tcpoints)) (setq tcpoint (ssname sel-tcpoints i) ent-tcpoint (entget tcpoint) point-tcpoint (cdr (assoc 10 ent-tcpoint))) ;; Récupérer sa position ;; Vérifier que le point est valide (if point-tcpoint (progn ;; Définir un polygone carré autour du "TCPOINT" (setq polygone (list (polar point-tcpoint 0 rayon) (polar point-tcpoint (* pi 0.5) rayon) (polar point-tcpoint pi rayon) (polar point-tcpoint (* pi 1.5) rayon) (polar point-tcpoint 0 rayon) ;; Fermer le polygone )) ;; Rechercher les "TCPOINT-REGARDS" dans ce rayon (setq sel-regards (ssget "_WP" polygone '((0 . "INSERT") (2 . "TCPOINT-REGARDS") (8 . "POINT-ASS-objet-BESI")))) ;; Vérifier s'il y a des "TCPOINT-REGARDS" (if sel-regards (progn ;; Trouver le plus proche "TCPOINT-REGARDS" (setq j 0 min-dist 1e10 regard-proche nil) (while (< j (sslength sel-regards)) (setq regard (ssname sel-regards j) ent-regard (entget regard) point-regard (cdr (assoc 10 ent-regard)) dist (distance point-tcpoint point-regard)) (if (< dist min-dist) (setq min-dist dist regard-proche point-regard)) (setq j (1+ j)) ) ;; Vérifier si un regard a été trouvé (if regard-proche (progn ;; Définir un polygone carré autour du regard (setq polygone-regard (list (polar regard-proche 0 rayon) (polar regard-proche (* pi 0.5) rayon) (polar regard-proche pi rayon) (polar regard-proche (* pi 1.5) rayon) (polar regard-proche 0 rayon) ;; Fermer le polygone )) ;; Rechercher les lignes "15-ASS-Collecteurs" proches (setq sel-lignes (ssget "_WP" polygone-regard '((0 . "LINE") (8 . "15-ASS-Collecteurs")))) ;; Vérifier s'il y a des lignes (if sel-lignes (progn ;; Trouver la ligne la plus proche du regard (setq k 0 min-dist 1e10 proj-final nil) (while (< k (sslength sel-lignes)) (setq ligne (ssname sel-lignes k) ent-ligne (entget ligne) p1 (cdr (assoc 10 ent-ligne)) p2 (cdr (assoc 11 ent-ligne)) proj (projection-perpendiculaire regard-proche p1 p2) dist-proj (distance regard-proche proj)) (if (< dist-proj min-dist) (setq min-dist dist-proj proj-final proj)) (setq k (1+ k)) ) ;; Vérifier si une projection a été trouvée (if proj-final (progn (command "_PLINE" regard-proche proj-final "") (princ "\nPolyligne créée entre 'TCPOINT-REGARDS' et la projection perpendiculaire.") ) ) ) ) ) ) ) ) ) ) (setq i (1+ i)) ) (princ "\nProcessus terminé.") ) ;; Fonction pour calculer la projection perpendiculaire d'un point sur une ligne (defun projection-perpendiculaire (pt p1 p2) (setq x0 (car pt) y0 (cadr pt) ; Coordonnées du point x1 (car p1) y1 (cadr p1) ; Coordonnées du premier point de la ligne x2 (car p2) y2 (cadr p2) ; Coordonnées du second point de la ligne dx (- x2 x1) dy (- y2 y1) ; Différences de coordonnées t (/ (+ (* (- x0 x1) dx) (* (- y0 y1) dy)) (+ (* dx dx) (* dy dy)))) ; Calcul du paramètre de projection ;; Calcul des coordonnées du point projeté (setq proj-x (+ x1 (* t dx))) (setq proj-y (+ y1 (* t dy))) (list proj-x proj-y) ; Retourner les coordonnées du point projeté ) (princ "\nEntrez (proj-bloc) pour exécuter le script.") (princ) Encore une fois, merci d'avance pour les éventuels retours 🙂 Citer
Messages recommandés