Всем привет!
Первая задача: разбить парные объекты на эти самые пары. Критерием парности была зависимость их координат. Т.е. возле каждой точки на некотором отступе
dX и
dY находится текст.
(if (setq
nabor
(ssget
"_:A"
(list
(cons 0 "POINT,TEXT")
)
)
)
(progn
(setq nabor (mapcar 'vlax-ename->vla-object
(vl-remove-if
'listp
(mapcar 'cadr
(ssnamex nabor)
)
)
)
)
(foreach item nabor
(if (= (vla-get-objectname item) "AcDbText")
(setq text_list
(cons
(list
(3D->2D
(vlax-safearray->list
(vlax-variant-value
(vla-get-InsertionPoint item)
)
)
)
item
)
text_list
)
)
(setq point_list
(cons
(list
(3D->2D
(vlax-safearray->list
(vlax-variant-value
(vla-get-coordinates item)
)
)
)
item
)
point_list
)
)
)
)
(foreach item point_list
(setq koord (car item))
(if (setq text (assoc (list (+ (car koord) d_x)
(+ (cadr koord) d_y)
)
text_list
)
)
(progn
(setq par_list
(cons
(list
koord
(cadr item)
(cadr text)
)
par_list
)
)
(setq text_list (vl-remove text text_list))
)
)
)
)
)
Работает очень быстро, но оказалось что у некоторых пар
dX и
dY имеют незначительно отличаются, и не ловятся
assoc'ом
Попробовал округлить координаты, тоже быстро работает, но и тут нашлись исключения:
при округлении до
0,001 скажем таких чисел
125,5554 и
125,5556 получаем
125,556 и
125,555 Т.е. хоть они и рядом но
asooc на них опять не проходит
Но есть у нас замечательная функция
equal меняем
(if (setq text (assoc (list (+ (car koord) d_x)
(+ (cadr koord) d_y)
)
text_list
)
)
на
(if (setq text
(car
(vl-remove-if
'not
(mapcar
(function
(lambda (x)
(if
(and
(equal (caar x)(+ (car koord) d_x)0.1)
(equal (cadar x)(+ (cadr koord) d_y)0.1)
)
x
)
)
)
text_list
)
)
)
)
Теперь работает корректно, но долго...
Вопрос: как бы это ускорить?
Вторая задача: сравнить углы, тоже с определённым допуском.
Тут как бы объёмы не большие,
equal справляется быстро, но опять, скажем при допуске в 3° имеем между углами 1° и 359° всего 2° т.е. как бы удовлетворяют условие, но естественно
(equal 1 359 3) вернёт
nil вариант писать:
(or
(equal a b 3)
(equal (+ a 360) b 3)
(equal a (+ b 360) 3)
)
Как-то не красиво выглядит...