CADxp: inserer un bloc sur chaque sommet polyligne - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

inserer un bloc sur chaque sommet polyligne

#1 L'utilisateur est hors-ligne   MAC 

  • ceinture verte
  • Groupe : Membres
  • Messages : 54
  • Inscrit(e) : 02-février 05

Posté 03 février 2005 - 00:28

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.

0

#2 L'utilisateur est hors-ligne   rebcao 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 7099
  • Inscrit(e) : 25-août 04
  • LocationSELESTAT

Posté 03 février 2005 - 06:23

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 Supports de Cours AutoCAD, des Outils AutoCAD...
cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
0

#3 L'utilisateur est hors-ligne   Patrick_35 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 6381
  • Inscrit(e) : 06-janvier 03

Posté 03 février 2005 - 12:01

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
0

#4 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 03 février 2005 - 12:07

Patrick m'a devancé,

j'allais dire de voir:
http://www.cadxp.com...tXForum-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 "" "" ""))
0

#5 L'utilisateur est hors-ligne   MAC 

  • ceinture verte
  • Groupe : Membres
  • Messages : 54
  • Inscrit(e) : 02-février 05

Posté 03 février 2005 - 18:46

:D Merci les gars! z'etes vraiment sympa de répondre aussi vite.
j'ai testé c'est de la ball!.
ça change des petites macros que j'élabore avec peine dans mon petit laboratoire secret.
merci encore!
0

#6 L'utilisateur est hors-ligne   amachecou 

  • ceinture blanche
  • Groupe : Membres
  • Messages : 1
  • Inscrit(e) : 21-juillet 15

Posté 18 novembre 2015 - 11:59

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.

0

#7 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 19 novembre 2015 - 11:32

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
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)