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

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

Построение перпендикуляра между двумя полилиниями

Ответ
Поиск в этой теме
Непрочитано 18.08.2009, 15:05 #1
Построение перпендикуляра между двумя полилиниями
Макс_Кунгур
 
Регистрация: 10.12.2008
Сообщений: 122

Добрый день. Подскажите, пожалуйста. Есть чертеж со множеством полилиний. Как при помощи lisp выбрать 2 из них и построить между ними перпендикуляры? При этом 1 полилинию надо разбить на одинаковые отрезки (например 5 ед), и из каждых этих точек, начиная с начала полилинии, будут построены перпендикуляры на 2 полилинию.
Просмотров: 11185
 
Непрочитано 18.08.2009, 15:21
#2
Profan


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


Перпендикуляр одновременно к двум линиям возможен только в том случае, если эти линии параллельны или подобны.
Profan вне форума  
 
Автор темы   Непрочитано 18.08.2009, 15:25
#3
Макс_Кунгур


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


Profan, они практически параллельны. А можно сделать перпендикуляры не именно ко 2 линии, а чтобы они ее пересекали и лишнее обрезать, чтобы они заканчивались на ней?

Последний раз редактировалось Макс_Кунгур, 18.08.2009 в 15:37.
Макс_Кунгур вне форума  
 
Непрочитано 18.08.2009, 15:47
#4
Profan


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


А вот попробуй включить одну только привязку "Нормаль" и порисуй на экране.
Profan вне форума  
 
Автор темы   Непрочитано 19.08.2009, 07:23
#5
Макс_Кунгур


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


Profan, мне надо lisp-приложение написать под этот чертеж, а не чертить в AutoCad-е.

Кто-нибудь, подскажите, пожалуйста как это осуществить или, может быть, у кого-то есть уже готовый lisp на этот вопрос?

Последний раз редактировалось Макс_Кунгур, 19.08.2009 в 08:04.
Макс_Кунгур вне форума  
 
Непрочитано 19.08.2009, 08:15
#6
Кулик Алексей aka kpblc
Moderator

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


Макс_Кунгур, "практически" параллельные и параллельные есть вещи разные принципиально. Вплоть до невозможности решения задачи.
P.S. У меня ощущение, что надо сделать нечто типа alx-dike (кажется, так). То бишь строить изображения откосов.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.08.2009, 08:30
#7
LSN


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


Если линии не параллельны, то тогда наверное тебе нужен случай: перпендикуляр к одной линии и пересечение другой. Перпендикуляр к обеим линиям (непараллельным) никак не получится
LSN вне форума  
 
Непрочитано 19.08.2009, 08:39
#8
Profan


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


Я это и предложил проверить Макс_Кунгур'у, чтобы убедиться в неоднозначности задачи, а он, вишь, выкобенивается.
Profan вне форума  
 
Автор темы   Непрочитано 19.08.2009, 08:50
#9
Макс_Кунгур


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


Кулик Алексей aka kpblc, 1-я линия - это кривая горизонта, 2-я линия - это подошва горизонта. Они могут быть и параллельными, и не параллельными. Как я понимаю, нужно рассматривать два случая по отдельности. Если параллельны, то так строятся перпендикуляры, если нет - то по другому.
Макс_Кунгур вне форума  
 
Непрочитано 19.08.2009, 08:58
#10
Кулик Алексей aka kpblc
Moderator

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


Макс_Кунгур, так дело-то в том, что сначала надо поставить задачу. Полностью. Предусмотрев все варианты. И только после этого задумываться о решении (которое, скорее всего, сведется к применению команды _.divide с опцией _block).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2009, 09:10
#11
Макс_Кунгур


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


Кулик Алексей aka kpblc, задача состоит в следующем:
1. Выбираем первую полилинию
2. Выбираем вторую полилинию
3. Первая полилиния делится на отрезки одинаковой длины начиная с начала.
4. Строятся перпендикуляры по этим отрезкам, начиная с начала первой полилинии, пересекающие вторую полилинию. (перпендикуляры должны отсекаться 2-й полилинией)
6. Если вторая полилиния длиннее 1-й (что слева, что справа), обрезаем ее до первого и последнего перпендикуляра.

Полилинии могут быть как параллельными так и не параллельными.

Последний раз редактировалось Макс_Кунгур, 19.08.2009 в 09:17.
Макс_Кунгур вне форума  
 
Непрочитано 19.08.2009, 10:45
#12
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


Осталось изменить название темы на: "Построение перпендикуляров к первой линии и их обрезка по второй".
ытя вне форума  
 
Непрочитано 19.08.2009, 11:15
#13
ShaggyDoc

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


