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

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

Проверить нахождение внешних ссылок xref

Ответ
Поиск в этой теме
Непрочитано 07.10.2010, 12:12 #1
Проверить нахождение внешних ссылок xref
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,190

Часть кода, для обработки внешних ссылок, ссылки загруженные вставляются в чертеж, незагруженные - отсоединяются, и не найденные, по идее - тоже, но с этим проблема:

Код:
[Выделить все]
(vlax-for i (vla-get-blocks (APEL-ACTIVE_DOCUMENT))
    (if	(APEL-TRUE_FALSE-T_NIL (vla-get-isxref i))
					;отделяем ссылки от блоков
      (if (or (assoc 71 (entget (tblobjname "BLOCK" (vla-get-name i))))
					;проверка ссылки на не загруженность
;;;	      (not (findfile (vla-get-path i)))
	  )
	(APEL-CATCH-APPLY
	  'vla-Detach
	  (list i)
	)
	(APEL-CATCH-APPLY
	  'vla-bind
	  (list i :vlax-false)
	)
      )
    )
  )
К сожалению (findfile (vla-get-path i) - проверяет только наличие файла ссылки по пути сохраненному в свойствах самой ссылки, но ссылка может быть подгружена и не по этому пути.
Вопрос - как проверить найдена ли ссылка?
Просмотров: 10159
 
Непрочитано 07.10.2010, 12:17
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
К сожалению (findfile (vla-get-path i) - проверяет только наличие файла ссылки по пути сохраненному в свойствах самой ссылки, но ссылка может быть подгружена и не по этому пути.
Правильно ли я вас понял - вы хотите, чтобы в случае "битой" ссылки, автоматически происходил поиск по некоторому набору каталогов?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 07.10.2010, 12:59
#3
VVA

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


Может быть так?
Код:
[Выделить все]
;проверка ссылки на загруженность
(defun is-xref-load ( i )
  (or
    (findfile (vla-get-path i))
    (findfile
      (strcat
        (vl-filename-base (vla-get-path i))
        (vl-filename-extension (vla-get-path i))
        )
      )
    )
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.10.2010, 13:11
#4
Кулик Алексей aka kpblc
Moderator

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


Дали возможность высказаться, поэтому воспользуюсь
Apelsinov, попробуй преобразовывать относительные пути ссылок в абсолютные.
Код:
[Выделить все]
;; doc-path - путь текущего документа, например.
;; ent-path - относительный путь ссылки

(defun _kpblc-path-convert-relative-to-absolute (doc-path ent-path / file res pos)
                                                ;|
*    Преобразование относительного пути в абсолютный
*    Параметры вызова:
	doc-path	абсолютный путь типа "d:\\1\\2\\3\\test.dwg"
	ent-path	относительный путь типа "..\\..\\123\\test2.dwg"
*    Примеры вызова:
(_kpblc-path-convert-relative-to-absolute
  "d:\\1\\2\\3\\test.dwg"
  "..\\..\\123\\test2.dwg")	; "d:\\1\\123\\test2.dwg"
(_kpblc-path-convert-relative-to-absolute
  "d:\\1\\2\\3\\test.dwg"
  "d:\\test2.dwg")		; "d:\\test2.dwg"
(_kpblc-path-convert-relative-to-absolute
  "d:\\1\\2\\3\\4\\5.dwg"
  "..\\..\\..\\test\\test2\\6.dwg")	; "d:\\1\\test\\test2\\6.dwg"
(_kpblc-path-convert-relative-to-absolute
 "D:\\2006\\Views\\АР\\Спецификации\\Общий вид.dwg"
"..\\..\\..\\Constructs\\АР\\1 Секция\\ОСТЕКЛЕНИЕ\\Остекление 2-22эт.(12).dwg")
; "D:\\2006\\Constructs\\АР\\1 Секция\\ОСТЕКЛЕНИЕ\\Остекление 2-22эт.(12).dwg"
|;
  (cond
    ((not (wcmatch ent-path "..\\*"))
     ent-path
     )
    (t
     (setq doc-path (_kpblc-conv-string-to-list ; -string-parser-to-list
                      (vl-filename-directory doc-path)
                      "\\"
                      ) ;_ end of _kpblc-string-parser-to-list
           file     (strcat (vl-filename-base ent-path)
                            (vl-filename-extension ent-path)
                            ) ;_ end of strcat
           ent-path (_kpblc-conv-string-to-list
                      (vl-filename-directory ent-path)
                      "\\"
                      ) ;_ end of _kpblc-string-parser-to-list
           pos      (length (vl-remove-if-not '(lambda (x) (= x "..")) ent-path))
           res      (strcat (_kpblc-conv-list-to-string
                              (append
                                (reverse (vl-remove-if-not
                                           '(lambda (x)
                                              (>= (vl-position x (reverse doc-path)) pos)
                                              ) ;_ end of lambda
                                           (reverse doc-path)
                                           ) ;_ end of vl-remove-if-not
                                         ) ;_ end of reverse
                                (vl-remove-if
                                  '(lambda (x)
                                     (= x "..")
                                     ) ;_ end of lambda
                                  ent-path
                                  ) ;_ end of vl-remove-if
                                ) ;_ end of append
                              "\\"
                              ) ;_ end of _kpblc-conv-list-to-string
                            "\\"
                            file
                            ) ;_ end of strcat
           ) ;_ end of setq
     res
     )
    ) ;_ end of cond
  ) ;_ end of defun

(defun _kpblc-conv-string-to-list (string separator / i)
                                  ;|
*    Функция разбора строки. Возвращает список либо точечную пару.
*    Параметры вызова:
*	string		разбираемая строка
*	separator	символ, используемый в качестве разделителя частей
*    Примеры вызова:
(_kpblc-conv-string-to-list "1;2;3;4;5;6" ";")	;'(1 2 3 4 5 6)
(_kpblc-conv-string-to-list "1;2" ";")		;'(1 2)
*    За основу взяты уроки Евгения Елпанова по рекурсиям
|;
  (cond
    ((= string "") nil)
    ((setq i (vl-string-search separator string))
     (cons (substr string 1 i)
           (_kpblc-conv-string-to-list
             (substr string (+ (strlen separator) 1 i))
             separator
             ) ;_ end of _kpblc-conv-string-to-list
           ) ;_ end of cons
     )
    (t (list string))
    ) ;_ end of cond
  ) ;_ end of defun
VVA, извини, кто ж знал...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.10.2010, 13:14
#5
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,190
<phrase 1=


hwd, сама задача определить - что ссылка "битая"

VVA, да, такое будет работать, остается только добавить кроме поиска в путях акада, еще поиск в папке с открытым DWG файлом.
Скорее всего, так и сделаю, просто я думал, может быть есть способ определить битость ссылки вообще без проверки наличия файла, либо определить по самой ссылке фактический путь ее загрузки.

Кулик Алексей aka kpblc, Честно говоря, я не очень понял зачем вообще нужно такое преобразование, и тем более, как это может помочь мне.
Apelsinov вне форума  
 
Непрочитано 08.10.2010, 13:29
#6
VVA

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


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
кроме поиска в путях акада, еще поиск в папке с открытым DWG файлом.
Так вроде должно искать в папке с открытым чертежом. У меня на тестовом примере находило. А вот обработку "Путь доступа к файлам проектов" стоит добавить
Цитата:
Путь доступа к файлам проектов

Позволяет указать для чертежа имя проекта. Имя проекта связано с путем доступа к файлам внешних ссылок. Пользователь может создавать любое количество проектов с различными путями доступа, но для каждого чертежа можно использовать только один проект. (системная переменная PROJECTNAME)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 08.10.2010, 13:31
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
hwd, сама задача определить - что ссылка "битая"

VVA, да, такое будет работать, остается только добавить кроме поиска в путях акада, еще поиск в папке с открытым DWG файлом.
Насчёт того, чтобы прочесать все пути, по которым акад выполняет поиск (не только по тем, которые прописаны в options), можно глянуть здесь (можно в лисповскую обёртку завернуть и юзать). В классе отдельно сгруппированы те пути, которые прописаны в Options, и отдельно те, которых там нет, но по ним так же происходит поиск. Там внизу скрин для наглядности.

п.с. а разве в лиспе функция findfile не ищет файл по всем каталогам автокадовского поиска (т.е. не только по каталогам, прописанным в опциях)?
Цитата:
просто я думал, может быть есть способ определить битость ссылки вообще без проверки наличия файла
это вряд ли.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 08.10.2010, 13:39
#8
VVA

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


Цитата:
Сообщение от hwd Посмотреть сообщение
а разве в лиспе функция findfile не ищет файл по всем каталогам автокадовского поиска
Цитата:
(findfile filename)
The findfile function makes no assumption about the file type or extension of filename. If filename does not specify a drive/directory prefix, findfile searches the AutoCAD library path.
Очень даже похоже на правду, ходя для успокоения нужно проверить.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 08.10.2010, 15:38
#9
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,190
<phrase 1=


Цитата:
Сообщение от hwd Посмотреть сообщение
п.с. а разве в лиспе функция findfile не ищет файл по всем каталогам автокадовского поиска (т.е. не только по каталогам, прописанным в опциях)?
Да, точно, так что как и написал VVA, буду просто искать findfile имя ссылочного файла без пути.
Apelsinov вне форума  
 
Непрочитано 29.05.2012, 22:50
#10
Do$

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


Обнаружил частный случай, когда такой подход дает сбой. При выполнении следующих условий:
- в чертеже внешние ссылки вставлены без указания полного пути к ним и просто находятся в папке с чертежом
- выполняем сохранение файла под новым именем в другую папку.
Что при этом происходит:
- ссылки все отображаются т.к. были подгружены ранее, в менеджере внешних ссылок с ними все в порядке
- функция is-xref-load выдает nil.
Получается такая нестыковка - автокад считает, что внешние ссылки подгружены, а код - что нет. Фактически - да, ссылки битые, это подтвердится при следующем запуске файла. Но мне нужно работать с файлом в этом же сеансе.
Выкрутился так - проверяю подгруженность ссылок в исходном файле, перед сохранением под другим именем.
Может кому-то пригодится.
Do$ вне форума  
 
Непрочитано 29.05.2012, 23:03
#11
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Обнаружил частный случай, когда такой подход дает сбой. При выполнении следующих условий:
- в чертеже внешние ссылки вставлены без указания полного пути к ним и просто находятся в папке с чертежом
- выполняем сохранение файла под новым именем в другую папку.
Что при этом происходит:
- ссылки все отображаются т.к. были подгружены ранее, в менеджере внешних ссылок с ними все в порядке
- функция is-xref-load выдает nil.
Получается такая нестыковка - автокад считает, что внешние ссылки подгружены, а код - что нет. Фактически - да, ссылки битые, это подтвердится при следующем запуске файла. Но мне нужно работать с файлом в этом же сеансе.
Выкрутился так - проверяю подгруженность ссылок в исходном файле, перед сохранением под другим именем.
Может кому-то пригодится.
попробуй в файле назначить значение переменной ProjectName, предварительно выполнив соответствующие настройки в диалоговом окне Options на вкладке Files.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 29.05.2012, 23:43
#12
Do$

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


Зачем? У меня нет такой цели - восстанавливать ссылки в копии чертежа, мне нужно только проверить подгруженность внешних ссылок.
Do$ вне форума  
 
Непрочитано 03.09.2012, 18:47
#13
Do$

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


Новая задача из этой же серии - как проверить, загружена ссылка или выгружена? Функция проверки выдает T, но ссылка не отображается, потому что тупо выгружена. Как отследить такую ситуацию? У ссылки нет свойства "загруженности"
Код:
[Выделить все]
(defun check-xrefs (/ ref-lst string-to-list is-xref-load prname)
  ;;(check-xrefs)


  (defun string-to-list	(str del / i rez)
    (while (setq i (vl-string-search del str))
      (setq rez	(cons (substr str 1 i) rez)
	    str	(substr str (+ 1 i (strlen del)))
      ) ;_ end of setq
    ) ;_ end of while
    (reverse (cons str rez))
  ) ;_ end of defun

  (defun is-xref-load (i / fn)
    ;;проверка ссылки на загруженность
    ;;http://forum.dwg.ru/showpost.php?p=636209&postcount=3
    (or
      (findfile (vla-get-path i))
      (findfile
	(setq fn (strcat
		   (vl-filename-base (vla-get-path i))
		   (vl-filename-extension (vla-get-path i))
		 ) ;_ конец strcat
	) ;_ конец setq
      ) ;_ конец findfile
      (and (/= (setq prname (getvar "projectname")) "")
	   ;;(setq prname "Проект1")
	   (setq path-str
		  (vl-registry-read
		    (strcat
		      "HKEY_CURRENT_USER\\"
		      (vlax-product-key)
		      "\\Profiles\\"
		      (vla-get-activeprofile
			(vla-get-profiles
			  (vla-get-preferences (vlax-get-acad-object))
			) ;_ конец vla-get-profiles
		      ) ;_ конец vla-get-activeprofile
		      "\\Project Settings\\"
		      prname
		    ) ;_ конец strcat
		    "RefSearchPath"
		  ) ;_ конец vl-registry-read
	   ) ;_ конец setq
	   (vl-member-if
	     '(lambda (s) (findfile (strcat s "\\" fn)))
	     (string-to-list path-str ";")
	   ) ;_ end of vl-member-if
      ) ;_ конец and
    ) ;_ конец or
  ) ;_ конец defun

  (and (setq ref-lst ((lambda (/ lst)
			(vlax-for item (vla-get-Blocks *PSM-ActDoc*)
			  (if (= (vla-get-IsXRef item) :vlax-true)
			    (setq lst (cons item lst))
			  ) ;_ конец if
			) ;_ конец vlax-for
			lst
		      ) ;_ конец lambda
		     )
       ) ;_ конец setq
       (vl-member-if 'is-xref-load ref-lst)
  ) ;_ конец and
) ;_ конец defun
Вложения
Тип файла: rar Примеры.rar (23.9 Кб, 42 просмотров)
Do$ вне форума  
 
Непрочитано 03.09.2012, 20:43
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
как проверить, загружена ссылка или выгружена?
Вдруг эта информация чем-то поможет: в .Net API это определяется с помощью свойства BlockTableRecord.IsUnloaded, а в ObjectARX - соответственно AcDbBlockTableRecord::isUnloaded.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 03.09.2012, 21:31
1 | #15
VVA

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


Из этой темы
Цитата:
How can I determine if an xref is unloaded (using Vanilla LSP - something that I can easily understand)?
Thanks. (In the meantime, I'll keep searching...)
Цитата:
Look at the dxf code 70 of the blocks definition.
Сильно не тестировал.
Код:
[Выделить все]
(defun Xref-Get-Status (XrefName)
;;;Функция определение статуса внешней ссылки
;;; XrefName - имя внешней ссылки
;;; Return:
;;; t - xref loaded
;;; nil - xref unloaded
;;; Use:
;;; (alert (if (Xref-Get-Status (getstring "\nType xref name: ")) "Loaded" "Unloaded"))
  (= (boole 1
	    (cdr
	      (assoc
		70
		(entget (tblobjname "block" xrefname))
	      )
	    )
	    32
     )
     32
  )
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 04.09.2012, 09:23
#16
Do$

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


Цитата:
Сообщение от hwd Посмотреть сообщение
Вдруг эта информация чем-то поможет: в .Net API это определяется с помощью свойства BlockTableRecord.IsUnloaded, а в ObjectARX - соответственно AcDbBlockTableRecord::isUnloaded.
Вот в том то и дело, что в ActiveX такого свойства ни у объекта таблицы блоков ни у вставки нету
Хотя по логике должно быть, может я где проглядел
VVA, то что надо, спасибо!
Do$ вне форума  
 
Непрочитано 18.09.2012, 13:34
#17
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Цитата:
Новая задача из этой же серии - как проверить, загружена ссылка или выгружена? Функция проверки выдает T, но ссылка не отображается, потому что тупо выгружена. Как отследить такую ситуацию? У ссылки нет свойства "загруженности"
Всем привет. Можно поискать и не в таблице блоков.
Код:
[Выделить все]
(defun LoadedXref ()
  (vlax-for item
		 (vla-get-FileDependencies
		   (vla-get-ActiveDocument (vlax-get-acad-object))
		 )
    (if	(= (vla-get-Feature item) "Acad:XRef")
      (princ (strcat (vla-get-FullFileName item) "\n"))
    )
  )
  (princ)
)
Эдуард вне форума  
 
Непрочитано 18.09.2012, 14:02
#18
Кулик Алексей aka kpblc
Moderator

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


Ого, какие люди! С возвращением!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.09.2012, 15:17
#19
Do$

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


Цитата:
Сообщение от Эдуард Посмотреть сообщение
Всем привет. Можно поискать и не в таблице блоков.
Код:
[Выделить все]
(defun LoadedXref ()
  (vlax-for item
		 (vla-get-FileDependencies
		   (vla-get-ActiveDocument (vlax-get-acad-object))
		 )
    (if	(= (vla-get-Feature item) "Acad:XRef")
      (princ (strcat (vla-get-FullFileName item) "\n"))
    )
  )
  (princ)
)
Привет!
Найти-то можно, а вот проверить загружена или выгружена - нет. Или я что-то не так понимаю?
Do$ вне форума  
 
Непрочитано 18.09.2012, 15:39
#20
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Если она там есть - то ссылка загружена.
Эдуард вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверить нахождение внешних ссылок xref

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слои внешних ссылок Werwolf AutoCAD 20 25.07.2020 01:21
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
Обновление внешних ссылок в ACA 2009 misht Вертикальные решения на базе AutoCAD 1 02.03.2010 18:04
изменение пути внешних ссылок ASLYS Программирование 6 05.10.2007 13:25