nanoCAD подсветка примитивов после команды

Понадобилось мне тут после выполнения пользовательской команды "подсветить" примитивы по определенным правилам. Даже привлечение тяжелой артиллерии в лице doctorRaz с полпинка задачку не решило (

Но ведь не зря говорят - если что-то не получается, читай документацию! Правда, документация от nanoDev ну так себе, но есть пока что справка от ObjectARX - ей и пользуюсь. Но обо всем по порядку.

Итак, для начала создаю проект библиотеки классов под NET6, подключаю самостоятельно сделанные nuget-пакеты под 23.1, и прописываю собственные команды. Допустим, надо посвечивать только полилинии.

Команд будет две - одна получает перечень ObjectId и пытается их подсветить "вне транзакции", вторая - внутри транзакции:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using HostMgd.ApplicationServices;
using HostMgd.EditorInput;
using Teigha.DatabaseServices;
using Teigha.Runtime;

namespace NCadSelectEntities
{
    public static class NCadCommands
    {
        [CommandMethod("select-out-trans")]
        public static void SelectOutTransactionCommand()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            if (doc == null)
            {
                return;
            }

            Editor ed = doc.Editor;

            ObjectId[] ids = null;

            using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
            {
                ids = GetFilteredObjectIds(doc, trans).ToArray();
            }
            ed.SetImpliedSelection(SelectionSet.FromObjectIds(ids));
            ed.UpdateScreen();
        }

        [CommandMethod("select-in-trans")]
        public static void SelectInTransactionCommand()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            if (doc == null)
            {
                return;
            }

            Editor ed = doc.Editor;

            using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
            {
                ObjectId[] ids = GetFilteredObjectIds(doc, trans).ToArray();
                ed.SetImpliedSelection(SelectionSet.FromObjectIds(ids));
                ed.UpdateScreen();
            }
        }

        private static IEnumerable<ObjectId> GetFilteredObjectIds(Document Doc, Transaction Trans)
        {
            BlockTable blockTable = Trans.GetObject(Doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;
            BlockTableRecord model =
                Trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
            return model.Cast<ObjectId>()
                .Where(o =>
                {
                    Polyline ent = Trans.GetObject(o, OpenMode.ForRead, false, false) as Polyline;
                    return ent != null;
                });
        }
    }

}

И - ничего не происходит. Если пошагово проходить, то будет видно, что после UpdateScreen на какое-то время примитивы подсвечиваются - но и все. А при прямом выполнении select-in-trans просвистывает мимо как не было, а select-out-trans хоть на какую-то долю секунды что-то подсвечивает.

Ну ок, лезу в документацию ObjectARX и читаю там про CommandFlags. Один из них - Redraw - вроде бы как раз что нужно. Добавляю:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using HostMgd.ApplicationServices;
using HostMgd.EditorInput;
using Teigha.DatabaseServices;
using Teigha.Runtime;

namespace NCadSelectEntities
{
    public static class NCadCommands
    {
        [CommandMethod("select-out-trans", CommandFlags.Redraw)]
        public static void SelectOutTransactionCommand()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            if (doc == null)
            {
                return;
            }

            Editor ed = doc.Editor;

            ObjectId[] ids = null;

            using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
            {
                ids = GetFilteredObjectIds(doc, trans).ToArray();
            }
            ed.SetImpliedSelection(SelectionSet.FromObjectIds(ids));
            ed.UpdateScreen();
        }

        [CommandMethod("select-in-trans", CommandFlags.Redraw)]
        public static void SelectInTransactionCommand()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            if (doc == null)
            {
                return;
            }

            Editor ed = doc.Editor;

            using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
            {
                ObjectId[] ids = GetFilteredObjectIds(doc, trans).ToArray();
                ed.SetImpliedSelection(SelectionSet.FromObjectIds(ids));
                ed.UpdateScreen();
            }
        }

        private static IEnumerable<ObjectId> GetFilteredObjectIds(Document Doc, Transaction Trans)
        {
            BlockTable blockTable = Trans.GetObject(Doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;
            BlockTableRecord model =
                Trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
            return model.Cast<ObjectId>()
                .Where(o =>
                {
                    Polyline ent = Trans.GetObject(o, OpenMode.ForRead, false, false) as Polyline;
                    return ent != null;
                });
        }
    }

}

И все срабатывает как надо! То есть выделение корректно работает и при активной транзакции, и вне ее.

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



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


Я не робот.