Тема: Помогите исправить ошибку в коде

Здравствуйте, уважаемый форумчане-программисты.
Не могу понять в чем ошибка. Lisp почитываю редко - когда припрет что-то облегчить.
   С горем пополам родил простенький код, с помощью которого между двумя точками посередине проставляется точка в нужном мне слое. Вроде работает, но не всегда. Толи формат отображения точек влияет, то ли регенерация чертежа. Иногда точка ставится не посередине  а на одной из выбранных точек (напомню - их по две выбираю). Сами координаты средней точки определяет правильно. Проверял через вывод на экран диалогового сообщения с координатами посередине кода.
Вот сам код:

(defun C:SPoint (/ snp nabor listt1 listt1 t1 t2 X Y X1 Y1 X2 Y2 t3)

(setq snp (getvar "Osmode")) 
(setvar "Osmode" 8) 
(setq nabor (ssget "_:L" '(( 0 . "POINT")))); imya nabora 
(setq listt1 (entget (ssname nabor 0)))
(setq listt2 (entget (ssname nabor 1)))
(setq t1 (cdr (assoc 10 listt1)))
(setq t2 (cdr (assoc 10 listt2)))

(setq X (nth 0 t1))
(setq Y (nth 1 t1))

(setq X1 (nth 0 t2))
(setq Y1 (nth 1 t2))

(setq X2 (/ (+ X X1) 2))
(setq Y2 (/ (+ Y Y1) 2))

(Setq t3 (list X2 Y2))

(command "_.layer" "_s" "2 Точки центра опор" "")
(setvar "CECOLOR" "4")
(command "_point" t3)
(command "_.layer" "_s" "0" "")
(setvar "CECOLOR" "bylayer")

(setq nabor nil)
(setvar "Osmode" snp) 
)

В перспективе хочу развить код так, что бы при выборе множества точек средние точки проставлялись везде сами между теми точками, расстояние между которыми меньше значения "2" (в моем масштабе 1:1000 меньше 2 метров). Но это пока в перспективе долгих ночей общения с Полещуком.
А пока проблема остается проблемой.

(изменено: Кулик Алексей aka kpblc, 9 ноября 2014г. 16:47:08)

Re: Помогите исправить ошибку в коде

Лучше задавать вопросы на adn-cis.org : там форум поживее будет :)
Тем не менее, как вариант (я понимаю, что использовать вариант привязки "между 2 точками не катит) для простановки "между двумя точками"

(defun c:sp1 (/ pt1 pt2 pt)
  (if (and (= (type (setq pt1 (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (ssget "_+.:S:E" '((0 . "POINT")))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           (setq pt1 (cdr (assoc 10 (entget (ssname pt1 0)))))
           (= (type (setq pt2 (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (ssget "_+.:S:E" '((0 . "POINT")))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           (setq pt2 (cdr (assoc 10 (entget (ssname pt2 0)))))
           ) ;_ end of and
    (entmakex (list (cons 0 "POINT")
                    (cons 10
                          (mapcar
                            (function
                              (lambda (a b)
                                (* (+ a b) 0.5)
                                ) ;_ end of lambda
                              ) ;_ end of function
                            pt1
                            pt2
                            ) ;_ end of mapcar
                          ) ;_ end of cons
                    (cons 8 "2 Точки центра опор")
                    ) ;_ end of list
              ) ;_ end of entmakex
    ) ;_ end of if
  ) ;_ end of defun

Если нужна фильтрация по расстояниям, то это уже совсем другая песня.

Re: Помогите исправить ошибку в коде

Спасибо работает, но выделять хотелось бы рамкой сразу две точки, по одной их не удобно выделять, для этого нужно приближать чертеж, и все таки, но в чем косяк моего кода?
Понимаю, никому не охота тестировать. Опишу еще. Когда точки далеко которые я выделяю и сливаются на экране почти в одну работает не правильно. Ставит на одну из них, а когда приближаю сильно, тогда только работает правильно как надо. Мистика какая-то... :)

Re: Помогите исправить ошибку в коде

А кто может гарантировать, что в наборе будет именно 2 точки?
P.S. Знаменитые грабли тебя не миновали :)
http://autolisp.ru/2013/12/19/command-e … -troubles/
http://forum.dwg.ru/showpost.php?p=2711 … tcount=167

Re: Помогите исправить ошибку в коде

Вот спасибо!  Теперь дошло.