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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как программно удалить слой(autolisp)

Как программно удалить слой(autolisp)

Ответ
Поиск в этой теме
Непрочитано 24.05.2010, 23:12 #1
Как программно удалить слой(autolisp)
Mozgunov
 
Начинающий проектировщик
 
Санкт-Петербург
Регистрация: 07.02.2008
Сообщений: 436

Уважаемые форумчане! Нужно программно удалить некоторые слои посредством autolispa Все примитивы которые находились на этих слоях я копировал на слой defpoints. Кто сталкивался подскажите пожалуйста конструкцию для удаления слоя. Спасибо!
Просмотров: 4518
 
Непрочитано 25.05.2010, 01:01
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


После удаления всех объектов со слоя, он считается не нужным...
Его можно почистить...
Например
Код:
[Выделить все]
(command "_.purge" "_la" "Defpoints" "_n")
gomer вне форума  
 
Непрочитано 25.05.2010, 05:46
#3
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Неудачный пример. Слой "Defpoints" нельзя просто так удалить, это служебный слой AutoCAD'а.
Profan вне форума  
 
Автор темы   Непрочитано 25.05.2010, 07:57
#4
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 436
<phrase 1=


gomer спасибо! Приду на работу проверю.
Mozgunov вне форума  
 
Непрочитано 25.05.2010, 08:01
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


>Profan:
Да, неужели? Странно! Вечно у меня все не как у людей
У меня слой Defpoints отсутствует изначально и удаляется, почему-то
gomer вне форума  
 
Непрочитано 25.05.2010, 08:15
#6
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Да он у всех отсутствует изначально.
Из Справки.
Удалить слой

Постановка выделенных слоев в очередь на удаление. Физически слои удаляются при нажатии кнопок «Применить» или «OK». Можно удалять только неиспользуемые слои. Не могут быть удалены слои 0 и DEFPOINTS, слои с объектами на них (включая объекты, являющиеся частью блоков), текущий слой, а также слои, зависимые от ссылок.

Слои в частично открытых рисунках также рассматриваются в качестве ссылочных и не могут быть удалены.

Примечание Следует с особой осторожностью удалять слои, совместно используемые несколькими пользователями, или применяемые в качестве стандартных.
Profan вне форума  
 
Непрочитано 25.05.2010, 11:56
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,230


Вот как делается полное удаление слоя в ruCAD.
Основная программа, вызываемая из меню или кнопки:
Код:
[Выделить все]
(defun START (/ name)
;;; Полное удаление слоя
 (ru-app-begin) 
  (if (setq
	name (ru-get-layer-name "Слой для полного УДАЛЕНИЯ" nil)
      ) ;_ end of setq
    (if	(not (ru-no (strcat "\nПрограмма полностью УДАЛЯЕТ слой \n" name "\nи все объекты на нем с удалением из таблицы слоев\nБудем делать")))
      (ru-layer-purge name)
    ) ;_ end of if
  ) ;_ end of while
 (ru-app-end) 
  (princ)
) ;_ end of defun
(START)
Основные функции из библиотеки, удаляющие слой:
Код:
[Выделить все]
(defun ru-layer-delete (name / ss result)
  ;; удаление примитивов из слоя с заданным именем
  (if (setq ss (ssget "_X" (list (cons 8 name))))
    (progn
      (setq result (sslength ss)) 
      (ru-obj-ent-ss-erase ss)
      (if (setq ss (ssget "_X" (list (cons 8 name))))
	   (setq result (- result (sslength ss))) 
      )
    )
  )
  result
) ;_ end of defun

