tonbontonton Posté(e) le 31 juillet 2019 Posté(e) le 31 juillet 2019 Bonjourj'aimerai inserer un blocs au sommet de plusieurs polylignes en une seul foisj'ai trouvé ce lisp (defun c:blp(/ n nom) (if (setq nom (getstring "\nNom du bloc : ")) (if (tblsearch "block" nom) (progn (princ "\nSélection de la polyligne") (foreach n (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car (entsel))))) (entmake (list (cons 0 "INSERT") (cons 2 nom) (cons 10 n) (cons 41 1) ; facteur echelle X = 1 (cons 42 1) ; facteur echelle Y = 1 (cons 43 1) ; facteur echelle Z = 1 (cons 50 0) ; angle de rotation = 0 )) ) ) (princ (strcat "\nBloc " nom " inconnu")) ) ) (princ) ) il marche bien mais je ne peut choisir qu'une seule polyligne a la foiset j'aimerai pouvoir selectionner toute les polyligne en une foiscomme je ni connais rien en lisp je m'en remet a vousj'ai bien essayer de modifier le code pour une selection en masse mais je ni comprend pas grand chose
hey_bapt Posté(e) le 31 juillet 2019 Posté(e) le 31 juillet 2019 Hello, je n'y connais rien en LISP, par contre ton sujet serait plus à sa place si tu l'avais émis dans la rubrique LISP du forum plutôt qu'autocad 2018.Certains membres regardent principalement certains sous forums plutôt que d'autres, et tu aurais ainsi plus de chances que quelqu'un puisse te venir en aide ! Cordialement
Elun Posté(e) le 10 septembre 2019 Posté(e) le 10 septembre 2019 Bonjour, Pour pouvoir sélectionner plusieurs polylignes à la fois, il faut passer par un jeu de sélection. Pour ça on utilise la fonction (ssget). Ici, puisque l'on veut uniquement sélectionner les polylignes, il peut être intéressant de filtrer la sélection faite par l'utilisateur pour ne conserver que les polylignes.Ensuite on parcours le jeu de sélection (composé d'une ou plusieurs polylignes) grâce à une boucle (repeat ou while). Voici ton code modifié (non testé) :(defun c:blp(/ n nom jsel i) (if (setq nom (getstring "\nNom du bloc : ")) (if (tblsearch "block" nom) (progn (princ "\nSélection des polylignes") (setq jsel (ssget (list (cons 0 "LWPOLYLINE"))) i 0 ) (repeat (sslength jsel) (foreach n (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname jsel i)))) (entmake (list (cons 0 "INSERT") (cons 2 nom) (cons 10 n) (cons 41 1) ; facteur echelle X = 1 (cons 42 1) ; facteur echelle Y = 1 (cons 43 1) ; facteur echelle Z = 1 (cons 50 0) ; angle de rotation = 0 )) ) (setq i (1+ i)) ) ) (princ (strcat "\nBloc " nom " inconnu")) ) ) (princ) ) Si tu as besoin d'explications sur le pourquoi du comment, n'hésite pas.
Elun Posté(e) le 10 septembre 2019 Posté(e) le 10 septembre 2019 Et juste pour la petite précision si tu as un nom de bloc qui possède des espaces, il faut ajouter des " au début et à la fin du nom, sinon AutoCAD comprendra la touche espace comme la touche de validation. Par exemple, si ton bloc s'appelle plan de coupe, lors de la saisie du nom il faudra écrire "plan de coupe" sinon autocad cherchera le bloc "plan".De plus, tu n'est pas obligé de respecter les majuscules/minuscules pour le nom du bloc. Voilà voilà. Après il s'agit d'un possibilité pas forcément une solution à tout les cas de figures ;p
didier Posté(e) le 10 septembre 2019 Posté(e) le 10 septembre 2019 Coucou Ce n'est pas complètement faux mais ce n'est pas juste au sens de l'explication de la gestion des espaces,carJe parle de répondre des chaînes avec espaces en réponse à GETSTRING Il suffit de mettre un T en argument juste après la fonction pour lui faire comprendre qu'il y a des espaces à prendre en compte. Je pense l'avoir explicité sur cette PAGE Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Elun Posté(e) le 10 septembre 2019 Posté(e) le 10 septembre 2019 Ah merci beaucoup pour cette précision, je ne connaissait pas la méthode des getstring pour avoir une chaîne de caractères avec des espaces (à vrai dire je n'ai encore pas eu besoin des getstring car je créé peu de commandes, plus fan des fonctions :P). Cordialement
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant