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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Линии и дуги в полилинии.

Линии и дуги в полилинии.

Ответ
Поиск в этой теме
Непрочитано 11.12.2008, 22:13 #1
Mozgunov
 
Начинающий проектировщик
 
Санкт-Петербург
Регистрация: 07.02.2008
Сообщений: 443

Уважаемые программисты. Решил написать скрипт для своих нужд. Вроде всё устраивает, только нужно соединить все прорисованные линии в полилинию, только как бы это сделать попроще? Листинг кода ниже. Заранее спасибо!

Код:
[Выделить все]
(defun С:ugol ( ) 

(setvar "ORTHOMODE" 1)
(setvar "OSMODE"1)

(setq pt1 (getpoint "\n Первая точка: "))
(setq pt2 (getpoint "\n Вторая точка: "))
(setq dist1 (getdist "\n Диаметр огибаемой: "))
(setq dist2 (getdist "\n Диаметр огибающей: "))

(setq ugl (angle pt1 pt2));; Получаем уголок между точками от горизонтальной оси

(setq uglplus90 (+ ugl (/ pi 2) ) );;Угол плюс 90 в радианах
(setq uglplus180 (+ ugl  pi ) );;Угол плюс 180 в радианах
(setq uglplus270 (+ ugl  (* pi 1.5) ) );;Угол плюс 270 в радианах
(setq uglplus360 (+ ugl  (* pi 2.0) ) );;Угол плюс 360 в радианах

(setq uglminus90 (- ugl (/ pi 2) ) );;Угол плюс 90 в радианах
(setq uglminus180 (- ugl  pi ) );;Угол плюс 180 в радианах
(setq uglminus270 (- ugl  (* pi 1.5) ) );;Угол плюс 270 в радианах

(setq pt3 (POLAR pt1  uglplus90 (/ dist1 2) ));;точки примыкают к грани
(setq pt4 (POLAR pt2  uglplus90 (/ dist1 2) ));;точки примыкают к грани

(setq pt5 (POLAR pt1  uglplus90 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm5 (POLAR pt1  uglplus90 (/ dist1 2) ));;следующие от примыкания

(setq pt6 (POLAR pt2  uglplus90 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm6 (POLAR pt2  uglplus90  (/ dist1 2) ));;следующие от примыкания


(setq pt7 (POLAR pt1  uglplus180 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm7 (POLAR pt1  uglplus180 (/ dist1 2) ));;следующие от примыкания


(setq pt8 (POLAR pt2  ugl (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm8 (POLAR pt2  ugl (/ dist1 2) ));;следующие от примыкания


(setq pt9 (POLAR pt1  uglplus270 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm9 (POLAR pt1  uglplus270 (/ dist1 2) ));;следующие от примыкания


(setq pt10 (POLAR pt2 uglminus90 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm10 (POLAR pt2 uglminus90  (/ dist1 2) ));;следующие от примыкания


;;Считаем хвостики 
;;;;;;;;;;;;;;;;;;

(setq pt11 ( POLAR pt9 uglplus360 (* 3 dist2)  ) );;для первого хвостика
(setq pt12 ( POLAR ptm9 uglplus360 (* 3 dist2)  ) );;для первого хвостика

(setq pt13 ( POLAR pt10 uglplus180 (* 3 dist2)  ) );;для первого хвостика
(setq pt14 ( POLAR ptm10 uglplus180 (* 3 dist2)  ) );;для первого хвостика

;;Прорисовка

(setvar "ORTHOMODE" 0)
(setvar "OSMODE"0)

(command "_.PLINE"  pt3 pt4 "") ;;

(command "_.PLINE"  pt5 pt6 "") ;;

(command "_.ARC"  pt5 pt7 pt9 ) ;;Внешняя дуга первого скругления
(command "_.ARC"  pt6 pt8 pt10 ) ;;Внешняя дуга второго скругления
(command "_.ARC"  ptm5 ptm7 ptm9 ) ;;Внутрянняя дуга первого скругления
(command "_.ARC"  ptm6 ptm8 ptm10 );;Внутрянняя дуга второго скругления

;;Рисуем хвостики
(command "_.PLINE"  pt9 pt11 pt12 ptm9 "") ;;
(command "_.PLINE"  pt10 pt13 pt14 ptm10 "") ;;
 


(setvar "ORTHOMODE" 1)
(setvar "OSMODE"1)
)
(setq tmposmode (getvar "osmode"))
это я уже доработал чтобы не вырубались привязки постоянно
__________________
dmtools.ru

Последний раз редактировалось Кулик Алексей aka kpblc, 11.12.2008 в 22:48.
Просмотров: 7618
 
Непрочитано 11.12.2008, 23:26
#2
Кулик Алексей aka kpblc
Moderator

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


Ну если используешь командные методы, то и строй сразу целиком полилинию. Примерно так:
Код:
[Выделить все]
(command "_.pline" pt3 pt4 "_a" pt5 "_l" pt6 "_close")
Твой код не анализировал (хотя принципиальных ошибок в нем порядочно).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.12.2008, 23:30
#3
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


А как скруглять полилинию буду? Я пользуюсь для прорисовки скруглением _ARC. А вот как скруглить полилинию?

мне нужно чтобы в результате получился законтуренная полилиния-крючок.

Ещё вопрос. А что такое "_a" и "_l" ?

Это на дугу и на линию переход?

Проверил. Понял. Огромное спасибо!
__________________
dmtools.ru

Последний раз редактировалось Кулик Алексей aka kpblc, 11.12.2008 в 23:45.
Mozgunov вне форума  
 
Непрочитано 11.12.2008, 23:46
#4
Кулик Алексей aka kpblc
Moderator

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


А пользоваться кнопкой [Правка] не получается?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.12.2008, 23:56
#5
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Я только когда увидел понял. Получается. А ответьте всё таки что такое "_a" и "_l" ? А то её (дугу) выгибает странным образом . Хотя все точки по которым прорисовывается дуга вроде на своем месте (см. рисунок) Почему её так выгибает? Прорисовка идёт 2>1>3
Миниатюры
Нажмите на изображение для увеличения
Название: krck.JPG
Просмотров: 126
Размер:	18.9 Кб
ID:	13407  
__________________
dmtools.ru

Последний раз редактировалось Mozgunov, 12.12.2008 в 00:09.
Mozgunov вне форума  
 
Непрочитано 12.12.2008, 00:19
#6
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
Command: _.pline
<...>
Specify next point or [Arc/Halfwidth/Length/Undo/Width]:
_a -> переход на дуговую часть.
_l -> переход на линейную часть после дуговой.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.12.2008, 00:22
#7
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Спасибо. У меня русский автокад стоит не вижу этой спецификации. А гнёт почему не скажите? Как на картинке в "5" посте. Причём когда вручную по контуру провожу полилинию всё нормально прорисовывается.
__________________
dmtools.ru

Последний раз редактировалось Mozgunov, 12.12.2008 в 00:29.
Mozgunov вне форума  
 
Непрочитано 12.12.2008, 00:35
#8
Кулик Алексей aka kpblc
Moderator

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


Без понятия. Может быть, неверное вычисление или подстановка точки. Для выявления причины надо капитально анализировать код, а у меня на это сейчас нет ни сил, ни времени.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.12.2008, 00:41
#9
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Понял. Спасибо что подсказали, то что всё одной полилинией можно закатать. А точки правильные я проверял !точка на каждую после построения наводил и сравнивал с кодом. Может больше точек задать, по которым полилиния будет прорисовываться?
__________________
dmtools.ru

Последний раз редактировалось Mozgunov, 12.12.2008 в 00:46.
Mozgunov вне форума  
 
Непрочитано 12.12.2008, 02:54
#10
Кулик Алексей aka kpblc
Moderator

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


Написано "на коленке" и без проверок:
Код:
[Выделить все]
(defun c:ugol2 (/ pt1 pt2 rad_in rad_out _ang tmp vert_lst)
  (if (and (setq pt1 (getpoint "\nПервая точка <Отмена> : "))
           (setq pt2 (getpoint pt1 "\nВторая точка <Отмена> : "))
           (setq rad_in (getdist "\nДиаметр огибаемой (внутренний) <Отмена> : "))
           (setq rad_in (* rad_in 0.5))
           (setq rad_out (getdist "\nДиаметр огибающей (наружний) <Отмена> : "))
           (setq rad_out (* rad_out 0.5))
           (setq _ang (angle pt1 pt2))
           ) ;_ end of and
    (entmakex
      (append
        (list
          '(0 . "LWPOLYLINE")
          '(100 . "AcDbEntity")
          '(100 . "AcDbPolyline")
          (cons 90
                (length (vl-remove-if-not
                          '(lambda (x) (= (car x) 10))
                          (setq vert_lst
                                 (list
                                   (cons 10 (polar (polar pt1 _ang (* 3. rad_out)) (+ _ang (* pi 1.5)) rad_in))
                                   '(42 . 0.)
                                   (cons 10 (polar pt1 (+ _ang (* pi 1.5)) rad_in))
                                   '(42 . -1.)
                                   (cons 10 (polar pt1 (+ _ang (* pi 0.5)) rad_in))
                                   '(42 . 0.)
                                   (cons 10 (polar pt2 (+ _ang (* pi 0.5)) rad_in))
                                   '(42 . -1.)
                                   (cons 10 (setq tmp (polar pt2 (+ _ang (* pi 1.5)) rad_in)))
                                   '(42 . 0.)
                                   (cons 10 (setq tmp (polar tmp (+ _ang pi) (* 3. rad_out))))
                                   '(42 . 0.)
                                   (cons 10 (setq tmp (polar tmp (+ _ang (* pi 1.5)) (- rad_out rad_in))))
                                   '(42 . 0.)
                                   (cons 10 (setq tmp (polar pt2 (+ _ang (* pi 1.5)) rad_out)))
                                   '(42 . 1.)
                                   (cons 10 (polar pt2 (+ _ang (* pi 0.5)) rad_out))
                                   '(42 . 0.)
                                   (cons 10 (polar pt1 (+ _ang (* pi 0.5)) rad_out))
                                   '(42 . 1.)
                                   (cons 10 (setq tmp (polar pt1 (+ _ang (* pi 1.5)) rad_out)))
                                   '(42 . 0.)
                                   (cons 10 (setq tmp (polar tmp _ang (* 3. rad_out))))
                                   '(42 . 0.)
                                   ) ;_ end of list
                                ) ;_ end of setq
                          ) ;_ end of vl-remove-if-not
                        ) ;_ end of length
                ) ;_ end of cons
          '(70 . 1)
          ) ;_ end of list
        vert_lst
        ) ;_ end of append
      ) ;_ end of entmakex
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.12.2008, 07:19
#11
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Для того, чтобы дуга правильно выгибалась (при рисовании через command), надо в правильном порядке задавать ее точки. Особенно влияет направление предыдущего линейного сегмента. Если пытаться рисовать дугу в "естественном" порядке - начальная, вторая и конечная точка, возможно придется задавать дополнительный маленький линейный сегмент, определяющий дальнейшее направление дуги.

Надо просто попытаться нарисовать требуемый контур вводя точки с клавиатуры или мышкой. И станет понятно, где именно вставить дополнительную точку.
ShaggyDoc вне форума  
 
Непрочитано 12.12.2008, 10:23
#12
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Можно указывать не дополнительные точки, а направление угла обхода дугового сегмента (по часовой стрелке или против). Вот два примера:
(vl-cmdf "_.pline" "0.0,0.0" "100.0,0.0" "_a" "_a" "90" "150.0,50.0" "_l" "150.0,100.0" "")
(vl-cmdf "_.pline" "0.0,0.0" "100.0,0.0" "_a" "_a" "-90" "150.0,50.0" "_l" "150.0,100.0" "")
выполните их в каде и увидите в чем разница построенных полилиний.
Значениями "90" и "-90" задается сразу угол дугового сегмента и направление обхода.
На всякий случай, приведу листинг командной строки для английской версии:
Код:
[Выделить все]
Command: (vl-cmdf "_.pline" "0.0,0.0" "100.0,0.0" "_a" "_a" "90" "150.0,50.0" 
"_l" "150.0,100.0" "")
_.pline
Specify start point: 0.0,0.0
Current line-width is 0.00
Specify next point or [Arc/Halfwidth/Length/Undo/Width]: 100.0,0.0
Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]: _a
Specify endpoint of arc or
[Angle/CEnter/CLose/Direction/Halfwidth/Line/Radius/Second pt/Undo/Width]: _a
Specify included angle: 90
Specify endpoint of arc or [CEnter/Radius]: 150.0,50.0
Specify endpoint of arc or
[Angle/CEnter/CLose/Direction/Halfwidth/Line/Radius/Second pt/Undo/Width]: _l
Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]: 150.0,100.0
Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]:
Command: T
Олег К. вне форума  
 
Непрочитано 12.12.2008, 11:19
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Mozgunov, Можно еще рисовать как рисовал. Собрать все в набор и pedit'ом собрать в полилинию
Код:
[Выделить все]
(setq pt1 (getpoint "\n Первая точка: "))
(setq pt2 (getpoint "\n Вторая точка: "))
(setq dist1 (getdist "\n Диаметр огибаемой: "))
(setq dist2 (getdist "\n Диаметр огибающей: "))

(setq ugl (angle pt1 pt2));; Получаем уголок между точками от горизонтальной оси

(setq uglplus90 (+ ugl (/ pi 2) ) );;Угол плюс 90 в радианах
(setq uglplus180 (+ ugl  pi ) );;Угол плюс 180 в радианах
(setq uglplus270 (+ ugl  (* pi 1.5) ) );;Угол плюс 270 в радианах
(setq uglplus360 (+ ugl  (* pi 2.0) ) );;Угол плюс 360 в радианах

(setq uglminus90 (- ugl (/ pi 2) ) );;Угол плюс 90 в радианах
(setq uglminus180 (- ugl  pi ) );;Угол плюс 180 в радианах
(setq uglminus270 (- ugl  (* pi 1.5) ) );;Угол плюс 270 в радианах

(setq pt3 (POLAR pt1  uglplus90 (/ dist1 2) ));;точки примыкают к грани
(setq pt4 (POLAR pt2  uglplus90 (/ dist1 2) ));;точки примыкают к грани

(setq pt5 (POLAR pt1  uglplus90 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm5 (POLAR pt1  uglplus90 (/ dist1 2) ));;следующие от примыкания

(setq pt6 (POLAR pt2  uglplus90 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm6 (POLAR pt2  uglplus90  (/ dist1 2) ));;следующие от примыкания


(setq pt7 (POLAR pt1  uglplus180 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm7 (POLAR pt1  uglplus180 (/ dist1 2) ));;следующие от примыкания


(setq pt8 (POLAR pt2  ugl (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm8 (POLAR pt2  ugl (/ dist1 2) ));;следующие от примыкания


(setq pt9 (POLAR pt1  uglplus270 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm9 (POLAR pt1  uglplus270 (/ dist1 2) ));;следующие от примыкания


(setq pt10 (POLAR pt2 uglminus90 (+ (/ dist1 2) dist2) ));;следующие от примыкания
(setq ptm10 (POLAR pt2 uglminus90  (/ dist1 2) ));;следующие от примыкания


;;Считаем хвостики 
;;;;;;;;;;;;;;;;;;

(setq pt11 ( POLAR pt9 uglplus360 (* 3 dist2)  ) );;для первого хвостика
(setq pt12 ( POLAR ptm9 uglplus360 (* 3 dist2)  ) );;для первого хвостика

(setq pt13 ( POLAR pt10 uglplus180 (* 3 dist2)  ) );;для первого хвостика
(setq pt14 ( POLAR ptm10 uglplus180 (* 3 dist2)  ) );;для первого хвостика

;;Прорисовка

(setvar "ORTHOMODE" 0)
(setvar "OSMODE"0)
(setq ss nil ss (ssadd))
(command "_.PLINE"  pt3 pt4 "") ;;
(ssadd (entlast) ss)
(command "_.PLINE"  pt5 pt6 "") ;;
(ssadd (entlast) ss)
(command "_.ARC"  pt5 pt7 pt9 ) ;;Внешняя дуга первого скругления
(ssadd (entlast) ss)
(command "_.ARC"  pt6 pt8 pt10 ) ;;Внешняя дуга второго скругления
(ssadd (entlast) ss)
(command "_.ARC"  ptm5 ptm7 ptm9 ) ;;Внутрянняя дуга первого скругления
(ssadd (entlast) ss)
(command "_.ARC"  ptm6 ptm8 ptm10 );;Внутрянняя дуга второго скругления
(ssadd (entlast) ss)
;;Рисуем хвостики
(command "_.PLINE"  pt9 pt11 pt12 ptm9 "") ;;
(ssadd (entlast) ss)
(command "_.PLINE"  pt10 pt13 pt14 ptm10 "") ;;
(ssadd (entlast) ss)
(if (and (getvar "PEDITACCEPT") (= (getvar "PEDITACCEPT") 1))
  (command "_.PEDIT" "_m" ss "" "_j" "" "")
  (command "_.PEDIT" "_m" ss "" "" "_j" "" "")
  )
(setq ss nil)
(setvar "ORTHOMODE" 1)
(setvar "OSMODE"1)
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.02.2009, 13:11
#14
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Мне интересно, а можно ли как-то узнать, построена ли полилиния по часовой стрелке или против, и в случае, если ПО, изменить на ПРОТИВ (поменяв местами начальные и конечные точки всех её сегментов).
Tonic вне форума  
 
Непрочитано 02.02.2009, 13:22
#15
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Если в свойствах полилинии листать вершины, то на экране будет видно перемещение крестика от вершины к вершине. Реверс полилинии и многое другое можно выполнить, скачав пакет программ отсюда:
http://dwg.ru/dnl/607
Profan вне форума  
 
Непрочитано 02.02.2009, 14:42
#16
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Я имел ввиду, можно ли это узнать программно?
Tonic вне форума  
 
Непрочитано 02.02.2009, 15:00
#17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Tonic,
LISP, VBA. Изменение направления обхода точек в полилинии
В следующей версии PlineCCW будет добавлена к "Новым командам ..."
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.02.2009, 15:49
#18
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


То, что нужно! Спасибо!
Tonic вне форума  
 
Автор темы   Непрочитано 26.05.2009, 21:32
#19
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


В топике №10 Алексей применяет '(42 . -1.). Объясите на пальцах что это такое? Как я понимаю в программе собираются точки и это что-то вроде установки если второй параметр -1 или 1 скруглять дугу в ту или другую сторону, а если 0 то соединить полилинией. Вопрос, если я всё правильно понял. Рисуется дуга радиусом равная расстоянию между точками. Как поменять этот радиус на свой? Спасибо!
Mozgunov вне форума  
 
Непрочитано 26.05.2009, 21:49
#20
Кулик Алексей aka kpblc
Moderator

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


42 группа - кривизна. Тангенс четверти центрального угла дуги.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Линии и дуги в полилинии.

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Несплошные линии, X-refы и... задача Vova AutoCAD 6 20.04.2018 16:14
Чем чертите Линии или Полилинии Mikhail AutoCAD 68 11.02.2013 09:52
Вес линии и стиль печати Barbi AutoCAD 22 26.04.2012 17:56
Загрузка типа линии из макроса Кулик Алексей aka kpblc Программирование 4 24.01.2005 14:57