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

Добрый день!
В VBA не силен, поэтому есть несколько вопросов:
1. Как в макросе и в карточке тех.перехода условием проверить значение конкретного параметра и в зависимости от его значения выполнить определенные действия?
2. Возможно ли в окне редактирования технологии макросом пройтись по всем операциям, сложить значения в определенных параметрах и сумму вывести в другой параметр?

Re: Выполнение действий макросом

Здравсвуйте!

У нас VBScript, это еще проще язык. Больше нужно знание как раз TechnologiCS.

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

Немного сложнее (хотя в чем то проще) - присоеденить схему поиска в ТП (параметр будет прямо в сетке виден), пробежаться по ТП и просуммировать его, сохранить.

Еще сложнее (а может и проще опять таки) - создать набор данных, там собрать все ваши параметры и тогда простопробежатсяь по набору и получить значение нового параметра (но если работаете с вариантами ТП то тут будет сильно сложнее реализовать, и не уверен насчет 7.9).

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

Подобные задачи в ТКС постоянно возникают, у каждого свои. Реализуются у нас достаточно просто.

Re: Выполнение действий макросом

Спасибо за ответ. К сожалению программиста на предприятии нет. Пытаемся по мере своих возможностей и знаний самостоятельно что-либо реализовать.
По первому вопросу - Пытался делать через api, параметр CurrentParameterValue, но так в итоге ничего и не заработало.

Если есть возможность можете предоставить хотя бы небольшой пример реализации.

Re: Выполнение действий макросом

ну вот простой пример  https://forum.technologics.ru/topic2555.html

Для работы лучше использовать наши скрипты (мы там много облегчаем). Основной инструмент для работы АПИ Explorer https://help.technologics.ru/7.9/TCSHelp/_800.htm. В нем можно посмотреть большинство свойств и полчить заготовку для кода. Параметры немного не стадартно работают, но на них примеров полно.

Re: Выполнение действий макросом

Перед тем как создать тему я прочитал думаю все темы, касающиеся своих вопросов.
Вот так пытался сделать, но выводится ошибка: Объект не является семейством: 'Pars.CurrentParameterValue'
     

  Dim TP, Pars

Set TP = TCSActiveModule
Set Pars = TCSActiveModule.Properties("Parameters").AsIDispatch
 Do While Not TP.EOF

            If TP.ClassType = CSDN_Const.ctPereshod  Then

             If Pars.CurrentParameterValue("SV_L")=100 then

             Call TP.SetParameterValue( "SV_L", Lsv )

             Lsv = 100 + 1
            End If
            End If

            TP.Next

Re: Выполнение действий макросом

 Sub FormMacro_test1(ActiveModule) 'Test1
  Dim TP' As INmkTechnology
  Dim Pars ' as IParameterValues
  Set TP = ActiveModule
  'Dim TP
  Lsv = 1
  TP.First
  Do While Not TP.EOF
   If TP.ClassType = CSDN_Const.ctPereshod  Then
      Set Pars = TP.Properties("Parameters").AsIDispatch
      'ищем параметр с кодом
      if Pars.Locate( "PAR_CODE", "SV_L", 0 ) Then
        If Pars.CurrentParameterValue=100 then 'Проверяем что значение параметра равно 100
          if not Pars.SetCurrentParameterValue( Lsv, -1 ) then theApp.ShowErrorMessage( "Cannot set parameter!" )
          Lsv = 100 + 1
        End If
      End If
   End If
   TP.Next
  Loop
End Sub

Re: Выполнение действий макросом

Спасибо!
Попробовал видоизменить, но не заполняется...

 Sub WELD_rezhim(TCSActiveModule)
 Dim RASH
Dim TP' As INmkTechnology
  Dim Pars' as IParameterValues
  Set TP = TCSActiveModule
  'Dim TP
  RASH = 1
  TP.First
  Do While Not TP.EOF
   If TP.ClassType = CSDN_Const.ctPereshod  Then
      Set Pars = TP.Properties("Parameters").AsIDispatch

      'ищем параметр с кодом
      if Pars.Locate( "PAR_CODE", "SV_TIP", 0 ) Then
        If Pars.CurrentParameterValue = "T1" then

          if not TP.SetParameterValue( "SV_RASH", RASH ) then theApp.ShowErrorMessage( "Cannot set parameter!" )
                   RASH = 100500
             End If
             End If
   End If
   TP.Next
  Loop
