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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматический перенос размеров на слой размеры. Break макро

Автоматический перенос размеров на слой размеры. Break макро

Ответ
Поиск в этой теме
Непрочитано 01.03.2005, 12:58
Автоматический перенос размеров на слой размеры. Break макро
Piton
 
Инженер строитель
 
Москва
Регистрация: 24.02.2005
Сообщений: 396

Подскажите макрос на кнопку чтоб команда break разрывала в двух указанных точках (First point, second break point). ACAD2005
---
Добавлено (спасибо VVA): Рабочие варианты
#25
#190
#272
#273

Последний раз редактировалось Кулик Алексей aka kpblc, 16.11.2012 в 13:42.
Просмотров: 171858
 
Непрочитано 12.09.2008, 22:55
#101
Кулик Алексей aka kpblc
Moderator

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


На палитрах штатными средствами AutoCAD можно разместить строго определенные Flyout'ы. Для создания собственных надо капитально ломать голову и, по-моему, использовать как минимум dll, подгружаемые через _.netload или ObjectARX. И, по-моему, в "чистом" autoCAD'e далеко не каждому инструменту можно назначить "любую" кнопку.
Ты, по-моему, немного не договариваешь о группировке палитр. Кстати, все эти вопросы уже поднимались на форуме (по-моему, в теме по играм с CUI).
---
По #96 : увы и ах, сейчас капитально не хватает времени на исправление. Может, кто из зубров подключится...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.09.2008, 10:05
#102
andrew_ro

Светопрозрачные конструкции, проектирование
 
Регистрация: 29.07.2008
Сообщений: 47


Да, видимо работы у всех действительно много. Будем ждать зимы.
Всем спасибо.
andrew_ro вне форума  
 
Непрочитано 20.09.2008, 16:30
#103
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Цитата:
Сообщение от Красин Посмотреть сообщение
Если будет время, с большим удовольствием это сделаю, пусть я и не эксперт, вдруг кому пригодится.
Я напоминаю о твоем обещании и надеюсь, что время найдется. Итак, как сделать в палитре вылетающие кнопки? Как сделать картинки? Я знаю про картинки только через CUI
Vova вне форума  
 
Непрочитано 20.09.2008, 18:20
#104
Красин


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


Цитата:
Сообщение от Vova Посмотреть сообщение
Я напоминаю о твоем обещании и надеюсь, что время найдется. Итак, как сделать в палитре вылетающие кнопки? Как сделать картинки? Я знаю про картинки только через CUI
Про создание картинок:
1) Если есть талант художника: рисуете квадрат в Автокаде, в этот квадрат вписываете свою картинку обычными примитивами автокада.
2) создаете из того, что вы вписали в квадрат, блок с характерным названием <название>, чтобы потом его найти.
3) сохраняете чертеж
4) перетаскиваете вхождение созданого вами блока на палитру. По успешному помещению этого блока на палитру автокад создает в папке ToolPallette\Pallettes\Images два рисунка в формате PNG с названиями <название>32.png и <название>64.png. Путь к ToolPallette можно посмотеть в Options на вкладке Files->Tool Pallettes File Location.
5)выделяте на tool pallette свой lisp, правым кликом вызываете контекстное меню, выбираете пункт Specify image.. - должен появиться стандартный диалог выбора файла с допустимыми расширениями gif,jpeg,bmp,png и открыться по умолчанию он должен именно в папке ToolPallette\Pallettes\Images. Указываете любую из созданных в п.4 картинок - и все: вместо стандартной картинки с листом бумаги со скобками и надписью LISP на нем появляется ваша иконка.

В принципе, картинку можно подготовить в любом графическом редакторе, но так как вы владеете авткадом, проще нарисовать в нем.
Блок нужен только для генерации картинки.

С вылетающими кнопками я погорячился, похоже, в автокаде все два предустановленных флайоута - с командами рисования и с размерами. Я даже не знаю пока, есть ли возможность создать дополнительные.
Я также думаю, что народ, который постился в теме "игры с CUI" знаем по-более моего, так что следите за новыми сообщениями там.


