Тема: Тест - скорость построения таблиц.

Привет,
Мне не нравится скорость построения таблиц, в моих программах.
На этом примере хотелось бы узнать можно ли как-то ее увеличить.
У меня 61 секунда. Акад 2008, AMD 1800+

Public Sub TableTest()
   'тест скорости заполнения таблицы
   Dim objTable As AcadTable
   Dim varPt As Variant
   Dim i As Integer
   Dim Start As Double
   Dim Finish As Double
   varPt = ThisDrawing.Utility.GetPoint 'точка вставки таблицы
   Start = Timer
   'создаем таблицу из 2 строк и 5 столбцов
   Set objTable = ThisDrawing.ModelSpace.AddTable(varPt, 2, 5, 8, 10)
   objTable.DeleteRows 0, 1 'удаляем 1 строчку заголовка таблицы
   'устанавливаем высоту текста
   'для стандартного стиля таблиц
   objTable.SetTextHeight 3, 3
   objTable.SetTextHeight 4, 3
   'вообще-то для эксперимента стиль таблицы не имеет значения
   'заполняем шапку таблицы
   objTable.SetText 0, 0, "Поз"
   objTable.SetColumnWidth 0, 15
   objTable.SetText 0, 1, "Обозначение"
   objTable.SetColumnWidth 1, 70
   objTable.SetText 0, 2, "Наименование"
   objTable.SetColumnWidth 2, 70
   objTable.SetText 0, 3, "Кол"
   objTable.SetColumnWidth 3, 15
   objTable.SetText 0, 4, "Масса"
   objTable.SetColumnWidth 4, 20
   'заполняем таблицу
   For i = 1 To intFullNum
      'вставляем строчку
      objTable.InsertRows i, 10, 1
      'заполняем ячеки
      objTable.SetText i, 0, i
      objTable.SetText i, 1, "Обозначение" & i
      objTable.SetText i, 2, "Наименование" & i
      objTable.SetText i, 3, i
      objTable.SetText i, 4, i
   Next
   Finish = Timer
   MsgBox Finish - Start & " секунд"
End Sub

Re: Тест - скорость построения таблиц.

У меня тоже таблица строилось очень долго, возможно так VBA работает с таблицами.
Пришлось для увеличения скорости сначала строить таблицу в Excel'e, а потом вставлять в автокад.

Set xlapp = CreateObject("Excel.Application")
Set curbook = xlapp.Workbooks.Add
Set curSheet = curbook.Sheets(1)
..........
curSheet.Range("A1:" & tabl_range).Copy
ThisDrawing.SendCommand "_PASTESPEC" & vbCr & x & "," & y & vbCr
xlapp.Calculate         ' to empty clipboard
...........

Re: Тест - скорость построения таблиц.

> Vildar
Я не буду вдаваться в анализ кода, это
чистый спагетти, сам потом проанализируешь
Насчет скорости обрати внимение на метод:
RegenerateTableSuppressed

Public Sub TableTest()
   'тест скорости заполнения таблицы
   Dim objTable As AcadTable
   Dim varPt As Variant
   Dim i As Integer
   Dim Start As Double
   Dim Finish As Double
   varPt = ThisDrawing.Utility.GetPoint 'точка вставки таблицы
   Start = Timer
   'создаем таблицу из 2 строк и 5 столбцов
   Set objTable = ThisDrawing.ModelSpace.AddTable(varPt, 2, 5, 8, 10)
   objTable.RegenerateTableSuppressed = True
   objTable.DeleteRows 0, 1 'удаляем 1 строчку заголовка таблицы
   'устанавливаем высоту текста
   'для стандартного стиля таблиц
   objTable.SetTextHeight 3, 3
   objTable.SetTextHeight 4, 3
   'вообще-то для эксперимента стиль таблицы не имеет значения
   'заполняем шапку таблицы
   objTable.SetText 0, 0, "Поз"
   objTable.SetColumnWidth 0, 15
   objTable.SetText 0, 1, "Обозначение"
   objTable.SetColumnWidth 1, 70
   objTable.SetText 0, 2, "Наименование"
   objTable.SetColumnWidth 2, 70
   objTable.SetText 0, 3, "Кол"
   objTable.SetColumnWidth 3, 15
   objTable.SetText 0, 4, "Масса"
   objTable.SetColumnWidth 4, 20
   'заполняем таблицу
   For i = 1 To intFullNum
      'вставляем строчку
      objTable.InsertRows i, 10, 1
      'заполняем ячеки
      objTable.SetText i, 0, i
      objTable.SetText i, 1, "Обозначение" & i
      objTable.SetText i, 2, "Наименование" & i
      objTable.SetText i, 3, i
      objTable.SetText i, 4, i
   Next
   objTable.RegenerateTableSuppressed = False
   Finish = Timer
   MsgBox Finish — Start & " секунд"
