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

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

Добавление в центр штриховки текстового объекта со значением ее площади

Ответ
Поиск в этой теме
Непрочитано 06.05.2020, 10:03 1 | #1
Добавление в центр штриховки текстового объекта со значением ее площади
Yur.OK_SPb
 
Регистрация: 25.01.2011
Сообщений: 93

Тема отделена от https://forum.dwg.ru/showthread.php?t=156849.

Цитата:
Сообщение от Oleg T Посмотреть сообщение
Вот здесь
http://www.lee-mac.com/midlen.html
ставит поля со значением длины каждого выделенного объекта.
Может, пригодится.
А нет ли похожей софтины для указания площади штриховки? Чтобы не выбирать её и не смотреть в свойствах?

Последний раз редактировалось Кулик Алексей aka kpblc, 14.05.2020 в 14:37.
Просмотров: 2074
 
Непрочитано 06.05.2020, 10:31
#2
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,470


Есть у Lee Mac'a еще и QuickField. Не могу который день попасть к нему на сайт - это только у меня или у всех?
Вот здесь, под катом я выкладывал этот код. Чтобы вызвать команду для вставки в поле площади, нужна такая конструкция:
Код:
[Выделить все]
(defun c:test1 ( ) (LM:QuickField "Area" "%lu6%qf1" 2))
skkkk вне форума  
 
Непрочитано 06.05.2020, 11:20
#3
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 734


Offtop:
Цитата:
Сообщение от skkkk Посмотреть сообщение
это только у меня или у всех?
К нему теперь через ВПН.
kacugu вне форума  
 
Автор темы   Непрочитано 06.05.2020, 11:49
#4
Yur.OK_SPb


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


А попроще нет? Чтобы площадь штриховки сразу прописывал по середине штриховки?
Тут даже ближе к нужному его программа http://www.lee-mac.com/areastofield.html, но нужно автоматическое проставление всех площадей одновременно у всех выбранных штриховок.

Последний раз редактировалось Yur.OK_SPb, 06.05.2020 в 12:00.
Yur.OK_SPb вне форума  
 
Непрочитано 06.05.2020, 12:34
#5
trir


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


используй БД - штатный функционал в Map 3D
trir на форуме  
 
Непрочитано 06.05.2020, 15:28
#6
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,506
<phrase 1=


Offtop:
Цитата:
Сообщение от kacugu Посмотреть сообщение
К нему теперь через ВПН.
Интересно с чего вдруг???
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 06.05.2020, 18:33
#7
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 734


Offtop:
Цитата:
Сообщение от zenon Посмотреть сообщение
Интересно с чего вдруг???
Не знаю,но файрфокс, хром, эдж, опера не заходят без впн. Есть подозрение, что дело в потенциальной небезопасности сайта - https, сертификаты и подобное
kacugu вне форума  
 
Непрочитано 09.05.2020, 17:38
1 | #8
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,470


Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
А попроще нет? Чтобы площадь штриховки сразу прописывал по середине штриховки?
Код:
[Выделить все]
 ;;; Программа расставляет мтексты со значениями площадей выбранных штриховок.

