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

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

Групирование строк в таблице

Ответ
Поиск в этой теме
Непрочитано 20.04.2012, 13:01 #1
Групирование строк в таблице
Positron
 
Регистрация: 25.06.2009
Сообщений: 147

Прошу помощи у программистов, нужен лисп для группировки подобных цифр в столбике таблицы. Во вложении подробное описание.
[IMG]http://s019.***********/i611/1204/be/f84f5d120fc5.jpg[/IMG]


Описание:
Исходные - у нас есть таблица, с несколькими колонками.
1. Требуется сгруппировать строки по заданной колонке.
2. Необходимо суммировать колонки в строк для каждой группы с удалением всех строк групп кроме 1й строки каждой группы.
3. Чистим таблицу от пустых строк.

P.S. И если можно чтоб по умолчанию делся лисп сразу 3 пункта, но можно было и указывать до 1го или до 2го ...
как бы запрос:
-"Делать 3 действия?:3" (только нажать Enter надо)
-"Делать 3 действия?:" ( соотвецтвено вводим другое значение если необходимо)

Вложения
Тип файла: dwg
DWG 2007
Пример 1.dwg (126.1 Кб, 2247 просмотров)


Последний раз редактировалось Кулик Алексей aka kpblc, 22.04.2012 в 17:29.
Просмотров: 8165
 
Непрочитано 20.04.2012, 13:24
#2
Олег (jr.)

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


Посмотри здесь
http://forums.augi.com/showthread.ph...=1#post1168693
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 20.04.2012, 14:34
#3
Positron


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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
там чуток нето, блоки и выкусывание атрибутов блока в таблицу.
Мне над сортировка и суммирование ... я просто хз как программно реализовать сие чудо
Positron вне форума  
 
Непрочитано 20.04.2012, 19:30
#4
Do$

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


Вот взять бы первое сообщение - и в FAQ. В качестве примера того, как надо описывать свои просьбы
Positron,
Do$ вне форума  
 
Автор темы   Непрочитано 20.04.2012, 20:10
#5
Positron


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Вот взять бы первое сообщение - и в FAQ. В качестве примера того, как надо описывать свои просьбы
Positron,
м... исходя из того сколько мне помогли на форуме могу посодействовать если надо
Positron вне форума  
 
Непрочитано 20.04.2012, 21:25
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


похожая тема
gomer вне форума  
 
Непрочитано 20.04.2012, 23:24
#7
Олег (jr.)

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


