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

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

Lisp, помогите с алгоритмом "подтягивания" поллиний

Ответ
Поиск в этой теме
Непрочитано 03.02.2010, 18:30 #1
Lisp, помогите с алгоритмом "подтягивания" поллиний
2123
 
Регистрация: 03.02.2010
Сообщений: 3

Задача.
Есть "основные" линии и "рабочие" линии. Нужно "рабочие" линии подтянуть к "основным" по допуску. объясняю подробней, все линии замкнутые контура (участки), в идеале они не должны иметь пересечений и недоводов, на практике координаты вершин линиий "чуть-чуть" не совпадают (примерно на 0.1 м) и их "нужно подтянуть".

Решение.
Алгоритм.
1.Выбирем "рабочие" линии
2.Выбираем "основные" линии
3.Составляем список всех вершин "основных" линий
4.Цикл по рабочим линиям
4.1 Создаем список вершин "рабочей" линии
4.2 Цикл по списку всех вершин "основных" линий
4.2.1 Создаем список расстояний от "основной" вершины до всех вершин "рабочей" линии
4.2.2 Определяем минимальное расстояние
4.2.3 Сравниваем минимальное расстояние с допуском и выполняем действие

Вообщем алгоритм и код работает и делает, то что нужно, но очень медленно.
Задача, я так думаю, задача не нова, и должны быть варианты ее решения (может и не надо ничего придумывать т.к. есть встроеная программа в Civil или AutodeskMap)

Вот основной рабочий код
Код:
[Выделить все]
 (repeat (SSLENGTH ss_pl);цикл по рабочим линиям
    (setq sp_vtx_pl(get-pline-list-vertext (ssname ss_pl n)));получаем список точек
    (setq n1 0);сбрасываем счетчик для цикла по основным линиям
    
    (repeat(LENGTH sp_vtx_bl);цикл по Основным линиям
      (setq pt (nth n1 sp_vtx_bl));получаем точку из списка точек основных линий
    (setq list_dist ;создаем список расстояний от точки основной линии до всех точек рабочей линий
	       (mapcar '(LAMBDA (x)
	    (DISTANCE pt x)
	    )
	 sp_vtx_pl
	 );end mapcar
	  ); end setq
      (setq min_dist (apply 'min list_dist))
	     (if (and(< min_dist dop) (/= 0 min_dist))(progn ;условие мин раст меньше допуска и не равно 0
	       (setq num (vl-position min_dist list_dist));определяем номер точки
	       (mod-pline-n-vertext (ssname ss_pl n) num pt);озаменяем точку
	      ; (command "_point" pt "")
	       ));end if
	(setq n1 (+ 1 n1)) ;счетик цикла по Основным линиям 
      ); end цикл по Основным линиям
        (acet-ui-progress-safe n);прогресс отключить если не установлен Expresstools
    (setq n (+ 1 n))
    );end цикла по рабочим линиям
Так что если есть идеи по алгоритму, коду или другому решению задачи, то с удовольствием "выслушаю".
Просмотров: 2063
 
Непрочитано 03.02.2010, 23:58
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Что-то подобное было здесь
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp, помогите с алгоритмом "подтягивания" поллиний

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с алгоритмом Дима_ Программирование 12 19.05.2008 22:11
Auto Lisp. Помогите с легкой программой. BARS_1985 LISP 6 27.09.2007 11:10
LISP помогите разобраться. Elenaka LISP 5 20.10.2006 18:15
Помогите отладить lisp программу Мишаня LISP 7 31.07.2006 12:54
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19