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

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

кто знает есть ли доступ к параметрам динамичесого блока из Lisp

Ответ
Поиск в этой теме
Непрочитано 10.04.2010, 19:31 #1
кто знает есть ли доступ к параметрам динамичесого блока из Lisp
GaD200900
 
Регистрация: 10.04.2010
Сообщений: 2

доступны в лиспе все параметры объекта - типа блок (но просто блок)
и имеется в виду содержащий один примитив
в динамическом не ясно как добраться до параметров блока
Просмотров: 5868
 
Непрочитано 10.04.2010, 20:56
#2
VVA

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


Цитата:
Сообщение от GaD200900 Посмотреть сообщение
не ясно как добраться до параметров блока
1. подсчет динамических блоков там описана функция GetDynamicBlockPropertyList
2. LISP. Изменение свойств(а) динамических блоков.
3. Dynamic Block Functions
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 13.09.2014 в 13:30.
VVA вне форума  
 
Автор темы   Непрочитано 11.04.2010, 14:23
#3
GaD200900


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


Спасибо, еще не проснулся, все в порядке но изменить свойство не могу

Последний раз редактировалось GaD200900, 11.04.2010 в 15:42.
GaD200900 вне форума  
 
Непрочитано 13.04.2010, 20:12
#4
VVA

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


чтобы разговор был предметным,
нужно показать (приложить) блок
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.11.2012, 11:38
#5
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Ого какая старая тема))

Есть дин. блок. Надо поменять ему программно Расстояние2 и угол.
Не разобрался в коде, приведенном выше.
Блок приложил
Вложения
Тип файла: dwg
DWG 2007
2_2_Лэп.dwg (66.5 Кб, 839 просмотров)
Kirill_Ja вне форума  
 
Непрочитано 21.11.2012, 13:41
#6
VVA

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


Kirill_Ja,
Код:
[Выделить все]
(defun SetDynamicBlockPropertyNameValue ( block prop value )

  ;;  Modifies the value of a Dynamic Block Property            ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  block - VLA Dynamic Block Reference Object                ;;
;;  prop  - Dynamic Block Property Name                       ;;
;;  value - New value for Property                            ;;
;;------------------------------------------------------------;;
;;  Returns: Value property was set to, else nil              ;;
;;------------------------------------------------------------;;
  
  ;; © Lee Mac 2010
  (vl-some
    (function
      (lambda ( _prop )
        (if (eq (strcase prop)(strcase (vla-get-propertyname _prop)))
          (progn
            (vla-put-value _prop
              (vlax-make-variant value
                (vlax-variant-type (vla-get-value _prop))
              )
            )
            value
          )
        )
      )
    )
    (vlax-invoke block 'GetDynamicBlockProperties)
  )
)
;;;Ф-ция переводит градусы в радианы
;;;( dtr a)
(defun DTR (a)(* pi (/ a 180.0)))

;;;Ф-ция переводит радианы в градусы
;;;( R2D a)
(defun RTD (a)(/ (* a 180.0) pi))

(defun C:TEST( / blk)
(vl-load-com)
(and
  (setq blk(car(entsel"\Select block")))
  (setq blk (vlax-ename->vla-object blk))
  (SetDynamicBlockPropertyNameValue blk "Расстояние2" 30)
  (SetDynamicBlockPropertyNameValue blk "Угол" (dtr 45))
  )
  )
(princ "\nДля примера набери команду TEST в командной строке")(princ)
Вложения
Тип файла: dwg
DWG 2007
ЛЭП.dwg (78.7 Кб, 828 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.11.2012, 16:12
#7
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Здорово! Работает))

Спасибо. Постараюсь теперь разобраться как))
Kirill_Ja вне форума  
 
Непрочитано 06.08.2016, 14:03
#8
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 225