(defun C:HATCHESAREA ( / ss i en area clr vexs pt)
	(setq ss (ssget '((0 . "HATCH"))))
	(if ss
		(repeat (setq i (sslength ss))
			(setq en (ssname ss (setq i (1- i))))
			(cond
			  (	(null (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-Area (list (vlax-ename->vla-object en)))))
				(setq area (rtos (vla-get-Area (vlax-ename->vla-object en)) 2 2))
			  )
			  ( T
				(setq area "Ошибка контура")
				(setq clr 1)
			  )
			)
			(setq vexs 
				(reverse 
					(cdr
						(reverse 
							(cdr 
								(mapcar 'cdr 
									(vl-remove-if-not
										(function 
											(lambda (x)
												(and
													(= (car x) 10)
													(not (equal (cdr x) '(0.0 0.0 0.0)))
												)
											)
										)
										(entget en)
									)
								)
							)
						)
					)
				)
			)
			(setq pt 
				(list
					(/ (apply '+ (mapcar 'car vexs))(length vexs))
					(/ (apply '+ (mapcar 'cadr vexs))(length vexs))
					0.0
				)
			)
			(entmake 
				(list
					'(0 . "MTEXT")
					'(67 . 0)
					(if clr (cons 62 clr) (cons 62 256))
					'(100 . "AcDbEntity")
					'(100 . "AcDbMText")
					(cons 7 (getvar "TEXTSTYLE"))
					'(60 . 0)
					(cons 8 (cdr (assoc 8 (entget en)))) ;;; слой (берется слой штриховки)
					'(71 . 5) ;;; выравнивание
					(cons 10 pt) ;;; точка вставки
					'(11 1. 0. 0.)
					'(50 . 0.0)
					'(40 . 1.5) ;;; высота текста
					'(41 . 0)
					'(42 . 0)
					(cons 1 area) ;;; содержимое
					'(90 . 3)
					'(63 . 256)
					'(45 . 1.1)
					'(441 . 0)
				)
			)
			(setq clr nil)
			(princ)
		)
	)
)

Последний раз редактировалось skkkk, 14.05.2020 в 14:18. Причина: Корректировка кода с учетом замечаний ниже
skkkk вне форума  
 
Автор темы   Непрочитано 13.05.2020, 11:21
#9
Yur.OK_SPb


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Программа расставляет мтексты со значениями площадей выбранных штриховок.
В целом - то, что нужно!
Но не пойму - почему в стороне текст получается?

Хотя в качестве примера рисую прямоугольник, накладываю в него штриховку - текст вставляет корректно, посередине штриховки.
Несколько прямоугольников - тоже самое.
А в моём примере - всё в стороне.
Вложения
Тип файла: dwg
DWG 2013
new block.dwg (112.0 Кб, 8 просмотров)

Последний раз редактировалось Yur.OK_SPb, 13.05.2020 в 12:09.
Yur.OK_SPb вне форума  
 
Непрочитано 13.05.2020, 17:55
#10
koMon


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


@skkkk,
Код:
[Выделить все]
 (setq area
			(cond
				(
					(null (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-Area (list (vlax-ename->vla-object en)))))
						(rtos (vla-get-Area (vlax-ename->vla-object en)) 2 2)
				)
				(
					t
						"Ошибка контура"
				)
			)
)
(vla-getboundingbox (vlax-ename->vla-object en) 'left_lower_corner 'right_upper_corner)
(setq pt (list
				(/ (+ (car (vlax-safearray->list left_lower_corner)) (car (vlax-safearray->list right_upper_corner))) 2.0)
				(/ (+ (cadr (vlax-safearray->list left_lower_corner)) (cadr (vlax-safearray->list right_upper_corner))) 2.0)
		 )
)
koMon на форуме  
 
Автор темы   Непрочитано 13.05.2020, 20:35
#11
Yur.OK_SPb


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


