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

Автоматизация с помощью API


Qzen

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

Возникла задача создать автоматизированную анимацию с помощью API.

Имеется механизм (манипулятор) и траектория, по которой должна двигаться его конечная точка. Траектория точно лежит в рабочей зоне манипулятора.

С помощью API необходимо:

- Сначала присвоить конечной точке и траектории сопряжение "совпадение"

- Затем создать анимационную модель передвижения манипулятора из одной точки траектории в другую.

Во-первых, проблемы начинаются с момента присвоения сопряжения, т.к. автоматически оно не присваивается! Я пытался "Записать макрос" присвоения - тщетно. Пробовал смотреть файл swxJRNL.swj, брал код оттуда, но все это ни к чему не привело.

Ниже выкладываю код этого журнала. Чтобы его получить я: Открывал солид, делал сопряжение, сохранял полученный файл под новым именем. Затем брал записи журнала, по ним создавал макрос, но он не выполняется до конца. Ругается на строчку, выделенную красным.

По поводу анимации тоже возникает похожий вопрос, её вообще можно автоматизировать с помощью API?

Dim swApp As ObjectDim Part As ObjectDim boolstatus As BooleanDim longstatus As Long, longwarnings As LongSub main()Set swApp = Application.SldWorksSet Part = swApp.OpenDoc6("D:\Институт\Учебные материалы\11-ый семестр\Диплом\Мои пробы\Сборка_ВП_1.SLDASM", 2, 0, "", longstatus, longwarnings)swApp.ActivateDoc2 "Сборка_ВП_1", False, longstatusSet Part = swApp.ActiveDocDim myModelView As ObjectSet myModelView = Part.ActiveViewmyModelView.FrameLeft = 0myModelView.FrameTop = 0Set myModelView = Part.ActiveViewmyModelView.FrameState = swWindowState_e.swWindowMaximizedSet myModelView = Part.ActiveViewmyModelView.FrameLeft = 0myModelView.FrameTop = 0Set myModelView = Part.ActiveViewmyModelView.FrameState = swWindowState_e.swWindowMaximizedSet myModelView = Part.ActiveViewmyModelView.FrameState = swWindowState_e.swWindowMaximizedboolstatus = Part.Extension.SelectByID2("", "VERTEX", 0, 0.074886851073, -0.005265805610352, True, 1, Nothing, 0)boolstatus = Part.Extension.SelectByID2("Spline1@Трехмерный эскиз1", "EXTSKETCHSEGMENT", 0, 0.0681379195214, -0.02582715136684, True, 1, Nothing, 0)Dim myMate As Object[color="#FF0000"]Set myMate = Part.AddMate2(0, -1, False, 0.004566016555396, 0, 0, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, longstatus, 0, 0, 0, 0, 0, 1, False, False, False, False)[/color]Part.ClearSelection2 TruePart.ShowNamedView2 "*Изометрия", 7Part.ShowNamedView2 "*Изометрия", 7longstatus = Part.SaveAs3("D:\Институт\Учебные материалы\11-ый семестр\Диплом\Мои пробы\Сборка_ВП_11.SLDASM", 0, 2)Set myModelView = Part.ActiveViewmyModelView.FrameState = swWindowState_e.swWindowMaximizedSet myModelView = Part.ActiveViewmyModelView.FrameState = swWindowState_e.swWindowMaximizedSet myModelView = Part.ActiveViewmyModelView.FrameState = swWindowState_e.swWindowMaximizedswApp.ExitAppEnd Sub
Ссылка на сообщение
Поделиться на других сайтах


По поводу анимации тоже возникает похожий вопрос, её вообще можно автоматизировать с помощью API?

<noindex>Изображение</noindex>

VBA in an Equation

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

Данный кораблик не совсем то, что мне нужно, но на том сайте есть и то, что мне действительно нужно!

Попробую порыть, может быть, и получится.

Огромное спасибо =)

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

Пытаюсь автоматически через макрос добавить уравнение для размера, но возникает проблема.

Если уравнение носит просто характер, например

Part.AddRelation ""D1@Эскиз1"=50", то все прекрасненько и оно делается автоматически.

Если усложняю задачу и задаю такое уравнение:

Part.AddRelation ""D1@Эскиз1"=IIF("D1@Эскиз1"<360, "D1@Эскиз1"+1, "D1@Эскиз1"")"

Выдает ошибку, пишет Syntaxis Error!

Не подскажете, что делаю не так? Он же вроде как строку добавляет и проблем быть не должно?

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

Пытаюсь автоматически через макрос добавить уравнение для размера, но возникает проблема.

Если уравнение носит просто характер, например

