Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: Doom от 28.01.23, 16:04:30

Название: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 28.01.23, 16:04:30
Доброго,

Например читаю дерево модели и по элементно анализирую.

iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)

DCollection = iPart.EntityCollection(LDefin3D.o3d_unknown)

count = DCollection.GetCount()

for i in range(count):

itemEntity = DCollection.GetByIndex(i)

if itemEntity.name:                     

# >>>>>>>>>>>> плоскости <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if itemEntity.type == LDefin3D.o3d_planeOffset:
...

if itemEntity.type == LDefin3D.o3d_planeAngle:
                        ...
                ...

Для модели у которого в дереве отображается более 400 элементов - приказывает мне долго жить!

а если анализировать несколько файлов то время существенно много потребуется - есть ли какой то способ распараллелить данную задачу ?
видно что используется только одно ядро а остальные простаивают

знаний маловато то пришло на ум только одно -

разделить задачу на 4 потока и запустить их асинхронно - пытался когдато - не вышло

взять управление над нескольким экземплярами Компас - оказалось что не так просто и нужно как то через компонент(на форуме поднималась эта тема но там не чего не понял)

можно как то еще нагрузить еще 3 простаивающих ядра ?

   
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: p3452 от 28.01.23, 18:22:13
Цитата: Doom от 28.01.23, 16:04:30Для модели у которого в дереве отображается более 400 элементов - приказывает мне долго жить!
- Расшифруйте...
- Хотите сказать, что при переборе коллекции в которой более 400 элементов Компас крашится?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 28.01.23, 18:27:53
Цитата: p3452 от 28.01.23, 18:22:13- Расшифруйте...

у меня этот процесс длится чуть более 2 минут


Цитата: Doom от 28.01.23, 16:04:30взять управление над нескольким экземплярами Компас
в списке IRunningObjectTable отображается не соответствие количеству записей к количеству запущенных копий Компаса
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 28.01.23, 18:28:47
а если обрабатывать несколько файлов - то считаю что долговато для этого выделять 15 минут
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: p3452 от 28.01.23, 18:52:32
Непонятно что Вы делаете и как?
Ограничимся общим:
- насколько я знаю Компас - однопоточен...
- Вы хозяин процесса и, следовательно, сами можете его "распараллелить" и без Компаса, но - помнить о п.1
- возможно "тормоза" связаны видеообработкой Вашего процесса - избавится от обновления и прочего
- возможно Ваши задачи позволят работать непосредственно с метаданными файлов минуя Компас
- и т.д. - в зависимости от решаемых задач
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 28.01.23, 19:15:46
Цитата: p3452 от 28.01.23, 18:52:32- насколько я знаю Компас - однопоточен...

это решаемо и как минимум 3 вариантами... но не могу найти примеры
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 28.01.23, 19:20:15
куда пропал Sabahs? один из вариантов реализации было им предложено, но не где не выкладывался пример
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Алексей Дубовицкий от 28.01.23, 20:26:52
Цитата: Doom от 28.01.23, 19:20:15куда пропал Sabahs (https://forum.ascon.ru/index.php?action=profile;u=408)?
Он с Украины.
Разработанное им приложение "Оборудование: Развертки" больше не продаётся.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 28.01.23, 20:51:02
Цитата: Алексей Дубовицкий от 28.01.23, 20:26:52Он с Украины.
он вроде как переехал ?

Цитата: Алексей Дубовицкий от 28.01.23, 20:26:52Разработанное им приложение "Оборудование: Развертки" больше не продаётся.
жестко :(

Тянул форум.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Валерий Изранов от 29.01.23, 07:50:02
Цитата: Doom от 28.01.23, 16:04:30видно что используется только одно ядро а остальные простаивают
Ресурсы для работы Компаса (память, процессор, экран, диск ) предоставляет операционная система Windows.
Использовать ресурсы в обход ОС весьма неразумно и опасно.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 29.01.23, 19:28:57
Цитата: Валерий Изранов от 29.01.23, 07:50:02Использовать ресурсы в обход ОС весьма неразумно и опасно.

ахаха я поведал многое.. а уронить пару раз систему во имя науки - такое себе опасность  :-)))  :-)))  - что то вроде уровня - цвета детской неожиданности?  :%:

сколько же Вам лет ? 5 ?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 29.01.23, 19:40:06
шутки шутками а по существу вопроса есть что добавить ?

