ПРОГРАММЫ на AutoLISP/Visual LISP
Меню
статистика
Приветствую Вас, Гость · 25.04.2024, 23:23

Коды на AutoLISP/VisualLISP, DCL для AutoCad

Коды рабочие, размер не позволяет выложить полностью, поэтому

пишите мне на почту divash@yandex.ru, пришлю полные листинги.

Очень полезные "лайфхаки" для проектирования мебели в Автокаде.

1. Программа автоматического создания таблиц Спецификации в  AutoCad и одновременно в Excel

Для пояснения работы программы, сделал несколько Print Screen своего монитора. Для примера использую тумбу с фасадом, как вы понимаете, программа будет работать с любой мебелью.

Это может быть шкаф из МДФ со шпоном, стол из натурального дерева, буфет из массива, резной шкаф и т. д.

На первой картинке, тумба - вид с разделёнными частями и открытое диалоговое окно "Создание таблицы спецификации в Автокад".

Открытие диалога происходит по нажатию кнопки, ни каких дополнительных действий не нужно.

В диалоге можно задать номер изделия (мебели) в зависимости от объекта. Нажимаем копку "ОК" и переходим к выбору деталей.

диалоговое окно DCL

Смотрим вторую картинку. Конструктор выбирает детали тумбы из дерева, или части шкафа ручной работы - все рамкой или по одной.

Количество деталей не ограничено.

Пробовал составлять таблицы из более 200 строк.

выбор деталей в автокаде

Через секунду  программа выдаёт результат - таблицу, которую видно на третьей картинке.

Каждой детали присваивается номер и размеры деталей заносятся в таблицу.

Если деталь подходит под стандартную толщину МДФ, то происходит определение МДФ (не важно со шпоном или без).

Происходит подсчёт площади листовых материалов МДФ, фанеры.

таблица в автокаде

Одновременно в Excel. также создаётся таблица. При этом открытия Excel. не требуется.

На четвёртой картинке открыта таблица Excel.

В таблице автоматически происходит сортировка по толщинам МДФ и подсчёт общих затрат листовых материалов.

таблица в excel

;;Программа для создания таблицы Спецификация в AutoCAD и Excel.
;;на языке AutoLISP\Visual LISP,с применением технологии ActiveX и DCL.

;;Конструктор мебели выбирает детали (3D тела) в пространстве Модели, далее 
;;программа присваивает номер каждой детали из выбранной сборки. 
;;Вычисляются габаритные размеры каждой детали. Создает таблицу с занесением номера и
;;размеров (длина, ширина, толщина). Считает площадь и толщину МДФ.
;;Автоматически создаётся таблица Excel, открытие файла Excel не нужно.
;;В сводной таблице программа сортирует детали мебели по стандартной толщине МДФ.

;; Автор: Шинин Дмитрий, 2020
;;Замечания и предложения по адресу divash@yandex.ru

;; Глобальные переменные:
;;  acad_object - VLA-объект программы AutoCAD;
;;  active_document - VLA-объект активный документ AutoCAD;
;;  model_space - VLA-объект пространства модели чертежа;
;; vla_obj - VLA-объект 3D тела
;; vla_obj_5
;; vla_obj_4
;; tbl

