Архитектору и проектировщику|Тепло- и звукоизоляция URSA.RU
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

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

Аппроксимация 3d полилинии

Ответ
Поиск в этой теме
Непрочитано 29.01.2009, 09:19 #1
Аппроксимация 3d полилинии
WeMaN
 
Регистрация: 19.08.2008
Сообщений: 52

Народ, помогите с поиском программы или аналогичной ей, раньше работал с подобной утилитой, но сейчас она куда то пропала, а работать нада, в общем смысл утилиты был такой:

- командой 3dpoly рисуется полилиния, у которой естественно каждая вершина имеет свою Z координату. Дело в том, что мне необходимо, чтобы каждая вершина была с Z, но вручную вводить очень долго, ибо бывает что вершин 200 или триста...
- что делала утилита, у меня по всей полилинии из 100 вершин, Z была только у нескольких точек, у начальной вершины, конечной вершины и у нескольких верщин в середине, у остальных вершин было Z = 0, та вот, утилита при выборе необходимой полилинии просчитывала автоматом, учитывая разницу между высотами всех вершин с координатой Z, все высоты и забивала наиболее вероятную высоту в Z тех вершин, у которых была z 0...

В общем где-то так, если коряво объяснил, уточняйте, поясню, вопрос собственно в том, что никто ли ни сталкивался с подобной софтиной? Если есть такая или схожая в наличии, то поделитесь, очень нужно! Вручную работать замучался
Просмотров: 6123
 
Непрочитано 01.02.2009, 20:37
#2
nic26


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


Что значит "наиболее вероятное" ?
взять с соседа который ближе и для которого Z задана ?
Напрашивается вариант :
Можно интерполировать координаты Z во всех точках
между каждой парой с известными координатами Z .
nic26 вне форума  
 
Непрочитано 01.02.2009, 20:45
#3
Cfytrr

Балка на балку, кирпич на кирпич...
 
Регистрация: 09.10.2007
Питер
Сообщений: 3,337
Отправить сообщение для Cfytrr с помощью Skype™


WeMaN,
Попробуйте вот это: http://dwg.ru/dnl/607 Там кажется при добавлении вершины в 3Д полилинию координата Z апроксимируется по соседним вершинам, если я не ошибаюсь....
__________________
...переменная FILEDIA создана для привлечения пользователей к форумам.
Cfytrr на форуме  
 
Непрочитано 01.02.2009, 21:48
#4
VVA

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


Cfytrr, Да, так и происходит.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 09.02.2009, 16:23
#5
WeMaN


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


Согласен, мог просто некорректно выразится, я имею ввиду что у меня есть 3д полилиния в которой есть точки с координатой z, а есть и без неё, мне надо чтобы те точки, которые без высоты имели саппроксимировались и были с высотой
WeMaN вне форума  
 
Автор темы   Непрочитано 09.02.2009, 16:23
#6
WeMaN


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


сапроксимировались, я имею ввиду не точно такую же z как у соседа, а среднее значение между двумя известными z


А какая команда тут это делает http://dwg.ru/dnl/607 ? Я пользуюсь данным набором утилиток, но что-то похожее на аппроксимацию 3д полилинии не находил...

Народ помогите разбраться с этим, очень надо!
WeMaN вне форума  
 
Непрочитано 09.02.2009, 16:33
1 | #7
VVA

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


