|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как построить среднюю линию между непараллельными?
Сообщений: n/a
|
||
Просмотров: 41557
|
|
||||
Я так понимаю ,что эти две поллилинии - это профиля разрезов?
Единственное что приходит в голову ![]() взять одну из полилинйй за базу, искать с определенным шагом расстояния по вертикали до другой линии ,и построить по ним результирующую(без сглаживания).Если идти с достаточно мелким шагом то результат будет приемлимым. |
||||
![]() |
|
||||
проектирование дорог Регистрация: 18.10.2006
Riga
Сообщений: 25
|
Действительно ребята, очень нужен лисп! Так надоело выполнять однообразную работу, тратя по пол дня на такую мутоту! Помогите! На предыдущей картинке правильно нарисовано, только ещё необходимо, чтобы это было применимо к кривым! Заранее спасибо!
|
|||
![]() |
|
||||
металлист Регистрация: 13.03.2006
Питер
Сообщений: 463
|
В составе СПДСграфикс есть команда средняя линия, и она работает как с прямыми, так и с дугами НО при наличии у дуг общего центра (что понятно - в противном случае получается уже кривая второго порядка, для которой и вычисления совсем другие и точного отображения в автогаде добиться не очень-то, даже при помощи сплайна)
__________________
(с) Чем шут не чертит |
|||
![]() |
|
||||
YngIngKllr Регистрация: 29.03.2005
СПб
Сообщений: 12,968
|
Не думаю чтобы стандартными методами Компас сможет это решить.
Вы наверное не до конца прочли. Т.к. требуется сделать еще одну полилинию между двумя криволинейными (в смысле они продолжительные с множеством изгибов).
__________________
Работаю за еду. Working for food. Für Essen arbeiten. العمل من أجل الغذاء Працую за їжу. |
|||
![]() |
|
||||
проектирование дорог Регистрация: 18.10.2006
Riga
Сообщений: 25
|
Лисп BI_LINE отлично работает, НО только для отрезков, а мне очень нужно для полилинии, причем эти плинии не пересекаются, что облегчает наверняка написание проги, пожалуйста помогите.
Вот примерно, что мне надо... [ATTACH]1161256558.dwg[/ATTACH] |
|||
![]() |
|
||||
розмысл Регистрация: 12.06.2005
Иркутск
Сообщений: 1,973
![]() |
Если задача эта разовая - для построения графика нужно построить одну кривую между двух других, то можно решить ее функцией Blend в Кореле или им подобных. Может это и не спортивно, зато эффективно. Пробовал. Получилось
------------------------------------ на каждого мудреца довольно просторы© |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Что-то никто не вспомнил про привязку _m2p...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
проектирование дорог Регистрация: 18.10.2006
Riga
Сообщений: 25
|
К сожалению задача не разовая, а многократная, необходимая для построения горизонтальной разметки дорог в местах уширения дороги (где обочины дороги не параллельные). Пыталась строить в ручную, но ужасно припекло! Представье если трасса с пару десятков километров :?
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Пробуй
Код:
2. UCS не обрабатывается 3. Пересечения кривых не анализируются 4. Количество опорных точек - на сколько частей разбивается кривая для получения средней линии |
|||
![]() |
|
||||
Регистрация: 12.01.2006
Донецк
Сообщений: 30
|
Попробуй вот это
Указываешь две полилинии и кол-во точек разбиения. Вызов: Command: PSW ;****************************************************************** ; AutoCAD 2000-2007 ; Автор : Пурошев Сергей ; Донецкий центр союза архитекторов Украины "Среда" ; E-mail psw@asc.inep.net ;****************************************************************** ;************************************************************************ ; Функция возвращает: Точку середины отрезка Т1 Т2 ; Параметр - точки Т1 Т2 ;************************************************************************ (defun SEREDINA (TE1 TE2 / AA) (setq DX (/ (+ (car TE1) (car TE2)) 2.0)) (setq DY (/ (+ (cadr TE1) (cadr TE2)) 2.0)) (setq DZ 0.0) (if (and (/= (caddr TE1) NIL) (/= (caddr TE2) NIL)) (progn (setq DZ (/ (+ (caddr TE1) (caddr TE2)) 2.0)) ) ) (setq AA (list DX DY DZ)) ) ;END DEFUN ;***************************************************************** ; ОСНОВНАЯ ПРОГРАММА ; ОСНОВНАЯ ПРОГРАММА ; ОСНОВНАЯ ПРОГРАММА ;**************************************************************** (defun C:PSW (/ DX ED EN I LABEL N OB OB1 SL SSS SSS1 T0 T00 T1 T11 T12 T21 T22) (prompt "\nВыбери полилинию 1: ") (setq ob (car (entsel))) (prompt "\nВыбери полилинию 2: ") (setq ob1 (car (entsel))) (setq dx (GetInt "\nКоличество участков разбиения : ")) ;**************************************** (setq en (entget Ob)) (setq sl (cdr (assoc 8 en))) (setvar "CLAYER" sl) ;*************************************** (setq sss nil) (setq sss (ssadd)) ; создать набор (setq label (entlast)) ; поставить метку в DWG ;**************************************** (setvar "CECOLOR" "ByLayer") ;**************************************** (command "_divide" ob dx) ;************************************** (while ; переписать в набор (setq label (entnext label)) (setq sss (ssadd label sss)) ) ;**************************************** ;**************************************** ;**************************************** ;**************************************** (setq en (entget Ob1)) (setq sl (cdr (assoc 8 en))) (setvar "CLAYER" sl) ;*************************************** (setq sss1 nil) (setq sss1 (ssadd)) ; создать набор (setq label (entlast)) ; поставить метку в DWG ;**************************************** (setvar "CECOLOR" "ByLayer") ;**************************************** (command "_divide" ob1 dx) ;************************************** (while ; переписать в набор (setq label (entnext label)) (setq sss1 (ssadd label sss1)) ) ;**************************************** ;**************************************** (setq n (sslength sss)) (setq i (- n 1)) (setq i 0) (setq en (ssname sss i)) (setq ed (entget en)) (setq t11 (cdr (assoc 10 ed))) (setq en (ssname sss1 i)) (setq ed (entget en)) (setq t12 (cdr (assoc 10 ed))) (setq T0 (seredina T11 T12)) (command "PLINE" T0) (setq i 1) ;**************************************** (repeat (- n 1) (setq en (ssname sss i)) (setq ed (entget en)) (setq t11 (cdr (assoc 10 ed))) (setq en (ssname sss1 i)) (setq ed (entget en)) (setq t12 (cdr (assoc 10 ed))) (setq T0 (seredina T11 T12)) (command t0 ) (setq t00 t1) (setq i (+ i 1)) ) ;**************************************** (command "") ;(command "LINE" t11 t1 "") ;*************************************** ;(entdel ob) (command "ERase" sss "") (command "ERase" sss1 "") ;*************************************** (SetVar "FILEDIA" 1) (princ) ) |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
>Лентяй Это не простыни, а муки творчества
![]() Вот причесанный вариант Код:
2. UCS обрабатывается !! 3. Пересечения кривых не анализируются 4. Количество опорных точек - на сколько частей разбивается кривая для получения средней линии ===== Добавлено ======= Совсем забыл про OSMODE. Теперь вспомнил |
|||
![]() |
|
||||
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
![]() |
Похоже, с 6 года что-то изменилось.
Строит некорректно (средняя линия пересекает линии между которыми она должна быть построена) AutoCad Civil 3D 2013
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Kirill_Ja, ищи BGTOOLS, там, кажется, было построение средней линии.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
![]() |
Если этот BGTOOLS http://forum.dwg.ru/showthread.php?t=5940&page=6
то, похоже, что нету.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения. |
|||
![]() |
|
||||
Регистрация: 22.05.2009
Москва
Сообщений: 210
|
![]() |
|||
![]() |
|
||||
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534
|
Всем привет!
Вопрос касается программирования, но интересует меня скорее методика построения (алгоритм), а не сам код. Прошу меня не перенаправлять на вот эту тему и ей подобные - указанные там коды работают некорректно в некоторых случаях. Итак - имеем две кривые (полилинии). Не учитываем что они могут пересекаться. Построение ведем по такому алгоритму: - Указываем число опорных точек - Замеряем длину первой указанной полилинии и делим ее на количество опорных точек - Идем в цикле "вдоль" этой полилинии сегментами (т.е. длину, полученную в прошлом пункте, умножаем на номер шага цикла). Не могу понятно объяснить, но думаю кто в теме - тот понял ![]() - От второй полилинии нахожу отрезок, ближайший к текущей точке в первой полилинии (closestPointTo). По логике - это перпендикуляр. Хотя я тут не уверен - Между двумя точками нахожу середину и по вот этим "серединам" строю новую полилинию В общем, если у меня две полилинии идут примерно в одном направлении, то строится все нормально. А вот если у меня полилинии имеют сильные искривления, то в углах поворота строится все некорректно. На картинке пример построения: синие - это указанные полилинии, красная - это построенная программно полилиния, а зеленые - это я вручную опускал перпендикуляры, чтобы понять что происходит Получается, что выбранный мной вариант не корректен. А если рассматривать вариант с перпендикулярами, то вот в таких углах как на картинке из той полилинии что "внутри" можно опускать по два перпендикуляра на полилинию, что "снаружи" |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Modis, я бы шел по другому пути (хотя это и оффтоп): делишь одну полилинию на Х частей, потом для второй определяешь, с какой стороны (с начала или с конца) ее делить, и тоже делишь на те же Х частей. Полученные точки соединяешь. Или такой вариант уже пройден и не срабатывает?
P.S. Посмотри код PLTOOLS, там наверняка найдешь интересное решение.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534
|
Цитата:
Потому-то вопрос я и задал. Меня не оставляют мысли, что возможно решение нужно искать уже в чистой математике (геометрии), но не нашел ничего на эту тему |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Картинку не видно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Посмотрел код Lee Maca - ничем не отличается от моего (в моем PLTOOLS - линии разбиваться на равное количество частей и между точками каждой части находится середина. У Ли - в каждой кромке откладываются равные длинны) в #232 есть ссылка на эту программу. Здесь действительно "катящийся круг". Алгоритм разрисован в картинках и, думаю, понятен.
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 28.09.2016 в 21:06. |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,169
|
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Вот версия, скачанная мной в 2014. Проверял на 2013
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 30.05.2012
Сообщений: 100
|
Возможно, подойдет в качестве идеи для lisp'а: использовать сеть соединения (команда П-СОЕД (RULESARF)). После построения сети (рис. 2), строим (с привязкой к середине "поперечных" ребер сети) "среднюю" линию (3). На рис. 4 результат. Плотность сети (и, соответственно, точность построения "средней") задается переменной SURFTAB1.
__________________
В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
|||
![]() |
|
||||
Регистрация: 17.03.2009
Сообщений: 316
|
Граждане. Пока не дано определение, что такое средняя линия, обсуждение программной реализации бесполезно! Кто-то делит линии на равные сегменты и соединяет их концы (#42), кто-то катит круг (#37), кто-то вообще параллельными отрезками работает (#29). Дело не в точности того или иного построения. Результат будет получаться разный по геометрической сути.
Мне видится "правильным" вариант катящихся кругов. Offtop: Интересно тот, кто задавал вопрос, вышел на пенсию или ещё нет? |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,169
|
Цитата:
+1 |
|||
![]() |
|
||||
Регистрация: 30.05.2012
Сообщений: 100
|
Цитата:
Вариант "катящегося круга" дает наилучший из предложенных вариантов результат.
__________________
В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
|||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,107
|
|
|||
![]() |
|
||||
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534
|
Цитата:
http://forum.dwg.ru/showpost.php?p=1574882&postcount=36 |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 30.05.2012
Сообщений: 100
|
Насколько я понимаю, начиная с #46 подразумевается та или иная конкретная программная реализация ИДЕИ "катящегося круга". Все они, по-видимому, имеют какие то недостатки, в силу чего дают такие, позвольте сказать, неприемлемые результаты. Я примерял ИДЕЮ вручную, приблизительно, но вполне допустимо, на варианте из сообщения #36. Результат, по-моему, визуально вполне приемлем.
__________________
В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
|||
![]() |
|
||||
Регистрация: 26.09.2018
Сообщений: 1
|
Коллеги, приветствую!
Пытаюсь запустить лисп катящегося круга - не хочет работать с полилинией. Обе на одной отметке (нулевой). Выбираю 1 и 2 линию, указываю параметры, задаю направление - и либо ни чего не выдает, либо выдает Internall Error. AutoCad 2016 |
|||
![]() |
|
||||
Регистрация: 30.04.2012
Сообщений: 121
|
https://apps.autodesk.com/ACD/ru/Det...ed,desc&query=
"...Настройка 50% была бы полезна, например, для генерации центральной полилинии или средней полилинии между двумя другими полилиниями"-описание (из переводчика). БЕСПЛАТНО Последний раз редактировалось Kaha251184, 06.02.2019 в 23:59. |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Апну тему. Код ниже - имхо, самый корректный вариант построения срединной линии из всех мной встреченных. В проге один, "визуальный" недочет - перед тем как средняя линия будет построена на экране на мгновение отобразятся необходимые для построения, промежуточные линии. Может умельцы подправят.
Код:
|
|||
![]() |
|
||||
Отказывается работать в 2019:
Цитата:
__________________
количество моих сообщений не говорит о знании Автокада |
||||
![]() |
|
||||
Цитата:
![]() Опять понадобилось. Из того, что в предыдущий раз насобирал, лучший для меня результат оказался у cPoly.lsp. Чья, откуда - не помню. Увы, MPL из PlTools на наших задачах выдает совсем не то. А в cPoly.lsp самый ни на есть катящийся круг - видно, как он катится, изменяясь в диаметре от расстояний между полилиниями. Недостаток - нельзя задать количество вершин, как в MPL. Лучше всего, чтобы программка сама брала среднее от количества вершин выбранных полилиний. В сложных случаях и cPoly пересекает линии. Еще она забавная-мистическая - ощущение, что программка требует участия-внимания! ![]() В файле синие линии - берега реки. Белые - результат cPoly. Желтая - MPL при 100. Увы, результат MPL от изменения числа вершин лучше почти не становится.
__________________
количество моих сообщений не говорит о знании Автокада Последний раз редактировалось АлексЮстасу, 14.09.2024 в 06:29. |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как построить следующее тело?... | Shtirlitz | AutoCAD | 15 | 10.06.2013 13:09 |
Как из trace сделать обычную линию? | Нюра | AutoCAD | 1 | 06.09.2004 17:10 |
Подскажите как построить кривую с помощью команды SPLiNE, к | boban | Программирование | 1 | 02.11.2003 19:58 |
Как на LISPе автоматически выбрать линию и точку? | Mikhail | LISP | 4 | 28.10.2003 10:33 |