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

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

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

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

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

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


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


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


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

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


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

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


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


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


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

Постановка выделенных слоев в очередь на удаление. Физически слои удаляются при нажатии кнопок «Применить» или «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"В
Сообщений: 13,372


Вот как делается полное удаление слоя в 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
С.-Петербург
Сообщений: 40,402


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
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2019, 10:09
#9
merkur1y

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


Уважаемые форумчане, помогите кто разбирается в кодах 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,680


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,996


Или так используя _-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
СПб
Сообщений: 148


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 Кб, 7 просмотров)
Тип файла: lsp 0_код Алексея.lsp (3.3 Кб, 6 просмотров)
Тип файла: lsp 1-9_код skkk.lsp (220 байт, 9 просмотров)
Тип файла: lsp код_VVA.lsp (672 байт, 8 просмотров)

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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


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 Кб, 24 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.11.2019, 15:24
#14
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


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


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,808


Цитата:
Сообщение от 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
Просмотров: 67
Размер:	171.1 Кб
ID:	220598  Нажмите на изображение для увеличения
Название: SL_2.jpg
Просмотров: 65
Размер:	233.0 Кб
ID:	220599  Нажмите на изображение для увеличения
Название: SL_3.jpg
Просмотров: 56
Размер:	88.2 Кб
ID:	220600  Нажмите на изображение для увеличения
Название: SL_4.jpg
Просмотров: 51
Размер:	153.7 Кб
ID:	220657  
Вложения
Тип файла: lsp Select_Layers.lsp (5.3 Кб, 20 просмотров)

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

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


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

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

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

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


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


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,808


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

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


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

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

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


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,808


это НЕ команда, функция. выполняется буквально - (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 вне форума  
 
Непрочитано 04.12.2019, 12:02
1 | #21
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от merkur1y Посмотреть сообщение
2. если возможно, помогите сделать такой лисп, чтобы я в него сам вписал имена слоёв, которые мне надо просто удалять вместе со всеми содержащимися в нём объектами. слоёв порядка тридцати и неудобно каждый раз изолировать объекты этого слоя и удалять их, а потом и purge использовать...
Все это можно сделать штатными возможностями автокада: смержить 30 слоев (там как раз есть возможность мышкой потыкать, какие слои мержить) в один и его удалить.
Boxa вне форума  
 
Непрочитано 04.12.2019, 14:05
#22
merkur1y

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


Уважаемые, koMon, Алексей, VVA, спасибо за время, которое вы потратили на данный вопрос, я постараюсь сам разобраться в чём у меня чудеса происходят, что я недопонимаю. Подсказок дали множество, все их проработаю и отпишусь.
merkur1y вне форума  
 
Непрочитано 04.12.2019, 14:12
#23
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,808


Цитата:
Сообщение от Boxa Посмотреть сообщение
смержить
Михаил Васильевич, что же это деется, а?
koMon вне форума  
 
Непрочитано 04.12.2019, 15:03
#24
merkur1y

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


смех смехом, все когда-то начинали, Boxa, что Вы имеете ввиду:
Цитата:
Сообщение от Boxa Посмотреть сообщение
смержить
слияние слоёв в один, а потом всё та же команда _laydel?
merkur1y вне форума  
 
Непрочитано 04.12.2019, 15:13
1 | #25
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


koMon, а что делается?
Цитата:
Сообщение от merkur1y Посмотреть сообщение
слияние слоёв в один, а потом всё та же команда _laydel?
Да. У меня англ. интерфейс, как на русском не знаю, а там:
Boxa вне форума  
 
Непрочитано 04.12.2019, 15:22
#26
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,808


https://knowledge.autodesk.com/ru/su...1BDE0-htm.html

----- добавлено через ~4 мин. -----
Boxa, объединение слоёв делается
Миниатюры
Нажмите на изображение для увеличения
Название: Capture.jpg
Просмотров: 24
Размер:	68.8 Кб
ID:	220727  
koMon вне форума  
 
Непрочитано 10.03.2020, 16:17
#27
bengan777


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


Добрый день. Похожая проблема, решил отписаться в этой теме.
Есть dxf с кучей блоков (кадастровая выписка сконвертированная из xml в dxf с помощью pbprog конвертера (https://pbprog.ru/webservices/dxf/)).
Нужно программно перенести все блоки на 0 слой и удалить остальные слои.
Для перенесения на 0 слой использовал программу для нормализации блоков norm-blocks_v3.lsp с этого форума.
Далее перенес все блоки и все их атрибуты на слой 0.
Далее обновил описания вхождения блоков командой _атробновить.
После этого очистил чертеж _-purge.
Слои остаются. Открыл dxf блокнотом, нашел что они прописаны в таком виде.
AcDbEntity
8
Z
100
Если сохранять в dxf R12/LT2 то можно в блокноте заменить имена слоев на 0 и все получится, но хотелось бы как то через lisp решить эту проблему.
И еще вопрос, где можно почитать по структурам разных dxf?
Вложения
Тип файла: dwg
DWG 2007
Уже нормализованый пример.dwg (82.7 Кб, 5 просмотров)
Тип файла: dwg
DWG 2007
46_11_000000_2019-06-20_kpt10.xml.dwg (5.32 Мб, 7 просмотров)
bengan777 вне форума  
 
Непрочитано 11.03.2020, 08:48
1 | #28
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,808


Цитата:
Сообщение от bengan777 Посмотреть сообщение
где можно почитать по структурам разных dxf?
DXF он один
Документация по формату файлов AutoCAD DXF
koMon вне форума  
 
Непрочитано 11.03.2020, 09:14
1 | #29
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
но хотелось бы как то через lisp решить эту проблему
а можно сразу открыть xml в AutoCAD Map/Civil 3D ;=)

Цитата:
DXF он один
есть разные версии
trir вне форума  
 
Непрочитано 11.03.2020, 09:15
1 | #30
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от bengan777 Посмотреть сообщение
Нужно программно перенести все блоки на 0 слой и удалить остальные слои.
выше ж ответ есть, слить-смержить- объединить-merge (что больше нравится) все слои в слой "0", блоки сами перенесутся, слои удалятся, все само делается
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 11.03.2020, 09:32
#31
bengan777


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


Цитата:
Сообщение от trir Посмотреть сообщение
а можно сразу открыть xml в AutoCAD Map/Civil 3D ;=)
Можно поподробнее?)
bengan777 вне форума  
 
