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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Выгрузить XData в csv (txt)

Выгрузить XData в csv (txt)

Ответ
Поиск в этой теме
Непрочитано 10.07.2021, 22:20
Выгрузить XData в csv (txt)
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,031

Пытался найти экспорт содержания XData в csv, txt.
Нашел лисп Renseignements-XDATA.lsp с командой XdataXL, выгружающей XData в csv для указанных объектов.
И нашел лисп WXD_XData-Excel.lsp, команда WXD, выгружающий указанный Application в открывающийся Excel для указанных объектов.
Но оба выгружают не все из XData. Пропускают какие-то данные, выгружают, допустим, из "Code 1010, 3 real numbers" в нечитаемом виде.

Можно ли какой-то из этих лиспов модифицировать, чтобы выгружал в csv все данные из Application?
Лучше всего для выделенных до/после объектов в духе ATTOUT из Express: с HANDLE объектов, с названиями колонок из типов данных ("ASCII_string", "3_real_numbers", "Real_number", "16-bit_integer" и т.п.).
Можно, допустим, без выбора Application - выгружать все XData у выбранных объектов, каждый в свой csv с названием из названия dwg&appname.

Вложения
Тип файла: lsp Renseignements-XDATA.lsp (4.9 Кб, 63 просмотров)
Тип файла: lsp WXD_XData-Excel.lsp (2.7 Кб, 57 просмотров)

__________________
количество моих сообщений не говорит о знании Автокада
Просмотров: 21551
 
Автор темы   Непрочитано 14.07.2021, 04:35
#21
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Сергей812, покиньте, пожалуйста, эту тему.
Ваши негативные мысли об идее этой программы, об XData и обо мне понятны были сразу.
Все остальные Ваши многочисленные сообщения уже на половину темы не о создании такой программы - это флуд. И троллинг, поскольку Вы еще и переходите к уничижительным характеристикам.
Высказывать свое мнение и отношение - нормально. Ненормально флудить и троллить.
Ненормально мешать.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 14.07.2021, 07:44
#22
nickname2019


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
1. Посмотреть в целом, какие данные в XData есть, каких нет.
Проблема решается если XData не использовать. Если нет XData - смотреть их не нужно.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
2. Для отчетов, экспликаций и т.п.
Эта проблема решается гуглем: как автоматически получить спецификацию в Autocad... Решений будет несколько десятков. Если ничего не устраивает - я думаю, что услуги программиста встанут не более 15 тыс. руб для настройки чего-то массового на индивидуальные потребности (спецификация с "бантиком") - но это без использования XDATA. На XDATA время тратить никто не будет, так как будет нужно "с нуля" поднимать функционал, который уже разработан без использования XDATA.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
3. Заполнить-заменить значения другими средствами - в Excel или т.п. (Для обратной загрузки).
Вероятнее всего гуглом можно нарыть большое количество бесплатных или недорогих функций по сортировке любых автокадовских объектов. Можно также попробовать освоить sql запросы, если с базами данных работать.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
4. Для загрузки в атрибуты блоков ATTIN.
Проблема решается если XData не использовать. Если нет XData - смотреть их не нужно.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
5. Для передачи данных в другие средства их хранения. В вертикальных приложениях, в словарях или т.п.
Нет XData - нет проблемы.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
6. Для сохранения данных.
Каких конкретно данных? Проблема хранения данных в Autocad по оборудованию легко решается блоками с атрибутами (в т.ч. динамическими блоками). Проблема хранения данных по кабельной трассе и инженерным сетям на генплане - тоже решаема более-менее стандартными и не сильно дорогими существующими способами. Если нужно модифицировать "под себя" - нетрудно найти программиста, чтобы допилил существующий функционал.

Я понимаю желание иметь возможность задавать доп. параметры любому объекту, чтобы потом с ними оперировать, но это утопия, так как порождает логистический кошмар. Если каждый будет задавать свой список и имена параметров - разобраться будет невозможно (у одного высота колонны будет "H", у другого "L" и т.д., совместимость проектов будет невозможна).
Параметрическое проектирование сейчас решается через создание кастомных объектов (стена, колонна и т.д.) с ЧЕТКИМ НАБОРОМ ПАРАМЕТРОВ, что обеспечивает ясность работы с объектом.
Т.е. сейчас используется объектно-ориентированный подход, когда создается стандартное описание объекта (с набором параметров), который затем используется везде. Вы предлагаете информацию хранить распределенно, что затрудняет анализ.

