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

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

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

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

Всем привет!
Мне нужно указать две точки на окружности и построить дугу с радиусом равным радиусу этой окружности,
затем проставить радиус полученной дуги.
Я не знаю, как программно задать радиус дуги, равный радиусу окружности?
И команды построения дуги и размера дуги не выполняются...
Подскажите, пожалуйста, как это сделать правильно...
Такой приблизительный "недокод":
Код:
[Выделить все]
 (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
Просмотров: 68
Размер:	14.0 Кб
ID:	262422  


Последний раз редактировалось Ingpro, 03.04.2024 в 12:26.
Просмотров: 4928
 
Непрочитано 02.04.2024, 10:23
#2
Кулик Алексей aka kpblc
Moderator

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


В r не getpoint засовывай, а (car (entsel)) - там из DXF и получишь и центр, и радиус.
Правда, дугу ты построишь немного "не ту", т.к. не факт что точки pt1 и pt2 будут лежать на окружности. Да и привязки могут сработать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 11:31
#3
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В r не getpoint засовывай, а (car (entsel)) - там из DXF и получишь и центр, и радиус.
Не особо понятно, как должна выглядеть строчка с радиусом?..
Ingpro вне форума  
 
Непрочитано 02.04.2024, 11:36
#4
Кулик Алексей aka kpblc
Moderator

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


(setq r (car (entsel "\nSelect circle : ")))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 11:52
#5
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq r (car (entsel "\nSelect circle : ")))
Спасибо, Алексей, а куда код 40 для радиуса?
Получится построить дугу по двум точкам и указанному радиусу окружности?..
Ingpro вне форума  
 
Непрочитано 02.04.2024, 12:06
#6
Кулик Алексей aka kpblc
Moderator

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


Построить - вряд ли. Программно создать - запросто.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 12:18
#7
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Построить - вряд ли. Программно создать - запросто.
Я и пытаюсь программно:
Код:
[Выделить все]
 (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 (car (entsel "\nSelect circle : "))); для указания радиуса дуги
(command "_arc" "_r") ; снова спрашивает точки?
  (command "_dimarc")   ; как указать на дугу, чтобы размер проставился автоматом?
    (setvar "osmode" oldosmode)
(princ) 
) 
Дуга строится не так, как хотелось бы... Радиус дуги не ассоциируется с радиусом окружности

Последний раз редактировалось Ingpro, 02.04.2024 в 12:24.
Ingpro вне форума  
 
Непрочитано 02.04.2024, 12:20
#8
Кулик Алексей aka kpblc
Moderator

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


Это - командные методы. Я говорю про entmake / entmakex или vla-методах
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 12:26
#9
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это - командные методы. Я говорю про entmake / entmakex или vla-методах
¿¿¿...для меня эти методы...???

Последний раз редактировалось Ingpro, 02.04.2024 в 13:36.
Ingpro вне форума  
 
