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

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

15 часов назад, Makc Krekhoveckiy сказал:

Пробовал вводить - SwCSharpAddin1.dll@CallbackFunction

Попробовал бы запись с учётом всех разделительных знаков (но без записи необязательных параметров): "SwCSharpAddin1.dll@CallbackFunction@,"

или

"SwCSharpAddin1.dll@CallbackFunction@,Подсказка в строку состояния Solidworks внизу"

 

15 часов назад, Makc Krekhoveckiy сказал:

недопонял, что значит объявлена как EXPORT

 

public void CallbackFunction()

Не работал с этим, так что могу ошибаться, но думается как-то так (возможно как-то иначе, по ссылке такой способ записан как неправильный): 

export void CallbackFunction()

Например:

https://vector-of-bool.github.io/2019/03/31/modules-2.html

 

Про файл .def, например:

https://forum.vingrad.ru/forum/topic-66624.html

 

Ещё рассуждения по вашей теме:

https://cccp3d.ru/topic/4701-callback-function-в-api-2005/

 

Изменено пользователем Kelny
Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...


Всем доброго дня!

Столкнулся с такой проблемой, пока не совсем понимаю как решить. 

 

Речь идет о сборках.

Сам солидворкс умеет делать каким-то образом предварительный просмотр элементов при построении массивов, зеркала и наверное чего-то еще. Вот собственно хочу сделать такой же предпросмотр. Перед тем, как добавить пользователем компоненты (детали или подсборки) в сборку, хотелось бы отрисовывать фантомы с их местоположением, а по подтверждению  уже окончательно их загружать в память, если не загружены, накидывать сопряжения и т.д. Такое вообще реально? Судя по поведению, солид в этих случаях загружает какую-то упрощенную геометрию, что не фризит интерфейс.

 

Копал в сторону body.display3, но сам body отображаться может только если компонент является деталью или внутри детали если нахожусь. Неужели солид именно таким образом это и делает?)) Просто странным как-то это мне кажется. Это же нужно добавить в сборку временную деталь, заморозить дерево, чтобы не было видно, что мы туда что-то добавили, потом удалить. Выглядит как костыль, да и ресурсов эти операции потребляют много.

Ссылка на сообщение
Поделиться на других сайтах
25.09.2023 в 16:39, Makc Krekhoveckiy сказал:

Добрый день. Занимаюсь разработкой надстройки для solidworks, возникла проблема с методом AddMenuPopupItem2 (IFrame)

 

Входные параметры:

 


System.bool AddMenuPopupItem2( 
   System.int DocType,
   System.int SelectType,
   System.string Item,
   System.string CallbackFcnAndModule,
   System.string CustomNames,
   System.int Unused,
   System.string BitmapFileName
)

Проблема возникает на этапе ввода входного параметра CallbackFcnAndModule после ввода любого параметра метод уже возвращает false и кнопка не добавляется в контекстное меню панели

 

Тут немного хитрый синтаксис судя по справке:

The CallbackFcnAndModule argument specifies which function to call when this menu item is selected by the user. The syntax is as follows:

   "dllname@function@updatefunction,hintstring"

 

Сколько не пробовал разных способов не помогает, может кто сталкивался с данным методом, может есть наработка или решение

 

Использую этот метод, так как он принимает в себя изображение в отличии от 

AddMenuItem5 Method (ISldWorks)
 

 

Доброго времени! Если речь идет о C#, то вот пример из моего участка кода
 

            _frame = (IFrame)SolidWorks.Frame();

            #region Кнопки во всплывающем меню в чертежах
            _frame.AddMenuPopupIcon2((int)swDocumentTypes_e.swDocDRAWING, (int)swSelectType_e.swSelFACES, "Открыть свойства", _addinID, "OpenPropFromDWG", "", "", _iBmp.CreateFileFromResourceBitmap("SolidWorksAddin.Icons.prop.bmp", thisAssembly));
            _frame.AddMenuPopupIcon2((int)swDocumentTypes_e.swDocDRAWING, (int)swSelectType_e.swSelFACES, "Удалить XML", _addinID, "DelXML", "XMLButtonState", "", _iBmp.CreateFileFromResourceBitmap("SolidWorksAddin.Icons.DelXML.bmp", thisAssembly));
            _frame.AddMenuPopupIcon2((int)swDocumentTypes_e.swDocDRAWING, (int)swSelectType_e.swSelFACES, "Добавить штриховку", _addinID, "InsertHatch", "", "", _iBmp.CreateFileFromResourceBitmap("SolidWorksAddin.Icons.hatch.bmp", thisAssembly));
            _frame.AddMenuPopupIcon2((int)swDocumentTypes_e.swDocDRAWING, (int)swSelectType_e.swSelFACES, "Отобразить в разнесенном виде", _addinID, "ShowExploded", "ExplodeViewButtonState", "", _iBmp.CreateFileFromResourceBitmap("SolidWorksAddin.Icons.explodeView.bmp", thisAssembly));
            _frame.AddMenuPopupIcon2((int)swDocumentTypes_e.swDocDRAWING, (int)swSelectType_e.swSelFACES, "Отобразить в собранном виде", _addinID, "ShowCollapsed", "CollapseViewButtonState", "", _iBmp.CreateFileFromResourceBitmap("SolidWorksAddin.Icons.collapseView.bmp", thisAssembly));
            #endregion

 