Последний раз редактировалось nickname2019, 14.07.2021 в 07:51.
nickname2019 вне форума  
 
Непрочитано 14.07.2021, 08:01
#23
trir


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


Цитата:
но это утопия, так как порождает логистический кошмар. Если каждый будет задавать свой список и имена параметров - разобраться будет невозможно
там ещё ограничение в 16K на всё, именно это стало причиной почему XData так мало пользуются - если несколько приложений начнут писать свои данные, то будут сплошные fatal error'ы
trir вне форума  
 
Непрочитано 14.07.2021, 08:13
#24
Кулик Алексей aka kpblc
Moderator

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


Fatal вряд ли, скорее - обрезка не влезающих данных. Offtop: С nickname2019 и trir согласен абсолютно и полностью.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.07.2021, 08:36
#25
Boxa

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


Может я чего то не понимаю, но прочитать/записать XData не сложно, вывести все это в csv или любой другой формат так же не сложно и по прочтению этой темы я так и не понял в чем проблема то, если нужен такой инструмент, бери да пиши.

АлексЮстасу, если Вы готовы профинансировать создание этого инструмента для сообщества, т.е. с открытым кодом, то я мог бы написать подобное, обращайтесь. =о)

ЗЫ.
Некоторое время назад, ТС опубликовал статью, по поводу тегов в КАД Бентли, если я правильно помню, мне тогда понравилась эта идея и я реализовал подобное для автокада (даже окошки и менюшки постарался сделать похожими), прежде чем отдать сотрудникам я попытался по пользоваться сам... не зашло, хотя часть тех наработок использую до сих пор.
Boxa на форуме  
 
Непрочитано 14.07.2021, 09:22
#26
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Boxa, тс предпочитает код на лиспе.
koMon вне форума  
 
Непрочитано 14.07.2021, 09:39
#27
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Ненормально флудить и троллить.
чем вы успешно занимаетесь уже который год со своими присоединенными данными)

Цитата:
Сообщение от Boxa Посмотреть сообщение
если Вы готовы профинансировать создание этого инструмента для сообщества, т.е. с открытым кодом, то я мог бы написать подобное, обращайтесь. =о)
ТС не новичок на форуме, и знает - где раздел исполнителей

И ему прямо так нужно получить программу - что даже не удосужился выложить полный тестовый набор данных для тестирования. Это тоже показывает - насколько он заинтересован в конечном результате и насколько ценит время других)
Сергей812 вне форума  
 
Непрочитано 14.07.2021, 10:27
#28
Boxa

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


koMon, т.к. ТС не владеет ни одним языком, ИМХО ему должно быть совершенно параллельно на каком языке все это реализуется. Однако, если лисп принципиален, то бог в помощь, программистов много. =0)

Сергей812, я все понимаю, но реально задолбало читать про волшебные XData и как они всех спасут. Я в свое время попробовал, не пошло, может новый виток приведет к чему то хорошему... хотя у меня сомнения в этой затее, но если ТС все это профинансирует, то почему нет. Про раздел исполнителей ТС писали много раз, но он намеков не понимает видимо, потому пишу прямо.

Причем мне в этой теме не сколько интересно писать программу, сколько интересно понаблюдать взлетит ли у автора эта гравицапа, после стольких лет =0)
Boxa на форуме  
 
Непрочитано 14.07.2021, 11:28
#29
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
взлетит ли у автора эта гравицапа, после стольких лет
не давайте ТС ложных надежд))

Понимаю, если разговор шел бы о вспомогательной библиотеке работы с XData - например, как с индексированными свойствами. Т.е. данная библиотека как основа для разработки других надстроек. А пропихивать с маниакальным упорством XData как самодостаточное изделие...
Сергей812 вне форума  
 
Непрочитано 16.07.2021, 15:53
1 | #30
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


