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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Отключение непечатаемых слоев

Отключение непечатаемых слоев

Ответ
Поиск в этой теме
Непрочитано 05.09.2007, 11:55 #1
Отключение непечатаемых слоев
Makswell
 
Инженер-строитель
 
Киров
Регистрация: 15.08.2007
Сообщений: 2,254

Написал прогу для отключения непечатаемых слоев:
Код:
[Выделить все]
(defun c:m-Layoff (/ LayListNoPrint LayName)
;;;  Программа для отключения непечатаемых слоев
  (setq	LayListNoPrint
	 '("Defpoints"				"M-00-work (no_print)"
	   "M-00_1-help text (no_print)"	"M-00_2-help draw (no_print)"
	   "M-00_3-blok text (no_print)"
	  )
  ) ;_ setq
  (foreach LayName LayListNoPrint
    (vl-cmdf "_.-layer"
	     "_off"
	     LayName
	     (if (= (getvar "CLayer") LayName)
	       "_Yes"
	       ""
	     ) ;_ if
    ) ;_ vl-cmdf
  ) ;_ foreach
  (vl-cmdf)
  (foreach LayName LayListNoPrint
    (if	(= (getvar "CLayer") LayName)
      (alert "Текущий слой был отключен!!!")
    ) ;_ if
  ) ;_ foreach
  (princ)
) ;_ defun
Соответственно у меня слои "Defpoints" "M-00-work (no_print)" "M-00_1-help text (no_print)" "M-00_2-help draw (no_print)" "M-00_3-blok text (no_print)" - непечаемые.
Хотелось бы сделать более универсально - чтобы программа корректно работала и с чужими чертежами.
Т.е. чтобы список непечатаемых слоев LayListNoPrint формировался автоматически по признаку непечатаемости слоя.
Просмотров: 2324
 
Непрочитано 05.09.2007, 12:15
#2
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun c:m-layoff (/ adoc)
  ;; Отключение непечатаемых слоев
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for item (vla-get-layers adoc)
    (if (equal (vla-get-plottable item) :vlax-false)
      (vl-catch-all-apply '(lambda () (vla-put-layeron item :vlax-false)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

(defun c:m-layonoff (/ adoc)
  ;; Отключение непечатаемых слоев и включение печатаемых
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for item (vla-get-layers adoc)
    (vl-catch-all-apply
      '(lambda () (vla-put-layeron item (vla-get-plottable item)))
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.09.2007, 12:37
#3
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,254


Хм, а как бы сделать, чтобы было: (alert "Текущий слой был отключен!!!"). У меня текущий слой сравнивался с элементами списка, а сейчас даже не знаю с чем сравнивать...
Что-то с ActiveX я не очень...
Makswell вне форума  
 
Непрочитано 05.09.2007, 13:01
#4
Кулик Алексей aka kpblc
Moderator

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


с ActiveX не очень дружба водится? Да ладно, там все просто...
А если проверку надо, то делаем так (втупую, на коленке):
Код:
[Выделить все]
(defun c:m-layoff (/ adoc answer)
  ;; Отключение непечатаемых слоев
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for item (vla-get-layers adoc)
    (cond
      ((and (equal (vla-get-activelayer adoc) item)
            (equal (vla-get-plottable item) :vlax-false)
            (not (vl-catch-all-error-p
                   (vl-catch-all-apply
                     '(lambda ()
                        (initget "Да Нет Yes No _ Y N Y N")
                        (setq answer
                               (cond
                                 ((getkword
                                    "\nВыполняется попытка отключения активного слоя. Отключать [Да/Нет] ? <Нет> : "
                                    ) ;_ end of getkword
                                  )
                                 (t "N")
                                 ) ;_ end of cond
                              ) ;_ end of setq
                        ) ;_ end of LAMBDA
                     ) ;_ end of vl-catch-all-apply
                   ) ;_ end of vl-catch-all-error-p
                 ) ;_ end of not
            (= answer "Y")
            ) ;_ end of and
       (vla-put-layeron item :vlax-false)
       )
      ((and (not (equal (vla-get-activelayer adoc) item))
            (equal (vla-get-plottable item) :vlax-false)
            ) ;_ end of and
       (vla-put-layeron item :vlax-false)
       )
      ) ;_ end of cond
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Если появятся профи, быстро нарисуют более правильный и короткий код. Мне думать пока не получается
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.09.2007, 13:23
#5
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,254


Конечно, тебе то просто
Всё работает как надо, спасибо!

PS пойду изучать ActiveX :wink:
Makswell вне форума  
 
Непрочитано 05.09.2007, 13:30
#6
Кулик Алексей aka kpblc
Moderator

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


Краткая логика (кривая, конечно, но чем богаты):
Сначала загружаем activex (vl-load-com)
Ставим метку начала возможной отмены текущего документа (vla-startundomark)
Потом проходим по всем элементам слоев:
(vla-get-layers) возвращает указатель "на массив" слоев документа
(vlax-for) - аналог foreach для этого указателя
То есть проходим по всем элементам и сравниваем сначала: является ли слой активным и непечатаемым, и, если да, проводим запрос. Если не активный, и при этом не печатается - то сразу ставим выключенным.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Отключение непечатаемых слоев

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

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