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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как найти самый "тяжелый" блок в файле

Как найти самый "тяжелый" блок в файле

Ответ
Поиск в этой теме
Непрочитано 03.02.2020, 20:37 #1
Как найти самый "тяжелый" блок в файле
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,143

Это просьба о коде, лучше на лиспе. (но не обязательно)
Я знаю лисп, но очень давно не кодил.


В результате частой борьбы с чужими файлами для их уменьшения, родилась такая задача:
Нужно найти в файле блоки, которые сильно увеличивают объем файла.
Предположительно - это блоки с наибольшим количеством элементов (встречались блоки с количеством 100000 и более)

Как я вижу алгоритм:
Среди всех блоков находим тот, что с наибольшим количеством элементов. Затем ищем его вставки в текущем пространстве. Отправляем их в текущий выбор, паралельно давая в комстроку его имя и количество элементов в нем.
Вставок может не быть в текущем пространстве, т.к. они - в других блоках. - пока эту задачу можно не решать.

-------------
я прошу админа не оправлять в "поиск исполнителя", там никто не увидит, а здесь у задачи может быть продолжение.
__________________
apel.fas
Просмотров: 1102
 
Непрочитано 03.02.2020, 20:42
#2
Кулик Алексей aka kpblc
Moderator

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


Ну есть же закрепленная тема как уменьшить объем dwg. И далеко не всегда блоки являются источником проблем.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.02.2020, 08:13
#3
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,138


Вот так вот, тупо и в лоб:
Код:
[Выделить все]
       App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
      if (acDoc == null) return;
      Db.Database acCurDb = acDoc.Database;
      Ed.Editor acEd = acDoc.Editor;

      using (Db.BlockTable bt = acCurDb.BlockTableId.Open(Db.OpenMode.ForRead) as Db.BlockTable)
      {
        foreach (Db.ObjectId btrId in bt)
        {
          using (Db.BlockTableRecord btr = btrId.Open(Db.OpenMode.ForRead) as Db.BlockTableRecord)
          {
            if (!btr.IsAnonymous)
            {
              int countEnt = 0;
              foreach (Db.ObjectId entId in btr)
                countEnt++;

              acEd.WriteMessage($"\nName:{btr.Name}, Amount entity:{countEnt}");
            }
          }
        }
      }
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 04.02.2020, 13:52
#4
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,143
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну есть же закрепленная тема как уменьшить объем dwg. И далеко не всегда блоки являются источником проблем.
я штудировал тему про объем. Там такого программного решения нет.
я не пытаюсь решить проблему объема "вообще", только такой частный случай, когда дело в количестве примитивов.

Цитата:
Сообщение от Boxa Посмотреть сообщение
Вот так вот, тупо и в лоб:
я совсем ничего в С#, но насколько я вижу это тупо перебор всех блоков и всех элементов в каждом из них. Боюсь, это очень медленно.
(пошел искать как запустить код на С# )
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 04.02.2020, 15:12
#5
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,138


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
но насколько я вижу это тупо перебор всех блоков и всех элементов в каждом из них. Боюсь, это очень медленно.
не всех, а только не анонимных блоков и не элементов, а ссылок на элементы. Время выполнения доли секунды... думаю это достаточно быстро.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 04.02.2020, 15:14
#6
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,166


Может, здесь есть что-то подходящее: https://forum.dwg.ru/showthread.php?t=147920
И здесь: https://forum.dwg.ru/showthread.php?t=153272
Там, правда, все блоки автоматом выписываются в файлы, и уже по весу файла можно увидеть, кто из них тяжелее.
__________________
Одно меня лишь радует - я это вижу сам! (С)

Последний раз редактировалось kp+, 04.02.2020 в 15:30.
kp+ вне форума  
 
Непрочитано 04.02.2020, 15:40
1 | #7
koMon


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


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
лучше на лиспе
всех блоков, модель
Код:
[Выделить все]
 
(setq most_items_block_number 1)
(vlax-for dwg_block (vla-get-blocks (vla-get-Activedocument (vlax-get-acad-object)))
	(if (and
			(not (zerop (vla-get-count dwg_block)))
			(> (vla-get-count dwg_block) most_items_block_number)
		)
			(setq most_items_block dwg_block
				  most_items_block_number (vla-get-count dwg_block)
			)
	)
)
(princ (strcat "\n" (vla-get-name most_items_block) " / " (itoa most_items_block_number)))
(sssetfirst nil (ssget "_x" (list (cons 0 "INSERT") (cons 2 (vla-get-name most_items_block)))))
koMon вне форума  
 
Непрочитано 04.02.2020, 19:39
| 1 #8
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,687
Отправить сообщение для doctorraz с помощью Skype™


Делаем дин блок просто прямоугольник и к нему таблицу параметров.. строк на 500 и столбцов на десять..
При наличии сотни таких блоков в чертеже, тормоза гарантированы, но геометрия блока всего ничего
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 04.02.2020, 22:05
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,732


Ну на .Net можно и до таблицы параметров докопаться для статистики)
Сергей812 вне форума  
 