Попробуй вот это
Код:
[Выделить все]
;;--------------------------------------------------------------------;;
(defun sum-and-groupby_qty (lst num / count countdata elem match tmp)
  
(while lst
  
(setq tmp (car lst))

(setq match (vl-remove-if-not '(lambda(x)(eq (nth num x)(nth num tmp) ))

					  lst))

(setq count (apply '+ (mapcar 'atoi (mapcar 'last  match))))
  
(setq elem (subst (itoa count) (last tmp)  tmp))
  
(setq countdata (cons elem countdata))

(setq lst (vl-remove-if '(lambda(x)(eq (nth num x)(nth num tmp) ))

					  lst))
  )
(vl-sort countdata '(lambda(a b)(< (nth num a)(nth num b))))
  
  )
;;---------------------------------------------------------------------;;
(defun get-table-content (tbl / col cols data datum row rows start tmp)

  (setq	cols  (vla-get-columns tbl)
	rows  (vla-get-rows tbl)
	start rows
	)
  (if (eq :vlax-true (vla-get-titlesuppressed tbl))
    (setq rows (1- rows))
  )
  (if (eq :vlax-true (vla-get-headersuppressed tbl))
    (setq rows (1- rows))
  )
  (setq row (- start rows))
  (repeat rows
    (setq col 0)
    (repeat cols
      (setq datum (vla-gettext tbl row col))
      (setq tmp (cons datum tmp))
      (setq col (1+ col))
    )
    (setq data (cons (reverse tmp) data))
    (setq tmp  nil)
    (setq row  (1+ row))
    )

  (reverse data)
)
;;----------------------------   main part   --------------------------------;;


(defun C:GRPT  (/ cnt col cols data ent idx n num row rows tabledata tbl tmp)
  
(setq ent (entsel "\nSelect table :"))

(setq idx (getint "\nEnter a column number :"))

(setq idx (1- idx))

(setq tbl (vlax-ename->vla-object (car ent)))
  
 (setq tabledata (cddr (get-table-content tbl)))

(setq rows (vla-get-rows tbl))

(setq cols (vla-get-columns tbl))

(setq row 2)

(vla-put-regeneratetablesuppressed tbl :vlax-true)

(setq tabledata (sum-and-groupby_qty tabledata idx))

(setq n 0)

(setq data nil)

(foreach x  tabledata

  (setq x (append (list (itoa (+ n 1))) (cdr x)))

  (setq data (cons x data))

  (setq n (1+ n))
  )

(setq data (reverse data))

(setq row 2)

  (setq num (length data))
  
(setq cnt (+ rows num))
  
(repeat num

  (setq tmp (car data))
  
(vla-InsertRowsAndInherit tbl row (- row 1) 1)

  (setq col 0)

  (while (< col cols)

    (vla-settext tbl row col (nth col tmp))

    (setq col (1+ col))
    )
  (setq row (1+ row))

  (setq data (cdr data))
  )
   
  (setq rows (vla-get-rows tbl))
  
  (vla-deleterows tbl (+ num 2)(- rows num))
  
(vla-put-regeneratetablesuppressed tbl :vlax-false)

(princ)
  
  )

(prompt "\n\t---\tStart command with GRPT\t---\n")
(prin1)
 (or (vl-load-com))
(princ)
~'o'~

Последний раз редактировалось Олег (jr.), 20.04.2012 в 23:35.
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 21.04.2012, 15:22
#8
Positron


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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Попробуй вот это
Код:
[Выделить все]
;;--------------------------------------------------------------------;;
(defun sum-and-groupby_qty (lst num / count countdata elem match tmp)
  
(while lst
  
(setq tmp (car lst))

(setq match (vl-remove-if-not '(lambda(x)(eq (nth num x)(nth num tmp) ))

					  lst))

(setq count (apply '+ (mapcar 'atoi (mapcar 'last  match))))
  
(setq elem (subst (itoa count) (last tmp)  tmp))
  
(setq countdata (cons elem countdata))

(setq lst (vl-remove-if '(lambda(x)(eq (nth num x)(nth num tmp) ))

					  lst))
  )
(vl-sort countdata '(lambda(a b)(< (nth num a)(nth num b))))
  
  )
;;---------------------------------------------------------------------;;
(defun get-table-content (tbl / col cols data datum row rows start tmp)

  (setq	cols  (vla-get-columns tbl)
	rows  (vla-get-rows tbl)
	start rows
	)
  (if (eq :vlax-true (vla-get-titlesuppressed tbl))
    (setq rows (1- rows))
  )
  (if (eq :vlax-true (vla-get-headersuppressed tbl))
    (setq rows (1- rows))
  )
  (setq row (- start rows))
  (repeat rows
    (setq col 0)
    (repeat cols
      (setq datum (vla-gettext tbl row col))
      (setq tmp (cons datum tmp))
      (setq col (1+ col))
    )
    (setq data (cons (reverse tmp) data))
    (setq tmp  nil)
    (setq row  (1+ row))
    )

  (reverse data)
)
;;----------------------------   main part   --------------------------------;;


(defun C:GRPT  (/ cnt col cols data ent idx n num row rows tabledata tbl tmp)
  
(setq ent (entsel "\nSelect table :"))

(setq idx (getint "\nEnter a column number :"))

(setq idx (1- idx))

(setq tbl (vlax-ename->vla-object (car ent)))
  
 (setq tabledata (cddr (get-table-content tbl)))

(setq rows (vla-get-rows tbl))

(setq cols (vla-get-columns tbl))

(setq row 2)

(vla-put-regeneratetablesuppressed tbl :vlax-true)

(setq tabledata (sum-and-groupby_qty tabledata idx))

(setq n 0)

(setq data nil)

(foreach x  tabledata

  (setq x (append (list (itoa (+ n 1))) (cdr x)))

  (setq data (cons x data))

  (setq n (1+ n))
  )

(setq data (reverse data))

(setq row 2)

  (setq num (length data))
  
(setq cnt (+ rows num))
  
(repeat num

  (setq tmp (car data))
  
(vla-InsertRowsAndInherit tbl row (- row 1) 1)

  (setq col 0)

  (while (< col cols)

    (vla-settext tbl row col (nth col tmp))

    (setq col (1+ col))
    )
  (setq row (1+ row))

  (setq data (cdr data))
  )
   
  (setq rows (vla-get-rows tbl))
  
  (vla-deleterows tbl (+ num 2)(- rows num))
  
(vla-put-regeneratetablesuppressed tbl :vlax-false)

(princ)
  
  )

(prompt "\n\t---\tStart command with GRPT\t---\n")
(prin1)
 (or (vl-load-com))
(princ)
~'o'~


Огромное спасибо!
А можно ещё чуток усложнить, добавив в колонке цифры со значением типа "1000 x 500" и т.п. их по аналогии свисти в группы, а количество считать...
Во вложении пример
Вложения
Тип файла: dwg
DWG 2007
Пример-2.dwg (787.7 Кб, 1706 просмотров)
Positron вне форума  
 
Непрочитано 21.04.2012, 17:53
#9
Олег (jr.)

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


Попробуй заменить основную комманду:
Код:
[Выделить все]
;;------------------------------------------------------------------;;
(defun sum-and-groupby_qty (lst num / count countdata elem match tmp)
  
(while lst
  
(setq tmp (car lst))

(setq match (vl-remove-if-not '(lambda(x)(equal x tmp 0.001) )

					  lst))
(setq count (apply '+ (mapcar 'atoi (mapcar 'last  match))))
  
(setq elem (subst (itoa count) (last tmp)  tmp))
  
(setq countdata (cons elem countdata))

  (setq lst (vl-remove-if '(lambda(x)(equal  x tmp 0.001) )

					  lst))
  )
(vl-sort countdata '(lambda(a b)(< (nth 0 a)(nth 0 b))))
  
  )
;;---------------------------------------------------------------------;;
(defun get-table-content (tbl / col cols data datum row rows start tmp)

  (setq	cols  (vla-get-columns tbl)
	rows  (vla-get-rows tbl)
	start rows
	)
;;;  (if (eq :vlax-true (vla-get-titlesuppressed tbl))
;;;    (setq rows (1- rows))
;;;  )
;;;  (if (eq :vlax-true (vla-get-headersuppressed tbl))
;;;    (setq rows (1- rows))
;;;  )
  (setq row (- start rows))
  (repeat rows
    (setq col 0)
    (repeat cols
      (setq datum (vla-gettext tbl row col))
      (setq tmp (cons datum tmp))
      (setq col (1+ col))
    )
    (setq data (cons (reverse tmp) data))
    (setq tmp  nil)
    (setq row  (1+ row))
    )

  (reverse data)
)
;;----------------------------   main part   --------------------------------;;


(defun C:GRPT  (/   cnt col cols ent idx num row rows tabledata tbl tmp)
  
(setq ent (entsel "\nSelect table :"))

  (initget 6)
  
(setq idx (getint "\nEnter a column number <1>:"))

  (cond ((not idx)(setq idx 1)))

(setq idx (1- idx))

(setq tbl (vlax-ename->vla-object (car ent)))
  
 (setq tabledata (get-table-content tbl))

(setq rows (vla-get-rows tbl))

(setq cols (vla-get-columns tbl))

(setq cnt rows)

(vla-put-regeneratetablesuppressed tbl :vlax-true)

(setq tabledata (sum-and-groupby_qty tabledata idx))

(setq row 0)

(setq num (length tabledata))
  
  (vla-InsertRowsAndInherit tbl 0 0 num)
(repeat num

  (setq tmp (car tabledata))

  (setq col 0)

  (while (< col cols)

    (vla-settext tbl row col (nth col tmp))

    (setq col (1+ col))
    )
  (setq row (1+ row))

  (setq tabledata (cdr tabledata))
  )
   
  (setq rows (vla-get-rows tbl))
  
  (vla-deleterows tbl num cnt)

(vla-put-regeneratetablesuppressed tbl :vlax-false)

(princ)
  
  )

(prompt "\n\t---\tStart command with GRPT\t---\n")
(prin1)
 (or (vl-load-com))
(princ)
~'o'~

Последний раз редактировалось Олег (jr.), 22.04.2012 в 10:20.
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 21.04.2012, 19:42
#10
Positron


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


- выбрал таблицу
- 1 Enter по умолчанию 1 стоит,
- результат:

Command: GRPT
Select table :
Enter a column number <1>:
; error: no function definition: GET-TABLE-CONTENT

м... мож чо не так делаю?
Positron вне форума  
 
Непрочитано 21.04.2012, 20:43
1 | #11
Олег (jr.)

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


Цитата:
Сообщение от Positron Посмотреть сообщение
м... мож чо не так делаю?
Я же сказал - замени только основную команду GRPT,
остальные субрутины оставь как есть
Что непонятно?
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 21.04.2012, 21:54
#12
Positron


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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Я же сказал - замени только основную команду GRPT,
остальные субрутины оставь как есть
Что непонятно?
Сори, упустил... работает ток не все пощитало, вот пример до и после.
Вложения
Тип файла: dwg
DWG 2007
Пример-3.dwg (657.9 Кб, 1707 просмотров)
Positron вне форума  
 
Непрочитано 21.04.2012, 23:12
#13
Олег (jr.)

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


Цитата:
Сообщение от Positron Посмотреть сообщение
Сори, упустил... работает ток не все пощитало, вот пример до и после.
Смотри код в посте #9
(У тебя изменяются условия в таблице, поэтому сделал для рисунка Пример-3.dwg,
если опять будешь чего менять, тогда переделывай сам)

~'o'~

Последний раз редактировалось Олег (jr.), 22.04.2012 в 10:24.
Олег (jr.) вне форума  
 
Непрочитано 28.06.2012, 08:21
#14
ashas-


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


Здраствуйте, прошу прощения, если задаю вопрос не в той теме. Но мои поиски наиболее подходящей потерпели фиаско .
Вопрос. Где находится информация о том какие ячейки(столбцы) в таблице объединины, и как достать эту информацию с помощью автолиспа?
ashas- вне форума  
 
Непрочитано 28.06.2012, 10:28
1 | #15
Олег (jr.)

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


Смотри функцию:
Код:
[Выделить все]
(vla-IsMergedCell tableobj row col 'minRow 'maxRow 'minCol 'maxCol)
не забудь про одиночные кавычки

~'o'~

Последний раз редактировалось Олег (jr.), 28.06.2012 в 11:12.
Олег (jr.) вне форума  
 
Непрочитано 28.06.2012, 10:37
1 | #16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
не забудь про одиночные кавычки
только они нужны у последних 4 аргументов (у row и col - не надо).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.06.2012, 10:50
#17
ashas-


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


Олег (jr.), Дима_. Благодарю .
ashas- вне форума  
 
Автор темы   Непрочитано 03.05.2013, 18:06
#18
Positron


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


удалил дабы оформить луче и не отвекать других плохо оформленым вопросом, сильно извеняюсь

Последний раз редактировалось Positron, 03.05.2013 в 18:34.
Positron вне форума  
 
Непрочитано 03.05.2013, 18:22
#19
Олег (jr.)

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


Извини даже смотреть не буду,
не показал что должно получиться в результате
или ты думаешь остальные будут это делать за тебя?
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 03.05.2013, 18:26
#20
Positron


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


Прошу помощи в решении задачи.
Простите меня за неправильно заданный вопрос, постарался исправить, (грамматику не проверял), но суть задачи постарался написать максимально понятно (как себе представляю алгоритм). Пример во вложении.
Благодарю за поправку, буду расти над собой и не ленится.

P.S. Подскажите пожалуйста еще по поводу подачи вопроса, как лучше его оформлять кратко дабы не перегружать вопрос или описывать по каждому шагу чтоб было подробней?
Вложения
Тип файла: dwg
DWG 2007
Пример-6.dwg (227.2 Кб, 1428 просмотров)

Последний раз редактировалось Positron, 03.05.2013 в 19:32.
Positron вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Групирование строк в таблице

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка строк в таблице автокада Crane AutoCAD 4 02.02.2010 02:12
Размер текста в таблице, связанной с файлом Excel TheMouther AutoCAD 2 09.12.2009 08:19
Как удалять в таблице линии внутри столбцов или внутри строк? Elbrus AutoCAD 8 03.11.2009 10:59
Можно ли править количество строк в таблице? XYZ AutoCAD 5 05.05.2009 21:19