| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Не работает lisp на autocad 2014. Lisp предназначен для изменения порядкового номера листа

Не работает lisp на autocad 2014. Lisp предназначен для изменения порядкового номера листа

Ответ
Поиск в этой теме
Непрочитано 26.03.2015, 17:29 #1
Не работает lisp на autocad 2014. Lisp предназначен для изменения порядкового номера листа
vladykinalex
 
Регистрация: 23.12.2013
Сообщений: 45

Не работает lisp на autocad 2014. Lisp предназначен для изменения порядкового номера листа

"Я просто проставляю в месте штампа вместо номера блок с атрибутом. Потом просто запускаю прогу и она меняет значение атрибута этого блока на порядковый номер листа (как они следуют на чертеже).
Вот прога:
Код:
[Выделить все]
 (defun c:z-layout-set-numder ( / attent)
  (mapcar
    (function
      (lambda (ent)
	(progn
	  (entmod
	    (subst (cons 1
			 (itoa
			   (vla-get-TabOrder
			     (vla-item (vla-get-layouts
					 (vla-get-activedocument
					   (vlax-get-acad-object)
					   ) ;_ vla-get-activedocument
					 ) ;_ vla-get-layouts
				       (cdr (assoc 410 (entget ent)))
				       ) ;_ vla-item
			     ) ;_ vla-get-TabOrder
			   ) ;_ itoa
			 ) ;_ cons
		   (assoc 1 (entget (setq attent (entnext ent))))
		   (entget attent)
		   ) ;_ subst
	    ) ;_ entmod
	  (entupd ent)
	  ) ;_ progn
	) ;_ lambda
      ) ;_ function
    (mapcar 'cadr
	    (ssnamex
	      (ssget "_x" '((0 . "INSERT") (2 . "LAYOUT_NUMBER")))
	      ) ;_ ssnamex
	    ) ;_ mapcar
    ) ;_ mapcar
  (princ)
  ) ;_ defun
Код каписал не я, он написан "ZZZ"
Просмотров: 7145
 
Непрочитано 26.03.2015, 17:33
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


Что значит "не работает"? Слои разморожены, разблокированы? Блок точно не изменялся по сравнению с "работавшим" вариантом?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.03.2015, 17:51
#3
vladykinalex


 
Регистрация: 23.12.2013
Сообщений: 45


Слои разморожены.
Ошибка в командной строке:

Команда: Z-LAYOUT-SET-NUMDER
; ошибка: неверный тип аргумента: lselsetp nil

А вот с блоком может и есть проблема, подскажите как должен называться блок и кокой доложен быть атрибут?
А работающего варианта у меня нет((
vladykinalex вне форума  
 
Непрочитано 26.03.2015, 19:17
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от vladykinalex Посмотреть сообщение
ошибка: неверный тип аргумента: lselsetp nil
проверь, что возвращает
Код:
[Выделить все]
(ssget "_x" '((0 . "INSERT") (2 . "LAYOUT_NUMBER")))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.03.2015, 09:18
#5
vladykinalex


 
Регистрация: 23.12.2013
Сообщений: 45


Ошибка найдена. Название блока должно быть : LAYOUT_NUMBER, тег INSERT.

А вот теперь появилась новая проблема с лиспом от ZZZ.
Проблема следующего характера: запускаю лисп командой, а мне в ответ вылазит сообщение "Dialog box not found"
DCL фаил находится в той же папке там где лежит lsp фаил, доступ, соответственно, прописан в настройках
Прикладываю lsp и dcl

DCL файл не прикладывается поэтому вставляю код
z_layout_number.dcl

Код:
[Выделить все]
 z_layout_number : dialog { 
    label = "Нумерация листов(layout)"; 
    :list_box{ 
     label="Лист"; 
     key="l_layout"; 
     multiple_select =true; 
     } 
    :edit_box{ 
     label="Номер начинается с"; 
     key="t_nstart"; 
     edit_width=3; 
     fixed_width=true; 
     width=30; 
     } 
    :edit_box{ 
     label="Количество цифр"; 
     key="t_ncount"; 
     edit_width=3; 
     fixed_width=true; 
     width=30; 
     } 
    :toggle{ 
     label="Нумеровать название листов"; 
     key="tg_layout"; 
     } 
    :toggle{ 
     label="Нумеровать листы в штампе"; 
     key="tg_page"; 
     } 
    ok_cancel; 
    } 

Кстати нашел лисп от "kpblc" : try-renum , очень понравился
Вложения
Тип файла: lsp z_layout_number.lsp (6.4 Кб, 74 просмотров)

Последний раз редактировалось vladykinalex, 27.03.2015 в 09:38.
vladykinalex вне форума  
 
Непрочитано 27.03.2015, 09:49
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


Имя dcl-файла какое?

----- добавлено через ~1 мин. -----
Я не просто так ратую за создание dcl "на лету": http://autolisp.ru/2010/03/15/dcl-dialogs-create/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.03.2015, 09:57
#7
vladykinalex


 
Регистрация: 23.12.2013
Сообщений: 45


z_layout_number.dcl
vladykinalex вне форума  
 
Непрочитано 27.03.2015, 10:08
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


Попробуй такую модификацию:
Код:
[Выделить все]
 ;| ******************************************** 
* Нумерация листов в штампах и названиях layout(a) 
* Штамп должен быть блоком с атрибутом с тэгом "PAGE" или "ЛИСТ" 
* Вызов: 
* командная строка: z-layout-number 
* меню или кнопка: ^C^C_z-layout-number 
* 
* Copyright ©2005 
*           Виталий Зуенко (ZZZ) 
* 
***********************************************|;
(defun c:z-layout-number (/           dcl_id      what_next   l_layout    t_nstart    t_ncount    tg_layout
                          tg_page     layout_lst  layout      n           ss          ent         obj
                          string      _z_number_mask          dcl_file    dcl_handle
                          )
;;;  Функция формирования целого числа по маске 
  (defun _z_number_mask (integer number_count / string)
    (setq string (itoa integer))
    (if (< (strlen string) number_count)
      (strcat (substr "000000000" 1 (- number_count (strlen string)))
              string
              ) ;_ strcat 
      string
      ) ;_ if 
    ) ;_ defun 

  (vl-load-com)
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setvar "cmdecho" 0)
;;;  Составление списка листов 
  (setq layout_lst
                   (mapcar
                     'car
                     (vl-sort
                       (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)))
                       ) ;_ vl-sort 
                     ) ;_ mapcar 
        l_layout   ""
        t_nstart   "1"
        t_ncount   "2"
        tg_layout  "1"
        tg_page    "1"
        dcl_file   (strcat (vl-string-right-trim "\\" (getenv "TEMP")) "\\dlg.dcl")
        dcl_handle (open dcl_file "w")
        ) ;_ end of setq
  (foreach item '("z_layout_number : dialog { "      "   label = \"Нумерация листов(layout)\"; "
                  "   :list_box{ "                   "    label=\"Лист\"; "
                  "    key=\"l_layout\"; "           "    multiple_select =true; "
                  "    } "                           "   :edit_box{ "
                  "    label=\"Номер начинается с\"; "
                  "    key=\"t_nstart\"; "           "    edit_width=3; "
                  "    fixed_width=true; "           "    width=30; "
                  "    } "                           "   :edit_box{ "
                  "    label=\"Количество цифр\"; "  "    key=\"t_ncount\"; "
                  "    edit_width=3; "               "    fixed_width=true; "
                  "    width=30; "                   "    } "
                  "   :toggle{ "                     "    label=\"Нумеровать название листов\"; "
                  "    key=\"tg_layout\"; "          "    } "
                  "   :toggle{ "                     "    label=\"Нумеровать листы в штампе\"; "
                  "    key=\"tg_page\"; "            "    } "
                  "   ok_cancel; "                   "   }"
                  )
    (write-line item dcl_handle)
    ) ;_ end of foreach
  (close dcl_handle)

  (setvar "cmdecho" 0)
  (setq what_next 10)

  (while (> what_next 1)
    (setq dcl_id (load_dialog dcl_file))
    (if (null (new_dialog "z_layout_number" dcl_id))
      (progn
        (alert "Dialog box not found")
        (exit)
        ) ;_ progn 
      ) ;_ if 
    (action_tile "l_layout" "(setq l_layout $value)")
    (start_list "l_layout")
    (mapcar 'add_list layout_lst)
    (end_list)
    (set_tile "l_layout" l_layout)
    (action_tile "t_nstart" "(setq t_nstart $value)")
    (set_tile "t_nstart" t_nstart)
    (action_tile "t_ncount" "(setq t_ncount $value)")
    (set_tile "t_ncount" t_ncount)
    (action_tile "tg_layout" "(setq tg_layout $value)")
    (set_tile "tg_layout" tg_layout)
    (action_tile "tg_page" "(setq tg_page $value)")
    (set_tile "tg_page" tg_page)
    (setq what_next (start_dialog))
    (if (= what_next 1)
      (cond ((= l_layout "")
             (alert "Выберите листы")
             (setq what_next 10)
             )
            ((and (= tg_layout "0") (= tg_page "0"))
             (alert "Выберите где нумеровать")
             (setq what_next 10)
             )
            ) ;_ cond 
      ) ;_ if 
    ) ;_ while 

;;;  Завершение диалога 
  (done_dialog)
  (unload_dialog dcl_id)

;;;  Обработка введённых условий 
  (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))

;;;      Нумерация в штампе 
;;;      штамп должен быть блоком и содержать атрибут с тегом "PAGE" или "ЛИСТ" 
      (if (= tg_page "1")
        (foreach layout layout_lst
          (if (setq
                ss (ssget
                     "x"
                     (list
                       '(0 . "INSERT")
                       '(66 . 1)
                       (cons 410
                             (nth (- n (atoi t_nstart)) layout_lst)
                             ) ;_ 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))) "ЛИСТ")
                        ) ;_ end of 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 

;;;      Нумерация названий листов(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 
          (setq string (vla-get-name obj))
          (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 
          (vla-put-name obj string)
          (vlax-release-object obj)
          (setq n (1+ n))
          ) ;_ foreach 
        ) ;_ if 
      (princ " OK ")
      ) ;_ progn 
    ) ;_ if 
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setvar "cmdecho" 1)
  (princ)
  ) ;_ defun 