End Sub

Значение параметра SV_TIP задается через выпадающий список. Если его значение например "Т1" тогда ввести в другой параметр значение

Re: Выполнение действий макросом

if not TP.SetParameterValue( "SV_RASH", RASH ) then theApp.ShowErrorMessage( "Cannot set parameter!" )                

если работа идет с присоединенныим параметрами, то вроде так надо

Call TP.SetParameterValue( "SV_RASH", RASH )

https://help.technologics.ru/7.9/TCSAPI … alue_9.htm


С параметрами приатаченными есть нюанс - надо присоедить хоть один для начала. Можно в Ткс присоеднить любую
схему поиска, можно кодом  вначале

Call TP.AttachedParamCodes( "SV_RASH;SV_TIP" )

https://help.technologics.ru/7.9/TCSAPI … des_13.htm

Ну в вашем случае похоже надо просто вот так написать

 if not Pars.SetParameterValueByParCode( "SV_RASH", RASH, -1, True ) then theApp.ShowErrorMessage( "Cannot set parameter!" )

https://help.technologics.ru/7.9/TCSAPI … ode_13.htm

Спасибо сказали: vitaly5761

Re: Выполнение действий макросом

Спасибо, все работает.
Буду премного благодарен если подскажите почему не работает такая конструкция?

 Sub WELD_rezhim(TCSActiveModule)
  Dim Fpopersech
  Dim TP' As INmkTechnology
  Dim Pars ' as IParameterValues
  Dim S, RASH, M
  Dim POLOZH
    Set TP = TCSActiveModule
  kp=1.04
  TP.First
  Do While Not TP.EOF
     If TP.ClassType = CSDN_Const.ctPereshod  Then
      Set Pars = TP.Properties("Parameters").AsIDispatch


if Pars.Locate( "PAR_CODE", "SV_S", 0 ) Then
S =  Pars.CurrentParameterValue
End If

if Pars.Locate( "PAR_CODE", "SV_L", 0 ) Then
L =  Pars.CurrentParameterValue
End If

if Pars.Locate( "PAR_CODE", "SV_POLOZH", 0 ) Then
If Pars.CurrentParameterValue="Íèæíåå" then
     kn = 1
End If
End If

if Pars.Locate( "PAR_CODE", "SV_POLOZH", 0 ) Then
If Pars.CurrentParameterValue="Ïîëóâåðòèêàëüíîå (íàêëîííîå)" then
     kn = 1.05
End If
End If

if Pars.Locate( "PAR_CODE", "SV_POLOZH", 0 ) Then
If Pars.CurrentParameterValue="Âåðòèêàëüíîå èëè ãîðèçîíòàëüíîå" then
     kn = 1.1
End If
End If

if Pars.Locate( "PAR_CODE", "SV_POLOZH", 0 ) Then
If Pars.CurrentParameterValue="Ïîòîëî÷íîå" then
     kn = 1.2
End If
End If



if Pars.Locate( "PAR_CODE", "SV_TIP", 0 ) Then
   If Pars.CurrentParameterValue="Ò1" then
          'ïëîùàäü ïîïåðå÷íîãî ñå÷åíèÿ
          Fpopersech=(0.5*S*S+1.05*S)
          M = Fpopersech*7.85*L/1000
          RASH = M*kp*kn

                     if not Pars.SetParameterValueByParCode( "SV_RASH", RASH, -1, True ) then theApp.ShowErrorMessage( "Cannot set parameter!" )
        End If

   End If
End If


   TP.Next
  Loop
End Sub

Re: Выполнение действий макросом

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

Pars.First
Do While Not Pars.EOF
  Select Case Pars.Properties("PAR_CODE").AsSafeSrting
    Case "SV_S"
       S =  Pars.CurrentParameterValue
    Case "SV_L"
       L =  Pars.CurrentParameterValue
  End Select
  Pars.Next
