Bonjour à tous, Merci pour vos réponses. Merci vincentp010 pour ton lisp mais lorsque je l'utilise, les blocs origines ne bougent pas, j'ai essayé avec une version ci-dessous que je me suis permis de modifer ; Retourne les sommets d'une polyline3D sous forme de liste ((x y z) (x y z))
(defun listSomP3d (pl / lst nb pts ptsl)
(setq lst (vlax-safearray->list (vlax-variant-value (vla-get-coordinates pl))))
(setq nb 0)
(while (<= nb (length lst))
(if (< (length pts) 3)
(progn
(setq pts (append pts (list (nth nb lst))))
(setq nb (+ nb 1))
)
(progn
(setq ptsl (append ptsl (list pts)))
(setq pts nil)
)
)
)
(print ptsl)
)
(defun c:proj (/ acc ss pl coords zmin zmax count blk ptins nb lst pt ptint dis zproj blkproj attr AttName)
(setvar "CMDECHO" 0)
(command "annuler" "m")
(setq acc (getvar "OSMODE"))
(setvar "OSMODE" 0)
(prompt "\nProjection de Blocs sur Polyligne 3D")
(prompt "\nSelectionner les blocs a projeter")
(setq ss (ssget))
(setq pl (car (entsel "\nPointez la polyligne 3D")))
(setq pl (vlax-ename->vla-object pl))
(if (/= (vla-get-objectname pl) "AcDb3dPolyline") (exit 1))
(setq coords (listSomP3d pl))
; Trouve l'altitude min et max de la poly3d
(setq zmin (nth 2 (nth 0 (vl-sort coords (function (lambda (e1 e2) (< (nth 2 e1) (nth 2 e2))))))))
(setq zmax (nth 2 (nth 0 (vl-sort coords (function (lambda (e1 e2) (> (nth 2 e1) (nth 2 e2))))))))
(setq count 0)
(while (< count (sslength ss))
(setq blk (ssname ss count))
(setq ptins (cdr (assoc 10 (entget blk))))
; Calcul la distance la plus courte jusqu'a la polyligne en fonction de l'altitude du point entre zmin et zmax
(setq nb zmin lst nil)
(while (< nb zmax)
(setq pt (list (car ptins) (cadr ptins) nb))
(setq ptint (vlax-curve-getClosestPointTo pl pt))
(setq dis (distance pt ptint))
(setq lst (append lst (list (list dis nb))))
; On teste tous les cm
(setq nb (+ nb 0.005))
)
(setq zproj (nth 1 (nth 0 (vl-sort lst (function (lambda (e1 e2) (< (car e1) (car e2))))))))
; Creation du nouveau bloc
(command "_copy" blk "" ptins (list (car ptint) (cadr ptint) zproj))
(entmod (subst (cons 8 "BLOC_PROJETES") (assoc 8 (entget (entlast))) (entget (entlast))))
; Modification de l'atribut altitude
(setq blkproj (vlax-ename->vla-object (entlast)))
(setq attr (vlax-invoke blkproj 'getattributes))
(foreach a attr
(setq AttName (vla-get-TagString a))
(if (= AttName "ALTITUDE") (vla-put-TextString a (rtos zproj 2 2)))
)
(setq count (+ count 1))
)
(setvar "OSMODE" acc)
(prin1)
) Il faudrait si possible sélectionner les blocs qui se trouvent à une certaine distance de l'axe 3D et non pas les sélectionner les uns après les autres, d'autre part, les blocs doivent si possible être projetés perpendiculairement à l'axe 3D avec une altitude au mm près. Bien sur si c'est possible. Je vous joins comme le conseille bryce un exemple de mon fichier plus parlant. http://www.cijoint.fr/cjlink.php?file=cj201102/cijGo2KGTY.jpg j'essaie de trouver un hébergeur gratuit de mon dwg sur lequel vous pourrait le télécharger mais en vain, je continue et je reviens vers vous Merci encore de votre aide.