Hello @nen
Voici une superbe routine "BLP" de notre regrette Patrick_35 qui insere un Bloc (sans ou avec Attributs = remplis par la valeur par defaut)
sur les Extremites OU sur chaque Vertex / Sommet des LWPOLYLINE, POLYLINE, ARC, LINE ...
Je pense que cette routine devrait etre amelioree pour correspondre a tes besoins !?
Bye, lecabe
;;
;; http://cadxp.com/topic/4615-inserer-un-bloc-sur-chaque-sommet-polyligne/page__pid__237625
;;
;; Routine: BLP par P35 v3.10 - 03/02/2005 - Forum AutoCAD 2000-2002
;;
;; Inserer un Bloc sur le sommet de chaque Polyligne
;;
;; NOTE : faire tourner sans doute AVANT avec : ATTREQ = 0 & ATTDIA = 0 --> Pas besoin
;; Ainsi les eventuels attributs auront leurs valeurs par defaut ... --> Pas besoin
;; Remettre sans doute APRES : ATTREQ = 1 & ATTDIA = 1 --> Pas besoin
;;
;; BLP v2.00 par P35 : Ajout de la question en debut de lisp (suivant message du 28/08/2018) par mail perso
;;
;; v2.00 - Traite : Polylignes 2D (NON-Splinees/NON-Curvees) / 3D (Splinees ou NON) et Lignes
;;
;; v2.00 - ATTENTION sur Polylignes 2D/3D Closes : Double Insertion du Bloc
;;
;; v3.00 par P35
;; Salut - Le Lisp modifie... Par contre, je ne sais pas comment traiter un arc ou une ellipse
;; J ai quand meme fait quelque chose. Redis-moi, Amicalement
;;
;; v3.10 par P35 : Ellipses non traitees - Corrections de qq Micro-Bugs
;;
(vl-load-com)
(defun c:BLP (/ doc nb ent lst nom opt pts rot sel tot ajout)
(defun ajout(/ ang)
(if rot
(setq ang 0)
(setq ang (if (and (not (zerop nb)) (not (eq (1+ nb) tot)))
(+ (* pi 0.5) (* 0.5 (+
(angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv ent (1- nb)))
(angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv ent nb))
)))
(- (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv ent nb)) (* pi 0.5))
)
)
)
(setq ang 0) ;; Angle = ZERO Micro-Modif par Patrice
(vla-insertblock (if (eq (getvar "cvport") 2)
(vla-get-modelspace doc)
(vla-get-paperspace doc)
)
(vlax-3d-point pts)
nom
1 1 1 ; facteur echelle X Y Z
ang
)
)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(initget "E V")
(or (setq opt (getkword "\nBloc aux Extremites (depart/arrivee) ou a chaque Vertex [E/V] <E> : "))
(setq opt "E")
)
(and (setq nom (getstring "\nNom du Bloc : "))
(tblsearch "block" nom)
(ssget (list (cons 0 "LWPOLYLINE,POLYLINE,LINE,ARC"))) ;; Entites TRAITEES
(progn
(vlax-for ent (setq sel (vla-get-activeselectionset doc))
(setq nb 0 lst nil rot nil)
(cond
((eq (vla-get-objectname ent) "AcDbLine")
(setq lst (list (vlax-curve-getstartpoint ent) (vlax-curve-getendpoint ent))
nb 2
)
)
((eq (vla-get-objectname ent) "AcDbArc")
(setq lst (list (vlax-curve-getstartpoint ent) (vlax-curve-getendpoint ent))
rot T
nb 2
)
)
(T
(while (setq pts (vlax-curve-getpointatparam ent nb))
(setq lst (cons pts lst)
nb (1+ nb)
)
)
)
)
(setq tot (1- nb) nb 0)
(while (setq pts (nth nb lst))
(cond
((or (eq nb 0) (and (eq opt "V") (< nb tot)))
(ajout)
)
((eq nb tot)
(if (vlax-property-available-p ent 'closed)
(and (eq (vla-get-closed ent) :vlax-false)
(ajout)
)
(ajout)
)
)
)
(setq nb (1+ nb))
)
)
(vla-delete sel)
)
)
(vla-endundomark doc)
(princ)
)