"Тормозит" ActivX. Как ускорить
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > "Тормозит" ActivX. Как ускорить

"Тормозит" ActivX. Как ускорить

Ответ
Поиск в этой теме
Непрочитано 18.07.2014, 11:21 #1
"Тормозит" ActivX. Как ускорить
Lorens
 
Учусь
 
Санкт-Петербург
Регистрация: 19.04.2007
Сообщений: 624

В Лиспе программирую достаточно уверенно, а вот с технологией ActivX мой первый опыт.

Суть проблемы следующая - есть таблицы ACAD_TABLE, они имеют определенное количество столбцов и неизвестное количество строк. Мне необходимо полностью изменить форматирование - изменить текстовый стиль, высоту, выравнивание...

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

Вопрос - я неправильно использую методы или ActivX непригоден для моей задачи??? Акад 2014 английский без ничего.

Вложения
Тип файла: lsp Редактор таблиц.lsp (1.4 Кб, 57 просмотров)
Тип файла: dwg
DWG 2007
Таблица.dwg (87.1 Кб, 1859 просмотров)

Просмотров: 5003
 
Непрочитано 18.07.2014, 11:25
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


См. свойство RegenerateTableSuppressed

----- добавлено через ~1 мин. -----
И код написан, как бы сказать... Неоптимально. Мне так кажется
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.07.2014, 11:34
#3
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
изменить форматирование - изменить текстовый стиль, высоту, выравнивание
СЮРПРАЙЗ
Проблема возникает если приходится менять ширину столбца, если заведомо выставить её по максимуму...

Да RegenerateTableSuppressed - знал бы раньше...
http://knowledge.autodesk.com/suppor...F3869-htm.html
trir вне форума  
 
Автор темы   Непрочитано 18.07.2014, 11:46
#4
Lorens

Учусь
 
Регистрация: 19.04.2007
Санкт-Петербург
Сообщений: 624


Кулик Алексей aka kpblc, Вы мой спаситель. 2 секунды и таблица на 340 строк обработана!!!

Буду очень признателен за рекомендации по оптимизации кода.
Lorens вне форума  
 
Автор темы   Непрочитано 03.09.2014, 17:24
#5
Lorens

Учусь
 
Регистрация: 19.04.2007
Санкт-Петербург
Сообщений: 624