Для размышления о "перпендикулярах" - технология рисования

http://cad.kurganobl.ru/risovanie_otkosov.html

и еще две заметки внутри. В качестве постановки задачи.

А реализация простая: (ru-draw-topo-slope T T 3.0 0.5)
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 19.08.2009, 11:25
#14
Макс_Кунгур


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Макс_Кунгур,
P.S. У меня ощущение, что надо сделать нечто типа alx-dike (кажется, так). То бишь строить изображения откосов.
Все правильно, что мне и нужно (строить изображения откосов). Только это нужно реализовать через LISP, а у ShaggyDoc - там через ruCAD.

Потестировал я программы dike и otkos, все хорошо, все красиво, то, что нужно, но они не реализуют:

1. Не обрезают полилинии до первого перпендикуляра и после последнего.
2. Рисуют только простой откос, а мне нужно еще чтобы еще рисовался добычной откос (чтобы был выбор, какой откос рисовать).

Подскажите, пожалуйста, кто-нибудь знает, как это реализовать?

Последний раз редактировалось Макс_Кунгур, 19.08.2009 в 12:33.
Макс_Кунгур вне форума  
 
Непрочитано 19.08.2009, 14:05
#15
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


ShaggyDoc
а чем вызвана неправильная работа при сглаживании дугами?
zamtmn вне форума  
 
Непрочитано 19.08.2009, 15:12
#16
ShaggyDoc

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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
ShaggyDoc
а чем вызвана неправильная работа при сглаживании дугами?
А вот как раз неоднозначностью расчет геометрии. Опорных точек-то у полилинии, сглаженной дугами, не добавляется. Вот и целевые высчитываются неправильно. Это внутренние недостатки штатных функций.

Цитата:
а мне нужно еще чтобы еще рисовался добычной откос (чтобы был выбор, какой откос рисовать)
Это уже детали. Сначала делается базовая функция, а для неё уже в виде аргументов разные варианты рисования. Я же не зря пример привел (ru-draw-topo-slope T T 3.0 0.5)
Здесь 4 аргумента определяют варианты рисования бровок и штрихов. Можно сделать сколько угодно вариантов.

Тут важно забыть про "обрезают", "удлиняют". И особенно - слово "перпендикуляр". Всё только на геометрических вычислениях должно быть. Можно ведь и координаты концов бровок изменить, если надо.

Цитата:
Только это нужно реализовать через LISP, а у ShaggyDoc - там через ruCAD.
А там LISP и есть. И ничего более.
ShaggyDoc вне форума  
 
Непрочитано 19.08.2009, 16:49
#17
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Это внутренние недостатки штатных функций
т.е. не учитываются скругления, обрабатываются как прямые?

>>Тут важно забыть про "обрезают", "удлиняют".
>>И особенно - слово "перпендикуляр"
Я бы заменил "перпендикуляр" на "ближайшая"
тогда получится:
1 measurим линию от которой строим с нужным шагом
2 measurим линию к которой строим с более мелким (в пределах разумного, с учетом нужной точности) шагом
3 перебераем токи из (1) ишем ближайшие им точки из(2) и их соединяем.

шаг 3 легко оптимизируется, поиск прекращается как только растояние начинает увеличиваться, с каждлой итерацией поиск начинается в месте где закончился предидущий раз
edit: забыл что нужно учесть направление полилиний и искать или с начала или с конца второго списка
zamtmn вне форума  
 
Автор темы   Непрочитано 20.08.2009, 08:09
#18
Макс_Кунгур


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


ShaggyDoc, а ты не можешь выложить готовый lisp на мой вопрос, а то я сам не смогу его сделать?
Макс_Кунгур вне форума  
 
Непрочитано 20.08.2009, 09:04
#19
ShaggyDoc

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


Цитата:
Сообщение от Макс_Кунгур Посмотреть сообщение
ShaggyDoc, а ты не можешь выложить готовый lisp на мой вопрос, а то я сам не смогу его сделать?
Легко. Самое главное - остальное сам сделаешь.
Код:
[Выделить все]
(defun ru-draw-topo-slope (is_draw_short
                           is_dot
                           dist_berg
                           length_berg_rel
                          )
;; (ru-draw-topo-slope T nil 3.0 0.5)
;; (RU-DRAW-TOPO-SLOPE T nil 2.0 1.0)
;; (ru-draw-topo-slope T 2.0 1.0) - откос
;; (ru-draw-topo-slope T 3.0 0.5) - откос
;; (ru-draw-topo-slope T 3.0 2.0) - откос
;; (ru-draw-topo-slope 2.0 1.0) - обрыв
  (_ru-draw-some-slope
    is_draw_short
    is_dot
    dist_berg
    length_berg_rel
    'ru-topo-draw-slope-one
  ) ;_ end of _ru-draw-some-slope

) ;_ end of defun