на примере "Удалить XML"

 

_addinID - получаешь из метода, который вызывается при старте аддона ConnectToSW(object ThisSW, int cookie) cookie - это оно. С именами бардак, но в самом апи солида так и есть, где-то куки, ктоде айди, где-то идентификатором назвали.

 

"DelXML" - этот метод будет вызываться при нажатии на саму кнопку. Метод должен быть public и не static и располагаться должен в классе SwAddin. XMLButtonState - этот метод вызывается перед тем, как солид захочет показать твой кнопарь. И покажет или не покажет кнопарь в зависимости от того, что вернет XMLButtonState - 0,1,4. Или как-то так, уже нюансы его не помню. И этот метод так же как и DelXML должен быть паблик и нестатичным и в SwAddin

 

 

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

Здравствуйте. Подскажите как отобразить форму в нужное место на нужном мониторе. У меня два монитора на одном sw на другом редактор vba. Форма отображаеться на том мониторе, где последний раз открывался редактор. С расположением формы все просто, а вот где установить нужный монитор не могу найти. 

Ссылка на сообщение
Поделиться на других сайтах
8 минут назад, ЮрЮрыч сказал:

Подскажите как отобразить форму в нужное место на нужном мониторе.

Перетащить мышой в нужное место.

 

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

Я могу ошибиться, но можно как-то так:

Форма отображается не на каком-либо мониторе, а на всем пространстве. Можете попробовать такой способ.

1. Определяете координаты окна  ForegroundWindow для чего сначала объявляете тип массива координат:

Public Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
End Type

2. читаете координаты "активного" окна:

Public Declare PtrSafe Function GetForegroundWindow Lib "user32.dll" () As Long
'--> функция получения хендла окна, находящегося на переднем плане

Dim bret                As Boolean

    bret = GetWindowRect(HNDL_SW, Rect_win)
        Base_SW(0) = Rect_win.Left    ' левая точка
        Base_SW(1) = Rect_win.Top     ' верхняя
        Base_SW(2) = Rect_win.Right   ' правая
        Base_SW(3) = Rect_win.Bottom  ' Bottom

3. Отображаете вашу форму My_FT_Type где-то в середине активного экрана:

My_FT_Type.StartUpPosition = 1
My_FT_Type.Left = 0.5 * (Rect_win.Left + Rect_win.Right - Rect_win.Left) / 2 - My_FT_Type.Width / 2)
My_FT_Type.Top = 0.5 * Rect_win.Top + (Rect_win.Bottom - Rect_win.Top) / 2 - My_FT_Type.Height / 2)
'------------------------------------------------------------------------------------------------

    My_FT_Type.show

 

 

My_FT_Type.StartUpPosition = 1 - это важно

 

Если что-то не так, разберетесь, логика, я думаю, понятна

 

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

Как-то искал окно "Свойства" - для сварных швов в SW.

Вот код  с использованием WinApi, что использовал для поиска и перемещения окна.

 

Скрытый текст

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nW, int nH, bool bRepaint);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }

 

        private void FindAndMoveWindow()
        {
            IntPtr res = FindWindow(@"#32770", @"Свойства");
            if (res.ToInt64() != 0)
            {
                MoveWindow(res, 10, 20, 600, 400, true);
            }
        }

 

З.Ы. c#. Идентификатор окна искал с помощью Spy++. На многомониторность не заморачивался ( в смысле даже разбирался в чем особенность ).

Изменено пользователем nicomed
Ссылка на сообщение
Поделиться на других сайтах
  • 4 недели спустя...

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

Иногда при обьявлении переменных VBA ставится условие со знаком #.

 

Пример:

#If VBA7 Then
     Private Declare PtrSafe Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#Else
     Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#End If

 

По смыслу все понятно. Не понятно применение знака #.

Наверно, это что-то прямо базовое, и всем понятное, а я разобраться не могу.

И поиск не могу сформулировать, что это и нафига.

Интуитивно, # выполняет операторы при объявлении (декларировании), так?

Правильно ли я понимаю, при объявлении и другие операторы можно также записывать со знаком # и все будет работать?

 

 

Ссылка на сообщение
Поделиться на других сайтах
11 минут назад, alek77 сказал:

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

Иногда при обьявлении переменных VBA ставится условие со знаком #.

 

Пример:

#If VBA7 Then
     Private Declare PtrSafe Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#Else
     Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#End If

 

По смыслу все понятно. Не понятно применение знака #.

Наверно, это что-то прямо базовое, и всем понятное, а я разобраться не могу.

И поиск не могу сформулировать, что это и нафига.

Интуитивно, # выполняет операторы при объявлении (декларировании), так?

Правильно ли я понимаю, при объявлении и другие операторы можно также записывать со знаком # и все будет работать?

 

 

 

