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

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

Имена динамических блоков

Ответ
Поиск в этой теме
Непрочитано 21.03.2011, 10:23 #1
Имена динамических блоков
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, есть динамический блок. Имя его Truba. Когда вставляю кучу блоков, имена их становятся не труба, а *U232 и тому подобные. Каким образом вытащить программно его истинное имя?
Просмотров: 10330
 
Непрочитано 21.03.2011, 10:40
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Смотреть свойство "EffectiveName"
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 21.03.2011, 11:11
#3
Zaghim


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


Код:
[Выделить все]
(setq object (entget name))
  (setq klass (cdr (assoc 0 object)))
Далее под цифоркой 2 сидит имя, но имя как уже говорил в виде *U232, под какой цифрой истинное?)
Zaghim вне форума  
 
Непрочитано 21.03.2011, 11:31
#4
Лиспер


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


(setq name (vla-get-effectivename (vlax-ename->vla-object object)))
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 21.03.2011, 12:43
#5
Zaghim


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


А без VisualLisp нельзя обойтись?
Zaghim вне форума  
 
Непрочитано 21.03.2011, 12:46
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Если только совсем делать нечего
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 21.03.2011, 12:46
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
А без VisualLisp нельзя обойтись?
Насколько я знаю - нет. А чем не устраивает?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 21.03.2011, 12:52
#8
Zaghim


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


Я использую код от программы Gakson. Стырил отсюда, так вот в ней это строка не проходит, выбрасывает по ошибке((
Zaghim вне форума  
 
Непрочитано 21.03.2011, 13:01
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


А ты уверен что если туда просто вставить имя дин. блока - она будет работать?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.03.2011, 13:09
#10
Zaghim


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


Код:
[Выделить все]
(defun C:gakson ( / *error*)
 (setq p_cmdecho (getvar "CMDECHO")
       p_snapmode (getvar "SNAPMODE")
       p_orthomode (getvar "ORTHOMODE")
       p_blipmode (getvar "BLIPMODE")
       p_osmode (getvar "OSMODE")
       visotm nil
       visotmold nil
 )
  ;(vl-load-com)

      (defun *error* (msg)  ; Переопределение функции ERROR
        (princ "Программа прервана пользователем")
        (setvar "SNAPMODE" p_snapmode)
        (setvar "ORTHOMODE" p_orthomode)
        (setvar "BLIPMODE" p_blipmode)
        (setvar "OSMODE" p_osmode)
        (setvar "CMDECHO" p_cmdecho)    
        (setq p_cmdecho nil p_snapmode nil p_orthomode nil p_osmode nil p_blipmode nil)
        (princ)
      ) ; defun(*error*)
  
 (setvar "CMDECHO" 0)
 (setvar "SNAPMODE" 0)
 (setvar "ORTHOMODE" 0)
 (setvar "BLIPMODE" 0)
 (setvar "OSMODE" 1)
 (gc)
  
(setq stangle nil stangle1 nil endangle nil endangle1 nil bit10 nil bit10new nil
      bit11 nil bit11new nil bit50 nil bit50new nil bit51 nil bit51new nil object_new nil)
(setq n 0 nabr nil number 0 name nil processed_obj 0)

;(princ "\n ПРОГРАММА ПЕРЕВОДА ПЛАНА В АКСОНОМЕТРИЧЕСКУЮ ПРОЕКЦИЮ.")
;(princ "\n Выберите объекты: ")
(setq nabr (ssget "_A"))
(setq number (sslength nabr))
(initget 6)
  (setq ugol 45.0)
  ;(if (null ugol) (setq ugol 45.0))
(setq ugolrad (* pi (/ ugol 180.0)))
;(setq point (getpoint "\n Укажите точку поворота : ")
(setq point (list 0.0 0.0 0.0)
      x0 (car point)
      y0 (cadr point)
)
(princ "\n")
(setvar "OSMODE" 0)
(while (> number n)
  (setq visotmold visotm)
  (setq name (ssname nabr n))
  (setq object (entget name))
  (setq klass (cdr (assoc 0 object)))
  ;(setq nambl (vla-get-effectivename (vlax-ename->vla-object object)))
  (if (= (cdr (assoc 70 (tblsearch "LAYER" (cdr (assoc 8 object))))) 4)  
    (vl-cmdf "_.-layer" "_U" (cdr (assoc 8 object)) "")
  )  
; разделение по типам объектов
  (cond
     ;;;----- Обработка примитивов типа "INSERT"
     ((eq klass "INSERT")

        ;(setq eb1 (entlast))
        ;(setq ebd (entget eb1))
        ;(setq name (entnext name))
        ;    (while (AND name
    ;      (= (cdr (assoc 0 (setq object (entget name)))) "ATTRIB")
    ;          ) 
    ;      (setq imattr (cdr (assoc 2 object))
        ;            znattr (cdr (assoc 1 object))
        ;      )
    ;      (if (= imattr "VO") 
        ;        (setq visotm znattr)
    ;      )
    ;      (setq name (entnext name))
    ;    )
        ;(if (= visotm visotmold)
    ;  (alert "Равны!")
    ;  (alert "Не равны!")
    ;)  

      (command "explode" name)
          ;(exit)

     ) ; equal klass "INSERT"



  ) ; cond
  (setq n (+ n 1))

  ) ;while(main)
(if (/= n processed_obj)
    (princ (strcat "\n Не удалось обработать объектов: " (rtos (- n processed_obj) 2 0) ".\n"))
  )
  (setvar "SNAPMODE" p_snapmode)
  (setvar "ORTHOMODE" p_orthomode)
  (setvar "BLIPMODE" p_blipmode)
  (setvar "OSMODE" p_osmode)
  (setvar "CMDECHO" p_cmdecho)
  ; (setvar "ERRNO" 0)
  
) ; defun
Все прекрасно работает, можете попробовать...блоки перебираю и взрываю, если надо дергаю атрибуты с блоков.
Zaghim вне форума  
 
Непрочитано 21.03.2011, 15:26
1 | #11
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Do$ Посмотреть сообщение
Цитата:
А без VisualLisp нельзя обойтись?
Насколько я знаю - нет. А чем не устраивает?
Просто ради интереса. У меня вот получилось без EffectiveName, через dxf коды
Код:
[Выделить все]
 
(cdr (assoc 2 (entget (cdr (assoc 340 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (car (entsel)))))))))))))))))
Так работает, только если у дин. блока "подергали" какой-либо параметр и (cdr (assoc 2 (entget (car (entsel))))) возвращает *U..., если же блок не трогали, то (cdr (assoc 2 (entget (car (entsel))))) вернет истинное имя, а "шляпа" что показана выше работать не будет
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 21.03.2011, 16:12
#12
Zaghim


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