АлексЮстасу,
это не коррекция, это другой новый лисп, который выгружает все расширенные данные для всех приложений по умолчанию в файл/ы csv/txt в папку с рабочим чертежом, с именем рабочего чертежа и суффиксом "_xdatum" и если выбрана множественная запись файлов, то ещё и с суффиксом "_Название_Приложения". проверок на работу с файлом нет. для каждого приложения своя строка в выводимом файле, первая строка также включает название примитива и его handle. значения полей расширенных данных следуют за их dxf кодом. множественные значения выводятся скобочным списком. легенда по dxf кодам в конце файла csv.

Код:
[Выделить все]
 
;**********************************************************************************************************************

;	Пользовательская команда EXDATUM для выгрузки расширенных данных у выбранных примитивов. koMon, 02/22.

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

(vl-load-com)

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

(defun select_string ( 	preselected_string_list
						_list
						dialog_name
					  /
						main_dcl_strings_list
						dcl_filename_full
						sl_dcl_id
						_list
						dialog_result
						selected_strings_list
					 )

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

	(defun write_dialog_file (dialog_strings_list / temp_file_path dcl_filename_full dcl_file_id)
		(setq temp_file_path (vla-get-tempfilepath (vla-get-files (vla-get-preferences (vlax-get-acad-object))))
			  dcl_filename_full (vl-filename-mktemp "Dialog" temp_file_path ".dcl"])
			  dcl_file_id (open dcl_filename_full "w")
		)
		(mapcar '(lambda (dcl_str) (write-line
										dcl_str
										dcl_file_id
									)
				 )
				 dialog_strings_list
		)
		(close dcl_file_id)
		dcl_filename_full
	)

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

	(defun populate_list ( list_key list_to_process )
		(start_list list_key 3)
			(mapcar 'add_list
				  	(mapcar '(lambda (list_element)
				  			 	(strcat "\n" list_element)
				  			 )
				  			 list_to_process
				  	)
			)
		(end_list)
	)

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

	(defun list_to_number_string (preselected_string_list _list)
		(apply 'strcat (mapcar '(lambda (preselected_string) (if (setq position (vl-position preselected_string _list))
																(strcat (itoa position) " ")
																""
															 )
								)
								preselected_string_list
					   )
		)
	)

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

	(setq main_dcl_strings_list
								(list
									"Strings_List : dialog {"
															(strcat "label = \"" dialog_name "\";")
															": list_box {"
																			"key = \"All_Strings_List\";"
																			"width = 50;"
																			"height = 20;"
																			"allow_accept = true;"
																			"multiple_select = true;"
																       "}"
															"ok_cancel;"
											     		 "}"
								)
		  dcl_filename_full (write_dialog_file main_dcl_strings_list)
		  sl_dcl_id (load_dialog dcl_filename_full)
	)
	(if sl_dcl_id
		(if (new_dialog "Strings_List" sl_dcl_id)
			(progn
				(populate_list "All_Strings_List" _list)
				(set_tile "All_Strings_List" (list_to_number_string preselected_string_list _list))
				(action_tile "All_Strings_List" "(cond
													(
														(= 4 $reason)
															(setq selected_strings_list $value)
													)
													(
														t
															(setq selected_strings_list $value)
													)
												 )
											   "
				)
				(setq dialog_result (start_dialog))
				(unload_dialog sl_dcl_id)
				(vl-file-delete dcl_filename_full)
				(cond
						(
							(= dialog_result 1)
								(if selected_strings_list
									(setq selected_strings_list (mapcar '(lambda (index)
																			(nth index _list)
																		)
																		(read (strcat "(" selected_strings_list ")"))
															   )
									)
									(setq selected_strings_list (mapcar '(lambda (index) (nth index _list))
																		 (vl-sort (read (strcat "(" (list_to_number_string preselected_string_list _list) ")")) '<)
																)
									)
								)
						)
						(
							t
								(setq selected_strings_list nil)
						)
				)
			)
		)
	)
	selected_strings_list
)

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

(defun divide_list_at_nth_index (in_list nth_index / in_list_before in_list_after)
	(repeat nth_index
		(setq in_list_before (append in_list_before (list (car in_list)))
			  in_list_after (cdr in_list)
			  in_list in_list_after
		)
	)
	(append (list in_list_before) (list in_list_after))
)

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

