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). Ну а от вас интересно было бы узнать насколько все это подходит для вас.