Доброго,
Например читаю дерево модели и по элементно анализирую.
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 простаивающих ядра ?
Цитата: Doom от 28.01.23, 16:04:30Для модели у которого в дереве отображается более 400 элементов - приказывает мне долго жить!
- Расшифруйте...
- Хотите сказать, что при переборе коллекции в которой более 400 элементов Компас крашится?
Цитата: p3452 от 28.01.23, 18:22:13- Расшифруйте...
у меня этот процесс длится чуть более 2 минут
Цитата: Doom от 28.01.23, 16:04:30взять управление над нескольким экземплярами Компас
в списке IRunningObjectTable отображается не соответствие количеству записей к количеству запущенных копий Компаса
а если обрабатывать несколько файлов - то считаю что долговато для этого выделять 15 минут
Непонятно что Вы делаете и как?
Ограничимся общим:
- насколько я знаю Компас - однопоточен...
- Вы хозяин процесса и, следовательно, сами можете его "распараллелить" и без Компаса, но - помнить о п.1
- возможно "тормоза" связаны видеообработкой Вашего процесса - избавится от обновления и прочего
- возможно Ваши задачи позволят работать непосредственно с метаданными файлов минуя Компас
- и т.д. - в зависимости от решаемых задач
Цитата: p3452 от 28.01.23, 18:52:32- насколько я знаю Компас - однопоточен...
это решаемо и как минимум 3 вариантами... но не могу найти примеры
куда пропал Sabahs? один из вариантов реализации было им предложено, но не где не выкладывался пример
Цитата: Doom от 28.01.23, 19:20:15куда пропал Sabahs (https://forum.ascon.ru/index.php?action=profile;u=408)?
Он с Украины.
Разработанное им приложение "Оборудование: Развертки" больше не продаётся.
Цитата: Алексей Дубовицкий от 28.01.23, 20:26:52Он с Украины.
он вроде как переехал ?
Цитата: Алексей Дубовицкий от 28.01.23, 20:26:52Разработанное им приложение "Оборудование: Развертки" больше не продаётся.
жестко :(
Тянул форум.
Цитата: Doom от 28.01.23, 16:04:30видно что используется только одно ядро а остальные простаивают
Ресурсы для работы Компаса (память, процессор, экран, диск ) предоставляет операционная система Windows.
Использовать ресурсы в обход ОС весьма неразумно и опасно.
Цитата: Валерий Изранов от 29.01.23, 07:50:02Использовать ресурсы в обход ОС весьма неразумно и опасно.
ахаха я поведал многое.. а уронить пару раз систему во имя науки - такое себе опасность :-))) :-))) - что то вроде уровня - цвета детской неожиданности? :%:
сколько же Вам лет ? 5 ?
шутки шутками а по существу вопроса есть что добавить ?
нашел вариант через виртуальные системы но это очень ресурсоемко..
забыл :bang: что виртуальные не поддерживаются.
Цитата: p3452 от 28.01.23, 18:52:32- насколько я знаю Компас - однопоточен...
тут мб политика...
Цитата: Doom от 30.01.23, 10:23:53забыл :bang: что виртуальные не поддерживаются.
тут мб политика...
Ну как политика...
Есть задачи, которые можно распараллелить. Например расчеты МКЭ и построение чертежей. Они и распараллелены у Компаса.
А вот работа с 3Д моделью не поддаётся. ИМХО вообще не возможно.
Может кто знает CAD, который это делает?
Цитата: IgorT от 30.01.23, 10:42:14А вот работа с 3Д моделью не поддаётся. ИМХО вообще не возможно.
если рассматривать только одну деталь то как вариант - сделать копию ее файла и создать 2 потока А и Б: А) будет ее анализировать в одном процессе Компаса 3D и по этапно создавать и отправлять поток с полученной частью информацией на Б; Б) будет принимать поток и генерировать решение в другом процессе Компаса 3D.
Если я не ошибаюсь у SolidWorks/NX есть асинхронное построение детали те берется например плоскость и от нее в две стороны идет построение.
Например я знаю у Excel можно создавать хоть 10 процессов и можно получить управление над каждым из них и работать с ними в параллели.
Цитата: Doom от 30.01.23, 13:06:02...
Если я не ошибаюсь у SolidWorks/NX есть асинхронное построение детали те берется например плоскость и от нее в две стороны идет построение.
Что-то не понятное... Можно поподробнее?
Цитата: Doom от 30.01.23, 13:06:02Например я знаю у Excel можно создавать хоть 10 процессов и можно получить управление над каждым из них и работать с ними в параллели.
Excel производит вычисления. Их можно распараллелить. Но как например распараллелить процесс вращения модели в КАД? Он же в реальном времени происходит.
И эта... Может мы по разному понимаем обсуждаемый процесс?
ИМХО параллельное решение задачи означает разбивание решения задачи, занимающей некоторое длительное время, на куски. И одновременной выполнять решение этих куском на нескольких вычислительных устройствах, а по завершению слить результаты в единое целое.
Может быть я заблуждаюсь? Вы как понимаете "параллельность"?
Цитата: IgorT от 30.01.23, 13:25:08Excel производит вычисления. Их можно распараллелить. Но как например распараллелить процесс вращения модели в КАД? Он же в реальном времени происходит.
И эта... Может мы по разному понимаем обсуждаемый процесс?
Вы рассматриваете вопрос с позиции одного процесса, а там их 10 они работают не зависимо друг от друга.
Цитата: IgorT от 30.01.23, 13:25:08ИМХО параллельное решение задачи означает разбивание решения задачи, занимающей некоторое длительное время, на куски. И одновременной выполнять решение этих куском на нескольких вычислительных устройствах, а по завершению слить результаты в единое целое.
Да верно я так понимаю "параллельное" решение на
уровне одной детали
если деталей больше то открывать их в разных процессах.
Цитата: Doom от 30.01.23, 13:44:28Вы рассматриваете вопрос с позиции одного процесса, а там их 10 они работают не зависимо друг от друга.
Да верно я так понимаю "параллельное" решение на уровне одной детали
если деталей больше то открывать их в разных процессах.
Независимые процессы и так работают параллельно. Их больше чем дофига.
На счет деталей. А мы что, умеем одновременно работать с разными деталями? Это как?
Цитата: IgorT от 30.01.23, 13:51:43Независимые процессы и так работают параллельно.
Но Вы не получите управление над каждым из них, а только над одним..
На сколько я знаю у них орган управления должен предусмотреть запуск нескольких копий программ - я видел гдето исходник его, но не как не найду - сюда прикреплю его, написан был на C#.
Цитата: Doom от 30.01.23, 13:06:02Например я знаю у Excel можно создавать хоть 10 процессов и можно получить управление над каждым из них и работать с ними в параллели.
Простите, не понятно написал - я создал приложение которое может запустить 10 копий программ Excel и каждая из них работает независимо друг от друга, но имеет связь с моим приложением те я взял большой расчет поделил на 10 частей и каждая копия Excel рассчитала и отправила результаты а мое приложение собрала их в "кучу".
Цитата: Doom от 28.01.23, 19:20:15куда пропал Sabahs? один из вариантов реализации было им предложено, но не где не выкладывался пример
не один, а два, причем второй по всей видимости непосредственно работал..
Безымянный.png
Что сказать то хотите? Не очень понятна Ваша идея.
Цитата: IgorT от 31.01.23, 10:04:06Что сказать то хотите? Не очень понятна Ваша идея.
ахах -> я шутку оценил спасибо!,
так получается все же есть
непосредственные инструменты для параллельной работы с Компасом 3D?
Вариант с библиотекой - ее не как не могу подключить к Компасу - все перепробовал:
1) перебрал все архитектуры (arm64 anyCPU x86 x64)
2) перебрал все версии RegAsm.exe при регистрации
3) также подписывал все библиотеки
4) к проекту подключал прилегающие библиотеки .dll / затем .tlb -> ...\SDK\Lib / ...\SDK\Lib64 (стоит Компас x32)
5) Release / Debug
6) Видимость включена
Система библиотеку видит а вот Компас не хочет подключать ее и постоянно выдает ошибку
Что делаю не так ?
Снимок13.JPG
Если Вы писали на С#, то библиотека подключается через вкладку ActiveХ.
Цитата: Дмитрий22 от 31.01.23, 12:00:25Если Вы писали на С#, то библиотека подключается через вкладку ActiveХ.
Я вроде всю панель элементов Компаса знаю и не видел такую вкладку , где она находится?
С# и VB.Net
Через главное меню -> Приложения->Добавить приложения...
в 16 версии нет этой вкладки - там просто добавить и все
Система видит их
Снимок13.JPG
Цитата: Doom от 31.01.23, 12:49:23в 16 версии нет этой вкладки - там просто добавить и все
Не правда Ваша. Все там есть! Скриншот в студию!
Как то так.
да да нашел - не увидел вверху сами вкладки
ошибка пока остается
Дак Ваша библиотека не зарегистрирована, что Вы хотели? Поэтому не появилась на вкладке ActiveX. Либо Вы версию 16 компаса не обновили до 16.1. В 16.0 чтобы она появилась нужно запускать компас с правами администратора.
Цитата: Дмитрий22 от 31.01.23, 13:11:48Дак Ваша библиотека не зарегистрирована
Регистрировал разными способами - система их видит они отображаются
Снимок13.JPG
Цитата: Doom от 31.01.23, 13:19:08Регистрировал разными способами - система их видит они отображаются
Снимок13.JPG
Компас какая версия точно? То, что 16, мы уже поняли, а дальше цифры какие?
все библиотеки подписал - отобразилось но все еще не хочет подключаться
Снимок13.JPG
Ура! Прогресс!!
Нажали кнопку Открыть?
да) - все заработало :sun:
Есть возможность настроить автозапуск ? При запуске Компас 3D запускалась автоматически библиотека ?
Снимок13.JPG
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
Дмитрий22 Поклон Вам!
"Не, ну нормально, а..."?
- Начали с вопроса по разбору "дерева модели" и претензий на многопоточность, а закончили неумением подключить "Step1"!
Две страницы исписали и ради чего?
Все равно не хочет библиотека работать :bebebe:
если отключить автозапуск - то все работает.
При автозапуске выполняется только функция GetLibraryName
подставив строку MessageBox.Show("Hello");
- сразу водит окошко
а если подставить строку MessageBox.Show("Hello");
в метод ExternalRunCommand - тишина.
долго не думая добавил аргумент объекта Компас в функцию GetLibraryName что бы выполнить kompas.ksMessage("Привет!");
- Компас при запуске аварийно завершается но при этом не выдав ошибку.
мне кажется что библиотека пытается получить доступ к объекту Компаса который еще не успел инициализироваться - если в метод ExternalRunCommand добавить ожидание - то он уйдет в бесконечный цикл.
а сделать метод асинхронным нельзя
Мне важно поймать момент когда главное окно Компаса будет инициализировано, а библиотека пытается отработать когда главного окна нет - только заставка которая возможно имеет другой хендл.
При автозапуске библиотека слишком рано пытается начать работу.
Цитата: Doom от 31.01.23, 18:31:20а сделать метод асинхронным нельзя
можно, но результата не принесло - асинхронная работа видимо не поддерживается во всяком случае вышло много ошибок при сборки библиотеки .
что можно сделать?
попробовал так - все отлично но не могу зарегистрировать объект
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;
}
p3452 а куда Вы пропали? вон оно как оказалось? Это Вам не это !
[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