End Sub

~'J'~

Re: Тест - скорость построения таблиц.

Ни фига себе, меньше 1 сек.
Фантастика, спасибо Фиксо.
Обалдеть.
Блин раньше таблицы строились по полчаса, тперь я устрою скоростуху... Yes!

Re: Тест - скорость построения таблиц.

> Vildar
Успехов в зарплате :)
~'J'~

Re: Тест - скорость построения таблиц.

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

Re: Тест - скорость построения таблиц.

А зачем вообще открывать файл?

'References -> AutoCAD/ObjectDBX Common 16.0 Type Library
Public Const FILE_NAME = "F:\Work\DWG\2section.dwg"
Sub Example_AddTable()
   Dim Start As Double
   Dim Finish As Double
   Start = Timer
    Dim AcadApplication As Object
    On Error Resume Next
    Set AcadApplication = ThisDrawing.Application
    Dim Documents As AcadDocuments
    Set Documents = AcadApplication.Documents
    Dim MainDoc As AcadDocument
    Set MainDoc = Documents.Open(FILE_NAME)
    Dim pt(2) As Double
    Dim MS As AcadModelSpace
    Dim MyTable As AcadTable
    Set MS = MainDoc.ModelSpace
    Set MyTable = MS.AddTable(pt, 5, 5, 10, 30)
    Set MainDoc = Nothing
    Finish = Timer
    MsgBox (Finish - Start)
 End Sub

Re: Тест - скорость построения таблиц.

> LeonidSN
Мне кажется, что тебе тут ObjectDBX-библиотека не нужна абсолютно. Ты ж файл открываешь "впрямую".

Re: Тест - скорость построения таблиц.

> Кулик Алексей aka kpblc
тут ObjectDBX-библиотека не нужна абсолютно
Конечно же...
Прошу прощения у почтенной публики - выложил не тот код!
Наверное что-то в воздухе было разлито (или в стакане).
Вообщем, идея понятна - использовать ObjectDBX для ускорения создания таблицы. Зачем это надо неизвестно, ну ... неважно.

'References -> AutoCAD/ObjectDBX Common 17.0 Type Library
Public Const FILE_NAME = "F:\Work\DWG\2section.dwg"
Sub Example_AddTable()
   Dim Start As Double
   Dim Finish As Double
   Start = Timer
    Dim MainDoc As AXDBLib.AxDbDocument
    Set MainDoc = New AXDBLib.AxDbDocument
    MainDoc.Open (FILE_NAME)
    Dim MS As AcadModelSpace
    Dim pt(2) As Double
    Dim MyTable As AcadTable
    Set MS = MainDoc.ModelSpace
    Set MyTable = MS.AddTable(pt, 5, 5, 10, 30)
    Finish = Timer
    MsgBox (Finish - Start)
    MainDoc.SaveAs (MainDoc.Name)
    Set MainDoc = Nothing
End Sub

У меня тест показал 0,062сек.
Кто быстрее?

Re: Тест - скорость построения таблиц.

Не, ну просто вставка таблицы 5 на 5 не пойдет.
Хотя бы 100 элементов заполнить.
С помощью RegenerateTableSuppressed я и глазом не успеваю маргнуть как теперь три листа А2 спецификаций уже готова (подвальная часть, типовые этажи и чердак, это я проектированием панельных жилых домов занимаюсь). Время только и правда уходит на открытие файла, несколько секунд, но мне и нужно после построения спецификации открывать этот файл. Только если пропущу этому свойству False поставить, то таблица пустая получается.
Но если так быстрее, через dbx, и не нужно открытие файла, то конечно полезная весч.

Re: Тест - скорость построения таблиц.

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

Re: Тест - скорость построения таблиц.

> fixo

> Vildar
Скажите пожалуйста а как установить в этой таблице текущий стиль текста???

Re: Тест - скорость построения таблиц.

Програмно настраивать стили геморно, имхо, но можно.
Мне проще сделать заготовки таблиц.
Ну а по вопросу, нужно поработать со табличным стилем.
Конкретно для установки текстового стиля есть метод соответствующий - SetTextStyle.
Короче исследуйте объект табличного стиля - AcadTableStyle.

Re: Тест - скорость построения таблиц.

А, главное, Дарья, Ваш вопрос не по теме. Создайте новую тему если хотите.