(defun ru-layer-purge (name / obj ss)
  ;; удаление  слоя с заданным именем из определений
  ;; Если слой заблокирован, разблокируем
  (if (ru-layer-is-lock name)
       (ru-layer-unlock name)
  )
  ;; Если на слое есть примитивы, удаляем их
  (if (setq ss (ssget "_X" (list (cons 8 name))))
    (ru-layer-delete name)
  )  
  ;; Если удаляется текущий слой, устанавливаем слой текущим 0
  (if (= (getvar "CLAYER") name)
	(setvar "CLAYER" "0")
  ) 
  ;; Если получен объект слоя...
  (if (setq obj (ru-obj-layer-by-name name))
    ;; Устанавливаем ловушку для любых возможных ошибок
	(ru-error-catch
	  (function (lambda ()
	          ;; Удаляем объект слоя
		      (vla-delete obj)
		      t ;; Вернем Т при успешном удалении слоя и NIL в любых других случаях
		    )
	  ) 
	  ;; Если по каким-то причинам слой не будет удален, выводится сообщение о причине ошибки.
	  (function
	    (lambda (x) (princ (strcat "\nОШИБКА RU-LAYER-DELETE: " x)) nil)
	  ) 
	)
	nil
  ) 
)
Назначение остальных функций ru*, код которых не привожу из-за его элементарности, понятно из названий.
ShaggyDoc вне форума  
 
Непрочитано 25.05.2010, 12:49
1 | 1 #8
Кулик Алексей aka kpblc
Moderator

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


ru-layer-delete не проверяет вхождения внутри блоков... ИМХО ее бы на такое переделать:
Код:
[Выделить все]
(vl-load-com)

