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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как команда _MEASUREGEOM _DISTANCE Multiple points только не измерять а вставлять объекты

Как команда _MEASUREGEOM _DISTANCE Multiple points только не измерять а вставлять объекты

Ответ
Поиск в этой теме
Непрочитано 30.01.2020, 15:41 #1
Как команда _MEASUREGEOM _DISTANCE Multiple points только не измерять а вставлять объекты
otsva
 
Регистрация: 05.10.2019
Сообщений: 11

Подскажите решение как разместить объекты вдоль линии, полилинии через определенное не одинаковое расстояние.Как команда _MEASUREGEOM _DISTANCE указываем первую точку Multiple points только не измерять а вставлять объекты.Идти инструментом _MEASUREGEOM _DISTANCE указываем первую точку Multiple points по ранее начерченой линии,полилинии но с возможностью в конце линии,полилинии вставить объект.
Спасибо!
Просмотров: 2242
 
Непрочитано 30.01.2020, 16:03
#2
Кулик Алексей aka kpblc
Moderator

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


Чего? Ни шиша не понял. Чем не устраивает _.divide или _.measure с соответствующими настройками - тайна.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.01.2020, 16:29
1 | #3
skkkk


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Чем не устраивает _.divide или _.measure
А разве они умеют
Цитата:
Сообщение от otsva Посмотреть сообщение
через определенное не одинаковое расстояние
?
skkkk вне форума  
 
Непрочитано 30.01.2020, 16:41
#4
Кулик Алексей aka kpblc
Moderator

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


Через неодинаковое - по-моему, нет. Правда, я вообще из стартового поста ничего не понял
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.01.2020, 17:09
#5
otsva


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Чего? Ни шиша не понял. Чем не устраивает _.divide или _.measure с соответствующими настройками - тайна.
Извините если объяснил не правильно, команды _.divide или _.measure вставляют блоки через одинаковое расстояние.У меня есть полилиния или линия длиной 1000. Через каждые 100 полилиния или линия имеет поворот. Нужно разместить объекты вдоль линии, полилинии через не одинаковое расстояние(которое можно задать самому) от начала до конца на всей протяженности 1000.
Может есть lisp.
otsva вне форума  
 
Непрочитано 30.01.2020, 17:23
#6
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,401


У Lee Mac'а есть такой lisp Align Objects to Curve. Вот только не знаю как быть с заданным расстоянием.
AlexCondor вне форума  
 
Непрочитано 30.01.2020, 17:23
1 | #7
skkkk


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


Честно скажу, из этого объяснения я понял еще меньше, чем из первого . И даже засомневался в том, что до этого понял

Во-первых, как линия (если это имеется в виду ОТРЕЗОК, или _LINE) может иметь повороты? Во-вторых, не понял, как это?
Цитата:
Сообщение от otsva Посмотреть сообщение
от начала до конца на всей протяженности 1000
После каждого вставленного блока вновь запрашивать расстояние до следующего, что ли?
В-третьих, неплохо бы показать нам файлик, возможно с пояснениями прям внутри и изображением исходного и желаемого результата (как есть и как надо), а лучше - с изображением всех возможных вариантов исходных и желаемых результатов.
skkkk вне форума  
 
Автор темы   Непрочитано 30.01.2020, 17:58
#8
otsva


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Честно скажу, из этого объяснения я понял еще меньше, чем из первого . И даже засомневался в том, что до этого понял

Во-первых, как линия (если это имеется в виду ОТРЕЗОК, или _LINE) может иметь повороты? Во-вторых, не понял, как это?

После каждого вставленного блока вновь запрашивать расстояние до следующего, что ли?
В-третьих, неплохо бы показать нам файлик, возможно с пояснениями прям внутри и изображением исходного и желаемого результата (как есть и как надо), а лучше - с изображением всех возможных вариантов исходных и желаемых результатов.
Полилиния длиной 1000 с поворотами через каждые 100. На ней нужно разместить блоки через расстояние которое можно задать самому. Да как решение после каждого вставленного блока вновь запрашивать расстояние до следующего. Командой _.divide или _.measure этого не сделать. Ещё раз извиняюсь я не эксперт. А линию в полилинию думал командой _pedit
otsva вне форума  
 
Непрочитано 30.01.2020, 18:21
#9
Melx


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


Если вас утраивает вариант после каждого вставленного блока запрашивать расстояние, то просто включите в привязку "Продолжение".
Melx вне форума  
 
Автор темы   Непрочитано 30.01.2020, 20:14
#10
otsva


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Честно скажу, из этого объяснения я понял еще меньше, чем из первого . И даже засомневался в том, что до этого понял

