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

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

Объединение таблиц

Ответ
Поиск в этой теме
Непрочитано 11.08.2016, 11:45 #1
Объединение таблиц
ElectricSib
 
Регистрация: 03.11.2015
Сообщений: 37

В dwg файле есть много однотипных автокадовских таблиц кабельного журнала. Т.е. скажем 20 таблиц, состоящих из 5 колонок, количество строк и их содержимое различаются.

Есть ли в природе скрипт, позволяющий объединить их вертикально в одну? Т.е. чтобы получилась одна большая таблица из этих 5 колонок.

Конечно, можно попробовать руками или возиться с объединением через экспорт в Excel, но хочется автоматизировать этот процесс.

Последний раз редактировалось ElectricSib, 12.08.2016 в 07:22.
Просмотров: 17575
 
Непрочитано 11.08.2016, 12:06
#2
Кулик Алексей aka kpblc
Moderator

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


И в чем собственно трудность? Читаешь таблицы, получаешь оттуда данные, фильтруешь как надо, объединяешь - и выводишь в результирующую таблицу. В каком конкретно месте проблема? И где код?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.08.2016, 12:22
#3
ElectricSib


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И в чем собственно трудность? Читаешь таблицы, получаешь оттуда данные, фильтруешь как надо, объединяешь - и выводишь в результирующую таблицу. В каком конкретно месте проблема? И где код?
Проблема в том, что я не программист и лиспом не владею. Возможно такой скрипт уже существует и известен кому-либо из пользователей.
ElectricSib вне форума  
 
Непрочитано 11.08.2016, 13:43
#4
Кулик Алексей aka kpblc
Moderator

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


Тогда тема точно не в том разделе - либо в "Поиск исполнителей", либо в "Поиск литературы"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.08.2016, 22:33
#5
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


А действительно ли надо их объединять? Для какой цели, интересно? Может, достаточно просто совместить обычным переносом верх второй с низом первой (и так далее), удалив шапки у всех, кроме первой?
skkkk вне форума  
 
Непрочитано 11.08.2016, 22:46
#6
Кулик Алексей aka kpblc
Moderator

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


Или выгнать в Excel, там обработать, и обратно в чертеж.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.08.2016, 04:29
#7
ElectricSib


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Или выгнать в Excel, там обработать, и обратно в чертеж.
Этот вариант я уже упоминал в шапке темы. Слишком долго экспортировать каждую из десятков таблиц в Excel, затем вручную копировать их там в один файл, чтобы посчитать некоторые суммарные показатели. Я предполагал, что есть скрипты наподобие тех, что объединяют несколько text в MText, затем итоговую таблицу уже можно было бы экспортировать в Excel для подсчетов. Похоже, такой скрипт есть в ToolPack от Dotsoft.com, но он оказался небесплатным.

Последний раз редактировалось ElectricSib, 12.08.2016 в 08:07.
ElectricSib вне форума  
 
Автор темы   Непрочитано 12.08.2016, 07:35
#8
ElectricSib


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


В общем, я нашел на англоязычном форуме нужный скрипт, хоть и с тормозами, но работает:

Код:
[Выделить все]
(defun C:MTB  (/ col cols1 cols2 lastrow response rows1
	       rows2 ss start tblobj1 tblobj2 x)
  (or (vl-load-com))
  (princ "\n*** Select both tables ***")
  (if (and (setq ss (ssget (list (cons 0 "ACAD_TABLE"))))
	   (equal 2 (sslength ss)))
      (progn

  (setq tblobj1 (vlax-ename->vla-object (ssname ss 0))
	rows1 (vla-get-rows tblobj1)
	tblobj2 (vlax-ename->vla-object (ssname ss 1))
	rows2	(vla-get-rows tblobj2)
	lastrow	rows2
	cols1 (vla-get-columns tblobj1)
	cols2 (vla-get-columns tblobj2)
	)
  (if (not (equal cols1 cols2))
    (progn
      (alert
	"There is not equivalent number of rows found. Error...")
      (exit)
      (princ)
      )
    )
  (if (eq :vlax-false (vla-get-titlesuppressed tblobj2))
      (progn
      (setq lastrow (1- lastrow))
      (setq start 1))
    (setq start 0))
  (if (eq :vlax-false (vla-get-headersuppressed tblobj2))
    (progn
      (setq lastrow (1- lastrow))
      (setq start 2))
    (setq start 0))
  (vla-put-RegenerateTableSuppressed tblobj1 :vlax-false)
  (vla-insertrows
    tblobj1
    rows1
    (vla-getrowheight tblobj1 (1- rows1))
    lastrow)

  (repeat lastrow
    (setq col 0)
    (repeat cols1
      (vla-settext
	tblobj1
	rows1
	col
	(vla-gettext tblobj2 start col))
      (setq col (1+ col)))
    (setq start (1+ start))
    (setq rows1 (1+ rows1)))
  (vla-put-RegenerateTableSuppressed tblobj1 :vlax-true)
  (initget 1 "Yes No")
  (setq	response (getkword
		   "\nAre you want to delete the second table [Y]es or [N]o <Y>: "))
  (if (eq "Yes" response)
    (vla-delete tblobj2)
    )
  (mapcar (function (lambda (x)
		      (vl-catch-all-apply
			(function (lambda ()
				    (vlax-release-object x))))))
	  (list tblobj2 tblobj1)
	  )
)
  (alert
	"Or nothing selected or selected more than 2 tables. Error...")
  )
  (princ)
  )
