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

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

Помогите с интересной проблемой о тексте в ячейке таблицы

Ответ
Поиск в этой теме
Непрочитано 13.09.2016, 21:17 #1
Помогите с интересной проблемой о тексте в ячейке таблицы
reime
 
Регистрация: 12.09.2016
Сообщений: 5

Опишу вкратце суть проблемы.

Есть переведенный dwg файл.
В нем отображаются ячейки таблицы с содержимым на английском языке.
При попытке редактировать ячейку таблицы, подставляется старое значение. (на русском в неверной кодировке)
Это происходит потому, что фактически значение cell_value хранит в себе это значение с непонятной кодировкой, которое подставляется автокадом (а почему сразу не подставилось?)

Требуется:
Не беря в расчет кодировку, требуется макрос или утилита, которая смогла бы заменить содержимое ячеек таблиц в соответствии с отображаемым значением.

Как вариант приветствуется любая утилита, способная заменить текст в ячейке таблицы на текст внутри документа (один текст на другой, по диалогу пользователя)

Побочно хотелось бы получить ответ на вопрос (ну чисто из любопытства ):
"Почему в автокаде отображаемое значение таблицы может не совпадать с реальным? Слои там или еще что?)"


Меня очень беспокоит что за более чем 6 лет эволюции в автокаде все еще похоже существует самостоятельно понятие ячейка таблицы (как тип).
Почему нельзя было сделать просто mtext? который был бы ячейкой таблицы?

Вложения
Тип файла: dwg
DWG 2010
where_is_english21_nl.dwg (93.4 Кб, 42 просмотров)

Просмотров: 3942
 
Непрочитано 14.09.2016, 00:31
1 | #2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,355
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от reime Посмотреть сообщение
Побочно хотелось бы получить ответ на вопрос (ну чисто из любопытства ):
"Почему в автокаде отображаемое значение таблицы может не совпадать с реальным? Слои там или еще что?)"
На эту тему можно написать целый трактат. Слои тут точно совершенно не причем. Таблица - она в двух ипостасях. Первая - это таблица с ячейками (таблица-таблица), вторая - это вставка блока (таблица-блок), содержащего MText'ы и/или вставки блоков и еще кучу всякого. Видим мы таблицу как таблицу-блок, но как только переходим к редактированию, то редактируем мы ячейки таблицы-таблицы и после завершения редактирования обновляется таблица-блок.
Цитата:
Сообщение от reime Посмотреть сообщение
Почему нельзя было сделать просто mtext? который был бы ячейкой таблицы?
Потому что ячейкой таблицы может быть еще и вставка блока.
Александр Ривилис вне форума  
 
Непрочитано 14.09.2016, 09:06
1 | #3
Oleg T


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


По-моему, здесь дело в использовании шрифтов SHX.
Замена их на, например, GOST A или GOST type A решает проблему.
У меня при открытии файла в AutoCAD LT 2013 или BricsCAD сразу отображается все корректно, а текстам в таблице назначен
стиль GOST 2.304. При назначении любых других стилей они отображаются "кракозябрами".

Последний раз редактировалось Oleg T, 14.09.2016 в 09:19.
Oleg T вне форума  
 
Непрочитано 14.09.2016, 16:23
1 | #4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,355
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Oleg T Посмотреть сообщение
У меня при открытии файла в AutoCAD LT 2013 или BricsCAD сразу отображается все корректно,
При двойном клике на ячейке таблицы текст не меняется (вместо английского не появляется русский и возможно "крякозябрами")?
Александр Ривилис вне форума  
 
Непрочитано 14.09.2016, 16:33
1 | #5
AMDen

Инженер-проектировщик
 
Регистрация: 07.07.2016
Санкт-Петербург
Сообщений: 457


А каким образом осуществляется перевод?
AMDen вне форума  
 
Непрочитано 14.09.2016, 20:28
1 | #6
Oleg T


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
При двойном клике на ячейке таблицы текст не меняется (вместо английского не появляется русский и возможно "крякозябрами")?
Немного не так. Английский сразу меняется на русский, кракозябр нет.
Миниатюры
Нажмите на изображение для увеличения
Название: 11.jpg
Просмотров: 49
Размер:	145.0 Кб
ID:	176170  Нажмите на изображение для увеличения
Название: 22.jpg
Просмотров: 44
Размер:	137.3 Кб
ID:	176171  
Oleg T вне форума  
 
Непрочитано 14.09.2016, 20:31
1 | #7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,355
Отправить сообщение для Александр Ривилис с помощью Skype™



Существенно именно то, что английский меняется на русский (крякозябры или нет действительно зависит от кодировки шрифта), а этого быть не должно. Должен остаться английский.
Александр Ривилис вне форума  
 
