Aller au contenu

Selection par cercle sur les extremites de polylignes


fabcad

Messages recommandés

Bonsoir,

 

Dans le cadre d'un traitement SIG, je souhaiterais sélectionner des textes (numéros de voies) sur le premier et le dernier point de filaires de voies (Lwpolylignes non fermées) par une sélection par cercle dont le rayon serait demandé.

 

Voici mon algorythme :

1- Demande du rayon.

2- Choix du calque par boite dcl du calque contenant les textes de numéros de voies.

3- Sélection des filaires de voies (Lwpolylignes non fermées).

4- Boucle sur chaque filaire sur le premier et le dernier sommet pour la sélection des textes.

5- A la fin mettre tout ces textes dans une sélection pour lancer un commande d'édition AutoCAD (Propriétés).

 

- Un petit plus : pouvoir récupérer sur chaque sélection le minimum et le maximum d'une liste pair et minimum et le maximum d'une liste impair.

 

Merci d'avance.

 

Fabrice

 

PS : Si vous voulez un dessin test je pourrais vous l'envoyer via votre adresse de messagerie.

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Fab

 

Je suggère qq améliorations de ton CDC :

 

Je pense que parfois il peut être intéressant de récupérer non seulement des TEXTEs ou MTEXTEs mais aussi des Blocs/Symboles qui seraient dans les fameux cercles à l'extrémité des polylignes !

 

Il faut penser que cela peut intéresser aussi des gensqui sont simplement sous AutoCAD

et non pas sous MAP ou CIVIL !

 

A la sortie, j'aimerais bien que les objets concernés soient sélectionnées ! :)

mais que aussi on ait la possibilité de générer un fichier Texte

avec un séparateur de type ";" (point-virgule) avec

- nom du calque, X, Y, Contenu (pour les textes)

- nom du calque, X, Y, Nom du bloc, Attribut1, Attribut2, etc (pour les blocs)

 

Qu'en penses tu Fab ?

 

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Un premier jet :

 

Version corrigée.

 

;; CIRCSEL
;; crée un jeu de sémection à partir d'un cercle
;;
;; Arguments
;; cen = centre du cercle (point coordonnées SCU)
;; rad = rayon du cercle (réel)
;; mod = mode de sélection ("_CP" ou "_WP")
;; fltr = filtre de sélection (liste comme pour ssget)

(defun circsel (cen rad mod fltr / ang lst)
 (setq ang 0)
 (repeat 50
   (setq lst (cons (polar cen ang rad) lst)
  ang (+ ang (/ pi 25))
   )
 )
 (ssget mod lst fltr)
)

;;; GetLayer (gile) 03/11/07
;;; Retourne le nom du calque entré ou choisi par l'utilisateur 
;;; dans une liste déroulante de la boite de dialogue ou en sélectionnant
;;; un objet à l'écran.
;;; Argument : le titre (string) ou nil (défaut : "Choisir un calque")