Непрочитано 04.02.2020, 22:24
#10
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,687
Отправить сообщение для doctorraz с помощью Skype™


Конечно, просто обратил внимание, что не весом единым тормоза тормозят
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 05.02.2020, 12:26
#11
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,143
<phrase 1=


koMon, я добавил условие на текущую модель. Работает, и это прекрасно.

Код:
[Выделить все]
 
(defun c:test ()
  (setq most_items_block_number 1)
  (vlax-for dwg_block (vla-get-blocks
			(vla-get-Activedocument (vlax-get-acad-object))
		      )
    (if	(and
	  (not (zerop (vla-get-count dwg_block)))
	  (> (vla-get-count dwg_block) most_items_block_number)
	  (not (EQUAL dwg_block
		   (vla-get-ModelSpace
		     (vla-get-Activedocument (vlax-get-acad-object))
		   )
	       )
	  )
	)
      (setq most_items_block	    dwg_block
	    most_items_block_number (vla-get-count dwg_block)
      )
    )
  )
  count
  (princ (strcat "\n"
		 (vla-get-name most_items_block)
		 " / "
		 (itoa most_items_block_number)
	 )
  )
  (sssetfirst
    nil
    (ssget "_x"
	   (list (cons 0 "INSERT")
		 (cons 2 (vla-get-name most_items_block))
	   )
    )
  )
)
Но теперь, что прогнозировалось, нужно решить проблему отсутствия вставок в модели.
То есть нужно найти блоки, содержащие искомый и отправить их в выбор




Цитата:
Сообщение от doctorraz Посмотреть сообщение
Конечно, просто обратил внимание, что не весом единым тормоза тормозят
про проблему тормозов никто и не говорил. Но когда, в результате удаления из архитектурного файла парочки блоков "табуреток", его объем уменьшается с 17 до 3 мб - это сильно упрощает работу с файлами.

Проблема в том, что некоторые "табуретки" еще и не блоками...
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 05.02.2020, 13:51
#12
koMon


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


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
Но теперь, что прогнозировалось, нужно решить проблему отсутствия вставок в модели.
То есть нужно найти блоки, содержащие искомый и отправить их в выбор
вложения 1 уровня искомого в другие блоки в модели?
koMon вне форума  
 
Непрочитано 05.02.2020, 14:03
#13
Кулик Алексей aka kpblc
Moderator

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


В качестве иллюстрации: https://forums.autodesk.com/t5/semey...ov/m-p/9297184
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.02.2020, 14:20
#14
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,143
<phrase 1=


koMon,

Я алгоритм вижу так:

Поиск искомого блока (B0) во всех блоках файла - > получаем блоки B1
Поиск В1 во всех блоках файла -> получаем блоки B2
И так до тех пор, пока результат поиска nil

Для всех элементов списков В0, B1, B2... - поиск вставок в модели - и в текущий выбор.
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 10.02.2020, 10:44
1 | #15
koMon


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


Apelsinov,
сколько лет уже не кодишь?
Код:
[Выделить все]
 
;*****************************************************************************************************

(defun get_sset_number (in_sset)
	(if (null in_sset)
		0
		(sslength in_sset)
	)
)

;*****************************************************************************************************

(defun merge_ssets (in_sset sset_to_add)
	(while (and
				sset_to_add
				(not (zerop (sslength sset_to_add)))
			)
				(setq in_sset (ssadd (ssname sset_to_add 0) in_sset)
					  sset_to_add (ssdel (ssname sset_to_add 0) sset_to_add)
				)
	)
	in_sset
)

