| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Ускорение при работе с таблицами

Ускорение при работе с таблицами

Ответ
Поиск в этой теме
Непрочитано 14.12.2018, 13:48 #1
Ускорение при работе с таблицами
tsetse
 
Инженер-конструктор
 
Москва
Регистрация: 25.12.2015
Сообщений: 77

Добрый день! Есть простенький код, который преобразует поля в ячейках таблицы в простой текст
Код:
[Выделить все]
 
(defun C:UNFIELD_TAB ( / *error* objsel cur_tab Rows Cols row col cur_txt cur_h cur_style cur_alig elemi alltab elnth elem regenold Fieldold )
;
; Функция преобразовывает содержащиеся в таблице поля в текст

; записываем и обнуляем значения regenmode и fieldeval
(setq regenold (getvar 'regenmode))
(setq Fieldold (getvar 'Fieldeval))
(setvar 'regenmode 0)
(setvar 'Fieldeval 0)

; в случае ошибки выводим сообщение об отмене
(defun *error*(msg)
	; Восстанавливаем regenmode и fieldeval
	(setvar 'regenmode regenold)
	(setvar 'Fieldeval Fieldold)
	(princ "Команда отменена")
) 

; выбираем таблицу
(progn
	(setq objsel (ssget "_+.:E:S" '((0 . "ACAD_TABLE")) ))
	(if (/= objsel nil)
		(setq cur_tab (ssname objsel 0))
		(princ "Выбрана не таблица!")
	) ;end if
) ; end progn

; преобразуем таблицу в vla
(setq tblobj (vlax-ename->vla-object cur_tab))

; читаем число строк и столбцов таблицы
(setq Rows nil)
(setq Cols nil)
(setq Rows (vlax-get-property (vlax-ename->vla-object cur_tab) 'Rows))
(setq Cols (vlax-get-property (vlax-ename->vla-object cur_tab) 'Columns))
(setq row nil)
(setq col nil)
(setq row 0)
(setq col 0)
(setq alltab nil)
; читаем содержимое таблицы и записываем в список alltab
(repeat Rows
	(progn
	(setq col 0)
	(repeat Cols
		(setq elemi nil)
		(setq cur_txt nil)
		(setq cur_txt (vla-GetText tblobj row col)) ; читаем текст
		(setq cur_h nil)
		(setq cur_h (vla-GetCellTextHeight tblobj row col)) ;читаем высоту текста
		(setq cur_style nil)
		(setq cur_style (vla-GetCellTextStyle tblobj row col)) ;читаем текстовый стиль
		(setq cur_alig nil)
		(setq cur_alig (vla-getCellAlignment tblobj row col)) 	;читаем выравнивание
		(setq elemi (list row col cur_txt cur_h cur_style cur_alig)) ; записываем информацию по ячейке в elemi
		(setq alltab (cons elemi alltab)) ; добавляем в список alltab информацию о ячейке elemi
		(setq col (1+ col))
	) ; end of repeat Cols
	(setq row (1+ row))
	)
) ; end of repeat rows

(setq alltab (reverse alltab))

; Заполняем содержимое таблицы из списка alltab
(setq row nil)
(setq col nil)
(setq row 0)
(setq col 0)
(repeat Rows
	(progn
	(setq col 0)
	(repeat Cols
		(setq elnth nil)
		(setq elnth (+ (* Cols row) col)) ;определяем необходимый номер элемента в списке alltab
		(setq elem nil)
		(setq elem (nth elnth alltab)) ; достаем необходимый элемент из списка alltab и записываем в elem 
		(setq cur_txt nil)
		(setq cur_txt (nth 2 elem)) ;достаем из elem текст
		(vla-SetText tblobj row col "")
		(vla-SetText tblobj row col cur_txt) ;записываем текст в ячейку
		(setq cur_h nil)
		(setq cur_h (nth 3 elem)) ;достаем из elem высоту текста
		(vla-SetCellTextHeight tblobj row col cur_h) ;записываем высоту текста в ячейку
		(setq cur_style nil)
		(setq cur_style (nth 4 elem)) ;достаем из elem текстовый стиль
		(vla-SetCellTextStyle tblobj row col cur_style)  ;записываем текстовый стиль в ячейку
		(setq cur_alig nil)
		(setq cur_alig (nth 5 elem)) ;достаем из elem выравнивание
		(vla-SetCellAlignment tblobj row col cur_alig) ;записываем выравнивание в ячейку
		(setq col (1+ col))
	) ; end of repeat Cols
	(setq row (1+ row))
	)
) ; end of repeat rows

; Восстанавливаем regenmode и fieldeval
(setvar 'regenmode regenold)
(setvar 'Fieldeval Fieldold)

) ; end of defun
Работает крайне медленно даже для небольших таблиц. regenmode и fieldeval при этом выключены. Можно ли как то ускорить? Спасибо!
Сразу предупреждаю, в lisp я "чайник", но код этот полностью написал сам за исключением отлова *error* и (ssget "_+.:E:S" '((0 . "ACAD_TABLE")))
Просмотров: 2402
 
Непрочитано 14.12.2018, 14:33
1 | 1 #2
valerik88


 
Регистрация: 02.07.2016
Сообщений: 249


Код:
[Выделить все]
 ;Отключаем регенерацию таблицы
    (vla-put-RegenerateTableSuppressed vla-table :vlax-true)

;Редактируем таблицу

;Включаем регенерацию таблицы
(vla-put-RegenerateTableSuppressed vla-table: vlax-false)
valerik88 вне форума  
 
Автор темы   Непрочитано 14.12.2018, 14:45
#3
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Код:
[Выделить все]
 ;Отключаем регенерацию таблицы
    (vla-put-RegenerateTableSuppressed vla-table :vlax-true)

;Редактируем таблицу

;Включаем регенерацию таблицы
(vla-put-RegenerateTableSuppressed vla-table: vlax-false)
Большое спасибо! Это помогло!
tsetse вне форума  
 
Непрочитано 10.05.2019, 21:44
#4
Kombrero


 
Регистрация: 23.05.2018
Сообщений: 1


Цитата:
Сообщение от tsetse Посмотреть сообщение
Большое спасибо! Это помогло!
Как должен лисп работать? Немного не догоняю) Спс
Kombrero вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Ускорение при работе с таблицами

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему тормозит AutoCAD 20ХХ? Galchona AutoCAD 886 05.03.2024 16:32
При работе в редакторе блоков сбивается переключение режимов рисования Geor9e AutoCAD 5 23.06.2016 10:47
Заполнение, участвующее в работе каркаса, рассчитывают и конструируют как несущую стену Saha Железобетонные конструкции 22 24.03.2016 13:13
Премии на работе shvechkova Профессии и трудовые отношения 64 09.08.2013 12:36
Заметки по работе с AutoCAD и аналогами gesper AutoCAD 10 15.12.2012 20:00