Непрочитано 14.09.2016, 20:32
1 | #8
Кулик Алексей aka kpblc
Moderator

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


Может, какой-то "автоматический переключатель раскладки" (типа PuntoSwitcher) шалит?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.09.2016, 23:52
1 | #9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,355
Отправить сообщение для Александр Ривилис с помощью Skype™


Кулик Алексей aka kpblc
Леша. Я вроде в http://forum.dwg.ru/showpost.php?p=1569922&postcount=2 всё объяснил. Если нет, то объясню снова. Явно какая-то программа, которая понятия не имеет о таблицах переводит все тексты в чертеже (наверное по какой-то таблице перевода). Думаю, что обрабатываются TEXT, MTEXT, ATTRIB, ATTDEF (когда-то я что-то подобное писал). При этом эта программа проходит по всем описаниям блоков в чертеже и походу дела меняет MTEXT везде, в том числе и в блоках, которые являются таблицами. При этом эта программа не меняет содержимое ячеек таблицы. Пока не происходит редактирования таблицы мы видим переведенные этой программой тексты, но как только мы решили редактировать таблицу, AutoCAD заменяет содержимое MTEXT на содержимое соответствующей ячейки таблицы. Вот как-бы и всё.
Ну а reime нужна программа, которая вытащит из MTEXT таблицы текст и заменит им содержимое соответствующей ячейки. Задача усложняется тем, чтобы найти соответствие между MTEXT и [номер строки][номер колонки] таблицы. В явном виде этого соответствия нет.
Александр Ривилис вне форума  
 
Непрочитано 15.09.2016, 08:09
1 | 1 #10
Boxa

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


Цитата:
Сообщение от reime Посмотреть сообщение
Требуется:
Не беря в расчет кодировку, требуется макрос или утилита, которая смогла бы заменить содержимое ячеек таблиц в соответствии с отображаемым значением.

Как вариант приветствуется любая утилита, способная заменить текст в ячейке таблицы на текст внутри документа (один текст на другой, по диалогу пользователя)
Меня одного смущают эти фразы в топике в этом разделе?
ИМХО, этому топику место в поиске исполнителей или на худой конец в программирование
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 15.09.2016, 18:05
1 | #11
kp+

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Ну а reime нужна программа, которая вытащит из MTEXT таблицы текст и заменит им содержимое соответствующей ячейки. Задача усложняется тем, чтобы найти соответствие между MTEXT и [номер строки][номер колонки] таблицы. В явном виде этого соответствия нет.
IMHO:
Первая часть этой программы - подрыв (explode) копии таблицы. При этом (специально проверил) табличный блок подрывается "как есть", без обновления текста по связанному с ним словарю.
Затем выбор получившихся Мтекстов и определение с помощью hittest ячеек, которым они принадлежали.
Затем присвоение ячейкам значений Мтекстов.
Думаю, будет работать для несложной таблицы (без вставок блоков и объединенных ячеек).

Код сейчас писать слегка некогда, может чуть позже попробую.

Цитата:
Сообщение от Boxa Посмотреть сообщение
ИМХО, этому топику место в поиске исполнителей или на худой конец в программирование
+1
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
 
Автор темы   Непрочитано 15.09.2016, 19:34
#12
reime


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Меня одного смущают эти фразы в топике в этом разделе?
ИМХО, этому топику место в поиске исполнителей или на худой конец в программирование
Создавали там, удалили.

Место этой темы в программировании только в том случае если нет все еще средств конвертации.
Почему появились expresstools которые умеют делать замену text на mtext и много всего еще, а это все еще не решено в автогаде?
Я найвно полагаю, что эта проблема достаточно расспространенная. Для сравнения, не помогает даже утилита dwgconvert для работы с ячейками таблицы.
Т.е. она работает правильно c mtext, а cell_value и другие параметры не видит в упор. И еще если конвертнуть файл в dxf то можно заметить что это поле в таблице дублируется оно и в cell_value и mtext (раз его находит программа автозамены) и еще в cell_begin (тут могу ошибатся.)


Создана эта тема тут с целью понять почему так вообще происходит? По логике не должно. (Работали с могими офисными приложениями, такое прошу прошения гемор. впервые)

Да, уважаемый Александр Ривилис все правильно понял! Отдельное спасибо ему.

По переводу:
Есть стороняя утилита, которая выдирает все поля типа текст, но с таблицами работает не корректно.
Вопрос не в этом.

У меня появились вопросы. Можно ли массово конвертнуть таблицы, чтобы внутри ячейки таблицы было поле типа mtext?
или заменить все таблицы на вхождения блока (в блоке mtext, или text и линии но выглядит как таблица)