Во-первых, как линия (если это имеется в виду ОТРЕЗОК, или _LINE) может иметь повороты? Во-вторых, не понял, как это?

После каждого вставленного блока вновь запрашивать расстояние до следующего, что ли?
В-третьих, неплохо бы показать нам файлик, возможно с пояснениями прям внутри и изображением исходного и желаемого результата (как есть и как надо), а лучше - с изображением всех возможных вариантов исходных и желаемых результатов.
Нужно расположить объекты(круги) на полилинии через неодинаковое расстояние!
Вложения
Тип файла: dwg
DWG 2013
Чертеж1.dwg (36.5 Кб, 10 просмотров)

Последний раз редактировалось otsva, 30.01.2020 в 20:43.
otsva вне форума  
 
Непрочитано 31.01.2020, 11:30
1 | #11
skkkk


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


Нашлось у меня что-то подобное, чуть поправил, вроде, то, что надо, судя по ТЗ. Радиус окружности можно задать свой в строке 19.

Код:
[Выделить все]
 ;;; Функция расставляет окружности вдоль по полилинии через указанные расстояния.
;;; Первая запрашиваемая точка задает начало отсчета, она не обязательно должна быть началом полилинии, 
;;; от нее расстановка продолжается в сторону конца (последней вершины).
;;; В первой запрошенной точке происходит проверка на наличие в ней окружности (с целью исключения дубликатов),
;;; в дальнейших точках проверка не производится.


