(princ "\nСокращение PVTT от \"vertices  polyline to  table\" \"вершины полилинии в  таблицу\"")
(princ "\nДля запуска программы набери PVTT в командной строке и нажми ENTETR, после чего выбери 2D- или 3D-  полилинию.")
;(princ "\nВ нанокаде с \"рабочей\" первой строкой удобнее загрузка из редактора скриптов.")

; Ермаков В.А. 14/07/2024
;4400965@mail.ru

; Глава 06\Book01\begin_activex.lsp
; В книге: Н.Н.Полещук, П.В.Лоскутов
;"AutoLISP и Visual LISP в среде AutoCAD"
; (издательство "БХВ-Петербург", 2006)
;
; Листинг 6.1. Функция begin_activex
;
(defun begin_activex ( / )
  (vl-load-com)
  (setq acad_application (vlax-get-acad-object))
  (setq active_document (vla-get-ActiveDocument acad_application))
  (setq model_space (vla-get-ModelSpace active_document))
  (setq paper_space (vla-get-PaperSpace active_document))
); defun begin_activex
(begin_activex)

; из книги Полещука взяты функции на основе которых создана эта функция:
(defun POL-table-maker ( EVA_rows / )
;создает таблицу
(setq obj (vla-get-ModelSpace active_document))
;;; #<VLA-OBJECT IAcadModelSpace2 04e22ed4>
(vla-AddTable obj (vlax-3D-point (setq EVA_table_point (getpoint "\nУкажи точку вставки таблицы:"))) EVA_rows 4  8 70)
;;; #<VLA-OBJECT IAcadTable 04e2a1a4>
  )


(defun POL-value-to-table-cell ( EVA_table EVA_single_string EVA_column EVA_row )
;записывает значение в ячейку таблицы
(setq obj (vlax-ename->vla-object EVA_table))
;;; #<VLA-OBJECT IAcadTable 0c520bc4>
(vla-SetText obj EVA_column EVA_row  EVA_single_string)
  )

;выдает список точек 3d полилинии на основании функций из книги Полещука:
(defun POL-3dpoinnt-lst ( / )
(setq obj (vlax-ename->vla-object eva_obj_ent))
;;; #<VLA-OBJECT IAcad3DPolyline 0a999944>
(setq temp (vla-get-Coordinates obj))
;;; #<variant 8197 ...>
(setq temp (vlax-safearray->list (vlax-variant-value temp)))
  )


;создает заданный текст в заданной точке
(defun EVA_pline_poin_txt ( EVA_pt EVA_txt / )
(setq EVA_txt_lst
'(
 ;(-1 . <??? ???????: 1ff4fe27ba0>)
  (0 . "TEXT")
  ;(330 . <??? ???????: 1ff7f09f1f0>)
  ;(5 . "992")
  (100 . "AcDbEntity")
  ;(67 . 0)
  ;(410 . "Model")
  (8 . "0")
  (100 . "AcDbText")
  (10 4768.75 1906.28 0.0)
  (40 . 2.5); тут при необходимости можно поменять высоту текста 
  (1 . "??????")
  (50 . 0.0)
  (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbText") (73 . 0))
      )
;;;(entmake EVA_txt_lst)
(setq EVA_txt_lst (subst (cons 10 EVA_pt) (assoc 10 EVA_txt_lst) EVA_txt_lst))
(setq EVA_txt_lst (subst (cons 1 EVA_txt) (assoc 1 EVA_txt_lst) EVA_txt_lst))
  (entmake EVA_txt_lst)
  )
;пример (EVA_pline_poin_txt (getpoint) "TST747")


(defun 3dPlineCoordToTable ( / EVA_3d_vert_pts EVA_counter EVA_counter1 EVA_counter2 )


;1. получить список точек
(setq EVA_3d_vert_pts (POL-3dpoinnt-lst))
;получили

;2. соответственно расчитать размер таблицы и сделать ее
(POL-table-maker (+ (/ (length EVA_3d_vert_pts) 3)2))
; расчитали и создали


;3. заполнить ячейки значениями
(setq EVA_table_ (entlast))
(setq EVA_counter 0 EVA_counter2 1)
(repeat (/ (length EVA_3d_vert_pts) 3) 
(POL-value-to-table-cell EVA_table_ (rtos (nth (+ EVA_counter 0) EVA_3d_vert_pts)) (+ EVA_counter2 1) 1)
(POL-value-to-table-cell EVA_table_ (rtos (nth (+ EVA_counter 1) EVA_3d_vert_pts)) (+ EVA_counter2 1) 2)
(POL-value-to-table-cell EVA_table_ (rtos (nth (+ EVA_counter 2) EVA_3d_vert_pts)) (+ EVA_counter2 1) 3)
(setq EVA_counter (+ 3 EVA_counter) EVA_counter2 (+ EVA_counter2 1))
)

;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 0 EVA_3d_vert_pts)) 1 1)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 1 EVA_3d_vert_pts)) 1 2)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 2 EVA_3d_vert_pts)) 1 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 3 EVA_3d_vert_pts)) 2 1)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 4 EVA_3d_vert_pts)) 2 2)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 5 EVA_3d_vert_pts)) 2 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ "привет" 3 1)
;;;(POL-value-to-table-cell EVA_table_ "привет" 3 2)
;;;(POL-value-to-table-cell EVA_table_ "привет" 3 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ "привет" 4 1)
;;;(POL-value-to-table-cell EVA_table_ "привет" 4 2)
;;;(POL-value-to-table-cell EVA_table_ "привет" 4 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ "привет" 5 1)
;;;(POL-value-to-table-cell EVA_table_ "привет" 5 2)
;;;(POL-value-to-table-cell EVA_table_ "привет" строка ряд)