Кто-нибудь может подправить код?
Я в этом, честно говоря, вообще не шарю(((
Yur.OK_SPb вне форума  
 
Непрочитано 13.05.2020, 21:13
#12
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Кто-нибудь может подправить код?
Я в этом, честно говоря, вообще не шарю(((
А че не так-то?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.05.2020, 21:23
#13
Yur.OK_SPb


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А че не так-то?
Так вроде выше выложили, что какая-то ошибка в коде.
Yur.OK_SPb вне форума  
 
Непрочитано 13.05.2020, 22:06
1 | #14
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,470


koMon, спасибо. Замечание о необходимости проверки наличия свойства "Area" принимается.
Но Холмс, почему у штриховки внезапно не оказалось площади? Как в том детстве: *опа есть а слова - нет. Или как суслик, которого никто не видит...
Причем, я попробовал удалить суслика эту штриховку с ошибкой и построить новую в том же контуре - всё стало хорошо (суслика увидел).
Однако, брать центр boundingbox'a в качестве точки вставки для текста я сразу отказался, потому как, к примеру, в треугольном контуре текст появлялся бы за его пределами, что мне не понравилось. В качестве координат мне показалось более разумным брать среднее арифметическое всех координат её вершин. Тоже не самый лучший вариант, понимаю, с учетом возможной "впуклости" многоугольника, дуговых сегментов и прочего неформата, но вникать глубоко не стал, с учетом, что и ТЗ особо-то не было - так просто побаловался. Про вычисление этой пресловутой точки уже был разговор. Простых универсальных решений там, похоже, нет. Одно было там продемонстрировано на видео, но без кода. Попадались разные варианты программ-"центроидайзеров", но почему-то работали они все только с фигурами да полилиниями, переписывать под штриховки не стал.

Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Но не пойму - почему в стороне текст получается?
.
Вот я тоже не пойму. Точнее, пойму, почему в стороне он получается: в списке вершин оказываются куча координат (0.0 0.0 0.0), что с учетом выбранного алгоритма ожидаемо отбрасывает тексты в сторону а вот откуда у штриховки столько 10-х групп с нулями - вопрос. Есть версии, коллеги?
Yur.OK_SPb, эти штриховки в Автокаде сделаны или импортированы откуда-то?

В общем, оставил в коде пока алгоритм среднего арифметического координат, только отсеял "нулевые" координаты. Проверил на файле - вроде, более ли менее адекватно ставит. Откорректировал #16.
skkkk вне форума  
 
Автор темы   Непрочитано 14.05.2020, 08:49
#15
Yur.OK_SPb


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Yur.OK_SPb, эти штриховки в Автокаде сделаны или импортированы откуда-то?
Давайте разбираться. Штриховки рисовались по полилинии, которая была получена из геодезических координат.
Т.е. изначально полилинии имели не нулевую высоту, потом опускалась в уровень 0, и потом наносились штриховки.
Но вот не наносились ли штриховки на "не нулевую" полилинию, а потом опускались в 0 - я не уверен.

И ещё вопрос - а "ошибку контура" он в какой момент выдает?

Последний раз редактировалось Yur.OK_SPb, 14.05.2020 в 09:01.
Yur.OK_SPb вне форума  
 
Непрочитано 14.05.2020, 13:57
1 | #16
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,470


Я залез в DXF-reference (знаю, мог бы и не спрашивать раньше и сразу поискать) и нашел, что 10-й код - это не только координаты углов, но и еще и Elevation point (in OCS). Там сказано
Цитата:
DXF: X value = 0; APP: 3D point (X and Y always equal 0, Z represents the elevation)
т.е, Х и Y у них всегда равны нулю, а Z показывает уровень.
Чтоб стало хоть немного понятно человеку, далекому от программирования, о чем я толкую, DXF-коды объекта - это своего рода шифр, в котором хранятся в определенном виде свойства этого объекта, вроде такого:
Код:
[Выделить все]
(-1 . <Имя объекта: 
7fffb6511c0>)
(0 . HATCH)
(330 . <Имя объекта: 7fffb63f820>)
(5 . 94)
(100 . AcDbEntity)
(67 . 0)
(410 . Model)
(8 . ! Озеленение)
(48 . 50.0)
(370 . 15)
(100 . AcDbHatch)
(10 0.0 0.0 0.0)
(210 0.0 0.0 1.0)
(2 . GRASS)
(70 . 0)
(71 . 0)
(91 . 2)
(92 . 1)
(93 . 10)
(72 . 1)
(10 3337.12 6015.73 0.0)
(11 3334.86 6019.92 0.0)
(72 . 1)
(10 3334.86 6019.92 0.0)
(11 3333.67 6024.1 0.0)
(72 . 1)
(10 3333.67 6024.1 0.0)
(11 3333.69 6028.12 0.0)
(72 . 1)
(10 3333.69 6028.12 0.0)
(11 3334.33 6034.06 0.0)
(72 . 1)
(10 3334.33 6034.06 0.0)
(11 3337.34 6033.89 0.0)
(72 . 1)
(10 3337.34 6033.89 0.0)
(11 3513.04 6006.9 0.0)
(72 . 1)
(10 3513.04 6006.9 0.0)
(11 3510.12 5991.82 0.0)
(72 . 1)
(10 3510.12 5991.82 0.0)
(11 3508.93 5989.34 0.0)
(72 . 1)
(10 3508.93 5989.34 0.0)
(11 3337.19 6015.73 0.0)
(72 . 1)
(10 3337.19 6015.73 0.0)
(11 3337.12 6015.73 0.0)
(97 . 0)
(92 . 16)
(93 . 9)
(72 . 1)
(10 3337.57 6016.38 0.0)
(11 3335.51 6020.18 0.0)
(72 . 1)
(10 3335.51 6020.18 0.0)
(11 3334.37 6024.19 0.0)
(72 . 1)
(10 3334.37 6024.19 0.0)
(11 3334.39 6028.08 0.0)
(72 . 1)
(10 3334.39 6028.08 0.0)
(11 3334.96 6033.32 0.0)
(72 . 1)
(10 3334.96 6033.32 0.0)
(11 3337.27 6033.19 0.0)
(72 . 1)
(10 3337.27 6033.19 0.0)
(11 3512.22 6006.32 0.0)
(72 . 1)
(10 3512.22 6006.32 0.0)
(11 3509.45 5992.04 0.0)
(72 . 1)
(10 3509.45 5992.04 0.0)
(11 3508.53 5990.11 0.0)
(72 . 1)
(10 3508.53 5990.11 0.0)
(11 3337.57 6016.38 0.0)
(97 . 0)
(75 . 1)
(76 . 1)
(52 . 3.14159)
(41 . 0.025)
(77 . 0)
(78 . 3)
(53 . 4.71239)
(43 . 0.0)
(44 . 0.0)
(45 . 0.449013)
(46 . -0.449013)
(79 . 2)
(49 . 0.119063)
(49 . -0.778963)
(53 . 3.92699)
(43 . 0.0)
(44 . 0.0)
(45 . 0.449013)
(46 . -0.449013)
(79 . 2)
(49 . 0.119063)
(49 . -0.515938)
(53 . 5.49779)
(43 . 0.0)
(44 . 0.0)
(45 . 0.449013)
(46 . 0.449013)
(79 . 2)
(49 . 0.119063)
(49 . -0.515938)
(98 . 18)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 0.0 0.0 0.0)
(10 5233.26 5744.35 0.0)
(-3 (GradientColor1ACI (1070 . 5)) (GradientColor2ACI (1070 . 2)) (ACAD (1010 
0.0 0.0 0.0)))

Так вот 10-е группы могут означать не только координаты угловых точек, но и их уровень (высоту по Z)
Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Штриховки рисовались по полилинии, которая была получена из геодезических координат.
Т.е. изначально полилинии имели не нулевую высоту, потом опускалась в уровень 0, и потом наносились штриховки.
Теперь все сходится и понятно. 10-е группы с тремя нулевыми координатами взялись именно отсюда.

Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Но вот не наносились ли штриховки на "не нулевую" полилинию, а потом опускались в 0 - я не уверен.
Судя по всему, штриховки наносились до опускания, но опускались вместе с полилинией, иначе нулевых 10-х групп не было бы, как в случае с опытом по созданию новых штриховок, на которых все срабатывало в приложенном файле. В автолиспе практикуется такой подход, что свойство по умолчанию не указывается в DXF-группах. Однако, тут не срастается тот момент, что LWPOLYLINE может быть только в одной плоскости, а координаты геодезические этого явно обеспечить не могут - все Z по-любому будут разные. Поэтому, похоже, у этих штриховок была еще более интересная история


Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
И ещё вопрос - а "ошибку контура" он в какой момент выдает?
Когда не может прочитать площадь штриховки. А вот с чем это связано, я пока не понял. Из простого можно пока сделать, чтоб текст "Ошибка контура" был красным (исправил в #16). После этого можно пройтись по ошибочным штриховкам и связать их с контурами. При двойном клике на штриховку запускается (вроде по умолчанию) команда _-HATCHEDIT (-РЕДШТРИХ) и там есть пункт сВязать. На запрос ткнуть мышкой - указать точку в области проблемной штриховки. Штриховка свяжется со своими полилиниями и восстановит свойство площади. Либо можно заново создать эту штриховку. Другого способа мне с наскока найти не удалось. Связать программно, а именно найти точку внутри контура - та еще эпопея, на которую я не готов. Может, кто что-то более дельного посоветует.
skkkk вне форума  
 
Автор темы   Непрочитано 14.05.2020, 14:05
#17
Yur.OK_SPb


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Когда не может прочитать площадь штриховки. А вот с чем это связано, я пока не понял. Из простого можно пока сделать, чтоб текст "Ошибка контура" был красным (исправил в #16). После этого можно пройтись по ошибочным штриховкам и связать их с контурами. При двойном клике на штриховку запускается (вроде по умолчанию) команда _-HATCHEDIT (-РЕДШТРИХ) и там есть пункт сВязать. На запрос ткнуть мышкой - указать точку в области проблемной штриховки. Штриховка свяжется со своими полилиниями и восстановит свойство площади. Либо можно заново создать эту штриховку. Другого способа мне с наскока найти не удалось. Связать программно, а именно найти точку внутри контура - та еще эпопея, на которую я не готов. Может, кто что-то более дельного посоветует.
Странно, но ведь в свойствах указывается площадь данной штриховки. Ладно, это уже мелочи, ведь 99% он подписывает, остальные я и вручную посмотрю.
А можно вопрос оформительского характера - как сделать, чтобы стиль текста данных подписей был в соответствии с текущим, а не стандартным? И как задать размер данного шрифта?
Yur.OK_SPb вне форума  
 
Непрочитано 14.05.2020, 14:21
1 | #18
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,470


Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Странно, но ведь в свойствах указывается площадь данной штриховки.
Автокад видит. Visual LISP - нет. Да и почему-то в DXF-кодах штриховок площадь не заложена.
Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
А можно вопрос оформительского характера - как сделать, чтобы стиль текста данных подписей был в соответствии с текущим, а не стандартным?
Откорректировал #16.

Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
И как задать размер данного шрифта?
В 61-й строке задается. Там комментарий
Код:
[Выделить все]
 ;;; высота текста
skkkk вне форума  
 
Непрочитано 14.05.2020, 16:53
#19
koMon


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
почему у штриховки внезапно не оказалось площади?
это косяк разрабов, имхо
Миниатюры
Нажмите на изображение для увеличения
Название: Zero_Area_Hatch.jpg
Просмотров: 21
Размер:	122.9 Кб
ID:	226163  
koMon на форуме  
 
Непрочитано 14.05.2020, 17:01
#20
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,470


Но у меня на этих ошибочных штриховках в свойствах площадь видна. У Yur.OK_SPb - тоже.
Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Странно, но ведь в свойствах указывается площадь данной штриховки.
Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
как сделать, чтобы стиль текста данных подписей был в соответствии с текущим, а не стандартным? И как задать размер данного шрифта?
Кстати, подумал, что я бы сделал стиль отличным от тех, что уже есть в чертеже. Или высоту. Или слой. Чтобы быстрым выбором можно было потом выбрать эти тексты.
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Добавление в центр штриховки текстового объекта со значением ее площади

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Revit c# Не пойму, что выдает в качестве площади объекта dvim Программирование 4 15.01.2017 21:25
Как перенести значение площади объекта в таблицу Libet AutoCAD 22 05.04.2015 15:15
Отрисовка полосы отвода линейного объекта Агент СмиТ Программирование 10 06.11.2012 10:05
Получение разрешения на строительство объекта капитального строительства maxummm Прочее. Архитектура и строительство 18 25.08.2010 20:31
Толщина шрифта текстового объекта в пользовательской линии ffpetrov AutoCAD 3 04.01.2007 12:17