(defun z-string-list-separator (separator string /)
                               ;| Преобразование строки в список строк разделенных неким символом-строкой разделителем |;
;;;(z-string-list-separator "12" "1234567890123456712341") 
  (cond
    ((null string) nil)
    ((not (vl-string-search separator string)) (list string))
    (t
     (append
       (list
         (substr string 1 (+ 0 (vl-string-search separator string)))
         ) ;_ list 
       (z-string-list-separator
         separator
         (substr
           string
           (+ 1 (strlen separator) (vl-string-search separator string))
           ) ;_ substr 
         ) ;_ z-string-list-separator 
       ) ;_ append 
     )
    ) ;_ cond 
  ) ;_ defun 
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.03.2015, 10:17
#9
vladykinalex


 
Регистрация: 23.12.2013
Сообщений: 45


Спасибо большое, все заработало!
А в чем была причина?
vladykinalex вне форума  
 
Непрочитано 27.03.2015, 10:21
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


dcl было невозможно найти. Сейчас dcl создается "на лету". Достаточно использовать только lsp - он сам все сделает.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.03.2015, 10:25
#11
vladykinalex


 
Регистрация: 23.12.2013
Сообщений: 45


значит теперь dcl файлы можно удалять
vladykinalex вне форума  
 
Непрочитано 27.03.2015, 10:32
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