;4. Пронумеровать точки в таблице
(setq EVA_counter 1)
(repeat (/ (length EVA_3d_vert_pts) 3) 
(POL-value-to-table-cell EVA_table_ (rtos EVA_counter) (+ EVA_counter 1) 0)
(setq EVA_counter (+ 1 EVA_counter))
)




;5. Пронумеровать точки полилинии
(setq EVA_counter1 0)
(setq EVA_counter2 1)
(repeat (/ (length EVA_3d_vert_pts) 3)
(EVA_pline_poin_txt
  (list
  (nth (+ EVA_counter1 0) EVA_3d_vert_pts)
  (nth (+ EVA_counter1 1) EVA_3d_vert_pts)
  (nth (+ EVA_counter1 2) EVA_3d_vert_pts)
  )
  (rtos EVA_counter2)
  )
(setq EVA_counter1 (+ EVA_counter1 3))
(setq EVA_counter2 (+ EVA_counter2 1))
)

;6. Заполнить шапку
  (POL-value-to-table-cell EVA_table_ "Таблица координат вершин 3д полилинии" 0 0)
;7. Заполнить заголовки колонок
  (POL-value-to-table-cell EVA_table_ "Номер вершины" 1 0)
  (POL-value-to-table-cell EVA_table_ "Х" 1 1)
  (POL-value-to-table-cell EVA_table_ "У" 1 2)
  (POL-value-to-table-cell EVA_table_ "Z" 1 3)
    (princ "\nПрограмма по записи координат полилинии в таблицу выполнена")
  )

; пример использования (3DPLINECOORDTOTABLE)
;(princ "\nДля запуска программы набери 3dPlineCoordToTable и нажми ENTER")




; 8. дальше идея добавить 2д полилинию тоже
; сделаю функцию EVA_2d_vert_pts чтобы выдавала список вершин 2д полилинии
; создает список точек lwpline
(defun  EVA_2d_vert_pts ()
(setq eva_points_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (setq eva_2d_pline eva_obj))))


(cdr (assoc 38 eva_2d_pline))
(setq eva_points_lst_string '())
(foreach eva_n eva_points_lst
(if (= (length eva_n) 3) (setq eva_n (reverse (cdr (reverse eva_n)))))
  (setq eva_points_lst_string (append eva_points_lst_string eva_n (list (cdr (assoc 38 eva_2d_pline)))))
  )
  )
;пример вызова (EVA_2d_vert_pts)


; 9. сделаю фукнцию только для 2 д полилинии которая бы выдавала координаты вершин в табличной форме
; по сути копипастом пунктов с 1 по 7 (пронумерую их 2.1...2.7)


(defun 2dPlineCoordToTable ( / EVA_3d_vert_pts  EVA_counter EVA_counter1 EVA_counter2 )


;2.1. получить список точек
(setq EVA_3d_vert_pts (EVA_2d_vert_pts))
(princ EVA_3d_vert_pts)
;получили

;2.2. соответственно расчитать размер таблицы и сделать ее
(POL-table-maker (+ (/ (length EVA_3d_vert_pts) 3)2))
; расчитали и создали


;2.3. заполнить ячейки значениями
(setq EVA_table_ (entlast))
(setq EVA_counter 0 EVA_counter2 1)
(repeat (/ (length EVA_3d_vert_pts) 3) 
(POL-value-to-table-cell EVA_table_ (rtos (nth (+ EVA_counter 0) EVA_3d_vert_pts)) (+ EVA_counter2 1) 1)
(POL-value-to-table-cell EVA_table_ (rtos (nth (+ EVA_counter 1) EVA_3d_vert_pts)) (+ EVA_counter2 1) 2)
(POL-value-to-table-cell EVA_table_ (rtos (nth (+ EVA_counter 2) EVA_3d_vert_pts)) (+ EVA_counter2 1) 3)
(setq EVA_counter (+ 3 EVA_counter) EVA_counter2 (+ EVA_counter2 1))
)

;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 0 EVA_3d_vert_pts)) 1 1)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 1 EVA_3d_vert_pts)) 1 2)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 2 EVA_3d_vert_pts)) 1 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 3 EVA_3d_vert_pts)) 2 1)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 4 EVA_3d_vert_pts)) 2 2)
;;;(POL-value-to-table-cell EVA_table_ (rtos (nth 5 EVA_3d_vert_pts)) 2 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ "привет" 3 1)
;;;(POL-value-to-table-cell EVA_table_ "привет" 3 2)
;;;(POL-value-to-table-cell EVA_table_ "привет" 3 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ "привет" 4 1)
;;;(POL-value-to-table-cell EVA_table_ "привет" 4 2)
;;;(POL-value-to-table-cell EVA_table_ "привет" 4 3)
;;;
;;;(POL-value-to-table-cell EVA_table_ "привет" 5 1)
;;;(POL-value-to-table-cell EVA_table_ "привет" 5 2)
;;;(POL-value-to-table-cell EVA_table_ "привет" строка ряд)

