Re: Использование ТКС АПИ для заполнения BOM в CAD-ах

Итак, попробуем написать пример, для составления спецификации внутри CAD-а использую базу данных ТКС.

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

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

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


Public Sub ThirdStep_1()

Dim TCS As CSDN.TCS
Dim App As CSDN.Tcs_Application

'Создадим объект ТКС АПИ

Set TCS = CreateObject("CSDN.TCS")

'Создадим экземляр приложения (сеанс). Внимание ! создание повторного сеанса не допустимо!


Set App = TCS.Login 'вызывает стандартное окно аутентификации пользователя

'Set App = TCS.LoginEx("Администратор", "0")  ' Если вы сами пишите диалог ввода пользователя и пароля или просто его знаете

'Set App = TCS.LoginCurrent ' если вы хотите использовать сеанс уже запущенного ТКС


'Выберем классы испольдзуемые в спецификации
App.NmkClasses.ClassView = 1

'Просим пользователя выбрать один класс, номенклатура которого его интересует.
'На практике конструктора вполне возможно уже будут знать заранее используемые классы
'так что вы можете заложиться в программе сразу на конкретные классы, или
'ввести сразу команды по выбору материала, или детали
'в этом случае диалог выбора класса конечно не нужен,
'а вместо него появится вот такая строчка кода
' If App.NMkClasses.Locate( "NOTE", "Предопределенное обозначение класса", 0 ) Then

If App.NmkClasses.RunModuleForSelect("Выберите класс номенклатуру которого хотите добавить", False) > 0 Then
   Dim Nmks As CSDN.Nomenclatures
   Dim I As Integer
   Dim NMkRes As String
     
   
   Set Nmks = App.Nomenclatures(App.NmkClasses.Properties("ID").AsInteger)
   
   'Здесь указан более сложный вариант для выбора нескольких позиций
   'в случае если надо выбрать одну номенклатуру нужно замениить код на
   'If Nmks.RunModuleForSelect("Выберите номенклатурные позиции", False) > 0 Then
   'ну и дальше просто сразу взять нужные вам значения
   If Nmks.RunModuleForSelect("Выберите номенклатурные позиции", True) > 0 Then
     
      For I = 0 To Nmks.SelectedRowsCount - 1
        'Для простоты просто копируем все необходимые свойства
        'реально имеено здесь вы получаете данные и сохраняете там где вам нужно
        
        If Nmks.GotoSelectedRow(I) Then
        
           NMkRes = NMkRes + Nmks.Properties("NOTE").AsString + " - " + Nmks.Properties("NAME").AsString + _
                            ": Идентификатор - " + Nmks.Properties("ID").AsString + " ; "
        End If
              
        
      Next I
      
    'освободим объект номенклатурый справочник
    Set Nmks = Nothing
    
    'Покажем выбранные результаты
    MsgBox NMkRes
      
   End If
   
   
Else: MsgBox "Класс не выбран"
End If

Set App = Nothing
Set TCS = Nothing


End Sub


А теперь аналогичный, но несколько иной пример. Скажем честно, это не очень хороший пример использования, но им часто придется пользоваться по мере развития АПИ. Речь идет о зависимых объектах, которые вы видите на экране самого TechnologiCS. Вы можете получить доступ к ним, однако состав этих зависимых объектов и их свойства от версии к версии могут меняться, хотя в большинстве случаев их число будет расти. При работе со строго задекларированными интерфейсами разработчики будут по мере возможности поддерживать все задекларированные свойства объекта (состав полей и вынесенные зависимые объекты). Даже если они исчезнут, в АПИ останется их поддержка чтобы написанные с использованием АПИ программы могли работать и дальше.
Но тем не менее, этот способ тоже очень полезен, просто в нем всегда надо полагаться на наличие того или иного объекта и обработать такие возможные объекты. Во всяком случае вы можете получить доступ ко многим данным которые вам возможно необходимы, но пока неоткрыты разработчиками в отдельные интерфейсы.
Итак пример.