Ну, не все Только для этого лиспа
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.09.2015, 09:30
#13
shmulka

Инженер-электрик
 
Регистрация: 08.08.2013
Нижний Новгород
Сообщений: 131


А можно к названиям листов добавлять префикс с именем файла? Пользуюсь TabSort от LeeMac, но там это не автоматизировано.
shmulka вне форума  
 
Непрочитано 11.09.2015, 10:06
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


Можно. Добавляй

----- добавлено через ~2 мин. -----
Найди строку (vla-put-name obj string) и замени ее на (vla-put-name obj (strcat "Твой префикс" string))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.05.2020, 14:13
#15
dim5678


 
Регистрация: 29.07.2012
Сообщений: 98


Спасибо большое за лисп.
Алексей есть пару вопросов по нему.
- когда пытаюсь нумеровать названия листов (нумеруется не 1,2,3, а 11,22,33), а нумерация в штампе все в порядке.
- если мне необходимо запустить 2-й аналогичный скрипт для нумерации не только нумерации листов в штапе но нумерации в верхнем правом углу (так называемая сквозная нумерация) не будет ли конфликта лиспа, если я переименую копию лиспа и добавлю в название к примеру ЛИСТ1.
Заранее спасибо за ответы.
dim5678 вне форума  
 
Непрочитано 21.05.2020, 23:14
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