Кстати, нашла решение проблемы: если разрушить таблицу в исходном файле (например flatten из express tools? тогда таблица превращается в линии и mtext), то утилита работает но это решение с потерей качества.

Поставила спасибо всем , кто ответил в теме!

----- добавлено через ~15 мин. -----
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Задача усложняется тем, чтобы найти соответствие между MTEXT и [номер строки][номер колонки] таблицы. В явном виде этого соответствия нет.
Т.е. автокад не "знает" что перевод стоит в ячейке таблицы?

Как вообще получить доступ к переводу внутри .dwg? в dxf его вижу.
Он как будто read-only
reime вне форума  
 
Непрочитано 15.09.2016, 20:54
#13
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,355
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от reime Посмотреть сообщение
Для сравнения, не помогает даже утилита dwgconvert для работы с ячейками таблицы.
Т.е. она работает правильно c mtext, а cell_value и другие параметры не видит в упор.
Это как? Я же специально для Вас сделал, чтобы видела.
Цитата:
Сообщение от reime Посмотреть сообщение
По переводу:
Есть стороняя утилита, которая выдирает все поля типа текст, но с таблицами работает не корректно.
Вопрос не в этом.
Вопрос как раз в этом. Если бы она работала с таблицами корректно, то и вопросов бы не было - всё бы было нормально и не нужны бы были сейчас никакие лишние телодвижения.
Цитата:
Сообщение от reime Посмотреть сообщение
У меня появились вопросы. Можно ли массово конвертнуть таблицы, чтобы внутри ячейки таблицы было поле типа mtext?
или заменить все таблицы на вхождения блока (в блоке mtext, или text и линии но выглядит как таблица)
Вы как-нибудь с терминами определитесь.
Цитата:
Сообщение от reime Посмотреть сообщение
Т.е. автокад не "знает" что перевод стоит в ячейке таблицы?
Перевод как раз стоит не в ячейке таблицы, а в MText блока таблицы (если конечно перевод с русского на английский - иначе Вы меня запутали окончательно).
Александр Ривилис вне форума  
 
Непрочитано 15.09.2016, 21:10
#14
Boxa

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


Цитата:
Сообщение от reime Посмотреть сообщение
Создана эта тема тут с целью понять почему так вообще происходит?
Вы лукавите, в первичном сообщении это побочная цель.
Цитата:
Сообщение от reime Посмотреть сообщение
Побочно хотелось бы получить ответ на вопрос (ну чисто из любопытства ):
"Почему в автокаде отображаемое значение таблицы может не совпадать с реальным? Слои там или еще что?)"
основная цель создания топика это:
Цитата:
Сообщение от reime Посмотреть сообщение
Требуется:
Не беря в расчет кодировку, требуется макрос или утилита, которая смогла бы заменить содержимое ячеек таблиц в соответствии с отображаемым значением.

Как вариант приветствуется любая утилита, способная заменить текст в ячейке таблицы на текст внутри документа (один текст на другой, по диалогу пользователя)
Причину такого поведения Вам уже объяснили, причем поведения не автокада, а посторонней утилиты.
Именно по этому в этом разделе данному топику не место, т.к. обсуждается не автокад, а поведение сторонней утилиты с поиском/написанием более подходящего варианта.

имхо.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 16.09.2016, 09:07
#15
kp+

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


Цитата:
Сообщение от reime Посмотреть сообщение
И еще если конвертнуть файл в dxf то можно заметить что это поле в таблице дублируется оно и в cell_value и mtext
Только cell_value первично, а Mtext вторично. При каждом редактировании таблицы содержимое Mtext обновляется в соответствии с cell_value. И если какая-то прога полезла во вторичный Мтекст, не затронув первичный cell_value - Мтекст сохранится только до тех пор, пока таблицу никто не трогает. Собственно, именно об этом написал уважаемый Александр Ривилис в #2.

Цитата:
Сообщение от reime Посмотреть сообщение
Т.е. автокад не "знает" что перевод стоит в ячейке таблицы?
Можно и так сказать. Точнее, скажем так: договорились со "сторожем" таблицы (табличнымй блоком) по-свойски, но не сообщили "начальнику" таблицы (словарю) надлежащим образом в установленном порядке И как только "начальник" проводит ревизию (обновление таблицы в результате редактирования ячейки) - все договоренности со "сторожем" идут коту под хвост.
__________________
Одно меня лишь радует - я это вижу сам! (С)

Последний раз редактировалось kp+, 16.09.2016 в 09:19.
kp+ вне форума  
 
Непрочитано 22.09.2016, 19:10
#16
frostmourn


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