(defun _ru-draw-some-slope (is_draw_short
                           is_dot
                           dist_berg
                           length_berg_rel
                           func
                           /

                           bottom_point
                           dist
                           dist_dot
                           dist_short
                           end_dot
                           end_short
                           ent_bottom
                           long
                           start_dot
                           len_dot
                          )
  (ru-app-begin)
  ;|
Откос или обрыв
(RU-DRAW-TOPO-SLOPE T nil 2.0 1.0)
(ru-draw-topo-slope T 2.0 1.0) - откос
(ru-draw-topo-slope T 3.0 0.5) - откос
(ru-draw-topo-slope T 3.0 2.0) - откос
(ru-draw-topo-slope 2.0 1.0) - обрыв
Новые аргументы 
dist_berg - расстояние между бергштрихами, мм (2 было)
length_berg_rel - длина бергштрихов в долях от расстояния между кромками
(меньше 1, иначе - в долях от расстояния между бергштрихами)
Опция - укрепленный
Сглаженную полилинию разглаживать и в сплайн?

|;

  (setq
    dist_berg (ru-conv-millimeter-in-paper-to-unit dist_berg)
    dist_dot  (ru-conv-millimeter-in-paper-to-unit 2.0)
    len_dot   (* dist_dot 0.5)
  ) ;_ end of setq
  (while (setq ent_top
                (ru-get-entsel-by-type
                  "Выбери линию бровки"
                  "Это нельзя использовать в качестве бровки"
                  (list "LINE" "LWPOLYLINE" "POLYLINE" "ARC" "CIRCLE" "SPLINE")
                  t
                ) ;_ end of ru-get-entsel-by-type
         ) ;_ end of setq
    (progn
      (ru-obj-undo-begin)
      (setq
        ent_top (car ent_top)
      ) ;_ end of setq
      (ru-pline-decurve ent_top "Бровка")
      (if (setq ent_bottom
                 (ru-get-entsel-by-type
                   "Выбери линию подошвы"
                   "Это нельзя использовать в качестве подошвы"
                   (list "LINE" "POLYLINE" "LWPOLYLINE" "ARC" "CIRCLE" "SPLINE")
                   t
                 ) ;_ end of ru-get-entsel-by-type
          ) ;_ end of setq
        (progn
          (setq
            ent_bottom
             (car ent_bottom)
          ) ;_ end of setq
          (ru-pline-decurve ent_bottom "Подошва")
          (setq
            top_points_list
             (ru-geom-list-measured-points-on-curve
               ent_top
               dist_berg
             ) ;_ end of ru-geom-list-measured-points-on-curve
          ) ;_ end of setq
          (mapcar
            (function
              (lambda (top_point)
                (setq bottom_point (vlax-curve-getclosestpointto
                                     ent_bottom
                                     top_point
                                     T
                                   ) ;_ end of vlax-curve-getclosestpointto
                      dist         (distance top_point bottom_point)
                      long         (if is_draw_short
                                     (not long)
                                     t
                                   ) ;_ end of if
                                   ;; - было для откоса с короткими штрихами
                ) ;_ end of setq
                ((eval func)
                  top_point
                  bottom_point
                  dist_berg
                  (list dist dist_dot len_dot long length_berg_rel is_dot)
                )

              ) ;_ end of lambda
            ) ;_ end of function
            top_points_list
          ) ;_ end of mapcar

        ) ;_ end of progn
      ) ;_ end of if
      (ru-obj-undo-end)
    ) ;_ end of progn
  ) ;_ end of if
  (ru-app-end)
  (princ)
) ;_ end of defun
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 20.08.2009, 09:11
#20
Макс_Кунгур


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


Попробовал, выдает ошибку:

Command: (ru-draw-topo-slope)
; error: too few arguments
Макс_Кунгур вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Построение перпендикуляра между двумя полилиниями



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
арифметические действия между двумя текстовыми элементами RЯков AutoCAD 31 09.09.2016 11:13
Вопрос по 3D: Как образмерить угол между двумя отрезками, находящимися в разных плоскостях? k8t AutoCAD 21 03.11.2015 09:29
Измерить расстояние между двумя точками в ЛИСТЕ, привязываясь к объектам в МОДЕЛИ Кочетков Андрей AutoCAD 9 12.06.2009 22:52
Интерполяция между двумя точками postbudka Программирование 27 21.05.2009 10:00
создание касательной между двумя окружностями фрекен_бок AutoCAD 1 21.02.2009 22:14