Запись в фиелды

Автор Тема: Запись в фиелды  (Прочитано 14473 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Запись в фиелды
« : 08-01-2021, 10:50:17 »
В чертеже есть коллекция фиелдов Dim sBoxs As Inventor.TextBoxes, в которой больше четырех десятков записей.
Как правильно сделать обращение для быстрой передачи данных?
Сейчас использую подход For Each  и сравнение имен - для такого количества получается долгий процесс! Есть способ его оптимизировать?

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #1 : 08-01-2021, 10:53:50 »
Т.е. выполнить прямое обращение к конкретному фиелду по Имени и выполнить запись.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Запись в фиелды
« Ответ #2 : 08-01-2021, 11:10:25 »
для такого количества получается долгий процесс! Есть способ его оптимизировать?
А чё долго то? Заверни в транзакцию через чендж процессор. Ты Эддин написал? Эддин должен быстро работать.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #3 : 08-01-2021, 11:34:04 »
Оно, конечно, все отновительно... Да, AddIn, идет несколько секунд...
Код - vb.net [Выбрать]
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim sSheet As Sheet
  3.         sSheet = dDoc.Sheets.Item(1)
  4.         Dim sBoxs As Inventor.TextBoxes
  5.         Dim sBox As Inventor.TextBox
  6.         sBoxs = sSheet.TitleBlock.Definition.Sketch.TextBoxes
  7.         For Each sBox In sBoxs ' заполнение строк окна формы
  8.             If sBox.Text = "OBOZ" Then
  9.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbOboz.Text)
  10.             ElseIf sBox.Text = "CHEC" Then
  11.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbChec.Text)
  12.             ElseIf sBox.Text = "NCON" Then
  13.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbNcon.Text)
  14.             ElseIf sBox.Text = "TCON" Then
  15.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbTcon.Text)
  16.                 'ElseIf sBox.Text = "Number of sheets" Then
  17.                 '    Call sSheet.TitleBlock.SetPromptResultText(sBox, tbPags.Text)
  18.             ElseIf sBox.Text = "IZME" Then
  19.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbIzme.Text)
  20.             ElseIf sBox.Text = "DESI" Then
  21.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbDesi.Text)
  22.             ElseIf sBox.Text = "APPR" Then
  23.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbAppr.Text)
  24.             ElseIf sBox.Text = "APPD" Then
  25.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbAppd.Text)
  26.             ElseIf sBox.Text = "NCOD" Then
  27.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbNcod.Text)
  28.             ElseIf sBox.Text = "ADDF" Then
  29.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbAddf.Text)
  30.             ElseIf sBox.Text = "CHED" Then
  31.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbChed.Text)
  32.             ElseIf sBox.Text = "TCOD" Then
  33.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbTcod.Text)
  34.             ElseIf sBox.Text = "DESD" Then
  35.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbDesd.Text)
  36.             ElseIf sBox.Text = "ADDB" Then
  37.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbAddb.Text)
  38.             ElseIf sBox.Text = "ADDD" Then
  39.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbAddd.Text)
  40.             ElseIf sBox.Text = "NDOC" Then
  41.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbNdoc.Text)
  42.             ElseIf sBox.Text = "IZMD" Then
  43.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbIzmd.Text)
  44.             ElseIf sBox.Text = "SCAL" Then
  45.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbScal.Text)
  46.             ElseIf sBox.Text = "MASS" Then
  47.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbMass.Text)
  48.             ElseIf sBox.Text = "LITE" Then
  49.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbLite.Text)
  50.             ElseIf sBox.Text = "INDE" Then
  51.                 'Call sSheet.TitleBlock.SetPromptResultText(sBox, tbInde.Text)
  52.             ElseIf sBox.Text = "L2" Then
  53.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbL2.Text)
  54.             ElseIf sBox.Text = "PERV" Then
  55.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbPerv.Text)
  56.             ElseIf sBox.Text = "ALIT" Then
  57.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbAlit.Text)
  58.             ElseIf sBox.Text = "ADOC" Then
  59.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbAdoc.Text)
  60.             ElseIf sBox.Text = "L3" Then
  61.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbL3.Text)
  62.             ElseIf sBox.Text = "TDOC" Then
  63.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbTdoc.Text)
  64.             ElseIf sBox.Text = "NAIM1" Then
  65.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbNaim.Lines(0))
  66.             ElseIf sBox.Text = "NAIM2" Then
  67.                 Try
  68.                     Call sSheet.TitleBlock.SetPromptResultText(sBox, tbNaim.Lines(1))
  69.                 Catch ex As Exception
  70.                 End Try
  71.             ElseIf sBox.Text = "NAIM3" Then
  72.                 Try
  73.                     Call sSheet.TitleBlock.SetPromptResultText(sBox, tbNaim.Lines(2))
  74.                 Catch ex As Exception
  75.                 End Try
  76.             ElseIf sBox.Text = "MATE1" Then
  77.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbMate.Lines(0))
  78.             ElseIf sBox.Text = "MATE2" Then
  79.                 Try
  80.                     Call sSheet.TitleBlock.SetPromptResultText(sBox, tbMate.Lines(1))
  81.                 Catch ex As Exception
  82.                 End Try
  83.             ElseIf sBox.Text = "MATE3" Then
  84.                 Try
  85.                     Call sSheet.TitleBlock.SetPromptResultText(sBox, tbMate.Lines(2))
  86.                 Catch ex As Exception
  87.                 End Try
  88.             ElseIf sBox.Text = "FIRM1" Then
  89.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbFirm.Lines(0))
  90.             ElseIf sBox.Text = "FIRM2" Then
  91.                 Try
  92.                     Call sSheet.TitleBlock.SetPromptResultText(sBox, tbFirm.Lines(1))
  93.                 Catch ex As Exception
  94.                 End Try
  95.             ElseIf sBox.Text = "FIRM3" Then
  96.                 Try
  97.                     Call sSheet.TitleBlock.SetPromptResultText(sBox, tbFirm.Lines(2))
  98.                 Catch ex As Exception
  99.                 End Try
  100.             ElseIf sBox.Text = "ICUS" Then
  101.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbIcus.Text)
  102.             ElseIf sBox.Text = "SPAR" Then
  103.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbSpra.Text)
  104.             ElseIf sBox.Text = "INPO" Then
  105.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbInpo.Text)
  106.             ElseIf sBox.Text = "INPD" Then
  107.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbInpd.Text)
  108.             ElseIf sBox.Text = "INVZ" Then
  109.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbInvz.Text)
  110.             ElseIf sBox.Text = "INDU" Then
  111.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbIndu.Text)
  112.             ElseIf sBox.Text = "INDD" Then
  113.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbIndd.Text)
  114.             ElseIf sBox.Text = "IZML" Then
  115.                 Call sSheet.TitleBlock.SetPromptResultText(sBox, tbIzml.Text)
  116.                 'ElseIf sBox.Text = "PAGE" Then
  117.                 '    Call sSheet.TitleBlock.SetPromptResultText(sBox, tbMate1_.Text)
  118.             End If
  119.         Next
  120.         Try
  121.             GTNTitle1.End()
  122.         Catch ex As Exception
  123.         End Try
  124.         Me.Close()
  125.     End Sub

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Запись в фиелды
« Ответ #4 : 08-01-2021, 11:40:58 »
Try
            GTNTitle1.End()
        Catch ex As Exception
        End Try
