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

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

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

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

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

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

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


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


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

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


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


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


А попроще нет? Чтобы площадь штриховки сразу прописывал по середине штриховки?
Тут даже ближе к нужному его программа 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
Сообщений: 5,107


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

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


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

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


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


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


Цитата:
Сообщение от 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
Сообщений: 105


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

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

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


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


@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
Сообщений: 105


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

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


Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Кто-нибудь может подправить код?
Я в этом, честно говоря, вообще не шарю(((
А че не так-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.05.2020, 21:23
#13
Yur.OK_SPb


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


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


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


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
Сообщений: 105


Цитата:
Сообщение от 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,680


Я залез в 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
Сообщений: 105


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


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


Цитата:
Сообщение от 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
Сообщений: 1,809


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


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


Но у меня на этих ошибочных штриховках в свойствах площадь видна. У Yur.OK_SPb - тоже.
Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Странно, но ведь в свойствах указывается площадь данной штриховки.
Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
как сделать, чтобы стиль текста данных подписей был в соответствии с текущим, а не стандартным? И как задать размер данного шрифта?
Кстати, подумал, что я бы сделал стиль отличным от тех, что уже есть в чертеже. Или высоту. Или слой. Чтобы быстрым выбором можно было потом выбрать эти тексты.
skkkk вне форума  
 
Непрочитано 14.05.2020, 17:08
#21
koMon


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


плавающий косяк
koMon вне форума  
 
Непрочитано 14.05.2020, 17:14
#22
skkkk


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


koMon, нет мыслей, как побороть? У меня только одна пришла пока из недолго реализуемых: при появлении косяка внутри цикла зумировать на этой штриховке с запросом выбрать точку в заштрихованной области и командным методом подставить эту точку в _-HATCHEDIT. Костыль еще тот, но мысли окончились пока.
Пробовал метод AppendOuterLoop, но это почему-то не сработало


Offtop:
Цитата:
Сообщение от Yur.OK_SPb Посмотреть сообщение
Тема отделена
Спасибо, Алексей.
skkkk вне форума  
 
Непрочитано 14.05.2020, 17:15
#23
koMon


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


что характерно. если штриховать указанием точки внутри, то ок, а если объект, то не ок.

----- добавлено через ~4 мин. -----
Watson, you are THE perfectionist, ain't you?

----- добавлено через ~10 мин. -----
у них однозначно хромает механизм вычисления площади у косячных плиний. и я как-то даже не вижу как это можно решить малой кровью программно, кроме как найти и обезвредить ручками)))
koMon вне форума  
 
Автор темы   Непрочитано 14.05.2020, 20:14
#24
Yur.OK_SPb


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Кстати, подумал, что я бы сделал стиль отличным от тех, что уже есть в чертеже. Или высоту. Или слой. Чтобы быстрым выбором можно было потом выбрать эти тексты.
Там фишка в том, что рядом со штриховками прописываются их номера обычным текстом. А тут Мтекст с их площадью. Больше в слое, кроме полилиний, штриховок, номеров и площадей ничего нет) Поэтому даже через выбор подобных эти значения площадей легко выделить и что-либо с ними сделать.
Yur.OK_SPb вне форума  
 
Непрочитано 14.05.2020, 21:28
#25
Alex.gomel


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


Цитата:
Сообщение от koMon Посмотреть сообщение
что характерно. если штриховать указанием точки внутри, то ок, а если объект, то не ок.
----- добавлено через ~10 мин. -----
у них однозначно хромает механизм вычисления площади у косячных плиний. и я как-то даже не вижу как это можно решить малой кровью программно, кроме как найти и обезвредить ручками)))
Объект имеет самопересечение - поэтому и возникает проблема. При указании точки внутри строиться новый контур и участок самопересечения не учитывается.

Делал проверку на самопересечение контура, если оно имеется - перестраивал штриховку с вычислением внутренней точки контура. Для получения корректных координат внутренней точки (были еще и островки) приходилось повозиться, использовал наложение на контур ортогональной сетки с поиском самых длинных линий.
http://https://forums.autodesk.com/t5/autodesk-api-russkiy/geometricheskiy-tsentr-ne-tsentr-tyazhesti-mnogougolnika/m-p/7685147#M822

Последний раз редактировалось Alex.gomel, 14.05.2020 в 21:39.
Alex.gomel вне форума  
 
Непрочитано 14.05.2020, 21:41
#26
koMon


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


Цитата:
Сообщение от Alex.gomel Посмотреть сообщение
Объект имеет самопересечение
Характерность не в самопересечениях, а в том как механизм обнаружения замкнутой площади коряво работает для разных евохних))) выборов. Ведь казалось бы цель одна, а результат печально разный. Кстати если посмотреть на описание штриховки, то и оно будет почему-то разным для разных выборов. Налицо стратегическая ошибка, имхо.
koMon вне форума  
 
Непрочитано 24.05.2020, 15:12
#27
Куинбус Флестрин


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


Добрый день!
А есть ли возможность лисп из поста №8 переделать, что-бы происходило автоматическое проставление всех площадей одновременно для каждого из выбранных замкнутых контуров (например контуров выполненных поллиниями).
Программа Areas2Field от Lee Mac проставляет площади отдельных контуров, вычисляет суммарную площадь выбранных контуров и если нужно все это можно внести в ячейку таблицы. Но может возможно, после выбора (через Selsim например), контуров (на одном слое или одного цвета или по другим характеристикам), получить проставленные мтекстом внутри этих контуров их площади?
Спасибо!
Куинбус Флестрин вне форума  
 
Непрочитано 29.05.2020, 00:03
#28
skkkk


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


