Выбрать вид по имени C#

Автор Dragon3DGraff, 14.11.17, 12:32:27

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Dragon3DGraff

Добрый день!
Как можно выбрать вид в документе по имени, а не по номеру?
Ход моих рассуждений:
Как я понял из SDK это свойство есть в API7, View = iObject.View(Index), где index - индекс вида в коллекции, ссылка на вид или имя вида. Тип Variant.
iObject  в свою очередь это интерфейс вида IView, который берется из IViewsAndLayersManager. Из него получаем коллекцию видов views.Views...
И получается из него уже можем взять по имени?
Так вот, это у меня не получается. Там просто нет такого свойства...
Ссылку на документ пробовал получить как для апи5 и как для апи 7... Может тут проблема...

ТрындецЪ

 iObject в данном случае, это интерфейс коллекции видов IViews

#programmer

В качестве примера взял чертёж: KOMPAS-3D V16\Samples\Drawings\SAMPLE4.cdw.

Kompas6API5.KompasObject ikompas = (Kompas6API5.KompasObject)System.Runtime.InteropServices.Marshal.GetActiveObject("kompas.application.5");
            KompasAPI7.IApplication iapp = ikompas.ksGetApplication7();
            KompasAPI7.IKompasDocument2D ik2d = (KompasAPI7.IKompasDocument2D)iapp.ActiveDocument;

            KompasAPI7.IViewsAndLayersManager vlm = ik2d.ViewsAndLayersManager;

            if (vlm != null)
            {
                KompasAPI7.IViews vvs = vlm.Views;
                if (vvs != null && vvs.Count > 0)
                {
                    KompasAPI7.IView v1 = vvs.View["Вид 1"];
                    if (v1 != null)
                    {
                        Debug.WriteLine("v1 = " + v1.Name);
                    }
                    foreach (KompasAPI7.IView v in vvs)
                    {
                        Debug.WriteLine(v.Name);
                    }
                }
            }

Результат:

v1 = Вид 1

Системный вид
Вид 1
Вид 2
Вид 3
Вид 4
Вид 5

Всё нормально работает...
+ Благодарностей: 1

#programmer

Или так:

KompasAPI7.IView v2 = vvs.Cast<KompasAPI7.IView>().FirstOrDefault(v => v != null && string.Compare(v.Name, "вид 1", true) == 0);
                    if (v2 != null)
                    {
                        Debug.WriteLine("v2 = " + v2.Name);
                    }

Результат:

v2 = Вид 1

Dragon3DGraff

Цитата: #programmer от 14.11.17, 13:01:06
В качестве примера взял чертёж: KOMPAS-3D V16\Samples\Drawings\SAMPLE4.cdw.

Kompas6API5.KompasObject ikompas = (Kompas6API5.KompasObject)System.Runtime.InteropServices.Marshal.GetActiveObject("kompas.application.5");
            KompasAPI7.IApplication iapp = ikompas.ksGetApplication7();
            KompasAPI7.IKompasDocument2D ik2d = (KompasAPI7.IKompasDocument2D)iapp.ActiveDocument;

            KompasAPI7.IViewsAndLayersManager vlm = ik2d.ViewsAndLayersManager;

            if (vlm != null)
            {
                KompasAPI7.IViews vvs = vlm.Views;
                if (vvs != null && vvs.Count > 0)
                {
                    KompasAPI7.IView v1 = vvs.View["Вид 1"];
                    if (v1 != null)
                    {
                        Debug.WriteLine("v1 = " + v1.Name);
                    }
                    foreach (KompasAPI7.IView v in vvs)
                    {
                        Debug.WriteLine(v.Name);
                    }
                }
            }

Результат:

v1 = Вид 1

Системный вид
Вид 1
Вид 2
Вид 3
Вид 4
Вид 5

Всё нормально работает...

Спасибо! все работает!
Я вчера оказывается почти до этого дошел в 2 часа ночи, но пытался имя вида в круглые скобки поставить вместо квадратных )) поэтому и не работало )))