Aller au contenu

Quentin6713

Membres
  • Compteur de contenus

    4
  • Inscription

  • Dernière visite

Quentin6713's Achievements

Newbie

Newbie (1/14)

  • Week One Done Rare
  • One Month Later Rare
  • First Post Rare
  • Conversation Starter Rare

Recent Badges

0

Réputation sur la communauté

  1. 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:RecupSommetsPolylignes (/ ss ent i n pt ss-points pt-coord ss-besi besi besi-pt found tol i-besi mat alt last-obj total count distance-recherche min-x min-y max-x max-y point-insertion dist) (setq distance-recherche 2.0) ; distance de recherche (en mètres) (princ "\n--- Début de la récupération des sommets des polylignes ---") ;; **Ajout de l'immatriculation des lignes décomposées** (princ "\nImmatriculation des entités via _CovaImmatric...") (command-s "_CovaImmatric") ;; Sélection des points générés par l'immatriculation (setq ss-points (ssget "X" '((0 . "INSERT") (2 . "TCPOINT-SRS") (8 . "POINTS-TOPOGRAPHIQUES")))) (if ss-points (progn (setq n 0 count (sslength ss-points)) ;; Sélection des blocs BESI-* à proximité des points (setq ss-besi (ssget "X" '((0 . "INSERT") (2 . "BESI-*")))) ;; Recherche de tous les blocs BESI- présents dans le dessin ;; Pour chaque point immatriculé, on cherche les blocs BESI-* à proximité (while (< n count) (setq pt (ssname ss-points n)) (setq pt-coord (cdr (assoc 10 (entget pt)))) ;; Récupération de la position du point ;; Vérification si le point est valide (if (listp pt-coord) (progn ;; Création de la boîte de sélection (zone de recherche autour du point) (setq min-x (- (car pt-coord) distance-recherche)) (setq min-y (- (cadr pt-coord) distance-recherche)) (setq max-x (+ (car pt-coord) distance-recherche)) (setq max-y (+ (cadr pt-coord) distance-recherche)) ;; Sélection des blocs BESI-* à proximité du point (setq ss-besi (ssget "_WP" (list (list min-x min-y) (list min-x max-y) (list max-x max-y) (list max-x min-y)) '((0 . "INSERT") (2 . "BESI-*")))) ;; Si des blocs BESI-* sont trouvés à proximité (if ss-besi (progn (setq i-besi 0) (while (< i-besi (sslength ss-besi)) (setq besi (ssname ss-besi i-besi)) (setq besi-pt (cdr (assoc 10 (entget besi)))) ;; Récupération du point d'insertion du bloc BESI- ;; Vérification que le bloc BESI-* a une coordonnée valide (if (and (listp besi-pt) (= (length besi-pt) 3)) (progn ;; Affichage des points pour débogage (princ (strcat "\nBloc BESI- à " (itoa i-besi) " trouvé à : " (rtos (car besi-pt) 2 4) ", " (rtos (cadr besi-pt) 2 4))) ;; Calcul de la distance entre le point immatriculé et le point d'insertion de BESI- (setq dist (distance pt-coord besi-pt)) ;; Affichage de la distance pour débogage (princ (strcat "\nDistance entre les points : " (rtos dist 2 4))) ;; Si la distance entre le point TCPOINT et le bloc BESI- est inférieure ou égale à 0, déplacer dans le calque "$TEST" (if (<= dist 0) (progn ;; Déplacement du point dans le calque "$TEST" (princ "\nDistance <= 0, changement de calque du point dans '$TEST'") ;; Vérification du calque "$TEST" dans le dessin (if (not (tblsearch "LAYER" "$TEST")) (princ "\nLe calque '$TEST' n'existe pas. Veuillez créer ce calque.") ;; Changer le calque (command "._CHPROP" last-obj "" "CA" "$TEST" "") (princ "\nChangement de calque effectué avec succès.") ) ) ) ) ) ) (setq i-besi (1+ i-besi)) ) ) ) ) (setq n (1+ n)) ) (princ "\nExtraction terminée.") ) (princ "\nAucun point immatriculé trouvé.") ) (princ "\n--- Fin du programme ---") (princ) ) (princ "\nEntrez la commande 'RecupSommetsPolylignes' pour exécuter le script.") (princ) Encore une fois, un grand merci d'avance pour vos éventuels retours 🙂
  2. 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 🙂
  3. 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
  4. 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 et je bute sur une erreur de syntaxe que je n'arrive pas à corriger. L'objectif de ce premier LISP est de conserver une référence de point commune entre un bloc inséré "BESI-" et une polyligne qui y est déjà dessiné (chaque bloc "BESI-" n'a pas forcément de polyligne qui y est lié). Référence de point commun que je souhaite utilisé dans un autre LISP (je créerai un autre sujet pour celui là) Voici les grandes lignes du LISP : - Créer des points au sommet des polylignes souhaitées - rechercher dans le dessin les réf de bloc "BESI-" - Si la distance d'un des points créés est inférieur ou égal à 0 avec un des blocs, changer le point en question de calque pour le réutiliser plus tard 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_pt_commun.dwg Test_pt_commun.lsp
×
×
  • 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é