нашел вариант через виртуальные системы но это очень ресурсоемко..
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 30.01.23, 10:23:53
забыл  :bang:  что виртуальные не поддерживаются.


Цитата: p3452 от 28.01.23, 18:52:32- насколько я знаю Компас - однопоточен...
тут мб политика...
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: IgorT от 30.01.23, 10:42:14
Цитата: Doom от 30.01.23, 10:23:53забыл  :bang:  что виртуальные не поддерживаются.

тут мб политика...
Ну как политика...
Есть задачи, которые можно распараллелить. Например расчеты МКЭ и построение чертежей. Они и распараллелены у Компаса.
А вот работа с 3Д моделью не поддаётся. ИМХО вообще не возможно.
Может кто знает CAD, который это делает?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 30.01.23, 13:06:02
Цитата: IgorT от 30.01.23, 10:42:14А вот работа с 3Д моделью не поддаётся. ИМХО вообще не возможно.

если рассматривать только одну деталь то как вариант - сделать копию ее файла и создать 2 потока А и Б: А) будет ее анализировать в одном процессе Компаса 3D и по этапно создавать и отправлять поток с полученной частью информацией на Б; Б) будет принимать поток и генерировать решение в другом процессе Компаса 3D.

Если я не ошибаюсь у SolidWorks/NX есть асинхронное построение детали те берется например плоскость и от нее в две стороны идет построение.

Например я знаю у Excel можно создавать хоть 10 процессов и можно получить управление над каждым из них и работать с ними в параллели.

Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: IgorT от 30.01.23, 13:25:08
Цитата: Doom от 30.01.23, 13:06:02...

Если я не ошибаюсь у SolidWorks/NX есть асинхронное построение детали те берется например плоскость и от нее в две стороны идет построение.
Что-то не понятное... Можно поподробнее?

Цитата: Doom от 30.01.23, 13:06:02Например я знаю у Excel можно создавать хоть 10 процессов и можно получить управление над каждым из них и работать с ними в параллели.
Excel производит вычисления. Их можно распараллелить. Но как например распараллелить процесс вращения модели в КАД? Он же в реальном времени происходит.
И эта... Может мы по разному понимаем обсуждаемый процесс?
ИМХО параллельное решение задачи означает разбивание решения задачи, занимающей некоторое длительное время, на куски. И одновременной выполнять решение этих куском на нескольких вычислительных устройствах, а по завершению слить результаты в единое целое.
Может быть я заблуждаюсь? Вы как понимаете "параллельность"?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 30.01.23, 13:44:28
Цитата: IgorT от 30.01.23, 13:25:08Excel производит вычисления. Их можно распараллелить. Но как например распараллелить процесс вращения модели в КАД? Он же в реальном времени происходит.
И эта... Может мы по разному понимаем обсуждаемый процесс?

Вы рассматриваете вопрос с позиции одного процесса, а там их 10 они работают не зависимо друг от друга.

Цитата: IgorT от 30.01.23, 13:25:08ИМХО параллельное решение задачи означает разбивание решения задачи, занимающей некоторое длительное время, на куски. И одновременной выполнять решение этих куском на нескольких вычислительных устройствах, а по завершению слить результаты в единое целое.

Да верно я так понимаю "параллельное" решение на уровне одной детали
если деталей больше то открывать их в разных процессах.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: IgorT от 30.01.23, 13:51:43
Цитата: Doom от 30.01.23, 13:44:28Вы рассматриваете вопрос с позиции одного процесса, а там их 10 они работают не зависимо друг от друга.

Да верно я так понимаю "параллельное" решение на уровне одной детали
если деталей больше то открывать их в разных процессах.
Независимые процессы и так работают параллельно. Их больше чем дофига.

На счет деталей. А мы что, умеем одновременно работать с разными деталями? Это как?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 30.01.23, 13:57:41
Цитата: IgorT от 30.01.23, 13:51:43Независимые процессы и так работают параллельно.

Но Вы не получите управление над каждым из них, а только над одним..

На сколько я знаю у них орган управления должен предусмотреть запуск нескольких копий программ - я видел гдето исходник его, но не как не найду  - сюда прикреплю его, написан был на C#.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 30.01.23, 14:10:49
Цитата: Doom от 30.01.23, 13:06:02Например я знаю у Excel можно создавать хоть 10 процессов и можно получить управление над каждым из них и работать с ними в параллели.