;*****************************************************************************************************

(defun make_block_item_list (in_block / items_list)
	(vlax-for block_item in_block
		(setq items_list (append items_list (list block_item)))
	)
)

;*****************************************************************************************************
 (defun c:search_for_mw_block ()
	(setq most_items_block_number 1
		  block_list '()
	)
	(vlax-for dwg_block (vla-get-blocks (vla-get-Activedocument (vlax-get-acad-object)))
		(if (null (wcmatch (vla-get-name dwg_block) "*`**"))
			(setq block_list (append block_list (list dwg_block)))
		)
	)
	(foreach dwg_block block_list
		(if (and
				(not (zerop (vla-get-count dwg_block)))
				(> (vla-get-count dwg_block) most_items_block_number)
			)
				(setq most_items_block dwg_block
					  most_items_block_number (vla-get-count dwg_block)
				)
		)
	)
	(setq most_items_block_list (list most_items_block))
	(princ (strcat "\n" (vla-get-name most_items_block) " / " (itoa most_items_block_number)))
	(if (null (setq block_sset (ssget "_x" (list (cons 0 "INSERT") (cons 2 (vla-get-name most_items_block))))))
		(setq block_sset (ssadd))
	)
	(princ (strcat " (" (itoa (sslength block_sset)) ")"))
	(setq block_list (vl-remove most_items_block block_list))
	(while most_items_block_list
		(setq most_items_block_list_temp '())
		(foreach most_items_block most_items_block_list
			(foreach block block_list
				(vl-some '(lambda (block_item)
								(and
									(= "AcDbBlockReference" (vla-get-objectname block_item))
									(= (vla-get-name most_items_block) (vla-get-name block_item))
									(setq aux_sset_number (get_sset_number (setq aux_sset (ssget "_x" (list (cons 0 "INSERT") (cons 2 (vla-get-name block)))))))
									(setq block_sset (merge_ssets block_sset aux_sset))
									(setq most_items_block_list_temp (append most_items_block_list_temp (list block)))
									(princ (strcat "\n" (vla-get-name most_items_block) " --> " (vla-get-name block) " (" (itoa aux_sset_number) ")"))
									(setq block_list (vl-remove block block_list))
								)
						  )
						  (make_block_item_list block)
				)
			)
			(setq most_items_block_list most_items_block_list_temp)
		)
	)
	(sssetfirst nil block_sset)
	(princ)
)

Последний раз редактировалось koMon, 10.02.2020 в 11:59.
koMon вне форума  
 
Непрочитано 10.02.2020, 10:53
#16
trir


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


я делаю так
Миниатюры
Нажмите на изображение для увеличения
Название: dxfsize2.PNG
Просмотров: 25
Размер:	60.2 Кб
ID:	222994  
trir вне форума  
 
Непрочитано 10.02.2020, 10:59
#17
koMon


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


trir, надеюсь ты не спортсмен...
Миниатюры
Нажмите на изображение для увеличения
Название: Trir.jpg
Просмотров: 22
Размер:	349.2 Кб
ID:	222998  
koMon вне форума  
 
Автор темы   Непрочитано 10.02.2020, 12:03
#18
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,143
<phrase 1=


Цитата:
Сообщение от koMon Посмотреть сообщение
сколько лет уже не кодишь?
Последние шесть лет почти ничего.

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

