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

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

Массовое редактирование свойств атрибутов блоков

Ответ
Поиск в этой теме
Непрочитано 15.06.2009, 20:53 1 | #1
Массовое редактирование свойств атрибутов блоков
kgb
 
Программирование САПР
 
Казахстан
Регистрация: 03.09.2007
Сообщений: 5

Доброго времени дня всем участникам форума!
Давно администрирую AutoCad и другое ПО на его базе.
Среди моих пользователей - геологи и маркшейдеры.
В этом году решил выполнить просьбу пользователей добавить в AutoCad более-менее удобный инструмент для редактирования свойств атрибутов блоков "кучей".
Прежде всего благодарности:
1. Алексею Кулику aka kpblc за бесценный материал на данном сайте и других. Стоим на плечах гигантов
2. В. Левину за полезный сайт http://www.levins.land.ru по DCL.

Выполнил все на Lisp, добавил DCL-файл диалога, который вызывается lisp-программой.

С помощью данной проги можно:
1. Изменять координаты точки вставки видимых атрибутов блоков, задавая относительные смещения по вертикали и горизонтали с помощью ползунков или числом.
2. Изменять высоту текста атрибута
3. Изменять угол поворота текста атрибута
4. Помещать атрибуты на отдельный слой чертежа из предлагаемых в выпадающем списке. Последнее позволяет скрыть атрибуты, если слой сделать невидимым.
5. Изменять цвета атрибутов.
Блоки с видимыми атрибутами можно выбрать заранее (неважно, если в выбор попадут другие объекты чертежа - сработает фильтр).
Затем в окне диалога меняем свойства (например, задаем смещения вверх-вниз, влево-вправо точки вставки атрибута.
После закрытия окна диалога выбор не сбрасывается, текущие значения запоминаются, можно продолжать от достигнутого.

Вот листинг файла AttrProptis.lsp:
Код:
[Выделить все]
(defun c:AttrProptis ()
  (vl-load-com) 
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))

  (setq Layers_list nil)
  (vlax-for Item (vla-get-layers adoc)
	(setq Layers_list (append Layers_list (list (vla-get-name Item))))
  )
  (setq Layers_list (cons "" Layers_list))
  (setq Attr_List (AttrInsert))
  (setq Height (nth 0 Attr_List)) ; высота текста атрибута
  (setq TextRotation (nth 1 Attr_List)) ; угол вращения текста атрибута
  (setq TextColor (nth 2 Attr_List)) ; цвет текста атрибута
  (setq Layer_Name (nth 3 Attr_List)) ; слой
  (setq shift_All (cddddr Attr_List)) ; смещения координат точки вставки атрибута
  
  (vla-startundomark adoc)
  (princ "\nВыберите блоки (с видимыми атрибутами) (Enter - завершить) ")
  (if (not
	(setq objSet (ssget "_I" '((0 . "INSERT") (66 . 1))))
      )					;(ssget "_I" '((0 . "INSERT")))))
    (progn (princ "\nВыберите блоки (с видимыми атрибутами) (Enter - завершить) ")
	   (setq objSet (ssget '((0 . "INSERT") (66 . 1))))
    )
  )					; end if
  (while (and objSet
	      (> (sslength objSet) 0)
	 ) ;_ end of and
    (setq item (ssname objSet 0))
    (ssdel item objSet)
    (foreach sub_item
	     (vlax-safearray->list
	       (vlax-variant-value
		 (vla-getattributes (vlax-ename->vla-object item))
	       ) ;_ end of vlax-variant-value
	     ) ;_ end of vlax-safearray->list
      (if (= (vla-get-Invisible sub_item) :vlax-false)
	(progn
	  (setq	insertionpoint (vlax-safearray->list
		       (vlax-variant-value
			 (vla-get-insertionpoint sub_item)
		       )
		     )
	  )
	  (setq oldAlign (vla-get-Alignment sub_item))	; запомнить выравнивания текста
	  (setq	oldAlignTextPoint
		 (vlax-safearray->list
		   (vlax-variant-value
		     (vla-get-TextalignmentPoint sub_item)
		   )
		 )
	  )
	  (vla-put-insertionpoint
	    sub_item
	    (vlax-3d-point (mapcar '+ shift_All insertionpoint))
	  )
	  (if (/= oldAlign acAlignmentLeft)	; восстанавливать вторую точку выравнивания текста, если выравнивание - не влево
	    (vla-put-TextalignmentPoint
	      sub_item
	      (vlax-3d-point
		(mapcar '+ shift_All oldAlignTextPoint)
	      )
	    )
	  )
	  (if (/= TextRotation nil) 
		(vla-put-rotation sub_item (angtof TextRotation 0))
	  )
	  (if (> Height 0)
	      	(vla-put-height sub_item Height)
	  )
	  (if (/= TextColor nil) 
	      	(vla-put-color sub_item TextColor)
	  )
	  (if (/= Layer_Name nil) 
	      	(vla-put-Layer sub_item Layer_Name)
	  )
	) ;_ end of progn
      ) ;_ end if
    ) ;_ end of foreach
  ) ;_ end of while
  (vla-endundomark adoc)
)
(defun AttrInsert( / )
;;;>> Восстановление начальных значений переменных 
  (setq Height 0)
  (setq Rotation 0)
  
  (if (not veb_sl_Left)(setq veb_sl_Left "0"))
  (if (not veb_sl_Right)(setq veb_sl_Right "0"))
  (if (not veb_sl_Up)(setq veb_sl_Up "0"))
  (if (not veb_sl_Down)(setq veb_sl_Down "0"))
  
;;;--- Загрузать файл DCL и поместить его имя в dcl_id
(setq dcl_id (load_dialog "AttrDialog.dcl"))
;;;--- Если этот файл еще не загружен,
;;;--- то открыть его, иначе - выйти  
(if (not (new_dialog "AttrInsert" dcl_id)
    ); конец not
    (exit);если не обнаружен диалог - выход
); конец if
;;;>> Восстановление сохраненных значений переменных   

(set_tile "eb_sl_Left" veb_sl_Left)
(set_tile "eb_sl_Right" veb_sl_Right)
(set_tile "eb_sl_Up" veb_sl_Up)
(set_tile "eb_sl_Down" veb_sl_Down)

(setq middle_sliders (/ (atoi (get_attr "sl_Horizontal" "max_value")) 2))
(setq text_middle_sliders (itoa middle_sliders))

(if (not vsl_Left)(setq vsl_Left text_middle_sliders))
(set_tile "sl_Horizontal" vsl_Left)  

(if (not vsl_Right)(setq vsl_Right text_middle_sliders))
(set_tile "sl_Horizontal" vsl_Right)
  
(if (not vsl_Up)(setq vsl_Up text_middle_sliders))
(set_tile "sl_Vertical" vsl_Up)
  
(if (not vsl_Down)(setq vsl_Down text_middle_sliders))
(set_tile "sl_Vertical" vsl_Down)

(setq TextColor nil)

(setq Layers_index "0")
(setq Layer_Name nil)
;;; Заполнение выпадающего списка именами слоев чертежа
(start_list "Layers_list")
   (mapcar 'add_list Layers_list)
(end_list)
(set_tile "Layers_list" Layers_index)
  
;;;--- Если нажата кнопка "cancel"
;;;--- выполнить функцию (done_dialog), установить флаг act = nil
(action_tile "cancel" "(setq act nil)(done_dialog)"
);конец actio_tile 'сancel'
  
;;;--- Если нажата кнопка "accept"
;;;--- выполнить функцию (done_dialog), установить флаг act =T (true)
(action_tile "accept"  
    "(setq act T)(done_dialog))"
); конец action_tile 'accept'
(start_dialog)	        ;Показать Диалоговое окно
(unload_dialog dcl_id)	;Закрыть Диалоговое окно
  
;;;--- Если выбрана кнопка "cancel"
;;;--- показать сообщение об отмене
(if (= act nil)
      (exit)
); конец if
;;;--- Если выбрана кнопка "accept"
;;;--- показать сообщение об успешном выполнении
(if (= act T)
      (rem_shift)
 ))	; конец if 
 
;;; (princ)); "Тихий" выход и конец программы

;;;>> Подпрограмма формирования списка с данными о высоте текста, вращении и заданных смещениях атрибута
(defun rem_shift()
    (setq shift_Horizontal (- (atof veb_sl_Right) (atof veb_sl_Left)))
    (setq shift_Vertical (- (atof veb_sl_Up) (atof veb_sl_Down)))
    (list Height TextRotation TextColor Layer_Name shift_Horizontal shift_Vertical 0)
);end rem_Data

;;;>> Подпрограммы связи горизонтального ползунка с текстовыми окнами "Левее" и "Правее"
  (defun sl_Horizontal_action ();если сдвинут ползунок
    (setq vsl_Left (get_tile "sl_Horizontal")) ;присвоить переменой значение value ползунка
    (setq vsl_Right (get_tile "sl_Horizontal")) ;присвоить переменой значение value ползунка
    (if (<= (atof vsl_Left) middle_sliders)
      	(progn 
    		(set_tile "eb_sl_Left" (rtos (- 5.0 (/ (atof vsl_Left) 10.0))) );модифицировать и передать это значение в текстовое окно "eb_sl_Left"
	  	(set_tile "eb_sl_Right" "0")
	)
    )
    (if (>= (atof vsl_Right) middle_sliders)
      	(progn 
    		(set_tile "eb_sl_Right" (rtos (- (/ (atof vsl_Right) 10.0) 5.0 )) );модифицировать и передать это значение в текстовое окно "eb_sl_Right"
	  	(set_tile "eb_sl_Left" "0")
	)
    )
    (setq veb_sl_Left (get_tile "eb_sl_Left")) ;присвоить значение value ползунка
    (setq veb_sl_Right (get_tile "eb_sl_Right")) ;присвоить значение value ползунка
  );end defun

  (defun eb_sl_Left_action ();если изменен текст в окне "eb_sl_Left"
	(setq veb_sl_Left (get_tile "eb_sl_Left"));присвоить переменной значение value текстового окна
    	(if (or (/= veb_sl_Left "0") (= (get_tile "eb_sl_Right") "0"))
	  (progn
	    (set_tile "sl_Horizontal" (rtos (* (- 5 (atof veb_sl_Left)) 10)));передать это значение в тайл ползунка
	    (setq vsl_Left (get_tile "sl_Horizontal")) ;присвоить переменой vsl_Left значение value ползунка
	    (set_tile "eb_sl_Right" "0")
	  )
    	)
  );end defun

  (defun eb_sl_Right_action ();если изменен текст в окне "eb_sl_Right"
	(setq veb_sl_Right (get_tile "eb_sl_Right"));присвоить переменной значение value текстового окна
    	(if (or (/= veb_sl_Right "0") (= (get_tile "eb_sl_Left") "0"))
	  (progn
	    (set_tile "sl_Horizontal" (rtos (* (+ (atof veb_sl_Right) 5) 10)));передать это значение в тайл ползунка
	    (setq vsl_Right (get_tile "sl_Horizontal")) ;присвоить переменой vsl_Right значение value ползунка
	    (set_tile "eb_sl_Left" "0")
	  )
	)
  );end defun

;;;>> Подпрограммы связи вертикального ползунка с текстовыми окнами "Выше" и "Ниже"
  (defun sl_Vertical_action ();если сдвинут ползунок
    (setq vsl_Up (get_tile "sl_Vertical")) ;присвоить переменой значение value ползунка
    (setq vsl_Down (get_tile "sl_Vertical")) ;присвоить переменой значение value ползунка
    (if (>= (atof vsl_Up) middle_sliders)
      	(progn 
    		(set_tile "eb_sl_Up" (rtos (- (/ (atof vsl_Up) 10.0) 5.0 )) );модифицировать и передать это значение в текстовое окно "eb_sl"
	  	(set_tile "eb_sl_Down" "0")
	)
    )
    (if (<= (atof vsl_Down) middle_sliders)
      	(progn
    		(set_tile "eb_sl_Down" (rtos (- 5.0 (/ (atof vsl_Down) 10.0))) );модифицировать и передать это значение в текстовое окно "eb_sl"
	  	(set_tile "eb_sl_Up" "0")
	)
    )
    (setq veb_sl_Up (get_tile "eb_sl_Up")) ;присвоить переменой vsl_Up значение value ползунка
    (setq veb_sl_Down (get_tile "eb_sl_Down")) ;присвоить переменой vsl_Down значение value ползунка
  );end defun

  (defun eb_sl_Up_action ();если изменен текст в окне "eb_sl_Up"
    (setq veb_sl_Up (get_tile "eb_sl_Up"));присвоить переменной значение value текстового окна
    (if (or (/= veb_sl_Up "0") (= (get_tile "eb_sl_Down") "0"))
	(progn
	    (set_tile "sl_Vertical" (rtos (* (+ (atof veb_sl_Up) 5) 10)));передать это значение в тайл ползунка
	    (setq vsl_Up (get_tile "sl_Vertical")) ;присвоить переменой vsl_Up значение value ползунка
	    (set_tile "eb_sl_Down" "0")
	)
    )
  );end defun

  (defun eb_sl_Down_action ();если изменен текст в окне "eb_sl_Down"
    (setq veb_sl_Down (get_tile "eb_sl_Down"));присвоить переменной значение value текстового окна
    (if (or (/= veb_sl_Down "0") (= (get_tile "eb_sl_Up") "0"))
	(progn
	    (set_tile "sl_Vertical" (rtos (* (- 5 (atof veb_sl_Down)) 10)));передать это значение в тайл ползунка
	    (setq vsl_Down (get_tile "sl_Vertical")) ;присвоить переменой vsl_Down значение value ползунка
	    (set_tile "eb_sl_Up" "0")
	 )
    )
  );end defun

  (defun TextHeight_action ();если изменен текст в окне "Высота текста"
    (setq TextHeight (get_tile "TextHeight"));присвоить переменной значение value текстового окна
    (if (/= TextHeight nil) 
	(setq Height (atof TextHeight))
        (setq Height 0)
    )
  );end defun

  (defun TextRotation_action ();если изменен текст в окне "Высота текста"
    (setq TextRotation (get_tile "TextRotation"));присвоить переменной значение value текстового окна
  );end defun

  (defun TextColor_action ();если нажата кнопка "Палитра"
    (setq TextColor (acad_colordlg 0));присвоить переменной номер цвета из 256-цветной палитры
  );end defun

  (defun Layers_list_action ();если нажата кнопка "Палитра"
    (setq Layers_index (get_tile "Layers_list"));присвоить номер индекса в списке
    (setq Layer_Name (nth (atoi Layers_index) Layers_list))
  );end defun
А вот листинг файла AttrDialog.dcl:
Код:
[Выделить все]
 AttrInsert : dialog {
  label = "Свойства атрибутов блоков" ;
:row{alignment=centered;
	height=10;fixed_width=true;width=36;label = "Смещения:" ;
	:column{label = "Вертикальное" ;
	     :edit_box{key="eb_sl_Up";// Текстовое окно положение движка
	          label="Выше";
	          alignment=right;
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          fixed_width=true;
	          action="(eb_sl_Up_action)";
	     }//end eb_sl_Up
	     :edit_box{key="eb_sl_Down";// Текстовое окно положение движка
	          label="Ниже";
	          alignment=right;
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          fixed_width=true;
	          action="(eb_sl_Down_action)";
	     }//end eb_sl_Down
	}//end column
	:column{
	     :slider{key="sl_Vertical";    // Ползунок для задания вертикального смещения
	     	  layout=vertical;
	     	  fixed_width=true;
	     	  width=2;
	     	  height=10;
	          max_value=100; // Значение при крайнем правом положении
	          min_value=0;   // Значение при крайнем левом положении
	          value="0";    // Начальная установка
	          small_increment=1;
	          big_increment=1;
	          fixed_height=true;
	          action="(sl_Vertical_action)";
	     }//end sl_Vertical
	}//end column
	:column{
	     :row{label = "Высота";
		     :edit_box{key="TextHeight";// Текстовое окно высоты текста
		          label="      ";
		          value="";
		          edit_width=3;
		          fixed_width_font=true;
		          fixed_width=true;
		          action="(TextHeight_action)";
		     }//end eb_sl_Up
	     }
	     :row{label = "Поворот";
		     :edit_box{key="TextRotation";// Текстовое окно угла поворота текста
		          label="      ";
		          value="";
		          edit_width=3;
		          fixed_width_font=true;
		          fixed_width=true;
		          action="(TextRotation_action)";
		     }//end eb_sl_Down
	     }
	}//end column
}//end row
	:row{alignment=centered;label = "Горизонтальное" ;
	     fixed_width=true; width=36;
	     :edit_box{key="eb_sl_Left";// Текстовое окно положение движка
	          label="Левее";
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          action="(eb_sl_Left_action)";
	     }//end eb_sl_Left
	     :row{fixed_width=true; width=3;}
	     :edit_box{key="eb_sl_Right";// Текстовое окно положение движка
	          label="Правее";
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          action="(eb_sl_Right_action)";
	     }//end eb_sl_Right
	}
	:row{fixed_width=true; width=30;
	     alignment=centered;
	     :slider{key="sl_Horizontal";    // Ползунок для задания горизонтального смещения
	     	  fixed_width=true; 
	     	  width=30;
	          max_value=100; // Значение при крайнем правом положении
	          min_value=0;   // Значение при крайнем левом положении
	          value="0";    // Начальная установка
	          small_increment=1;
	          big_increment=1;
	          action="(sl_Horizontal_action)";
	     }//end sl_Horizontal
	}
	     :boxed_row{label = "Слой и цвет";
                 :popup_list{fixed_width=true;
		      key="Layers_list";
		      label="";
		      width=10;
		      height=8;
		      edit_width=22;
		      value = "5";
		      alignment=centered;
		      action="(Layers_list_action)";
		}//end popup_list	     	     }
		     :button{key="TextColor";// Текстовое окно цвета текста
		          label="Палитра";
		          action="(TextColor_action)";
		     }//end eb_sl_Down
	     }
    :row{
        fixed_width=true;  //Минимальная ширина по объектам внутри
        alignment = centered; //Выровнен по правому краю
     ok_cancel;// Кнопка
     }	//end Row
   }	//конец диалога
Строка для кнопки вызова:

^C^C(if (null C:AttrProptis) (load "AttrProptis")) AttrProptis

Папка с файлами AttrProptis.lsp и AttrDialog.dcl должна быть указана в путях доступа к вспомогательным файлам AutoCad

Последний раз редактировалось kgb, 16.06.2009 в 09:17.
Просмотров: 18863
 
Непрочитано 15.06.2009, 22:25
#2
Кулик Алексей aka kpblc
Moderator

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


А что обработчика ошибок не добавил? Да и переменные в локальные перевести ИМХО не помешает...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.06.2009, 06:45
#3
kgb

Программирование САПР
 
Регистрация: 03.09.2007
Казахстан
Сообщений: 5


Здравствуйте, Алексей!
Еще раз благодарю за помощь и справедливую критику.
Просто нехватка времени...

Заодно проконсультируйте: хотел добавить также изменение угла НАКЛОНА текста атрибута, но в ActiveX не нашел для этого метода.
vla-put-TextRotation не проходит...
__________________
Григорий Калинин aka kgb

Последний раз редактировалось kgb, 16.06.2009 в 09:27. Причина: Технический вопрос
kgb вне форума  
 
Непрочитано 16.06.2009, 14:12
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


vla-put-ObliqueAngle
kp+ вне форума  
 
Автор темы   Непрочитано 17.06.2009, 06:41
#5
kgb

Программирование САПР
 
Регистрация: 03.09.2007
Казахстан
Сообщений: 5


Благодарность kp+
Добавил изменение угла наклона текста атрибута:
Код:
[Выделить все]
(defun c:AttrProptis ()
;;* ==================================================================================================================================
;;* С помощью данной проги можно:  
;;* 1. Изменять координаты точки вставки видимых атрибутов блоков, задавая относительные смещения по вертикали и горизонтали
;;*    с помощью ползунков или числом.
;;* 2. Изменять высоту текста атрибута
;;* 3. Изменять угол наклона текста атрибута  
;;* 4. Изменять угол поворота текста атрибута
;;* 5. Помещать атрибуты на отдельный слой чертежа из предлагаемых в выпадающем списке.
;;*    Последнее позволяет скрыть атрибуты, если слой сделать невидимым.
;;* 6. Изменять цвета атрибутов.
;;* Блоки с видимыми атрибутами можно выбрать заранее (неважно, если в выбор попадут другие объекты чертежа - сработает фильтр).
;;* Затем в окне диалога меняем свойства (например, задаем смещения вверх-вниз, влево-вправо точки вставки атрибута.
;;* После закрытия окна диалога выбор не сбрасывается, текущие значения запоминаются, можно продолжать от достигнутого.  
;;* ==================================================================================================================================    

(vl-load-com) 
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))

  (setq Layers_list nil)
  (vlax-for Item (vla-get-layers adoc)
	(setq Layers_list (append Layers_list (list (vla-get-name Item))))
  )
  (setq Layers_list (cons "" Layers_list))
  (setq Attr_List (AttrInsert))
  (setq Height (nth 0 Attr_List)) ; высота текста атрибута
  (setq TextAngle (nth 1 Attr_List)) ; угол наклона текста атрибута
  (setq TextRotation (nth 2 Attr_List)) ; угол вращения текста атрибута
  (setq TextColor (nth 3 Attr_List)) ; цвет текста атрибута
  (setq Layer_Name (nth 4 Attr_List)) ; слой
  (setq shift_All (cdr (cddddr Attr_List))) ; смещения координат точки вставки атрибута
  
  (vla-startundomark adoc)
  (princ "\nВыберите блоки (с видимыми атрибутами) (Enter - завершить) ")
  (if (not
	(setq objSet (ssget "_I" '((0 . "INSERT") (66 . 1))))
      )					;(ssget "_I" '((0 . "INSERT")))))
    (progn (princ "\nВыберите блоки (с видимыми атрибутами) (Enter - завершить) ")
	   (setq objSet (ssget '((0 . "INSERT") (66 . 1))))
    )
  )					; end if
  (while (and objSet
	      (> (sslength objSet) 0)
	 ) ;_ end of and
    (setq item (ssname objSet 0))
    (ssdel item objSet)
    (foreach sub_item
	     (vlax-safearray->list
	       (vlax-variant-value
		 (vla-getattributes (vlax-ename->vla-object item))
	       ) ;_ end of vlax-variant-value
	     ) ;_ end of vlax-safearray->list
      (if (= (vla-get-Invisible sub_item) :vlax-false)
	(progn
	  (setq	insertionpoint (vlax-safearray->list
		       (vlax-variant-value
			 (vla-get-insertionpoint sub_item)
		       )
		     )
	  )
	  (setq oldAlign (vla-get-Alignment sub_item))	; запомнить выравнивания текста
	  (setq	oldAlignTextPoint
		 (vlax-safearray->list
		   (vlax-variant-value
		     (vla-get-TextalignmentPoint sub_item)
		   )
		 )
	  )
	  (vla-put-insertionpoint
	    sub_item
	    (vlax-3d-point (mapcar '+ shift_All insertionpoint))
	  )
	  (if (/= oldAlign acAlignmentLeft)	; восстанавливать вторую точку выравнивания текста, если выравнивание - не влево
	    (vla-put-TextalignmentPoint
	      sub_item
	      (vlax-3d-point
		(mapcar '+ shift_All oldAlignTextPoint)
	      )
	    )
	  )
	  (if (/= TextAngle nil) 
		(vla-put-ObliqueAngle sub_item (angtof TextAngle 0))
	  )
	  (if (/= TextRotation nil) 
		(vla-put-rotation sub_item (angtof TextRotation 0))
	  )
	  (if (> Height 0)
	      	(vla-put-height sub_item Height)
	  )
	  (if (/= TextColor nil) 
	      	(vla-put-color sub_item TextColor)
	  )
	  (if (/= Layer_Name nil) 
	      	(vla-put-Layer sub_item Layer_Name)
	  )
	) ;_ end of progn
      ) ;_ end if
    ) ;_ end of foreach
  ) ;_ end of while
  (vla-endundomark adoc)
)
(defun AttrInsert( / )
;;;>> Восстановление начальных значений переменных 
  (setq Height 0)
  
  (if (not veb_sl_Left)(setq veb_sl_Left "0"))
  (if (not veb_sl_Right)(setq veb_sl_Right "0"))
  (if (not veb_sl_Up)(setq veb_sl_Up "0"))
  (if (not veb_sl_Down)(setq veb_sl_Down "0"))
  
;;;--- Загрузать файл DCL и поместить его имя в dcl_id
(setq dcl_id (load_dialog "AttrDialog.dcl"))
;;;--- Если этот файл еще не загружен,
;;;--- то открыть его, иначе - выйти  
(if (not (new_dialog "AttrInsert" dcl_id)
    ); конец not
    (exit);если не обнаружен диалог - выход
); конец if
;;;>> Восстановление сохраненных значений переменных   

(set_tile "eb_sl_Left" veb_sl_Left)
(set_tile "eb_sl_Right" veb_sl_Right)
(set_tile "eb_sl_Up" veb_sl_Up)
(set_tile "eb_sl_Down" veb_sl_Down)

(setq middle_sliders (/ (atoi (get_attr "sl_Horizontal" "max_value")) 2))
(setq text_middle_sliders (itoa middle_sliders))

(if (not vsl_Left)(setq vsl_Left text_middle_sliders))
(set_tile "sl_Horizontal" vsl_Left)  

(if (not vsl_Right)(setq vsl_Right text_middle_sliders))
(set_tile "sl_Horizontal" vsl_Right)
  
(if (not vsl_Up)(setq vsl_Up text_middle_sliders))
(set_tile "sl_Vertical" vsl_Up)
  
(if (not vsl_Down)(setq vsl_Down text_middle_sliders))
(set_tile "sl_Vertical" vsl_Down)

(setq TextColor nil)

(setq Layers_index "0")
(setq Layer_Name nil)
;;; Заполнение выпадающего списка именами слоев чертежа
(start_list "Layers_list")
   (mapcar 'add_list Layers_list)
(end_list)
(set_tile "Layers_list" Layers_index)
  
;;;--- Если нажата кнопка "cancel"
;;;--- выполнить функцию (done_dialog), установить флаг act = nil
(action_tile "cancel" "(setq act nil)(done_dialog)"
);конец actio_tile 'сancel'
  
;;;--- Если нажата кнопка "accept"
;;;--- выполнить функцию (done_dialog), установить флаг act =T (true)
(action_tile "accept"  
    "(setq act T)(done_dialog))"
); конец action_tile 'accept'
(start_dialog)	        ;Показать Диалоговое окно
(unload_dialog dcl_id)	;Закрыть Диалоговое окно
  
;;;--- Если выбрана кнопка "cancel"
;;;--- показать сообщение об отмене
(if (= act nil)
      (exit)
); конец if
;;;--- Если выбрана кнопка "accept"
;;;--- показать сообщение об успешном выполнении
(if (= act T)
      (rem_shift)
 ))	; конец if 
 
;;; (princ)); "Тихий" выход и конец программы D1301

;;;>> Подпрограмма формирования списка с данными о высоте текста, наклоне, вращении и заданных смещениях атрибута
(defun rem_shift()
    (setq shift_Horizontal (- (atof veb_sl_Right) (atof veb_sl_Left)))
    (setq shift_Vertical (- (atof veb_sl_Up) (atof veb_sl_Down)))
    (list Height TextAngle TextRotation TextColor Layer_Name shift_Horizontal shift_Vertical 0)
);end rem_Data

;;;>> Подпрограммы связи горизонтального ползунка с текстовыми окнами "Левее" и "Правее"
  (defun sl_Horizontal_action ();если сдвинут ползунок
    (setq vsl_Left (get_tile "sl_Horizontal")) ;присвоить переменой значение value ползунка
    (setq vsl_Right (get_tile "sl_Horizontal")) ;присвоить переменой значение value ползунка
    (if (<= (atof vsl_Left) middle_sliders)
      	(progn 
    		(set_tile "eb_sl_Left" (rtos (- 5.0 (/ (atof vsl_Left) 10.0))) );модифицировать и передать это значение в текстовое окно "eb_sl_Left"
	  	(set_tile "eb_sl_Right" "0")
	)
    )
    (if (>= (atof vsl_Right) middle_sliders)
      	(progn 
    		(set_tile "eb_sl_Right" (rtos (- (/ (atof vsl_Right) 10.0) 5.0 )) );модифицировать и передать это значение в текстовое окно "eb_sl_Right"
	  	(set_tile "eb_sl_Left" "0")
	)
    )
    (setq veb_sl_Left (get_tile "eb_sl_Left")) ;присвоить значение value ползунка
    (setq veb_sl_Right (get_tile "eb_sl_Right")) ;присвоить значение value ползунка
  );end defun

  (defun eb_sl_Left_action ();если изменен текст в окне "eb_sl_Left"
	(setq veb_sl_Left (get_tile "eb_sl_Left"));присвоить переменной значение value текстового окна
    	(if (or (/= veb_sl_Left "0") (= (get_tile "eb_sl_Right") "0"))
	  (progn
	    (set_tile "sl_Horizontal" (rtos (* (- 5 (atof veb_sl_Left)) 10)));передать это значение в тайл ползунка
	    (setq vsl_Left (get_tile "sl_Horizontal")) ;присвоить переменой vsl_Left значение value ползунка
	    (set_tile "eb_sl_Right" "0")
	  )
    	)
  );end defun

  (defun eb_sl_Right_action ();если изменен текст в окне "eb_sl_Right"
	(setq veb_sl_Right (get_tile "eb_sl_Right"));присвоить переменной значение value текстового окна
    	(if (or (/= veb_sl_Right "0") (= (get_tile "eb_sl_Left") "0"))
	  (progn
	    (set_tile "sl_Horizontal" (rtos (* (+ (atof veb_sl_Right) 5) 10)));передать это значение в тайл ползунка
	    (setq vsl_Right (get_tile "sl_Horizontal")) ;присвоить переменой vsl_Right значение value ползунка
	    (set_tile "eb_sl_Left" "0")
	  )
	)
  );end defun

;;;>> Подпрограммы связи вертикального ползунка с текстовыми окнами "Выше" и "Ниже"
  (defun sl_Vertical_action ();если сдвинут ползунок
    (setq vsl_Up (get_tile "sl_Vertical")) ;присвоить переменой значение value ползунка
    (setq vsl_Down (get_tile "sl_Vertical")) ;присвоить переменой значение value ползунка
    (if (>= (atof vsl_Up) middle_sliders)
      	(progn 
    		(set_tile "eb_sl_Up" (rtos (- (/ (atof vsl_Up) 10.0) 5.0 )) );модифицировать и передать это значение в текстовое окно "eb_sl"
	  	(set_tile "eb_sl_Down" "0")
	)
    )
    (if (<= (atof vsl_Down) middle_sliders)
      	(progn
    		(set_tile "eb_sl_Down" (rtos (- 5.0 (/ (atof vsl_Down) 10.0))) );модифицировать и передать это значение в текстовое окно "eb_sl"
	  	(set_tile "eb_sl_Up" "0")
	)
    )
    (setq veb_sl_Up (get_tile "eb_sl_Up")) ;присвоить переменой vsl_Up значение value ползунка
    (setq veb_sl_Down (get_tile "eb_sl_Down")) ;присвоить переменой vsl_Down значение value ползунка
  );end defun

  (defun eb_sl_Up_action ();если изменен текст в окне "eb_sl_Up"
    (setq veb_sl_Up (get_tile "eb_sl_Up"));присвоить переменной значение value текстового окна
    (if (or (/= veb_sl_Up "0") (= (get_tile "eb_sl_Down") "0"))
	(progn
	    (set_tile "sl_Vertical" (rtos (* (+ (atof veb_sl_Up) 5) 10)));передать это значение в тайл ползунка
	    (setq vsl_Up (get_tile "sl_Vertical")) ;присвоить переменой vsl_Up значение value ползунка
	    (set_tile "eb_sl_Down" "0")
	)
    )
  );end defun

  (defun eb_sl_Down_action ();если изменен текст в окне "eb_sl_Down"
    (setq veb_sl_Down (get_tile "eb_sl_Down"));присвоить переменной значение value текстового окна
    (if (or (/= veb_sl_Down "0") (= (get_tile "eb_sl_Up") "0"))
	(progn
	    (set_tile "sl_Vertical" (rtos (* (- 5 (atof veb_sl_Down)) 10)));передать это значение в тайл ползунка
	    (setq vsl_Down (get_tile "sl_Vertical")) ;присвоить переменой vsl_Down значение value ползунка
	    (set_tile "eb_sl_Up" "0")
	 )
    )
  );end defun

  (defun TextHeight_action ();если изменен текст в окне "Высота текста"
    (setq TextHeight (get_tile "TextHeight"));присвоить переменной значение value текстового окна
    (if (/= TextHeight nil) 
	(setq Height (atof TextHeight))
        (setq Height 0)
    )
  );end defun

  (defun TextAngle_action ();если изменен текст в окне "Наклон"
    (setq TextAngle (get_tile "TextAngle"));присвоить переменной значение value текстового окна
  );end defun

  (defun TextRotation_action ();если изменен текст в окне "Поворот"
    (setq TextRotation (get_tile "TextRotation"));присвоить переменной значение value текстового окна
  );end defun

  (defun TextColor_action ();если нажата кнопка "Палитра"
    (setq TextColor (acad_colordlg 0));присвоить переменной номер цвета из 256-цветной палитры
  );end defun

  (defun Layers_list_action ();если нажата кнопка "Палитра"
    (setq Layers_index (get_tile "Layers_list"));присвоить номер индекса в списке
    (setq Layer_Name (nth (atoi Layers_index) Layers_list))
  );end defun
Соответственно, изменение в dcl:
Код:
[Выделить все]
 AttrInsert : dialog {
  label = "Свойства атрибутов блоков" ;
:row{alignment=centered;
	height=10;fixed_width=true;width=36;label = "Смещения:" ;
	:column{label = "Вертикальное" ;
	     :edit_box{key="eb_sl_Up";// Текстовое окно положение движка
	          label="Выше";
	          alignment=right;
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          fixed_width=true;
	          action="(eb_sl_Up_action)";
	     }//end eb_sl_Up
	     :edit_box{key="eb_sl_Down";// Текстовое окно положение движка
	          label="Ниже";
	          alignment=right;
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          fixed_width=true;
	          action="(eb_sl_Down_action)";
	     }//end eb_sl_Down
	}//end column
	:column{
	     :slider{key="sl_Vertical";    // Ползунок для задания вертикального смещения
	     	  layout=vertical;
	     	  fixed_width=true;
	     	  width=2;
	     	  height=10;
	          max_value=100; // Значение при крайнем правом положении
	          min_value=0;   // Значение при крайнем левом положении
	          value="0";    // Начальная установка
	          small_increment=1;
	          big_increment=1;
	          fixed_height=true;
	          action="(sl_Vertical_action)";
	     }//end sl_Vertical
	}//end column
	:column{
	     :row{label = "Высота";
		     :edit_box{key="TextHeight";// Текстовое окно высоты текста
		          label="      ";
		          value="";
		          edit_width=3;
		          fixed_width_font=true;
		          fixed_width=true;
		          action="(TextHeight_action)";
		     }//end eb_sl_Up
	     }
	     :row{label = "Наклон";
		     :edit_box{key="TextAngle";// Текстовое окно угла наклона текста
		          label="      ";
		          value="";
		          edit_width=3;
		          fixed_width_font=true;
		          fixed_width=true;
		          action="(TextAngle_action)";
		     }//end eb_sl_Down
	     }
	     :row{label = "Поворот";
		     :edit_box{key="TextRotation";// Текстовое окно угла поворота текста
		          label="      ";
		          value="";
		          edit_width=3;
		          fixed_width_font=true;
		          fixed_width=true;
		          action="(TextRotation_action)";
		     }//end eb_sl_Down
	     }
	}//end column
}//end row
	:row{alignment=centered;label = "Горизонтальное" ;
	     fixed_width=true; width=36;
	     :edit_box{key="eb_sl_Left";// Текстовое окно положение движка
	          label="Левее";
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          action="(eb_sl_Left_action)";
	     }//end eb_sl_Left
	     :row{fixed_width=true; width=3;}
	     :edit_box{key="eb_sl_Right";// Текстовое окно положение движка
	          label="Правее";
	          value="0";
	          edit_width=3;
	          fixed_width_font=true;
	          action="(eb_sl_Right_action)";
	     }//end eb_sl_Right
	}
	:row{fixed_width=true; width=30;
	     alignment=centered;
	     :slider{key="sl_Horizontal";    // Ползунок для задания горизонтального смещения
	     	  fixed_width=true; 
	     	  width=30;
	          max_value=100; // Значение при крайнем правом положении
	          min_value=0;   // Значение при крайнем левом положении
	          value="0";    // Начальная установка
	          small_increment=1;
	          big_increment=1;
	          action="(sl_Horizontal_action)";
	     }//end sl_Horizontal
	}
	     :boxed_row{label = "Слой и цвет";
		:popup_list{fixed_width=true;
		      key="Layers_list";
		      label="";
		      width=10;
		      height=8;
		      edit_width=22;
		      value = "5";
		      alignment=centered;
		      action="(Layers_list_action)";
		}//end popup_list	     	     }
		     :button{key="TextColor";// Текстовое окно цвета текста
		          label="Палитра";
		          action="(TextColor_action)";
		     }//end eb_sl_Down
	     }
    :row{
        fixed_width=true;  //Минимальная ширина по объектам внутри
        alignment = centered; //Выровнен по правому краю
     ok_cancel;// Кнопка
     }	//end Row
   }	//конец диалога
__________________
Григорий Калинин aka kgb

Последний раз редактировалось kgb, 22.06.2009 в 08:21.
kgb вне форума  
 
Автор темы   Непрочитано 22.06.2009, 20:23
1 | #6
kgb

Программирование САПР
 
Регистрация: 03.09.2007
Казахстан
Сообщений: 5


Добавил изменение для нескольких видимых атрибутов блоков по выбору из списка.
Файлы AttrProptis.lsp и AttrDialog.dcl здесь:
Вложения
Тип файла: lsp AttrProptis.LSP (13.3 Кб, 1124 просмотров)
Тип файла: rar AttrDialog.rar (1.1 Кб, 978 просмотров)
__________________
Григорий Калинин aka kgb
kgb вне форума  
 
Непрочитано 28.02.2018, 15:17
#7
indi21


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


Можно ли каким то образом автоматически изменять цвет текста при его редактировании?
Чтоб когда отредактировал он сам изменился на заранее выбранный цвет.
indi21 вне форума  
 
Непрочитано 28.02.2018, 19:11
#8
skkkk


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


indi21, http://forum.dwg.ru/showthread.php?p=245449
skkkk вне форума  
 
Непрочитано 28.02.2018, 20:13
#9
indi21


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


skkkk, Огромное спасибо! Но так как я чайник в этих делах у меня теперь не получается сделать все как написано в инструкции ((

----- добавлено через ~3 ч. -----
Спасибо! После вечера мучений у меня получилось))))
indi21 вне форума  
 
Непрочитано 03.03.2018, 02:55
1 | 1 #10
skkkk


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


Цитата:
Сообщение от indi21 Посмотреть сообщение
После вечера мучений у меня получилось
Я тогда специально не стал вмешиваться. Предположил, что с большой долей вероятности так и будет. Уверяю, это был очень полезный на будущее вечер.
Может, потом будет интересно вспомнить, как с него всё началось...
skkkk вне форума  
 
Непрочитано 11.10.2019, 15:57
#11
Черепушка


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


В поисках решения проблемы массового изменения высоты атрибута в блоке набрёл на эту тему. Выражаю огромную благодарность за труды! Отличная вещь )
Черепушка вне форума  
 
Непрочитано 13.06.2023, 14:39
#12
SlavaLu


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


Шикарнейшая вещщщ этот лисп. Большое СПАСИБО автору.
Хотелось бы ещё добавить возможность выбора всех и нескольких атрибутов из списка а так же изменение текст. стиля и ширины текста.
Слои в списке видны все, даже из выгруженных вложений что затрудняет поиск нужного слоя...
Файл DCL на английском если кириллица не декодируется (как у меня)
Вложения
Тип файла: rar AttrDialog-ENG.rar (1.0 Кб, 34 просмотров)

Последний раз редактировалось SlavaLu, 26.06.2023 в 16:52.
SlavaLu вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Массовое редактирование свойств атрибутов блоков

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление атрибутов всех блоков (Attsync для всех блоков) Vildar AutoCAD 3 18.05.2022 14:28
Назначение свойств атрибутов блока без attsync Кулик Алексей aka kpblc Программирование 9 15.08.2017 06:32
Редактирование атрибутов блока (скрытых и постоянных) TheBuTeK Программирование 17 06.02.2008 15:08