Простите, не понятно написал - я создал приложение которое может запустить 10 копий программ Excel и каждая из них работает независимо друг от друга, но имеет связь с моим приложением те я взял большой расчет поделил на 10 частей и каждая копия Excel рассчитала и отправила результаты а мое приложение собрала их в "кучу".
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 09:59:12
Цитата: Doom от 28.01.23, 19:20:15куда пропал Sabahs? один из вариантов реализации было им предложено, но не где не выкладывался пример

не один, а два, причем второй по всей видимости непосредственно работал..

Безымянный.png
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: IgorT от 31.01.23, 10:04:06
Что сказать то хотите? Не очень понятна Ваша идея.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 10:22:36
Цитата: IgorT от 31.01.23, 10:04:06Что сказать то хотите? Не очень понятна Ваша идея.

ахах -> я шутку оценил спасибо!,

так получается все же есть непосредственные инструменты для параллельной работы с Компасом 3D?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 11:43:18
Вариант с библиотекой - ее не как не могу подключить к Компасу - все перепробовал:
1) перебрал все архитектуры (arm64 anyCPU x86 x64)
2) перебрал все версии RegAsm.exe при регистрации
3) также подписывал все библиотеки
4) к проекту подключал прилегающие библиотеки .dll / затем .tlb ->  ...\SDK\Lib / ...\SDK\Lib64 (стоит Компас x32)
5) Release / Debug
6) Видимость включена

Система библиотеку видит а вот Компас не хочет подключать ее и постоянно выдает ошибку
Что делаю не так ?

Снимок13.JPG
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 12:00:25
Если Вы писали на С#, то библиотека подключается через вкладку ActiveХ.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 12:31:18
Цитата: Дмитрий22 от 31.01.23, 12:00:25Если Вы писали на С#, то библиотека подключается через вкладку ActiveХ.

Я вроде всю панель элементов Компаса знаю и не видел такую вкладку , где она находится?

С# и VB.Net
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 12:42:07
Через главное меню -> Приложения->Добавить приложения...
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 12:49:23
в 16 версии нет этой вкладки - там просто добавить и все
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 12:55:51
Система видит их

Снимок13.JPG
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 13:02:23
Цитата: Doom от 31.01.23, 12:49:23в 16 версии нет этой вкладки - там просто добавить и все
Не правда Ваша. Все там есть! Скриншот в студию!
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 13:05:53
Как то так.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 13:07:36
да да нашел - не увидел вверху сами вкладки

ошибка пока остается
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 13:11:48
Дак Ваша библиотека не зарегистрирована, что Вы хотели? Поэтому не появилась на вкладке ActiveX. Либо Вы версию 16 компаса не обновили до 16.1. В 16.0 чтобы она появилась нужно запускать компас с правами администратора.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 13:19:08
Цитата: Дмитрий22 от 31.01.23, 13:11:48Дак Ваша библиотека не зарегистрирована

Регистрировал разными способами - система их видит они отображаются

Снимок13.JPG
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 13:26:46
Цитата: Doom от 31.01.23, 13:19:08Регистрировал разными способами - система их видит они отображаются

Снимок13.JPG
Компас какая версия точно? То, что 16, мы уже поняли, а дальше цифры какие?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 13:34:38
Цитата: Дмитрий22 от 31.01.23, 13:26:46Компас какая версия точно?

16.1.19 x32
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 13:39:05
все библиотеки подписал - отобразилось но все еще не хочет подключаться

Снимок13.JPG
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 13:40:31
Ура! Прогресс!!
Нажали кнопку Открыть?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 13:48:34
да) - все заработало  :sun:

Есть возможность настроить автозапуск ? При запуске Компас 3D запускалась автоматически библиотека ?

Снимок13.JPG
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Дмитрий22 от 31.01.23, 13:58:52
https://forum.ascon.ru/index.php?topic=12179.msg65517#msg65517
https://forum.ascon.ru/index.php?topic=22893.msg158363#msg158363
https://forum.ascon.ru/index.php?topic=28447.msg215159#msg215159
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 14:03:28
Дмитрий22 Поклон Вам!
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: p3452 от 31.01.23, 14:29:20
"Не, ну нормально, а..."?