Чтобы создать свой лисп на палитре, перетащите туда любой примитив типа линии, текста из риснунка, зайдете в свойства созданного инструмента (properties в контекстном меню по правому клику ), выставьте use flyout в No, а Command string - ваш лисп или макрос. Можно перетащить на палитру команду из диалога настройки CUI

Последний раз редактировалось Красин, 20.09.2008 в 18:33.
Красин вне форума  
 
Непрочитано 09.10.2008, 04:22
#105
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,535
<phrase 1= Отправить сообщение для wetr с помощью Skype™


VVA, а можно дополнить лисп №25 еще 2 элементами:
Перенос _table в слой "Таблицы"
Перенос _mleader в слой "_Выноски"?
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 09.10.2008, 10:16
#106
VVA

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


wetr, Обновил #25. С цветами слоев думаю сам разберешься
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.10.2008, 10:57
#107
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,535
<phrase 1= Отправить сообщение для wetr с помощью Skype™


VVA, отлично все работает!!!
Но есть 2 момента.
1) Реактор не срабатывает при вставке таблицы с помощью лиспа "vrc.lsp"
2) Реактор не срабатывает при вставке таблицы с помощью _dataextraction
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 09.10.2008, 12:39
#108
VVA

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


wetr, Реактор срабатывает на команду (например _table), а таблица в vrc вставляется с помощью vla-* методов. Реактор никоим способом ее не видит. Здесь нужно назначать слой таблицы в vrc.
Предлагаю использовать или ф-цибю Алексея _kpblc-layer-create из #47 или ее модификацию _dwgru-layer-create
Отличия
Цитата:
* Добавлен новый параметр suff - суффикс слоя, если он есть, то имя слоя получаестся путем
* добавления к имени существующего слоя суффикса suff
Подробнее вызов описан в примечаниях
Тогда код из #25 может выглядеть так
Важно Необходима ф-ция _dwgru-layer-create отсюда http://dwg.ru/f/showpost.php?p=93168&postcount=3
Код:
[Выделить все]
;;;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;;; Необходима ф-ция _dwgru-layer-create отсюда http://dwg.ru/f/showpost.php?p=93168&postcount=3
;;; Автор идеи Torino, он же Кочетков Андрей 
;;;Автоматический перенос размеров на слой "размеры" 
;;;и заливки на слой "заливка" 
;;;Просто добавь этот файл в автозагрузку