Цитата:
Сообщение от VVA Посмотреть сообщение
Kirill_Ja,
Код:
[Выделить все]
(defun SetDynamicBlockPropertyNameValue ( block prop value )

  ;;  Modifies the value of a Dynamic Block Property            ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  block - VLA Dynamic Block Reference Object                ;;
;;  prop  - Dynamic Block Property Name                       ;;
;;  value - New value for Property                            ;;
;;------------------------------------------------------------;;
;;  Returns: Value property was set to, else nil              ;;
;;------------------------------------------------------------;;
(princ "\nДля примера набери команду TEST в командной строке")(princ)
Привет от археологов! Наконец-то нашёл работающий код для замены свойства блока. Под свои свойства уже поменял, но вот никак не могу избавиться от запроса блока. Попробовал выдергивать из других лиспов, но знаний не хватило. Хотелось приспособить к работе с командной строкой, чтобы впоследствии использовать со скриптами. Имя блока заранее известно, нужен формат "команда имя_блока". Кто-нибудь может помочь?
wepp вне форума  
 
Непрочитано 06.08.2016, 16:10
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


если идет запрос примитива в пространстве чертежа - то ищите функции типа "entsel" ("GetEntity" в случае ActiveX) в коде
Сергей812 вне форума  
 
Непрочитано 06.08.2016, 22:28
1 | #10
VVA

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


Цитата:
Сообщение от wepp Посмотреть сообщение
Имя блока заранее известно, нужен формат "команда имя_блока".
Динамические свойства меняются в конкретном вхождении блока. Ну и что, что имя заранее известно. Или у тебя в чертеже блок с конкретным именем вставлен только один раз?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.08.2016, 09:48
#11
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 225


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
если идет запрос примитива в пространстве чертежа - то ищите функции типа "entsel" ("GetEntity" в случае ActiveX) в коде
В существующем-то коде я его нашёл:
Код:
[Выделить все]
 (defun C:TEST( / blk)
(vl-load-com)
(and
  (setq blk(car(entsel"\Select block")))
  (setq blk (vlax-ename->vla-object blk))
Но вот на что его заменить, чтобы запрос был по имени блока - не нашёл.

Цитата:
Сообщение от VVA Посмотреть сообщение
Динамические свойства меняются в конкретном вхождении блока. Ну и что, что имя заранее известно. Или у тебя в чертеже блок с конкретным именем вставлен только один раз?
Да, вставлен один раз. Впрочем, это блок формата листа, в перспективе может быть вставлен и на нескольких вкладках листов. Так что нужен код, который менял бы параметр во всех вхождениях блока в чертеже с этим именем.


Вот этот код работает по имени вхождения через командную строку, но он, видимо, с ошибками и выполняется не на всех чертежах. Как я понял из обсуждения на англоязычном форуме, работает только, если в рабочем пространстве нет других объектов, кроме динамического блока, а у меня в том числе есть чертежи, которые целиком оформлены в модели.

Код:
[Выделить все]
 (defun myModifyBk ( lstProp / ss index cnt oBkRef oProps i j oSBReferenceProperty)
	(vl-load-com)
	(SETQ ss (SSGET "_L"))
	(setq index 0
	      cnt (sslength ss)
	)
	
	(while (< index cnt)
		(setq e (ssname ss index))
		(setq oBkRef (vlax-ename->vla-object e))
    
		(setq oProps (vlax-variant-value (vla-GetDynamicBlockProperties oBkRef)))

		(setq i (vlax-safearray-get-l-bound oProps 1))
		(while (<= i (vlax-safearray-get-u-bound oProps 1))
			(setq oSBReferenceProperty (vlax-safearray-get-element oProps i))
			(print (strcat (vla-get-PropertyName oSBReferenceProperty) "="))
			(princ (vlax-variant-value (vla-get-value oSBReferenceProperty)))
			(setq i (1+ i))
		)

		(setq j 0)
		(while (< j (length lstProp))
			(setq sProp (strcase (nth j lstProp)))
			(setPropValue oProps sProp (nth (+ 1 j) lstProp))
			(setq j (+ 2 j))
		) ;while < j (length lstProp)
		
		(setq index (1+ index))
	) ;while < index cnt


	(princ)
)

(defun setPropValue (oProps sProp Val / i oSBReferenceProperty sPName iFound)
	(setq i (vlax-safearray-get-l-bound oProps 1))
	(setq iFound 0)
	(while (and (<= i (vlax-safearray-get-u-bound oProps 1)) (= iFound 0))
		(setq oSBReferenceProperty (vlax-safearray-get-element oProps i))
		(setq sPName (vla-get-PropertyName oSBReferenceProperty))
		(if (= (strcase sPName) sProp)
			(progn
				(print (strcat "Old value of " sPName "="))
				(princ (vlax-variant-value (vla-get-value oSBReferenceProperty)))
				(vla-put-value oSBReferenceProperty 
					(vlax-make-variant Val
						(vlax-variant-type (vla-get-value oSBReferenceProperty))
					)
				)
				(print "New value=")
				(princ (vlax-variant-value (vla-get-value oSBReferenceProperty)))
				(setq iFound 1)
			)
		)

		(setq i (1+ i))
	)
	(princ)
)

;;;;DTR converts degrees to radians. 
(defun dtr (a)
	(* pi (/ a 180.0)) 
) 

;;RTD converts radians to degrees. 
(defun rtd (a)
	(/ (* a 180.0) pi) 
)
(myModifyBk (list "DynamicBlockParmatername" DynamicBlockValue))
wepp вне форума  
 
Непрочитано 07.08.2016, 10:37
1 | #12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


VVA написал же выше - что работать надо с конкретной вставкой блока. Далее в коде
Код:
[Выделить все]
 (setq blk(car(entsel"\Select block"))) 
(setq blk (vlax-ename->vla-object blk)) 
вот как раз получаете конкретный объект-вставку блока. Соответственно, если хотите заменить на работу через имя блока на листах, то нужно сделать внешний цикл по листам, там перебирать во втором вложенном цикле коллекцию вставок блоков (не забываем про эффективное имя для динблоков), сравнивать каждую вставку на совпадение с указанным именем блока. И если совпало, то это будет как раз тот blk - который надо "скормить" коду, идущему после запроса блока у пользователя. А запрос блока исключить из кода.
Сергей812 вне форума  
 
Непрочитано 07.08.2016, 14:07
#13
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 225


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
VVA написал же выше - что работать надо с конкретной вставкой блока.
Он добавил потом "или", вот я и подумал, что можно обойтись без конкретной вставки.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Далее в коде
Код:
[Выделить все]
 (setq blk(car(entsel"\Select block"))) 
(setq blk (vlax-ename->vla-object blk)) 
Я уже после отправки сообщения увидел, что тема в разделе "Программирование"..=) Смутило, что выше было готовое решение, а не просто описание функций. Хотя вообще, я написал:
Цитата:
Попробовал выдергивать из других лиспов, но знаний не хватило.
Так что спасибо за информацию, но применить её не получится..
Offtop: Надо-надо уже садится и изучать лисп..
wepp вне форума  
 
Непрочитано 07.08.2016, 14:31
1 | #14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


автокад не умеет отображать напрямую динблоки, он сначала создает анонимное определение блока (с звездочкой) в выбранном пользователем варианте - а потом только делает вставку этого анонимного определения блока в чертеж. Т.е. за изменением параметра динамического блока на чертеже скрыто еще множество операций.

----- добавлено через ~15 мин. -----
рекомендую книгу "AutoLISP и Visual LISP в среде AutoCAD", по ней находите нужную функцию- а затем в инете примеры использования. В том же озоне она сейчас около 400р всего + доставка
Сергей812 вне форума  
 
Непрочитано 07.08.2016, 17:22
1 | #15
VVA

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


Цитата:
Сообщение от wepp Посмотреть сообщение
Но вот на что его заменить, чтобы запрос был по имени блока - не нашёл.
Цитата:
Сообщение от wepp Посмотреть сообщение
Да, вставлен один раз. Впрочем, это блок формата листа, в перспективе может быть вставлен и на нескольких вкладках листов. Так что нужен код, который менял бы параметр во всех вхождениях блока в чертеже с этим именем.
Код:
[Выделить все]
(defun C:TEST1( / blk blk_list bname)
(vl-load-com)
  (setq bname "2_2_ЛЭП");_имя блока

(and
  (setq blk_list (dyn_block_list bname))
  (foreach blk blk_list
    (SetDynamicBlockPropertyNameValue blk "Расстояние2" 30)
    (SetDynamicBlockPropertyNameValue blk "Угол" (dtr 45))
    )
  )
  )
(defun dyn_block_list (bname)
  ;;; bname - имя блока
       (vl-remove-if-not
	 '(lambda (b1)
	    (eq (strcase (vla-get-EffectiveName b1)) (strcase bname))
	  ) ;_ конец lambda
	 (mapcar
	   'vlax-ename->vla-object
	   (mapcar
	     'cadr
	     (ssnamex
	       (ssget "_X"
		      (list (cons 0 "INSERT")
			    (cons 2 (strcat bname ",`*U*"))
		      ) ;_ конец list
	       ) ;_ конец ssget
	     ) ;_ конец ssnamex
	   ) ;_ конец mapcar
	 ) ;_ конец mapcar
       ) ;_ конец vl-remove-if-not
)
(defun SetDynamicBlockPropertyNameValue ( block prop value )

  ;;  Modifies the value of a Dynamic Block Property            ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  block - VLA Dynamic Block Reference Object                ;;
;;  prop  - Dynamic Block Property Name                       ;;
;;  value - New value for Property                            ;;
;;------------------------------------------------------------;;
;;  Returns: Value property was set to, else nil              ;;
;;------------------------------------------------------------;;
  
  ;; © Lee Mac 2010
  (vl-some
    (function
      (lambda ( _prop )
        (if (eq (strcase prop)(strcase (vla-get-propertyname _prop)))
          (progn
            (vla-put-value _prop
              (vlax-make-variant value
                (vlax-variant-type (vla-get-value _prop))
              )
            )
            value
          )
        )
      )
    )
    (vlax-invoke block 'GetDynamicBlockProperties)
  )
)
;;;Ф-ция переводит градусы в радианы
;;;( dtr a)
(defun DTR (a)(* pi (/ a 180.0)))

;;;Ф-ция переводит радианы в градусы
;;;( R2D a)
(defun RTD (a)(/ (* a 180.0) pi))
(princ "\nДля примера набери команду TEST1 в командной строке")(princ)
Пример dwg файла см. в #7 ЛЭП.dwg
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.08.2016, 18:36
#16
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 225


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
автокад не умеет отображать напрямую динблоки, он сначала создает анонимное определение блока (с звездочкой) в выбранном пользователем варианте - а потом только делает вставку этого анонимного определения блока в чертеж. Т.е. за изменением параметра динамического блока на чертеже скрыто еще множество операций.
Вроде понятно, динблоки же появились позже обычных, поэтому такая реализация (для обратной совместимости?). Я тут видел анонимное определение блока, у которого были сохранены в свойствах определенные характеристики от вертикального приложения (Plant). Правда, сохранялись они только в рамках Plant, в голом Акаде пропадали.

Offtop:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
рекомендую книгу "AutoLISP и Visual LISP в среде AutoCAD", по ней находите нужную функцию- а затем в инете примеры использования.
Попробую! Пока мне ближе рабочий порядок освоения. Думаю буду собирать задачки, которые возникают, а потом пробовать их решить программными методами.


Цитата:
Сообщение от VVA Посмотреть сообщение
Пример dwg файла см. в #7 ЛЭП.dwg
Всё сработало, спасибо!
Offtop: Вот глядя на то, как многим знатокам данного форума легко удаётся решать пользовательские задачки, всё ближе подхожу к самостоятельному освоению.
wepp вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > кто знает есть ли доступ к параметрам динамичесого блока из Lisp

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
LISP. Разбивка атрибутов блока в блоке Apelsinov LISP 2 23.09.2009 20:47