Что вообще такое? Ты транзакцию здесь завершаешь? А как транзакцию объявлял?

По поводу вот этого:
Try
                    Call sSheet.TitleBlock.SetPromptResultText(sBox, tbNaim.Lines(1))
                Catch ex As Exception
                End Try
Сколько Try-Catch у тебя срабатывает по исключению?

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #5 : 08-01-2021, 12:29:30 »
Что вообще такое? Ты транзакцию здесь завершаешь? А как транзакцию объявлял?
Да. Открывается при запуске формы.
Один раз.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #6 : 08-01-2021, 12:33:32 »
Почему вопрос возник: у меня перед глазами пример - Брагин в программе на VB6 реализовал почти мгновенную передача - вот только как!?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Запись в фиелды
« Ответ #7 : 08-01-2021, 16:51:43 »
filat,
Дак что у тебя с транзакциями то?

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #8 : 09-01-2021, 10:18:21 »
С транзакциями все путем - задержка не в ней.
Все как обычно: я все понял - это были не правильные пчелы!...  :D
Есть другой способ записи данных в фиелы - через массив. Только минусом его является очередность и неотслеживаемость имен блоков, куда что записывается.
Код - Visual Basic [Выбрать]
  1.     Dim sPromptStrings(1 To 2) As String
  2.  
  3.     ' Add an instance of the title block definition to the sheet.
  4.    Dim oTitleBlock As TitleBlock
  5.     Set oTitleBlock = oSheet.AddTitleBlock(oTitleBlockDef, , sPromptStrings)
