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

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

Как автоматически проставить размеры на чертеже?

Ответ
Поиск в этой теме
Непрочитано 24.05.2007, 22:38
Как автоматически проставить размеры на чертеже?
MrKiLLER
 
Пенза
Регистрация: 24.05.2007
Сообщений: 41

Как автоматически проставить размеры на чертеже? (слышал что в проге "3D энерготехника" эта функция реализована)
Просмотров: 34168
 
Непрочитано 12.08.2013, 16:01
#21
pan

добрый человек
 
Регистрация: 23.02.2004
Глушь
Сообщений: 971


Цитата:
Сообщение от MrBrown Посмотреть сообщение
Код:
[Выделить все]
 (setvar (= "DIMDLI" h2))
замени на
Код:
[Выделить все]
 (setvar "DIMDLI" h2)
__________________
Правильно сформулированный вопрос содержит 90% ответа.
pan вне форума  
 
Непрочитано 12.08.2013, 16:11
#22
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


Bull, "век живи, век учись". Вот и учусь, шишки набиваю. Это первое. Второе: да и с такими фигурами я не работаю. И, наконец, третье: хочется поэкспериментировать. Как говаривал один философ-юморист, если сломанную вещь достаточно долго вертеть в руках, в конце концов придёт идея, как её отремонтировать.
pan, спасибо, частично помогло: размер рисуется, но не на запланированной высоте, а на той, какую покажет курсор. Буду думать дальше. Спасибо.
p.s. Bull, и потом, никто не запрещает поправить размерный стиль по умолчанию такой, чтобы шрифт был меньше. Конечно, придётся лист печатать не А4, а, допустим, А1.
MrBrown вне форума  
 
Непрочитано 12.08.2013, 16:17
#23
skkkk


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


