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

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

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

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

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


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

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


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


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


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


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


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


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


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


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


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


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


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


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


Код:
[Выделить все]
 (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
Сообщений: 495


Цитата:
Сообщение от Кулик Алексей 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
Просмотров: 26
Размер:	24.0 Кб
ID:	262433  Нажмите на изображение для увеличения
Название: Image 6.png
Просмотров: 24
Размер:	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
С.-Петербург
Сообщений: 39,844


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


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


Код из поста #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
Просмотров: 17
Размер:	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
С.-Петербург
Сообщений: 39,844


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


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


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


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


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


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

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


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

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


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


Тест кода из поста #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
Сообщений: 185


Выполни в автокаде _.dimarc и посмотри по очереди, что он спрашивает и делай выводы - чего и где нужно указывать
name02 вне форума  
Ответ
Вернуться   Форум 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