Part.AddRelation ""D1@Эскиз1"=50", то все прекрасненько и оно делается автоматически.

Если усложняю задачу и задаю такое уравнение:

Part.AddRelation ""D1@Эскиз1"=IIF("D1@Эскиз1"<360, "D1@Эскиз1"+1, "D1@Эскиз1"")"

Выдает ошибку, пишет Syntaxis Error!

Не подскажете, что делаю не так? Он же вроде как строку добавляет и проблем быть не должно?

в строке:

Part.AddRelation ""D1@Эскиз1"=IIF("D1@Эскиз1"<360, "D1@Эскиз1"+1, "D1@Эскиз1"")"

В конце ИМХО лишние кавычки : ...,"D1@Эскиз1"")"

Посмотрите пример из HELP API SW (SW2008) :

*******

Use IIf Function When Adding an Equation Example (VB)

This example shows how to use the Visual Basic IIf function when adding an equation.

'----------------------------------------

' Preconditions: Model document is open, feature dimensions are visible, and at least one equation already exists.

' Postconditions: An equation that uses the Visual IIf function is added.

'-----------------------------------------

Option Explicit

Sub main()

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim swEqnMgr As SldWorks.EquationMgr

Dim i As Long

Dim nCount As Long

Dim bRet As Boolean

Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc

Set swEqnMgr = swModel.GetEquationMgr

Debug.Print "File = " & swModel.GetPathName

Debug.Print " Status = " & swEqnMgr.Status

nCount = swEqnMgr.GetCount

' List the existing equations and their calculated values

For i = 0 To nCount - 1

Debug.Print " Eqn(" & i & ") = " & swEqnMgr.Equation(i)

Debug.Print " Value = " & swEqnMgr.Value(i)

Next i

' Add an equation that uses the Visual Basic IIf function,

' list it and its calculated value

swEqnMgr.Add i, ("""D1@Extrude2"" = (IIf(""D1@Extrude3"">20, 15, 6))+3")

Debug.Print " Eqn(" & i & ") = " & swEqnMgr.Equation(i)

Debug.Print " Value = " & swEqnMgr.Value(i)

End Sub

*******

Но это пример добавления уравнения! Вам именно это нужно?

Или нужно реально изменить значение одного размера в зависимости от значения другого?

Тогда см. Help API SW по ключевому слову "GetSystemValue3", т.е. тут нужен метод "Dimension::GetSystemValue3"

Там есть несколько примеров как получить значение размера и изменить его...

PS У Вас собственно какая версия SW?

PPS У меня вообще-то другой подход: изменять сразу значние нужного размера.

А у Вас получается - средствами API Вы меняете уравнение, которое будет менять значение размера - что-то типа "масло-маслянное"...

Это ИМХО - лишний код. А значит лишние ошибки... :-)

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

PS У Вас собственно какая версия SW?

PPS У меня вообще-то другой подход: изменять сразу значние нужного размера.

А у Вас получается - средствами API Вы меняете уравнение, которое будет менять значение размера - что-то типа "масло-маслянное"...

Это ИМХО - лишний код. А значит лишние ошибки... :-)

SW2009 SP4.0.

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

Другими средствами автоматизировать построение движение модели я не могу - Solidworks в этом плане отказывается давать нужные функции =)

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

Part.AddRelation ""D1@Эскиз1"=IIF("D1@Эскиз1"<360, "D1@Эскиз1"+1, "D1@Эскиз1"")"

Выдает ошибку, пишет Syntaxis Error!

Не подскажете, что делаю не так? Он же вроде как строку добавляет и проблем быть не должно?

Извиняюсь за тавтологию, но те кавычки, что в кавычках должны быть двойными (""):

"""D1@Эскиз1""=IIF(""D1@Эскиз1""<360, ""D1@Эскиз1""+1, ""D1@Эскиз1"")"
или внутренние кавычки заменены на символ по ASCII-коду (Chr(номер_символа), где номер_символа для двойных кавычек имеет номер 34)

Chr(34) & "D1@Эскиз1" & Chr(34) & "=IIF(" & Chr(34) & "D1@Эскиз1" & Chr(34) & "<360, " & Chr(34) & "D1@Эскиз1" & Chr(34) & "+1, " & Chr(34) & "D1@Эскиз1" & Chr(34) & ")"
Ссылка на сообщение
Поделиться на других сайтах

SW2009 SP4.0.

Дело в том, что необходимо автоматизировать присвоение размеру подобного рода выражений для последующей автоматизации

выполнения движения с помощью макроса-счетчика.

Другими средствами автоматизировать построение движение модели я не могу - Solidworks в этом плане отказывается давать нужные

функции =)

Двигать компонент сборки можно и по-другому

