Aller au contenu

bloc au sommet des polyligne


tonbontonton

Messages recommandés

Bonjour

j'aimerai inserer un blocs au sommet de plusieurs polylignes en une seul fois

j'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 fois

et j'aimerai pouvoir selectionner toute les polyligne en une fois

comme je ni connais rien en lisp je m'en remet a vous

j'ai bien essayer de modifier le code pour une selection en masse mais je ni comprend pas grand chose

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Ce n'est pas complètement faux mais ce n'est pas juste au sens de l'explication de la gestion des espaces,car

Je 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

Lien vers le commentaire
Partager sur d’autres sites

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

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é