(defun getlayer	(titre / lay lst tmp file what_next dcl_id nom)
 (while (setq lay (tblnext "LAYER" (not lay)))
   (setq lst (cons (cdr (assoc 2 lay)) lst))
 )
 (setq	lst  (acad_strlsort lst)
tmp  (vl-filename-mktemp "Tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat
     "getlayer:dialog{label="
     (cond (titre (vl-prin1-to-string titre))
    ("\"Choisir un calque\"")
     )
     ";initial_focus=\"tp\";
     :boxed_column{:row{
     :column{:text{label=\"Sélectionner un objet\";alignment=left;}}
     :column{:button{label=\">>\";key=\"obj\";alignment=right;fixed_width=true;}
     spacer;}}
     :edit_box{key=\"tp\";edit_width=25;allow_accept=true;}
     :popup_list{key=\"lay\";edit_width=25;}
     spacer;}ok_cancel;}"
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog tmp))
 (setq what_next 2)
 (while (>= what_next 2)
   (if	(not (new_dialog "getlayer" dcl_id))
     (exit)
   )
   (start_list "lay")
   (mapcar 'add_list lst)
   (end_list)
   (or	nom
(setq nom (vlax-ldata-get "getLayer" "n"))
(setq nom (vlax-ldata-put "getLayer" "n" "0"))
   )
   (if	(member nom lst)
     (set_tile	"lay"
	(itoa (- (length lst) (length (member nom lst))))
     )
     (set_tile "lay" "0")
   )
   (set_tile "tp" nom)
   (action_tile "obj" "(done_dialog 3)")
   (action_tile "tp" "(setq nom $value)")
   (action_tile
     "lay"
     (strcat
"(if (or (= $reason 1) (= $reason 4))"
"(progn"
"(setq nom (nth (atoi $value) lst))"
"(set_tile \"tp\" (nth (atoi $value) lst))"
"(mode_tile \"tp\" 2)))"
      )
   )
   (action_tile
     "accept"
     (strcat
"(if (tblsearch \"LAYER\" nom)"
"(progn (done_dialog 1)"
"(vlax-ldata-put \"getLayer\" \"n\" nom))"
"(progn"
"(alert (strcat \"Le calque \" nom \" est introuvable.\"))"
"(setq nom nil) (set_tile \"tp\" (vlax-ldata-get \"getLayer\" \"n\"))"
"(mode_tile \"tp\" 2)))"
      )
   )
   (setq what_next (start_dialog))
   (cond
     ((= what_next 3)
      (if (setq nom (car (entsel)))
 (setq nom (cdr (assoc 8 (entget nom))))
 (setq nom nil)
      )
     )
     ((= what_next 0)
      (setq nom nil)
     )
   )
 )
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 nom
)

;; Fonction principale

(defun c:numeros (/ rad lay ss1 n1 n2 plst ss2 ss3 fltr)
 (and
   (setq rad (getdist "\nSpécifiez le rayon: "))
   (setq lay (getlayer nil))
   (setq ss1 (ssget '((0 . "LWPOLYLINE")
	       (-4 . "[b]		       (-4 . "&")
	       (70 . 1)
	       (-4 . "NOT>")
	      )
      )
   )
   (setq ss3  (ssadd)
  fltr (list '(0 . "TEXT,MTEXT") (cons 8 lay))
   )
   (repeat (setq n1 (sslength ss1))
     (setq elst (entget (ssname ss1 (setq n1 (1- n1)))))
     (if (setq ss2 (circsel (cdr (assoc 10 elst)) rad "_WP" fltr))
(repeat	(setq n2 (sslength ss2))
  (ssadd (ssname ss2 (setq n2 (1- n2))) ss3)
)
     )
     (if (setq ss2 (circsel (cdr (assoc 10 (reverse elst))) rad "_WP" fltr))
(repeat	(setq n2 (sslength ss2))
  (ssadd (ssname ss2 (setq n2 (1- n2))) ss3)
)
     )
   )
   (sssetfirst nil ss3)
 )
 (princ)
) 

[Edité le 7/2/2008 par (gile)][Edité le 7/2/2008 par (gile)][Edité le 8/2/2008 par (gile)]

 

[Edité le 11/2/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Merci Gile,

Un grand coup de chapeau pour cette réponse et je la testerais demain matin,

 

C'est le début pour d'autres routines de ce genre car j'avais en tête la même fonction mais avec des blocs ou annotations autocad map pour sélectionner les textes.

 

Encore merci Gile,

 

Effectivement Lecrabe cette première ébauche peut servir à d'autres cas de figure.

 

Bonne soirée,

 

Fabrice qui n'a plus de page d'accueil.

Lien vers le commentaire
Partager sur d’autres sites

Une autre version qui répond plus aux demandes du décapode, j'ai supprimé le choix du calque pour le filtre (sinon je ne comprends pas bien l'intérêt de mettre le nom du calque dans le fichier texte) et j'ai renommé la commande CDC (c'est comme ça que ça s'appelle ?)

 

;; CIRCSEL
;; crée un jeu de sémection à partir d'un cercle
;;
;; Arguments
;; cen = centre du cercle (point coordonnées SCU)
;; rad = rayon du cercle (réel)
;; mod = mode de sélection ("_CP" ou "_WP")
;; fltr = filtre de sélection (liste comme pour ssget)

(defun circsel (cen rad mod fltr / ang lst)
 (setq ang 0)
 (repeat 50
   (setq lst (cons (polar cen ang rad) lst)
  ang (+ ang (/ pi 25))
   )
 )
 (ssget mod lst fltr)
)

;; Fonction principale

(defun c:cdc (/ ss2txt rad lay ss1 n ss2 fltr file)
 
 (defun ss2txt (ss / n ent elst att alst)
   (repeat (setq n (sslength ss))
(setq ent  (ssname ss (setq n (1- n)))
      elst (entget ent)
      txt  (strcat txt
		   (cdr (assoc 8 elst))
		   ";"
		   (rtos (cadr (assoc 10 elst)))
		   ";"
		   (rtos (caddr (assoc 10 elst)))
		   ";"
	   )
      ss3 (ssadd ent ss3)
)
(if (= (cdr (assoc 0 elst)) "INSERT")
  (progn
    (setq txt (strcat txt (cdr (assoc 2 elst)) ";")
	  att (entnext ent)
    )
    (while (= (cdr (assoc 0 (setq alst (entget att)))) "ATTRIB")
      (setq txt	(strcat txt (cdr (assoc 1 alst)) ";")
	     att (entnext att)
      )
    )
    (setq txt (strcat (vl-string-right-trim ";" txt) "\n"))
  )
  (setq txt (strcat txt (cdr (assoc 1 elst)) "\n"))
)
     )
   )
   
 (if (and
(setq rad (getdist "\nSpécifiez le rayon: "))
(setq ss1 (ssget '((0 . "LWPOLYLINE")
		   (-4 . "[b]			   (-4 . "&")
		   (70 . 1)
		   (-4 . "NOT>")
		  )
	  )
)
     )
   (progn
     (setq ss3	 (ssadd)
    txt	 ""
    fltr (list '(-4 . "[b]		       '(66 . 1) '(-4 . "AND>")	'(-4 . "OR>"))
     )
     (repeat (setq n (sslength ss1))
(setq elst (entget (ssname ss1 (setq n (1- n)))))
(if (setq ss2 (circsel (cdr (assoc 10 elst)) rad "_WP" fltr))
  (ss2txt ss2)
)
(if (setq ss2 (circsel (cdr (assoc 10 (reverse elst))) rad "_WP" fltr))
  (ss2txt ss2)
)
     )
     (sssetfirst nil ss3)
     (textscr)
     (princ txt)
     (initget "Oui Non")
     (if (= (getkword
       "\nEnregistrer dans un fichier ? [Oui/Non] [b]: "
     )
     "Oui"
  )
(progn
  (setq
    file
     (open
       (getfiled "Créez ou sélectionnez un fichier" "" "txt" 33)
       "a"
     )
  )
  (princ txt file)
  (close file)
)
T
     )
     (graphscr)
   )
 )
 (princ)
) 

 

[Edité le 7/2/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

 

J'ai testé la routine ce matin sur Autodesk Map 2005 il plante après la sélection des polylignes :

 

Commande: numeros

 

Spécifiez le rayon: 15

 

Choix des objets: 1 trouvé(s)

 

Choix des objets: 1 trouvé(s), 2 au total

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Choix des objets: 1 trouvé(s), 7 au total

 

Choix des objets: ; erreur: type d'argument incorrect: lselsetp nil

 

J'attends de tes nouvelles.

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é