Public Sub ThirdStep_2()

Dim TCS As CSDN.TCS
Dim App As CSDN.Tcs_Application

'Создадим объект ТКС АПИ

Set TCS = CreateObject("CSDN.TCS")

'Создадим экземляр приложения (сеанс). Внимание ! создание повторного сеанса не допустимо!


Set App = TCS.Login 'вызывает стандартное окно аутентификации пользователя

'Set App = TCS.LoginEx("Администратор", "0")  ' Если вы сами пишите диалог ввода пользователя и пароля или просто его знаете

'Set App = TCS.LoginCurrent ' если вы хотите использовать сеанс уже запущенного ТКС


'Ищем класс сборочных единиц
If App.NmkClasses.Locate("NOTE", "СБ", 0) Then

   Dim Nmks As CSDN.Nomenclatures
   Dim I As Integer
   Dim NMkRes As String
   Dim Prop As CSDN.IProp
   Dim Childs As CSDN.IChildModules
   Dim Spec As CSDN.IGModule
   
   Set Nmks = App.Nomenclatures(App.NmkClasses.Properties("ID").AsInteger)
   
   'Опять таки в реальной жизни вам будет известна номенклатура на которую ведется
   'спецификация и вволне возможно даже ее идентификатор.
   'Тогда вместо выбора появится строчка
   ' If Nmks.Locate( "NOTE", "Обозначение номенклатурной позиции", 0 ) Then
   On Error GoTo Err1
   If Nmks.RunModuleForSelect("Выберите номенклатуру на которую выведете спецификацию", False) > 0 Then
     
     
     'Получим спецификацию на нашу номенклатуру
     Set Childs = Nmks.ChildModules
     Set Prop = Childs.ModuleByName("Specification")
     
     'If Prop Is Nothing Then Set Prop = Nmks.ChildModules.ModuleItems(10)
     
     Set Spec = Prop.Value
   
     'Покажем спецификацию пользователю о попросим его выбрать
     'номенклатуру сразу  из спецификации
     'а если ее нет, то добавить ее в спецификацию ТКС, а потом выбрать
     'таким образом сразху ведется  спецификация и в ТКС и в вашей программе.
     'и даже необязательно делать импорт спецификации в последующем
     'хотя функции их сравнения наверное не помешают
     'В будущем разумеется вы сможете вести спецификацию даже без окна ТКС
     'хотя это потребует написания немалого кода с вашей стороны.
     If Spec.RunModuleForSelect("выберите номенклатуру из спецификации :" + _
                                 Nmks.Properties("NOTE").AsString + " - " + _
                                 Nmks.Properties("NAME").AsString, True) Then
                                 
     
       For I = 0 To Spec.SelectedRowsCount - 1
         If Spec.GotoSelectedRow(I) Then
           NMkRes = NMkRes + Spec.Properties("NMK_NOTE").AsString + " - " + _
                             Spec.Properties("NMK_NAME").AsString + ": Идентификатор -" + _
                             Spec.Properties("NMK_ID").AsString + " ; "
          
         End If
        
       Next I
       
       'Покажем выбранные результаты
       MsgBox NMkRes
       
     End If
    
     
   End If
   
Err1:
   
   Set Prop = Nothing
   Set Childs = Nothing
   Set Spec = Nothing
   Set Nmks = Nothing
  
  
 
 Else: MsgBox "Отсутвует класс СБ"
End If

Set App = Nothing
Set TCS = Nothing


End Sub

Все. Надеюсь на этих примерах мне удалось показать как же именно использовать базу данных ТКС в CAD приложениях для формирования спецификаций ( или BOM). Ну а от вас интересно было бы узнать насколько все это подходит для вас.

Re: Использование ТКС АПИ для заполнения BOM в CAD-ах

Да!  исходники этих примеров можно взять здесь 
https://forum.technologics.ru/docs-hz/F … _Api_3.zip

please-change-link