• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Массовое выделение элементов

Автор magicalblade, 25.06.22, 18:26:41

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

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

magicalblade

Здравствуйте. Необходимо выделить группу элементов использую для этого SelectionManager. Передаю ему массив. Но почему то элементы выделяются по одному а не сразу все. Если после этого выделения использовать "отмену действия" в компасе то отменяется выделение одного элемента а не всех.
Есть ли возможность сделать выделение группы элементов за раз?

using Kompas6API5;
using KompasAPI7;
using Kompas6Constants;
using KAPITypes;
using System;
using System.Resources;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Steps.NET
{
// Класс Step1 - Самая простая библиотека на C#
  [ClassInterface(ClassInterfaceType.AutoDual)]
  public class Step1
{
// Имя библиотеки
[return: MarshalAs(UnmanagedType.BStr)] public string GetLibraryName()
{
return "Step1 - Самая простая библиотека на C#";
}


// Головная функция библиотеки
public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
{
KompasObject kompas = (KompasObject)kompas_;
IApplication application = (IApplication)kompas.ksGetApplication7();
IKompasDocument2D1 KompasDocument2D1 = (IKompasDocument2D1)application.ActiveDocument;
IKompasDocument2D KompasDocument2D = (IKompasDocument2D)application.ActiveDocument;
IKompasDocument1 kompasDocument1 = (IKompasDocument1)application.ActiveDocument;

SelectionManager Kselecte = KompasDocument2D1.SelectionManager;
ViewsAndLayersManager MYViewsAndLayersManager = KompasDocument2D.ViewsAndLayersManager;
IViews MYviews = MYViewsAndLayersManager.Views;
ISymbols2DContainer Symbols2DContainer = (ISymbols2DContainer)MYviews.ActiveView;
ILeaders layer = Symbols2DContainer.Leaders;

            object[] objects = new object[layer.Count];

            for (int i = 0; i < layer.Count; i++)
            {
objects[i] = layer[i];
}

Kselecte.Select(objects);

}


#region COM Registration
// Эта функция выполняется при регистрации класса для COM
// Она добавляет в ветку реестра компонента раздел Kompas_Library,
// который сигнализирует о том, что класс является приложением Компас,
// а также заменяет имя InprocServer32 на полное, с указанием пути.
// Все это делается для того, чтобы иметь возможность подключить
// библиотеку на вкладке ActiveX.
[ComRegisterFunction]
public static void RegisterKompasLib(Type t)
{
try
{
RegistryKey regKey = Registry.LocalMachine;
string keyName = @"SOFTWARE\Classes\CLSID\{" + t.GUID.ToString() + "}";
regKey = regKey.OpenSubKey(keyName, true);
regKey.CreateSubKey("Kompas_Library");
regKey = regKey.OpenSubKey("InprocServer32", true);
regKey.SetValue(null, System.Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\mscoree.dll");
regKey.Close();
}
catch (Exception ex)
{
MessageBox.Show(string.Format("При регистрации класса для COM-Interop произошла ошибка:\n{0}", ex));
}
}

// Эта функция удаляет раздел Kompas_Library из реестра
[ComUnregisterFunction]
public static void UnregisterKompasLib(Type t)
{
RegistryKey regKey = Registry.LocalMachine;
string keyName = @"SOFTWARE\Classes\CLSID\{" + t.GUID.ToString() + "}";
RegistryKey subKey = regKey.OpenSubKey(keyName, true);
subKey.DeleteSubKey("Kompas_Library");
subKey.Close();
}
#endregion
}
}


Михаил88

#1
Вот выделение группы объектов за раз. В метод Select передаю массив объектов.

from win32com.client import gencache, Dispatch

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
application = Dispatch('Kompas.Application.7') # или KompasObject.ksGetApplication7()

kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
selection_manager = kompas_document_3d.SelectionManager
iPart7 = kompas_document_3d.TopPart
Parts = iPart7.PartsEx(0)
selection_manager.Select(Parts)

Screenshot_1.bmp

magicalblade

Забыл уточнить что это в 2D чертеже. Элементы которые хочу выделять это например размеры, выноски и т.п.

Михаил88

Цитата: magicalblade от 25.06.22, 19:27:41Забыл уточнить что это в 2D чертеже. Элементы которые хочу выделять это например размеры, выноски и т.п.

from win32com.client import gencache, Dispatch

#  Получи константы
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
application = Dispatch('Kompas.Application.7') # или KompasObject.ksGetApplication7()

kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
kompas_document_2d_1 = kompas_api7_module.IKompasDocument2D1(kompas_document_2d)
selection_manager = kompas_document_2d_1.SelectionManager

# Менеджер слоев и видов графического документа.
views_and_layers_manager = kompas_document_2d.ViewsAndLayersManager
# Интерфейс коллекции видов графического документа.
views = views_and_layers_manager.Views
view = views.View(0)
# Интерфейс контейнера объектов вида графического документа
drawing_container = kompas_api7_module.IDrawingContainer(view)
objects = drawing_container.Objects(kompas6_constants.ksDrLDimension)
selection_manager.Select(objects)

Вот пример выделение всех линейных размеров на системном виде.
Только вот при нажатии отменить действительно выделение снимается по 1 размеру. Если Вам нужно снять со всех сразу можно применить метод UnselectAll()
+ Благодарностей: 2

magicalblade

Спасибо. Выходит такая особенность API.

p3452


magicalblade

Согласен не удачно назвал переменную. В вашем примере однозначно будет выделятся по одному элементу. Я пытаюсь найти способ выделить сразу все, как это делается в компасе через "выделить по свойствам". При выделении по одному элементу, при большом количестве этих элементов, появляется приличная задержка. А так же нюансы с отменой выделения.
Я все больше склоняюсь к выводу что не получится через select все выделить за раз без дополнительных действий. Этот же массив передавал на удаление - удалялось все сразу.
Есть мысль собрать все элементы в группу а потом эту группу выделить, по идее должно сработать.

p3452

Зачем "пустословить", когда можно попробовать на практике!?
- Выделяются ВСЕ элементы, задержки по времени не ощутима, команда "Отменить" - снимает выделение со ВСЕХ элементов, команда "Повторить" - вновь выделяет ВСЕ элементы.
- Если же важен "принцип" используйте метод предложенный Михаил88 - то же работает, но... больше строк кода (7 строк, вместо 2) и "медленный" оператор "try...catch...".


magicalblade

Цитата: p3452 от 26.06.22, 11:25:12Зачем "пустословить", когда можно попробовать на практике!?
- Выделяются ВСЕ элементы, задержки по времени не ощутима, команда "Отменить" - снимает выделение со ВСЕХ элементов, команда "Повторить" - вновь выделяет ВСЕ элементы.
- Если же важен "принцип" используйте метод предложенный Михаил88 - то же работает, но... больше строк кода (7 строк, вместо 2) и "медленный" оператор "try...catch...".


Зачем же ругаться :) Я ведь этот способ пробовал самым первым. И он у меня выделяет по одному элементу и дольше чем передать массивом. И отменяется потом по одному элементу. Возможно мне нужно еще что то указать? Либо я не донес свою мысль. Ниже прикрепил видео. На нем видно как долго выделяются элементы и что именно я подразумеваю под отменой.

Михаил88

Я так и понял задачу. Надо будет ещё как нибудь попробовать тогда. Если получится сделать напишу.

magicalblade

Цитата: Михаил88 от 26.06.22, 12:33:00Я так и понял задачу. Надо будет ещё как нибудь попробовать тогда. Если получится сделать напишу.

Попробовал через "группы". Сработало. Сначала создаем группу, добавляем в нее то что надо выделить, затем выделяем группу.
+ Благодарностей: 1

p3452

Причин "тормозов", когда дело касается Компаса, может быть "вагон и маленькая тележка"...
Вот реальный тест двух способов выделения на примере 85 элементов "Линейный размер":
- поэлементное выделение - 1156 ms
- выделение массива - 43 ms
(учитывался ПЕРВЫЙ запуск команды).

Разница огромна, но зрительно - едва ощутим (1 сек.)
+ Благодарностей: 1

p3452

Для полноты картины - аналогичный тест, для предварительно созданной "группы" - 97 ms.