Пробуй
Код:
[Выделить все]
(defun C:3DB ( / e1 e2 ed lst_PT lst_SL lst_Z len_LST i Zn Zk in ik dZ jj lst_ZN BUF osm)
;;;3D bort по координатам вершин 3D полилинии.
;;;Координаты рассчитываются пропорционально длине сегментов
;;;В расчете учавствуют только вершины с координатой Z=0  
  (setvar "CMDECHO" 0)
  (while  (setq e1 (ssget "_+.:S:E:L" '((0 . "POLYLINE"))))
    (setq e2 (ssname e1 0) e1 nil e1 e2)
    (setq lst_PT nil lst_Z nil lst_SL nil lst_ZN nil)
    (while (/= (cdr(assoc 0 (setq ed (entget (setq e2 (entnext e2)))))) "SEQEND")
      (setq lst_PT (append lst_PT (list (cdr(assoc 10 ed)))))
      (setq lst_Z  (append lst_Z (list (caddr (last lst_PT)))))
      )
    (setq lst_SL nil Zk 0)
    (setq e2 (car lst_PT))
    (foreach ed lst_PT
      (setq lst_SL (append lst_SL (list (setq Zk (+ Zk (distance (list (car e2)(cadr e2))(list (car ed)(cadr ed))))))))
      (setq e2 ed)
      )
    (setq len_LST (length lst_Z))
    (setq i 0)
    (setq lst_ZN lst_Z)
    (while (< i len_LST)
      (cond ((= i 0)(setq Zn (nth i lst_Z) Zk Zn in i ik i))
	    ((= i (- len_LST 1))(setq Zn (nth i lst_Z) Zk Zn in i ik i))
	    (t
	     (while (and (nth i lst_Z)(zerop (nth i lst_Z)))(setq i (1+ i)))
	     (if (null (nth i lst_Z))(setq i (1- i)))
	     (setq Zk (nth i lst_Z))
	     (setq ik i)
	     (setq BUF (MAPCAR '(LAMBDA (AA)(- AA (nth in lst_SL))) lst_SL))
	     (setq dZ (- Zk Zn))
	     (setq e2 (- (nth ik lst_SL)(nth in lst_SL)))
	     (setq ed (/ dZ e2))
	     (setq jj in)
	     (while (< jj ik)
	       (setq e2 (+ (nth in lst_Z)(* ed (nth jj BUF))))
	       (setq lst_ZN (subst-i jj e2 lst_ZN))
	       (setq jj (1+ jj))
	       )
	     (setq in ik)
	     (setq Zn Zk)
	     )
	)
      (setq i (1+ i))
      )
    (setq i 0)(setq lst_SL nil)
    (foreach ed lst_PT
      (setq lst_SL (append lst_SL (list (list (car ed)(cadr ed)(nth i lst_ZN)))))
      (setq i (1+ i))      
    )
    (setq osm (getvar "OSMODE"))
    (setvar "osmode" 0)   
    (command "_.3DPOLY")
    (foreach ed lst_SL (command "_non" ed))
    (command "")
    (entdel e1)
    (setvar "osmode" osm)
    (princ " *** ГОТОВО ***")
  );_end of while
  (princ)
)  
;;;http://www.theswamp.org/index.php?topic=14170.0
(defun subst-i (i itm lst)
  (setq i (1+ i))
  (mapcar
    '(lambda (x)
      (if (zerop (setq i (1- i))) itm x)
    )
    lst
  )
)
Цитата:
сапроксимировались, я имею ввиду не точно такую же z как у соседа, а среднее значение между двумя известными z
Z рассчитывется пропорционально длине сегментов
Если есть 3d полилиния, состоящая из 3 вершин, координаты Z которых 10,0,20. Длина сегмента от 1-й до 2-й вершины 1, от 2-й до 3-й вершины 2
После выполнения команды координата Z 2-й вершины будет 13,(3) [10+(20-10)/(1+2)]
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 11.02.2009 в 14:34. Причина: Добавил subst-i
VVA вне форума  
 
Автор темы   Непрочитано 10.02.2009, 14:42
#8
WeMaN


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


для примера сделал 3д полилинию, с 3 вершинами, 10 0 20, выбираё её и програмка пишет, что:
; ошибка: no function definition: SUBST-I

У вас нормально запускалось?


И ещё, немного недопонял, как это пропорционально длине?
Вот у меня скажем есть в 3д поли 10 точек: "10.21" "0" "0" "0" "15.05" "0" "0" "17.15" "0" "20.03", мне нужно чтобы он рассчитал высоты в тех местах, где стоит значение 0, учитывая значение до сотой хотя бы и учитывая длину(хотя не знаю можно ли так) и среднее значение, т.е. допустим чтобы получилось, что 3 вершины имеющие значение "0", между вершинами "10.21" и "15.05", сапроксимировали бы теоретически возможную высоту в данных точках, учитывая длину между вершинами, допустим, вместо нолей было бы "11.03", "12.44", "13.56" соответсвенно... Возможно ли такое?
Если я некорректно выражаюсь уточняйте, задавайте вопросы

Последний раз редактировалось WeMaN, 10.02.2009 в 14:49.
WeMaN вне форума  
 
Непрочитано 10.02.2009, 17:34
#9
VVA

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


WeMaN, Как всегда забыл ф-цию. Исправил #7
Цитата:
Вот у меня скажем есть в 3д поли 10 точек: "10.21" "0" "0" "0" "15.05" "0" "0" "17.15" "0" "20.03", мне нужно чтобы он рассчитал высоты в тех местах, где стоит значение 0, учитывая значение до сотой хотя бы и учитывая длину(хотя не знаю можно ли так) и среднее значение, т.е. допустим чтобы получилось, что 3 вершины имеющие значение "0", между вершинами "10.21" и "15.05", сапроксимировали бы теоретически возможную высоту в данных точках, учитывая длину между вершинами, допустим, вместо нолей было бы "11.03", "12.44", "13.56" соответсвенно... Возможно ли такое?
Так и будет
Для твоего примера посчитается невязка высот (15.05 - 10.21), Возьмется длина 3 сегментов и вычислится изменение Z на 1 длины. Потом сообветственно длинне каждого сегмента будет добавка к Z. Короче проще попробывать, чем словами объяснить.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 10.02.2009 в 19:40.
VVA вне форума  
 
Автор темы   Непрочитано 11.02.2009, 10:00
#10
WeMaN


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


Заработало!!! Спасибо вам большое - это очень полезная для меня утилитка!!!

ОФФ: Можно ещё узнать совет не относящийся к теме? Вот допустим могу я в автокаде создать кнопку, прикрепить к ней картинку и назначить на эту кнопку данную функцию? Или соответсвенно, если у меня несколько лиспиков есть, могу ли я сделать из них отдельную менюшку? Если вы знаете где описываются данные действия, можете кинуть ссылку?
WeMaN вне форума  
 
Непрочитано 11.02.2009, 11:21
#11
VVA

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


WeMaN,
http://dwg.ru/art/2
http://dwg.ru/art/3
http://dwg.ru/art/8
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 11.02.2009, 13:53
#12
WeMaN


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


Спасибо, буду изучать
WeMaN вне форума  
 
Непрочитано 11.02.2010, 02:10
#13
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


Для Кочеткова Андрея (см. http://dwg.ru/dnl/607).

Нет, то что я прошу сделать VVA отлична от данной задачи (апроксимация).
Это у меня давно сделано по следующему алгоритму (программа 3D_SLANT):
Если для части вершин 3-мерной полилинии (без учета начальной и конечной) были присвоены отметки (координаты Z) в текущей системе координат, а остальные вершины расположены на нулевом горизонте, пользователь может включить режим автоматического назначения отметок вершинам полилинии, расположенным в нулевой плоскости. Они назначаются по уклону, который рассчитывается по узлам с отметками не равными нулю. Для этого режима начальная и конечная вершина должны иметь отметку отличную от нуля.
Примечание: Данный режим полезен при отрисовке средней линии верха штольни с учетом точной привязки к маркшейдерским точкам. Можно также использовать его при оконтуривании рудных тел (подготовка 3-х мерных каркасов).
__________________
Лень - великий двигатель прогресса!
KAI вне форума  
 
Непрочитано 11.02.2010, 10:24
#14
VVA

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


KAI, Вышли мне на почту пример с твоими хитрыми UCS
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.02.2010, 11:51
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


KAI,
Цитата:
Интересно, а есть программа для обратной апроксимации полилинии из прямых примитивов в дуговые.
Все перерыл, не могу найти.
Что то не понял задачи...
На входе есть полилиния из прямолинейных сегментов, на выходе надо получить полилинию из дуговых сегментов, а откуда необходимо брать кривизну? Если для дуговых сегментов брать два последовательных сегмента и среднюю точку брать как лежащую на дуге, то все просто, но не уверен, что это и необходимо. Если же нужно найти кривизну для каждого сегмента, чтоб в узлах небыло перелома - то это будет довольно сложная задача, хотя, довольно интересная...

ps. после некоторого осмысления второго варианта пришел к выводу - результат будет не абсолютный, а с некоторой точностью. Хотя, точность можно задать и заранее.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 12.02.2010, 03:36
#16
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


To VVA.
Выслал на yandex.
__________________
Лень - великий двигатель прогресса!
KAI вне форума  
 
Автор темы   Непрочитано 16.02.2010, 14:51
#17
WeMaN


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


А вот мне интересно по какому принципу будет работать алгоритм, если я например захочу по точкам отрисовать линию? Возможно ли это впринципе сделать корректно? Ведь откуда программе знать, от какой до какой точки вести линию, я предполагаю, что просто можно уточнаять по поводу направления, например:
- выделяем необходимые точки
- предлагаем нарисовать по ним линию
- в качестве приоритета от какой точки к какой выбираем возрастание(или убывание) по оси Х (или Y), например точка с минимальным значением Х будет 1ой в полилинии, а с максимальным последней
кто - нибудь создавал подобного рода lispы или кто сталкивался?
__________________
Практика доказывает - если смешать кило меда и кило дерьма, то получится два кило дерьма...
WeMaN вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Аппроксимация 3d полилинии

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто знает, объясните как изменить толщину 3d полилинии? vicont-s AutoCAD 12 11.04.2015 20:29
Конструирование в 3D Serz AutoCAD 87 28.10.2014 10:40
Создание 3d полилинии макрасом Mazai Программирование 18 23.09.2008 16:05
Как тело построенное 3D Face превратить в 3D Solid? Bdod AutoCAD 37 03.08.2006 11:36