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

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

Как удалить неиспользуемую ссылку на "подложку"?

Ответ
Поиск в этой теме
Непрочитано 13.05.2022, 19:07 #1
Как удалить неиспользуемую ссылку на "подложку"?
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 451

Всем привет!

Ситуация такая: в DWG были как "подложки" вставлены несколько файлов PDF.
Потом эти "вставки" стёрли командой ERASE. Но ссылки на них в чертеже всё
равно остались. Если дать команду:

_externalreferenes

то появится окно, в котором они видны. И слово "неиспользуемая" напротив
каждой из них присутствует. И удалить их в этом окне тоже можно.
Но нужно сделать это программно. Без диалога. Просто удалить ссылки на
неиспользуемые "подложки". Т.е. нужно:

а) Получить список неиспользуемых ссылок на ранее вставленные PDF файлы.
б) Скормить его какой-нибудь команде (можно всей кучей или поштучно, не важно).

Конечно, PDF - частный случай, "подложки" могут быть и другого формата,
но пока нужно рашить хотя бы эту задачу.
__________________
Счастливо, Алексей!
Просмотров: 5106
 
Непрочитано 13.05.2022, 21:49
1 | #2
Кулик Алексей aka kpblc
Moderator

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


_-xref
_detach
*

Как-то так, если использовать командные методы
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.05.2022, 15:51
#3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


А некомандными методами до информации о вставленных ранее "подложках"
(как уже удаленных, так и ещё не удаленных) добраться можно?

Если через (tblnext) - что не очень похоже на правду - то какое имя имеет эта таблица?

Или нужно какие-то другие (какие ?) функции использовать?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 14.05.2022, 17:22
1 | #4
Сергей812


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
некомандными методами
могу только рекомендовать обернуть .Net код в Lisp-обертку: чтобы не переписывать уже остальное готовое.
Сергей812 вне форума  
 
Непрочитано 14.05.2022, 21:28
1 | #5
VVA

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


Solved: Remove unused file references from drawing - AutoCAD
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 16.05.2022, 11:17
#6
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
могу только рекомендовать обернуть .Net код в Lisp-обертку: чтобы не переписывать уже остальное готовое.
Да я перепишу... Если только некоторые моменты уточнить удастся.
Для начала - как из Лиспа (ВижуалЛиспа) получить информацию из "ACAD_PDFDEFINITIONS" ?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 16.05.2022, 14:18
1 | #7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Код:
[Выделить все]
 ;(vlax-for 
	;dict_item 
	(vla-item (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object))) "acad_pdfdefinitions")
	;(vla-delete dict_item)
;)
koMon вне форума  
 
Автор темы   Непрочитано 16.05.2022, 15:14
#8
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Теперь осталось понять, как из dict_item (вон, где оно живет, оказывается!)
выдернуть признак того, что подложка не используется и "золотой ключик
у нас в кармане" :-)

В принципе понятно, что надо данные ObjectID для каждого dict_item (в общем
виде их несколько - используемых и "уже нет" подложек) получить и их уже смотреть...
Как?

Ну и чтобы второй раз не спрашивать :-) - какой там признак смотреть?
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 16.05.2022 в 15:36.
===AAA=== вне форума  
 
Непрочитано 16.05.2022, 21:10
#9
Сергей812


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Да я перепишу... Если только некоторые моменты уточнить удастся.
Для начала - как из Лиспа (ВижуалЛиспа) получить информацию из "ACAD_PDFDEFINITIONS" ?
а зачем - в .Net получили всю информации и удалили неиспользуемое. К примеру, набросал на базе кода Ривилиса из поста №4 пример команды для удаления неиспользуемых Pdf подложек:
Код:
[Выделить все]
 
// Autocad
using aps = Autodesk.AutoCAD.ApplicationServices;
using dbs = Autodesk.AutoCAD.DatabaseServices;
using edi = Autodesk.AutoCAD.EditorInput;
using rtm = Autodesk.AutoCAD.Runtime;

namespace RemovePDFUnderlay
{
    public class CommandsClass
    {
        [rtm.CommandMethod("RemovePDFUnderlay")]
        public void RemovePDFUnderlay()
        {
            aps.Document lDoc = aps.Application.DocumentManager.CurrentDocument;
            dbs.Database lDb = lDoc.Database;
            edi.Editor lEd = lDoc.Editor;
            dbs.ObjectIdCollection lIds = new dbs.ObjectIdCollection();
            string lPDFKeyName = dbs.UnderlayDefinition.GetDictionaryKey(typeof(dbs.PdfDefinition));
            using (dbs.DBDictionary lND = lDb.NamedObjectsDictionaryId.Open(dbs.OpenMode.ForRead) as dbs.DBDictionary)
            {
                if (lND.Contains(lPDFKeyName))
                {
                    using (dbs.DBDictionary lPDFDict = lND.GetAt(lPDFKeyName).Open(dbs.OpenMode.ForRead) as dbs.DBDictionary)
                    {
                        foreach (dbs.DBDictionaryEntry lEntry in lPDFDict) lIds.Add(lEntry.Value);
                    }
                }
            }
            lDb.Purge(lIds);
            using (dbs.Transaction lTr = lDb.TransactionManager.StartTransaction())
            {
                foreach (dbs.ObjectId lId in lIds)
                {
                    dbs.PdfDefinition lPDFDef = lTr.GetObject(lId, dbs.OpenMode.ForWrite) as dbs.PdfDefinition;
                    if ((lPDFDef != null) && (!lPDFDef.IsErased)) lPDFDef.Erase(true);
                }
                lTr.Commit();
            }
        }

    }
}