Пример в хэлпе Title Block Definition Create and Insert API Sample

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #9 : 11-01-2021, 10:04:45 »
И тут появился встречный вопрос: а существует ли функция обратная AddTitleBlock для быстрого считывания фиелдов в массив?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Запись в фиелды
« Ответ #10 : 11-01-2021, 10:42:52 »
а существует ли функция обратная AddTitleBlock для быстрого считывания фиелдов в массив?
Фарш назад чтоль провернуть? А что медленно считывается? Можешь в атрибуты данные заранее впихивать на этот титульный блок, а потом не шерстить все подряд, а обратиться сразу к атрибутам и там считать данные

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #11 : 11-01-2021, 10:50:32 »
А что медленно считывается?
Ну не за мгновение ока - тоже несколько секунд - вроде ни не много, но поднапрягает, хочется добиться моментальной обработки...  8)
Можешь в атрибуты данные заранее впихивать на этот титульный блок
Мысль интересная и заслуживает внимания, только вот - это ж надо всю базу перетряхнуть...  :o :o :o :-X

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Запись в фиелды
« Ответ #12 : 12-01-2021, 11:04:23 »
Ну не за мгновение ока - тоже несколько секунд - вроде ни не много, но поднапрягает, хочется добиться моментальной обработки... 
Что у тебя там за титульный блок такой навороченный?

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Запись в фиелды
« Ответ #13 : 07-08-2022, 09:28:09 »
А как выполнить запись в sBox, если SetPromptResultText дает ошибку?
Нужно сделать запись в графу материалов.
Код - Visual Basic [Выбрать]
  1. Sub T1()
  2.     Dim dDoc As DrawingDocument
  3.     Set dDoc = ThisApplication.ActiveDocument
  4.     Dim oSheet As Sheet
  5.     Set oSheet = dDoc.ActiveSheet
  6.     Dim sBoxs As TextBoxes
  7.     Dim sBox As TextBox
  8.     Set sBoxs = oSheet.TitleBlock.Definition.Sketch.TextBoxes
  9.     For Each sBox In sBoxs
  10.         Debug.Print (sBox.Text)
  11.         If sBox.Text = "<Материал Наим.>" Then
  12.             Call dDoc.Sheets(1).TitleBlock.SetPromptResultText(sBox, "тест1")
  13.             Debug.Print (dDoc.Sheets(1).TitleBlock.GetResultText(sBox))
  14.         End If
  15.     Next
  16. End Sub
Пробовал через удаление титульного блока и вставкой нового с измененным массивом, но не увидел изменений на экране.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Запись в фиелды
« Ответ #14 : 07-08-2022, 12:15:40 »
Document.Update ?