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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нарисовать дугу на окружности с радиусом этой окружности

Нарисовать дугу на окружности с радиусом этой окружности

Ответ
Поиск в этой теме
Непрочитано 02.04.2024, 10:17
Нарисовать дугу на окружности с радиусом этой окружности
Ingpro
 
Регистрация: 11.07.2022
Сообщений: 775

Всем привет!
Мне нужно указать две точки на окружности и построить дугу с радиусом равным радиусу этой окружности,
затем проставить радиус полученной дуги.
Я не знаю, как программно задать радиус дуги, равный радиусу окружности?
И команды построения дуги и размера дуги не выполняются...
Подскажите, пожалуйста, как это сделать правильно...
Такой приблизительный "недокод":
Код:
[Выделить все]
 (defun c:arc2R_dim ()
  (setq oldosmode (getvar 'osmode))
  (setvar 'osmode 544); INTersection, NEArest

  (setq pt1 (getpoint  "\nFirst point in circle "))
  (setq pt2 (getpoint  "\nSecond point in circle "))
  (setq r (getpoint  "\nSelect circle ")) ; для указания радиуса дуги

;Как задать радиус дуги, равный радиусу окружности?

  (command "_arc" "_r") ;???
 
  (command "_dimarc")
  
  (setvar "osmode" oldosmode)
(princ) 
) 

Миниатюры
Нажмите на изображение для увеличения
Название: Image 1.png
Просмотров: 70
Размер:	14.0 Кб
ID:	262422  


Последний раз редактировалось Ingpro, 03.04.2024 в 12:26.
Просмотров: 5019
 
Автор темы   Непрочитано 03.04.2024, 12:24
#21
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Выполни в автокаде _.dimarc и посмотри по очереди, что он спрашивает и делай выводы - чего и где нужно указывать
Это не надо...
Мне хотелось бы, чтобы программа поставила размер последней нарисованной дуги без выбора дуги, это выполнимо?
Ingpro вне форума  
 
Непрочитано 03.04.2024, 13:11
1 | #22
name02


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


Сделай так:
Код:
[Выделить все]
 (command	"_.dimarc" (list arc start) "_none" start "_none" end)
Нашел тут
name02 вне форума  
 
Автор темы   Непрочитано 03.04.2024, 14:23
#23
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
(command** "_.dimarc" (list arc start) "_none" start "_none" end)
Если эту строку добавить в код Алексея, см. пост #10, то размер дуги проставляется автоматом, но прямо по дуге без отступа, потом ручками отодвигать...
И код из поста #10 не строит дугу в правой части окружности - дуга уходит влево.
У меня получился код, который делает почти то, что мне нужно, кроме автопростановки размера дуги:
Код:
[Выделить все]
 (defun c:arcRdim2 (/ p1 p2 r ent)
(vl-load-com)
  (setvar 'osmode 545) ; Endpoint, INTersection, NEArest
(setq p1 (getpoint "\nFirst point: "))
(setq p2 (getpoint "\nAny point circle between first and end point arc: "))
 
(setq r (car (entsel "\nSelect circle : "))); to specify the arc radius
(setq r (getpoint  "\nEnd point: "))
(command "_arc" p1 p2 r)
(command "_dimarc")
  (setvar 'osmode 183)
(princ) 
) 
Если этой строкой
Цитата:
Сообщение от name02 Посмотреть сообщение
(command** "_.dimarc" (list arc start) "_none" start "_none" end)
заменить (command "_dimarc") в коде #23 , то в ком. строке такая запись
Команда: _.dimarc
Выберите дугу или дуговой сегмент полилинии:
Команда: _none Неизвестная команда "NONE".
и размер не строится...
Миниатюры
Нажмите на изображение для увеличения
Название: 29.gif
Просмотров: 5
Размер:	182.7 Кб
ID:	262459  

Последний раз редактировалось Ingpro, 03.04.2024 в 20:46.
Ingpro вне форума  
 
Непрочитано 03.04.2024, 14:54
1 | #24
name02


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


Понятное дело что не работает - у тебя в программе не определяются переменные arc, start и end
кроме того строка 07 - бессмысленная, т.к. переменная r переопределяется в строке 08
Должно быть так:
Код:
[Выделить все]
 (defun c:arcRdim2 (/ p1 p2 r arc)
  (vl-load-com)
  (setvar 'osmode 545)			; Endpoint, INTersection, NEArest
  (setq p1 (getpoint "\nFirst point: "))
  (setq	p2 (getpoint
	     "\nAny point circle between first and end point arc: "
	   )
  )

;;;(setq r (car (entsel "\nSelect circle : "))); to specify the arc radius
  (setq r (getpoint "\nEnd point: "))
  (command "_arc" p1 p2 r)
;;;(command "_dimarc")
  (setq arc (entlast))
  (command "_.dimarc" (list arc p1) "_none" p1 "_none" r)
  (setvar 'osmode 183)
  (princ)
)
name02 вне форума  
 
Непрочитано 03.04.2024, 15:02
#25
ltnchik1405

проектировщик
 
Регистрация: 03.07.2009
Кострома
Сообщений: 1,132
Отправить сообщение для ltnchik1405 с помощью Skype™


Может отталкиваться от того, что дуга длиной равной радиусу получается, когда угол между двумя радиусами равен 1 радиан?
ltnchik1405 вне форума  
 
Автор темы   Непрочитано 03.04.2024, 15:31
#26
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Должно быть так:
name02, спасибо за корректировку, но размер ставится прямо на дугу, однако...
Нужно каким-то образом добавить в код возможность указания местоположения размера дуги.
Что-то типа:
(getpoint b "\n Местоположение размера длины дуги: "))
Или задать фиксированный отступ размерной линии от дуги, например, 50.
Как это можно правильно добавить?

Последний раз редактировалось Ingpro, 03.04.2024 в 15:51.
Ingpro вне форума  
 
Непрочитано 03.04.2024, 16:29
1 | #27
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Нужно каким-то образом добавить в код возможность указания местоположения размера дуги.
Что-то типа:
(getpoint b "\n Местоположение размера длины дуги: "))
Замени 15 строку на :

Код:
[Выделить все]
 (defun c:arcRdim2 (/ old_osmode p1 p2 r arc)
  (vl-load-com)
  (setq old_osmode (getvar 'osmode))
  (setvar 'osmode 545)			; Endpoint, INTersection, NEArest
  (setq p1 (getpoint "\nFirst point: "))
  (setq	p2 (getpoint
	     "\nAny point circle between first and end point arc: "
	   )
  )
  (setq r (getpoint "\nEnd point: "))
  (command "_arc" p1 p2 r)
  (setq arc (entlast))
  (command "_.dimarc" (list arc p1))
  (setvar 'osmode old_osmode)
  (princ)
)
name02 вне форума  
 
Непрочитано 03.04.2024, 17:33
#28
koMon


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


Ingpro, так цель какая? дуговой размер, дуга+дуговой размер?
__________________
K Lisp

Последний раз редактировалось koMon, 04.04.2024 в 11:39.
koMon вне форума  
 
Автор темы   Непрочитано 03.04.2024, 18:27
1 | 1 #29
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Замени 15 строку на :
name02, спасибо большое, теперь код работает так, как хотелось - строит дугу на окружности по 2-м точкам и ставит размер дуги.
Думаю лучше поменять местами строки 5 и 6, чтобы сначала указать первую и конечную точки, а затем указать на оружность между этими точками:
Код:
[Выделить все]
  (defun c:arcRdim2 (/ old_osmode p1 p2 r arc)
  (vl-load-com)
  (setq old_osmode (getvar 'osmode))
  (setvar 'osmode 545)			; Endpoint, INTersection, NEArest
  (setq p1 (getpoint "\nFirst point: "))
  (setq r (getpoint "\nEnd point: "))
  (setq p2 (getpoint "\nAny point circle between first and end point arc: "))
   (command "_arc" p1 p2 r)
  (setq arc (entlast))
  (command "_.dimarc" (list arc p1))
  (setvar 'osmode old_osmode)
  (princ)
)
----- добавлено через ~12 мин. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
name02, так цель какая? дуговой размер, дуга+дуговой размер?
Изначально планировалось построить дуговой размер на окружности между двумя точками,
но так как дуговой размер предполагает наличие дуги, ничего лучшего не придумалось, как нарисовать для этого дугу, а потом применить дуговой размер.

Вариант с рус. комментами:
Код:
[Выделить все]
 ;;  строит дугу на окружности по 2-м точкам и ставит размер дуги
 (defun c:arc_dim (/ old_osmode p1 p2 r arc)
  (vl-load-com)
  (setq old_osmode (getvar 'osmode))
  (setvar 'osmode 545)		; КОНточка, ПЕРесечение, БЛИжайшая
  (setq p1 (getpoint "\nПервая точка дуги: "))
(setq r (getpoint "\nВторая точка дуги: "))
  (setq	p2 (getpoint  "\nЛюбая точка на окружности между первой и второй точками: "))
    (command "_arc" p1 p2 r)
  (setq arc (entlast))
  (command "_.dimarc" (list arc p1))
  (setvar 'osmode old_osmode)
  (princ)
)
Миниатюры
Нажмите на изображение для увеличения
Название: 27.gif
Просмотров: 11
Размер:	118.2 Кб
ID:	262458  

Последний раз редактировалось Ingpro, 03.04.2024 в 19:20.
Ingpro вне форума  
 
Непрочитано 04.04.2024, 10:06
1 | #30
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
но так как дуговой размер предполагает наличие дуги
как бы нет)
Код:
[Выделить все]
 
(defun c:dim_arc (/ circle dim_arc_point_1 dim_arc_textposition dim_arc_object)
	(setq circle (vlax-ename->vla-object (car (entsel "\nВыберите окружность: ")))
		  dim_arc_point_1 (vlax-curve-getclosestpointto circle (getpoint "\nУкажите первую точку дугового размера: "))
		  dim_arc_point_2 (vlax-curve-getclosestpointto circle (getpoint dim_arc_point_1 "\nУкажите вторую точку дугового размера: "))
		  dim_arc_textposition dim_arc_point_2
	)
	(setq dim_arc_object (vla-adddimarc (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)))) 
				   						(vla-get-center circle)
				   						(vlax-3d-point dim_arc_point_1)
				   						(vlax-3d-point dim_arc_point_2)
				   						(vlax-3d-point dim_arc_textposition)
						 )
	)
	(while (and (setq dim_arc_textposition (grread t 5 0)) (/= 3 (car dim_arc_textposition)))
				(vlax-put dim_arc_object 'textposition (cadr dim_arc_textposition))
				(vlax-put dim_arc_object 'arcpoint (cadr dim_arc_textposition))
	)
	(princ)
)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 04.04.2024, 10:22
#31
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
как бы нет)
koMon, это здорово!!! Спасибо!
Миниатюры
Нажмите на изображение для увеличения
Название: 30.gif
Просмотров: 13
Размер:	154.2 Кб
ID:	262468  

Последний раз редактировалось Ingpro, 04.04.2024 в 12:04.
Ingpro вне форума  
 
Непрочитано 05.04.2024, 09:40
#32
ltnchik1405

проектировщик
 
Регистрация: 03.07.2009
Кострома
Сообщений: 1,132
Отправить сообщение для ltnchik1405 с помощью Skype™


Цитата:
Сообщение от koMon Посмотреть сообщение
как бы нет)
Код:
Дуга не нарисовалась, только размер проставился.
ltnchik1405 вне форума  
 
Автор темы   Непрочитано 05.04.2024, 10:05
1 | 1 #33
Ingpro


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


Цитата:
Сообщение от ltnchik1405 Посмотреть сообщение
Дуга не нарисовалась, только размер проставился.
Код из поста #30 проставляет дуговые размеры на окружности !без дуги!, если нужна дуга используйте коды из поста #29.
Ingpro вне форума  
 
Непрочитано 05.04.2024, 17:46
#34
koMon


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


Цитата:
Сообщение от ltnchik1405 Посмотреть сообщение
Дуга не нарисовалась
если нужна ещё и дуга, то можно подпилить.
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 05.04.2024, 18:52
#35
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
если нужна ещё и дуга, то можно подпилить.
Хотелось бы увидеть и такой код...
Ingpro вне форума  
 
Непрочитано 06.04.2024, 13:38
1 | #36
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
увидеть и такой код
Код:
[Выделить все]
 
(defun c:dim_arc (/ circle dim_arc_point_1 arc_point_list dim_arc_textposition dim_arc arc)
	(setq circle (vlax-ename->vla-object (car (entsel "\nВыберите окружность/дугу: ")))
	      dim_arc_point_1 (trans (vlax-curve-getclosestpointto circle (trans (getpoint "\nУкажите первую точку дугового размера: ") 1 0)) 0 1)
	      dim_arc_point_2 (trans (vlax-curve-getclosestpointto circle (trans (getpoint dim_arc_point_1 "\nУкажите вторую точку дугового размера: ") 1 0)) 0 1)
	      arc_point_list (list dim_arc_point_1 dim_arc_point_2)
	      dim_arc_textposition dim_arc_point_2
	      dim_arc (vla-adddimarc (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)))) 
				     (vla-get-center circle)
				     (vlax-3d-point (trans dim_arc_point_1 1 0))
				     (vlax-3d-point (trans dim_arc_point_2 1 0))
				     (vlax-3d-point dim_arc_textposition)
		      )
	      arc (vla-addarc (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
		       	      (vla-get-center circle)
		       	      (vla-get-radius circle)
		       	      (angle (vlax-get circle 'center) (trans (car arc_point_list) 1 0))
		       	      (angle (vlax-get circle 'center) (trans (cadr arc_point_list) 1 0))
		  )
	)
  	(vla-put-color arc 230)
  	(princ "\n<ЛКМ> дуга + дуговой размер, <ПКМ> дуга")
	(while (and (setq dim_arc_textposition (grread t 5 0)) (not (member (car dim_arc_textposition) '(3 25))))
;;;		(vlax-put dim_arc 'textposition (cadr dim_arc_textposition))
	  	(vlax-put dim_arc 'arcpoint (trans (cadr dim_arc_textposition) 1 0))
	  	(if (not (equal (vla-get-measurement dim_arc) (vla-get-arclength arc) 1e-6))
		  	(progn
			  (setq arc_point_list (reverse arc_point_list))  
			  (vla-put-startangle arc (angle (vlax-get circle 'center) (trans (car arc_point_list) 1 0)))
			  (vla-put-endangle arc (angle (vlax-get circle 'center) (trans (cadr arc_point_list) 1 0)))
			)
	  	)
	)
  	(if (= 25 (car dim_arc_textposition)) (vla-erase dim_arc))
	(princ)
)
__________________
K Lisp

Последний раз редактировалось koMon, 07.04.2024 в 21:31.
koMon вне форума  
 
Автор темы   Непрочитано 06.04.2024, 15:05
#37
Ingpro


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


koMon, спасибо,
но что-то пошло не так в коде #36
; ошибка: неверно сформированный список на входе
Неизвестная команда "DIM_ARC"

А этот код предполагает дуговой размер на окружности и + на дуге? "\nВыберите окружность/дугу:
Или рисует дугу на окружности и ставит размер?
А эта строка отвечает за положение размерного текста?
Код:
[Выделить все]
 (while (and (setq dim_arc_textposition (grread t 5 0)) (/= 3 (car dim_arc_textposition)))
А это можно изменить, чтобы текст размера по умолчанию ставился по середине дугового размера?
Как в стандартной команде "Длина дуги"...
Миниатюры
Нажмите на изображение для увеличения
Название: Image 1.png
Просмотров: 4
Размер:	7.9 Кб
ID:	262491  

Последний раз редактировалось Ingpro, 06.04.2024 в 15:36.
Ingpro вне форума  
 
Непрочитано 06.04.2024, 17:37
#38
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
что-то пошло не так в коде #36
подправил

----- добавлено через ~31 мин. -----
Цитата:
Сообщение от Ingpro Посмотреть сообщение
чтобы текст размера по умолчанию ставился по середине дугового размера
аналогично. закомментировал положение текста по курсору.
__________________
K Lisp

Последний раз редактировалось koMon, 06.04.2024 в 18:10.
koMon вне форума  
 
Автор темы   Непрочитано 06.04.2024, 18:31
#39
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
подправил
Спасибо большое! Теперь четко работает! Спасибо, что раскрасили дугу цветом 230, удобно...
И на дуге можно нарисовать дугу с таким же радиусом.
koMon, если не трудно, можно ещё вариант без простановки размера, только дуга на окружности...
Почему-то иногда происходит сбой в программе, дуга чертится в одну сторону, а размер - в другую сторону и садится
прямо на окружность?... см. рис.2. Сбой происходит, если ПСК не МИР, а так всё нормально.
Миниатюры
Нажмите на изображение для увеличения
Название: 29.gif
Просмотров: 10
Размер:	114.7 Кб
ID:	262492  Нажмите на изображение для увеличения
Название: 32.gif
Просмотров: 10
Размер:	75.0 Кб
ID:	262493  

Последний раз редактировалось Ingpro, 06.04.2024 в 21:29.
Ingpro вне форума  
 
Непрочитано 07.04.2024, 13:09
1 | #40
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
можно ещё вариант без простановки размера, только дуга на окружности
Цитата:
Сообщение от Ingpro Посмотреть сообщение
Сбой происходит, если ПСК не МИР
добавлено
__________________
K Lisp
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нарисовать дугу на окружности с радиусом этой окружности



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сохранить Компас файл в pdf чтобы окружности отображались как окружности, а не многоугольники? Ro-man Компас 2 13.05.2022 08:39
Сопряжение точки и окружности egorus2014 AutoCAD 7 02.04.2022 21:33
Как построить касательную к окружности? prajdziswet LISP 28 09.01.2020 13:20
Как нарисовать дугу определённой длины Jerald AutoCAD 11 09.11.2018 17:52
окружности под любым углом САМОДЕЛ AutoCAD 7 17.02.2009 11:55