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

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

Изменение значения атрибута в составе блока

Ответ
Поиск в этой теме
Непрочитано 02.04.2009, 09:32 #1
Изменение значения атрибута в составе блока
rzinnurov
 
Регистрация: 07.06.2008
Сообщений: 199

На листе с технологией размещено оборудование в виде блоков с атрибутами, к примеру имеется блок "стул", имеющий атрибут с именем "позиция", на листе блоков с именем "стул" имеется больше десятка. Нужен лисп, который бы менял значение атрибута "позиция" блока "стул" одновременно всем находящимя на листе блокам с названиям "стул" . Вариант с быстрым выбором блоков конкретного имени не катит, тк на листе множество блокоd с разными именами и каждый в идеале будет иметь свой номер позиции (атрибут "позиция" ), также свойства атрибута "постоянный" не пройдет поскольку не будет действовать лисп любезно написанный AlexV на запрос в теме "Угол поворота атрибута в составе блока". Кто шарит в лиспах, помогите пожалуйста, очень нужно, всем откликнувшимся заранее спасибо
Просмотров: 9849
 
Непрочитано 02.04.2009, 09:40
#2
Кулик Алексей aka kpblc
Moderator

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


Сильно подозреваю, что надо идти в поиск по слову "автонумер*"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2009, 09:43
#3
rzinnurov


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сильно подозреваю, что надо идти в поиск по слову "автонумер*"
так речь то не об автонумер, а о том что нужно чтобы (продолжая пример со "стулом" ) у блока "стул" атрибут "позиция" имел значение "1" для всех имеющихся на листе блоков с названием "стул". сквозная нумерация мне не нужна
PS в последующем позиция будет отражена в спецификации
rzinnurov вне форума  
 
Непрочитано 02.04.2009, 09:45
#4
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от rzinnurov Посмотреть сообщение
...не будет действовать лисп любезно написанный AlexV...
Ого! Неужели я написал лисп? И он что, работает? Это я наверное нечаянно... пива, что ли, перебрал... Потому как в трезвой памяти лиспов я никогда не писал, у меня ж это, мозги VBA искалечены с детства!
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 02.04.2009, 09:49
#5
rzinnurov


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Ого! Неужели я написал лисп? И он что, работает? Это я наверное нечаянно... пива, что ли, перебрал... Потому как в трезвой памяти лиспов я никогда не писал, у меня ж это, мозги VBA искалечены с детства!
а если так
Цитата:
Сообщение от AlexV Посмотреть сообщение
Посмотрел. Блин, косячок-то мой! В коде надо
Private Sub Main()
изменить на
Sub Main()
Private здесь совершенно ни к чему...
Цитата:
Сообщение от AlexV Посмотреть сообщение
Ну, честно говоря, да. Если выравнивание будет иным, угол атрибута изменится в 0, но он "сместится". Что бы это учесть, надо код усложнять. В принципе, реализуемо.
последние две цитаты из темы "Угол поворота атрибута в составе блока" Помог, не скромничай, и даже очень. Может и сейчас что нибудь придумаешь
rzinnurov вне форума  
 
Непрочитано 02.04.2009, 11:06
#6
Makswell

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


rzinnurov, посмотри здесь: http://forum.dwg.ru/showthread.php?t=27372 (Посты 2 и 4)
Makswell вне форума  
 
Автор темы   Непрочитано 02.04.2009, 11:50
#7
rzinnurov


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


