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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение ширины столбцов в таблице по данным из нее

Изменение ширины столбцов в таблице по данным из нее

Ответ
Поиск в этой теме
Непрочитано 30.01.2013, 03:49 #1
Изменение ширины столбцов в таблице по данным из нее
EfiRoMan
 
Проектирование систем ТГВ
 
Хабаровск
Регистрация: 30.01.2013
Сообщений: 17

Здравствуйте!

Вопрос мой достаточно прост и полностью изложен в теме, но вот решения я самостоятельно найти не смог, как и ответ на него на форуме...
Буду очень признателен "Кулик Алексей aka kpblc", если он уделит мне минутку внимания и выложит код на lispe, который решит мою задачку:
В пространстве модели есть готовая таблица, заполненная связанными данными из Exclel... столбцов больше 100, в одной из строк даже есть необходимая ширина столбцов. Требуется задать ширину столбцов в соответствии с данными из строки этой таблицы или внешнего файла (txt, csv, xls...). Заранее большое спасибо за помощь!

P.S. С лиспом я вообще не знаком и ни разу его не применял, т.к. хватало ранее дин. блоков, таблиц и связи с xls, полей, експресс тулсов и прочих доступных инструментов для автоматизации своей работы, а вот в этом вопросе, на мой взгляд, кроме лиспа вариантов нет

Добавлено:
http://forum.dwg.ru/showthread.php?t=73217 - нашел похожую тему (у меня задача чуть более конкретна), но лисп, который там приведен у меня почему-то не работает - все сделал по инструкции по применению и все равно пишет:
Команда: (set-width-columns-table (list '(1 30) '(4 50)))
; ошибка: no function definition: SET-WIDTH-COLUMNS-TABLE

Последний раз редактировалось EfiRoMan, 30.01.2013 в 06:36. Причина: найдена похожая тема, но не совсем то и не работает
Просмотров: 4729
 
Автор темы   Непрочитано 31.01.2013, 09:15
#2
EfiRoMan

Проектирование систем ТГВ
 
Регистрация: 30.01.2013
Хабаровск
Сообщений: 17
Отправить сообщение для EfiRoMan с помощью Skype™