ничто не мешает .Net код вместо команды вставить внутри LispFunction и вызывать уже из лиспа. Ну будет лежать в папке утилит одна сборка .Net помимо лисповских файлов.
Сергей812 вне форума  
 
Непрочитано 17.05.2022, 13:13
1 | #10
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Как?
мб так?
Код:
[Выделить все]
 (if (null (vl-catch-all-error-p (setq dictionary (vl-catch-all-apply 'vla-item (list (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object))) "acad_pdfdefinitions")))))
	(vlax-for
		dict_item
		dictionary
		(if (or
				(null (vl-some '(lambda (entity) (and (entget (setq pdf_underlay entity)) (= "PDFUNDERLAY" (cdr (assoc 0 (entget entity))))))
								(mapcar 'cdr
										(vl-remove-if 
											'(lambda (list_member) (/= 330 (car list_member)))
											(entget (vlax-vla-object->ename dict_item))
										)
								)
					  )
				)
				(null (ssadd pdf_underlay)) 
			)
				(progn
					(princ "\nУдаляю несвязанную запись o внешней PDF ссылке: \"")
					(princ (cdr (assoc 1 (entget (vlax-vla-object->ename dict_item)))))
					(princ ", cтраница ")
					(princ (cdr (assoc 2 (entget (vlax-vla-object->ename dict_item)))))
					(princ "\"")
					(vla-delete dict_item)
				)
		)
	)
	(princ "Нет вставленных PDF")
)
(princ)

Последний раз редактировалось koMon, 08.06.2022 в 09:14.
koMon вне форума  
 
Автор темы   Непрочитано 17.05.2022, 14:32
#11
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Спасибо!

А то я - узнав, что это дело живет в словарях - ринулся было
"плясать от печки". Прямо с (namedobjdict)

:-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 08.06.2022, 09:02
#12
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Обнаружилась проблемка - конструкция

(vla-item (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object))) "acad_pdfdefinitions")

сбоит на файлах, куда pdf-подложки вообще ни разу в жизни не вставлялись.

Выдает:

Ошибка Automation. Ключ не найден

на том всё и завершается.

Как победить?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 08.06.2022, 09:10
#13
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (if (not
      (vl-catch-all-error-p
        (setq dict (vl-catch-all-apply
                     (function (lambda ()
                                 (vla-item (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))
                                           "acad_pdfdefinitions"
                                 ) ;_ end of vla-item
                               ) ;_ end of lambda
                     ) ;_ end of function
                   ) ;_ end of vl-catch-all-apply
        ) ;_ end of setq
      ) ;_ end of vl-catch-all-error-p
    ) ;_ end of not
  ;; И здесь делаешь что нужно
) ;_ end of if
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.06.2022, 09:15
#14
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


ну, я тоже отметился в десятке)))
koMon вне форума  
 
Непрочитано 08.06.2022, 09:22
1 | #15
Кулик Алексей aka kpblc
Moderator

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


Сорри, не видел.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.06.2022, 10:08
#16
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Ага! Спасибочки.

Ну и заодно уж.

Я правильно понимаю, что ветка

(null (ssadd pdf_underlay))

не выдаст Т ни при каких условиях?

Т.е. OR, конечно, убирать не стоит (мало ли что потом ещё
придумается), но пока его безболезненно можно заменить
на просто nil.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 08.06.2022, 10:41
1 | #17
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
не выдаст Т
в идеале нет, а на практике легко))) поэтому я бы оставил как есть!)
то есть я имел в виду, что pdf_underlay может обнаружиться, но левый, никуда не ведущий.
koMon вне форума  
 
Автор темы   Непрочитано 08.06.2022, 11:21
#18
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


>>> но левый, никуда не ведущий.

Вон оно как бывает... Интересно.
Оставлю тогда, конечно.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как удалить неиспользуемую ссылку на "подложку"?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoCad 2013 - удалить AutodeskSync FritGtoy AutoCAD 2 17.02.2016 18:28
Как удалить неиспользуемую в чертеже линию? Anton_vl AutoCAD 13 19.01.2016 14:24
Как добраться до свойств объекта, находящегося во внешней ссылке, не входя в саму ссылку? Profan Программирование 9 14.11.2014 09:56
Плохо видно внешнюю ссылку через видовой экран на листе casaatik AutoCAD 3 02.11.2011 12:11
AutoCad 2010 Как удалить "вставку" т.е. ссылку на DWG из проекта? star282 AutoCAD 3 17.02.2011 20:44