(defun get_app_name_list (selection_set / index app_list xd_type xd_variant 1001_index app_list)
	(setq index 0)
	(repeat (sslength selection_set)
		(vla-getxdata (vlax-ename->vla-object (ssname selection_set index)) "" 'xd_type 'xd_variant)
		(if xd_type
			(progn
				(setq 1001_index 0)
				(foreach _type (vlax-safearray->list xd_type)
					(if (= 1001 _type)
							(if (and
									(not (member (setq app_name (vlax-variant-value (nth 1001_index (vlax-safearray->list xd_variant)))) app_list))
									(not (vl-some '(lambda (drop_app_name) (wcmatch (strcase app_name) (strcase drop_app_name)))
											  	   apps_to_exclude
										 )
									)
								)
									(setq app_list (append app_list (list app_name)))
							)
					)
					(setq 1001_index (1+ 1001_index))
				)
			)
		)
		(setq index (1+ index))
	)
;	(if app_list
;			(acad_strlsort app_list)
			app_list
;	)
)

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

(defun get_csv_filename (extension / output_name csv_filename)
	(setq output_name (strcat (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'Path)
					   		  "\\"
							  (vl-filename-base (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'Name))
							  "_xdatum"
					  )
	)
	(if (type (vl-symbol-value 'acet-ui-getfile))
			(setq csv_filename (acet-ui-getfile "Enter CSV filename"
												output_name
												extension
												""
												1
							   )
			)
			(setq csv_filename (getfiled "Enter CSV filename"
										  output_name
										 extension
										 1
							   )
			)
	)
	(if (= "" csv_filename)
		nil
		csv_filename
	)
)

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

(defun get_prompted_value (initget_value get_function prompt_string var command_terminated / default_string var_saved)
	(if (/= 3 (getvar 'dynmode)) (setvar 'dynmode 3))
	(if (null command_terminated)
		(progn
			(setq var_saved (read (strcat (vl-symbol-name var) "_saved")))
			(cond
				(
					(null (vl-symbol-value var_saved))
						(setq default_string "")
				)
				(
					(= 'str (type (vl-symbol-value var_saved)))
						(setq default_string (vl-symbol-value var_saved))
				)
				(
					t
						(setq default_string (rtos (vl-symbol-value var_saved)))
				)
			)
			(initget initget_value)
 			(set var (vl-catch-all-apply get_function (list (strcat "\n" prompt_string " <" default_string ">: "))))
 			(cond
 				(
 					(null (vl-symbol-value var))
 						(set var (vl-symbol-value var_saved))
 				)
 				(
 					(vl-catch-all-error-p (vl-symbol-value var))
 						(setq command_terminated t)
 				)
 				(
 					t
 						(set var_saved (vl-symbol-value var))
 				)
 			)
		)
	)
 	command_terminated
)

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

(defun c:eXDatum (/ entities_ss application_list ss_index csv_filename_full csv_file_id object_identified
					xd_object xd_type xd_variant xd_list xd_list_applicated 1001_nth xd_list_divided xd_list_applicated
					application_identified command_terminated each_app_to_file overriden value_separator
					selecting_xd_active apps_to_exclude app_list items_number dynmode_set selecting_all
				 )
	(if (null action) (setq action "Да"))
	(setq dynmode_set (getvar 'dynmode))

	;##################################################################################################################
	;										список исключаемых приложений
	;##################################################################################################################

;	(setq apps_to_exclude
;		  (mapcar 'vl-symbol-name
;		  		  '(
;					;************************************************************************************************

;				  	 acad* gradient*

;					;************************************************************************************************
;				   )
;		  )
;	)

	;##################################################################################################################
	;										список исключаемых приложений
	;##################################################################################################################

	(setq selecting_xd_active t)
	(while selecting_xd_active
		(cond
			(
				(setq entities_ss (vl-catch-all-apply 'ssget (list '((-3 ("*"))))))
					(setq selecting_xd_active nil)
					(if (vl-catch-all-error-p entities_ss)
						(setq command_terminated t
							  selecting_xd_active nil
						)
					)
			)
			(
				(null entities_ss)
					(setq selecting_all t)
					(while selecting_all
						(initget "Да Нет")
						(if (vl-catch-all-error-p (vl-catch-all-apply 'getkword (list (strcat "Ничего не выбрано. Выбрать все объекты базы с XD? (ESC изменить, Space подтвердить):[" action "] <" action ">"))))
							(setq action (cadr (member action '("Да" "Нет" "Да"))))
							(if (= "Да" action)
									(setq entities_ss (ssget "_x" '((-3 ("*"))))
										  selecting_xd_active nil
										  selecting_all nil
									)
									(setq selecting_all nil)
							)
						)
					)
			)
		)
	)
	(if (and
			(null command_terminated)
			entities_ss
			(setq app_list (get_app_name_list entities_ss))
			(setq application_list (select_string preselected_apps app_list "Приложения для выгрузки XD"))
	      	(null (setq command_terminated (get_prompted_value "Да Нет" 'getkword "Писать отдельный файл для каждого приложения [Да/Нет]" 'each_app_to_file command_terminated)))
			(null (setq command_terminated (get_prompted_value "Запятая ТОчкаЗапятая ТАбуляция" 'getkword "Разделитель данных [Запятая/ТОчкаЗапятая/ТАбуляция]" 'value_separator command_terminated)))
			(setq value_separator (cdr (assoc value_separator '(("Запятая" . ",") ("ТОчкаЗапятая" . ";") ("ТАбуляция" . "\t")))))
		)
			(cond
				(
					(= "Нет" each_app_to_file)
						(if (setq csv_filename_full (get_csv_filename "csv;txt"))
							(progn
								(setq ss_index 0)
								(if (findfile csv_filename_full) (setq overriden " (перезаписан)") (setq overriden ""))
								(while (null (setq csv_file_id (open csv_filename_full "w")))
									(alert (strcat "Файл \"" csv_filename_full "\" используется."
												   "\nЗакройте его для продолжения"
										   )
									)
								)
								(princ (strcat "\n" csv_filename_full))
								(princ overriden)
								(repeat (sslength entities_ss)
									(setq object_identified nil)
									(foreach application application_list
										(vla-getxdata (setq xd_object (vlax-ename->vla-object (ssname entities_ss ss_index))) application 'xd_type 'xd_variant)
										(if xd_type
											(progn
												(setq xd_list (mapcar '(lambda (type data) (cons type data)) (vlax-safearray->list xd_type) (vlax-safearray->list xd_variant))
													  xd_list_applicated nil
												)
												(while (setq 1001_nth (vl-position (assoc 1001 (cdr xd_list)) (cdr xd_list)))
													(setq xd_list_divided (divide_list_at_nth_index xd_list (1+ 1001_nth)))
													(setq xd_list_applicated (append xd_list_applicated (list (car xd_list_divided))))
													(setq xd_list (cadr xd_list_divided))
												)
												(foreach xd_sublist (append xd_list_applicated (list xd_list))
													(foreach xd_ (append (list (car xd_sublist)) (vl-sort (cdr xd_sublist) '(lambda (member_1 member_2) (< (car member_1) (car member_2)))))
														(cond
															(
																(= 1001 (car xd_))
																	(if (null object_identified)
																		(progn
																			(princ (strcat (substr (vla-get-objectname xd_object) 5) value_separator "Handle" value_separator "'" (vla-get-handle xd_object)  value_separator "Application" value_separator (vlax-variant-value (cdr xd_))) csv_file_id)
																			(setq object_identified t)
																		)
																		(princ (strcat value_separator value_separator value_separator "Application" value_separator (vl-princ-to-string (vlax-variant-value (cdr xd_)))) csv_file_id)
																	)
															)
															(
																(/= 1002 (car xd_))
																	(princ (strcat value_separator (vl-princ-to-string (car xd_)) value_separator) csv_file_id)
																	(cond
																		(
																			(= 'safearray (type (vlax-variant-value (cdr xd_))))
																				(princ (vlax-safearray->list (vlax-variant-value (cdr xd_))) csv_file_id)
																		)
																		(
																			t
																				(princ (vlax-variant-value (cdr xd_)) csv_file_id)
																		)
																	)
															)
															(
																t
															)
														)
													)
													(princ "\n" csv_file_id)
												)
											)
										)
									)
									(setq ss_index (1+ ss_index))
								)
								(princ
								"****************
								1000; String
								1003; Layer name
								1004; Binary data
								1005; Database handle
								1010, 1020, 1030; 3 Reals
								1011, 1021, 1031; World space position
								1012, 1022, 1032; World space displacement
								1013, 1023, 1033; World direction
								1040; Real
								1041; Distance
								1042; Scale factor
								1070; Integer
								1071; Long"
								csv_file_id)
								(close csv_file_id)
								(setq preselected_apps application_list)
						)
						(princ "\nКоманда отменена или не выбраны примитивы/приложения для выгрузки")
					)
				)
				(
					t
						(if (setq csv_filename_full (get_csv_filename ";csv;txt"))
							(progn
								(foreach application application_list
									(setq ss_index 0)
									(setq application_identified nil)
									(if (findfile (strcat (vl-filename-directory csv_filename_full) "\\" (vl-filename-base csv_filename_full) "_" application (vl-filename-extension csv_filename_full))) (setq overriden " (перезаписан)") (setq overriden ""))
									(setq csv_file_id (open (princ (strcat (vl-filename-directory csv_filename_full) "\\" (vl-filename-base csv_filename_full) "_" application (vl-filename-extension csv_filename_full))) "w"))
									(princ overriden)
									(setq items_number 0)
									(repeat (sslength entities_ss)
										(vla-getxdata (setq xd_object (vlax-ename->vla-object (ssname entities_ss ss_index))) application 'xd_type 'xd_variant)
										(if xd_type
											(progn
												(setq xd_list (mapcar '(lambda (type data) (cons type data)) (vlax-safearray->list xd_type) (vlax-safearray->list xd_variant))
													  xd_list_applicated nil
													  items_number (1+ items_number)
												)
												(while (setq 1001_nth (vl-position (assoc 1001 (cdr xd_list)) (cdr xd_list)))
													(setq xd_list_divided (divide_list_at_nth_index xd_list (1+ 1001_nth)))
													(setq xd_list_applicated (append xd_list_applicated (list (car xd_list_divided))))
													(setq xd_list (cadr xd_list_divided))
												)
												(setq xd_sublist (assoc (cons 1001 (vlax-make-variant application)) (append xd_list_applicated (list xd_list))))
												(foreach xd_ (append (list (car xd_sublist)) (vl-sort (cdr xd_sublist) '(lambda (member_1 member_2) (< (car member_1) (car member_2)))))
													(cond
														(
															(= 1001 (car xd_))
																(if (null application_identified)
																	(progn
																		(princ (strcat (substr (vla-get-objectname xd_object) 5) value_separator "Handle" value_separator (vla-get-handle xd_object) value_separator "Application" value_separator (vlax-variant-value (cdr xd_))) csv_file_id)
																		(setq application_identified t)
																	)
																	(princ (strcat (substr (vla-get-objectname xd_object) 5) value_separator "Handle" value_separator "'" (vla-get-handle xd_object) value_separator value_separator)  csv_file_id)
																)
														)
														(
															(/= 1002 (car xd_))
																(princ (strcat value_separator (vl-princ-to-string (car xd_)) value_separator) csv_file_id)
																(cond
																	(
																		(= 'safearray (type (vlax-variant-value (cdr xd_))))
																			(princ (vlax-safearray->list (vlax-variant-value (cdr xd_))) csv_file_id)
																	)
																	(
																		t
																			(princ (vlax-variant-value (cdr xd_)) csv_file_id)
																	)
																)
														)
														(
															t
														)
													)
												)
												(princ "\n" csv_file_id)
											)
										)
										(setq ss_index (1+ ss_index))
									)
									(princ (strcat ". Количество записей: " (itoa items_number) "\n"))
									(princ
									"****************
									1000; String
									1003; Layer name
									1004; Binary data
									1005; Database handle
									1010, 1020, 1030; 3 Reals
									1011, 1021, 1031; World space position
									1012, 1022, 1032; World space displacement
									1013, 1023, 1033; World direction
									1040; Real
									1041; Distance
									1042; Scale factor
									1070; Integer
									1071; Long"
									csv_file_id)
									(close csv_file_id)
								)
								(setq preselected_apps application_list)
							)
							(princ "\nКоманда отменена/не выбраны примитивы/приложения для выгрузки")
						)
				)
			)
			(princ "\nКоманда отменена/не выбраны примитивы (приложения) для выгрузки")
	)
	(setvar 'dynmode dynmode_set)
	(princ)
)

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

Последний раз редактировалось koMon, 08.02.2022 в 11:43.
koMon вне форума  
 
Автор темы   Непрочитано 16.07.2021, 21:31
#31
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Спасибо!
В целом, кажется, разобрался.
Оч. удобно, что действует и для заранее выбранных объектов, и можно выбрать после.
Цитата:
Сообщение от koMon Посмотреть сообщение
выгружает все расширенные данные для всех приложений по умолчанию в файл csv
По-моему, лучше выгружать в условно стандартный вид - близкий к выгружаемому ATTOUT и All_OD2CSV.lsp из #17, чтобы пользователям было проще и разбираться в данных, и готовить для перевода в другой вид.
В т.ч., что лучше выгружать каждый Appname в свой файл. Тогда проще сформировать строку заголовка, и пользователям легче просматривать-анализировать данные.
Да, ATTOUT выгружает все выбранные блоки в один файл, но и работать с ним пользователям сложнее.
В заголовке я бы выводил не коды, а человекопонятные обозначения типов данных. И, наверное, давал их порядковый номер (1_INTEGER, 5_STRING) - чтобы легче было ориентироваться в случае многих однотипных полей, видеть, что поля (колонки) были переставлены.
Вроде:
Цитата:
Для одного Appname

Из ATTOUT:

HANDLE BLOCKNAME NUMBER IDNETWRK
'DBE asrn_node 72 ST25
'DB8 asrn_node 59 ST26


Из csv-экспорта XData:

HANDLE PRIMITIVE 1_INTEGER 2_STRING
'DBE BlockReference 72 ST25
'DB8 BlockReference 59 ST26


Из All_OD2CSV.lsp:

HANDLE NUMBER IDNETWRK
'DB8 59 ST26
'DBE 72 ST25
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 16.07.2021, 22:08
#32
Кулик Алексей aka kpblc
Moderator

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


Offtop: Аппетит приходит во время еды. АлексЮстасу, изучай программирование и пиши сам чего хочешь - только в таком случае ты получишь именно то, что тебе нужно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.07.2021, 22:37
#33
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
...
Все приведенные мной сейчас соображения повторяют описанное мной в вопросе.
Придавать порядковые номера к названиям полей-колонок я придумал, да, позже. С ними для XData было бы удобнее, но и не настаиваю.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 17.07.2021, 10:03
#34
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
И, наверное, давал их порядковый номер (1_INTEGER, 5_STRING) - чтобы легче было ориентироваться в случае многих однотипных полей, видеть, что поля (колонки) были переставлены.
В NOD занести список соответствий {Целое число - ключ ID и Строковое название поля}, в XData писать парами -> число ID названия поля и само значение. Тогда был бы осознанный вывод информации, а не шифровки Юстас-центру) С тем же извлечением данных из атрибутов люди до сих пор работают - но там же однозначная привязка данных к имени атрибута.
Сергей812 вне форума  
 
Непрочитано 17.07.2021, 10:22
| 1 #35
Boxa

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


koMon, на полном серьезе, спасибо за помощь ТС.
Теперь самое интересное, наблюдать взлетит или нет и если взлетит, то в каком направлении =)

ЗЫ.
Накину, одна из причин, почему XData не зашли у конечного пользователя - эти данные не видно, не видно есть они или нет, не видно что там хранится, в отличи от атрибутов блока.
Но очень любопытно....
Boxa на форуме  
 
Непрочитано 17.07.2021, 10:23
#36
nickname2019


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Накину, одна из причин, почему XData не зашли у конечного пользователя - эти данные не видно, не видно есть они или нет, не видно что там хранится, в отличи от атрибутов блока.
Согласен. Допустим, есть задача сделать спецификацию забора на генплане.

1. Делаем динамический блок, который имеет параметр растяжения и выглядит как условное обозначение забора в плане.
2. В блок добавляем атрибуты, которые нужны для составления спецификации (производитель, марка, высота и т.д.)
3. На генплане "разбрасываем" динамические блоки в соотвествующем слое и изменяем их длины в соответствии с требуемым планом забора
4. Изолируем слои с забором и делаем что-то типа attout для изолированных объектов
5. Обрабатываем результаты в экселе и создаем спецификацию

Атрибуты для указанных динамических блоков очень удобно задаются в свойствах выделенного объекта (хоть для всех сразу, хоть для некоторых, хоть для одного).

Зачем XDATA? Для XDATA нет удобного инструмента вроде палитры свойств объекта.
Для XDATA будем писать аналогичный менеджер свойств?

P.S. Любой объект (трубу, кабель и т.д.) можно сделать динамическим блоком, навешать на него нужные атрибуты и относительно быстро заспецифицировать.

Последний раз редактировалось nickname2019, 17.07.2021 в 10:30.
nickname2019 вне форума  
 
Непрочитано 17.07.2021, 10:54
#37
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
эти данные не видно, не видно есть они или нет, не видно что там хранится, в отличи от атрибутов блока.
ну на том же .Net сделать палитру и в обработчике события ImpliedSelectionChanged собирать и выводить информацию из XData - не сверхсложная задача) Но опять же, для организации нормального вывода нужно делать индексируемые свойства в XData - чтобы при выводе для одновременном выделении разных примитивов можно было выводить одинаковое значение либо писать "разное". Если бы ТС хотел реально заниматься решением этой задачи, а не безудержным хайпом на присоединенных данных на XData...

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
P.S. Любой объект (трубу, кабель и т.д.) можно сделать динамическим блоком, навешать на него нужные атрибуты и относительно быстро заспецифицировать.
так охота "плодить" бесконечные анонимные промежуточные определения блоков?
Сергей812 вне форума  
 
Непрочитано 17.07.2021, 11:17
#38
nickname2019


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
так охота "плодить" бесконечные анонимные промежуточные определения блоков?
Ели цель сдать быстро работу и получить деньги - для генплана и ТХ самое оно. Там объектов мало, тормозить серьезно не будет.
Проблемы могут быть если объектов много, например, при армировании ж.б.к. Там хомутов могут быть тысячи в одном файле.
nickname2019 вне форума  
 
Непрочитано 17.07.2021, 13:10
#39
Boxa

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну на том же .Net сделать палитру и в обработчике события ImpliedSelectionChanged собирать и выводить информацию из XData - не сверхсложная задача)
ну на том же .NEt можно и переопределить внешний вид примитива, выведя туда данные из XData, а ля атрибуты блока, используя OPMNetExt можно попробовать добавить XData в стандартную панель свойств и т.д. и т.п. Было бы желание и время этим заниматься.
Но вот зачем, мне пока не понятно. Достаточно других инструментов, не понятна финансовая выгода с всего этого. Используя другие инструменты я выполню ту же работу с той же скоростью и зачем при этом тратить время/деньги на разработку этого ПО не вполне понятно. Поэтому с интересом наблюдаю за движухой...


АлексЮстасу, Вы проверяли, не теряются ли / портятся ли XData при вылете автокада с фатальной ошибкой и при последующем восстановлении файла?
Boxa на форуме  
 
Непрочитано 17.07.2021, 14:23
#40
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
ну на том же .NEt можно и переопределить внешний вид примитива, выведя туда данные из XData, а ля атрибуты блока
или определить примитивы под апертурой курсора (вроде в обработчике PointMonitor, насколько помню) и всплывающее окно полупрозрачное около курсора с информацией..

Цитата:
Сообщение от Boxa Посмотреть сообщение
не понятна финансовая выгода с всего этого
какая может быть финансовая выгода - когда по истечении стольких лет процесс у ТС дошел лишь до собирания винегрета из чужих программ для работы с XData?
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Выгрузить XData в csv (txt)

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автокад 2010 виснит намертво при сохранении файла LenaE AutoCAD 18 04.05.2020 12:59
Как принято, как лучше описывать Xdata у элементов? АлексЮстасу AutoCAD 96 08.01.2020 09:25
Описание xdata АлексЮстасу Программирование 68 09.10.2014 11:46
Ищу способы упрощения работы с XData (расширенными данными) в VBA, Lisp RasRuf LISP 1 29.01.2009 10:55