(defun c:mp_spec1
          (/ old_osm old_echo 3DSOLID_lst cout_3DSOLID_lst
           count_str_excel count_tel_n count_tel detal_lst name_obj
           p_obj p_obj_1 p_obj_0 p_obj_4 p_obj_5 p_obj_9 k count_line
           detal_lst_sum detal_nomer ob_nomer_str cancel1 to detal_mdf
           pt0 X1 Y1 Z1    X2 Z2 X3 Y3 Z3 pmin pmax detal_mdf mdf MDFl2
           MDFshl2 MDFtol2 MDFtoshl2 ncolumns widths types ugol    msp
           hcell   nlines i j q    val
          ) ;_  end /

    (vl-load-com)                        ; Подгрузка библиотек, обеспечивающих работу с ActiveX
    (setq acad_object (vlax-get-acad-object))
    (setq active_document (vla-get-activedocument acad_object))
    (setq model_space (vla-get-modelspace active_document))
    ;;----------------------------------------------------------------------------

    (vla-startundomark active_document)                ; начало группы отмены

    (setq cancel1 0)
    (setq to 1)                            ; коэффициент умножения для склейки МДФ

    (lispru_0-spec)                        ;вызов и обработка главного диалога

    (if    (= cancel1 1)                        ; отмена программы по Cancel
    (progn
        (princ "отмена программы по Cancel")
        (vl-exit-with-error msg)

    ) ;_  end progn
    ) ;_ конец if

(setq ncolumns      9                        ; количество столбцов в будущей таблице спецификации, задаю 9 столбцов
      hcell      8.0
      hlet      5.0
      ugol      (/ (* (atof "-45") Pi) 180)
      scalefactor (fix (atof scalefactor)) ; масштаб таблиц, из диалога
) ;_ конец setq

    (setq old_echo (getvar "CMDECHO"))                ; Отключение эхо-вывода
    (setvar "CMDECHO" 0)

    (setvar "regenmode" 0)                    ; Отключение регенерации

    (setq old_osm (getvar "osmode"))                ; сохраняю привязки включенные пользователем и отключаю все привязки
    (setvar "osmode" 0)
    (command "_.UCS" "_w")                    ;установка МСК

    (setq 3DSOLID_lst 0 cout_3DSOLID_lst 0) ;обнуление счетчика
                     
    (setq 3DSOLID_lst                        ;Сохраним выбранные тела в списке 3DSOLID_lst
         (vl-remove-if
         'listp
         (mapcar 'cadr
             (ssnamex (ssget (list (cons 0 "3DSOLID"))))
         ) ;_ конец mapcar
         ) ;_ конец vl-remove-if
    ) ;_ конец setq

    (setq count_tel (length 3DSOLID_lst))  ;количество выбранных тел, количество строк в таблицах  
    (setq count_tel_old
         (vlax-ldata-get
         model_space
         "count_tel_old"
         ) ;_ конец vlax-ldata-get
    ) ;_ конец setq

    (if    (= tcou 1)
    (progn (setq count_tel_n 1) (setq count_tel_old 0))

    (setq count_tel_n (1+ count_tel_old))
                                ;прибавляем цифру к номеру каждой детали, для преественности сводной таблицы
    ) ;_ конец if

    (vlax-ldata-put
    model_space;сохранение в словаре, по ключу - count_tel_old
    "count_tel_old"
    (setq count_tel_old (+ count_tel count_tel_old))
    ) ;_ конец vlax-ldata-put

    (setq cout_3DSOLID_lst (1- count_tel));счетчик по количеству выбранных тел в сборке                                

    (while (>= cout_3DSOLID_lst 0)                ; начало основного цикла формирования списка спецификации для каждого тела
                                ;(номер детали , длина, ширина, толщина)
    (setq detal_lst nil)                    ; список спецификации для каждого тела (номер-длина-ширина-толщина-количество)

    (setq detal_lst (list 1))                ;количество одинаковых деталей - всегда равно 1

    (3DSOLID_gab);;; вызов функции определения габаритов 3D тела
    ;;----------------------------------------------------------------------------

    ;;рисую выноску с номером детали

    (setq vla_obj_4    (vla-AddLine
                model_space
                (vlax-3D-point p_obj_0)
                (vlax-3D-point p_obj_2)
            ) ;_  end vla-AddLine
    ) ;_  end setq
    (setq vla_obj_5    (vla-AddText
                model_space
                (nth 0 detal_lst) ;результативный номер детали
                (vlax-3D-point p_obj_2) ; точка вставки       
                24                    ; высота текста выноски
            ) ;_ конец vla-AddText
    ) ;_ конец setq

    ;; поворот выноски и текста и таблицы на 90 градусов
    (vla-Rotate3D
        vla_obj_4
        (vlax-3D-point p_obj_0)
        (vlax-3D-point p_obj_4)
        (/ Pi 2)
    ) ;_  end vla-Rotate3D
    (vla-Rotate3D
        vla_obj_5
        (vlax-3D-point p_obj_0)
        (vlax-3D-point p_obj_4)
        (/ Pi 2)
    ) ;_  end vla-Rotate3D

    ;; поворот выноски и текста  на UGOL градусов
    (setq Z2 (+ Z1 5000))
    (setq p_obj_9 (list X1 Y1 Z2))
    (vla-Rotate3D
        vla_obj_4
        (vlax-3D-point p_obj_0)
        (vlax-3D-point p_obj_9)
        ugol
    ) ;_  end vla-Rotate3D
    (vla-Rotate3D
        vla_obj_5
        (vlax-3D-point p_obj_0)
        (vlax-3D-point p_obj_9)
        ugol
    ) ;_  end vla-Rotate3D

    (setq count_tel_n (1+ count_tel_n));увеличение номера детали
                                
    (setq cout_3DSOLID_lst (1- cout_3DSOLID_lst)) ;уменьшение счетчика
                               

    ) ;_ конец while (основной цикл)

    ;;----------------------------------------------------------------------------

    (setq nlines count_tel)                    ; количество строк в будущей таблице спецификации
                               
    (setq table_items ; в table_items задаём ширину  столбцов таблицы, переменные и названия столбцов
         '((70.0 55.0 40.0 40.0 40.0 30.0 60.0 35.0 30.0)
           ("str" "str" "int" "int" "int" "int" "str" "int" "str")
           ("№ детали" "Наименование" "Длина, мм" "Ширина, мм" "Толщина, мм"
        "Кол-во" "Материал" "Площадь, кв.м" "Лист№"
           )

          )
    ) ;_  end setq

    (setq pt0 p_obj_0)                        ; точка вставки левого верхнего угла таблицы

    ;; Список ширин колонок и список типов данных
    (setq widths (nth 0 table_items)
      types     (nth 1 table_items)
    ) ;_ конец setq

    (setq msp (vla-get-ModelSpace
          (vla-get-activeDocument (vlax-get-acad-object))
          ) ;_ конец vla-get-ModelSpace
    ) ;_ конец setq

    ;; Создание стандартной таблицы с колонками равной ширины
    (setq tbl (vla-AddTable
          msp
          (vlax-3d-point pt0)
          (+ 2 nlines)
          ncolumns
          hcell
          (car widths)
          ) ;_ конец vla-AddTable
    ) ;_ конец setq
    ;; поворот таблицы на UGOL градусов
    (setq Z2 (+ Z1 5000))
    (setq p_obj_9 (list X1 Y1 Z2))
    (vla-Rotate3D
    tbl
    (vlax-3D-point p_obj_0)
    (vlax-3D-point p_obj_9)
    ugol
    ) ;_  end vla-Rotate3D

    ;; Корректировка ширин столбцов
    (setq i -1)
    (repeat ncolumns
    (setq i (1+ i))
    (vla-SetColumnWidth tbl i (nth i widths))
    ) ;_ конец repeat

    ;; Заголовок таблицы                                      
    (vla-SetTextHeight tbl acTitleRow hlet)            ; Высота букв                      
    (vla-SetText tbl 0 0 "Спецификация")            ; Текст

    ;; Заголовки колонок                                      
    (vla-SetTextHeight tbl acHeaderRow hlet)            ; Высота букв
    (setq headers (nth 2 table_items)
      i      -1
    ) ;_ конец setq
    (repeat ncolumns
    (setq i (1+ i))
    (vla-SetText tbl 1 i (nth i headers))
    ) ;_ конец repeat

    ;; Вписывание элементов таблицы
    (vla-SetTextHeight tbl acDataRow hlet)            ; Высота букв
    (setq j 2)
    (setq q 0)
    (setq detal_lst_sum (reverse detal_lst_sum))
    
    (repeat count_tel

    (setq table_items1 (nth q detal_lst_sum))
    (setq j    (1+ j)
          i    -1
          q    (1+ q)
    ) ;_ конец setq
    (repeat    ncolumns

        (setq i   (1+ i)
          val (nth i table_items1)
        ) ;_ конец setq
        (if    (= "str" (nth i types))
        (progn
            (vla-SetText tbl (1- j) i val)
            (vla-SetCellAlignment
            tbl
            (1- j)
            i
            acBottomCenter
            ) ;_ конец vla-SetCellAlignment
                                ; Выравнивание в ячейке по центру
        ) ;_ конец progn
        (progn
            (vla-SetText tbl (1- j) i (rtos val 2 2))
            (vla-SetCellAlignment
            tbl
            (1- j)
            i
            acBottomRight
            ) ;_ конец vla-SetCellAlignment
                                ; Выравнивание в ячейке
        ) ;_ конец progn
        ) ;_ конец if
    )                            ;repeat ncolumns

    )                                ;repeat по количеству выбранных деталей

                                
    (vla-Move tbl (vlax-3D-point pmin) (vlax-3D-point pmax));реальная точка вставки таблицы   
    (vla-ScaleEntity tbl (vlax-3D-point pmax) scalefactor)
    (redraw)
    
    ;;----------------------------------------------------------------------------
    (my_remove)  ;; вызов сортировка по толщине МДФ
    ;;----------------------------------------------------------------------------

    ;;----------------------------------------------------------------------------
    (writeex14_com    ;; Вызов программа COM-связи AutoCAD - Excel
    "C:\\Users\\Дмитрий\\Desktop\\MyLisp\\Спецификация_2" ; место нахождения файла Excel  
    "Спецификация"                        ; название листа Excel
    ) ;_ конец writeex14_com
    ;;----------------------------------------------------------------------------

    (if    (and vla_obj_5 (not (vlax-object-released-p vla_obj_5))) ; освобождение VLA объектов   
    (vlax-release-object vla_obj_5)
    ) ;_ конец if
    (if    (and vla_obj_4 (not (vlax-object-released-p vla_obj_4))); освобождение VLA объектов    
    (vlax-release-object vla_obj_4)
    ) ;_ конец if
    (if    (and tbl (not (vlax-object-released-p tbl))) ; освобождение VLA объектов   
    (vlax-release-object tbl)
    ) ;_ конец if
    (if    (and vla_obj (not (vlax-object-released-p vla_obj))); освобождение VLA объектов        
    (vlax-release-object vla_obj)
    ) ;_ конец if

    ;;----------------------------------------------------------------------------  
    (command "_.UCS" "_w")                    ;возврат в МСК                  
    (setvar "CMDECHO" old_echo)                    ;восстановление режима эхо-вывода
    (setvar "regenmode" 1)                    ; включение регенерации
    (setvar "osmode" old_osm)                    ;включаю привязки
    (setq old_osm nil)
   
    (gc) ;; Сборка мусора

    (vla-endundomark active_document)                ; окончание группы отмены

)                                ; end_defun c:mp_spec1

