Перейти к публикации

Callback Function в Api (2005)


Юрий

Рекомендованные сообщения

Вставил элемент меню с иконкой в SW, связал его с DLL, но, при нажатии, вызов Callback-функции не происходит. Никаких сообщений не выдает. В справке примера нет.

Функция ConnectToSW из SWAddin возвращает нормальный результат.

Ощущение, что я неправильно использую функцию AddMenuItem3. Что нужно передать в параметре"MenuCallback", чтобы она увидела ее?

Если возможно, пришлите фрагмент работающего текста с описанием функции и местом ее регистрации в SW.

Юрий.

Ссылка на сообщение
Поделиться на других сайтах


Визардом пользуешься или сам создаешь проект с нуля?

Менюшка появляется,но при нажатии на неё вызов не происходит - я так понял

Я пользуюсь АПИ SW 2004

success = iSwApp->AddMenuItem2(docType, addinID, item, position, callback, enable, hint, &added);где CComBSTR callback;

callback.LoadString(IDS_MENU_CALLBACK);

IDS_MENU_CALLBACK = MenuEnable - Это название функции

__interface IMyTools : IDispatch

{

[id(2), helpstring("method EnableMenu")] HRESULT MenuEnable([out, retval] long* status);

};

Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ.

Я работаю в Delphi с API SW 2005.

Ты используешь AddMenuItem2, а здесь вместо нее, похоже, AddMenuItem3. В справке по 2005 написана инструкция:

----------

In its implementation of SwAddin::ConnectToSW, the add-in can:

1. Call SldWorks::SetAddinCallbackInfo and pass the instance handle of the add-in and the object that supports the callback methods. The SolidWorks software holds onto this object and makes callbacks.

2. Call SldWorks::AddMenuItem3 and pass the callback method associated with the menu item.

3 .Call SldWorks::AddToolbar4 and pass the callback method associated with the toolbar button.

----------

Вроде, все понятно. Первый этап проходит успешно.

----------

status = SldWorks->SetAddinCallbackInfo ( ModuleHandle, AddinCallbacks, Cookie, &Status )

----------

Второй, вроде тоже, хотя неясно. Пункт меню появляется с иконкой, как положено, нормально нажимается, но дальше ни какой реакции, хоть сто раз нажимай. Главное, никаких сообщений, метод не найден или что-нибудь подобное.

----------

status = SldWorks->AddMenuItem3 ( DocumentType, Cookie, MenuItem, Position, MenuCallback, MenuEnableMethod, HintString, bitmapFilePath, &IsMenuItemAdded)

..........

Input:

(BSTR) MenuCallback

Function to call when this menu item is selected

----------

Но тут же, в справке, непонятная ссылка на AddMenuItem2:

----------

To add a menu separator, specify an empty string for HintString:

' Adds a menu separator

bRet = iSldWorks.AddMenuItem2(swDocNONE, iCookie, "@Sample", -1, "DocNONE_Item", "", "", "")

----------

Или справку не переписали до конца, или ... ?

У тебя callback имеет тип CComBSTR, я так понимаю, это класс COM-строки. Что-же передается в функцию? Идентификатор(номер) метода интерфейса IDispatch или имя метода интерфейса IUnknown?

Ссылка на сообщение
Поделиться на других сайтах

В функцию передается то, что содержится в строке в ресурсах, то бишь строка с названием функции.

А это выписки из АПИ

BSTR MenuCallback - Function to call when this menu item is selected

Но тут же, в справке, непонятная ссылка на AddMenuItem2:

----------

To add a menu separator, specify an empty string for HintString:

' Adds a menu separator

bRet = iSldWorks.AddMenuItem2(swDocNONE, iCookie, "@Sample", -1, "DocNONE_Item", "", "", "")

----------

Это описние как создать сепаратор - разделитель между пунктами в меню

И еще проверь правильное написание Имя пункта в меню

status = SldWorks->AddMenuItem2 ( DocumentType, Cookie, MenuItem, Position, MenuCallback, MenuEnableMethod, HintString, &IsMenuItemAdded )

