Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Denis от 01-08-2017, 17:03:11

Название: Bind и возврат назад.
Отправлено: Denis от 01-08-2017, 17:03:11
Здравствуйте!

В очередной раз обращаюсь за помощью. Хочу пинка в правильном направлении. Опишу задачу: есть файл, с которым работает проектировщик. В определенный момент происходит команда выпуска его чертежа, где делается следующее: файл копируется в некую промежуточную папку и потом когда-нибудь (при окончательном согласовании) он попадает в папку выпуска документации.
В файле есть большое количество XREF и есть желание, чтобы в итоговом файле (который в папке выпуска документации), там были не xref, а блоки, которые получаются при помощи bind.
То есть рабочий файл проектировщика должен остаться у него, но некий файл с bind хрефами должен уйти в выпуск.

2 идеи возникли:
1)Сделать копию файла, положить рядом с основным, там сделать bind и его отправить. Немного запутался тут как работать с БД + необходимо еще взрывать прокси, которые тянутся от Civil 3d.Это делается кодом Александра Ривилиса.
2)Делать bind  в рабочем файле, отправлять и возвращать обратно xref. Тоже прокси надо взрывать

Заранее спасибо за подсказки.
Название: Re: Bind и возврат назад.
Отправлено: Александр Ривилис от 01-08-2017, 17:26:23
1. Рекомендую исходный файл не трогать. Можно его просто скопировать с новым именем (если он не открыт в редакторе) или сохранить с новым именем (если открыт) , а затем открыть через Database.ReadDwgFile.
2. http://adndevblog.typepad.com/autocad/2012/12/binding-external-references.html - посмотри этот пример использования Database.BindXrefs. Только второй параметр лучше заменить на false, иначе может быть проблема с именами блоков: http://adn-cis.org/razreshenie-konflikta-imyon-pri-svyazyivanii-vneshnej-ssyilki.html
Название: Re: Bind и возврат назад.
Отправлено: Denis от 01-08-2017, 17:42:15
Спасибо за ответ!
А просто через File.Copy() нельзя копировать файл, который открыт в редакторе?
Надо через
Код - C# [Выбрать]
  1. acDoc.Database.SaveAs(strDWGName, true, DwgVersion.Current,acDoc.Database.SecurityParameters);
?
Я просто как раз этот пример и пользую сейчас. В таком случае при подпихивании коду по ссылке http://adndevblog.typepad.com/autocad/2012/12/binding-external-references.html (http://adndevblog.typepad.com/autocad/2012/12/binding-external-references.html) у меня ничего в файле не меняется.
Как мне в данном случае подцепиться к файлу-копии?
Название: Re: Bind и возврат назад.
Отправлено: Александр Ривилис от 01-08-2017, 22:55:09
А просто через File.Copy() нельзя копировать файл, который открыт в редакторе?
Нет. Во всяком случае до того момента как ты его не сохранишь. Ведь в файле и в редакторе AutoCAD разные состояния если пользователь что-то делал с чертежом.
Название: Re: Bind и возврат назад.
Отправлено: Александр Ривилис от 01-08-2017, 22:59:26
В таком случае при подпихивании коду по ссылке http://adndevblog.typepad.com/autocad/2012/12/binding-external-references.html у меня ничего в файле не меняется.
Как мне в данном случае подцепиться к файлу-копии?
Что значит подцепится? Создаёшь Database, в неё сразу читаешь этот файл при помощи Database.ReadDwgFile. Возможно нужно еще Database.ResolveXrefs и Database.CloseInput. Ну и дальше по схеме примера.
Название: Re: Bind и возврат назад.
Отправлено: Denis от 04-08-2017, 10:26:16
Спасибо за решение.
Необходимо было поставить Database.ResolveXrefs и все заработало.
Название: Re: Bind и возврат назад.
Отправлено: Denis от 09-08-2017, 10:33:55
Здравствуйте.
Как прямое продолжение темы.
Подскажите, пожалуйста, можно ли сделать bind еще и на вложенные (nested) xref?
Название: Re: Bind и возврат назад.
Отправлено: Александр Ривилис от 09-08-2017, 11:57:36
Здравствуйте.
Как прямое продолжение темы.
Подскажите, пожалуйста, можно ли сделать bind еще и на вложенные (nested) xref?
А этот пример не работает: http://adndevblog.typepad.com/autocad/2012/12/binding-external-references.html ?
Если нет, то тебе придётся сделать копии всех файлов, пройтись по всем вложенным внешним ссылкам, заbindдить их, а затем уже заbindдить в основной чертеж.
Название: Re: Bind и возврат назад.
Отправлено: Александр Ривилис от 09-08-2017, 12:07:31
Так находятся все внешние ссылки: http://adn-cis.org/kak-najti-vse-vneshnie-ssyilki-v-tekushhej-baze-s-pomoshhyu-c.html
Название: Re: Bind и возврат назад.
Отправлено: Denis от 09-08-2017, 12:18:47
Пример работает на Xref, у которых статус Resolve.
Если есть Xref в Xref, один из которых unloaded или unreferenced, то ничего делаться не будет, даже detachXref.

Есть более крамольная мысль: если есть unloaded Хрефы, то взять и загрузить их. Если все чертежи загружены, то все работает прекрасно.
После этого забиндить и выключить слои, которые были принесены из загруженных ненужных хрефов.
Название: Re: Bind и возврат назад.
Отправлено: Denis от 09-08-2017, 12:47:13
Ну или удалить блоки, которые принадлежали к ненужным хрефам
Название: Re: Bind и возврат назад.
Отправлено: Александр Ривилис от 09-08-2017, 14:14:39
Ну тут зависит от постановки задачи. Но если Xref unreferenced, то (IMHO) его и трогать не нужно.
Название: Re: Bind и возврат назад.
Отправлено: Denis от 09-08-2017, 16:44:31
В данном случае нужно было, чтобы вообще упоминаний о хрефах не было.
В принципе мне помог пример, который Вы привели по ссылке, но с костылем.
Сначала я прошелся и сделал Detach тех хрефов, статус которых был Unload, Unreferenced и FileNotFound.
Потом сохранил результат и вторым проходом уже биндил те, где статус Resolved.
Название: Re: Bind и возврат назад.
Отправлено: Александр Ривилис от 09-08-2017, 17:45:36
В принципе мне помог пример, который Вы привели по ссылке, но с костылем.
Сначала я прошелся и сделал Detach тех хрефов, статус которых был Unload, Unreferenced и FileNotFound.
Потом сохранил результат и вторым проходом уже биндил те, где статус Resolved.
Вполне себе нормальный костыль.