Aller au contenu

[Résolu] Sélectionner uniquement un bloc


Messages recommandés

Posté(e)

Bonjour à tous, et excellente année à vous.

 

Voilà, je cherche à faire une petite routine qui a besoin que l'utilisateur sélectionne un bloc nommé "PTTOPO". J'aimerais faire une boucle qui attend la bonne sélection de ce bloc.

 

J'ai déjà écris ça mais je tourne en rond...

 

;;; Sélectionner uniquement le bloc "PTTOPO"
(defun c:testSelectPTTOPO ()
 (while ((/= (cdr
               (assoc 2 (entget (car (setq Txt_Alti (entsel "\nSélectionnez le bloc contenant l'altitude :")))))
             ) ;_ Fin de cdr
             "PTTOPO"
         ) ;_ Fin de /=
        )
 ) ;_ Fin de while
 (setq Txt_Alti (car Txt_Alti))
 (setq Alti (getpropertyvalue Txt_Alti "ALT"))
 (princ "\nAlti : ")
 (princ Alti)
 (setq Coord (cdr (assoc 10 (entget Txt_Alti))))
 (princ "\nCoord : ")
 (princ Coord)
 (princ)
) ;_ Fin de defun

 

AutoCAD me répond toujours la même chose, que je sélectionne le bon bloc ou une autre entité :

Sélectionnez le bloc contenant l'altitude :no function definition: niltype d'argument incorrect: VLA-OBJECT nil

Commande:

 

Si quelqu'un a une astuce, un conseil... je suis preneur...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

 

En général on fait une boucle (while (not ...)) dont on ne peut sortir qu'une fois la conditions remplie ou en faisant Echap ce qui met fin à l'exécution de la routine.

Le plus souvent, comme il y a plusieurs conditions et qu'il est préférable de les tester une après l'autre pour éviter une erreur (par exemple : (entget nil) si l'utilisateur a cliqué dans le vide), on préfère mettre les conditions dans une expression (and ...) qui retournera ni à la première condition non remplie.

 

(while
 (not
   (and
     (setq Txt_Alti (car (entsel "\nSélectionnez le bloc contenant l'altitude : ")))
     (= (cdr (assoc 0 (setq dxf (entget Txt_Alti)))) "INSERT")
     (= (cdr (assoc 2 dxf)) "PTTOPO")
   )
 )
)
(setq Alti (getpropertyvalue Txt_Alti "ALT"))
...

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

Posté(e)

Salut (gile) et merci pour cette réponse.

 

C'est exactement ça. C'est vrai que, vu comme ça, c'est bien plus clair et efficace...

 

Merci encore...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Encore une petite question, si je mets dans la condition "TEXT,MTEXT", celà fonctionnerait-il ?

 

Car je boucle avec ça :

;;; Sélectionner uniquement le bloc "PTTOPO"
(defun c:testSelectText ()
 (while (not (and (setq Txt_Prof (car (entsel "\nSélectionnez le texte ou la profondeur :")))
                  (= (cdr (assoc 0 (entget Txt_Prof))) "MTEXT")
             ) ;_ Fin de and
        ) ;_ Fin de not
 ) ;_ Fin de while
 ;(setq Txt_Alti (car Txt_Alti))
 (setq Prof (cdr (assoc 1 (entget Txt_Prof))))
 (princ "\nProf : ")
 (princ Prof)
 (setq Coord (cdr (assoc 10 (entget Txt_Prof))))
 (princ "\nCoord : ")
 (princ Coord)
 (princ)
) ;_ Fin de defun

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Ok, j'ai trouvé, il fallait placer un (or :

;;; Sélectionner uniquement le bloc "PTTOPO"
(defun c:testSelectText ()
 (while (not
          (and (setq Txt_Prof (car (entsel "\nSélectionnez le texte ou la profondeur :")))
               (or (= (cdr (assoc 0 (entget Txt_Prof))) "MTEXT") (= (cdr (assoc 0 (entget Txt_Prof))) "TEXT"))
          ) ;_ Fin de and
        ) ;_ Fin de not
 ) ;_ Fin de while
 ;(setq Txt_Alti (car Txt_Alti))
 (setq Prof (cdr (assoc 1 (entget Txt_Prof))))
 (princ "\nProf : ")
 (princ Prof)
 (setq Coord (cdr (assoc 10 (entget Txt_Prof))))
 (princ "\nCoord : ")
 (princ Coord)
 (princ)
) ;_ Fin de defun

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut VDH-Bruno, et merci pour ton aide.

 

Je n'aurais jamais pensé à ça...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Re,

 

A tout hasard, par le passé quant j'avais ce type de besoin à savoir "récupérer en AutoLisp la valeur d'un texte par sélection", j'avais tendence à préférer nentsel à entsel cela étend la portée de la fonction aux entités textes contenue dans des entités complexes (tel que les attributs de blocs ou les cellules des entités tableaux),après il suffit seulement de modifier le "pattern" de la fonction wcmatch

 

(wcmatch  (cdr (assoc 0 (entget Txt_Prof))) "*TEXT,ATTRIB")

 

A+

Apprendre => Prendre => Rendre

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é