Непрочитано 11.03.2020, 09:44
1 | #32
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
Можно поподробнее?
https://github.com/triroakenshield/RosReestrImpLib
https://geodesist.ru/resources/konve...b-mif-csv.236/
trir вне форума  
 
Непрочитано 12.11.2024, 08:42
#33
Gretech89


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


Подскажите, как можно удалить слой, если он на китайском? Пробовал сохранять скрипты в кодировке Юникод, результатов не дало.
Пример файла с китайским слоем:
Вложения
Тип файла: dwg
DWG 2010
Пример.dwg (75.0 Кб, 5 просмотров)
Gretech89 вне форума  
 
Непрочитано 12.11.2024, 09:07
#34
name02


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


1 Слой не удаляется, потому что у тебя в нем есть объекты - измени слой их размещения
2 Измени текущий слой с "китайского" на любой другой
3 Теперь можно удалить "китайский" слой
name02 вне форума  
 
Непрочитано 12.11.2024, 09:15
#35
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


0. Удалить объекты с "китайского" слоя, потом:
1а) nanoCAD удаляет его без вопросов
1б) для AutoCAD'a нужно переименовать его на любое "внятное" имя, типа "АВС"
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 12.11.2024, 09:23
#36
name02


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
1б) для AutoCAD'a нужно переименовать его на любое "внятное" имя, типа "АВС"
Автокад 2022 удаляет без переименования
name02 вне форума  
 
Непрочитано 12.11.2024, 09:45
#37
Gretech89


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


name02,
1. Для этого и нужен скрипт, чтобы объекты со слоя удалялись, но они не работают (пробовал несколько) из-за китайских символов.
2. Опять же, можно это решить с помощью скрипта или только исключительно вручную?
3. Понятное дело =)
Gretech89 вне форума  
 
Непрочитано 12.11.2024, 09:55
#38
name02


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


Цитата:
Сообщение от Gretech89 Посмотреть сообщение
name02,
1. Для этого и нужен скрипт, чтобы объекты со слоя удалялись, но они не работают (пробовал несколько) из-за китайских символов.
2. Опять же, можно это решить с помощью скрипта или только исключительно вручную?
3. Понятное дело =)
1. Для изменения слоя можно использовать команды СЛОЙОБЪЕД или СЛОЙТРАНС
СЛОЙОБЪЕД тебе больше подходит - он объединяет два слоя в один (т.е. ты можешь "китайский" слой объединить со слоем "0" например)

2. Что сделать скриптом или вручную - удалить "китайский" слой или изменить активный слой (тот в котором ты находишься сейчас)?
name02 вне форума  
 
Непрочитано 12.11.2024, 09:55
#39
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
но они не работают (пробовал несколько) из-за китайских символов.
Да ладно!

(setq aaa (ssget))
(command "_erase" aaa "")

и нету их...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 12.11.2024, 10:03
#40
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Да ладно!

(setq aaa (ssget))
(command "_erase" aaa "")

и нету их...
Ага, угу. Примитивы внутри блоков, на листах, атрибуты на этих слоях...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 10:06
#41
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Я просто показал, что "китайский" слой в этом смысле
не особо отличается от любого другого.

