Расширение API Компас 3D?

Автор Student2025, 27.12.25, 11:26:41

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

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

Student2025

Добрый день!

Есть компонент Компас 3D в  виде библиотеки и в нем есть функции которые вызываю через менеджер библиотек. Как мне сделать так что бы они были доступны в Компас 3D API ?


result= iKompasDocument2D.myfunc(param1, param2)


Student2025


Student2025

Спросил у робота примеры реализации такой системы и он привел ряд примеров из которого извлек логику и ключевые слова и не чего похожего не нашел в Хелпе.

Student2025


p3452

 :sun:  :sun:  :sun:
Повтор.png
Вы пишите
Цитата: Student2025 от 27.12.25, 11:26:41Есть компонент Компас 3D в  виде библиотеки и в нем есть функции которые вызываю через менеджер библиотек. Как мне сделать так что бы они были доступны в Компас 3D API ?
Если вызываете через "менеджер библиотек", значит то, что вызываете уже "доступно" через "Компас 3D API"!
Ну, а ЭТО, вообще - хрень:
Цитата: Student2025 от 27.12.25, 11:26:41result= iKompasDocument2D.myfunc(param1, param2)


Student2025

#5
Цитата: p3452 от 05.01.26, 16:55:24то, что вызываете уже "доступно" через "Компас 3D API"!

пример вызова можно увидеть?

Цитата: p3452 от 05.01.26, 16:55:24Ну, а ЭТО, вообще - хрень:
Цитироватьresult= iKompasDocument2D.myfunc(param1, param2)