(defun ru-layer-delete (doc layer-name / layer status erase_count err_count)
                       ;|
*    doc -> vla-указатель на обрабатываемый документ.
*		 layer-name -> имя удаляемого слоя
|;
  (setq erase_count 0
        err_count   0
        layer-name  (strcase layer-name)
        ) ;_ end of setq
  (if (and (not (vl-catch-all-error-p
                  (vl-catch-all-apply
                    (function (lambda ()
                                (setq layer (vla-item (vla-get-layers doc) layer-name))
                                ) ;_ end of lambda
                              ) ;_ end of function
                    ) ;_ end of vl-catch-all-apply
                  ) ;_ end of vl-catch-all-error-p
                ) ;_ end of not
           (not (equal layer (vla-get-activelayer doc)))
           ) ;_ end of and
    (progn
      (setq status (mapcar
                     (function
                       (lambda (x / res)
                         (setq res (cons x (vlax-get-property layer x)))
                         (vlax-put-property layer x :vlax-false)
                         ) ;_ end of lambda
                       ) ;_ end of function
                     '("lock" "freeze")
                     ) ;_ end of mapcar
            ) ;_ end of setq
      (vlax-for blk_def (vla-get-blocks doc)
        (if (equal (vla-get-isxref blk_def) :vlax-false)
          (vlax-for sub_ent blk_def
            (if (= (strcase (vla-get-layer sub_ent)) layer-name)
              (if (vl-catch-all-error-p (vl-catch-all-apply
                                          (function
                                            (lambda ()
                                              (vla-erase sub_ent)
                                              ) ;_ end of lambda
                                            ) ;_ end of function
                                          ) ;_ end of vl-catch-all-apply
                                        ) ;_ end of vl-catch-all-error-p
                (setq err_count (1+ err_count))
                (setq erase_count (1+ erase_count))
                ) ;_ end of if
              ) ;_ end of if
            ) ;_ end of vlax-for
          ) ;_ end of if
        ) ;_ end of vlax-for
      (if (vl-catch-all-error-p
            (vl-catch-all-apply
              (function
                (lambda ()
                  (vla-delete layer)
                  ) ;_ end of lambda
                ) ;_ end of function
              ) ;_ end of vl-catch-all-apply
            ) ;_ end of vl-catch-all-error-p
        (progn
          (foreach item status
            (vlax-put-property layer (car item) (cdr item))
            ) ;_ end of foreach
          (princ (strcat "\n** error : can't erase layer \"" layer-name "\""))
          ) ;_ end of progn
        ) ;_ end of if
      (princ (strcat "\nErased "
                     (vl-princ-to-string erase_count)
                     " entities;"
                     "\nCan't erase "
                     (vl-princ-to-string err_count)
                     " entities."
                     ) ;_ end of strcat
             ) ;_ end of princ
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2019, 10:09
#9
merkur1y

жд
 
Регистрация: 12.07.2019
СПб
Сообщений: 18


Уважаемые форумчане, помогите кто разбирается в кодах lisp.

1. используя шпаргалку https://dwg.ru/pub/9 не могу понять как называется команда из #7 и #8, чтобы прописать её в командной строке и запустить ЛИСП, просто чтобы проверить. Там написано, что имя команды идёт после "defun C:". В этих кодах я такого не вижу =(

2. если возможно, помогите сделать такой лисп, чтобы я в него сам вписал имена слоёв, которые мне надо просто удалять вместе со всеми содержащимися в нём объектами. слоёв порядка тридцати и неудобно каждый раз изолировать объекты этого слоя и удалять их, а потом и purge использовать...

заранее благодарю как за ответ на первый вопрос (просто чтобы понимать как надо читать код) ну и за второй вопрос естественно
merkur1y вне форума  
 
Непрочитано 28.11.2019, 17:43
1 | 1 #10
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,320


merkur1y, вот так:
Код:
[Выделить все]
(defun C:LAYERSDELETE ( / )
  (mapcar 
    '(lambda (x) (ru-layer-delete (vla-get-ActiveDocument (vlax-get-acad-object)) x)) 
    '( 
       "Слой1"
       "Слой2"
       "Слой3"
       "Слой4"
     )
  )
)
Понятно, что названия слоев нужно поменять на свои в таком же формате (с кавычками), можно ниже добавить еще, сколько нужно.
Код Алексея из #8 должен быть загружен. Можно их объединить в одном файле с этим кодом.

----- добавлено через ~9 мин. -----
Ну и конечно, не стоит забывать про штатную команду _LAYDEL и ее опции. Там можно выбрать нужные слои (зажав Ctrl или Shift) в диалоговом окне - на мой взгляд, куда проще, чем каждый раз менять список слоев в коде (если, конечно, этот список не перманентный).
skkkk на форуме  
 
Непрочитано 28.11.2019, 18:53
1 | 1 #11
VVA

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


Или так используя _-LayDel
Код:
[Выделить все]
(defun C:DeleteMyLayer (/ layer-list)
  (vl-load-com)
  (setq
    layer-list
     (list   ;_Список слоев
       "Объём_2500"
       "Объём_2501"
       "Объём_2520"
       "Объём_2521"
       "Объём_2540"
       "Объём_2560"
       "Объём_2561"
       "Объём_2562"
       "Объём_2563"
       "Объём_2564"
       "Объём_2580"
       "Объём_2600"
       "Объём_2620"
       "Объём_2650"
       "Объём_2660"
       "Объём_2661"
       "Объём_2663"
       "Объём_2664"
       "Объём_2665"
       "Объём_2666"
     ) ;_ end of list
  ) ;_ end of setq
  (setq layer-list (vl-remove-if-not '(lambda(lay)(tblsearch "LAYER" lay)) layer-list))
  (vl-catch-all-apply
    '(lambda ()
       (mapcar
         '(lambda (Lay)
            (if (tblsearch "LAYER" lay)
            (vla-put-lock
              (vla-item (vla-get-layers
                          (vla-get-activedocument (vlax-get-acad-object))
                        ) ;_ end of vla-get-layers
                        Lay
              ) ;_ end of vla-item
              :vlax-false
            ) ;_ end of vla-put-lock
            )                   
          ) ;_ end of lambda
         layer-list
       ) ;_ end of mapcar
       (vl-cmdf "_.-LAYDEL")
       (foreach lay layer-list
         (vl-cmdf "_name" lay)
       ) ;_ end of foreach
       (vl-cmdf "" "_yes")
       (command)
     ) ;_ end of lambda
  ) ;_ end of vl-catch-all-apply
  (princ)
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 30.11.2019 в 11:21.
VVA вне форума  
 
Непрочитано 29.11.2019, 09:31
#12
merkur1y

жд
 
Регистрация: 12.07.2019
СПб
Сообщений: 18


skkkk, спасибо всё работает
понятно дело, дилетанту в lisp и такой двухшаговый способ подойдёт
я уже нашёл ветку на форуме, которую буду изучать потихоньку: https://forum.dwg.ru/showthread.php?t=22894
т.к. пока даже
Цитата:
Сообщение от skkkk Посмотреть сообщение
Можно их объединить в одном файле с этим кодом
для меня оказалось не под силу, спрашивать как это делать нарочно не буду - постараюсь разобраться сам
VVA, спасибо за код в одном файле, всё работает как следует, польщён что Вы добрались до моего вопроса

спасибо!

итак, спустя час работы я понял следующее

----- добавлено через ~2 ч. -----
Уважаемые skkkk и VVA, я поторопился с выводом
сначала я проверил Ваши коды на простых примерах удаляя созданные мною же объекты
начав добавлять свои слои в Ваши коды, желаемого результата не достиг

+ оба кода удаляют созданные мною слои, если в них прописаны только новые (созданные мною)

- если же я добавляю в коды свои слои то:
1. код skkk удаляет созданные мною объекты, а объекты из моего слоя не удаляет. в консоли при этом отображается следующее

Команда: LAYERSDELETE
Erased 2 entities;
Can't erase 0 entities.
Erased 2 entities;
Can't erase 0 entities.
Erased 2 entities;
Can't erase 0 entities.(nil "\nErased 2 entities;\nCan't erase 0 entities." "\nErased 2 entities;\nCan't erase 0 entities." "\nErased 2 entities;\nCan't erase 0 entities.")

2. код VVA не удаляет ничего, в консоли только лишь:

Команда: DELETEMYLAYER
Вложения
Тип файла: dwg
DWG 2010
типовой на примыкании.dwg (86.0 Кб, 3 просмотров)
Тип файла: lsp 0_код Алексея.lsp (3.3 Кб, 0 просмотров)
Тип файла: lsp 1-9_код skkk.lsp (220 байт, 3 просмотров)
Тип файла: lsp код_VVA.lsp (672 байт, 4 просмотров)

Последний раз редактировалось merkur1y, 29.11.2019 в 11:37.
merkur1y вне форума  
 
Непрочитано 30.11.2019, 11:22
1 | 1 #13
VVA

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


merkur1y,
1. Файл код_VVA.lsp не содержит моего кода
2. Приведенный выше код подразумевал, что слой обязательно есть в чертеже
3. Добавил проверку на отсутствие слоев в чертеже. Код во вложении

----- добавлено через ~4 мин. -----
Я думаю такая же проблема и в коде skkk
Пробуй так
Код:
[Выделить все]
(defun C:LAYERSDELETE (/)
  (mapcar
    '(lambda (x)
       (ru-layer-delete
         (vla-get-activedocument (vlax-get-acad-object))
         x
       ) ;_ end of ru-layer-delete
     ) ;_ end of lambda
    (vl-remove-if-not
      '(lambda (lay) (tblsearch "LAYER" lay))
      '(
        "Слой1"
        "Слой2"
        "Слой3"
        "Слой4"
       )
    ) ;_ end of vl-remove-if-not
  ) ;_ end of mapcar
) ;_ end of defun
Вложения
Тип файла: lsp код VVA1.LSP (1.4 Кб, 3 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.11.2019, 15:24
#14
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,320


Цитата:
Сообщение от skkkk Посмотреть сообщение
Можно их объединить в одном файле с этим кодом.
Цитата:
Сообщение от merkur1y Посмотреть сообщение
для меня оказалось не под силу
Я имел в виду обычную вставку двух кодов друг за другом в один файл *.lsp.
Цитата:
Сообщение от VVA Посмотреть сообщение
Я думаю такая же проблема и в коде skkk
Упс, виноват. Думал, что такая проверка уже есть в коде Алексея, поленился убедиться. Прошу прощения.
skkkk на форуме  
 
Непрочитано 02.12.2019, 11:17
#15
koMon


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


Цитата:
Сообщение от merkur1y Посмотреть сообщение
чтобы я в него сам вписал имена слоёв
лучше, наверное, выбирать
upd. краткая информация о слое по двойному клику
Код:
[Выделить все]
 
;************************************************************************************************************************************

(defun select_layers ( / main_dcl_strings_list
						 dcl_filename_full
						 sl_dcl_id
						 dwg_layers_list
						 dialog_result
						 selected_layers_list
					 )

	;********************************************************************************************************************************

	(defun how_many_objects_on_layer ( layer_name / objects_number )
		(setq objects_number 0)
		(vlax-map-collection
			(vla-get-modelspace (vla-get-database (vla-get-activedocument (vlax-get-acad-object))))
		   '(lambda (object)
				(and
					(= (vla-get-layer object) layer_name)
					(setq objects_number (1+ objects_number))
				)
		    )
		)
		objects_number
	)

	;********************************************************************************************************************************

	(defun get_layer_info ( layer_name / layer_object under_line)
		(setq under_line ""
			  layer_object (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) layer_name)
		)
		(alert
			(strcat "Информация о слое \"" layer_name "\":"
					"\n" (repeat (strlen (strcat "Информация о слое \"" layer_name "\":")) (setq under_line (strcat under_line "..")))
				 	"\n\n    " (if (minusp (vlax-get layer_object 'layeron)) "[x]" "[  ]") "   Включен"
				 	"\n    " (if (minusp (vlax-get layer_object 'freeze)) "[x]" "[  ]") "   Заморожен"
				 	"\n    " (if (minusp (vlax-get layer_object 'lock)) "[x]" "[  ]") "   Заблокирован"
					"\n    "
					(progn
						(vla-generateusagedata (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
						(strcat (if (equal :vlax-true (vla-get-used layer_object)) "[x]" "[  ]") "   Используется")
					)
					"\n\n    " (strcat "Объектов:   " (itoa (how_many_objects_on_layer layer_name)))
			)
		)
		(vlax-release-object layer_object)
	)

	;********************************************************************************************************************************

	(defun write_dialog_file (dialog_strings_list / temp_file_path dcl_filename_full dcl_file_id)
		(setq temp_file_path (vla-get-TempFilePath (vla-get-Files (vla-get-preferences (vlax-get-acad-object))))
			  dcl_filename_full (vl-filename-mktemp "Dialog" temp_file_path ".dcl"])
			  dcl_file_id (open dcl_filename_full "w")
		)
		(mapcar '(lambda (dcl_str) (write-line
										dcl_str
										dcl_file_id
									)
				 )
				 dialog_strings_list
		)
		(close dcl_file_id)
		dcl_filename_full
	)

	;********************************************************************************************************************************

	(defun populate_list ( list_key list_to_process )
		(start_list list_key 3)
			(mapcar 'add_list (mapcar '(lambda (list_element) (strcat "\n" list_element)) list_to_process))
		(end_list)
	)

	;********************************************************************************************************************************

	(defun get_dwg_layers_list ( / layers_list )
		(vlax-for dwg_layer (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
			(setq layers_list (append layers_list (list (vla-get-name dwg_layer))))
		)
		(acad_strlsort layers_list)
	)

	;********************************************************************************************************************************

	(setq dwg_layers_list (get_dwg_layers_list)
		  main_dcl_strings_list
								(list
									"Layers_List : dialog {"
									    					(strcat "label = \"Выберите слои чертежа [" (itoa (length dwg_layers_list)) "]\";")
															": list_box {"
																			"key = \"Dwg_Layers_List\";"
																			"width = 50;"
																			"height = 20;"
		                                                                   	"multiple_select = true;"
																       "}"
															"ok_cancel;"
											     		 "}"
								)
		  dcl_filename_full (write_dialog_file main_dcl_strings_list)
		  sl_dcl_id (load_dialog dcl_filename_full)
	)
	(if sl_dcl_id
		(if (new_dialog "Layers_List" sl_dcl_id)
			(progn
				(populate_list "Dwg_Layers_List" dwg_layers_list)
				(action_tile "Dwg_Layers_List" "(cond
													(
														(= 4 $reason)
															(get_layer_info (nth (atoi $value) dwg_layers_list))
													)
													(
														t
															(setq selected_layers_list $value)
													)
												)
											   "
				)
				(setq dialog_result (start_dialog))
				(unload_dialog sl_dcl_id)
				(vl-file-delete dcl_filename_full)
				(cond
						(
							(= dialog_result 1)
								(if selected_layers_list
									(setq selected_layers_list (mapcar '(lambda (index)
																			(nth index dwg_layers_list)
																		)
																		(read (strcat "(" selected_layers_list ")"))
															   )
									)
								)
						)
						(
							t
								(setq selected_layers_list nil)
						)
				)
			)
		)
	)
	selected_layers_list
)

;************************************************************************************************************************************
Миниатюры
Нажмите на изображение для увеличения
Название: SL_1.jpg
Просмотров: 18
Размер:	171.1 Кб
ID:	220598  Нажмите на изображение для увеличения
Название: SL_2.jpg
Просмотров: 20
Размер:	233.0 Кб
ID:	220599  Нажмите на изображение для увеличения
Название: SL_3.jpg
Просмотров: 14
Размер:	88.2 Кб
ID:	220600  Нажмите на изображение для увеличения
Название: SL_4.jpg
Просмотров: 8
Размер:	153.7 Кб
ID:	220657  
Вложения
Тип файла: lsp Select_Layers.lsp (5.3 Кб, 2 просмотров)

Последний раз редактировалось koMon, 04.12.2019 в 08:55.
koMon вне форума  
 
Непрочитано 03.12.2019, 17:47
#16
merkur1y

жд
 
Регистрация: 12.07.2019
СПб
Сообщений: 18


Цитата:
Сообщение от VVA Посмотреть сообщение
код VVA1.LSP (1.4 Кб, 1 просмотров)
данный код сработал как надо... всё что надо удалилось!
теперь точно спасибо, можно пользоваться

Цитата:
Сообщение от koMon Посмотреть сообщение
лучше, наверное, выбирать
у меня специфика процесса работы такая, что на каждый объект есть своя конструкция земляного полотна, и чертежи поперечных профилей дороги часто переделываются
поэтому на каждый объект свой список слоёв для удаления, т.к. я их всё равно записываю в эл.вид - удобно чтобы это сразу было командой в КАДе

Цитата:
Сообщение от koMon Посмотреть сообщение
Код:
скопировал Ваш код в блокнот, сохранил в формате .lsp и после загрузки кода в КАД даже не даёт ввести команду "select_layers"
Вложения
Тип файла: lsp select_layers.lsp (10.3 Кб, 4 просмотров)
merkur1y вне форума  
 
Непрочитано 03.12.2019, 19:07
#17
Кулик Алексей aka kpblc
Moderator

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


В кодировка-то почему UTF-8?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.12.2019, 08:54
#18
koMon


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


Цитата:
Сообщение от merkur1y Посмотреть сообщение
скопировал Ваш код в блокнот, сохранил в формате .lsp и после загрузки кода в КАД даже не даёт ввести команду "select_layers"
см. предыдущее сообщение. у вас проблема с сохранением файла(
добавил текстовый лисп к коду.
Цитата:
Сообщение от merkur1y Посмотреть сообщение
у меня специфика процесса работы такая, что на каждый объект есть своя конструкция земляного полотна, и чертежи поперечных профилей дороги часто переделываются
поэтому на каждый объект свой список слоёв для удаления, т.к. я их всё равно записываю в эл.вид - удобно чтобы это сразу было командой в КАДе
даже если так, то я глубоко убеждён , что удобнее понажимать кнопки... и сохранить возможно даже в файл..., чем копипастить названия слоёв - ошибок будет меньше...
koMon вне форума  
 
Непрочитано 04.12.2019, 09:44
#19
merkur1y

жд
 
Регистрация: 12.07.2019
СПб
Сообщений: 18


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В кодировка-то почему UTF-8?
До Вашего замечания никогда не обращал на это внимания, все коды при сохранении исправно работали... какую кодировку следует выбрать тогда?

Цитата:
Сообщение от koMon Посмотреть сообщение
добавил текстовый лисп к коду.
просто загрузил в КАД Ваш .lsp файл и все равно не вижу команды...

Цитата:
Сообщение от koMon Посмотреть сообщение
удобнее понажимать кнопки
время покажет, что удобнее... пока ошибок не было
я же и говорю, что каждый список у меня составлен в электронном виде, приходится его включать и сверять удаляемые слои
не помню где услышал, но придерживаюсь такого принципа: если что-то повторяешь больше двух раз - пора делать код для этого действия
Миниатюры
Нажмите на изображение для увеличения
Название: select_layers_скрин.png
Просмотров: 7
Размер:	50.8 Кб
ID:	220713  
merkur1y вне форума  
 
Непрочитано 04.12.2019, 10:00
1 | #20
koMon


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


это НЕ команда, функция. выполняется буквально - (select_layers)<cr>
ваще на первом скрине это показано да и на третьем впридачу
собственно преимущество функции именно в том, что её можно легко встроить туда, где, в данном случае, требуется например список слоёв.
естественно ANSI

----- добавлено через ~7 мин. -----
Цитата:
Сообщение от merkur1y Посмотреть сообщение
время покажет, что удобнее... пока ошибок не было
это 100-пудово, и не надо рассматривать мой коммент, как может захотеться, например - в качестве миссионерства

ну, например, можно изменить команду VVA выше так. только надо иметь в виду, что функция (select_layers) д.б. загружена на момент исполнения команды LAYERSDELETE, ну или сливать всё в один код) и помнить про nil в случае отказа от выбора слоёв.

Код:
[Выделить все]
 
(defun C:LAYERSDELETE (/)
  (mapcar
    '(lambda (x)
       (ru-layer-delete
         (vla-get-activedocument (vlax-get-acad-object))
         x
       ) ;_ end of ru-layer-delete
     ) ;_ end of lambda
    ;(vl-remove-if-not
    ;  '(lambda (lay) (tblsearch "LAYER" lay))
    ;  '(
    ;    "Слой1"
    ;    "Слой2"
    ;    "Слой3"
    ;    "Слой4"
    ;   )
    ;) ;_ end of vl-remove-if-not
    (select_layers)
  ) ;_ end of mapcar
) ;_ end of defun

Последний раз редактировалось koMon, 04.12.2019 в 11:18.
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как программно удалить слой(autolisp)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить атрибут? пончеГ AutoCAD 14 07.08.2015 17:22
Как программно удалить неиспользуемые стили мультивыносок. Makswell Программирование 6 08.04.2009 13:43
как программно, в чертеже, выделить группы vasyavip Программирование 2 21.01.2009 10:12
КАК программно написать многострочным текстом? Александер Программирование 11 11.10.2006 16:19
подскажите как программно начертить линии разных типов Александер Программирование 4 30.06.2005 07:17