Цитата:
Сообщение от Makswell Посмотреть сообщение
rzinnurov, посмотри здесь: http://forum.dwg.ru/showthread.php?t=27372 (Посты 2 и 4)
посмотрел, почитал
Цитата:
Сообщение от Makswell Посмотреть сообщение
Вот код, которым я пользуюсь:
Код:
[Выделить все]
(defun C:M_Rewrite_pos
		       (/	      M-vla_Document
			M-vla_ModelSpace	    BlkRef	  b_name
			lst_temp      naimenov	    lst		  flag
		       )
  (vl-load-com)
  (setq M-vla_Document (vla-get-ActiveDocument (vlax-get-acad-object)))
  (setq M-vla_ModelSpace (vla-get-ModelSpace M-vla_Document))
  (setq BlkRef (vlax-ename->vla-object (car (entsel "Выбери блок:"))))
  (setq b_name (vla-get-EffectiveName BlkRef))
  (setq	lst_temp (vlax-safearray->list
		   (vlax-variant-value (vla-GetAttributes BlkRef))
		 )
  )
  (foreach item	lst_temp
    (if	(= (vla-get-TagString item) "ПОЗИЦИЯ")
      (setq att_pos (vla-get-TextString item))
    )
  )
  (setq
    lst_temp
     (vlax-safearray->list
       (vlax-variant-value (vla-GetDynamicBlockProperties BlkRef))
     )
  )
  (foreach item	lst_temp
    (if	(= (vla-get-PropertyName item) "Наименование")
      (setq naimenov (vlax-variant-value (vla-get-Value item)))
    )
  )

  (vlax-for item M-vla_ModelSpace
    (if	(= (vla-get-ObjectName item) "AcDbBlockReference") ;if1
      (if (= (vla-get-IsDynamicBlock item) :vlax-true) ;if2
	(progn				;progn1
	  (foreach item2
		   (vlax-safearray->list
		     (vlax-variant-value (vla-GetDynamicBlockProperties item))
		   )
	    (if	(= (vla-get-PropertyName item2) "Наименование")
	      (setq flag t)
	    )
	  )
	  (if flag			;if3
	    (progn			;progn2
	      (setq			;setq1
		lst_temp
		 (vlax-safearray->list
		   (vlax-variant-value (vla-GetDynamicBlockProperties item))
		 )
	      )				;setq1
	      (foreach item1 lst_temp
		(if (= (vla-get-PropertyName item1) "Наименование")
		  (setq naimenov1 (vlax-variant-value (vla-get-Value item1)))
		)
	      )
	      (if (= naimenov1 naimenov)
		(setq lst (append lst (list item)))
	      )
	      (setq flag nil)
	    )				;progn2
	  )				;if3
	)				;progn1
      )					;if2
    )					;if1
  )					;vlax-for
  (foreach item	lst
    (setq lst_temp (vlax-safearray->list
		     (vlax-variant-value (vla-GetAttributes item))
		   )
    )
    (foreach item1 lst_temp
      (if (= (vla-get-TagString item1) "ПОЗИЦИЯ")
	(vla-put-TextString item1 att_pos)
      )
    )
  )
  (princ)
)
при запуски команды выдается запрос на выбор блока, выбираю блок (атрибут "наименование" в составе блока имеется, вот только какие параметры атрибута должны быть или для этого макроса без разницы не знаю), а дальше ошибка: "Ошибка: ActiveX Server возвратил ошибку: Неверный индекс" И еще вопрос: а если у меня несколько блоков с разными именами имеют атрибут с названеим "наименование", то для всех блоков с разными именами поменяется его значение или только для блоков с именнем выбранного блока?
rzinnurov вне форума  
 
Непрочитано 02.04.2009, 12:25
#8
Makswell

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


Я в той теме написал, что программа не для широких масс, поэтому я прекрасно осознавал что она заработет не у всех. Я её выложил как пример, а описание её работы дал в предыдущем посте. Этого более чем достаточно для того, чтобы написать подобное любому.

rzinnurov, но если ты хочешь сразу готовое для тебя решение, то выложи свой блок (блоки). Так нам будет легче общаться.
Makswell вне форума  
 
Автор темы   Непрочитано 02.04.2009, 12:42
#9
rzinnurov


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


Цитата:
Сообщение от Makswell Посмотреть сообщение
rzinnurov, но если ты хочешь сразу готовое для тебя решение, то выложи свой блок (блоки). Так нам будет легче общаться.
Makswell конечно бы это было идеальное решение, потому как сам не шарю в макросах
PS спасибо что взялся помочь
Вложения
Тип файла: dwg
DWG 2000
ТХ.dwg (615.6 Кб, 1971 просмотров)
rzinnurov вне форума  
 
Непрочитано 02.04.2009, 13:31
#10
Makswell

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


