Jump to content

inserer un bloc sur chaque sommet polyligne


Recommended Posts

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.

 

Link to post
Share on other 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 @)

Link to post
Share on other 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

Link to post
Share on other 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

Link to post
Share on other sites
  • 10 years later...

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.

Link to post
Share on other 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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...