;2.4. Пронумеровать точки в таблице
(setq EVA_counter 1)
(repeat (/ (length EVA_3d_vert_pts) 3) 
(POL-value-to-table-cell EVA_table_ (rtos EVA_counter) (+ EVA_counter 1) 0)
(setq EVA_counter (+ 1 EVA_counter))
)




;2.5. Пронумеровать точки полилинии
(setq EVA_counter1 0)
(setq EVA_counter2 1)
(repeat (/ (length EVA_3d_vert_pts) 3)
(EVA_pline_poin_txt
  (list
  (nth (+ EVA_counter1 0) EVA_3d_vert_pts)
  (nth (+ EVA_counter1 1) EVA_3d_vert_pts)
  (nth (+ EVA_counter1 2) EVA_3d_vert_pts)
  )
  (rtos EVA_counter2)
  )
(setq EVA_counter1 (+ EVA_counter1 3))
(setq EVA_counter2 (+ EVA_counter2 1))
)

;2.6. заполним шапку
  (POL-value-to-table-cell EVA_table_ "Таблица координат вершин 2д полилинии" 0 0)
;2.7. заполним заголовки колонок
  (POL-value-to-table-cell EVA_table_ "Номер вершины" 1 0)
  (POL-value-to-table-cell EVA_table_ "Х" 1 1)
  (POL-value-to-table-cell EVA_table_ "У" 1 2)
  (POL-value-to-table-cell EVA_table_ "Z" 1 3)
  

  
  (princ "\nПрограмма по записи координат полилинии в таблицу выполнена")
  )

; пример использования (2DPLINECOORDTOTABLE)
;(princ "\nДля запуска программы набери 2dPlineCoordToTable и нажми ENTER")

;10. Итоговый стартер программы
(defun c:PVTT ( / eva_obj )
(setq
EVA_txt_lst nil
EVA_3d_vert_pts nil
EVA_table_ nil
EVA_counter nil
EVA_counter1 nil 
EVA_counter2 nil
eva_points_lst nil
eva_obj_ent nil
eva_obj nil
EVA_table_point nil
)


  
(setq eva_obj nil)
(setq eva_obj (entget (setq eva_obj_ent (car (entsel "\nВыбери 2D- или 3D- полилинию:"))))); в оригинальных функциях заменю в функции EVA_2d_vert_pts (entget (car (entsel))) на eva_obj а в функции POL-3dpoinnt-lst (car (entsel)) на eva_obj_ent
(while (NOT eva_obj)
(setq eva_obj (entget (setq eva_obj_ent (car (entsel "\nПРОМАХ!Выбери 2D- или 3D- полилинию:")))))
)
(if (= (cdr (assoc 0 eva_obj)) "LWPOLYLINE") (2DPLINECOORDTOTABLE)
(if (= (cdr (assoc 0 eva_obj)) "POLYLINE") (3DPLINECOORDTOTABLE) (progn (alert "Это не 2д и не 3д полилиния, программы не будет выполняться.") (exit))))
;(setq EVA_table_ (car (entsel)))
(princ "EVA_table_")

(princ EVA_table_)
;(setq EVA_table_point (getpoint))
;;;(command "_.scale" EVA_table_ "" EVA_table_point 0.5)


(setq obj (vlax-ename->vla-object EVA_table_))
;;; #<VLA-OBJECT IAcadLine 0b99c6e4>
(vla-ScaleEntity obj (vlax-3D-point EVA_table_point) 0.5); тут косвенно
;можно поменять высоту текста в таблице
;0.5 - буквы будут 2.5 высотой
;1 - буквы будут 5 высотой
;2 - буквы будут 10 высотой

  
  (princ "\nПрограмма PVTT выполнена: Вершины выбранной полилинии пронумерованы, координаты вершин занесены в таблицу.")
)
;(princ "\nСокращение PVTT от vertices  polyline to  table \"вершины полилинии в  таблицу\"")
;(princ "\nДля запуска программы набери PVTT в командной строке и нажми ENTETR, после чего выбери 2D- или 3D- полилинию.")

