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

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

Извлечь все примитивы внешней ссылки

Ответ
Поиск в этой теме
Непрочитано 08.04.2010, 09:13 #1
Извлечь все примитивы внешней ссылки
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

Запутался чуток.
Помогите извлечь все примитивы из чертежа, который в текущем активном чертеже хранится как внешняя ссылка.
ENTGET выдает только точку вставки, TABLESEARCH дополнительно показывает путь, а мне нужны все объекты.
Просмотров: 3309
 
Непрочитано 08.04.2010, 09:30
#2
Кулик Алексей aka kpblc
Moderator

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


А зачем извлекать-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.04.2010, 09:44
#3
swkx


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


Мне нужно в текущем чертеже произвести определённые действия на основе данных, хранящихся в чертеже-внешней ссылке.
swkx вне форума  
 
Непрочитано 08.04.2010, 09:49
#4
Кулик Алексей aka kpblc
Moderator

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


С точки зрения AutoCAD'a (в части чтения данных) вхождение внешней ссылки практически ничем не отличается от вхождения обычного блока. От этого и плясать надо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.04.2010, 10:34
#5
swkx


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


Алексей, я так и делаю

Выполняю кусок кода:
(setq ssallblk (ssget "X" '((0 . "INSERT"))))
(if (NOT (= ssallblk NIL))
(progn
(princ "\nБлоков: ")
(princ (sslength ssallblk))
(setq num -1)
(repeat (sslength ssallblk)
(setq num (+ num 1))
(setq ename (ssname ssallblk num))
(setq edata (entget ename))
(princ edata)
)
)
)

Получаю следующее:
Блоков: 1((-1 . <Имя объекта: 7ef060c0>) (0 . INSERT) (330 . <Имя объекта:
7ef05cf8>) (5 . 110) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 .
AcDbBlockReference) (2 . AOS10EA) (10 505.479 433.166 0.0) (41 . 1.0) (42 .
1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0
1.0))

Почему не вижу все примитивы блока?
swkx вне форума  
 
Непрочитано 08.04.2010, 10:45
#6
VVA

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


Цитата:
Сообщение от swkx Посмотреть сообщение
Почему не вижу все примитивы блока?
Потому что смотришь вхождение блока (Insert), а нужно описание (Block) в таблице блоков

Код:
[Выделить все]
;;; http://www.theswamp.org/index.php?topic=28062.0
;;; Список всех xrefs внешних ссылок, включая вложенные
;;; FYI... List xref inserts and nested ones
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  Routine:	GetXrefs  							;;;
;;;  Purpose:	Get all the xrefs in the active drawing along with their nesting		;;;
;;;  Arguments:	none								;;;
;;;  Returns:	A list of lists, thus:							;;;
;;;...;;;
;;;(										;;;
;;; (<Entity name: 7ed080a8>				1			;;;
;;;	nil						2			;;;
;;;	nil)						3			;;;
;;; (<Entity name: 7ed07cd8>				1			;;;
;;;	nil						2			;;;
;;;	nil)						3			;;;
;;; (<Entity name: 7ed07398>				1			;;;
;;;    nil						             2			;;;
;;;    (<Entity name: 7ed08018>				4			;;;
;;;      <Entity name: 7ed07d00>				4			;;;
;;;      <Entity name: 7ed07ce8>				4			;;;
;;;      <Entity name: 7ed07cd0>				4			;;;
;;;      <Entity name: 7ed07cb8>				4			;;;
;;;    )							5			;;;
;;;  )							6			;;;
;;; (<Entity name: 7ed080a8>				1			;;;
;;;	nil						2			;;;
;;;	nil)						2			;;;
;;; (<Entity name: 7ed07338>				1			;;;
;;;   (<Entity name: 7ed07f28>)				2			;;;
;;;   (<Entity name: 7ed080a0>				4			;;;
;;;     <Entity name: 7ed07390>				4			;;;
;;;     <Entity name: 7ed07378>				4			;;;
;;;     <Entity name: 7ed07360>				4			;;;
;;;     <Entity name: 7ed07348>				4			;;;
;;;   )							5			;;;
;;; )							6			;;;
;;; (<Entity name: 7ed07150>				1			;;;
;;;   (<Entity name: 7ed07188>)				2			;;;
;;;   nil							3			;;;
;;; )							6			;;;
;;; (<Entity name: 7ed03dd0>				1			;;;
;;;   (<Entity name: 7ed03e30>)				2			;;;
;;;   nil							3			;;;
;;; )							6			;;;
;;;)										;;;
;;;-----------------------------------------------------------------------------------------;;;
;;;  In the above list, the line numbers represent:			             	;;;
;;;  1 - The block definition entity for this xref				                          ;;;
;;;  2 - A list of inserts of this xref, nil indicates that this is a nested			;;;
;;;      xref.									;;;
;;;  3 - A list of xrefs nested in this xref.						;;;
;;;  4 - One of the nested xrefs							;;;
;;;  5 - End of the list of nested xrefs							;;;
;;;  6 - End of the list of information on this xref					;;;
;;;=====================================================================;;;
;;;  This procedure pulled from a post on TheSwamp.org by Tim Willey, dated		;;;
;;;  3/27/09 (http://www.theswamp.org/index.php?topic=28062.0) by Mike Weaver		;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun GetXrefs (/ tempData tempEnt XrefList)
    
    (while (setq tempData (tblnext "block" (not tempData)))
        (if (equal (logand (cdr (assoc 70 tempData)) 4) 4)
            (progn
                (setq tempEnt (tblobjname "block" (cdr (assoc 2 tempData))))
                (setq tempData (entget (cdr (assoc 330 (entget tempEnt)))))
                (setq XrefList
                    (cons
                        (cons
                            tempEnt
                            (
                                (lambda ( x / InsList NestList )
                                    (foreach i x
                                        (cond
                                            ((equal (car i) 331)
                                                (setq InsList (cons (cdr i) InsList))
                                            )
                                            ((equal (car i) 332)
                                                (setq NestList (cons (cdr i) NestList))
                                            )
                                        )
                                    )
                                    (list InsList NestList)
                                )
                                (member '(102 . "{BLKREFS") tempData)
                            )
                        )
                        XrefList
                    )
                )
            )
        )
    )
    XrefList
)

(foreach i (GetXrefs)
        (princ "\nXref name: ")
        (princ (cdr (assoc 2 (entget (car i)))))
        (princ "\n    Inserted amount: ")
        (princ (itoa (length (cadr i))))
        (if (caddr i)
            (progn
                (princ "\n    Nested xref names: ")
                (foreach j (caddr i)
                    (princ "\n        ")
                    (princ (cdr (assoc 2 (entget j))))
                )
            )
        )
        (princ "\n")
    )
	
	(defun xrl:GetXrefs (/ tempData tempEnt XrefList)
    
    (while (setq tempData (tblnext "block" (not tempData)))
        (if (equal (logand (cdr (assoc 70 tempData)) 4) 4)
            (progn
                (setq tempEnt (tblobjname "block" (cdr (assoc 2 tempData))))
                (setq tempData (entget (cdr (assoc 330 (entget tempEnt)))))
                (setq XrefList
                    (cons
                        (cons
                            tempEnt
                            (
                                (lambda ( x / InsList NestList )
                                    (foreach i x
                                        (cond
					  ((and
					     (equal (car i) 331)
					     (entget (cdr i))
					     )
                                                (setq InsList (cons (cdr i) InsList))
                                            )
                                            ((equal (car i) 332)
                                                (setq NestList (cons (cdr i) NestList))
                                            )
                                        )
                                    )
                                    (list InsList NestList)
                                )
                                (member '(102 . "{BLKREFS") tempData)
                            )
                        )
                        XrefList
                    )
                )
            )
        )
    )
    XrefList
)

Пример
Код:
[Выделить все]
(setq xreflist (mapcar 'car (GetXrefs)))
(setq tmp (nth 0 xreflist)) ;;;Берем 1-ю ссылку
(setq lst nil)
(while (setq tmp (entnext tmp))
  (setq lst (cons tmp lst))
  )
(princ "\nСписок примитивов  xref:\n")
(princ (reverse lst))(princ)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 08.04.2010 в 14:53.
VVA вне форума  
 
Автор темы   Непрочитано 08.04.2010, 11:06
#7
swkx


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


Не помогло, ищу в таблице, вот код:

(setq ssallblk (ssget "X" '((0 . "INSERT"))))
(if (NOT (= ssallblk NIL))
(progn
(princ "\nБлоков: ")
(princ (sslength ssallblk))
(setq num -1)
(repeat (sslength ssallblk)
(setq num (+ num 1))
(setq ename (ssname ssallblk num))
(setq blokname (cdr (assoc 2 edata))) ; имя блока
(setq blok (tblsearch "BLOCK" blokname))
(princ blok)
)
)
)

Получаю:
((0 . BLOCK) (2 . AOS10EA) (70 . 36) (4 . ) (10 7863.52 11321.8 0.0)
(1 . C:\Documents and Settings\mvb\Рабочий стол\Вставка\AOS10EA.dwg) (-2 . <Имя объекта: 7ef0e860>))

Вопрос прежний: Почему не вижу все примитивы блока?
swkx вне форума  
 
Непрочитано 08.04.2010, 12:01
#8
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(vl-load-com)

(defun _dwgru-get-subentitites (pointer / adoc res err)
                               ;|
*    Получение всех примитивов блока, внешней ссылки или текущего документа
*    Параметры вызова:
	pointer		указатель на вхождение или описание блока / ссылки.
				Допустимые значения:
						vla-object / ename
						string (имя)
						nil (обрабатывается весь текущий документ).
*    Вложенные блоки / ссылки не проверяются. Корректность передачи параметра
* не проверяется
*    Возвращает список vla-указателей на примитивы.
*    Примеры вызова:
(_dwgru-get-subentitites (car(entsel)))
(_dwgru-get-subentitites nil)
(_dwgru-get-subentitites "123")
|;
  (if
    (vl-catch-all-error-p
      (setq
        err (vl-catch-all-apply
              (function
                (lambda ()
                  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
                  (cond
                    ((not pointer)
                     (vlax-for blk_def (vla-get-blocks adoc)
                       (if (equal (vla-get-islayout blk_def) :vlax-true)
                         (vlax-for ent blk_def
                           (setq res (cons ent res))
                           ) ;_ end of vlax-for
                         ) ;_ end of if
                       ) ;_ end of vlax-for
                     (setq res (reverse res))
                     )
                    ((= (type pointer) 'ename)
                     (setq res (_dwgru-get-subentitites (vlax-ename->vla-object pointer)))
                     )
                    ((or (and (= (type pointer) 'str)
                              (not (vl-catch-all-error-p
                                     (vl-catch-all-apply
                                       (function
                                         (lambda ()
                                           (setq pointer (vla-item (vla-get-blocks adoc) pointer))
                                           ) ;_ end of lambda
                                         ) ;_ end of function
                                       ) ;_ end of vl-catch-all-apply
                                     ) ;_ end of vl-catch-all-error-p
                                   ) ;_ end of not
                              ) ;_ end of and
                         (and (= (type pointer) 'vla-object)
                              (not (vl-catch-all-error-p
                                     (vl-catch-all-apply
                                       (function
                                         (lambda ()
                                           (setq pointer (vla-item (vla-get-blocks adoc)
                                                                   (if (vlax-property-available-p pointer 'effectivename)
                                                                     (vla-get-effectivename pointer)
                                                                     (vla-get-name pointer)
                                                                     ) ;_ end of if
                                                                   ) ;_ end of vla-item
                                                 ) ;_ end of setq
                                           ) ;_ end of lambda
                                         ) ;_ end of function
                                       ) ;_ end of vl-catch-all-apply
                                     ) ;_ end of vl-catch-all-error-p
                                   ) ;_ end of not
                              ) ;_ end of and
                         ) ;_ end of or
                     (vlax-for ent pointer
                       (setq res (cons ent res))
                       ) ;_ end of vlax-for
                     (reverse res)
                     )
                    ) ;_ end of cond
                  ) ;_ end of lambda
                ) ;_ end of function
              ) ;_ end of vl-catch-all-apply
        ) ;_ end of setq
      ) ;_ end of vl-catch-all-error-p
     (progn
       (princ (strcat "\nError : " (vl-catch-all-error-message err)))
       (setq res nil)
       ) ;_ end of progn
     ) ;_ end of if
  res
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.04.2010, 14:57
#9
VVA

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


Основное выделено красным
Код:
[Выделить все]
(if (setq ssallblk (ssget "_X" '((0 . "INSERT"))))
(progn
(princ "\nБлоков: ")
(princ (sslength ssallblk))
(setq num -1) 
(repeat (sslength ssallblk)
(setq num (+ num 1))
(setq ename (ssname ssallblk num))
(setq edata (entget ename))  
(setq blokname (cdr (assoc 2 edata))) ; имя блока
(setq blok (TBLOBJNAME "BLOCK" blokname))
(setq lst nil)
(while (setq blok (entnext blok))
  (setq lst (cons blok lst))
  )  
(princ lst)
)
)
)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 08.04.2010 в 16:24. Причина: Изменил (princ block) на (princ lst)
VVA вне форума  
 
Автор темы   Непрочитано 08.04.2010, 16:22
#10
swkx


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


Спасибо большое за помощь, буду разбираться.

Своей цели я добился, но вот этот кусок кода остался для меня загадкой:

(setq blok (entnext blok))

Таким образом перебираются все примитивы, входящие в блок?

Последний раз редактировалось swkx, 09.04.2010 в 13:45.
swkx вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Извлечь все примитивы внешней ссылки

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Акад2006-пропадают внешние ссылки Роб Рой AutoCAD 22 18.01.2017 10:17
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Как програмно запихнуть в блок все примитивы Хотабыч Программирование 4 06.05.2006 21:03
проблема .....все на одном слое ..... Startrek AutoCAD 20 20.10.2005 08:03