Тема: Программа замены, где то ошибка (работает не корректно через раз)

Здравствуйте
Помогите разобратся где ошибка в коде.
Есть некая программа, которая выводит пикеты в виде блока и подписывает значение в виде текста.
Данная программа выбирает все блоки с определенного слоя и в цикле перебирая тексты находящиеся на определенном слое и на определенном удалении от самого блока, заменяет их другим блоком с аттрибутом (2131) записывая отметку в виде значения атрибутного поля, при этом старый блок и текст удаляет. Если у блока на определённом растоянии не нашлось текста, этот блок удаляется. Так вот, программа работает как она хочет, я уже сломал голову в поиске ошибки. Помогите её найти, и да CAD в которой она должна работать не поддерживает VL- VLX- VLA- функции. Ссылка на yandex диск с программой, примерным файлом (piketai.dwg), вставляемым блоком и типом линии ниже.
Спасибо

https://yadi.sk/d/RZRjo1erR6kqgQ

Re: Программа замены, где то ошибка (работает не корректно через раз)

Всё, нашел сам.
Ошибка была в переборе найденых текстов, когда ни один текст не подходил по параметрам, программа зацикливалась.
выкладываю исправленный код сюда, для критики:

(defun se_lin(linva /)
(if (=(tblsearch "ltype" linva t) nil)
(command "Linetype" "L" linva "mano1001.lin" "")
(princ)
)
)

(defun se_lay1 (layva layco linva /)
(if (=(tblsearch "layer" layva t) nil)
(command "layer" "N" layva "color" layco layva "Ltype" linva layva "")
(princ)
)
)

(defun c:VA_auto_text(/)
(setvar "cmdecho" 0)
(setq sn(getvar "Osmode") spalva (getvar "CECOLOR"))
(setq 3d_taskai (ssget "x" (list (cons 8 "Rel_pik_1300_3d")(cons 0 "point"))))
(if (/= 3d_taskai nil)
   (progn      (command "erase" 3d_taskai "")(princ "\nПока 3D точки")
   )
   (progn      (Princ)
   )
) 
(setq 3d_taskai nil) 
;------------------------------------------
(setq pik_bl_sarasas (ssget "x" (list (cons 8 "1300_point")(cons 0 "insert"))))
(setq t_e (ssget "x" (list (cons 8 "1300_text")(cons 0 "text"))))
(if (and (/= pik_bl_sarasas nil) (/= t_e nil))
   (progn      (princ "\nКоличество пикетов: ")(princ (sslength pik_bl_sarasas))(princ ", Количесиво отметок: ")(princ (sslength t_e))
      (se_lin "2131")      (se_lay1 "2131" "32" "2131")      (command "-layer" "unlock" "2131" "set" "2131" "")
      (while (/= (sslength pik_bl_sarasas) 0)
         (setq enn (ssname pik_bl_sarasas 0))
         (if (/= enn nil)
            (progn (setq edata(entget enn) it_tsk(cdr (assoc 10 edata))) (setq sx (cadr it_tsk) sy (car it_tsk) zumas (list sy sx))
               (setq tekstu_sarasas (ssget "_c" (list (+ sy 0.2000)(- sx 0.7500))(list (+ sy 4.0000)(+ sx 1.0000))(list (cons 8 "1300_text")(cons 0 "text"))))
               (if (/= tekstu_sarasas nil)
                  (progn (setq tekstu_kiekis (sslength tekstu_sarasas))
                     (while (/= tekstu_kiekis 0) 
                        (setq t_enn (ssname tekstu_sarasas 0)) 
                        (if (/= t_enn nil) 
                           (progn (setq t_edata(entget t_enn))(setq t_it_tsk(cdr (assoc 10 t_edata)))(setq t_sx (cadr t_it_tsk) t_sy (car t_it_tsk))
                              (if (and (= t_sx (- sx 0.5000)) (= t_sy (+ sy 0.5000)))
                                 (progn (setq altitude (cdr (assoc 1 t_edata))) (command "insert" "2131" (list sY sX) 1 "" "" altitude)
                                    (entdel enn) 
                                    (setq pik_bl_sarasas (ssdel enn pik_bl_sarasas)) 
                                    (entdel t_enn)
                                    (setq tekstu_sarasas nil)
                                    (setq tekstu_kiekis 0)
                                 )
                                 (progn 
                                 (setq tekstu_sarasas (ssdel t_enn tekstu_sarasas)) (setq tekstu_kiekis (1- tekstu_kiekis))
                                 (if (= tekstu_kiekis 0)
                                 (progn
                                    (entdel enn) 
                                    (setq pik_bl_sarasas (ssdel enn pik_bl_sarasas)) 
                                 )
                                 (princ)
                                 )
                                 )                                 
                              ) 
                           )
                           (progn (princ)
                           )   
                        )       
                     ) 
                  )
                  (progn 
                     (entdel enn) ; trinam piketa is brezinio
                     (setq pik_bl_sarasas(ssdel enn pik_bl_sarasas)) 
                  )
               )
            )
         )       ;if {/=enn nil}{progn
      );while
   ;{taip}
   );progn
   ;{ne}
);if {/= pik_bl_sarasas nil}
(setvar "Osmode" sn)
(setvar "cmdecho" 1)
(Princ "\nСделано!")
(princ)
)