dim5678, блин, прошло 5 лет, а сейчас я точно не могу слету разобраться в коде. Надо комп запускать, на нем ACAD, а времени уже начало 12-го ночи. Так что по первой части сейчас я мимо.
Вторая: оостаточно сменить имена функций, их вызовы, сменить имя команды. Смена имени файла ни к чему не приведет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.05.2020, 06:19
#17
dim5678


 
Регистрация: 29.07.2012
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
dim5678, блин, прошло 5 лет, а сейчас я точно не могу слету разобраться в коде. Надо комп запускать, на нем ACAD, а времени уже начало 12-го ночи. Так что по первой части сейчас я мимо.
Вторая: оостаточно сменить имена функций, их вызовы, сменить имя команды. Смена имени файла ни к чему не приведет.
2-я часть получилась, в 1-й как раз загвоздка. Если когда-нибудь будет время подскажите в чем проблема. Спасибо!
dim5678 вне форума  
 
Непрочитано 25.05.2020, 21:09
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,789


Цитата:
Сообщение от dim5678 Посмотреть сообщение
когда пытаюсь нумеровать названия листов (нумеруется не 1,2,3, а 11,22,33), а нумерация в штампе все в порядке.
Попробовал на ACAD2019 - все срабатывает вроде бы корректно. Может, проблема в конкретном файле?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.07.2023, 10:24
#19
posetitel


 
Регистрация: 16.10.2013
Сообщений: 323


Подниму старую тему.
Возникла такая же проблема как и топикстатера в свое время. Модернизированный лисп от Алексея, конечно, помог реализовать требуемые функции, но остался, так сказать, незакрытый гештальт.
Подскажите, как самому запустить dcl?
Текст скопировал в редактор, сохранил под требуемым именем и расширением z_layout_number.dcl, поместил в папку с приложениями и лисп туда же, но все равно ошибка "Dialog box not found"
posetitel вне форума  
 
Непрочитано 14.07.2023, 11:31
#20
name02


 
Регистрация: 10.01.2020
Сообщений: 171


Код из поста 8 нужно сохранить как файл .LSP - форма DCL генерируется этим кодом из временного файла
name02 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Не работает lisp на autocad 2014. Lisp предназначен для изменения порядкового номера листа

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректно работает файл в AutoCad 2013 после его редактирования в AutoCad 2014 poslepolunochi AutoCAD 2 16.07.2014 20:38
AutoCAD Civil 2014/AutoCAD Civil 2014 as AutoCAD Eng,Rus. Ошибка - прерывание команды при наведении курсора на вкладку листа. Do$ Баги и пожелания в Autodesk 4 16.08.2013 23:06
Не работает кнопка delete при установке AutoCAD 2014 Виктория_Вика AutoCAD 17 17.05.2013 10:00
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59