TararykovDG, вот это мощно)))) щас попробую
Zaghim вне форума  
 
Непрочитано 21.03.2011, 16:43
#13
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Zaghim, походу в Твоем коде надо убрать ; в строке
Код:
[Выделить все]
 
 ;(vl-load-com)
Тогда и vla-get-effectivename будет работать
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 21.03.2011, 16:59
#14
Zaghim


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


Не, он и с ним и без него пофиг, ругается и выходит... Твоя строка работает, все круто. СПАСИБО БОЛЬШОЕ!!!!!
Zaghim вне форума  
 
Непрочитано 21.03.2011, 17:38
#15
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Аргументом функции vlax-ename->vla-object должен быть приметив, а ты ей список подсовываешь, он риугаеться примерно так:
не верный тип аргумента: lentitype ((-1 . <Имя ...
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Автор темы   Непрочитано 21.03.2011, 17:44
#16
Zaghim


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


Блин я оленина(((( пардон...
Zaghim вне форума  
 
Непрочитано 21.03.2011, 18:35
#17
VVA

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


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
так работает, только если у дин. блока "подергали" какой-либо параметр и (cdr (assoc 2 (entget (car (entsel))))) возвращает *U
Так работает со всеми блоками
Код:
[Выделить все]
(defun get-block-name ( blockentity / name repbtag )
;;; (C) Lee Mac LM:EffectiveName
;;; http://www.theswamp.org/index.php?topic=37493.0
;;; http://forum.dwg.ru/showthread.php?t=65082
;;; blockname EffectiveName динамические блоки
  (if (wcmatch (setq name (cdr (assoc 2 (entget blockentity)))) "`**")
    (if
      (and
        (setq repbtag
          (cdadr
            (assoc -3
              (entget
                (cdr
                  (assoc 330
                    (entget (tblobjname "BLOCK" name))
                  )
                )
               '("AcDbBlockRepBTag")
              )
            )
          )
        )
        (setq repbtag (handent (cdr (assoc 1005 repbtag))))
      )
      (setq name (cdr (assoc 2 (entget repbtag))))
    )
  )
  name
)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 07.04.2011 в 13:53. Причина: Новая версия
VVA вне форума  
 
Непрочитано 24.03.2011, 08:50
#18
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Как показала практика, наличие 360 группы в entget-листе вставки блока не является достаточным условием для того, что в тех недрах, куда мы этим лиспом залазим, окажется имя блока... Так что, Владимир, Ваша функция из #17 для динамического блока, который еще не подвергался изменениям, имя не находит и выдет ошибку
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 24.03.2011, 09:23
#19
VVA

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


Вполне может быть. Я у себя делаю как в #2
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.03.2011, 09:52
#20
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


В общем, по моим наблюдениям, самым "быстрым" оказался такой код:
Код:
[Выделить все]
 (defun blk-get-name-mix (ent / name)
  (if (wcmatch (setq name (cdr (assoc 2 (entget ent)))) "`*U#*")
    (vla-get-EffectiveName (vlax-ename->vla-object ent))
    name
  ) ;_ end of if
) ;_ end of defun
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Имена динамических блоков

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сквозная нумерация динамических блоков zenon Программирование 214 28.08.2020 08:45
подсчет динамических блоков AAI Программирование 37 25.06.2012 15:05
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать. Kortes Программирование 17 26.03.2010 18:46
Проблема вставки Динамических блоков Владимир М Программирование 11 12.09.2007 15:42