С решетками, в зависимости от условия, в код включена одна из строк. А второй как бы не существует.

Без решетки в коде присутствуют все строки.

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

Здравствуйте Коллеги

 

Кто нибудь знает как программно получить имя компонента с указанием иерархии?

Пример:

"01.02.00-1@01.00/01.02.01-1@01.02.00"

где 01.02.00-1 подсборка и ее порядковый номер

01.00 головная сборка (изделие)

01.02.01-1 деталь и ее порядковый номер она находится в подсборке.

 

Нужно выделать программно определенную деталь но метод выделения работает только с такой ссылкой.

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

@Sturmann

Может я не понял вопроса, но можно просто перебрать имена компонентов в сборке (все уровни дочерних компонентов) и выбрать нужный ?

Скрытый текст

 

 AssemblyDoc asm = (AssemblyDoc) swApp.ActiveDoc;

 foreach (Component2 component in asm.GetComponents(false))
   {
       Console.WriteLine($"Component name: {component.Name2}");
   }

 

 

 

Изменено пользователем nicomed
Ссылка на сообщение
Поделиться на других сайтах

Я что-то не то написал. В том формате что Вам надо, информацию выдает метод: component.GetSelectByIDString();

Изменено пользователем nicomed
Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Sturmann сказал:

Здравствуйте Коллеги

 

Кто нибудь знает как программно получить имя компонента с указанием иерархии?

Пример:

"01.02.00-1@01.00/01.02.01-1@01.02.00"

где 01.02.00-1 подсборка и ее порядковый номер

01.00 головная сборка (изделие)

01.02.01-1 деталь и ее порядковый номер она находится в подсборке.

 

Нужно выделать программно определенную деталь но метод выделения работает только с такой ссылкой.

 

Component2.Name такое и показывает. Но и у него же есть select. Но может я вопрос не так понял. 

Ссылка на сообщение
Поделиться на других сайтах
13 часов назад, nicomed сказал:

Я что-то не то написал. В том формате что Вам надо, информацию выдает метод: component.GetSelectByIDString();

Да, этот метод работает по выделенному компоненту и возвращает имя в том формате который мне нужен. 

Проблема в том что мне нужно выделить деталь программно. А это выделение только по выше описанному адресу. 

4 часа назад, v-david сказал:

bRet = swModel.Extension.SelectByID2(SelName, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)

Selname - в каком формате? 

Если деталь находится в разных сборках какую он выделит? 

Ссылка на сообщение
Поделиться на других сайтах
23 минуты назад, Sturmann сказал:

Selname - в каком формате? 

Если деталь находится в разных сборках какую он выделит? 

component.GetSelectByIDString(); - возвращает строку. Эта строка для каждого компонента в этой сборке уникальна.

Её и надо вставлять в метод как параметр SelName :

bRet = swModel.Extension.SelectByID2(SelName, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0) 

 

Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, nicomed сказал:

component.GetSelectByIDString(); - возвращает строку. Эта строка для каждого компонента в этой сборке уникальна.

Её и надо вставлять в метод как параметр SelName :


bRet = swModel.Extension.SelectByID2(SelName, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0) 

 

Чтобы этот метод работал нужно выделить деталь, а чтобы выделить деталь нужно имя в этом виде. Замкнутый круг. 

Нужно выделение детали программно. 

Ссылка на сообщение
Поделиться на других сайтах
29 минут назад, Sturmann сказал:

Чтобы этот метод работал нужно выделить деталь, а чтобы выделить деталь нужно имя в этом виде. Замкнутый круг. 

Нужно выделение детали программно. 

Если известно имя компонента, можно просканировать все подсборки до деталей, найти нужную, потом составить ее путь по правилам

SelectByID2

и потом выделить.

А как еще? Не обязательно имя, можно по массе, например, или другим данным, известным заранее.

Кажется, можно собрать массив всех деталей сразу. И пройтись по нему, но это надо пробовать...

 

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Sturmann сказал:

Чтобы этот метод работал нужно выделить деталь, а чтобы выделить деталь нужно имя в этом виде. Замкнутый круг. 

Нужно выделение детали программно. 

Тогда возвращаемся к истокам  Уточняем вопрос : Есть четкие критерии, на основании которых, Вы, планируете выбирать компонент ?

Если компонент один на сборку или любую подсборку, то вообще проблем не вижу. Все фильтруем по входнению имен.

Если компонентов в одной подсборке несколько, то встает вопрос критериев фильтрации, а это уже к телепатам.

Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, nicomed сказал:

понентов в одной подсборке несколько, то встает вопрос к

отож. В SW нет механизма под названием "хрустальный шар", откуда ему знать имя какого компонента вам нужно? Поэтому у вас "два путя": либо выделить ручками в сборке интересующий вас компонент и обращаться к нему как к выделенному компоненту, либо организовать цикл по дереву сборки (не компонентам!) и по какому-либо критерию выбрать нужный вам. Ну а дальше все просто, selectbyid.

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

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

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

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

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

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

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

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

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

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

    • SXoxa



×
×
  • Создать...