;;----------------------------------------------------------------------------
;; функция определения габаритов 3D тела, подсчёт площади материалов
;;----------------------------------------------------------------------------

;;===============================================================================================
;;пересечение списков
;;===============================================================================================

;;===============================================================================================
;;функция для округления чисел.
;;===============================================================================================
;;==============================================================================================
;; Программа ex11_set_connect ( Установка связи с Excel)
;;==============================================================================================

;;==============================================================================================
;; Программа ex_break_connect ( Разрыв связи с Excel и выгрузка из памяти)
;; Освобождаем объекты, связанные с Excel, для корректной выгрузки Excel из памяти
;;==============================================================================================

;;==============================================================================================
;; Программа записи из  AutoCAD  в Excel 
;;===============================================================================================    
            ;End defun (Программа записи  из  AutoCAD  в Excel  )

;;===============================================================================================    
;;определение толщины МДФ
;;===============================================================================================    
(defun my_remove (/ d_l_s1 d_l_s4 d_l_s6 d_l_s8    d_l_s10    d_l_s12    d_l_s16    d_l_s18
          d_l_s22 d_l_s25 detal_lst_1
         ) ;_ конец /
    (setq d_l_s detal_lst_sum)

    (repeat count_tel        ;выбор совпадения по типу МДФ
    (setq detal_lst_1 (car d_l_s))
    (setq d_l_s (cdr d_l_s))
                        
    (cond ((= "---" (nth 6 detal_lst_1))
           (setq d_l_s1 (cons detal_lst_1 d_l_s1))
          )
          (
           (= "МДФ4" (nth 6 detal_lst_1))
           (setq d_l_s4 (cons detal_lst_1 d_l_s4))
          )
          (
           (= "МДФ6" (nth 6 detal_lst_1))
           (setq d_l_s6 (cons detal_lst_1 d_l_s6))
          )
          (
           (= "МДФ8" (nth 6 detal_lst_1))
           (setq d_l_s8 (cons detal_lst_1 d_l_s8))
          )
          (
           (= "МДФ10" (nth 6 detal_lst_1))
           (setq d_l_s10 (cons detal_lst_1 d_l_s10))
          )
          (
           (= "МДФ12" (nth 6 detal_lst_1))
           (setq d_l_s12 (cons detal_lst_1 d_l_s12))
          )
          (
           (= "МДФ16" (nth 6 detal_lst_1))
           (setq d_l_s16 (cons detal_lst_1 d_l_s16))
          )
          (
           (= "МДФ18" (nth 6 detal_lst_1))
           (setq d_l_s18 (cons detal_lst_1 d_l_s18))
          )
          (
           (= "МДФ22" (nth 6 detal_lst_1))
           (setq d_l_s22 (cons detal_lst_1 d_l_s22))
          )
          (
           (= "МДФ25" (nth 6 detal_lst_1))
           (setq d_l_s25 (cons detal_lst_1 d_l_s25))
          )
          (
           (= "МДФ4 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s4 (cons detal_lst_1 d_l_s4))
          )
          (
           (= "МДФ6 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s6 (cons detal_lst_1 d_l_s6))
          )
          (
           (= "МДФ8 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s8 (cons detal_lst_1 d_l_s8))
          )
          (
           (= "МДФ10 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s10 (cons detal_lst_1 d_l_s10))
          )
          (
           (= "МДФ12 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s12 (cons detal_lst_1 d_l_s12))
          )
          (
           (= "МДФ16 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s16 (cons detal_lst_1 d_l_s16))
          )
          (
           (= "МДФ18 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s18 (cons detal_lst_1 d_l_s18))
          )
          (
           (= "МДФ22 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s22 (cons detal_lst_1 d_l_s22))
          )
          (
           (= "МДФ25 + шпон" (nth 6 detal_lst_1))
           (setq d_l_s25 (cons detal_lst_1 d_l_s25))
          )

    ) ;_ конец cond

    ) ;_ конец repeat

;;;      (setq d_l_s0 (cons '("" "" "" "" "" "" "" "" "") d_l_s0))
    (setq
    detal_lst_sum
       (append d_l_s4 d_l_s6 d_l_s8    d_l_s10    d_l_s12    d_l_s16    d_l_s18    d_l_s22
           d_l_s25 d_l_s1
          ) ;_ конец append
    ) ;_ конец setq

    (setq count_tel (length detal_lst_sum))

) ;_ конец defun


;;===============================================================================================
;;диалог DCL
;;===============================================================================================

2. Программа автоматической нумерации листов


;| ********************************************
;* Нумерация листов в штампах и названиях layout(a)
;; Автор: Шинин Дмитрий, 2016
;;Замечания и предложения по адресу divash@yandex.ru

;* Большая благодарность Виталию Зуенко 
;* Штамп должен быть блоком с атрибутом с тэгом "PAGE" или "ЛИСТ"
;* Вызов: кнопка: ^C^C_mp_nomer
;***********************************************|;
(defun c:mp_nomer (/
           dcl_id
           what_next
           l_layout
           t_nstart
           t_ncount
           tg_layout
           tg_page
           layout_lst
           n
           ss
           ent
           obj
           string
           name_list
           custom_layout
           string1
           n_sum
           layout_lst_s
           n1
          )                              ; после / временные переменные


  (vl-load-com)                                  ; Для того, чтобы начать работать с операторами,
                                      ; входящими в расширение языка
                                      ; AutoLISP, нам нужно запустить оператор  (vl-load-com),
                                      ; которая их загружает
  (vla-StartUndoMark
    (vla-Get-ActiveDocument (vlax-Get-Acad-Object))
                                      ; (vla-startundomark active_document) - начало
                                      ; группы для отмены
  ) ;_ конец vla-StartUndoMark
  (setvar "cmdecho" 0)                              ;Системная переменная CMDECHO определяет,
                                      ; будут ли отображаться в командной строке
                                      ; приглашения и параметры при работе функции COMMAND.
                                      ; По умолчанию режим отображения включен —
                                      ; текущее значение системной переменной равно 1. Если
                                      ; изменить это значение на 0, то режим
                                      ; отображения отключится.


;;;  Составление списка листов layout_lst

  (setq    layout_lst                              ; в переменной layout_lst будет храниться
                                      ; результат
                                      ; выполнения
                                      ; оператора
     (mapcar                              ;( MAPCAR 'f l1 l2 ... ln ), т.е. список имен листов
       'car
       (vl-sort                              ; (vl-sort <список> '<функция сравнения>) - сортирует элементы в списке
         (mapcar                              ;возможность изменить значение отдельного элемента
                                      ; списка с помощью (mapcar). У нас список это (mapcar '(lambda (layout) (cons layout (vla-get-taborder
                                      ;(vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object) ) )
                                      ;Перед функцией '(lambda) нужно ставить апостроф, потому что MAPCAR нужна
                                      ; просто ссылка на то место в памяти, где эта функция находится, а не результат выполнения этой функции.
           '(lambda
          (layout)
           (cons layout
             (vla-get-taborder
               (vla-item
                 (vla-get-layouts
                   (vla-get-activedocument
                 (vlax-get-acad-object)
                   ) ;_ vla-get-activedocument
                 ) ;_ vla-get-layouts
                 layout
               ) ;_ vla-item
             ) ;_ vla-get-taborder
           ) ;_ cons
        ) ;_ lambda
           (layoutlist)
         ) ;_ mapcar
         '(lambda (a1 a2) (< (cdr a1) (cdr a2)))              ; а функция сравнения это '(lambda (a1 a2) (< (cdr a1) (cdr a2)))     
       ) ;_ vl-sort
     ) ;_ mapcar
  ) ;_ setq    завершение составление списка листов layout_lst

  (lispru-dcl)                                  ; вызов диалога

  (if (= what_next 1)
    (progn
      (setq layout_lst
         (mapcar '(lambda (n) (nth (atoi n) layout_lst))
             (z-string-list-separator " " l_layout)
         ) ;_ mapcar
      ) ;_ setq
      (setq n (atoi t_nstart))
      (setq layout_lst_s layout_lst)
      (setq n1 n)


(if (= sum_uzer "X")            ; ;; если пользователь хочет сам задать общее количество листов, sum_uzer не равно Х
  (setq n_sum (length layout_lst_s))
  (setq n_sum (atoi sum_uzer))

) ;_ if
      
;;;      Нумерация в штампе
;;; штамп должен быть блоком и содержать атрибут с тегом "PAGE" или "ЛИСТ"
      (setq n (atoi t_nstart))
      (if (= tg_page "1")                          ; список имен выбранных листов layout_lst_s
    (foreach layout    layout_lst_s                      ; (foreach) цикл , поочередно подставляет вместо  layout элементы списка layout_lst_s
                                      ; в выполняемые выражения (if...
      (if
        (setq
          ss (ssget
           "x"                              ; выбор всех блоков
           (list                          ; создает набор блоков у которых есть атрибут (66 . 1)
             '(0 . "INSERT")
             '(66 . 1)
             (cons 410
               (nth (- n (atoi t_nstart)) layout_lst_s)
             ) ;_ cons
           ) ;_ list
         ) ;_ ssget
        ) ;_ setq
         (foreach ent
              (vl-remove-if
                '(lambda (a) (listp a))
                (mapcar 'cadr (ssnamex ss))
              ) ;_ vl-remove-if
           (while (setq ent (entnext ent))
         (if (or (= (cdr (assoc 2 (entget ent))) "PAGE")
             (= (cdr (assoc 2 (entget ent))) "ЛИСТ")
             ) ;_ конец or
           (progn
             (setq obj (vlax-ename->vla-object ent))
             (vla-put-textstring obj (itoa n))
             (vlax-release-object obj)
           ) ;_ progn
         ) ;_ if
           ) ;_ while
         ) ;_ foreach
      ) ;_ if
      (setq n (1+ n))
    ) ;_ foreach
      ) ;_ if
;;;      Нумерация в штампе
;;; штамп должен быть блоком и содержать атрибут с тегом "PAGES" или "ЛИСТОВ"

                    ;общее количесво листов в штампе по маске n_sum_mask
(if (= n_sum_mask "1")            ; список имен выбранных листов layout    layout_lst_s
  (foreach layout layout_lst_s        ; (foreach) цикл , поочередно подставляет вместо  layout элементы списка layout    layout_lst_s
                    ; в выполняемые выражения (if...
    (if
      (setq
    ss (ssget
         "x"            ; выбор всех блоков
         (list            ; создает набор блоков у которых есть атрибут (67 . 1)
           '(0 . "INSERT")
           '(67 . 1)
           (cons 410
             (nth (- n1 (atoi t_nstart)) layout_lst_s)
           ) ;_ cons
         ) ;_ list
       ) ;_ ssget
      ) ;_ setq

       (foreach    ent            ; (foreach) цикл , поочередно подставляет вместо  ent
                    ;элементы списка (vl-remove-if '(lambda (a) (listp a)) (mapcar 'cadr (ssnamex ss)))
                    ; в выполняемые выражения  (while...
            (vl-remove-if
              '(lambda (a) (listp a))
              (mapcar 'cadr (ssnamex ss))
            ) ;_ vl-remove-if
     (while    (setq ent (entnext ent))
       (if (or (= (cdr (assoc 2 (entget ent))) "PAGES")
           (= (cdr (assoc 2 (entget ent))) "ЛИСТОВ")
           ) ;_ конец or
         (progn
           (setq obj (vlax-ename->vla-object ent))
           (vla-put-textstring obj (itoa n_sum))
           (vlax-release-object obj)
         ) ;_ progn
       ) ;_ if
     ) ;_ while
       ) ;_ foreach
    ) ;_ if
    (setq n1 (1+ n1))
  ) ;_ foreach
) ;_ if


;;;      Нумерация названий листов(Layout)
      (setq n (atoi t_nstart))
      (if (= tg_layout "1")
    (foreach layout    layout_lst
      (setq    obj
         (vla-item
           (vla-get-layouts
             (vla-get-activedocument
               (vlax-get-acad-object)
             ) ;_ vla-get-activedocument
           ) ;_ vla-get-layouts
           layout
         ) ;_ vla-item
      ) ;_ setq

      (if (= custom_layout "0")                      ; если не надо сохранить пользовательские имена листов
        (progn
          (vla-put-name obj "z")
          (setq string (vla-get-name obj))
        ) ;_ progn
        (setq string (vla-get-name obj))
      ) ;_ if

      (if (=
        (vl-string-left-trim "0123456789" string)
        (vl-string-left-trim
          " _"
          (vl-string-left-trim "0123456789" string)
        ) ;_ vl-string-left-trim
          ) ;_ =
        (setq string (strcat
               (_z_number_mask n (atoi t_ncount))
               " "
               string
             ) ;_ strcat
        ) ;_ setq
        (setq string
           (strcat
             (_z_number_mask n (atoi t_ncount))
             " "
             (vl-string-left-trim
               " "
               (vl-string-left-trim "0123456789" string)
             ) ;_ vl-string-left-trim
           ) ;_ strcat
        ) ;_ setq
      ) ;_ if

      (if (= custom_layout "0")                      ; если не надо сохранить пользовательские имена листов
        (setq string1 (vl-string-right-trim " z" string))
        (setq string1 string)
      ) ;_ if

      (vla-put-name obj string1)
      (vlax-release-object obj)

      (setq n (1+ n))
    ) ;_ foreach
      ) ;_ if

    ) ;_ progn
  ) ;_ if

  (vla-EndUndoMark      

Все материалы на сайте являются интеллектуальной собственностью автора. Дмитрий Шинин© 2024
Создать бесплатный сайт с uCoz