Все-таки удалось найти начало куска необходимого мне кода:
(defun c:ResizeTable()
(vl-load-com)
(setq tbl (vlax-ename->vla-object(car(entsel))))
(vla-setcolumnwidth tbl 0 10.0)
(vla-setcolumnwidth tbl 1 20.0)
...НО! Хотелось бы, что бы назначение ширины столбца происходило в цикле и ширина бралась из строки этой таблицы (она уже связана с Excel и в ней есть все, что надо). Также в случае, если эта ширина меньше определенного значения (например 7 мм), необходимо перед изменением ширины столбца уменьшить в определенных его ячейках размер шрифта например до 1мм. Помогите пожалуйста! Не могу с лету разобраться в этом языке (владею только VBA для Excel и то лишь в своих прикладных целях)
EfiRoMan вне форума  
 
Непрочитано 31.01.2013, 09:35
#3
Кулик Алексей aka kpblc
Moderator

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


Без особых проверок:
Код:
[Выделить все]
 (vl-load-com)

(defun test (row / _kpblc-error-catch _kpblc-conv-value-to-real adoc ent)
            ;|
row - номер строки, из которой брать ширины. nil -> последняя строка
|;

  (defun _kpblc-conv-value-to-real (value /)
                                   ;|
*    конвертация значения в число двойной точности. Для VLA-объектов возвращается nil.
*    Точечные списки не обрабатываются.
|;
    (cond
      ((= (type value) 'real) value)
      ((= (type value) 'int) (* value 1.))
      ((not value) 0.)
      ((= (type value) 'str)
       (atof value)
       )
      (t (atof (vl-prin1-to-string value)))
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-error-catch (protected-function
                             on-error-function
                             /
                             catch_error_result
                             )
                            ;|
*** Функция взята из книжной версии ruCAD'a без каких бы то ни было переделок,
*** кроме переименования.
*    Оболочка отлова ошибок.
*    Параметры вызова:
*	protected-function	- "защищаемая" функция
*	on-error-function	- функция, выполняемая в случае ошибки
|;
    (setq catch_error_result (vl-catch-all-apply protected-function))
    (if (and (vl-catch-all-error-p catch_error_result)
             on-error-function
             ) ;_ end of and
      (apply on-error-function
             (list (vl-catch-all-error-message catch_error_result))
             ) ;_ end of apply
      catch_error_result
      ) ;_ end of if
    ) ;_ end of defun

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (= (type
                (setq ent (vl-catch-all-apply (function (lambda () (car (entsel "\nSelect table <Cancel> : "))))))
                ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "ACAD_TABLE")
           ) ;_ end of and
    (progn
      (setq ent (vlax-ename->vla-object ent))
      (_kpblc-error-catch
        (function
          (lambda (/ col widths)
            (vla-put-regeneratetablesuppressed ent :vlax-true)
            (setq row (if row
                        (1- row)
                        (1- (vla-get-rows ent))
                        ) ;_ end of if
                  col -1
                  ) ;_ end of setq
            (while (< (setq col (1+ col)) (vla-get-columns ent))
              (vla-setcolumnwidth ent
                                  col
                                  (_kpblc-conv-value-to-real (vlax-variant-value (vla-getcellvalue ent row col)))
                                  ) ;_ end of vla-put-ColumnWidth
              ) ;_ end of while
            ) ;_ end of lambda
          ) ;_ end of function
        '(lambda (x) (princ (strcat "\nError : " x)))
        ) ;_ end of _kpblc-error-catch
      (vla-put-regeneratetablesuppressed ent :vlax-false)
      (vla-update ent)
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
---
Перепутал пару параметров. Исправил.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 31.01.2013 в 09:43.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.01.2013, 13:17
#4
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Как его использовать?
Alexeipost вне форума  
 
Непрочитано 31.01.2013, 15:31
#5
Кулик Алексей aka kpblc
Moderator

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


Лисп загружать умеешь? Если да, то вызов (test НомерСтрокиГдеУказаныШирины)
Например: (test 3) ; ширины столбцов указаны в 3-й строке
(test nil) ; ширины столбцов указаны в последней строке
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.01.2013, 15:53
#6
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


искал в ЛИСПе что-нибудь типа defun c: не нашел и потерялся сам
Alexeipost вне форума  
 
Непрочитано 31.01.2013, 17:39
#7
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/pub/9
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.02.2013, 04:53
#8
EfiRoMan

Проектирование систем ТГВ
 
Регистрация: 30.01.2013
Хабаровск
Сообщений: 17
Отправить сообщение для EfiRoMan с помощью Skype™


Большое спасибо за программку! Но у меня этот лисп даже загружаться не хочет... После выхода из окна загрузки приложений в командной строке пишет следующее:
; ошибка: неверный синтаксис COND: (14 ((= (TYPE VALUE) (QUOTE REAL))
VALUE) 15 ((= (TYPE VALUE) (QUOTE INT)) (* VALUE 1.0)) 16 ((NOT VALUE) 0.0) 17
((= (TYPE VALUE) (QUOTE STR)) 18 (ATOF VALUE) 19) 20 (T (ATOF
(VL-PRIN1-TO-STRING VALUE))) 21)

Попробовал закомментировать данный кусок лиспа, тогда уже другая ошибка:
; ошибка: неверный элемент в списке аргументов: 25

Естественно, в результате, лисп и не работает то же самое происходило и с лиспом по ссылке в первом посте:
; ошибка: слишком много аргументов: (IF (AND NBR 8 (NOT
(VL-CATCH-ALL-ERROR-P NBR)) 9) 10 (FOREACH TABL (MAPCAR (QUOTE
vlax-ename->vla-object) (VL-REMOVE-IF (QUOTE LISTP) (MAPCAR (QUOTE CADR)
(SSNAMEX NBR)))) 11 (vla-put-RegenerateTableSuppressed TABL :vlax-true) 12
(FOREACH ITEM LST_WIDTH_COLUMNS 13 (IF (AND (>= (CAR ITEM) 0) 14 (< (CAR ITEM)
(vla-get-Columns TABL)) 15) 16 (vla-SetColumnWidth TABL (CAR ITEM) (CADR ITEM))
17) 18) 19 (vla-put-RegenerateTableSuppressed TABL :vlax-false) 20) 21)
А также, к сожалению, я не разобрался в приведенном коде (язык намного сложнее VBA на мой взгляд)
EfiRoMan вне форума  
 
Непрочитано 01.02.2013, 07:12
#9
Кулик Алексей aka kpblc
Moderator

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


Пример в студию. И образец вызова.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.02.2013, 07:33
#10
EfiRoMan

Проектирование систем ТГВ
 
Регистрация: 30.01.2013
Хабаровск
Сообщений: 17
Отправить сообщение для EfiRoMan с помощью Skype™


Алексей, пример в сообщении №3, до вызова и дела не доходит, т.к. она просто не загружается, а пишет в командной строке сообщения об ошибке (например еще до редактирования первых строк лиспа, остальные примеры - после аккуратных манипуляций):
Команда: _appload test.lsp успешно загружено.
Команда: ; ошибка: синтаксическая ошибка
Т.е. вначале лисп загружается, но потом находит ошибку в коде и выгружается (при повторном заходе в окно загрузки приложений этого лиспа в списке загруженных нет), а код последнего примера здесь:
http://forum.dwg.ru/showpost.php?p=812361&postcount=4
EfiRoMan вне форума  
 
Непрочитано 01.02.2013, 07:43
#11
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Глупость конечно может быть, но если нажать "[выделить все]" и потом вставить в lsp файл, то копируются номера строк. Может из-за этого не работает?
Alexeipost вне форума  
 
Автор темы   Непрочитано 01.02.2013, 07:49
#12
EfiRoMan

Проектирование систем ТГВ
 
Регистрация: 30.01.2013
Хабаровск
Сообщений: 17
Отправить сообщение для EfiRoMan с помощью Skype™


Alexeipost, спасибо!!! Я - балбес ((( Действительно вся проблема в этих цифрах )))
Кулик Алексей aka kpblc, благодарю за помощь! Если бы еще смог в коде разобраться и сделать изменение размера шрифта в зависимости от ширины столбца - было бы просто шикарно! Но мне итак очень помогли!
EfiRoMan вне форума  
 
Непрочитано 01.02.2013, 13:15
#13
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Попробуй из моих старых запасов маленько переделал по быстрому
особо не проверял
Код:
[Выделить все]
;; Set column widths of table relative to cell content 		;;
;; written by Fatty T.O.H. (c) 2007 * all rights released	;;
;; edited 8/20/08 
;; edited 11/26/10 
;; last edited 2/1/13 

;;___________________________________________									;;

(defun C:TBFIX(/ atable col cols column colwidth i j  rows swap
	         tabledata tbset tmp txt txtheight widths x)
  
;; select single table
(if (setq tbset (ssget "+.:E:S" '((0 . "acad_table"))))
  (progn

    (setq atable (ssname tbset 0)
	  atable (vlax-ename->vla-object atable)
	  rows	 (vla-get-rows atable)
	  cols	 (vla-get-columns atable)
	  i	 -1)

    ;;get table contents
    (setq tabledata nil)
    (repeat rows
      (setq i (1+ i)
	    j -1)
      (repeat cols
	(setq j (1+ j))
	(setq txt (vla-gettext atable i j))
	(setq tmp (cons txt tmp)))
      (setq tabledata (append tabledata (list (reverse tmp))))
      (setq tmp nil))
    ;; get maximun text height
    (setq txtheight (apply 'max
			   (mapcar '(lambda (x)
				      (vl-catch-all-apply 'vla-gettextheight (list atable x)))
				   '(0 1 2 4))))
    ;; calculate column widths : 
    (setq swap	 tabledata
	  widths nil)
    
    (while (car swap)
      (setq column (mapcar 'car swap))
      (setq colwidth (* 1.2(apply 'max (mapcar 'strlen column)) txtheight))
      (setq widths (cons colwidth widths))
      (setq swap (mapcar 'cdr swap)))
    ;; reverse list of width
    (setq widths (reverse widths))
    ;; set recalculated column widths
    (vla-put-regeneratetablesuppressed atable :vlax-true)
    (setq col 0)
    (foreach wid  widths
      (vla-setcolumnwidth atable col wid)
      (setq col (1+ col))
      )
    (vla-put-regeneratetablesuppressed atable :vlax-false)
    )
  )
    (princ)
    )
  (princ "\n\t---\tStart command with TBFIX\t---")
(prin1)
(or(vl-load-com)(princ))

Последний раз редактировалось Олег (jr.), 01.02.2013 в 14:22.
Олег (jr.) вне форума  
 
Непрочитано 01.02.2013, 14:06
#14
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от EfiRoMan Посмотреть сообщение
Алексей, пример в сообщении №3, до вызова и дела не доходит, т.к. она просто не загружается, а пишет в командной строке сообщения об ошибке (например еще до редактирования первых строк лиспа, остальные примеры - после аккуратных манипуляций):
Команда: _appload test.lsp успешно загружено.
Команда: ; ошибка: синтаксическая ошибка
Т.е. вначале лисп загружается, но потом находит ошибку в коде и выгружается (при повторном заходе в окно загрузки приложений этого лиспа в списке загруженных нет), а код последнего примера здесь:
http://forum.dwg.ru/showpost.php?p=812361&postcount=4
Я просил пример dwg...
P.S. Как загружать код с dwg.ru: https://www.youtube.com/watch?v=wFKc6EfRofo
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение ширины столбцов в таблице по данным из нее

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое задание ширины столбцов таблицы, shartal Программирование 7 23.05.2014 13:40
Изменение ширины текста многострочного атрибута Алексий31 AutoCAD 4 21.07.2011 14:00
Как удалять в таблице линии внутри столбцов или внутри строк? Elbrus AutoCAD 8 03.11.2009 10:59
Изменение размера в эскизе и таблице. Arkanoid AutoCAD 9 14.05.2009 08:46