Loop

Re: Выполнение действий макросом

Скрипт выводит сообщение Cannot set parameter

Re: Выполнение действий макросом

Изменил поле SV_RASH с действительного числа на текстовую строку, все заработало.

Re: Выполнение действий макросом

Не подскажите, а как с помощью case проверять один параметр на разные значения

Re: Выполнение действий макросом

Аналогично

Select Pars.CurrentParameterValue
    Case "A1"
       S =  1
    Case "A2"
       S = 2
End Select
Спасибо сказали: vitaly5761

Re: Выполнение действий макросом

Спасибо, все работает, но как-то странно.

 Sub WELD_rezhim(TCSActiveModule)
  Dim Fpopersech
  Dim TP' As INmkTechnology
  Dim Pars ' as IParameterValues
  Dim s, RASH, M, RASH_round
  Dim POLOZH
    Set TP = TCSActiveModule

  kp = 1.04
   Fpopersech = 0
   s = 0

   TP.First
  Do While Not TP.EOF
     If TP.ClassType = CSDN_Const.ctPereshod  Then
      Set Pars = TP.Properties("Parameters").AsIDispatch


 Pars.First
Do While Not Pars.EOF
  Select Case Pars.Properties("PAR_CODE").AsSafeString
    Case "SV_S"
      s = Pars.CurrentParameterValue
    Case "SV_L"
       L =  Pars.CurrentParameterValue
  End Select
  Pars.Next
Loop


if Pars.Locate( "PAR_CODE", "SV_POLOZH", 0 ) Then
 Select case Pars.CurrentParameterValue
    Case "Íèæíåå"
    kn = 1
    Case "Ïîëóâåðòèêàëüíîå (íàêëîííîå)"
    kn = 1.05
    Case "Âåðòèêàëüíîå èëè ãîðèçîíòàëüíîå"
    kn = 1.1
    Case "Ïîòîëî÷íîå"
    kn = 1.2
End Select
  End If


if Pars.Locate( "PAR_CODE", "SV_TIP", 0 ) Then
 Select case Pars.CurrentParameterValue
    Case "Ò1"
      Fpopersech = (0.5*s*s+1.05*s)/100
    Case "Í1"
       Fpopersech = (0.5*s*s+1.05*s)/100
End Select
         End If
    M = Fpopersech*7.85*L/10000
    RASH = M*kp*kn
  RASH_round = Round( RASH, TCSApp.DisplayPrecision )

if not Pars.SetParameterValueByParCode( "SV_RASHOD", RASH_round, -1, True ) then theApp.ShowErrorMessage( "Cannot set parameter!" )
     End If



   TP.Next
  Loop


End Sub

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

Re: Выполнение действий макросом

Тут сложнее. Но как бы там после TP.Next надо, наверное, как минимум все переменные заново инициализировать или сбросить, их значания ведь от предыдущего возьмутся.

ну и вот это

if Pars.Locate( "PAR_CODE", "SV_POLOZH", 0 ) Then

можно было в основной Case Select вложить (вложенные просто). Хотя особо без разницы.

Спасибо сказали: vitaly5761

(изменено: vitaly576, 24 ноября 2020 07:43:09)

Re: Выполнение действий макросом

Добрый день!
По непонятной причине расчет происходит избирательно:
Выполнение действий макросом
То есть для типа "Т1" в предыдущей операции расчет произошел нормально, а в следующей операции расчет происходит только для типа "Н1".

Re: Выполнение действий макросом

ну тут уже так просто не разберешься как раз.
Ставьте точки останова, самое простое - сделать вызов https://help.technologics.ru/7.9/TCSAPI … eBox_9.htm

Call theApp.ShowMessageBox( "1", "A=" & A & "C=" & C ) 

еще можно сам модуль показать в процессе работы или исследовать (только главное тут своему коду не помешайте)

if Module.ShowModal( "Module" )>0 then :

https://help.technologics.ru/7.9/TCSAPI … dal_13.htm
или

Call LogObject._ShowPropExplorer( Module )

https://help.technologics.ru/7.9/TCSAPI … orer_9.htm