Код:
[Выделить все]
 (defun test (/	   F1	       F2	   F3
	       F4	   ACAD_BLOCKS ACAD_MSPACE ACAD_PSPACE
	       list_block  list_all_B  B0
	      )
;;;  (test)
  (setq	ACAD_BLOCKS
		    (vla-get-blocks
		      (vla-get-Activedocument (vlax-get-acad-object))
		    )
	ACAD_MSPACE (vla-get-ModelSpace
		      (vla-get-Activedocument (vlax-get-acad-object))
		    )
	ACAD_PSPACE (vla-get-paperSpace
		      (vla-get-Activedocument (vlax-get-acad-object))
		    )
  )
;;;  ***F1***
  (defun F1 (B0 / list_block dwg_block i)
;;;  Íàõîæäåíèå â áàçå âñåõ áëîêîâ, ñîäåðæàùèõ áëîê B0
;;;  âîç: ñïèñîê áëîêîâ
    (setq B0 (vla-get-Name B0))
    (vlax-for dwg_block	ACAD_BLOCKS
      (if (and
	    (not (zerop (vla-get-count dwg_block)))
	    (not (EQUAL dwg_block ACAD_MSPACE))
	    (not (EQUAL dwg_block ACAD_PSPACE))
	  )
	(vlax-for i dwg_block
	  (if (and
		(eq "AcDbBlockReference" (vla-get-ObjectName i))
		(eq B0 (vla-get-EffectiveName i))
	      )
	    (setq list_block (cons dwg_block list_block))
	  )
	)
      )
    )
    list_block
  )
;;;  ***F2***
  (defun F2 (/ most_items_block_number most_items_block dwg_block)
;;;  (F2)
;;;  Íàõîäèì ñàìûé áîëüøîé áëîê â áàçå
;;;  âîç: îáúåêò áëîêà
    (setq most_items_block_number 1)
    (vlax-for dwg_block	ACAD_BLOCKS
      (if (and
	    (not (zerop (vla-get-count dwg_block)))
	    (> (vla-get-count dwg_block) most_items_block_number)
	    (not (EQUAL dwg_block ACAD_MSPACE))
	  )
	(setq most_items_block	      dwg_block
	      most_items_block_number (vla-get-count dwg_block)
	)
      )
    )
    (princ (strcat "\n"
		   (vla-get-Name most_items_block)
		   " / "
		   (itoa most_items_block_number)
	   )
    )
    most_items_block
  )
;;;***F3***
;;;  -------------------------------------------------------------
  (defun F3 (lst / nabor i)
;;;âêëþ÷åíèå ðó÷åê ó îáúåêòîâ â ñïèñêå
;;;àðã:
;;;  lst - ñïèñîê vla îáúåêòîâ
;;;âîç: íå îïðåäåëåí
    (setq nabor (ssadd))
    (sssetfirst
      nil
      (foreach i lst
	(setq nabor (ssadd (vlax-vla-object->ename i) nabor))
      )
    )
  )
;;;---------------------------------------------------------------
  (defun F4 (B0 / list_block)
    (setq B0 (vla-get-Name B0))
    (vlax-for i	ACAD_MSPACE
      (if (and
	    (eq "AcDbBlockReference" (vla-get-ObjectName i))
	    (eq B0 (vla-get-EffectiveName i))
	  )
	(setq list_block (cons i list_block))
      )
    )
    list_block
  )
;;;  --------------------------------------------------------------
  (setq B0 (F2))
  (if (and B0
	   (PRINC "\n\Íàéäåí áëîê ñ íàèáîëüøèì êîëè÷åñòâîì ýëåìåíòîâ")
	   (setq list_block (list B0))
      )
    (while
      (setq list_block
	     (apply 'append
		    (mapcar (FUNCTION (lambda (i) (F1 i))) list_block)
	     )
      )
       (setq list_all_B (cons list_block list_all_B))
    )
  )
  (if (and list_all_B
	   (setq list_all_B (cons B0 (apply 'append list_all_B)))
	   (setq list_all_B
		  (mapcar (FUNCTION (lambda (i) (F4 i))) list_all_B)
	   )
	   (PRINC "\nÁóäóò âûäåëåíû áëîêè, êîòîðûå ñîäåðæàò íàéäåíûé")
      )
    (setq list_all_B (apply 'append list_all_B))
  )
  (cond	(list_all_B (F3 list_all_B))
	(B0 (F3 (F4 B0)))
  )
)
__________________
apel.fas
Apelsinov вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как найти самый "тяжелый" блок в файле

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти и удалить 3D тело на в файле 2D чертежа reddysss Программирование 17 15.12.2016 09:04
Блок эдитор открывает несколько минут. Red Nova Динамические блоки 8 02.12.2016 17:59
Помогите найти компактный сортамент на самый распространеный металлопрокат, версию для печати) £όᶌᶒ Поиск литературы, чертежей, моделей и прочих материалов 0 11.10.2015 08:34
Помогите понять и найти ошибку в файле. Nekromanser Лира / Лира-САПР 14 26.11.2011 20:31
На каком лайоуте находится выбранный блок? DonVik Программирование 30 29.08.2008 17:20