Aller au contenu

inserer un bloc sur chaque sommet polyligne


MAC

Messages recommandés

Hello! bonjour à tous et merci pour les précieux conseils que l'on peut glaner sur ce forum.

Voilà ma question:

Existe t'il un moyen d'inserer un bloc automatiquement sur chaque sommet d'une polyligne.

la commande diviser et mesurer n'offre pas cette option.

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Mac,

 

bienvenu sur CADxp,

 

la réponse : un programme LISP. Ne t'inquiètes pas tu fera très vite connaissance avec les experts de CADxp dans ce domaine qui ne vont pas tarder à te répondre, mais vu l'heure... il sont encore chez le marchand de sable.

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

Un petit truc vite fait, à adapter selon ses besoins

 

(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)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Patrick m'a devancé,

 

j'allais dire de voir:

http://www.cadxp.com/sujetXForum-106.htm

 

et de faire ces 3 lignes:

(setq nam_blk (getstring T "\nNom du bloc a insérer: "))

(setq l_som (GETVERTICES (car (entsel "\nChoisir la polyligne: "))))

(foreach n l_som (command "_.-insert" nam_blk n "" "" ""))

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

  • 10 ans après...

Bonjour,

 

En effet merci pour ce LISP bien efficace.

 

Est-il facilement faisable de rajouter dans le code, à la place de l'angle de rotation "0" du bloc, la rotation équivalente à la bissectrice des segments reliant le sommet. Pour le premier et dernier bloc on aurait la parallèle au seul segment reliant le sommet.

 

Egalement avec ce LISP, si le bloc comporte des attributs, ils bug. De même avec les fonctions Diviser/Mesurer, ce doit être un bug AutoCAD. Mais peut-on le corriger avec le LISP ?

 

Antoine.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour l'angle de rotation du bloc, en repartant du code de Patrick_35, on pourrait essayé ceci:

 

(defun c:blp ( / n nom nb ent vlaobj lst)
 (if (setq nom (getstring "\nNom du bloc : "))
   (if (tblsearch "block" nom)
     (progn
       (princ "\nSélection de la polyligne")
       (setq nb 0 ent (car (entsel)) vlaobj (vlax-ename->vla-object ent))
       (foreach n (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))))
         (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
                            (if (and (not (zerop nb)) (not (eq (1+ nb) (length lst))))
                              (+ (* pi 0.5) (* 0.5 (+
                                (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv vlaobj (1- nb)))
                                (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv vlaobj nb))
                              )))
                              (- (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv vlaobj nb)) (* pi 0.5))
                            )
                        )
         ))
         (setq nb (1+ nb ))
       )
     )
     (princ (strcat "\nBloc " nom " inconnu"))
   )
 )
 (princ)
)

 

Pour les attributs cela devient plus compliqué à gérer si le nom du bloc est libre. (il faut savoir le nombre d'attributs à renseigner pou celui-ci)

 

ICI, il y a un exemple de code pour un bloc bien précis (determiné dans le lisp), qui renseigne les attributs.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é