rzinnurov, вот, держи. Принцип тот же: меняешь в одним блоке значение атрибута "ПОЗИЦИЯ", запускаешь программу и указываешь на этот блок, после чего происходит замена значения атрибута "ПОЗИЦИЯ" во всех вхождениях этого блока но новое.
Код:
[Выделить все]
(defun C:Rewrite_pos (/ M-vla_Document BlkRef b_name lst_temp selset n flag)
  (vl-load-com)
  (if (setq BlkRef (car (entsel "Выбери блок:")))
    (progn
      (setq BlkRef (vlax-ename->vla-object BlkRef))
      (if (= (vla-get-ObjectName BlkRef) "AcDbBlockReference")
	(progn
	  (setq	b_name	 (vla-get-EffectiveName BlkRef)
		lst_temp (vlax-safearray->list
			   (vlax-variant-value (vla-GetAttributes BlkRef))
			 )
	  )
	  (foreach item	lst_temp
	    (if	(= (vla-get-TagString item) "ПОЗИЦИЯ")
	      (setq att_pos (vla-get-TextString item)
		    flag    t
	      )
	    )
	  )
	  (if flag
	    (progn
	      (setq n	   0
		    selset (ssget "_X" '((0 . "INSERT")))
	      )
	      (while (setq BlkRef (ssname selset n))
		(setq BlkRef (vlax-ename->vla-object BlkRef))
		(if (= (vla-get-EffectiveName BlkRef) b_name)
		  (progn
		    (setq
		      lst_temp
		       (vlax-safearray->list
			 (vlax-variant-value (vla-GetAttributes BlkRef))
		       )
		    )
		    (foreach item lst_temp
		      (if (= (vla-get-TagString item) "ПОЗИЦИЯ")
			(vla-put-TextString item att_pos)
		      )
		    )
		  )
		)
		(setq n (1+ n))
	      )
	    )
	    (princ "\nВ выранном блоке должен быть атрибут с тэгом \"ПОЗИЦИЯ\"")
	  )
	)
	(princ "\nВыбранный примитив не является блоком")
      )
    )
    (princ "\nНичего не выбрано")
  )
  (princ)
)
Makswell вне форума  
 
Автор темы   Непрочитано 02.04.2009, 14:51
#11
rzinnurov


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


Makswell это именно то что нужно, большое человеческое спасибо
rzinnurov вне форума  
 
Непрочитано 03.04.2009, 01:15
#12
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Специально для rzinnurov - мой вариант лиспа! Он, может, и не лисп вовсе, но вроде работает..
Вложения
Тип файла: dvb Chng_Atr.dvb (80.0 Кб, 112 просмотров)
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 03.04.2009 в 08:14.
AlexV вне форума  
 
Автор темы   Непрочитано 03.04.2009, 09:32
#13
rzinnurov


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Специально для rzinnurov - мой вариант лиспа! Он, может, и не лисп вовсе, но вроде работает..
AlexV спасибо за помощь, очень помогло, буду использовать оба файла: и AlexV и Makswell. Ребята еще раз вам огромная благодарность за проделанную работу
AlexV, а можноChng_Atr.dvb модернизировать таким образом, чтобы значение атрибута блока можно было менять не выбором из списка конкретного блока, а предварительно выбранного блока на листе, т.к. список из блоков может быть длинный, (60 и более позиций)?
PS искренне надеюсь что это не будет выглядеть наглостью с моей стороны

Последний раз редактировалось rzinnurov, 03.04.2009 в 09:48.
rzinnurov вне форума  
 
Непрочитано 03.04.2009, 18:07
#14
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от rzinnurov Посмотреть сообщение
AlexV спасибо за помощь, очень помогло, буду использовать оба файла: и AlexV и Makswell. Ребята еще раз вам огромная благодарность за проделанную работу
AlexV, а можноChng_Atr.dvb модернизировать таким образом, чтобы значение атрибута блока можно было менять не выбором из списка конкретного блока, а предварительно выбранного блока на листе, т.к. список из блоков может быть длинный, (60 и более позиций)?
PS искренне надеюсь что это не будет выглядеть наглостью с моей стороны
Легко...
Вложения
Тип файла: rar Chng_Atr2.rar (13.7 Кб, 134 просмотров)
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 06.04.2009, 10:30
#15
rzinnurov


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


AlexV проверил, всё работает, спасибо
Цитата:
Сообщение от AlexV Посмотреть сообщение
Ого! Неужели я написал лисп? И он что, работает? Это я наверное нечаянно... пива, что ли, перебрал... Потому как в трезвой памяти лиспов я никогда не писал, у меня ж это, мозги VBA искалечены с детства!
Справедливости ради стоит поправиться: действительно это не лисп, а VBA.
PS AlexV Makswell с меня пиво (могу по почте выслать, только адрес в личку киньте )
rzinnurov вне форума  
 
Непрочитано 07.04.2009, 11:41
#16
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


А может быть так:?
(command "_-attedit" "_n" "_n" "ИМЯБЛОКА" "ИМЯАТРИБУТА" "" "СТАРОЕЗНАЧЕНИЕ" "НОВОЕЗНАЧЕНИЕ")
E-degtyarev вне форума  
 
Автор темы   Непрочитано 07.04.2009, 12:41
#17
rzinnurov


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


Цитата:
Сообщение от E-degtyarev Посмотреть сообщение
А может быть так:?
(command "_-attedit" "_n" "_n" "ИМЯБЛОКА" "ИМЯАТРИБУТА" "" "СТАРОЕЗНАЧЕНИЕ" "НОВОЕЗНАЧЕНИЕ")
Этот стандартный акадовский путь не покатит, пробовал его с самого начала, слишком муторный и долгий, имхо много времени убьешь на редактирование ни одного десятка блоков с разными именами
rzinnurov вне форума  
 
Непрочитано 05.12.2013, 06:50
#18
Titli-pytli


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


Добрый день! Есть похожая задача - автоматическое задание значения атрибута. Имеется некоторое количество блоков с именами (тегами) атрибутов "НАИМЕНОВАНИЕ" и "_ПОЗИЦИЯ". Возможно ли создание макроса который бы автоматически менял значение атрибута "_ПОЗИЦИЯ" в зависимости от значения атрибута "НАИМЕНОВАНИЕ"? Идеальный вариант- изменения атрибута по данным из экселя. Т.е. извлекаем данные (из нескольких чертежей) по атрибутам "_ПОЗИЦИЯ" и "НАИМЕНОВАНИЕ" и экспортируем в эксель. Затем сортируем и нумеруем позиции. А далее... далее и нужен макрос который бы сравнивал значение в экселе по "НАИМЕНОВАНИЮ" с тем же значением в блоках (во всех) и при совпадении назначал новое значение атрибуту "_ПОЗИЦИЯ" в соответствии с значением в экселе. Возможно ли его работа сразу с несколькими файлами автокада (открытыми к примеру)? Может кто подскажет в каком направлении копать? Или велосипед уже изобретен? В прикрепленном фале примеры блоков и шаблон извлечения данных (разрешение поменять на dxe)
З.Ы. Ходил по ссылке Makswell`а. Подставлял свои имена атрибутов в его код. При выборе блоков команда сбрасывалась.
Вложения
Тип файла: dwg
DWG 2010
Пример.dwg (2.91 Мб, 1664 просмотров)
Тип файла: dwg ТЕСТ.dwg (137.7 Кб, 1654 просмотров)
Titli-pytli вне форума  
 
Непрочитано 05.12.2013, 07:50
#19
Boxa

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


Команды экспресс тулс для экспорта и импорта атрибутов вообще никак не подходят?
Boxa вне форума  
 
Непрочитано 05.12.2013, 16:47
#20
Titli-pytli


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


Может быть так, что я делал что-то не так, но требуемого результата я ими не натыкал) Вооот...
Titli-pytli вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение значения атрибута в составе блока

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Угол поворота атрибута в составе блока rzinnurov AutoCAD 15 18.10.2017 08:08
Вывод значения атрибута в поле field batart AutoCAD 2 09.07.2008 12:06
Изменение параметров дин блока ch-viktor Программирование 5 23.05.2008 21:38
Как бы сделать динамическое изменение значения площади? Grinzaid Динамические блоки 8 02.08.2004 18:02