Да мне то пофиг как можно вызвать.. а вот роботу не объяснишь !  >:(  для него надо сохранить иерархию объектов!

p3452


Student2025

#7
Цитата: p3452 от 06.01.26, 11:58:19Повтор.png

Если Вы чего то не понимаете - это не означает что "этого" не существует..  >:(  >:(

Цитата: Student2025 от 27.12.25, 16:06:26Спросил у робота примеры реализации такой системы и он привел ряд примеров из которого извлек логику и ключевые слова и не чего похожего не нашел в Хелпе.

Он привел примеры ДИНАМИЧЕСКОГО расширения основных объектов API, но видимо в Компасе API так не предусмотрено или я не вижу .
Вот тут:
iKompasDocument2D = KAPI7.IKompasDocument2D(ActiveDoc)
result= iKompasDocument2D.myfunc(param1, param2)

myfunc - реализуемая функция в библиотеке и я хочу что бы она была доступна в объекте iKompasDocument2D что бы роботу было проще жить.
Такие механизмы реализации ЕСТЬ! И их несколько! И все они уже давно апробированы.

p3452

Student2025, продолжайте общаться с "роботом"...

Student2025

Цитата: p3452 от 06.01.26, 15:16:56Student2025, продолжайте общаться с "роботом"...
Ну сидите в клетке не знаний и лени просто хотя бы спросить у робота - "а возможно ли такое?".

А когда придут зарубежные роботы и в вас надобности нет не какой у предприятий - не жалуйтесь что бутылка была гравированной! 


Starik

Уважаемые. У меня такое впечатление что эта тема есть просто диалог двоих. Может вам пообщаться в личке, если больше никому ваша беседа не интересна?

Kolos

Цитата: Starik от 06.01.26, 19:11:01Уважаемые. У меня такое впечатление что эта тема есть просто диалог двоих. Может вам пообщаться в личке, если больше никому ваша беседа не интересна?
Что, тут обсуждать?
У интерфейса IKompasDocument2D нет метода - myfunc.
Если ТС хочет выполнять свою функцию в Компасе из другого приложения.
Пишет библиотеку с функцией и выполняет её из другого приложения через интерфейс - IProcedure.Execute.
https://help.ascon.ru/KOMPAS_SDK/24/ru-RU/iprocedure_execute.html
+ Благодарностей: 1

p3452

Цитата: Kolos от 07.01.26, 07:35:09Если ТС хочет выполнять свою функцию в Компасе из другого приложения.
Кто бы знал, чего хочет ТС!?
Он пишет:
Цитата: Student2025 от 27.12.25, 11:26:41Есть компонент Компас 3D в  виде библиотеки и в нем есть функции которые вызываЮ через менеджер библиотек
Т.е. - есть бибилиотека, которую он подключил и пользует через "менеджер библиотек", зачем тогда он просит:
Цитата: Student2025 от 06.01.26, 11:00:57пример вызова можно увидеть?
Далее, еще запутанее:
Цитата: Student2025 от 27.12.25, 11:26:41Как мне сделать так что бы они были доступны в Компас 3D API ?
Если ТС уже пользует "менеджер библиотек" ("функции которые вызываю через менеджер библиотек"), а "менеджер библиотек" является частью Компас 3D API, о какой "доступности" ("что бы они были доступны в Компас 3D API") он спрашивает?

Kolos

Это всё понятно, что он и сам не знает, что хочет, либо не умеет правильно объяснить.

Student2025

#14
Цитата: Kolos от 07.01.26, 07:35:09Если ТС хочет выполнять свою функцию в Компасе из другого приложения.
Ура, бинго!

Цитата: p3452 от 07.01.26, 10:59:36Кто бы знал, чего хочет ТС!?
Он пишет:Т.е. - есть бибилиотека, которую он подключил и пользует через "менеджер библиотек", зачем тогда он просит:Далее, еще запутанее:Если ТС уже пользует "менеджер библиотек" ("функции которые вызываю через менеджер библиотек"), а "менеджер библиотек" является частью Компас 3D API, о какой "доступности" ("что бы они были доступны в Компас 3D API") он спрашивает?

Вы раздуваете из мухи в слона! Вот же все поняли и предложили вариант  -

Цитата: Kolos от 07.01.26, 07:35:09Пишет библиотеку с функцией и выполняет её из другого приложения через интерфейс - IProcedure.Execute.
https://help.ascon.ru/KOMPAS_SDK/24/ru-RU/iprocedure_execute.html

IProcedure.Execute - да вариант, но так тяжело роботу "передать" это, и ведь мне еще доступные объекты нужно извлечь программно из этой библиотеки что бы программно дебажить, то что там робот намудрил!

p3452, вот скажите мне как знающий Компас 3Д API как мне программно получить например доступные функции в библиотеке ? (Ваша логика исходит от того что я должен все запоминать и делать все вручную - а не хочу так!)

Например в Python я могу извлечь список имен объектов через getattr/hasattr/dir/vars/pkgutil.iter_modules() и прочее, но все это работает с статическими компонентами.  А вот если как я писал ранее для динамических объектов в компонентах - тут тоже можно, но как зайти в библиотеку через Компас 3Д API и там найти все экспортные функции и просто вывести имена их ? p3452 как сделать так ? Не надо мне писать что я должен их закладывать в сам дебаг модуль для робота, а я не хочу так я хочу динамической компоновки!

Только сейчас понял как это сделать.

p3452

#15
Да-а-а!
"Бится головой о стену" - это на любителя :o:

В .NET все гораздо проще:
- System.Reflection.Assembly,
- System.Reflection.MethodInfo...

Функция с такой сигнатурой:
  void run(string psPathAssembly, string psClass, string psMethod, string psParObj, object pkomp, object pdoc)
и 50 строк кода позволяют выполнить: из любой сборки (библиотеки), любой класс, любой метод с любыми параметрами, или получить ошибку, если она была...
+ Благодарностей: 1

Student2025

Цитата: p3452 от 07.01.26, 19:32:03В .NET все гораздо проще:

Почти:

using Python.Runtime;

PythonEngine.Initialize();

using (Py.GIL())
{
    dynamic mod = Py.Import("python_static_myfunc");
    PyObject dirResult = PythonEngine.Eval("dir(mod)");
    var names = dirResult.AsManagedObject(typeof(string[]));
}

Цитата: p3452 от 07.01.26, 19:32:03В .NET все гораздо проще:
- System.Reflection.Assembly,
- System.Reflection.MethodInfo...

Я почему то думал что рефлексить самого себя C# не умеет.

If type.IsCOMVisible AndAlso type.IsPublic Then

p3452

Плюсом - System.CodeDom и в том числе, System.CodeDom.Compiler...

И вот уже: исходный код "библиотеки" (если она Ваша) на лету - редактируется, компилируется и выполняется, т.е. имеем скрипт (C#!), который выполняется в десятки раз быстрее, того же, Python-скрипта.


Student2025

Цитата: p3452 от 07.01.26, 21:16:15скрипт (C#!), который выполняется в десятки раз быстрее

Не, ну не может быть такого  :-)))  аж на порядки.
Раньше пользовался ~2013г - тормозило и глючело.

В целом вопрос решен - всем СПАСИБО!

p3452

Цитата: Student2025 от 10.01.26, 21:47:18Не, ну не может быть такого  :-)))  аж на порядки.
Если и преувеличил то "чуть-чуть" :embarrassed:  - на паре строк, конечно, разницы нет, но чем длиннее и сложнее код (больше графики, математики и т.д) тем больше разрыв во времени выполнеия (у меня ~ 10-20 раз!)