Непрочитано 02.04.2024, 15:23
#10
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun c:arc2R_dim (/ circle start end center arc elist) 

  (if 
    (and (= (type (setq circle (vl-catch-all-apply (function (lambda () (car (entsel "\nSelect circle <Cancel> : "))))))) 'ename) 
         (= (type (setq start (vl-catch-all-apply (function (lambda () (getpoint "\nFirst point <Cancel> : ")))))) 'list)
         start
         (= (type (setq end (vl-catch-all-apply (function (lambda () (getpoint "\nEnd point <Cancel> : ")))))) 'list)
         end
    )
    (progn 
      (setq start      (vlax-curve-getclosestpointto circle start)
            end        (vlax-curve-getclosestpointto circle end)
            elist      (entget circle)
            center     (cdr (assoc 10 elist))
            angle_list (vl-sort 
                         (mapcar 
                           (function 
                             (lambda (x) 
                               (angle center x)
                             )
                           )
                           (list start end)
                         )
                         (function <)
                       )
            arc        (entmakex 
                         (list (cons 0 "ARC") 
                               '(100 . "AcDbCircle")
                               (cons 10 center)
                               (assoc 8 elist)
                               (cons 50 (car angle_list))
                               (cons 51 (cadr angle_list))
                               (cons 62 1)
                               (cons 40 (DISTANCE center start))
                         )
                       )
      )
      ;; Вот это уже не проверял и не смотрел - проверяй сам, чего сработает
      ;; (command "_.dimarc" "_none" arc)
      ;; (command "_.dimarc" "_none" (entlast))
    )
  )
)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 15:55
#11
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
;; Вот это уже не проверял и не смотрел - проверяй сам, чего сработает
39 ;; (command "_.dimarc" "_none" arc)
40;; (command "_.dimarc" "_none" (entlast))
Алексей, спасибо, но дуга получатся только влево...
А размер дуги ставится после указания на дугу, т.е. не запоминает (entlast?)...
Нижний код рисует дугу (но криво) и ставит размер дуги (предлагает выбрать дугу)
Код:
[Выделить все]
 (defun c:arc5R_dim (/ p1, p2, r, Arc)
 (setq oldosmode (getvar 'osmode)) 
  (setvar 'osmode 548); Center, INTersection, NEArest
(setq pt1 (getpoint  "\nFirst point: "))
(setq pt2 (getpoint  "\nSecond point: "))
 
(setq r (car (entsel "\nSelect circle : ")))
(setq r (getpoint  "\nSpecify radius: "))
  (command "_arc" pt1 pt2 r """")
(setq Arc (entlast))  
  (command "_dimarc" "Arc")   
      (setvar "osmode" oldosmode) 
(princ) 
) 
Миниатюры
Нажмите на изображение для увеличения
Название: Image 5.png
Просмотров: 30
Размер:	24.0 Кб
ID:	262433  Нажмите на изображение для увеличения
Название: Image 6.png
Просмотров: 28
Размер:	12.4 Кб
ID:	262435  

Последний раз редактировалось Ingpro, 02.04.2024 в 22:09.
Ingpro вне форума  
 
Непрочитано 02.04.2024, 16:00
#12
Кулик Алексей aka kpblc
Moderator

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


Ну так там не зря комментарии-то стоят )
Ну хорошо, попробуй убрать сортировку, но за результаты я отвечать не буду.
ПыСы возможно, тебе стоит заглянуть в тему "Научите лиспу на примере"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 20:29
#13
Ingpro


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


Код из поста #10, добавлено в конце (command "_dimarc")
Код:
[Выделить все]
 (defun c:arcR2_dim (/ circle start end center arc elist) 

  (if 
    (and (= (type (setq circle (vl-catch-all-apply (function (lambda () (car (entsel "\nSelect circle <Cancel> : "))))))) 'ename) 
         (= (type (setq start (vl-catch-all-apply (function (lambda () (getpoint "\nFirst point <Cancel> : ")))))) 'list)
         start
         (= (type (setq end (vl-catch-all-apply (function (lambda () (getpoint "\nEnd point <Cancel> : ")))))) 'list)
         end
    )
    (progn 
      (setq start      (vlax-curve-getclosestpointto circle start)
            end        (vlax-curve-getclosestpointto circle end)
            elist      (entget circle)
            center     (cdr (assoc 10 elist))
            angle_list (vl-sort 
                         (mapcar 
                           (function 
                             (lambda (x) 
                               (angle center x)
                             )
                           )
                           (list start end)
                         )
                         (function <)
                       )
            arc        (entmakex 
                         (list (cons 0 "ARC") 
                               '(100 . "AcDbCircle")
                               (cons 10 center)
                               (assoc 8 elist)
                               (cons 50 (car angle_list))
                               (cons 51 (cadr angle_list))
                               (cons 62 1)
                               (cons 40 (DISTANCE center start))
                         )
                       )
      )
(setq "arc" (entlast))    ; неудачная попытка запомнить имя дуги, чтобы не выбирать дугу для простановки размера
 (command "_dimarc") 
    )
  )
)
В ком. строке:
"Команда: ARCR2_DIM
Select circle <Cancel> :
First point <Cancel> :
End point <Cancel> : _dimarc
Выберите дугу или дуговой сегмент полилинии: nil
Выберите дугу или дуговой сегмент полилинии:
Положение размера длины дуги или [Мтекст/Текст/Угол/Частичный/Выноска]:
Размерный текст = 1319"

Возможно ли проставить размер без указания на дугу? И как можно подправить отрисовку дуги с правой стороны?
Миниатюры
Нажмите на изображение для увеличения
Название: Image 1.png
Просмотров: 18
Размер:	23.3 Кб
ID:	262439  
Ingpro вне форума  
 
Непрочитано 02.04.2024, 20:42
#14
Кулик Алексей aka kpblc
Moderator

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


Посмотри на мои закомментированные варианты. Попробуй хотя б один из них.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 21:34
#15
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Посмотри на мои закомментированные варианты. Попробуй хотя б один из них.
Они оба проставляют размер после выбора дуги...

Последний раз редактировалось Ingpro, 02.04.2024 в 22:05.
Ingpro вне форума  
 
Непрочитано 02.04.2024, 21:47
#16
Кулик Алексей aka kpblc
Moderator

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


Гидрит твою налево сказала королева. Раскомментируй строку - либо первую с command, либо вторую.
Подсказка: комментарий начинается с символа ";", о чем прямо говорит разметка на форуме.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2024, 21:48
#17
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Подсказка: комментарий начинается с символа ";", о чем прямо говорит разметка на форуме
Это я знаю, именно так и проверено...
Ingpro вне форума  
 
Непрочитано 02.04.2024, 22:05
1 | #18
Кулик Алексей aka kpblc
Moderator

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


Ну в таком случае DWF Reference в руки и создавать размер через тот же entmake / entmakex. ИМХО данных должно быть достаточно, кроме точки простановки размерной линии. Но ее и тем же getpoint можно получить ИМХО.

----- добавлено через 23 сек. -----
Не люблю я командные методы, хоть тресни.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.04.2024, 10:11
#19
Ingpro


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


Тест кода из поста #10
Если раскомментировать эту строку
(command "_.dimarc" "_none" (entlast))

First point <Cancel> :
End point <Cancel> : _.dimarc
Выберите дугу или дуговой сегмент полилинии: _none
Команда: nil


Если раскомментировать эту строку
(command "_.dimarc" "_none" arc)

Select circle <Cancel> :
First point <Cancel> :
End point <Cancel> : _.dimarc
Выберите дугу или дуговой сегмент полилинии: _none
Команда: nil


;;(command "_.dimarc" "_none" arc) ;не ставит рзм дуги
;;(command "_.dimarc" "_none" (entlast)) ;не ставит рзм дуги
;;(command "_dimarc" "arc" (entlast)) ;ставит рзм дуги, но просит выбрать дугу
;;(command "_dimarc" "arc" "_none" (entlast)) ;ставит рзм дуги, но просит выбрать дугу
размер дуги ставится после указания на дугу, т.е. не запоминает (entlast?)...
Ingpro вне форума  
 
Непрочитано 03.04.2024, 11:55
#20
name02


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


Выполни в автокаде _.dimarc и посмотри по очереди, что он спрашивает и делай выводы - чего и где нужно указывать
name02 вне форума  
 
Автор темы   Непрочитано 03.04.2024, 12:24
#21
Ingpro


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


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


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


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


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


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


Понятное дело что не работает - у тебя в программе не определяются переменные 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,102
Отправить сообщение для ltnchik1405 с помощью Skype™


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


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


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

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


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


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


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

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


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


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


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


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

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

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


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


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


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


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


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


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


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


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


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


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,808


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

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

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


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


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

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


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
можно ещё вариант без простановки размера, только дуга на окружности
Цитата:
Сообщение от Ingpro Посмотреть сообщение
Сбой происходит, если ПСК не МИР
добавлено
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 07.04.2024, 15:27
#41
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Сбой происходит, если ПСК не МИР
добавлено
koMon, thank you very much! Проверено с разными ПСК, отлично работает!
"<ЛКМ> дуга + дуговой размер, <ПКМ> дуга" - хорошо, что можно выбрать...
Я пытаюсь добавить вес линии (дуги) 0.5 после строки
Код:
[Выделить все]
 (vla-put-color arc 230)
Код:
[Выделить все]
 (vla-put-lineweight 050) 
но это не работает..?..
Код:
[Выделить все]
 (vla-put-lineweight arc aclnwt050)
а так получилось...

Последний раз редактировалось Ingpro, 07.04.2024 в 22:46.
Ingpro вне форума  
 
Непрочитано 07.04.2024, 21:33
1 | #42
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
(vla-put-lineweight 050)
обязано работать с дугой (vla-put-lineweight arc 050)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 07.04.2024, 22:44
#43
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
обязано работать с дугой (vla-put-lineweight arc 050)
Да, так тоже работает, а для чего aclnwt?
Ingpro вне форума  
 
Непрочитано 08.04.2024, 07:11
1 | #44
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
а для чего aclnwt?
Это автокадовская системная константа, определяющая вес линии https://help.autodesk.com/view/ACD/2...D-80E35EFE55D3

Последний раз редактировалось name02, 08.04.2024 в 07:36.
name02 вне форума  
 
Автор темы   Непрочитано 08.04.2024, 09:44
#45
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Это автокадовская системная константа, определяющая вес линии
Спасибо, но лисп работает и без aclnwt?

Код:
[Выделить все]
 (vla-put-lineweight arc aclnwt050)
(vla-put-lineweight arc 050)
Ingpro вне форума  
 
Непрочитано 08.04.2024, 10:07
#46
Кулик Алексей aka kpblc
Moderator

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


Конечно работает. Но использовать "магические" числа / строки так себе затея.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.04.2024, 10:32
#47
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Конечно работает. Но использовать "магические" числа / строки так себе затея.
Так всё-таки использовать aclnwt?
Можно ещё назначить слой размеру дуги (слой должен быть создан заранее):
Код:
[Выделить все]
 (vla-put-layer dim_arc "Размеры")
Ingpro вне форума  
 
Непрочитано 08.04.2024, 12:28
2 | #48
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Так всё-таки использовать aclnwt?
подобные константы созданы для мнемонического запоминания/понимания их назначения. использование их или присвоенных им значений не имеет никакой разницы на финальный результат.
__________________
K Lisp

Последний раз редактировалось koMon, 08.04.2024 в 12:49.
koMon вне форума  
 
Автор темы   Непрочитано 08.04.2024, 13:43
#49
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
подобные константы созданы для мнемонического запоминания/понимания их назначения. использование их или присвоенных им значений не имеет никакой разницы на финальный результат.
Так использовать или нет?
Ingpro вне форума  
 
Непрочитано 08.04.2024, 13:53
#50
koMon


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


Нажмите на изображение для увеличения
Название: aclnwt050.JPG
Просмотров: 8
Размер:	9.1 Кб
ID:	262539
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 08.04.2024, 13:57
#51
Ingpro


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


!ACLNWT050 возвращает 50
И...???...
А можно прямой ответ... Применять в коде?
Ingpro вне форума  
 
Непрочитано 08.04.2024, 13:59
#52
Кулик Алексей aka kpblc
Moderator

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


Offtop:
Цитата:
Сообщение от koMon Посмотреть сообщение
подобные константы созданы для мнемонического запоминания/понимания их назначения. использование их или присвоенных им значений не имеет никакой разницы на финальный результат.
Сугубо ИМХО: с точки зрения читабельности кода использование констант значительно лучше чем непонятные числа
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.04.2024, 14:23
1 | #53
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
!ACLNWT050 возвращает 50
И...???...
А можно прямой ответ... Применять в коде?
на фига применять в этом коде, если нужно присвоить вес 0.5 lwunits? ответ не применять!

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop:
Сугубо ИМХО: с точки зрения читабельности кода использование констант значительно лучше чем непонятные числа
соглашусь применительно не к этому моменту.
__________________
K Lisp

Последний раз редактировалось koMon, 08.04.2024 в 14:32.
koMon вне форума  
 
Автор темы   Непрочитано 16.05.2024, 10:26
#54
Ingpro


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


K Lisp Почему-то у меня выдает ошибку:
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '141074-483-2a00:1e10:23b:e-20240516' for key 'blog_id'
Мне удалось один раз зайти в блог и потестить dim_arc "с добавленной возможностью выбора
дугового сегмента полилинии и переключение по пробелу привязки
размерного текста к курсору или к середине дугового размера".

Очень удобные добавления, спасибо, koMon!
Если проблемы с блогом на сайте, может быть есть смысл добавить этот код в эту тему?
см. изображение:
сюда по ссылке K Lisp можно зайти, а если нажать ссылку Дуга, размер дуги на дуге, окружности, дуговом сегменте полилинии.
выдает ошибку...
Миниатюры
Нажмите на изображение для увеличения
Название: блог.png
Просмотров: 10
Размер:	33.1 Кб
ID:	263084  

Последний раз редактировалось Ingpro, 16.05.2024 в 10:34.
Ingpro вне форума  
 
Непрочитано 16.05.2024, 10:45
#55
koMon


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


можно конечно и сюда, но блог же тоже надо наполнять) и ремонтировать!
__________________
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