Попробуйте так
Код:
[Выделить все]
 
(defun c:TableUpd ( / adoc tblobj p1 p2 Gabarit textlistOLD tblobjOLDlist textlist row col)
	(vl-load-com)
	(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
	(foreach tblobjOLD
			(_SStoObjects (ssget "_X" '((0 . "ACAD_TABLE"))))
		(vl-catch-all-apply
			'(lambda ( )
				(vlax-invoke-method
				   tblobjOLD
				  'GetBoundingBox
				  'p1
				  'p2
				)
				(setq tblobj (vla-copy tblobjOLD)
					Gabarit (mapcar '(lambda ( a o ) (mapcar o a '(5 5))) (mapcar 'vlax-safearray->list (list p1 p2)) '(- +))
					textlistOLD (vl-remove-if '(lambda (y) (= y "")) (gettabledata1 tblobjOLD))
				)
				(vl-cmdf "_explode" (vlax-vla-object->ename tblobjOLD))
				(setq tblobjOLDlist (_SStoObjects (ssget "_W" (car Gabarit) (cadr Gabarit)))
					textlist (vl-remove-if-not '(lambda (y) (= (vla-get-objectname y) "AcDbMText")) tblobjOLDlist)
					textlist (_GAS_vlasort textlist)
					textlist (mapcar 'vla-get-TextString textlist)
				)
				(mapcar 'vla-Delete (vl-remove-if-not '(lambda (y) (wcmatch (vla-get-objectname y) "AcDbMText,AcDbLine")) tblobjOLDlist))

				(setq row 0 col 0)
				(vla-put-RegenerateTableSuppressed tblobj :vlax-true)
				(if (and textlist (apply 'or (mapcar '/= (acad_strlsort textlistOLD) (acad_strlsort textlist))))
					(repeat (vla-get-columns tblobj)
						(repeat (vla-get-rows tblobj)
							(if (/= (vla-getText tblobj row col) "")
								(progn
									(vla-setText tblobj row col (car textlist))
									(setq textlist (cdr textlist))
								)
							)
							(setq row (1+ row))
						)
						(setq col (1+ col) row 0)
					)
				)
				(vla-put-RegenerateTableSuppressed tblobj :vlax-false)
				
			)
		)
	)
	(vla-endundomark adoc)
	(princ)
)


(defun gettabledata1 (tbl / lst lst1 rows col); возращает список таблицы
	(setq row 0 col 0)
(repeat (vla-get-rows tbl)
	(repeat (vla-get-columns tbl)
		(setq lst (cons (vla-gettext tbl row col) lst))
		(setq col (1+ col))
	)
	(setq row (1+ row) col 0)
)
lst
)


(defun _GAS_vlasort (LST / )
	(mapcar (function cadr)
		(vl-sort
			(mapcar
				'(lambda (x)
						(list
							(vlax-safearray->list (vlax-variant-value
									(vlax-get-property
										x
										(if (vlax-property-available-p x 'InsertionPoint)
											'InsertionPoint
											'Coordinates
										)
									)
							))
							x
						)
				)
				LST
			)
			(function
				(lambda (e1 e2)
					(or
						(< (- (caar e1) (caar e2)) -5.0)
						(and
							(equal (caar e1) (caar e2) 5.1)
							(> (- (cadar e1) (cadar e2)) 5.0)
						)
					)
				)
			)
		)
	)
)


(defun _SStoObjects ( ss / i objects )
	(if (eq 'pickset (type ss))
	   (repeat (setq i (sslength ss))
		   (setq objects
			   (cons
				   (vlax-ename->vla-object
					   (ssname ss
						   (setq i (1- i))
					   )
				   )
				   objects
			   )
		   )
	   )
	)
	objects
)
Только осторожно, писано по-быстрому, всякое может быть. И ещё при наличии "кракозябр", если встретится русский текст в переведенных таблицах - он станет этим самым.
frostmourn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Помогите с интересной проблемой о тексте в ячейке таблицы

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
таблицы и связь данных в СПДС графикс. Помогите усовершенствовать табличку. Кукурузо_Джон_Горыныч Прочее. Программное обеспечение 25 26.07.2016 16:55
Как получить значение ширины столбца в ячейке таблицы AutoCad? mvartem Программирование 17 05.03.2016 14:12
Автоматическое сжатие текста в ячейке таблицы baksconstructor AutoCAD 5 24.02.2016 06:43
Как сделать непечатаемым текст в ячейке таблицы в Autocad? Газизов Рафаэль AutoCAD 10 02.09.2014 16:51
Возможно ли присвоить ячейке таблицы слой? 0_о hudozhnik AutoCAD 8 15.09.2011 17:39