(princ "\n	>> Start command with MTB to merge tables")
(princ)
;;=====================================================;;


Из минусов - он не сохраняет объединение ячеек добавляемой таблицы, но это не критично.
Кроме того, скрипт позволяет объединять только 2 таблицы, насколько сильно нужно изменить его код, чтобы можно было объединять несколько таблиц, выбрав их мышкой?
Вложения
Тип файла: lsp MERGE TWO TABLES.LSP (1.9 Кб, 221 просмотров)

Последний раз редактировалось ElectricSib, 16.08.2016 в 04:58.
ElectricSib вне форума  
 
Непрочитано 12.08.2016, 12:43
1 | #9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от ElectricSib Посмотреть сообщение
насколько сильно нужно изменить его код, чтобы можно было объединять несколько таблиц, выбрав их мышкой?
Не сильно
Код:
[Выделить все]
(defun C:MTB3  (/ col cols1 cols2 lastrow response rows1
	       rows2 ss start tblobj1 tblobj2 x)
  (vl-load-com)
  (princ "\n*** Select First table ***")
  (if (setq ss (ssget "_:S:E:L" '((0 . "ACAD_TABLE"))))
      (setq tblobj1 (vlax-ename->vla-object (ssname ss 0)))
    )
 (if (and
          tblobj1
          (princ "\n*** Select other tables ***")
          (setq ss nil ss (ssget "_:L" '((0 . "ACAD_TABLE"))))
          (or (ssdel (vlax-vla-object->ename tblobj1) ss) t)
          (> (sslength ss) 0)
	   )
      (progn
       (foreach tblobj2  (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
         (setq
           rows1 (vla-get-rows tblobj1)
           tblobj2 (vlax-ename->vla-object tblobj2)
           rows2	(vla-get-rows tblobj2)
           lastrow	rows2
           cols1 (vla-get-columns tblobj1)
           cols2 (vla-get-columns tblobj2)
           )
         (if (not (equal cols1 cols2))
           (progn
             (alert "There is not equivalent number of rows found. Error...")
             (exit)
             (princ)
             )
           )
  (if (eq :vlax-false (vla-get-titlesuppressed tblobj2))
      (progn
      (setq lastrow (1- lastrow))
      (setq start 1))
    (setq start 0))
  (if (eq :vlax-false (vla-get-headersuppressed tblobj2))
    (progn
      (setq lastrow (1- lastrow))
      (setq start 2))
    (setq start 0))
  (vla-put-RegenerateTableSuppressed tblobj1 :vlax-false)
  (vla-insertrows
    tblobj1
    rows1
    (vla-getrowheight tblobj1 (1- rows1))
    lastrow)

  (repeat lastrow
    (setq col 0)
    (repeat cols1
      (cond
	((eq (vla-GetCellType tblobj2 start col) acBlockCell)
	 (vla-SetCellType tblobj1 rows1 col acBlockCell)
 	 (vla-setcellalignment tblobj1 rows1 col (vla-getcellalignment tblobj2 start col))
	 (vla-setblockscale tblobj1 rows1 col (vla-getblockscale tblobj2 start col))
	 (if
	   (and
	     (wcmatch (getenv "PROCESSOR_ARCHITECTURE") "*64*")
	     (vlax-method-applicable-p tblobj1 'getblocktablerecordid32)
	     )
	 (vla-setblocktablerecordid32
	   tblobj1
	   rows1
	   col
	   (vla-getblocktablerecordid32 tblobj2 start col)
	   :vlax-false
	   )
	   (vla-setblocktablerecordid
	   tblobj1
	   rows1
	   col
	   (vla-getblocktablerecordid tblobj2 start col)
	   :vlax-false
	   )
	   )
	 )
	((eq (vla-GetCellType tblobj2 start col) acTextCell)
	 (vla-setcellalignment tblobj1 rows1 col (vla-getcellalignment tblobj2 start col))
	 (vla-SetCellTextHeight tblobj1 rows1 col (vla-GetCellTextHeight tblobj2 start col))
	 (vla-SetCellTextStyle tblobj1 rows1 col (vla-GetCellTextStyle tblobj2 start col))
	 (vla-settext
	tblobj1
	rows1
	col
	(vla-gettext tblobj2 start col))
	 )
	(t nil)
	)
      (setq col (1+ col)))
    (setq start (1+ start))
    (setq rows1 (1+ rows1)))
  (vla-put-RegenerateTableSuppressed tblobj1 :vlax-true)
         )
  (initget 1 "Yes No")
  (setq	response (getkword
		   "\nAre you want to delete the tables [Yes/No] <Yes>: "))
  (if (eq "Yes" response)
    (mapcar 'vla-delete (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
    )
;;;  (mapcar (function (lambda (x)
;;;		      (vl-catch-all-apply
;;;			(function (lambda ()
;;;				    (vlax-release-object x))))))
;;;	  (list tblobj2 tblobj1)
;;;	  )
)
  (alert
	"nothing selected or selected less than 2 tables. Error...")
  )
  (princ)
  )
(princ "\n	>> Start command with MTB3 to merge tables")
(princ)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 16.08.2016 в 10:54. Причина: новая версия
VVA вне форума  
 
Автор темы   Непрочитано 15.08.2016, 11:36
#10
ElectricSib


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Не сильно
Спасибо, но все же модифицированный Вами скрипт не работает. При попытке выделить несколько таблиц возвращает ошибку "Or nothing selected or selected more than 2 tables. Error...".
P.S. теперь возвращает то же предупреждение при любой попытке объединить даже 2 таблицы (исходную и дополнительную).
ElectricSib вне форума  
 
Непрочитано 15.08.2016, 13:06
1 | #11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от ElectricSib Посмотреть сообщение
При попытке выделить несколько таблиц возвращает ошибку "Or nothing selected or selected more than 2 tables. Error...".
Сообщение осталось от прежней версии. Изменил #9. Проверил в Автокаде 2009 - у меня все сработало
Там 2 выбора. Первый запрос - выбор 1-й таблицы, к ней будут добавляться строки. 2-й запрос -выбор добавляемых таблиц. Можно выбирать любым способом.
На всякий случай изменил имя команды
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 15.08.2016, 14:58
#12
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Первую таблицу надо выбирать дважды. Однако, вставляются только пустые строки, без содержимого.
Profan вне форума  
 
Непрочитано 15.08.2016, 18:22
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Profan Посмотреть сообщение
Первую таблицу надо выбирать дважды.
Был косяк. Исправил см. #9

Цитата:
Сообщение от Profan Посмотреть сообщение
Однако, вставляются только пустые строки, без содержимого.
У меня вставляются. Проверял на Автокад 2009. Озвучь версию Автокада и приложи пример с таблицами для теста
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 15.08.2016, 19:40
#14
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Порофиль AutoCAD из AutoCAD MEP 2013.
Вложения
Тип файла: dwg
DWG 2013
Таблицы блоков.dwg (64.2 Кб, 105 просмотров)
Profan вне форума  
 
Автор темы   Непрочитано 16.08.2016, 05:27
#15
ElectricSib


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


Цитата:
Сообщение от Profan Посмотреть сообщение
Порофиль AutoCAD из AutoCAD MEP 2013.
У меня в ACAD2013 новая версия скрипта корректно работает с обычными таблицами. Но у Вас блоки внутри таблицы, в Вашем файле у меня копируется все (мелким шрифтом из-за стиля), кроме блоков.

Последний раз редактировалось ElectricSib, 16.08.2016 в 05:34.
ElectricSib вне форума  
 
Непрочитано 16.08.2016, 09:00
#16
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Так в том-то и дело. У меня (у моих подопечных) может быть до 12 таблиц в зависимости от количества видов связи СС. Естественно, с блоками. Вот и хотелось эти таблицы объединить.
Profan вне форума  
 
Непрочитано 16.08.2016, 10:55
1 | #17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Profan Посмотреть сообщение
Естественно, с блоками. Вот и хотелось эти таблицы объединить
Цитата:
Сообщение от ElectricSib Посмотреть сообщение
У меня в ACAD2013 новая версия скрипта корректно работает с обычными таблицами. Но у Вас блоки внутри таблицы, в Вашем файле у меня копируется все (мелким шрифтом из-за стиля), кроме блоков.
Обновил #9
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.08.2016, 12:05
#18
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Теперь все работает. Спасибо.
............
Только почему-то в суммарной таблице невозможно редактировать текст в ячейках.

Последний раз редактировалось Profan, 16.08.2016 в 12:34.
Profan вне форума  
 
Непрочитано 16.08.2016, 13:04
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Profan Посмотреть сообщение
Только почему-то в суммарной таблице невозможно редактировать текст в ячейках
И удалить строки. Я это заметил. Причину понять не смог. Не проверял, попробуй сохранить dwg и открыть снова.
Замечал, что если править с помощью activeX (например имена приаттаченных файлов), то они корректно отражаются после сохранения и повторного открытия файла
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.08.2016, 17:18
#20
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Если сохранить файл и заново открыть, то таблица редактируется.
Profan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Объединение таблиц

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос VBA Excel для извлечения таблиц из линий, полилиний, текста из DWG файлов в Excel с помощью NanoCAD/AutoCAD JZY Готовые программы 8 14.07.2016 06:31
VBA. Очень медленная обработка таблиц автокада. art_rrc Программирование 8 02.10.2014 19:57
Объединение ячеек таблиц игорёк Программирование 3 20.08.2008 13:47