(используя операторы :

Set swXform = swMathUtil.CreateTransform(Nothing)

swComp.Transform2 = swXform

swXformArrD = swXform.ArrayData

и т.д.

)

Вот пример:

"

Public Sub AlCompToOrAsm()

'Align Assembly Component to Assembly Origin and Planes Example (VB)

'This example shows how to align an assembly component to the assembly origin and planes.

'--------------------------------

' Preconditions: Assembly document is open and

' an assembly component is selected.

'

' Postconditions: Selected assembly component is

' aligned to the assembly origin and planes.

'--------------------------------

'Option Explicit

Dim swMathUtil As SldWorks.MathUtility

Dim swModel As SldWorks.ModelDoc2

Dim swSelMgr As SldWorks.SelectionMgr

Dim swComp As SldWorks.Component2

Dim swXform As SldWorks.MathTransform

Dim swXformArrD As Variant

Dim i As Long

Dim bRet As Boolean

Set swApp = CreateObject("SldWorks.Application")

Set swMathUtil = swApp.GetMathUtility

Set swModel = swApp.ActiveDoc

Set swSelMgr = swModel.SelectionManager

Set swComp = swSelMgr.GetSelectedObjectsComponent3(1, 0)

If swComp Is Nothing Then

MsgBox "Необходимо выбрать компонент сборки!", , "Error0148"

Exit Sub

End If

Set swXform = swMathUtil.CreateTransform(Nothing) ' create unit transform

swComp.Transform2 = swXform

swXformArrD = swXform.ArrayData

' Rebuild to see updated transform

bRet = swModel.EditRebuild3: Debug.Assert bRet

End Sub

"

Потом, несколько неясно, что Вам нужно: "Симуляция" или "Анимация"? Как должно происходить построение сборки(и компонентов)? Тоже средствами API или сборка уже построена? Тут надо бы разделять задачи...

Можно также посмотреть пример из API SW(2008) - "AssemblyDoc::EnablePresentation". В примере к этому оператору компонент двигается используя счетчик или вращения или перемещения или масштабирования. И главное - используется матрица трансформации: `MathTransform Object`.

Уравнения в SW это всего лишь мизерные зачатки самого API SW(для тех кто API не освоил), поэтому ИМХО я считаю, что работа с уравнениями через API лишь усложняет дело...

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

Решил, что ограничусь таким случаем: Просто буду перестраивать модель в зависимости от значения переменных.

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

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

Но меня интересует вопрос: КАК присвоить значение переменной размеру?

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

Пока, вроде, загвоздка только в последнем пункте, а так в учебнике по Basic'у процесс перевода описан достаточно подробно =)

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

Решил, что ограничусь таким случаем: Просто буду перестраивать модель в зависимости от значения переменных.

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

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

Но меня интересует вопрос: КАК присвоить значение переменной размеру?

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

Пока, вроде, загвоздка только в последнем пункте, а так в учебнике по Basic'у процесс перевода описан достаточно подробно =)

1) это в каком последнем?

2) в SW2010-м кстати появилось собыйтийное программирование(симуляци/моделирование). Советую взглянуть, хотя бы для расширения кругозора(если конечно не в курсе).

В CAD верхнего уровня такие модули давно уж существуют.

3) вот примерный перечень подобных программ:

20sim\ <папка> 08.08.08 11:33 ----

dymdemo\ <папка> 08.08.08 11:33 ----

Dymola\ <папка> 19.01.09 09:09 ----

Euler 6.01Demo\ <папка> 08.08.08 11:33 ----

EWB512\ <папка> 26.07.09 23:31 ----

Index\ <папка> 09.06.09 00:02 ----

Modelica\ <папка> 08.08.08 11:33 ----

MotionWorks\ <папка> 08.08.08 11:33 ----

Mvs\ <папка> 08.08.08 11:33 ----

NacaWin\ <папка> 08.08.08 11:33 ----

RF2\ <папка> 08.08.08 11:33 ----

Symbols2000\ <папка> 08.08.08 11:33 ----

TMM\ <папка> 01.07.09 10:45 ----

UnivMech\ <папка> 08.08.08 11:33 ----

Vis3D\ <папка> 08.08.08 11:33 ----

VisSim\ <папка> 08.08.08 11:33 ----

Hydraulic and Fluid Power Systems Design and Simulation Software.mht 18 117 22.02.08 13:09 -a--

Simulation Tools.mht 72 676 22.07.03 14:18 -a--

Welcome BarDyne.mht 102 965 22.07.03 15:47 -a--

PS. Причем, в части этих программ возможно совсместное моделирование как механических процессов, так и гидравдических, пневматических, электрических процессов...

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

Мне нужно сделать именно в solidworks, такова тема диплома =)

