Bonjour,
Un petit challenge.
Voici une solution qui en traite 13004.
On peut ajouter des positions relatives dans la liste aux milieux du code.
(vl-load-com)
; txt2z, Eleve un bloc selon le texte situé à une position relative au bloc.
; Le dessin ne doit contenir que les textes et les blocs concernés.
(defun c:txt2Z ( / acobj acdc model ltext pt ld ind pos z cpt d pr)
(prompt "\n Traitement en cours ...")
(setq acobj (vlax-get-acad-object)
acdc (vla-get-activedocument acobj)
model (vla-get-modelspace acdc)
ltext '()
cpt 0)
; Création de la liste d'association ltext '((position_relative . z) ...)
(vlax-for obj model
(if (= (vla-get-ObjectName obj) "AcDbText")
(setq pos (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj)))
ltext (append ltext (list (cons
(strcat (rtos (car pos)) "," (rtos (cadr pos))); Position plus pratique en texte.
(vla-get-textstring obj))))); Z
)
)
; Pour chaque bloc on cherche si il a une association avec la liste ltext.
(vlax-for obj model
(if (= (vla-get-ObjectName obj) "AcDbBlockReference")
(progn
(setq pt (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj)))
; Liste des positions observées.
ld '((0.5 0.15)
(0.501 0.15)
(0.5 0.151)
(0.501 0.151)
(0.499 0.15)
(0.5 0.149)
(0.499 0.149)
(0.497 0.101)
(0.496 0.105)
)
ind 0
z nil)
; Tant qu'une position ne soit trouvée ou aucune.
(while (not z)
(setq d (nth ind ld)
pr (strcat (rtos (+ (car pt) (car d))) "," (rtos (+ (cadr pt) (cadr d)))))
(if (setq z (cdr (assoc pr ltext)))
(progn
; Elévation du bloc
(vla-put-InsertionPoint obj (vlax-3d-point (list (car pt) (cadr pt) (atof z))))
; Suppression de la position dans la liste.
(vl-remove pr ltext)
(setq cpt (1+ cpt))
)
)
(setq ind (1+ ind))
(if (= ind (length ld)) (setq z T))
)
)
)
)
(princ (strcat "\n Nombre de blocs traités -> " (itoa cpt)))
)
Taper txt2z
attendre un peux ...