(defun C:EXMEASURE ( / *error* 
				  RADIUS oldDYNMODE oldVTENABLE oldDIMZIN oldCMDECHO
				  pl_en pl_vla pt_0 ss dst_0 prmpt dst_n pt_n i flag
			  )
	(defun *error* (msg)
		(setvar "DYNMODE" oldDYNMODE)
		(setvar "VTENABLE" oldVTENABLE)
		(setvar "DIMZIN" oldDIMZIN)
		(setvar "CMDECHO" oldCMDECHO)
		(princ)
	)
	(setq RADIUS 18)
	(setq oldDYNMODE (getvar "DYNMODE")
		  oldVTENABLE (getvar "VTENABLE")
		  oldDIMZIN (getvar "DIMZIN")
		  oldCMDECHO (getvar "CMDECHO")
	)
	(setvar "DYNMODE" 3)
	(setvar "VTENABLE" 7)
	(setvar "DIMZIN" 0)
	(setvar "CMDECHO" 0)
	(setq pl_en (car (entsel "\nУкажите полилинию:")))
	(if pl_en 
		(progn
			(setq pl_vla (vlax-ename->vla-object pl_en))
			(if (not (wcmatch (cdr (assoc 0 (entget pl_en))) "*POLYLINE"))
				(progn (princ "\nЭто не полилиния. Функция отменена") (exit))
			)
		)
		(progn (princ "\nПолилиния не выбрана. Функция отменена") (exit))
	)
	(if pl_vla (setq pt_0 (getpoint "\nУкажите стартовую точку на полилинии:")))
	(if pt_0 (setq dst_0 (vlax-curve-getDistAtPoint pl_en pt_0))(progn (princ "\nФункция отменена") (exit)))
	(if dst_0 (setq  prmpt (strcat "\nРасстояние в точке: " (rtos dst_0 2 2)))
		(progn (princ "\nТочка не принадлежит полилинии. Функция отменена")(exit))
	)
	(if (and dst_0 (setq ss (ssget "_F" (list pt_0 (polar pt_0 pi RADIUS)) (list (cons 0 "CIRCLE")))))
		(repeat (setq i (sslength ss))
			(if (equal pt_0 (assoc 10 (entget (ssname ss (setq i (1- i))))) 0.01) (setq flag T))
		)
	)	
	(if (and pt_0 dst_0 ss flag)
		(setq prmpt (strcat prmpt "\nВ этой точке уже есть окружность."))
		(vla-AddCircle
			(vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
			(vlax-3D-point pt_0)
			RADIUS
		)
		
	)
	(if (and pt_0 dst_0) (setq dst_n T))
	(while dst_n
		(setq dst_n (getdist pt_0 (strcat prmpt "\nВведите расстояние до следующей точки: ")))
		(if dst_n 
			(progn 
				(setq dst_n (+ dst_n dst_0))
				(if (setq pt_n (vlax-curve-getPointAtDist pl_en dst_n))
					(progn
						(vl-cmdf "_.ZOOM" "_C" pt_n "")
						(vla-AddCircle
							(vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
							(vlax-3D-point pt_n)
							RADIUS
						)
						(setq pt_0 pt_n
							  dst_0 dst_n
							  prmpt (strcat "\nРасстояние в точке: " (rtos dst_n 2 2))
							  
						)
					)
					(progn
						(princ "\nДлина полилинии меньше суммы всех указанных длин. Функция завершена")
						(setq dst_n nil)
						(princ)
					)
				)
			)
			(progn (princ "\nФункция остановлена")(exit))
		)
	)
)
skkkk вне форума  
 
Автор темы   Непрочитано 31.01.2020, 22:55
#12
otsva


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Нашлось у меня что-то подобное, чуть поправил, вроде, то, что надо, судя по ТЗ. Радиус окружности можно задать свой в строке 19.
То что нyжнo!!! ОГРОМНОЕ СПАСИБО!!!
Есть ещё вопрос. Вместо окружности можно блок вставлять за точку вставки или это весь код нyжнo переписать?

Последний раз редактировалось otsva, 31.01.2020 в 23:03.
otsva вне форума  
 
Непрочитано 31.01.2020, 23:23
#13
skkkk


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


Цитата:
Сообщение от otsva Посмотреть сообщение
Вместо окружности можно блок вставлять за точку вставки или это весь код нyжнo переписать?
Можно-то - можно, но блин, отчего бы сразу ТЗ, как положено не изложить - переделывал ведь свой давний, особо не пригодившийся код, с блока на окружность . Недолго, конечно, дольше причесывал, да обработку ошибок добавлял, но все же. Поправлю по возможности, но быстро - не обещаю.
Вы бы пока потестировали его посерьезнее: может, еще чего всплывёт. Блок небось как-то ориентировать надо, или еще чего. Не особо охота по десять раз возвращаться к этому вопросу. И файл с блоком хорошо бы приложить.
skkkk вне форума  
 
Автор темы   Непрочитано 03.02.2020, 10:18
#14
otsva


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Можно-то - можно, но блин, отчего бы сразу ТЗ, как положено не изложить - переделывал ведь свой давний, особо не пригодившийся код, с блока на окружность . Недолго, конечно, дольше причесывал, да обработку ошибок добавлял, но все же. Поправлю по возможности, но быстро - не обещаю.
Вы бы пока потестировали его посерьезнее: может, еще чего всплывёт. Блок небось как-то ориентировать надо, или еще чего. Не особо охота по десять раз возвращаться к этому вопросу. И файл с блоком хорошо бы приложить.
Два дня теста.Всё работает отлично! В блоках после вставки будут редактироватся атрибуты. Главное чтобы блоки вставлялись за базовую точку.Ориентировать блоки надо так как на чертеже.
Спасибо!
Вложения
Тип файла: dwg
DWG 2018
blok.dwg (41.0 Кб, 4 просмотров)
otsva вне форума  
 
Непрочитано 04.02.2020, 11:02
1 | #15
skkkk


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


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


Код:
[Выделить все]
 ;;; Функция расставляет блоки вдоль по полилинии через указанные расстояния.
;;; Первая запрашиваемая точка задает начало отсчета, она не обязательно должна быть началом полилинии, 
;;; от нее расстановка продолжается в сторону конца (последней вершины).
;;; В первой запрошенной точке происходит проверка на наличие в ней блока (с целью исключения дубликатов),
;;; в дальнейших точках проверка не производится.
;;; Использована вспомогательная функция от Lee Mac LM:setdynpropvalue.

(defun C:EXMEASURE ( / *error* 
				  blockname oldDYNMODE oldVTENABLE oldDIMZIN oldCMDECHO oldOSMODE
				  pl_en pl_vla pt_0 ss dst_0 pt_01 prmpt dst_n pt_n pt_n1 i flag
			  )
	(defun *error* (msg)
		(setvar "DYNMODE" oldDYNMODE)
		(setvar "VTENABLE" oldVTENABLE)
		(setvar "DIMZIN" oldDIMZIN)
		(setvar "CMDECHO" oldCMDECHO)
		(setvar "OSMODE" oldOSMODE)
		(princ)
	)
	(setq blockname "blok")
	(setq oldDYNMODE (getvar "DYNMODE")
		  oldVTENABLE (getvar "VTENABLE")
		  oldDIMZIN (getvar "DIMZIN")
		  oldCMDECHO (getvar "CMDECHO")
		  oldOSMODE (getvar "OSMODE")
	)
	(setvar "DYNMODE" 3)
	(setvar "VTENABLE" 7)
	(setvar "DIMZIN" 0)
	(setvar "CMDECHO" 0)
	(setq pl_en (car (entsel "\nУкажите полилинию:")))
	(if pl_en 
		(progn
			(setq pl_vla (vlax-ename->vla-object pl_en))
			(if (not (wcmatch (cdr (assoc 0 (entget pl_en))) "*POLYLINE"))
				(progn (princ "\nЭто не полилиния. Функция отменена") (exit))
			)
		)
		(progn (princ "\nПолилиния не выбрана. Функция отменена") (exit))
	)
	(setvar "OSMODE" 577)
	(if pl_vla (setq pt_0 (getpoint "\nУкажите стартовую точку на полилинии:")))
	(setvar "OSMODE" oldOSMODE)
	(if pt_0 
		(setq dst_0 (vlax-curve-getDistAtPoint pl_en pt_0)
			  pt_01 (vlax-curve-getPointAtDist pl_en (+ dst_0 0.001))
		)
		(progn (princ "\nФункция отменена") (exit))
	)
	(if dst_0 (setq  prmpt (strcat "\nРасстояние в точке: " (rtos dst_0 2 2)))
		(progn (princ "\nТочка не принадлежит полилинии. Функция отменена")(exit))
	)
	(if (and dst_0 (setq ss (ssget "_F" (list pt_0 (polar pt_0 pi 1.5)) (list (cons 0 "INSERT")))))
		(repeat (setq i (sslength ss))
			(if (equal pt_0 (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))) 0.01) (setq flag T))
		)
	)	
	(if (and pt_0 dst_0 ss flag)
		(setq prmpt (strcat prmpt "\nВ этой точке уже есть блок."))
		(setq blc_vla 
			(vla-InsertBlock  	
				(vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
				(vlax-3D-point pt_0)
				blockname 1 1 1 0
			)
		)
		
	)
	(if blc_vla (LM:setdynpropvalue blc_vla "Угол1"  (angle pt_0 pt_01)))
	(if (and pt_0 dst_0) (setq dst_n T))
	(while dst_n
		(setq dst_n (getdist pt_0 (strcat prmpt "\nВведите расстояние до следующей точки: ")))
		(if dst_n 
			(progn 
				(setq dst_n (+ dst_n dst_0)
					  pt_n1 (vlax-curve-getPointAtDist pl_en (+ dst_n 0.001))
				
				)
				(if (setq pt_n (vlax-curve-getPointAtDist pl_en dst_n))
					(progn
						(vl-cmdf "_.ZOOM" "_C" pt_n "")
						(setq blc_vla 
							(vla-InsertBlock  	
								(vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
								(vlax-3D-point pt_n)
								blockname 1 1 1 0
							)
						)
						(if blc_vla (LM:setdynpropvalue blc_vla "Угол1"  (angle pt_n pt_n1)))
						(setq pt_0 pt_n
							  dst_0 dst_n
							  prmpt (strcat "\nРасстояние в точке: " (rtos dst_n 2 2))
							  
						)
					)
					(progn
						(princ "\nДлина полилинии меньше суммы всех указанных длин. Функция завершена")
						(setq dst_n nil)
						(princ)
					)
				)
			)
			(progn (princ "\nФункция остановлена")(exit))
		)
	)
)
;; Set Dynamic Block Property Value  -  Lee Mac
;; Modifies the value of a Dynamic Block property (if present)
;; blk - [vla] VLA Dynamic Block Reference object
;; prp - [str] Dynamic Block property name (case-insensitive)
;; val - [any] New value for property
;; Returns: [any] New value if successful, else nil

(defun LM:setdynpropvalue ( blk prp val )
    (setq prp (strcase prp))
    (vl-some
       '(lambda ( x )
            (if (= prp (strcase (vla-get-propertyname x)))
                (progn
                    (vla-put-value x (vlax-make-variant val (vlax-variant-type (vla-get-value x))))
                    (cond (val) (t))
                )
            )
        )
        (vlax-invoke blk 'getdynamicblockproperties)
    )
)
(princ "\nC:EXMEASURE")
(princ)
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как команда _MEASUREGEOM _DISTANCE Multiple points только не измерять а вставлять объекты



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SW 2014 Возможно ли в эскизе выбрать только штриховку? voverrr SolidWorks 0 10.09.2016 12:37
Как определить стоимость проектных работ, если не известна стоимость строительства? dextron3 Поиск литературы, чертежей, моделей и прочих материалов 37 27.08.2014 18:32
В АА2008 отсутствует команда, это только у меня? vadim 2000 Вертикальные решения на базе AutoCAD 19 10.01.2008 17:49
Команда или макрос для выделения в файле только текста ct_ycte Программирование 46 06.09.2007 15:07