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

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

Нахождение расстояния между точками на чертеже

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

Добрый день! Столкнулся с такой задачей. Есть чертеж с множеством точек (около 100). Нужно при помощи языка LISP найти расстояния от одной точки, которую ты укажешь на чертеже, до всех остальных точек. Результат с расстояниями должен вывестись в текстовый файл или в таблицу Excel.
Как найти расстояние между 2-мя точками, я знаю. А вот как до всех точек, пока не разобрался. Подскажите, пожалуйста, как решить данную задачу.
Просмотров: 18151
 
Непрочитано 23.08.2010, 09:35
#2
Profan


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


Для начала их бы (точки) пронумеровать...
Profan вне форума  
 
Автор темы   Непрочитано 23.08.2010, 10:33
#3
Макс_Кунгур


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


Profan, в Point Group Manager они есть, импортированы с координатами и номерами.
Как я понимаю, мне нужно все оставшиеся точки объединить в набор. Во-первых, я не знаю как это сделать, а во-вторых, что с этим набором дальше делать?
Макс_Кунгур вне форума  
 
Непрочитано 23.08.2010, 10:35
#4
Дима_

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


Цитата:
Сообщение от Макс_Кунгур Посмотреть сообщение
Как найти расстояние между 2-мя точками, я знаю.
Соберите все осальные точки в список и прогоните через функцию вычисления расстояния. Аналогично с выводом результата.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 23.08.2010, 10:39
#5
Макс_Кунгур


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


Дима_, дак я вот понимаю, что это нужно сделать, а вот как это будет выглядеть в lisp, я не могу разобраться.
Макс_Кунгур вне форума  
 
Непрочитано 23.08.2010, 10:43
#6
Дима_

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


как вариант:
а- ваша превая точка
(mapcar '(lambda (x) (тело функции считающие расстояние от а до х))
(список точек))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.08.2010, 10:45
#7
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Макс_Кунгур Посмотреть сообщение
Дима_, дак я вот понимаю, что это нужно сделать, а вот как это будет выглядеть в lisp, я не могу разобраться.
Можно просто записать в файл CSV а потом в меню
Данные --> Разбить по столбцам:

