Несмотря на оглушительную и справедливую критику уважаемого kpblc решил продолжить публиковать свои опусы... Поясняю позицию. Приводимые образчики процедур выдергиваются из эксплуатируемой в течение 3 лет системы обработки графики в целях землеустройства (в частности в ней реализованы функции построения и обработки теоходов, пикетов, формирования каталогов координат, описаний земельных участков, текстовых файлов координат, построения участков при импорте из текстовых файлов и т.д. Т.е. программы рабочие по определению. Очевидно, что там существуют какие-то упрощения, привязка к конкретной землеустроительной технологии, требованиям смежников (Кадастровой палаты, Земельных комитетов). Естественно, анализ моих корявых опусов маститыми КАДистами (это без иронии) позволит мне также в какой-то мере приобщиться к этому миру... А заодно - может кто-то найдет в них и рациональное зерно...
Итак, очередная коряга... (в комментариях вроде все описано) у меня работает.
С Уважением...
;; Процедура осуществляет вставку объекта (полилинии или окружности) в узлы другой полилинии
;; (например столбы их центрами в узлы полилинии, описывающей ЛЭП). Для корректного определения
;; центра (базовой точки) вставляемого объекта необходимо, чтобы вставляемая полилиния была
;; замкнутой (если она должна быть замкнута по определению), т.е. при рисовании столба-образца его необходимо
;; замкнуть командой CLOSE, либо отрисовать его многоугольником.
;; Суть задачи: имеется полилиния, в узлы которой необходимо втюхать однотипные объекты - любые
;; полилинии или окружности. На чертеже создается втюхиваемый образец ( в принципе любая полилиния)
;; и далее он программно центрируется и вставляется в узлы исходной полилинии.
;; Для чего ? Земельщики возможно догадаются.
(defun ktif-kadastr::insert-objekt ( / ENAME NUMBER PREFIX
A a1 B NBL PL PLO PLO1 N TORMOZ, NUMERAZ
x0 y0 t0 ts tn tnac dalse xnac ynac xn yb xs ys sppr b1 n1
coor nc out-lst st-pnt end-pnt xs-pnt ys-pnt xe-pnt ye-pnt pang pangi ugpov
stn-pnt endn-pnt clos delta)
;; Выбор блока для вставки
;; Отмена выравнивания
(COMMAND "OSNAP" "OFF")
(prompt "\nВыберите объект для вставки...")
(setq a1 (ssget))
(setq a1 (ssname a1 0))
(setq b (entget a1)) ;; Определение объекта
(if (= (cdr (nth 1 b)) "CIRCLE") ;; Если объект окружность то проще
(progn
;; Поиск центра окружности
(setq n 0)
(while (< n (length b)) ;; Цикл по полилинии
(setq b1 (nth n b))
(if (= 10 (car b1)) ;; Если запись координат
(progn
(setq t0 (cdr b1)) ;; t1 - координаты угла
;; (setq t0 (list (abs (car t0)) (abs (cadr t0)))) ;; положительные координаты вставки
(setq t1 (list (car t1) (cadr t1))) ;; координаты вставки Если использовать это - то расставятся блокив узлах с отрицательными коорд.
) ; End Progn
) ; End if
(setq n (1+ n))
) ; End while
); End Progn
); End if
(if (= (cdr (nth 1 b)) "LWPOLYLINE") ;; Если объект полилиния (любой многоугольник)
;; Поиск центра многоугольника (базовой точки)
(progn
(setq dalse 0)
(setq tnac 0)
(setq tn 0)
(setq ts 0)
(setq xnac 0)
(setq ynac 0)
(setq xn 0)
(setq yn 0)
(setq xs 0)
(setq ys 0)
(setq n 0)
(setq x0 0)
(setq y0 0)
(setq n1 0)
(while (< n (length b)) ;; Цикл по полилинии
(setq b1 (nth n b))
(if (= 10 (car b1)) ;; Если запись координат
(progn
(if (= n1 0) ;; для первой точки
(progn
(setq tnac (cdr b1)) ;; координаты первой точки
(setq xnac (car tnac))
(setq ynac (cadr tnac))
(setq x0 (+ x0 (car tnac)))
(setq y0 (+ y0 (cadr tnac)))
(setq n1 (1+ n1))
); end progn
); End if
(setq tn (cdr b1))
(setq xn (car tn))
(setq yn (cadr tn))
(if (/= dalse 0) ;; для последующих точек
(progn
(if (or (and (/= xn xnac) (/= yn ynac)) (and (/= xn xs) (/= yn ys))) ;; если координаты не равны первой или предыдущей
(progn
(setq x0 (+ x0 (car tn)))
(setq y0 (+ y0 (cadr tn)))
(setq n1 (1+ n1))
);end progn
); End if
); end progn
); end if
(setq ts tn)
(setq xs (car ts))
(setq ys (cadr ts))
(setq dalse 1)
) ; End Progn
) ; End if
(setq n (1+ n))
) ; End while
(setq x0 (/ x0 n1))
(setq y0 (/ y0 n1))
(setq t0 (list x0 y0))
); End Progn
)
;End if
;; Конец выбора объекта для вставки
(prompt "\nВыберите полилинию ...")
(setq pl (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
(setq pl (ssname pl 0))
(setq plo (entget pl)) ;; Определение полилинии
;; Конец выбора полилинии
;; Формируем спосок координат coor
(setq n (length plo))
(setq nc 0)
(setq out-lst nil)
(setq coor nil)
(while (< nc n)
(setq plo1 (nth nc plo))
(if (= 10 (car plo1)) ;; Если запись координат
(progn
(setq t1 (cdr plo1)) ;; t1 - координаты вставки
;; (setq t1 (list (abs (car t1)) (abs (cadr t1)))) ;; положительные координаты вставки
(setq t1 (list (car t1) (cadr t1))) ;; координаты вставки Если использовать это - то
(setq coor (cons t1 coor))
);end progn
);end if
(setq nc(1+ nc))
);end while
(setq coor (reverse coor))
;; Конец формирования списка координат
;; На основании списка координат определяем координаты вставки, угол поворота объекта и втюхиваем объект в узел
;; (поворачиваем, копируем и разворачиваем назад)
(setq n (length coor))
(setq nc 0)
(while (< nc (- n 1))
(setq st-pnt (nth nc coor)
nc (1+ nc)
end-pnt (nth nc coor)
xs-pnt (car st-pnt)
ys-pnt (cadr st-pnt)
xe-pnt (car end-pnt)
ye-pnt (cadr end-pnt)
pang (ktif-geo:position-angle st-pnt end-pnt)
pangi (ktif-geo:position-angle end-pnt st-pnt)
) ;_ end setq
;; Анализ четверти и определение приращения
(setq delta 0)
(if (= xe-pnt xs-pnt)
(setq delta (- (/ pi 2)))
); end if
(if (and (> xe-pnt xs-pnt) (> ye-pnt ys-pnt)) ;; первая четверть
(setq delta 0)
); end if
(if (and (> xe-pnt xs-pnt) (< ye-pnt ys-pnt)) ;; вторая четверть
(setq delta (/ pi 2))
); end if
(if (and (< xe-pnt xs-pnt) (< ye-pnt ys-pnt)) ;; третья четверть
(setq delta pi)
); end if
(if (and (< xe-pnt xs-pnt) (> ye-pnt ys-pnt)) ;; четвертая четверть
(setq delta (* 1.5 pi))
); end if
(if (= ye-pnt ys-pnt)
(setq pang (+ 0 delta))
(setq pang (+ (atan (/ (abs (- xe-pnt xs-pnt)) (abs (- ye-pnt ys-pnt)))) delta))
); end if
;; конец определения приращения
(setq t1 (list xs-pnt ys-pnt))
(setq ugpov (+ (* (/ 180 pi) pang) 90))
;; Разворот выбранного объекта
(command "rotate" a1 "" t0 ugpov)
;; Копирование объекта куда нужно ( в узел полилинии)
(command "copy" a1 "" t0 t1) ;; Вставка выбранного объекта в координаты узла полилинии с центром в качестве базовой точки
;; Разворот объекта в исходное положение
(command "rotate" a1 "" t0 (- 0 ugpov))
) ; End while
;; Конец определения углов поворота и копирования
;; Включение выравнивания
(setq a1 nil)
(COMMAND "OSNAP" "CENTER,NODE")
); End defun