Показать полный путь к файлу в заголовке окна ncad
Почему это не было сделано на уровне базового функционала - непонятно. Под катом готовый код и немного собственных рассуждений.
В чате nanoCAD EdwardSt опубликовал лисп, который эту задачу выполняет. Через ActiveX, что вполне очевидно. Я попробовал сделать на C#.
Все делаю в одном классе, в одном файле. Учитываю, что вполне возможен вариант, что какие-то документы уже открыты, а библиотека будет грузиться потом и вручную. Команды не рисую, все будет в инициализаторе аддона.
Для начала общий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using HostMgd.ApplicationServices; using Teigha.Runtime; namespace NCadCaption { public class PluginInitialize : IExtensionApplication { public void Initialize() { Application.DocumentManager.DocumentBecameCurrent += OnDocumentToBeCurrentEvent; Document doc = Application.DocumentManager.MdiActiveDocument; if (doc != null) { OnDocumentToBeCurrentEvent(null, null); } } public void Terminate() { } public void OnDocumentToBeCurrentEvent(object sender, DocumentCollectionEventArgs e) { throw new NotImplementedException(); } } } |
Чисто теоретически можно менять заголовок окна, как это сделал EdwartSt, но пользователь может сделать окно документа "плавающим". Так что лучше всего менять заголовок именно документа, а не приложения.
Сначала я подумал, что платформы будет более чем достаточно. Проблема в том, что, хотя у документа и есть окно, но у окна нет Caption. Есть только Text.
1 2 3 4 5 6 7 8 9 10 11 12 | public void OnDocumentToBeCurrentEvent(object sender, DocumentCollectionEventArgs e) { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) { return; } var win = doc.Window; // win.Caption = doc.Name; // Пошлет, нет такого свойства у окна. win.Text = doc.Name; } |
Проблема только в одном: это будет работать только до момента выхода из метода.
Пришлось идти через динамику:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public void OnDocumentToBeCurrentEvent(object sender, DocumentCollectionEventArgs e) { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) { return; } dynamic comDoc = doc.AcadDocument; string name = doc.Name; comDoc.WindowTitle = name; Marshal.ReleaseComObject(comDoc); } |
Я, мягко говоря, знатно удивлен, что такие (как мне кажется, достаточно базовые вещи) приходится делать настолько заковыристо...