Показать полный путь к файлу в заголовке окна 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); } |
Я, мягко говоря, знатно удивлен, что такие (как мне кажется, достаточно базовые вещи) приходится делать настолько заковыристо...
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)
По мотивам поста немного доработал реализацию с использованием реактора.
Для плавающего окна документа должно отображаться полное имя файла (если он уже сохранялся).
При возврате в фиксированное положение отображается имя без пути.