Продолжаю играть с этой прогой. Пытаюсь установить аппаратно тип ряда (Row style) и не могу найти метод для установки. Метод для получения мне известен: getRowType, а вот обратный ему найти не могу ((
Lorens вне форума  
 
Непрочитано 03.09.2014, 17:28
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


object.SetCellStyle nRow, nCol, szCellStyle
http://entercad.ru/acadauto.en/
trir вне форума  
 
Автор темы   Непрочитано 03.09.2014, 18:12
#7
Lorens

Учусь
 
Регистрация: 19.04.2007
Санкт-Петербург
Сообщений: 624


trir, огромное спасибо, но это изменение свойства Cell Style - свойство ячейки, а мне необходимо изменить свойство ряда. Объясняю зачем это мне надо - автокад с 12 (если не раньше) позволяет "сжимать" таблицу, т.е. она графически превращается в 2, 3, 4 (сколько надо) при этом "шапка" у всех дублируется, но "шапкой" будет считаться только те ряды у которых Row Style = Title... Изменение же типа ячейки ни чем не поможет...
Lorens вне форума  
 
Непрочитано 03.09.2014, 19:06
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


object.MergeCells(minRow, maxRow, minCol, maxCol)
Фейрштейн?
trir вне форума  
 
Непрочитано 03.09.2014, 19:41
#9
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Что-то вспоминается мне, что вроде бы программно нельзя задать стиль строке, есть ощущение, что проблема уже всплывала то ли тут, то ли на ADN-CIS.
Если на лиспе кодите, рекомендую рассмотреть вариант использования готовых шаблонов таблиц в отдельном файле и вставлять их в чертеж программно. Это проще и надежней, чем пытаться настраивать программно. Хотя, могут быть и другие мнения...
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 03.09.2014, 19:50
#10
Lorens

Учусь
 
Регистрация: 19.04.2007
Санкт-Петербург
Сообщений: 624


Do$, можно и в ручную настроить, благо не так много таблиц за раз обрабатывать надо. Готовый шаблон - это мысль, надо будет ее обсосать. Может, что и придумаю...

В любом случае спасибо, а то я столько времени ухлопал пока искал, а так все ясно - нет, значит НЕТ.
Lorens вне форума  
 
Непрочитано 05.09.2014, 17:00
#11
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Что-то вспоминается мне, что вроде бы программно нельзя задать стиль строке, есть ощущение, что проблема уже всплывала то ли тут, то ли на ADN-CIS.
http://bushman-andrey.blogspot.ru/20...autocad_5.html
Строка 402
Получается, что с помощью NET это можно сделать в последних версиях AutoCAD.
С помощью лиспа - нет.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 03.10.2014, 13:18
#12
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Доброго времени суток. Пишу из соседней !закрытой! темы http://forum.dwg.ru/showthread.php?t=115743 . Т.к. закрыли ее видимо из-за наличия этой ветки. Хотя не ясно, как по заголовку этой темы я должен был узнать, что здесь освещается именно мой вопрос. Но не об этом.
К сожалению obj.RegenerateTableSuppressed меня не спас. Заполнение действительно происходит быстрее, но когда дело доходит до назначения стиля ячейке, автокад все равно очень задумывается и даже в мониторе ресурсов windows отображается что он "не отвечает". Подскажите пожалуйста, можно ли на VBA назначать стили не по 1 ячейке, а сразу целым диапазонам?
art_rrc вне форума  
 
Непрочитано 03.10.2014, 13:47
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Сначала гасишь регенерацию таблицы, потом меняешь regenmode, потом модифицируешь таблицу и все возвращаешь обратно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.10.2014, 14:07
#14
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
потом меняешь regenmode
Большое спасибо, этого еще не советовали! На первый взгляд кажется что это именно то, что нужно . Спасибо. Буду пробовать.
Попробовал. Сделал так:
Код:
[Выделить все]
Table.RecomputeTableBlock False
Table.RegenerateTableSuppressed = False
ThisDrawing.SetVariable "REGENMODE", 0

"Обработка таблицы"

ThisDrawing.SetVariable "REGENMODE", 1
Table.RegenerateTableSuppressed = True
Table.RecomputeTableBlock True


Код:
[Выделить все]
Table.RecomputeTableBlock False
Table.RegenerateTableSuppressed = False
ThisDrawing.SetVariable "REGENMODE", 0

nStr = n
w1(0) = 1: w1(1) = 1: w1(2) = 1
w2(0) = 1: w2(1) = 1: w2(2) = 1
Do
    Err.Clear
    ThisDrawing.Utility.GetEntity Table, pnt, vbCrLf & "Выберите таблицу:"
    If Err = 13 Or Err = 91 Then ThisDrawing.Utility.Prompt vbCrLf & "Требуется таблица"
    Loop While Err = 13 Or Err = 91
If Err = -2147352567 Then Exit Sub
Err.Clear
iRow = 12
nRows = Table.Rows
iRowDet = -1
iRowMat = -1
For i = 0 To nRows
    strX = Table.GetText(i, 2)
    If strX = "{\LДетали}" Then
        iRowDet = i
    End If
    Select Case Table.GetText(i, 2)
    Case "{\LДетали}"
        iRowDet = i
    Case "{\LМатериалы}"
        iRowMat = i
    End Select
Next i
If (iRowDet = -1) Or (iRowMat = -1) Or (iRowMat < iRowDet) Then
MsgBox ("Некорректная таблица")
GoTo DavayDoSvidaniya:
End If
nsTabl = iRowMat - iRowDet - 2
rHeight = 8#
iRow = iRowDet + 1
If nStr > nsTabl Then
    'Вставка
    nCells = nStr - nsTabl
    Table.InsertRows iRow, rHeight, nCells
    ElseIf (nStr < nsTabl) Then
    'Удаление
    nCells = nsTabl - nStr
    Table.DeleteRows iRow, nCells
End If
nRows = Table.Rows
nCol = Table.Columns
Call art_Set_Alf(Alf)
For i = 1 To n
Table.SetRowHeight (iRowDet + i), 8#
For j = 0 To nCol
'GoTo next2
Select Case j
    'Форматирование левой части
    Case 0, 1
        Table.SetCellStyle (iRowDet + i), j, "art_Текстовая"
    Case 2
        Table.SetCellStyle (iRowDet + i), j, "art_Диаметр"
    Case 3, 5
        Table.SetCellStyle (iRowDet + i), j, "art_Целая_середина"
    Case 4, 6
        Table.SetCellStyle (iRowDet + i), j, "art_Текстовая_вправо"
    Case 7
        Table.SetCellStyle (iRowDet + i), j, "art_Длина"
    
    Case 8
        Table.SetCellStyle (iRowDet + i), j, "art_Целая"
    End Select
'next2:
    If j < 9 Then
        Table.SetText (iRowDet + i), j, MgSpec(i, j + 1)
        ElseIf j = 9 Then
            strX = CStr(iRowDet + i + 1)
            FCell = "=pi/4*7850/1000000000*h" + strX + "*d" + strX + "^2"
            Table.SetText (iRowDet + i), j, FCell
    End If
Next j
Next i
Table.SetRowHeight (iRowDet + n + 1), 8#

ThisDrawing.SetVariable "REGENMODE", 1
Table.RegenerateTableSuppressed = True
Table.RecomputeTableBlock True

При этом таблица в 25 строк, заполняется примерно 45 сек. При том что я временно выкинул большую часть нужных мне столбцов, и практически все форматирование. Опять же повторюсь, что в ексель все записывает мгновенно. А может быть 45 сек на 25 строк это хороший результат и мне стоит успокоиться? Может нужно использовать не SetText, а SetValue или SetFormula? Это может помочь?

Последний раз редактировалось Кулик Алексей aka kpblc, 03.10.2014 в 18:06.
art_rrc вне форума  
 
Непрочитано 03.10.2014, 18:53
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Я не вижу в коде, где идет снятие регенерации таблицы
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.10.2014, 03:02
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


art_rrc, В коде всё с точностью до наоборот. До обработки таблицы нужно запретить её регенерацию, т.е.:
Код:
[Выделить все]
Table.RegenerateTableSuppressed = True
а после обработки разрешить регенерацию и выполнить регенерацию таблицы:
Код:
[Выделить все]
Table.RegenerateTableSuppressed = False
Table.RecomputeTableBlock(True)
P.S.: Подозреваю, что это от незнания английского:
Suppress - подавить (т.е. RegenerateTableSuppressed - регенерация таблицы подавлена)
Александр Ривилис вне форума  
 
Непрочитано 04.10.2014, 11:50
#17
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Буду уже в понедельник дальше экспериментировать. Ваши советы очень полезны! Спасибо!
Добавлено:

Подправил код, теперь он выглядит так:

Код:
[Выделить все]
ThisDrawing.SetVariable "REGENMODE", 0 'Отключить авторегенерацию
Table.RegenerateTableSuppressed = True 'Подавить регенерацию таблицы
Table.RecomputeTableBlock False 'Отключить пересчет таблицы

"Обработка таблицы"

Table.RecomputeTableBlock True
Table.RegenerateTableSuppressed = False
ThisDrawing.SetVariable "REGENMODE", 1
Но для таблицы 10х10(таблица уже создана в пространстве модели) получил такие результаты:
1) Вставка/удаление строк - 0.1 сек.
2) Только заполнение ячеек - 8 сек.
3) Только форматирование ячеек (точнее только задание стиля ячейкам, остальное отключил) - 5 сек.
4) Заполнение+форматирование - 26 сек (хотя вроде 8+5=13 должно быть).

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

