Показать полный путь к файлу в заголовке окна 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 · Метки: , ,



Комментарии

Есть 1 комментарий к “Показать полный путь к файлу в заголовке окна ncad”
  1. EdwardSt пишет:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    ;устанавливает автоматическое отображение
    ;полного имени файла:
    ; - в заголовке окна NanoCAD
    ; - в плавающем окне документа
    ;Файл можно вставить в автозагрузку
      (vl-load-com)

    ;Тело реактора
    (defun set-doc-caption (reactor-object parameter-list / doc app cpt fn path)
      (setq doc (car parameter-list)) ; активируемый документ
      (setq app (vlax-get-acad-object))
      (if (setq cpt (findfile (vla-get-FullName doc)))
        (progn
        (if (= (vla-get-Active doc) :vlax-false) ; плавающее окно
          (setq path "" fn cpt)
          (setq
            path (strcat (vl-filename-directory cpt) "\\")
            fn (strcat (vl-filename-base cpt)  
                       (vl-filename-extension cpt))))
        (vlax-put-property doc 'windowtitle fn)
        (vlax-put-property app 'Caption path)
       ))
      (prin1)
      )

    (defun clear-doc-caption (reactor-object parameter-list / )
      (vlax-put-property  (vlax-get-acad-object) 'Caption "")
      (prin1)
      )

    ;натравливаем ректор на событие

    (if (not *EDw_CaptionReactor*)
      (setq *EDw_CaptionReactor* (vlr-docmanager-reactor nil
        '(
        (:vlr-documentBecameCurrent . set-doc-caption)
        (:vlr-documentToBeDeactivated . clear-doc-caption)
        )
        )))
    (prin1)

    По мотивам поста немного доработал реализацию с использованием реактора.
    Для плавающего окна документа должно отображаться полное имя файла (если он уже сохранялся).
    При возврате в фиксированное положение отображается имя без пути.

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


Я не робот.