Jump to content

Recommended Posts

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/

 

Edited by Kelny
Link to post
Share on other sites
  • 2 weeks later...


grachev.p.u

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

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

 

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

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

 

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

Link to post
Share on other sites
grachev.p.u
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

 

 

Link to post
Share on other sites
ЮрЮрыч

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

Link to post
Share on other sites
Ветерок
8 минут назад, ЮрЮрыч сказал:

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

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

 

Link to post
Share on other sites

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

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

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 - это важно

 

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

 

Link to post
Share on other sites

Как-то искал окно "Свойства" - для сварных швов в 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++. На многомониторность не заморачивался ( в смысле даже разбирался в чем особенность ).

Edited by nicomed
  • Нравится 1
Link to post
Share on other sites
  • 4 weeks later...

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

Иногда при обьявлении переменных 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

 

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

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

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

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

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

 

 

Link to post
Share on other sites
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

 

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

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

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

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

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

 

 

 

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

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

  • Нравится 2
Link to post
Share on other sites

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

 

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

Пример:

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

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

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

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

 

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

Link to post
Share on other sites

@Sturmann

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

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

 

 AssemblyDoc asm = (AssemblyDoc) swApp.ActiveDoc;

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

 

 

 

Edited by nicomed
Link to post
Share on other sites

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

Edited by nicomed
Link to post
Share on other sites
grachev.p.u
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. Но может я вопрос не так понял. 

Link to post
Share on other sites
13 часов назад, nicomed сказал:

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

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

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

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

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

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

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

Link to post
Share on other sites
23 минуты назад, Sturmann сказал:

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

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

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

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

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

 

Link to post
Share on other sites
2 часа назад, nicomed сказал:

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

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


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

 

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

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

Link to post
Share on other sites
29 минут назад, Sturmann сказал:

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

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

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

SelectByID2

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

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

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

 

Link to post
Share on other sites
1 час назад, Sturmann сказал:

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

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

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

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

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

Link to post
Share on other sites
3 часа назад, nicomed сказал:

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   1 member

    • barelav



  • Сообщения

    • ivanK
      A-4012-0518-0L     (Fanuc B Inspection+) такой есть A-4012-0583-AC   (FanucMeldas Seting sw)
    • maxx2000
      @Maker79 если принять заложенную в ПМ концепцию программирования обработки и программировать по 3D модели, то всё встанет на свои места. Мне ПМ чужд, не зашёл от слова совсем, ни как, ни под каким соусом. Всё прекрасно гуглится, всё есть, всё работает. Настрой станок как 5 осевой, XYBAZ, блокируй в параметрах обработки ось B под углом 90 градусов и обрабатывай по 3D модели в 4 осях  
    • Maker79
      Близости с арткамом вижу очень мало. Арткам для дизайнерских вещей очень хороша. И работа с векторами имеется простая и точная,. Нет нужды открывать специальный софт для векторов.  А вот всё что я видел в процессе обучения  PM это примеры на технических изделиях с точными и гибкими вычислениями, что мне очень понравилось. И оно так и есть, но только наполовину получается. По вектору резать может но вот чтобы резать смещаясь от этой линии куда то  надо схему такаую вот знать секретную... через три перегона из программы в программу ))
    • may1on
      Добрый день , не понимаю как запустить барфидер в УП и зациклить станок . Барфидер DH 65L S2 , станок токарный с цанговым патроном , стойка 808D. Программа на барфидер есть , но как ее запустить во время обработки не понимаю .        Куда и что вписать в программу что бы заработало     
    • maxx2000
      Тыкали на наиболее идеологически близкое к Арткам.  В целом решение рабочее, но требует определённых навыков. Например навык самообучения, навык чтения справки.   А он и не испытывает, просто это так задумано, что в твоём случае он работает только в связке с ПШ. В нормальной CAM есть свой CAD модуль который позволяет строить эти все дополнительные элементы или получать их из геометрии детали. Не изучай Катю, продолжай работать в связке ПШ+ПМ, тем более решение есть и тебе его на блюдечке выложили. Волшебной кнопки к сожалению нет ни в одной системе. 
    • Maker79
      И всё равно непонятно мне, почему "по шаблону" получается сделать траекторию которая следует по поверхности цилиндра, но только гравировку по линии. А что мешает сделать еще несколько проходов внутрь и получить выборку вместо гравировки? И почему гравировку эту не получается сместить ни влево ни вправо? Ну не верится мне что PM с его широким применением исптывает трудности для такой задачи. 
    • Кот-Васька
      Здравствуйте. Может у кого есть руководство(мануал) к станкам токарным и фрезерным BLIN? Если есть поделитесь пожалуйста.
    • Maker79
      Я не занимаюсь точным машиностроением. Зачем мне изучать CATIA чтобы делать скалки? Вообще на все мои 3 осевые задачи хватает и арткама.  Нужна была программа для 4 оси. И все мне тыкали пальцем на PM+PS. Теперь мне что изучить ещё чтобы мне по векторам резать на 4 оси  ?? ))
    • dslawa1
      Доброго времени суток. Не подскажите как в постпроцессоре настроить чтоб метчик в цикле G84 нарезал за несколько проходов резьбу ?
    • Jesse
      с этими фамилиями не знаком.. по идее в нефте/газе та же самая шкала MSK должна использоваться. у нас иногда говорят, что если бак IV категории, то это как раз по обычным промышленным нормам. Если I категории, то это самые жесткие требования по сейсмике в атомке - МРЗ. Иногда требуют ещё проверять на падение самолёта, ударную волну.  
×
×
  • Create New...