Последний раз редактировалось art_rrc, 06.10.2014 в 11:59.
art_rrc вне форума  
 
Непрочитано 13.10.2014, 23:18
#18
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Еще раз всем спасибо за советы! Вы мне очень помогли добиться более адекватной скорости работы. На днях закончил первый вариант програмки составления спецификаций. Тема конечно не нова, но я постарался сделать нечто новое (по крайней мере в автокаде такого еще не видел). Все почему-то вокруг екселя бубнами машут... Хотя все можно сделать в чистом автокаде без лишних файлов и прокси-объектов. Если кому интересно, вот условный пример работы: https://www.youtube.com/watch?v=MRVEkxov5mI

И еще подскажите пожалуйста, чем нибудь отличаются:
Table.SetText i,j,"" от Table.DeleteCellContent i,j или
Table.SetText i,j,"=1+1" от Table.SerFormula i,j,X,"=1+1"

И что это за парамерт такой x - nContent as Long??? Спасибо!
art_rrc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > "Тормозит" ActivX. Как ускорить



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить вход/выход из режима редактирования блока EgorS AutoCAD 10 18.10.2016 11:36
Подскажите Civil 3d 2010 как ускорить работу его Didar Вертикальные решения на базе AutoCAD 13 16.07.2013 09:01
Как ускорить работу в СПДС? Сетевой Прочее. Программное обеспечение 4 28.11.2011 10:17
ArchiCAD. Как ускорить рендеринг? stoper ArchiCAD 2 04.05.2010 14:02