- Начали с вопроса по разбору "дерева модели" и претензий на многопоточность, а закончили неумением подключить "Step1"!
Две страницы исписали и ради чего?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 18:31:20
Все равно не хочет библиотека работать  :bebebe:

если отключить автозапуск - то все работает.

При автозапуске выполняется только функция GetLibraryName
подставив строку MessageBox.Show("Hello"); - сразу водит окошко

а если подставить строку MessageBox.Show("Hello"); в метод ExternalRunCommand - тишина.

долго не думая добавил аргумент объекта Компас в функцию GetLibraryName что бы выполнить kompas.ksMessage("Привет!");
- Компас при запуске аварийно завершается но при этом не выдав ошибку.

мне кажется что библиотека пытается получить доступ к объекту Компаса который еще не успел инициализироваться - если в метод ExternalRunCommand добавить ожидание - то он уйдет в бесконечный цикл.
а сделать метод асинхронным нельзя

Мне важно поймать момент когда главное окно Компаса будет инициализировано, а библиотека пытается отработать когда главного окна нет - только заставка которая возможно имеет другой хендл.

При автозапуске библиотека слишком рано пытается начать работу.
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 19:31:19
Цитата: Doom от 31.01.23, 18:31:20а сделать метод асинхронным нельзя

можно, но результата не принесло - асинхронная работа видимо не поддерживается во всяком случае вышло много ошибок при сборки библиотеки .
что можно сделать?
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 21:58:13
попробовал так - все отлично но не могу зарегистрировать объект

private Kompas6API5.Application iKompasObject; // Интерфейс KompasObject

[DllImport("ole32.dll")]
public extern static int CreateItemMoniker([MarshalAs(UnmanagedType.LPWStr)] string lpszDelim, [MarshalAs(UnmanagedType.LPWStr)] string lpszItem, ref System.Runtime.InteropServices.ComTypes.IMoniker ppmk);


// Имя библиотеки
[return: MarshalAs(UnmanagedType.BStr)] public string GetLibraryName()
{
    Thread trd = new Thread(GetHandle);
    trd.IsBackground = true;
    trd.Start();

    return "Step1 - Самая простая библиотека на C#";
}


// Головная функция библиотеки
public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
{
    // это не работает при автозапуске
    //KompasObject kompas = (KompasObject) kompas_;
    //kompas.ksMessage("Привет!");
}


public object GetHandle()
{
IntPtr handle = IntPtr.Zero;

while (handle == IntPtr.Zero)
{

System.Threading.Thread.Sleep(1000);
handle = Process.GetCurrentProcess().MainWindowHandle;
}

//MsgBox(handle.ToString) - тут все верно
IMoniker pMoniker = null;
CreateItemMoniker(null, handle.ToString(), pMoniker);
IRunningObjectTable RunningObjectTable = null;
RunningObjectTable.Register(1, iKompasObject, pMoniker); // - тут какая то ошибка

return true;
}

Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 31.01.23, 22:29:35
p3452 а куда Вы пропали? вон оно как оказалось? Это Вам не это !
Название: Re: Возможна ли параллельная работа с Компасом ?
Отправлено: Doom от 01.02.23, 00:16:21
[DllImport("ole32.dll")]
private extern static int GetRunningObjectTable(uint reserved, ref System.Runtime.InteropServices.ComTypes.IRunningObjectTable pprot);


[DllImport("ole32.dll")]
private extern static int CreateItemMoniker([MarshalAs(UnmanagedType.LPWStr)] string lpszDelim, [MarshalAs(UnmanagedType.LPWStr)] string lpszItem, ref System.Runtime.InteropServices.ComTypes.IMoniker ppmk);


private const int ROTFLAGS_REGISTRATIONKEEPSALIVE = 1;
private string thisObjectName = "ROT.ROTObjectKompas";

private int hresult;
private System.Runtime.InteropServices.ComTypes.IRunningObjectTable rot = null;
private System.Runtime.InteropServices.ComTypes.IMoniker moniker = null;

hresult = GetRunningObjectTable(0, ref rot);
hresult = CreateItemMoniker("!", thisObjectName, ref moniker);

Kompas6API5.Application iKompasObject = (Kompas6API5.Application)Microsoft.VisualBasic.Interaction.GetObject(, "KOMPAS.Application.5"); // Интерфейс KompasObject
int register = rot.Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, iKompasObject, moniker);

Снимок13.JPG