<Удалил, т.к. повторил ответ pan'a>
Вообще, по-хорошему, значения системных переменных надо сначала запоминать:
Код:
[Выделить все]
(setq oldCMDECHO (getvar "CMDECHO")
потом менять, как показано выше, а потом возвращать обратно:
Код:
[Выделить все]
(setvar "CMDECHO" oldCMDECHO)
Но даже и так, если пользователь в момент запроса точки нажмет Escape, то переменные не восстановятся.
Чтоб восстанавливались, надо в начале кода (после строки (defun c:autodim ......) определить функцию *error*, примерно так:
Код:
[Выделить все]
(defun *error*(msg)
		(if oldCMDECHO (setvar "CMDECHO" oldCMDECHO))
		(princ)
	) ;defun *error*
И при командных построениях (с использованием функции command) весьма желательно отключать привязку (сис. переменная OSMODE)

Последний раз редактировалось skkkk, 12.08.2013 в 20:44.
skkkk вне форума  
 
Непрочитано 12.08.2013, 16:22
#24
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


skkkk, совершенно верно, мне уже подсказали то же. По задумке, мне необходимо получить значение высоты подъёма размерной линии вдвое больше высоты шрифта по умолчанию. Чтобы не указывать самому местонахождение размера, чтобы он сам проставлялся (слово-то какое праздничное - "проставлялся") на нужной высоте. Но, почему-то приходится курсором устанавливать высоту размера (длину выносных линий). По-видимому, мне надо как-то закрепить системную переменную DIMDLI. Хотя бы на время. Как?
p.s. а в перспективе (если хватит запала) хочу просто указать контур стены (или даже слой контура всех стен) и размеры в цикле сами появятся на нужной высоте от вершины к вершине полилинии-контура.
p.p.s а за "error" отдельное спасибо.
Итак, получилось следующее:
Код:
[Выделить все]
 (defun c:autodim(/ P1 P2 P3 P4 h1 h2) ; p1-p4 - четыре точки прямоугольника, h1-высота шрифта, h2-высота подъема 

размерной линии.

(defun *error*(msg)
	(if oldCMDECHO (setvar "CMDECHO" oldCMDECHO))
	(princ)
) ;defun *error*

(graphscr)
(setq oldCMDECHO (getvar "CMDECHO"); запоминаем значения системных переменных
(setvar "cmdecho" 0) ;отключение подсказок

;построение прямоугольника
(setq p1 (getpoint "первая вершина"))(terpri)
(setq p3 (getpoint "вторая вершина"))(terpri)
(setq p2 (list (car p3) (cadr p1)))
(setq p4 (list (car p1) (cadr p3)))
(command "._pline" p1 p2 p3 p4 "_c")

;образмеривание прямоугольника
(setq h1 (getvar "DIMTXT")) ;высота текста
(setq h2 (* h1 2))
(setvar "DIMDLI" h2)

(command "_dimlinear" p1 p2)
(setvar "cmdecho" 1) ;включение подсказок
(setvar "CMDECHO" oldCMDECHO) ;возвращаем значения системных переменных
(princ) ;тихий выход
) ; _end_of_defun
Всё равно размер не хочет становиться самостоятельно.
Буду думать.

Последний раз редактировалось MrBrown, 12.08.2013 в 16:41.
MrBrown вне форума  
 
Непрочитано 12.08.2013, 16:42
#25
skkkk


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


Цитата:
Сообщение от MrBrown Посмотреть сообщение
совершенно верно, мне уже подсказали то же
Не увидел сразу вторую страницу ветки...

Цитата:
Сообщение от MrBrown Посмотреть сообщение
Чтобы не указывать самому местонахождение размера, чтобы он сам проставлялся (слово-то какое праздничное - "проставлялся") на нужной высоте. Но, почему-то приходится курсором устанавливать высоту размера. По-видимому, мне надо как-то закрепить системную переменную DIMDLI. Хотя бы на время. Как?
В команде простановки размера нужно три точки. Так вот третью надо сначала вычислить и подставить в строку
Код:
[Выделить все]
(command "_dimlinear" p1 p2 ...)
Вычислить ее можно, например, посмотрев функцию polar
skkkk вне форума  
 
Непрочитано 12.08.2013, 16:43
#26
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


Цитата:
Сообщение от skkkk Посмотреть сообщение
Вычислить ее можно, например, посмотрев функцию polar
А, разве не подойдет значение h2 ? Зачем тогда я её изобретал?
MrBrown вне форума  
 
Непрочитано 12.08.2013, 16:54
#27
skkkk


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


Цитата:
Сообщение от MrBrown Посмотреть сообщение
А, разве не подойдет значение h2 ?
Не подойдет. Там нужна точка (список координат), а не длина (вещественное число).
Цитата:
Сообщение от MrBrown Посмотреть сообщение
Зачем тогда я её изобретал?
Она пойдет как аргумент для функции polar. Тут самое сложное определить угол для нее же. Чтоб точка всегда была вне прямоугольника.
И переменная DIMDLI тут ни при чем.
skkkk вне форума  
 
Непрочитано 12.08.2013, 17:00
#28
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


Цитата:
Сообщение от skkkk Посмотреть сообщение
Чтоб точка всегда была вне прямоугольника
Как раз это и не вызывает трудностей (ИМХО). Ведь все стены заштрихованы, следовательно, надо указать точку с противоположной стороны штриховки.
А танцы с бубном (с переменной DIMDLI) можно тогда вообще исключить из макроса?
Ну и для простоты, пока буду работать с размерами ортогональными (линейными), без параллельных.
MrBrown вне форума  
 
Непрочитано 13.08.2013, 04:25
#29
skkkk


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


Вот, закончив срочную работу, на радостях набросал на скорую руку. Пока - без обработки штриховок - все-таки, мороки с ними многовато, пользователю придется ткнуть мышью с той стороны от полилинии, где нужно ставить размеры. К тому же, так универсальней. Без каких-либо проверок, а потому - без претензий на "пятерку"
Код:
[Выделить все]
 (defun c:dimmer ( / adoc oldCMDECHO oldOSMODE en0 crv0 pt en-temp crv-temp param pt1 pt2 pt3)
	(vl-load-com);загружаем vla-функции
	(defun *error* (msg) ;определяем функцию обработки ошибок
		(if oldCMDECHO (setvar "CMDECHO" oldCMDECHO))
		(if oldOSMODE (setvar "OSMODE" oldOSMODE))
		(vla-endundomark adoc)
		(princ)
	) ;defun *error*
	(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) ;ставим начальную метку отката изменений
	(setq oldCMDECHO (getvar "CMDECHO"))
	(setq oldOSMODE (getvar "OSMODE"))
	(setvar "CMDECHO" 0)
	(setvar "OSMODE" 0)
	(setq en0 (car (entsel "\nВыберите полилинию для образмеривания: "))) ;выбираем полилинию и заключаем ее в переменную en0
	(setq crv0 (vlax-ename->vla-object en0));преобразовываем полилинию в vla-вариант (для работы с vla-функциями)
	(setq pt (getpoint "\nУкажите, с какой стороны от линии ставить размеры: ")) ;указываем сторону для построения временной подобной полилинии
	(command "_.OFFSET" (* 2 (getvar "DIMTXT")) en0 pt "") ;строим временную, подобную исходной полилинию на расстоянии 2хDIMTXT 
	(setq en-temp (entlast)) ;заключаем временную полилинию в переменную en-temp
	(setq crv-temp (vlax-ename->vla-object en-temp)) ;преобразовываем ее в vla-вариант 
	(setq param 0) ;переменная param здесь означает параметр полилинии - номер вершины полилинии, начиная с нуля 
					;(т.е., param=0 - это 1-я вершина, param=1 - 2-я вершина, param=0.5 - середина 1-го сегмента)
	(while (< param (vlax-curve-getEndParam crv0)) ;задаем цикл с условием: пока переменная param меньше, чем параметр последней вершины:
		(setq pt1 (vlax-curve-getPointAtParam crv0 param)) ;задаем точку pt1 с параметром, равным текущему значению переменной param - это начало сегмента
		(setq pt2 (vlax-curve-getPointAtParam crv0 (+ 1 param))) ;задаем точку pt2 с параметром, равным текущему значению переменной param плюс1 - это конец сегмента
		(setq pt3 (vlax-curve-getPointAtParam crv-temp (+ 0.5 param))) ;3-я точка - середина соответствующего сегмента временной полилинии
		(command "_.DIMALIGNED" pt1 pt2 pt3) ;строим размер
		(setq param (1+ param)) ;увеличиваем параметр на 1 и повторяется цикл для следующего сегмента, пока переменная param не станет больше параметра последней вершины 
	) ;конец цикла
	(entdel en-temp) ;удаляем временную полилинию
	(setvar "CMDECHO" oldCMDECHO)
	(setvar "OSMODE" oldOSMODE)
	(vla-endundomark adoc) ;ставим конечную метку отката изменений
) ;defun
skkkk вне форума  
 
Непрочитано 13.08.2013, 08:40
#30
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


skkkk, работает макрос правильно. Большое спасибо за ... да не за подсказку, а за всю работу, сделанную за меня
Однако, мы в конторе подстраиваем "читабельность" размеров изменением глобального масштаба. Таким образом пропорционально увеличивается и текст, и выноски, хотя сама высота текста стиля остается прежней. А в макросе высота размерной линии привязана к высоте текста.
Виноват, я сам неправильно поставил задачу. Но я и сам не предполагал, что привязываться надо не к высоте текста, а к масштабному коэффициенту (глобальный масштаб размерного стиля). Подправил макрос: заменил в 17-й строке "DIMTXT" на "DIMSCALE" и пришлось увеличить множитель с 2-х до 5-ти.
Спасибо, всё получилось!

p.s. Где бы почитать о vla-функциях, чтобы без лишней теории, на пальцах, с примерами?
______________________

p.p.s Увы, не всё. Приходится тыкать мышкой каждую полилинию. Что изменить в коде, чтобы выбирать их рамкой? Например, скрыть все слои кроме стен и все стены "стадом" выбрать. И запустить макрос на образмеривание.
Или иной вариант: выбираю нужные мне полилинии быстрым выбором (по слою ли, по цвету, это моё дело) и запускаю макрос.
То есть включить в макрос возможность предварительного множественного выбора примитивов.

Последний раз редактировалось MrBrown, 13.08.2013 в 11:30.
MrBrown вне форума  
 
Непрочитано 13.08.2013, 13:36
#31
skkkk


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


Цитата:
Сообщение от MrBrown Посмотреть сообщение
Большое спасибо
Да не за что, тем более, что в том объеме, в котором я ее решил, задачка довольно проста и заняла не более 15-ти расслабляющих минут.
Цитата:
Сообщение от MrBrown Посмотреть сообщение
работает макрос правильно
Это спорное утверждение, поскольку:
1. Нет обработки выбранного примитива. Т.е., если пользователь выберет отрезок, то начнутся чудеса
Вместо
Код:
[Выделить все]
(setq en0 (car (entsel "\nВыберите полилинию для образмеривания: ")))
надо сделать, например так:
Код:
[Выделить все]
	(while (null en0) 
		(setq en0 (car (entsel "\nВыберите полилинию для образмеривания: ")));выбираем полилинию и заключаем ее в переменную en0
		(if (and en0 (not (wcmatch (cdr (assoc 0 (entget en0))) "*POLYLINE")))
			(progn 
				(princ "\Это не полилиния")
				(setq en0 nil)
			)
		)
	)
2. Размерам бы правильней вставать на свой слой. Можно, конечно, перед запуском лиспа включить нужный слой вручную, а можно после строки отрисовки размера вставить строку
Код:
[Выделить все]
(vla-put-layer (vlax-ename->vla-object (entlast)) "Имя_слоя")
Однако, перед этим нужна еще одна проверка на наличие слоя в чертеже: если его нет, создать с нужными параметрами:
Код:
[Выделить все]
(if	(null (tblsearch "LAYER" "Имя_слоя"))
	(command "_.-LAYER" "_M" "Имя_слоя"............)
)
Аналогичная ситуация с размерным стилем.
3. Третья точка pt3 берется из середины сегмента временной полилинии, а ее середина далеко не всегда совпадает с серединой соответствующего сегмента исходной. Поэтому, при определенных настройках размерного стиля текст размера может оказаться смещенным от середины размерной линии.
4. Нет проверки на уже существующую "образмеренность" полилинии, т.е., при применении команды к уже образмеренной полилинии, размеры нанесутся второй раз. При единичном выборе - это не совсем критично, ведь пользователь сознателен (надеюсь) и не станет второй раз к одной полилинии применять команду, но если в перспективе речь идет о множественном выборе, да еще и автоматическом выборе всех полилиний слоя, то тут без такой проверки очень плохо будет - бардака в чертеже не избежать.
5. Думаю, что-то еще забыл.
Цитата:
Сообщение от MrBrown Посмотреть сообщение
Где бы почитать о vla-функциях, чтобы без лишней теории, на пальцах, с примерами?
Например, в книге "AutoLISP и Visual LISP в среде AutoCAD" Полещука Н.Н. и Лоскутова П.В.

Уважаемые модераторы! Мне кажется, тема в ходе обсуждения обрела иной смысл и просится в Программирование. Как вы считаете?
skkkk вне форума  
 
Непрочитано 13.08.2013, 14:21
#32
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


skkkk,
1. Именно так: я сперва превращаю все соединенные отрезки в полилинию, а уж потом... Кстати, для тех, кому интересно, вот макрос, взят отсюда же, с форума:
Код:
[Выделить все]
 ^C^C(defun C:JPL ( / ope ssnab )(setq ope (getvar "PEDITACCEPT"))(setvar "PEDITACCEPT" 1)(setq ssnab (ssget "_I"))(while (not ssnab)(setq ssnab (ssget)))(command "_pedit" "_Multiple" ssnab "" "_Join" 0 "")(setvar "PEDITACCEPT" ope)(setq ssnab nil)(princ));JPL;
2. Именно так: ручками заранее включаю размерный слой. И в самом начале работы над чертежом устанавливаю нужный размерный стиль. Это не напрягает.
3. Пока не волнует: уже четые чертежа - и всё становится правильно.
4. Не волнует: считаю себя адекватным. И макрос - только на моем компьютере.
5. Скромно напоминаю: хорошо бы вставить фишку для выбора рамкой и/или предварительным быстрым выбором всех нужных полилиний сразу.
6. Книгу Полищука со товарищи скачал. Ух, ну и библия! Спасибо.

Последний раз редактировалось MrBrown, 13.08.2013 в 14:27.
MrBrown вне форума  
 
Непрочитано 13.08.2013, 14:43
#33
skkkk


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


Цитата:
Сообщение от MrBrown Посмотреть сообщение
Скромно напоминаю: хорошо бы вставить фишку для выбора рамкой и/или предварительным быстрым выбором всех нужных полилиний сразу.
Для этого нужно исключить запрос стороны (переменная pt), а для этого надо обрабатывать штриховки. Когда смогу, пока не знаю. Постараюсь по мере возможности.
skkkk вне форума  
 
Непрочитано 13.08.2013, 14:48
#34
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


skkkk, Совершенно верно, мне как-то не пришло на ум, что при множественном выборе всё равно придется тыкать курсором по внешней стороне каждого примитива. А в случае отталкивания от штриховки - уже знаю - ещё тот геморрой, чтобы прописать всё как надо. Своё скромное напоминание снимаю. Ушел читать Полещука со товарищи. Сотоварищи. Что-то я завис с правописанием. Короче, углубился в чтение.
_____________________

Пришло на ум сделать такое: чтобы размеры не теснились, при малых расстояниях между вершинами pt1 и pt2 размеры вообще не проставлять. Составляю условие "ЕСЛИ" (пока неудачно):
Код:
[Выделить все]
 
	    (while (< param (vlax-curve-getEndParam crv0)) ;задаем цикл с условием: пока переменная param меньше, чем параметр последней вершины:
	        (setq pt1 (vlax-curve-getPointAtParam crv0 param)) ;задаем точку pt1 с параметром, равным текущему значению переменной param - это начало сегмента
	        (setq pt2 (vlax-curve-getPointAtParam crv0 (+ 1 param))) ;задаем точку pt2 с параметром, равным текущему значению переменной param плюс1 - это конец сегмента
	        (setq pt3 (vlax-curve-getPointAtParam crv-temp (+ 0.5 param))) ;3-я точка - середина соответствующего сегмента временной полилинии
		
		(if (> ("DISTANCE" pt1 pt2) crv-temp);если расстояние между вершинами больше указанного, продолжаем цикл, если меньше - переходим к следующему сегменту

	        	(command "_.DIMALIGNED" pt1 pt2 pt3)) ; строим размер.
	        (setq param (1+ param)) ;увеличиваем параметр на 1 и повторяется цикл для следующего сегмента, пока переменная param не станет больше параметра последней вершины 
	    ) ;конец цикла
Не работает. Что я накосячил?

Последний раз редактировалось MrBrown, 13.08.2013 в 15:29.
MrBrown вне форума  
 
Непрочитано 13.08.2013, 16:13
#35
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


("DISTANCE" pt1 pt2) - кавычки лишние
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.08.2013, 18:16
#36
skkkk


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


MrBrown, какой толщины обычно стены в единицах чертежа (от и до)? Какая штриховка? Каков масштаб штриховки? Желателен файл-пример.
Цитата:
Сообщение от MrBrown Посмотреть сообщение
Код:
[Выделить все]
..............
(if (> ("DISTANCE" pt1 pt2) crv-temp)
..............
Не работает. Что я накосячил?
Цитата:
Сообщение от Дима_ Посмотреть сообщение
("DISTANCE" pt1 pt2) - кавычки лишние
и нельзя сравнивать два аргумента разных типов. Аргумент (distance pt1 pt2) - вещественное число, а crv-temp - vla-объект (размер). Из этого vla-объекта нам надо извлечь ширину текста и ее уже сравнивать с расстоянием между pt1 и pt2. Но такого свойства, как ширина текста нет среди доступных vla-свойств размера. Тут я вижу пока два варианта (простой и не очень):
1. Задавать фиксированно минимальную ширину, ниже которой не строить размер;
2. Строить размер, брать у него свойство точки положения текста
Код:
[Выделить все]
...........
(command "_.DIMALIGNED" pt1 pt2 pt3)
(setq ptText (vla-TextPosition (vlax-ename->vla-object (entlast)))
...........
вычислять, между выносными линиями она или снаружи их, и если снаружи, то удалять размер.
skkkk вне форума  
 
Непрочитано 14.08.2013, 08:07
#37
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


Цитата:
Сообщение от skkkk Посмотреть сообщение
если снаружи, то удалять размер
Прекрасная мысль! Маленькие размеры проставлю вручную, где необходимо.
А вот и файлик (см. вложение) - типичная в наших краях исполнительная схема (Всё лишнее удалено). Образмерено макросом.
Включил строчку в код:
Код:
[Выделить все]
 (setq ptText (vla-TextPosition (vlax-ename->vla-object (entlast)))
Добавил в определение переменную ptText. Всё равно пишет "неверно сформированный список на входе".
Вложения
Тип файла: dwg
DWG 2007
КУ.dwg (116.4 Кб, 2811 просмотров)

Последний раз редактировалось MrBrown, 14.08.2013 в 08:21.
MrBrown вне форума  
 
Непрочитано 14.08.2013, 09:51
#38
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от MrBrown Посмотреть сообщение
(setq ptText (vla-TextPosition (vlax-ename->vla-object (entlast)))...
Добавил в определение переменную ptText. Всё равно пишет "неверно сформированный список на входе".
Вы бы книжку какую по лиспу вначале почитали:
Код:
[Выделить все]
 (vlax-safearray->list (vlax-variant-value (vla-get-textposition (vlax-ename->vla-object (entlast)))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.08.2013, 09:08
#39
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 359


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Вы бы книжку какую по лиспу вначале почитали
(Краснея, скромно прячу глазки во внутренний карман пиджака).
Читаю. Полещука. Увы, не понимаю я грамматику и структуру ЛИСПа. VBA - иное дело, хотя признаюсь, там я не мастер, однако макросы и диалоговые формы создаю сам. Для приложения Excel.
p.s. Вставил вашу строку. Не работает.
MrBrown вне форума  
 
Непрочитано 21.04.2014, 11:21
#40
skkkk


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


Цитата:
Сообщение от MrBrown Посмотреть сообщение
Приходится тыкать мышкой каждую полилинию. Что изменить в коде, чтобы выбирать их рамкой? Например, скрыть все слои кроме стен и все стены "стадом" выбрать. И запустить макрос на образмеривание.
Или иной вариант: выбираю нужные мне полилинии быстрым выбором (по слою ли, по цвету, это моё дело) и запускаю макрос.
То есть включить в макрос возможность предварительного множественного выбора примитивов.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Для этого нужно исключить запрос стороны (переменная pt), а для этого надо обрабатывать штриховки. Когда смогу, пока не знаю. Постараюсь по мере возможности.
Вроде смог вот:
Код:
[Выделить все]
 (defun c:dimmer ( / *error* adoc aspace ss n CountHatched 
							CountDoubleHatched CountNonHatched CountDimmed 
							crv param crv_pt fparam sparam pt1 pt2 middle_pt pt3
				)
	(vl-load-com)
	(defun *error*(msg)
		(vla-endundomark adoc)
		(sssetfirst nil nil)
		(princ)
	) ;defun *error*
	(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
	(if (= 1 (vla-get-ActiveSpace adoc))
		(setq aspace (vla-get-ModelSpace adoc))
		(setq aspace (vla-get-PaperSpace adoc))
	)
	(setq ss (ssget "_I" '((0 . "*POLYLINE"))))
	(if (null ss) (setq ss (ssget '((0 . "*POLYLINE")))))
	(if (null ss) (progn (princ "\nНе выбрано ни одной полилинии")(exit))) 
	(setq n 0 CountHatched 0 CountDoubleHatched 0 CountNonHatched 0 CountDimmed 0)
	(vla-ZoomAll (vlax-get-acad-object))
	(repeat (sslength ss)
		(setq crv (vlax-ename->vla-object (ssname ss n)))
		(setq param 0.3)
		(while (< param (vlax-curve-getEndParam crv))
			(setq crv_pt (trans (vlax-curve-getPointAtParam crv param) 0 1)
				  fparam (1+ (fix (vlax-curve-getParamAtPoint crv crv_pt))) 
				  sparam (1- fparam)
				  pt1 (trans (vlax-curve-getPointAtParam crv sparam) 0 1)
				  pt2 (trans (vlax-curve-getPointAtParam crv fparam) 0 1)
				  middle_pt (trans (polar pt1 (angle pt1 pt2) (distance pt1 pt2)) 0 1)
			)
			(if (or (ssget "_F" (list pt1 (polar pt2 (+ (angle pt1 pt2) (/ pi 2)) (* 5 (getvar "DIMSCALE")))) '((0 . "HATCH")))
					(ssget "_F" (list pt2 (polar pt1 (+ (angle pt1 pt2) (/ pi 2)) (* 5 (getvar "DIMSCALE")))) '((0 . "HATCH")))
				)
				(if (or (null (ssget "_F" (list pt1 (polar pt2 (+ (angle pt1 pt2) (/ (* 3 pi) 2)) (* 5 (getvar "DIMSCALE")))) '((0 . "HATCH"))))
						(null (ssget "_F" (list pt2 (polar pt1 (+ (angle pt1 pt2) (/ (* 3 pi) 2)) (* 5 (getvar "DIMSCALE")))) '((0 . "HATCH"))))
					)
					(progn
						(setq pt3 (trans (polar middle_pt (+ (angle pt1 pt2) (/ (* 3 pi) 2)) (* 5 (getvar "DIMSCALE"))) 0 1))
						(if (ssget "_C" (polar pt3 (/ pi 4) 0.001) (polar pt3 (/ (* 5 pi) 4) 0.001) '((0 . "DIMENSION")))
							(setq CountDimmed (1+ CountDimmed))
							(progn
								(vla-AddDimAligned aspace (vlax-3D-point pt1) (vlax-3D-point pt2) (vlax-3D-point pt3))
								(setq CountHatched (1+ CountHatched))
							)
						)
					)
					(setq CountDoubleHatched (1+ CountDoubleHatched))
				)
				(if (or (ssget "_F" (list pt1 (polar pt2 (+ (angle pt1 pt2) (/ (* 3 pi) 2)) (* 5 (getvar "DIMSCALE")))) '((0 . "HATCH")))
						(ssget "_F" (list pt2 (polar pt1 (+ (angle pt1 pt2) (/ (* 3 pi) 2)) (* 5 (getvar "DIMSCALE")))) '((0 . "HATCH")))
					)
					(progn
						(setq pt3 (trans (polar middle_pt (+ (angle pt1 pt2) (/ pi 2)) (* 5 (getvar "DIMSCALE"))) 0 1))
						(if (ssget "_C" (polar pt3 (/ pi 4) 0.001) (polar pt3 (/ (* 5 pi) 4) 0.001) '((0 . "DIMENSION")))
							(setq CountDimmed (1+ CountDimmed))
							(progn
								(vla-AddDimAligned aspace (vlax-3D-point pt1) (vlax-3D-point pt2) (vlax-3D-point pt3))
								(setq CountHatched (1+ CountHatched))
							)
						)
					)
					(setq CountNonHatched (1+ CountNonHatched))
				) ;_end of if
			) ;_end of if
			(setq param (1+ param))
		) ;_end of while
		(setq n (1+ n))
	)  ;_end of repeat
	(vla-ZoomPrevious (vlax-get-acad-object))
	(princ (strcat  "\nОбработано полилиний - " (vl-princ-to-string (sslength ss))
					"\nОбразмерено сегментов - " (vl-princ-to-string CountHatched)
					(if (> CountDimmed 0)
						(strcat "\nПропущено сегментов, ранее образмеренных - " (vl-princ-to-string CountDimmed))
						(strcat "")
					)
					(if (> CountNonHatched 0)
						(strcat "\nПропущено сегментов, не граничащих со штриховкой - " (vl-princ-to-string CountNonHatched))
						(strcat "")
					)
					(if (> CountDoubleHatched 0)
						(strcat "\nПропущено сегментов, граничащих со штриховкой с обеих сторон - " (vl-princ-to-string CountDoubleHatched))
						(strcat "")
					)
			)
	)
	(vla-endundomark adoc)
	(sssetfirst nil nil)
	(princ)
)  ;_end of defun
Тестировал на файле из поста #37
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как автоматически проставить размеры на чертеже?

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