Суть-то проблемы именно в этом была. Или не?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 12.11.2024, 10:09
#42
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,808


Цитата:
Сообщение от Gretech89 Посмотреть сообщение
Подскажите, как можно удалить слой, если он на китайском?
команда _laydel удаляет слой на китайском и объекта на нём.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 12.11.2024, 10:15
#43
Gretech89


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


name02,
1. Не знаю, может это от версии Автокада зависит? У меня 2021. Команда СЛОЙОБЪЕД не срабатывает, когда пытаюсь выделить объекты на китайском слое..
2. В идеале нужен скрипт, который удалял бы объекты на китайском слое, а затем и сам этот слой.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Да ладно!

(setq aaa (ssget))
(command "_erase" aaa "")

и нету их...
Вот такой вариант сработал! Объекты со слоя удаляются. Однако надо потом удалить сам китайский слой..

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
команда _laydel удаляет слой на китайском и объекта на нём.
не срабатывает(
Gretech89 вне форума  
 
Непрочитано 12.11.2024, 10:57
#44
name02


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


Цитата:
Сообщение от Gretech89 Посмотреть сообщение
не срабатывает(
Удалять можно только неактивный в данный момент слой!

Удалить слой можно так:
Код:
[Выделить все]
 (defun c:LDEL (/ a)

  (setvar 'CLAYER "0")
  (setq a (car (entsel "\nУкажите объект на удаляемом слое:")))
  (command-s "_LAYDEL" a "" "_Y")
  (princ)

) ;_ end defun
name02 вне форума  
 
Непрочитано 12.11.2024, 11:28
#45
Gretech89


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


koMon, name02, извиняюсь, да, всё срабатывает (команда _LAYDEL).
Я так понимаю только таким образом можно удалить объекты и сам китайский слой?
Указать в самом скрипте (например в #13 от VVA) китайский слой видимо не возможно.. Автокад не воспринимает китайские символы..
Gretech89 вне форума  
 
Непрочитано 12.11.2024, 11:45
#46
Кулик Алексей aka kpblc
Moderator

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


Offtop: Точнее, не ACAD, а лисп.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.02.2025, 10:52
#47
Gretech89


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


Цитата:
Сообщение от Gretech89 Посмотреть сообщение
Подскажите, как можно удалить слой, если он на китайском? Пробовал сохранять скрипты в кодировке Юникод, результатов не дало.
Пример файла с китайским слоем:
Решение найдено. Как вариант можно так поступать: перейти в слой 0, выбрать и удалить объекты на китайском слое, затем удалить все пустые слои.
Как оказалось иероглифы можно записать шестнадцатеричными номерами символов в стандарте Юникод. Например, "面板轮廓" можно записать как "\U+9762\U+677F\U+8F6E\U+5ED3".

Код:
[Выделить все]
 (defun C:cn-layer-delete (/ ss)

(command "_layer" "_m" "0" "")
(setq ss (ssget "_X" '((8 . "\U+9762\U+677F\U+8F6E\U+5ED3"))))

(if ss
    (progn (foreach ent ((lambda (/ tab item)
                           (repeat (setq tab  nil
                                         item (sslength ss)
                                         )
                             (setq tab (cons (ssname ss (setq item (1- item))) tab))
                             )
                           )
                         )
             (entdel ent)
             )
            )
           )

(command "_-purge" "_la" "*" "_no")
  
)
Gretech89 вне форума  
 
Непрочитано 05.02.2025, 12:38
1 | #48
name02


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


Тогда уж вот так можно сделать - для более удобного, как мне кажется, использования (можно указывать имя слоя не меняя код программы и отменить, если ошибочно удалил слои):
Код:
[Выделить все]
 (defun C:cn-layer-delete (/ ss layer-name *adoc*)
  
  (setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))
  
  (setvar 'CLAYER "0")

  (setq layer-name (vl-string->list (getstring T "\nУкажите имя удаляемого слоя: ")))
  
  (vla-startundomark *adoc*)
  
  (setq ss (ssget "_X" (list (cons 8 (vl-list->string layer)))))

  (if ss
    (progn (foreach ent ((lambda (/ tab item)
                           (repeat (setq tab  nil
                                         item (sslength ss)
                                   ) ;_ end setq
                             (setq tab (cons (ssname ss (setq item (1- item))) tab))
                           ) ;_ end repeat
                         ) ;_ end lambda
                        )
             (entdel ent)
           ) ;_ end foreach
    ) ;_ end progn
  ) ;_ end if

  (command "_-purge" "_la" "*" "_no")
  
  (vla-endundomark *adoc*)
  
) ;_ end defun
name02 вне форума  
 
Непрочитано 05.02.2025, 14:04
#49
Gretech89


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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить атрибут? пончеГ AutoCAD 16 30.01.2020 13:13
Как программно удалить неиспользуемые стили мультивыносок. 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