Blocs-06 : Sélectionner sur trajet entité

But de l'exercice :
Sélectionner des blocs suivant une entité


Des blocs sont insérés le long d'une polyligne (ou d'une ligne) et avec ce programme on va créer un jeu de sélection de ces blocs

Ça va fonctionner comme la sélection de sélection native "trajet" mais il ne sera pas demander de dessiner ce trajet, c'est l'entité support qui va "faire" trajet.

Il sera demandé à l'utilisateur de sélectionner le bloc de référence puis une entité "chemin" et enfin une tolérance.
Sélectionner le bloc permet au programme de mémoriser le nom du bloc
Sélectionner l'entité "chemin" permet au programme de vérifier si un bloc est proche (tolérance) de l'entité
Cette valeur de "tolérance" sert à préciser si le programme doit sélectionner (ou pas) un bloc suivant qu'il est sur l'entité ou à une distance plus courte (ou égale) de cette valeur de tolérance.


Allez, on y va ...
Regardez l'image du code, je vais la commenter ensuite...

Fonction principale :

La variable nombloc est renseignée en lançant la fonction (Nom-Bloc)
La variable pol est un nom d'entité (ename) suite au choix d'une entité
La variable tol est un réel (real) qui va servir à vérifier la position du bloc par rapport à l'entité
Et enfin on lance la fonction (Select-Bloc-Pol) avec les trois arguments qu'on vient de créer.


Première fonction :

Cette fonction va renvoyer le nom du bloc sélectionné sous forme de chaîne de caractères (string).
Si l'entité choisie n'est pas un bloc, la fonction se relance toute seule grâce à la ligne 6 - qui est dans un (progn) car il y a plusieurs actions dans un (if).

Deuxième fonction (première partie) :

Transformation de l'ename de l'entité pol en objet vla
Création d'un jeu de sélection de tous les blocs - qui portent le nom renvoyé par la première fonction - dans la totalité du dessin (indépendamment du calque, de la couleur, de la visibilité ou pas à l'écran).

Deuxième partie :Création d'un jeu de sélection vide (ssadd)
Parcours de ce jeu de sélection en mémorisant le point d'insertion du bloc,
Calcul du point le plus proche de ce point d'insertion sur l'entité "chemin"
Calcul de la distance de ce point d'insertion par rapport à l'entité "chemin"
Si cette distance est inférieure ou égale à la tolérance donnée au départ l'ename du bloc est rajoutée au jeu de sélection jeusel, sinon le programme passe au point suivant.
Et enfin : si le nombre d'entité présent dans le jeu de sélection jeusel est de 0 (zéro) affichage d'un message sinon (s'il y a des entités dans le jeu de sélection) il est mis en évidence à l'écran en mettant des grips sur les blocs.

Les améliorations à venir portent sur le fait de gérer la sélection de blocs dynamiques et d'une option permettant de choisir si la valeur de tolérance doit s'appliquer en 2D ou en 3D, actuellement c'est en 3D et si le bloc est "au-dessus" de la polyligne avec une différence en Z plus importante que la valeur de tolérance (tol) il ne sera pas inclus dans le jeu de sélection.


Et voici le code en texte (pour les copieurs)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
(defun Nom-Bloc ()
   (setq entbloc (car (entsel "\nChoix du bloc\n")))
      (if (/= "INSERT" (cdr (assoc 0 (entget entbloc))))
         (progn
            (alert "L'entité choisie n'est pas un bloc")
            (Nom-Bloc)
         )
         (cdr (assoc 2 (entget entbloc)))
      )
);fin defun
;|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|;
(defun Select-Bloc-Pol (nombloc pol tol / vlapol JeuBlocs listepoints n ecart jeusel)
   (setq vlapol (vlax-ename->vla-object pol))
   (setq JeuBlocs (ssget "_x"
   (list
      (cons 0 "INSERT")
      (cons 2 nombloc)
   )
   )
   )
(setq n 0)
(repeat (sslength JeuBlocs)
   (setq listepoints
      (append
         (list
            (list
               (cdr (assoc 10 (entget (ssname JeuBlocs n))))
               (cdr (assoc -1 (entget (ssname JeuBlocs n))))
            )
 )
listepoints
)
)
(setq n (+ 1 n))
)
(setq n -1)
(setq jeusel (ssadd))
   (repeat (length listepoints)
      (setq ptempo (car (nth (setq n (+ 1 n)) listepoints))
            ptm (vlax-curve-getClosestPointTo vlapol ptempo)
            ecart (distance ptm ptempo)
           )
(if (<= ecart tol)
(setq jeusel
   (ssadd
      (cadr (nth n listepoints))
      jeusel
     )
   )
   )
)
(if (/= (sslength jeusel) 0)
   (sssetfirst nil JeuSel)
   (alert "\nPas de jeu de sélection créé")
)
);fin de defun
;|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|;
(defun c:sel-blo-chemin ( / nombloc pol tol)
   (setq nombloc (Nom-Bloc))
   (princ (strcat "\nLe bloc choisi est : " nombloc))
   (setq pol (car (entsel "\nChoix du \"Chemin de sélection\"")))
   (setq tol (getdist
   "\nDistance maxi de l'insertion du bloc par rapport au chemin pour être sélectionné ?\n"))
(Select-Bloc-Pol nombloc pol tol)
)

 


29 mars 2019