MenuItem menuItem@subMenuString

Ссылка на сообщение
Поделиться на других сайтах

Должна ли функция быть экспортируемой функцией самой dll-библиотеки, или это функция COM-класса, описанного в библиотеке?

Синтаксис DLL@Function, вроде относится к библиотечной функции, а передача в SetAddinCallbackInfo адреса COM-объекта, вроде говорит о классе, в интерфейс которого включены callback-функции.

Пробовал и так, и так - ничего не получается. Если не сложно, уточни: bstr - адрес первого слова Unicod (двухбайтовой) строки с нулевым словом на конце? Может у меня строка не правильно формируется?

С MenuItem, вроде все нормально. Пункты меню появляются где положено с иконками, как положено.

Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Спасибо!

Все нормально, за исключением огромного количества глюков в пользовательском интерфейсе и в API. Сырой продукт, но удобный.

Оказывается, вызов пункта меню нормально работает при присоединении Add-in в данном сеансе, т.е. если в меню "Добавить" установить галочку. Если галочка установлена с прошлого сеанса, то пункт меню высвечивается, но Callback-функция не регистрируется и, соответственно ничего не работает.

Юрий

Ссылка на сообщение
Поделиться на других сайтах
  • 1 год спустя...

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




  • Сообщения

    • Kelny
      В последних версиях Solidworks эта функция не заблокирована для обычных видеокарт (редактирование реестра не требуется), в том числе встроенных, и об этом написано выше:  
    • Fedor
      Насколько помню, надо в уравнениями Лагранжа-Максвелла разбираться в электромеханических  системах   https://elib.spbstu.ru/dl/059/CHAPTER1/Chapter1.html   
    • Foksmen
      Так вот и хотелось бы посмотреть методики, которые используются для пересчёта с использованием эмпирических формул. Пересчитать то смогу конечно, не проблема )
    • Катугин
      Практически ушел от подетальной разработки, если только не нужно с определенного чертежа повторить деталь. И дальше зачастую её использую для вставки в многотел. Многотел сохраняю сборкой. После чего открываю сборку из неё открываю каждую деталь, и убиваю внешние связи. 
    • maxx2000
      ничего умножать и делить не надо. достаточно в параметрах операции задать глубины нужного размера  
    • Orchestra2603
      Ну, предлагаю такой подход... Не знаю, может это все слишком очевидно, ну хотя бы это по полочкам разложить - тоже полезно.   Вот допустим, есть у вас электродинамический вибровозбудитель. Он как устроен? Есть генератор переменного тока. Он встроен в электрическую цепь, и там есть свои электрические элементы. Но главное, там есть катушка индутивности намонтанная на трубу, а внутри нее подвижная масса. На подвижной массе еще одна катушка, и у той по обмотке течет еще какой-то свой постоянный ток. Когда ток проходит по обмотке трубы, то внутри возникает магнитное поле, а оно действует на ток внутри трубы протекающий по подвижной катушке, и возникает сила Ампера, котоая приводит в движение массу. Сила эта пропорциональна магнитной индукция, а та в свою очередь силе тока (как в подвижной, таки неподвижной катушке, но нас интересует ток в конутре, который переменный). Т.е. ток в контуре, где стоит катушка, выступает в роли внешней возбуждающей силы для подвижной массы. Возможны конечно нюансы и некоторые вариации, но суть вроде как такая.   Если электрическая цепь сложная с кучей контуров, и там натыкано много конденсаторов, резисторов и инудктивностей в каждом контуре, то распределение токов по контурам находится через решение системы линенынх дифференциальных уравнений второго порядка.  Ну, т.е. там по сути тоже куча собственных частот, каждая из которых описывает свой электрический резонансов. Можно также решать задачу на СЗ, и будут собственные вектора, которые описывают соотношения амплитуд и фаз токов в раных контурах, и собственные значения, которые соотвтетсвуют каким-то резонансам. Тогда ЭДС на генераторе выступает в роли внешней силы. В зависимости от распределения элементов и контуров в цепи коэффициент усиления между ЭДС на генераторе и перемещением подвижной массы в трубе в определенном контуре будет меняться. Типа как АЧХ получается, только чисто "электрическая". Это АЧХ чистемы ЭМС, если в вашей терминологии. В параметры этой АЧХ будут входить только параметры электрических элементов схемы.   Можно дальше представить себе, что в каждом контуре цепи воткнут свой генератор, и у каждого своя амплитуда тока и фазовый сдвиг, но всех у всех одна частота. И пускай в каждом контуре есть своя подвижная масса внутри какой-то своей неподвижной катушки. Получается, что есть некоторый вектор правых частей, собранный из ЭДС генераторов в разных контурах, а перемещения подвижных масс в разных контурах - это вектор отклика. Т.е. будет уже матрица частотных харкатеристик (системы ЭМС, если в вашей терминологии), а отклик подвижных масс и внешние возбуждения, будет описываться соотвтетсвующими векторами. В зависимости от того, как распределены амплитуды и фазы ЭДС генераторов по контурам, и какая выбрана частота возбуждения, могут проявляться или не проявляться какие-то резонансы (точно также будет какой-то коэффициент участия, коэффициент динамичности и т.д.). Если в каком-то контуре проявляется резонанс, то в этом контуре на этой частоте будет большой коффициент динамичности по амплитуде тока в этом контуре, и будет пропорционально увеличиваться амплитуда отклика по перемещениям соотвтетсвующей подвижной массы.   Теперь представим, что каждая i-я из этих подвижных масс соединяется с контрукцией - системой МС. Тогда получается так, что да, ток в i-м контуре зависит от электрической АЧХ системы ЭМС, и это влияет на механическую силу, действующую на пожвижную массу в i-м контуре, но вместе с этим свойства механической системы МС могут быть такими, что на этой частоте даже такая увеличенная амплитуда силы в не возбуждает большого механичского оклика (перемещения) в этой конкртеной i-й точке крепления с конструкцией. Т.е. в данном случае, получается, что вы задаете вектор ЭДС генераторво на входе, это все дело умножается на электрическую АЧХ системы ЭМС, и получается вектор механических сил Ампера, действующих на каждую из точек крепления. А дальше этот вектор сил умножается на АЧХ системы МС, чтобы получить вектор отклика конструкции.   Т.е. получается так, что две системы вообще соединяются последвательно: выход из первой служит входом для второй, и их АЧХ разделяются спокойно. В итоге, выходит, что АЧХ можно просто переменожить, чтобы получить итоговую АЧХ суммарной системы ЭМС+МС. Так получается из-за того, что электромагнитное взаимодействие создает механическую силу и влияет на механическое движение, но механическое движение не влиет на электромагнитные взаимодействия в цепи. Так ведь?   Такие, вот, мысли. Сам вообше не спец ни разу по электромагнитизму, так что поправьте, если где-то ошибаюсь.
    • zedowl
      все, разобрался сам, просто поставил глубокое сверление, а не простое, поменял цикл, вместо 81 стал 83, и там Q добавилось, я так понял с размеров диаметра сверла(но это не точно), и в 83 цикле cld17 умножил на 1000
    • gudstartup
      @Malsev прежде чем куда то что то ставить сравнивайте даташит или maininf.txt чтобы понять насколько перед вами аналогичная система.
    • zedowl
      разобрался какой параметр должен поменяться, у меня 81 цикл, но мне нужен другой, как выбрать другой цикл? мне подсказали, что нужно его выбрать в настройках операции, но я не знаю где это  
    • zedowl
      нет, не новость я даже не знаю какой параметр в коде должен меняться, у меня задание, либо из мм в микроны, либо наоборот   как понять какой цикл у меня выводится в программе? я найду этот цикл в EXTCYCLE и добавлю умножение или деление на 1000
×
×
  • Создать...