Цитата:
Сообщение от Куинбус Флестрин Посмотреть сообщение
например контуров выполненных поллиниями
А какие еще "напримеры"?
skkkk вне форума  
 
Непрочитано 29.05.2020, 15:03
#29
koMon


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
А какие еще "напримеры"?
окружность, эллипс, фигура, сплайн
koMon вне форума  
 
Непрочитано 29.05.2020, 15:17
#30
skkkk


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


koMon, это-то ясное дело - лошадь, раз рога. Какие типы объектов с площадью бывают, нам известно. Просто центроиды для всех лень обрабатывать
skkkk вне форума  
 
Непрочитано 29.05.2020, 15:27
#31
koMon


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


get boundingbox back!
koMon вне форума  
 
Непрочитано 26.06.2020, 01:18
#32
kacugu

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
это только у меня или у всех?
Offtop: Сайт снова стал доступен без впн (такое ощущение, что это как-то связано с разблокировкой телеграма)
kacugu вне форума  
 
Непрочитано 26.06.2020, 04:58
1 | #33
gumel


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


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

Код:
[Выделить все]
  (defun c:centr (/)
  (vl-load-com)
  (setq acadObject (vlax-get-acad-object))
  (setq acadDocument (vla-get-ActiveDocument acadObject))
  (setq numSpace (vla-get-ActiveSpace acadDocument))
  (cond	((= numSpace 1)
	 (setq ActSpace (vla-get-ModelSpace acadDocument))
	)
	((= numSpace 0)
	 (setq ActSpace (vla-get-PaperSpace acadDocument))
	)
  )
  (setq	sset (ssget '((-4 . "<OR")
		      (0 . "CIRCLE")
		      (0 . "ELLIPSE")
		      (-4 . "<AND")
		      (0 . "LWPOLYLINE")
		      (70 . 1)
		      (-4 . "AND>")
		      (0 . "REGION")
		      (-4 . "OR>")
		     )
	     )
  )
  (setq	count	  (sslength sset)
	i	  0
	n	  0
	m	  0
	k	  0
	summX	  0
	summY	  0
	summareas 0
	listX	  (list)
	listY	  (list)
	listAreas (list)
  )
  (while (<= i (1- count))
    (setq objType (cdr (assoc 0 (entget (ssname sset i)))))
    (setq Obj (vlax-ename->vla-object (ssname sset i)))
    (if	(= objType "LWPOLYLINE")
      (progn
	(setq vla_region
			  (car (vlax-safearray->list
				 (vlax-variant-value
				   (vla-addregion
				     (vla-objectidtoobject
				       (vla-get-document
					 Obj
				       )
				       (vla-get-ownerid
					 Obj
				       )
				     )
				     (vlax-safearray-fill
				       (vlax-make-safearray
					 vlax-vbobject
					 (cons 0 (1- (length (list Obj))))
				       )
				       (list Obj)
				     )
				   )
				 )
			       )
			  )
	      centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-centroid vla_region))
			  )
	      CurrArea
			  (vla-get-Area vla_region)
	)
	(setq ListX	(append ListX (list (car centerPtLst)))
	      ListY	(append ListY (list (cadr centerPtLst)))
	      ListAreas	(append ListAreas (list CurrArea))
	)
	(vla-delete vla_region)
      )
    )

    (if	(= objType "REGION")
      (progn
	(setq centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-centroid Obj))

			  )
	      CurrArea
			  (vla-get-Area obj)
	)
	(setq ListX	(append ListX (list (car centerPtLst)))
	      ListY	(append ListY (list (cadr centerPtLst)))
	      ListAreas	(append ListAreas (list CurrArea))
	)
      )
    )
    (if	(or (= objType "CIRCLE") (= objType "ELLIPSE"))
      (progn
	(setq centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-center Obj))
			  )
	      CurrArea
			  (vla-get-Area obj)
	)
	(setq ListX	(append ListX (list (car centerPtLst)))
	      ListY	(append ListY (list (cadr centerPtLst)))
	      ListAreas	(append ListAreas (list CurrArea))
	)
      )
    )
    (setq i (1+ i))
  )
  (setq	summXlist (mapcar '* ListX ListAreas)
	summYlist (mapcar '* ListY ListAreas)
  )
  (foreach n summXList (setq summX (+ summX n)))
  (foreach m summYList (setq summY (+ summY m)))
  (foreach k ListAreas (setq summAreas (+ summAreas k)))
  (setq	centerPtList (list (/ summX summAreas) (/ summY summAreas) 0)
	pointCoord   (ptnList->variantArray centerPtList)
	PointObj     (vla-addPoint ActSpace pointCoord)
  )
  (princ)
)

(defun ptnList->variantArray (ptsList / arrayActSpace sArray)
  (setq	arrayActSpace
	 (vlax-make-safearray
	   vlax-vbdouble
	   (cons 0
		 (- (length ptsList) 1)
	   )
	 )
  )
  (setq sArray (vlax-safearray-fill arrayActSpace ptsList))
  (vlax-make-variant sArray)
)
gumel вне форума  
 
Непрочитано 06.04.2023, 14:23
#34
mvartem


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Код:
Скажите пожалуйста:

1. как в этом коде сделать отображение площади в "метрах" или в единицах, установленных в uNIts?

2. прочитал тему, так и не понял, как модифицировать код для выравнивания значения по центру масс штриховки

upd: со вторым вопросом разобрался)

Последний раз редактировалось mvartem, 06.04.2023 в 19:42.
mvartem вне форума  
 
Непрочитано 07.04.2023, 16:43
#35
skkkk


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


mvartem, дайте файл, где нужно это делать. Там куча всякого есть, что может повлиять на отображение единиц.
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