Есть столбец в mathcad, необходимо, чтобы все значения этого столбца последовательно присваивались значению одного размера в solide.

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

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

Мне нужно сделать именно в solidworks, такова тема диплома =)

Есть столбец в mathcad, необходимо, чтобы все значения этого столбца последовательно присваивались значению одного размера в solide.

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

ИМХО это задача уже решена: советую или обратиься или к `Vadim_Ryb`: сделать поиск по темам типа "MatchCAD и SolidWworks" или по имени пользователя : Vadim_Ryb.

Он передавал параметры из `mathcad` в SW.

А текстовый файл тут обязателен?

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

ИМХО это задача уже решена: советую или обратиься или к `Vadim_Ryb`: сделать поиск по темам типа "MatchCAD и SolidWworks" или по имени пользователя : Vadim_Ryb.

Он передавал параметры из `mathcad` в SW.

А текстовый файл тут обязателен?

Я сидел в этой теме, интерпретатор, который использовал vadim очень скуден на функции - это раз и его нельзя автоматизировать! Он не описывается стандартными функциями API Solidworks =)

Объяснюсь, этот интерпретатор из столбца делает сплайн, из матрицы делает поверхность, ещё есть возможность перекидывать некоторые параметры и присваивать их значение значению размера в солиде. Соответственно, использование интерпретатора отпадает =(

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

Я сидел в этой теме, интерпретатор, который использовал vadim очень скуден на функции - это раз и его нельзя автоматизировать! Он не описывается стандартными функциями API Solidworks =)

Объяснюсь, этот интерпретатор из столбца делает сплайн, из матрицы делает поверхность, ещё есть возможность перекидывать некоторые параметры и присваивать их значение значению размера в солиде. Соответственно, использование интерпретатора отпадает =(

Есть еще пожая тема - вот забыл только как называется... Вы-то какую нашли?

Так Вы не ответили на вопрос:

mathcad и текстовый файл - обязательны?

PS/. В MCAD2001 есть пример по связке MCAD2001 и SW.

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

Есть еще пожая тема - вот забыл только как называется... Вы-то какую нашли?

Так Вы не ответили на вопрос:

mathcad и текстовый файл - обязательны?

PS/. В MCAD2001 есть пример по связке MCAD2001 и SW.

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

А я вот необходимых тем и не нашёл =(

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

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

А я вот необходимых тем и не нашёл =(

Вот тут еще попробуйте:

- <noindex>http://www10.mcadcafe.com/link/Download-Ca...3/category.html</noindex>

(ну и там рядом - я не очень внимательно смотрел..., может что и полезного есть(например ``))

- <noindex>http://www10.mcadcafe.com/link/AXEMBLE-Fre...13683/view.html</noindex>

Но я ничего не гарантирую

Вот еще, совсем забыл: в самом MCAD`e есть API ? Если есть, то лучше забыть про текстовый файл и передавать значения через переменные(хотя в целях тестирования можно его и создавать или сохранять, чтоб на следующий день не потерять, а просто считать...).

Я как-то написал программулину, так там работали совместно SW, CorelDraw, AutoCAD и Excel и переменные между собой передавали(измерения делал в Аcad`e, их значения передавал в SW, который делал 3D-модель, а потом все это передавалось в Corel...)

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

Я как-то написал программулину, так там работали совместно SW, CorelDraw, AutoCAD и Excel и переменные между собой передавали(измерения делал в Аcad`e, их значения передавал в SW, который делал 3D-модель, а потом все это передавалось в Corel...)

Каким образом передавались значения в SW?? =) Я вот втупую не могу сделать, чтобы, например:

k=10

D1@Эскиз1=k

А ведь, передавая из AutoCad в SW измерения вы должны были решать этот вопрос? :) Или все делалось через Excel? =)

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

Каким образом передавались значения в SW?? =) Я вот втупую не могу сделать, чтобы, например:

k=10

D1@Эскиз1=k

А ведь, передавая из AutoCad в SW измерения вы должны были решать этот вопрос? :) Или все делалось через Excel? =)

Ну, в AutoCad`e другой синтаксис написания имен р-ров, чем в SW !

А передавать можно хоть через глобальные переменные, хоть через тотже текстовый файл(с определенной структургой).

Завтра поищу, найду - вышлю.
Ссылка на сообщение
Поделиться на других сайтах

Вот тут сборка в которой значение размера изменяется через определенное время, анимацией это назвать язык не поворачивается.

Сделано в СВ2010 СП3.

Сопряжения в сборке уже созданы, но впринципе их можно и через API добавлять

Новая_папка.rar

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

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

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

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

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

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

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

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

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

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

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




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