Код:
[Выделить все]
(defun c:pex(/ *error* counter dest dist_info elist filedesc filename n p pent prec pset ptsset)
  
  (defun *error* (msg)
    (if msg (princ msg)
      (princ "\nError")
      )
    (if filedesc (close filedesc))
    (prin1)
    )
  
  (if
    (setq pset (ssget "_+.:S:E" (list (cons 0 "POINT"))))
     (progn
       (setq pent (ssname pset 0))
       (setq dest (cdr (assoc 10 (entget pent))))
       (command "._zoom" "_e")
       (setq ptsset (ssget "_X" (list (cons 0 "POINT"))))
       (command "._zoom" "_p")
       (ssdel pent ptsset)
       (setq dist_info
	      (mapcar '(lambda (p) (distance p dest))
		      (mapcar '(lambda (elist)
				 (cdr (assoc 10 elist)))
			      (mapcar 'entget
				      (vl-remove-if
					'listp
					(mapcar 'cadr (ssnamex ptsset)))))))
       (setq dist_info (mapcar '(lambda	(n)
				  (nth n dist_info))
			       (vl-sort-i dist_info '(lambda (x y) (< x y)))))

       (setq filename (strcat (getvar "dwgprefix")
			      (vl-filename-base (getvar "dwgname"))
			      ".csv"))
       (setq filedesc (open filename "w"))
       (setq counter 1
	     prec    (getvar "dimdec"))
       (foreach	item  dist_info
	 (write-line
	   (strcat (itoa counter) (chr 9) (rtos item 2 prec))
	   filedesc)
	 (setq counter (1+ counter)))
       (close filedesc)
       )
     )
    (princ)
    )
(princ "\nStart command with PEX ...")
(prin1)
Нумерация точек в файле по взрастанию расстояния

~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 23.08.2010, 11:23
#8
Макс_Кунгур


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


Олег (jr.), потестировал твой лисп. Вот что в командной строке написано:
Command: _appload DISTANCE_F.LSP successfully loaded.
Command:

Start command with PEX ...
Command:

Command: pex

Select objects:

Command:
Как я понимаю, когда я выбрал точку, программа оборвалась.
И куда этот файл .csv записывается?
Макс_Кунгур вне форума  
 
Непрочитано 23.08.2010, 11:46
#9
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Макс_Кунгур Посмотреть сообщение
Олег (jr.), потестировал твой лисп. Вот что в командной строке написано:
Command: _appload DISTANCE_F.LSP successfully loaded.
Command:

Start command with PEX ...
Command:

Command: pex

Select objects:

Command:
Как я понимаю, когда я выбрал точку, программа оборвалась.
И куда этот файл .csv записывается?
Ищи в той же папке под названием "ИмяЧертежа.csv"

~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 23.08.2010, 12:44
#10
Макс_Кунгур


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


Олег (jr.), там ничего нет. Как я говорил раньше, наверное, программа обрывается, когда я выбираю примитив. Из-за чего?
Макс_Кунгур вне форума  
 
Непрочитано 23.08.2010, 14:33
#11
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Макс_Кунгур Посмотреть сообщение
Олег (jr.), там ничего нет. Как я говорил раньше, наверное, программа обрывается, когда я выбираю примитив. Из-за чего?
Все правильно, программа работает быстро и не видно изменений
на экране
У меня просто есть сомнение насчет того что выбранная точка является примитивом типа Point
Добавим информативности:

Код:
[Выделить все]
;;pex.lsp
(defun c:pex(/ *error* counter dest dist_info elist filedesc filename n p pent prec pset ptsset)
  
 (defun *error* (msg)
 (if msg
 (if 
 (or 
 (= msg "Function cancelled")
 (= msg "quit / exit abort") 
 )
 (princ)
 (princ  (strcat "\nError message: " msg))
)
)
    (if filedesc (close filedesc))
    (princ)
    )

  
  (if   
    (setq pset (ssget "_+.:S:E" (list (cons 0 "POINT"))))

     (progn
       
       (setq pent (ssname pset 0))
       (setq dest (cdr (assoc 10 (entget pent))))
       (command "._zoom" "_e")
       (setq ptsset (ssget "_X" (list (cons 0 "POINT"))))
       (alert (strcat "Totally selected " (itoa (sslength ptsset)) " points"))
       (command "._zoom" "_p")
       (ssdel pent ptsset)
       (setq dist_info
	      (mapcar '(lambda (p) (distance p dest))
		      (mapcar '(lambda (elist)
				 (cdr (assoc 10 elist)))
			      (mapcar 'entget
				      (vl-remove-if
					'listp
					(mapcar 'cadr (ssnamex ptsset)))))))
       (setq dist_info (mapcar '(lambda	(n)
				  (nth n dist_info))
			       (vl-sort-i dist_info '(lambda (x y) (< x y)))))

       (setq filename (strcat (getvar "dwgprefix")
			      (vl-filename-base (getvar "dwgname"))
			      ".csv"))
       (setq filedesc (open filename "w"))
       (setq counter 1
	     prec    (getvar "dimdec"))
       (foreach	item  dist_info
	 (write-line
	   (strcat (itoa counter) (chr 9) (rtos item 2 prec))
	   filedesc)
	 (setq counter (1+ counter)))
       (close filedesc)

       (alert (strcat "File created with pat:\n" filename))
       )

    (alert (strcat "Selected object is not a POINT entity"))

     )

    (princ)
    )
(princ "\nStart command with PEX ...")
(prin1)
~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 24.08.2010, 13:34
#12
Макс_Кунгур


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


Олег (jr.), спасибо. Все получилось, как надо. Я поменял строчку добавления в набор и заработало. Еще раз спасибо. Скажи, пожалуйста, а можно сделать так, чтобы точку не выбирать, с которой нужно считать значения, а при запуске лиспа, программа считала расстояния сначала от одной точки до всех оставшихся точек, потом от второй, и т.д., пока не дойдет до последней точки. А результаты бы выводились в один файл, но в разные таблицы. И еще, у меня у каждой точки стоит свой номер. Можно сделать так, чтобы в результирующий файл попадали значения расстояний с обозначением:
№ 35 - № 10Э06 15
№ 35 - № 11Э06 25
.......................
№ 35 - № n d
Макс_Кунгур вне форума  
 
Непрочитано 24.08.2010, 14:31
#13
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Макс_Кунгур Посмотреть сообщение
Олег (jr.), спасибо. Все получилось, как надо. Я поменял строчку добавления в набор и заработало. Еще раз спасибо. Скажи, пожалуйста, а можно сделать так, чтобы точку не выбирать, с которой нужно считать значения, а при запуске лиспа, программа считала расстояния сначала от одной точки до всех оставшихся точек, потом от второй, и т.д., пока не дойдет до последней точки. А результаты бы выводились в один файл, но в разные таблицы. И еще, у меня у каждой точки стоит свой номер. Можно сделать так, чтобы в результирующий файл попадали значения расстояний с обозначением:
№ 35 - № 10Э06 15
№ 35 - № 11Э06 25
.......................
№ 35 - № n d
Чертеж в студию (пож-ста не выше 2008)
+ объяснения в чертеж в виде мтехта

~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 24.08.2010, 15:34
#14
Макс_Кунгур


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


Чертеж не могу скинуть, потому что он у меня в проекте. Скидываю рисунок DIST. Эти точки импортированы с текстового файла с разделителями табуляции. В текстовом файле содержалось:
1 столбец - номер строки, 2 столбец - координата по X, 3 столбец - координата по Y, 4 столбец - координата по Z, 5 столбец - название (номер точки).
Что нужно: загружаем лисп, вводим PEX, результат:
Файл .csv, или можно много файлов .csv (по количеству точек), в котором должно быть всего 2 столбца: 1 ст. - название расстояния (например, r 1-2, r 1-3,....r 2-1, r 2-3,...r 3-1, r 3-2,....),Т.Е. ПО НОМЕРУ ТОЧЕК, чтобы не перепутать; 2 ст. - значение расстояния.
Вот вроде бы все.
Миниатюры
Нажмите на изображение для увеличения
Название: DIST.JPG
Просмотров: 126
Размер:	4.6 Кб
ID:	44158  
Макс_Кунгур вне форума  
 
Непрочитано 24.08.2010, 15:39
#15
Кулик Алексей aka kpblc
Moderator

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


Рисунок ничем не поможет. Надо смотреть на внутренности dwg.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.08.2010, 15:44
#16
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Макс_Кунгур Посмотреть сообщение
Чертеж не могу скинуть, потому что он у меня в проекте. Скидываю рисунок DIST. Эти точки импортированы с текстового файла с разделителями табуляции. В текстовом файле содержалось:
1 столбец - номер строки, 2 столбец - координата по X, 3 столбец - координата по Y, 4 столбец - координата по Z, 5 столбец - название (номер точки).
Что нужно: загружаем лисп, вводим PEX, результат:
Файл .csv, или можно много файлов .csv (по количеству точек), в котором должно быть всего 2 столбца: 1 ст. - название расстояния (например, r 1-2, r 1-3,....r 2-1, r 2-3,...r 3-1, r 3-2,....),Т.Е. ПО НОМЕРУ ТОЧЕК, чтобы не перепутать; 2 ст. - значение расстояния.
Вот вроде бы все.
Если тебе трудно скопировать десяток этих точек и вставить в пустой чертеж
то почему я должен писать эту фигню чтобы потом все переделывать?
или ты думаешь что это прошу только из-за моей прихоти?
А где расстояние от точек до текста, а как расположен текст относительно точек,
а на каком слое и то и другое?
Ну и мне это надо?
Олег (jr.) вне форума  
 
Непрочитано 24.08.2010, 15:50
#17
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Цитата:
Эти точки импортированы с текстового файла
Так а нафига тогда вообще чертеж dwg, если можно проанализировать текстовый файл?
CB вне форума  
 
Непрочитано 24.08.2010, 15:55
#18
Дима_

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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Если тебе трудно скопировать десяток этих точек и вставить в пустой чертеж
то почему я должен писать эту фигню чтобы потом все переделывать?
или ты думаешь что это прошу только из-за моей прихоти?
А где расстояние от точек до текста, а как расположен текст относительно точек,
а на каком слое и то и другое?
Ну и мне это надо?
Вот - что и следовало ожидать когда лисп пишется "вслепую" по устному объяснению человека. Не надо торопиться вылечить человека - вначале надобы понять что болит.
p.s. тебе еще "повезло" что точки оказались действительно точками, а расстояние - расстоянием (а, например, не проекцией на плоскость XY).
p.p.s
Цитата:
Эти точки импортированы с текстового файла
- а здесь вообще встает вопрос о правильности выбора автокада - как инструмента для выполнения задачи.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 24.08.2010 в 16:01.
Дима_ вне форума  
 
Непрочитано 24.08.2010, 18:18
#19
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Вот - что и следовало ожидать когда лисп пишется "вслепую" по устному объяснению человека. Не надо торопиться вылечить человека - вначале надобы понять что болит.
p.s. тебе еще "повезло" что точки оказались действительно точками, а расстояние - расстоянием (а, например, не проекцией на плоскость XY).
p.p.s - а здесь вообще встает вопрос о правильности выбора автокада - как инструмента для выполнения задачи.
Я просто часто на эти грабли уже наступал, не далее как пару лет
назад сделал 18 вариантов довольно большой программы
- человек тоже говорил что не может чертеж выслать с рабочего
места по корпоративным правилам, а в результате оказалось
что ему совсем не то было нужно
В результате я все же сделал как надо, на все про все месяц ушел,
а можно было за пару дней сляпать если бы чертеж был изначально под рукой

Насчет файла данных (текстовый или другой) тоже согласен,
скорее всего он тоже у Макса есть

Олег (jr.) вне форума  
 
Автор темы   Непрочитано 25.08.2010, 07:47
#20
Макс_Кунгур


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


Олег (jr.), Кулик Алексей aka kpblc, выкладываю dwg.
Вложения
Тип файла: dwg
DWG 2007
Distan.dwg (57.7 Кб, 2322 просмотров)
Макс_Кунгур вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нахождение расстояния между точками на чертеже

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расстояния между компенсаторами тепловых сетей proekt_mep Отопление 10 29.05.2012 14:17
Определение высот рельефа по близлежащим точкам dextron3 Программирование 21 10.11.2011 13:14
Расстояние между проемами в соседних пожарных отсеках (блокированные жилые дома) Koliabek Пожарная безопасность 11 13.05.2009 11:17
Расстояние между видами на чертеже Сеченов Разное 14 09.02.2009 15:50
Как определить расстояние между 2 точками по spline? Хотабыч Программирование 5 22.01.2006 15:33