Показать полный путь к файлу в заголовке окна 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);
}

Я, мягко говоря, знатно удивлен, что такие (как мне кажется, достаточно базовые вещи) приходится делать настолько заковыристо...

Размещено в .NET, nanoCAD · Метки: , ,



Поделитесь своим мнением


Я не робот.