(vl-load-com)
(_dwgru-layer-create '(("name" . "Размеры")("color" . 1)))
(_dwgru-layer-create '(("name" . "Штриховка")("color" . 5)))
(_dwgru-layer-create '(("name" . "Текст")("color" . 6)))
(_dwgru-layer-create '(("name" . "Таблицы")("color" . 2)))
(_dwgru-layer-create '(("name" . "Выноски")("color" . 3)))
(setq *OldLayer* nil) 
;;;;;;По аналогии добавить создание своего слоя 
;;; ... 
;;;;;; 
;;;;;;------------------------------------------------------------- 
(if *vlr-cmd*
  (progn
    (setq *vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
    ) ;_ end of progn
  ) ;_ end of if
(if (not *vlr-cmd*)
  (setq	*vlr-cmd* (vlr-command-reactor "cmd"
		    '((:vlr-commandwillstart . cmd-start)
		      (:vlr-commandended . cmd-end)
		      (:vlr-commandcancelled . cmd-end)
		      (:vlr-commandfailed . cmd-end)))))
;;;;;;------------------------------------------------------------- 
(defun cmd-start (calling-reactor startcommandInfo / thecommandstart) 
   (setq thecommandstart (nth 0 startcommandInfo))
  (if (null *OldLayer*)(setq *OldLayer* (getvar "CLAYER")))
  (cond 
 ;;;_Реакция на начало команды DIM* (DIMALIGNED DIMLINEAR и все что начинается с DIM)    
    ((wcmatch thecommandstart "DIM*")  ;_Если выполняется команда DIM* 
     (setvar "clayer" "размеры")       ;_Слой размеры должен быть создан выше (vl-cmdf "_layer" ... 
    ) 
 ;;; Конец реакции на DIM*    
    ((wcmatch thecommandstart "*HATCH*") ;_Если выполняется команда *HATCH* 
     (setvar "clayer" "штриховка") 
    ) 
    ((wcmatch thecommandstart "*TEXT") ;_Если выполняется команда *TEXT (TEXT DTEXT) 
     (setvar "clayer" "Текст") 
    )
    ((wcmatch thecommandstart "*TABLE") ;_Если выполняется команда *TEXT (TEXT DTEXT) 
     (setvar "clayer" "Таблицы") 
    )
    ((wcmatch thecommandstart "*LEADER") ;_Если выполняется команда *QLEADER MLEADER
     (setvar "clayer" "Выноски") 
    )
    (t nil)) 
  (princ)) 
 ;;;------------------------------------------------------------- 
(defun cmd-end (calling-reactor cmd / cmd_name)
(setq cmd_name (strcase (car cmd)))
(if (or
      (wcmatch cmd_name "*HATCH*") ;_Если выполняется команда DIM*
      (wcmatch cmd_name "DIM*")    ;_Если выполняется команда *HATCH*
      (wcmatch cmd_name "*TEXT")   ;_Если выполняется команда *TEXT (TEXT DTEXT)
      (wcmatch cmd_name "*TABLE")   ;_Если выполняется команда ТАБЛИЦА
      (wcmatch cmd_name "*LEADER")   ;_Если выполняется команда *QLEADER или MLEADER
      )
  (progn
    (if *OldLayer* (setvar "clayer" *OldLayer*)) 
    (setq *OldLayer* nil)
    ))
 (princ))
А в vrc нужно добавить что-то типа такого :
Код:
[Выделить все]
;;; В переменной table vla-указатель на добавленную таблицу
(vla-put-layer table (vla-get-name(_dwgru-layer-create '(("name" . "Таблицы")))))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.10.2008, 13:48
#109
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,535
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Дело в том, что функция Алексея не работает в 2009 каде. Ну или я ее не смог запустить. Поместил в автогагрузку, а при создании нового файла пишет
Код:
[Выделить все]
AutoCAD menu utilities loaded.; error: no function definition: 
VLAX-GET-ACAD-OBJECT
Проверил в 2006 - код Алексея работает
Твой код работает на ура. Я потому к тебе и обратился.
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 09.10.2008, 13:52
#110
VVA

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


wetr, Добавь в начало (vl-load-com) (лучше самой первой строкой автозагрузки (mnl или lsp файла)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.10.2008, 14:13
#111
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,535
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Цитата:
wetr, Добавь в начало (vl-load-com) (лучше самой первой строкой автозагрузки (mnl или lsp файла)
ага, заработало.
И в эту функцию _dwgru-layer-create, тоже добавить пришлось.
Цитата:
Предлагаю использовать или ф-цию Алексея
Владимир, как скажешь!

А в чем отличия? Я заметил только, что реактор крыса создает слои только после выполнения команды, а твой сразу при загрузке нового файла
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 09.10.2008, 14:20
#112
VVA

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


Про реакторы не скажу, не смотрел.
_dwgru-layer-create отличается от ф-ции Алексея только
Цитата:
* Добавлен новый параметр suff - суффикс слоя, если он есть, то имя слоя получаестся путем
* добавления к имени существующего слоя суффикса suff
Выполни
Код:
[Выделить все]
(_dwgru-layer-create '(("suff" . "_Проба")))
Запомни имя текущего слоя и посмотри на созданные слои
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 09.10.2008 в 17:56.
VVA вне форума  
 
Непрочитано 09.10.2008, 16:38
#113
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,535
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Спасибо, VVA. Теперь я знаю для кого пишут коменты в лиспах
Вот здесь попробовал - все получилось. Добавил еще непечатаемый слой "_Вспомогательные" реагирует на простановку _xline. И добавил обработку команды _dataextraction. Все работает вроде. Тьфу-тьфу, штоб не сглазить
В общем с меня пыво
Код:
[Выделить все]
(vl-load-com)
;;;================== Сервисные ф-ции BEGIN

;|
* Ф-ция str-str-lst
* Сервисная ф-ция извлечения из строки данных, разделенных
* каким либо символом или строкой символов
* Возвращает список строк
* Аргументы [Type]:
  str - строка для разбора [STRING]
  pat - разделитель [STRING]
*  Пример запуска
  (setq str "мы;изучаем;рекурсии" pat ";")
  (setq str "мы — изучаем — рекурсии" pat " — ")
  (str-str-lst str pat)
* Читать подробнее http://www.autocad.ru/cgi-bin/f1/board.cgi?t=25113OT
|;
(defun str-str-lst (str pat / i)
  (cond ((= str "") nil)
        ((setq i (vl-string-search pat str))
         (cons (substr str 1 i)
               (str-str-lst (substr str (+ (strlen pat) 1 i)) pat)
         ) ;_  cons
        )
        (t (list str))
  ) ;_  cond
) ;_  defun
;|=============================================================================
*   На основе ф-ции _kpblc-layer-create
*   http://dwg.ru/forum/viewtopic.php?t=3116&start=45&sid=fab803bd4dbda125ffdc6c07563f682a
*   пост № 47
*   Добавлен новый  параметр  suff - суффикс слоя, если он есть, то имя слоя получаестся путем
*   добавления к имени существующего слоя суффикса suff
*   Создание слоя с указанными параметрами.
*   Параметры вызова:
*   layer-list   список параметров слоя вида:
   '(("name" . "TestLayer")   ; имя слоя. может быть пропущено, если указан suff
     ("color" . 3)         ; номер цвета. nil -> 7
     ("lw" . 50)         ; вес линии слоя. nil -> 25
*                          Оно выражается в сотых долях миллиметра и может быть любым
*                          из следующего ряда: 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70,
*                          80, 90, 100, 106, 120, 140, 158, 200 и 211.
     ("lt" . "hidden")      ; тип линии слоя. nil -> Continuous
               ; Если описания типа линии в acadiso.lin
               ; нет, обязательно указывать следующий
               ; параметр
   ("ltfile" . "c:\\cad\\ltypes\\lt.lin")   ; полный путь к файлу с описанием
               ; типа линии. Если файл находится в путях
               ; поддержки, путь можно не указывать
   ("plot" . "y")         ; Печатать ("y") или нет ("n") слой.
               ; nil -> "y"
   ("suff" . "_Размеры")  ;_Добавляемый суффикс с текущему слою. Если задан, поле "name" игнорируется            
   )
*    Возвращает vla-указатель на созданный слой. Если слой существует, его
* настройки приводятся в соответствие с переданным списком.
*    Слой размораживается, разблокируется и включается. Не активируется.
* Примеры:
  (_dwgru-layer-create '(("name" . "Test")("color" . 1)("lw" . 50)))
* создать если нет и слой Test цветом 1 (красный) весом линии 0.5

=========================================================================|;

(defun _dwgru-layer-create (layer-list / vla_layer buf)
       (setq *MIP-CLAYER-PROP-SETTING*
     (list (cons "layer"
   (vla-get-activelayer (vla-get-activedocument (vlax-get-acad-object)))
   ) ;_ end of cons
    (cons "color" (getvar "cecolor"))
    (cons "lw" (getvar "celweight"))
    (cons "lt" (getvar "celtype"))
    ) ;_ end of list
    ) ;_ end of setq

  ;;;Если есть suff добавляем в начало списка,
  ;;;чтобы assoc нашел раньше
  (if (cdr(assoc "suff" layer-list))
    (progn
     (setq layer-list (vl-remove (assoc "name" layer-list) layer-list))
     (setq layer-list (append (list(cons "name" (strcat (getvar "clayer") (cdr(assoc "suff" layer-list))))) layer-list))
    )
  )
  (setq vla_layer
  (vla-add
    (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
    (if (snvalid (cdr (assoc "name" layer-list)))
        (cdr (assoc "name" layer-list))
        "0"
      )
    ) ;_ end of vla-add
 ) ;_ end of setq
  (vla-put-color
    vla_layer
    (if (setq buf (cdr (assoc "color" layer-list)))
      buf
      7
      ) ;_ end of if
    ) ;_ end of vla-put-color
  (vla-put-lineweight
    vla_layer
    (if (setq buf (cdr (assoc "lw" layer-list)))
      (if (member buf (list acLnWt000  acLnWt030  acLnWt090
    acLnWt005  acLnWt035  acLnWt100
    acLnWt009  acLnWt040  acLnWt106
    acLnWt013  acLnWt050  acLnWt120
    acLnWt015  acLnWt053  acLnWt140
    acLnWt018  acLnWt060  acLnWt158
    acLnWt020  acLnWt070  acLnWt200
    acLnWt025  acLnWt080  acLnWt211
    )
    )
    buf
    acLnWtByLwDefault
 )
      acLnWtByLwDefault
      ) ;_ end of if
    ) ;_ end of vla-put-lineweight
  (if (and (setq buf (cdr (assoc "lt" layer-list)))
    (_kpblc-linetype-load
      buf
      (cdr (assoc "ltfile" layer-list))
      ) ;_ end of _kpblc-linetype-load
    ) ;_ end of and
    (vla-put-linetype vla_layer (cdr (assoc "lt" layer-list)))
    (vla-put-linetype vla_layer "Continuous")
    ) ;_ end of if
  (vla-put-plottable
    vla_layer
    (if (= (cdr (assoc "plot" layer-list)) "n")
      :vlax-false
      :vlax-true
      ) ;_ end of if
    ) ;_ end of vla-put-Plottable
  (vla-put-lock vla_layer :vlax-false)
  (vla-put-layeron vla_layer :vlax-true)
  (if (not (equal (vla-get-activelayer (vla-get-activedocument (vlax-get-acad-object)))
    vla_layer
    ) ;_ end of equal
    ) ;_ end of not
    (vla-put-freeze vla_layer :vlax-false)
    ) ;_ end of if
  vla_layer
  ) ;_ end of defun

;;;================== Сервисные ф-ции END

;;; Реактор

(or *kpblc-activedoc*
  (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))))

(setq VLR-react (VLR-SysVar-Reactor nil (list '(:VLR-sysVarChanged . chrzmstyle)))) 
(defun chrzmstyle (name event / nstyle)
  (if (= (car event) "DIMSTYLE")
    (progn
      (setq nstyle (getvar "DIMSTYLE")
	    nstyle (str-str-lst nstyle "_")
	    nstyle (VL-STRING-RIGHT-TRIM "_" (apply 'strcat (mapcar '(lambda (x) (strcat x "_"))(cdr nstyle)))))
      (if (snvalid nstyle)
	(progn
	  (setq nstyle (strcat "Размерные_" nstyle))
	  (vla-put-activelayer *kpblc-activedoc*
          (_dwgru-layer-create (list (cons "name" nstyle))))
	  )
	)
      )
    )
  (princ) 
  )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Автор идеи Torino, он же Кочетков Андрей 
;;;Автоматическая простановка размеров в слое "_Размеры", 
;;;штриховки в слое "_Штриховки", текстов в слое "_Тексты", 
;;;таблиц в слое "_Таблицы", лидеров в слое "_Выноски", прямых
;;;в слое "_Вспомогательный". Реактор работает только с указанными
;;;командами. 
;;;Просто добавь этот файл в автозагрузку

(vl-load-com)
(_dwgru-layer-create '(("name" . "_Размеры")("color" . 150)("lw" . 13)))
(_dwgru-layer-create '(("name" . "_Штриховки")("color" . 5)("lw" . 9)))
(_dwgru-layer-create '(("name" . "_Тексты")("color" . 6)("lw" . 15)))
(_dwgru-layer-create '(("name" . "_Таблицы")("color" . 2)("lw" . 20)))
(_dwgru-layer-create '(("name" . "_Выноски")("color" . 3)("lw" . 15)))
(_dwgru-layer-create '(("name" . "_Вспомогательные")("color" . 1)("lw" . 15)("plot" . "n")))
(setq *OldLayer* nil) 
;;;;;;По аналогии добавить создание своего слоя 
;;; ... 
;;;;;; 
;;;;;;------------------------------------------------------------- 
(if *vlr-cmd*
  (progn
    (setq *vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
    ) ;_ end of progn
  ) ;_ end of if
(if (not *vlr-cmd*)
  (setq	*vlr-cmd* (vlr-command-reactor "cmd"
		    '((:vlr-commandwillstart . cmd-start)
		      (:vlr-commandended . cmd-end)
		      (:vlr-commandcancelled . cmd-end)
		      (:vlr-commandfailed . cmd-end)))))
;;;;;;------------------------------------------------------------- 
(defun cmd-start (calling-reactor startcommandInfo / thecommandstart) 
   (setq thecommandstart (nth 0 startcommandInfo))
  (if (null *OldLayer*)(setq *OldLayer* (getvar "CLAYER")))
  (cond 
 ;;;_Реакция на начало команды DIM* (DIMALIGNED DIMLINEAR и все что начинается с DIM)    
    ((wcmatch thecommandstart "DIM*")  ;_Если выполняется команда DIM* 
     (setvar "clayer" "_Размеры")       ;_Слой размеры должен быть создан выше (vl-cmdf "_layer" ... 
    ) 
 ;;; Конец реакции на DIM*    
    ((wcmatch thecommandstart "*HATCH*") ;_Если выполняется команда HATCH 
     (setvar "clayer" "_Штриховки") 
    ) 
    ((wcmatch thecommandstart "*TEXT") ;_Если выполняется команда TEXT DTEXT 
     (setvar "clayer" "_Тексты") 
    )
    ((wcmatch thecommandstart "*TABLE") ;_Если выполняется команда TABLE 
     (setvar "clayer" "_Таблицы") 
    )
    ((wcmatch thecommandstart "*LEADER") ;_Если выполняется команда QLEADER MLEADER
     (setvar "clayer" "_Выноски")
    )
    ((wcmatch thecommandstart "*XLINE") ;_Если выполняется команда XLINE
     (setvar "clayer" "_Вспомогательные")
    )
    ((wcmatch thecommandstart "*DATAEXTRACTION") ;_Если выполняется команда dataextraction
     (setvar "clayer" "_Таблицы")
    )
    (t nil)) 
  (princ)) 
 ;;;------------------------------------------------------------- 
(defun cmd-end (calling-reactor cmd / cmd_name)
(setq cmd_name (strcase (car cmd)))
(if (or
      (wcmatch cmd_name "*HATCH*") ;_Если выполняется команда DIM*
      (wcmatch cmd_name "DIM*")    ;_Если выполняется команда *HATCH*
      (wcmatch cmd_name "*TEXT")   ;_Если выполняется команда *TEXT (TEXT DTEXT)
      (wcmatch cmd_name "*TABLE")   ;_Если выполняется команда ТАБЛИЦА
      (wcmatch cmd_name "*LEADER")   ;_Если выполняется команда *QLEADER или MLEADER
      (wcmatch cmd_name "*XLINE")   ;_Если выполняется команда *XLINE
      (wcmatch cmd_name "*DATAEXTRACTION")   ;_Если выполняется команда *DATAEXTRACTION
      )
  (progn
    (if *OldLayer* (setvar "clayer" *OldLayer*)) 
    (setq *OldLayer* nil)
    ))
 (princ))
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)

Последний раз редактировалось wetr, 09.10.2008 в 16:47.
wetr вне форума  
 
Непрочитано 11.10.2008, 11:39
#114
gipro

лайсенсед инжиниа
 
Регистрация: 15.04.2006
город-герой Волгоград (Сталинград)
Сообщений: 1,158


VVA, у меня возникает следующая проблема... Код из поста 25 работает, но после завершения команды часто возвращается не на предыдущий слой, а на сохраненный по умолчанию текущим в шаблоне чертежа. Иногда вообще не возвращается. У меня стоит AutoCAD 2008 русский + СПДС. Может это в ней дело?
Прикладываю ролики...
Вложения
Тип файла: rar video.rar (957.8 Кб, 199 просмотров)
gipro вне форума  
 
Непрочитано 11.10.2008, 18:35
#115
VVA

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


gipro, Вполне возможно. У меня нет опыта эксплуатации #25. Скорее это нужно спросить у wetr (про возвращение слоя). Там все простою: при старте команды слой запоминается в переменной и устанавливается текущим, по окончании восстанавливается сохраненный.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 11.10.2008 в 23:02.
VVA вне форума  
 
Непрочитано 11.10.2008, 20:34 Автоматический перенос размеров на слой размеры. Break макро
#116
andrew_ro

Светопрозрачные конструкции, проектирование
 
Регистрация: 29.07.2008
Сообщений: 47


VVA, wetr: ну просто супер!
Однако есть одно несущественное неудобство. Допустим нужно открыть файл только чтобы просмотреть его содержимое не производя никаких действий. В этом случае при закрытии файла AutoCAD выдает запрос о сохранении изменений. А если таких файлов нужно открыть и закрыть несколько подряд (мне иногда приходится просматривать каталоги алюминиевых профилей в dwg-формате) - появляется много рутины.
В связм с этим вопрос: нельзя ли создание слоя повесить не на открытие чертежа, а на ту или иную команду, как это сделано у kpblca в #47.
Буду очень благодарен
andrew_ro вне форума  
 
Непрочитано 11.10.2008, 23:25
#117
VVA

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


andrew_ro, Вариант из #25 (вариант с функциями _dwgru-layer-create в коментариях, сама ф-ция по ссылке #108 или в #113)
Две команды:
CRON - Command Reactor ON Включает командный реактор
CROFF - Command Reactor OFF Отключает командный реактор.
Можно в процессе работы приостанавливать разнос примитивов по слоям и снова включать
Код:
[Выделить все]
;;; Автор идеи Torino, он же Кочетков Андрей 
;;;Автоматический перенос размеров на слой "размеры" 
;;;и заливки на слой "заливка" 

(vl-load-com)
;;;Команда включает реактор
;;; CrOn - Command Reactor On
(defun C:CrOn ()
(setq *OldLayer* (getvar "CLAYER")) 
(vl-cmdf "_layer" "_make" "Размеры" "_color" 151 "" "") ;_Создаем слой размеры и задаем цвет 151 ... 
(vl-cmdf "_layer" "_make" "Штриховка" "_color" 5 "" "") ;_Создаем слой штриховка и задаем цвет 5 
(vl-cmdf "_layer" "_make" "Текст" "_color" 6 "" "")     ;_Создаем слой текст и задаем цвет 6
(vl-cmdf "_layer" "_make" "Таблицы" "_color" 6 "" "")     ;_Создаем слой таблицы и задаем цвет 6
(vl-cmdf "_layer" "_make" "Выноски" "_color" 6 "" "")     ;_Создаем слой таблицы и задаем цвет 6
;;;;;;По аналогии добавить создание своего слоя 
;;; ...
;;; Вариант с функцией _dwgru-layer-create
;;; отсюда   http://forum.dwg.ru/showpost.php?p=294776&postcount=108
;;;===============================================================
;;;
;;;(_dwgru-layer-create '(("name" . "Размеры")("color" . 1)))
;;;(_dwgru-layer-create '(("name" . "Штриховка")("color" . 5)))
;;;(_dwgru-layer-create '(("name" . "Текст")("color" . 6)))
;;;(_dwgru-layer-create '(("name" . "Таблицы")("color" . 2)))
;;;(_dwgru-layer-create '(("name" . "Выноски")("color" . 3)))
;;;
;;;==============================================================
  
(setvar "clayer" *OldLayer*) 
(setq *OldLayer* nil) 
(if *vlr-cmd*
  (progn
    (setq *vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
    ) ;_ end of progn
  ) ;_ end of if
(if (not *vlr-cmd*)
  (setq	*vlr-cmd* (vlr-command-reactor "cmd"
		    '((:vlr-commandwillstart . cmd-start)
		      (:vlr-commandended . cmd-end)
		      (:vlr-commandcancelled . cmd-end)
		      (:vlr-commandfailed . cmd-end)))))
)
;;;Выключает командный реактор
;;;CrOff - Command reactor off
(defun C:CrOff ()
    (setq *vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
  )
;;;;;;------------------------------------------------------------- 
(defun cmd-start (calling-reactor startcommandInfo / thecommandstart) 
   (setq thecommandstart (nth 0 startcommandInfo))
  (if (null *OldLayer*)(setq *OldLayer* (getvar "CLAYER")))
  (cond 
 ;;;_Реакция на начало команды DIM* (DIMALIGNED DIMLINEAR и все что начинается с DIM)    
    ((wcmatch thecommandstart "DIM*")  ;_Если выполняется команда DIM* 
     (setvar "clayer" "размеры")       ;_Слой размеры должен быть создан выше (vl-cmdf "_layer" ... 
    ) 
 ;;; Конец реакции на DIM*    
    ((wcmatch thecommandstart "*HATCH*") ;_Если выполняется команда *HATCH* 
     (setvar "clayer" "штриховка") 
    ) 
    ((wcmatch thecommandstart "*TEXT") ;_Если выполняется команда *TEXT (TEXT DTEXT) 
     (setvar "clayer" "Текст") 
    )
    ((wcmatch thecommandstart "*TABLE") ;_Если выполняется команда *TEXT (TEXT DTEXT) 
     (setvar "clayer" "Таблицы") 
    )
    ((wcmatch thecommandstart "*LEADER") ;_Если выполняется команда *QLEADER MLEADER
     (setvar "clayer" "Выноски") 
    )
    (t nil)) 
  (princ)) 
 ;;;------------------------------------------------------------- 
(defun cmd-end (calling-reactor cmd / cmd_name)
(setq cmd_name (strcase (car cmd)))
(if (or
      (wcmatch cmd_name "*HATCH*") ;_Если выполняется команда DIM*
      (wcmatch cmd_name "DIM*")    ;_Если выполняется команда *HATCH*
      (wcmatch cmd_name "*TEXT")   ;_Если выполняется команда *TEXT (TEXT DTEXT)
      (wcmatch cmd_name "*TABLE")   ;_Если выполняется команда ТАБЛИЦА
      (wcmatch cmd_name "*LEADER")   ;_Если выполняется команда *QLEADER или MLEADER
      )
  (progn
    (if *OldLayer* (setvar "clayer" *OldLayer*)) 
    (setq *OldLayer* nil)
    ))
 (princ))
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 12.10.2008 в 15:38. Причина: орфография
VVA вне форума  
 
Непрочитано 11.10.2008, 23:59
#118
andrew_ro

Светопрозрачные конструкции, проектирование
 
Регистрация: 29.07.2008
Сообщений: 47


VVA, спасибо. Возможность откл/вкл реактор добавляет универсальность программе.
И еще я не пойму как задать суффикс имени слоя. Если я правильно понял, при открытии чертежа, в котором есть слой "Размеры", имя слоя изменится на "_Размеры" без создания нового слоя? Какую строку и в какое место в коде нужно добавить? Перепробовал несколько вариантов с учетом #112, но в результате: например, если говорить о нулевом слое, появляется слой с именем "0_Размеры". Что я делаю не так?
andrew_ro вне форума  
 
Непрочитано 12.10.2008, 11:21
#119
andrew_ro

Светопрозрачные конструкции, проектирование
 
Регистрация: 29.07.2008
Сообщений: 47


VVA,
Цитата:
CRON - Command Reactor ON Включает командный ректор
CROFF - Command Reactor OFF Отключает командный ректор
работает именно так:
Цитата:
...процессе работы приостанавливать разнос примитивов по слоям и снова включать
.
А хотелось бы из открытого чертежа отключать создание слоев во вновь открываемых файлах.
P.S. Я извиняюсь за навязчивось, уж больно полезная программа и хочется отшлифовать ее.
andrew_ro вне форума  
 
Непрочитано 12.10.2008, 13:53
#120
MichaelBY


 
Регистрация: 09.12.2007
Минск
Сообщений: 22
<phrase 1= Отправить сообщение для MichaelBY с помощью Skype™


Всема большое спасибо за сие создание

Последний раз редактировалось MichaelBY, 12.10.2008 в 14:04.
MichaelBY вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматический перенос размеров на слой размеры. Break макро

Размещение рекламы