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

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

Как вычислить расстояние от точки до точки методами ActiveX?

Ответ
Поиск в этой теме
Непрочитано 19.11.2009, 21:06 #1
Как вычислить расстояние от точки до точки методами ActiveX?
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Кроме вот такой фигни ничего не могу найти на эту тему
Код:
[Выделить все]
(vla-SendCommand actdoc "(setq a123 (getdist '(0.0 0.0 -2.55457) \"1\")) 17.9722,0.0,0.0 ")
Неужели нет методов в ActiveX определения дистанций от точки до точки?
Просмотров: 11708
 
Непрочитано 19.11.2009, 21:51
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


А что нормальные (геометрические) методы определения расстояний уже запрещены?
Александр Ривилис вне форума  
 
Непрочитано 19.11.2009, 22:18
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Код:
[Выделить все]
((lambda (pt1 pt2 / line dist)
   (setq line (vla-addline
		(vla-get-modelspace actdoc)
		(vlax-3d-point pt1)
		(vlax-3d-point pt2)
	      ) ;_ end of vla-addline
	 dist (vla-get-length line)
   ) ;_ end of setq
   (vla-delete line)
   dist
 ) ;_ end of lambda
  '(0.0 0.0 -2.55457)
  '(17.9722 0.0 0.0)
)
Do$ вне форума  
 
Непрочитано 19.11.2009, 22:37
#4
Дима_

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


офтоп - как левой ногой правое ухо почесать?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.11.2009, 00:40
#5
Олег (jr.)

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Кроме вот такой фигни ничего не могу найти на эту тему
Код:
[Выделить все]
(vla-SendCommand actdoc "(setq a123 (getdist '(0.0 0.0 -2.55457) \"1\")) 17.9722,0.0,0.0 ")
Неужели нет методов в ActiveX определения дистанций от точки до точки?
Положу сюда свой скромный грош:

Код:
[Выделить все]
(defun C:demo (/ adoc autil dist pt)
(setq adoc (vla-get-activedocument
  (vlax-get-acad-object))
  autil (vla-get-utility adoc)
      )
(vla-initializeuserinput autil 64 nil);<--  бит 64 для 2-х мерного расстояния Z игнорируется
(setq pt (vla-getpoint autil nil "\n   Первая точка: ")
      )
  
(setq dist (vla-getdistance autil pt "\n   Вторая точка: ")
      )
(alert (strcat "Расстояние = " (rtos dist 2 3)))
(princ)
  )
(vl-load-com)
~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 20.11.2009, 09:41
#6
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Олег (jr.), так эта vla-getdistance то же самое что и (getdist [<точка>] [<строка>]) Только еще + пляски с бубном вокруг ActiveX.
У меня есть две точки, записанные в переменные и мне "кликать" некуды!
И единственное решение, что я нашел - это:
Код:
[Выделить все]
(setq point-1 '(0.0 0.1 1.5))
(setq point-2 '(9.5 0.0 0.0))
(setq point-2-string (mapcar '(lambda (a) (strcat (vl-princ-to-string a) ",")) point-2))
(setq point-2-string (vl-string-right-trim "," (apply 'strcat point-2-string)))
(vla-SendCommand actdoc (strcat "(setq dist-1 (getdist point-1 \"1\"))" " " point-2-string " "))
Что за напасть! В ActiveX нет функции замера дистанции по двум точкам!
Полный абзац!
Эй, гуру, может исправите положенице? Надо сделать функцию на ARX.
Supermax вне форума  
 
Непрочитано 20.11.2009, 09:56
#7
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Пример из книги же!

Код:
[Выделить все]
(vla-GetDistance
  (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object)))
  nil
  "\nКликни пару раз"
)
Полещук, Лоскутов "AutoLISP и VisualLISP в среде AutoCAD" (стр. 432):
Makswell вне форума  
 
Автор темы   Непрочитано 20.11.2009, 10:23
#8
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Makswell, ты че, издеваешся? Какое "Кликни"?
Я провожу анализ растояний и в зависимости от того, какое расстояние меньше, принимаю решение. Мне надо замерять расстояния от точки до точки, полученные из координат вставки объектов. Я получаю обычные списки и мне надо вычислить расстояние по двум точкам в виде 3D координат, записанных в переменные.
Вот была бы такая функция (ттттт <точка-1> <точка-2>) щастью небыло бы предела.
Supermax вне форума  
 
Непрочитано 20.11.2009, 10:28
#9
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Supermax, понял, sorry.
Видимо в ActiveX такого нет.
Но ничто не мешает написать функцию, которая тупо геометрически вычисляет расстояние между 2-мя точками по координатам.
И будет тебе (ттттт <точка-1> <точка-2>).
Твоя концепция запрещает ичпользовать тригонометричемкие функции?
Makswell вне форума  
 
Автор темы   Непрочитано 20.11.2009, 10:36
#10
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Для начала надо ARX колупнуть, но я его колупать не умею (пока).
Вычисления в Автокаде возможны только если получать все 15 знаков после запятой, и то, могет и не сработать. А сам Автокад, хоть и показывает слегка обрезанный вариант, но на самом деле учитывает полное значение. И я себе представляю во что может вылиться вычисление через тригонометрию. Вместо одной строчки будет целая страница.
Supermax вне форума  
 
Непрочитано 20.11.2009, 10:51
#11
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Да в общем-то с тригонометрией я погорячился. Вот твоя функция ттттт.
Использованы степень да корень квадратный.

Код:
[Выделить все]
(defun ттттт (pt1 pt2 / x1 y1 z1 x2 y2 z2)
  (setq	x1 (car pt1)
	y1 (cadr pt1)
	z1 (caddr pt1)
	x2 (car pt2)
	y2 (cadr pt2)
	z2 (caddr pt2)
  )
  (sqrt
    (+
      (expt (- x2 x1) 2)
      (expt (- y2 y1) 2)
      (expt (- z2 z1) 2)
    )
  )
)
Makswell вне форума  
 
Автор темы   Непрочитано 20.11.2009, 10:58
#12
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Makswell, замечательно! Надо в библиотеку функций кинуть.


Плииз, оформи функцию!
Я ее себе в прогу вставлю и саму прогу в библиотеку выложу.

Давай назовем ее Dist+
???

Последний раз редактировалось Supermax, 20.11.2009 в 11:03.
Supermax вне форума  
 
Непрочитано 20.11.2009, 10:59
#13
Елпанов Евгений

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


Совсем не понимаю, в чем проблема, зачем делать попытки обхода лисп функций?
Если все дело в запуске через ком строку - то примерно так:
Код:
[Выделить все]
(setq p1 '(0.0 0.1 1.5))
(setq p2 '(9.5 0.0 0.0))
(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object))"(distance p1 p2)\n")
Хотя, я так и не понял, в чем проблема. Поясните мне...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 20.11.2009, 11:05
#14
zamtmn

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


>>Вычисления в Автокаде возможны только если получать все 15 знаков после запятой, и то, могет и не сработать
Это как так? если есть точки какое может быть получение 15 знаков?
>>И я себе представляю во что может вылиться вычисление через тригонометрию
через тригонометрию может и выльется, а если по старинке, отделаетесь парой строчек)) если нужно только сравнение расстояний то можно считать квадрат расстояний
zamtmn вне форума  
 
Непрочитано 20.11.2009, 11:09
#15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Supermax Посмотреть сообщение
Вместо одной строчки будет целая страница.
http://www.pm298.ru/zadachi.php
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 20.11.2009, 11:13
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Елпанов Евгений, а! Вот и ты на эти грабли наступил.
Функция Distance, цитирую:
Цитата:
... Если точки трехмерные, то функция рассчитывает угол между осью Х и проекцией вектора, идущего из первой точки во вторую, на текущую плоскость построений.
Я на ней тоже прокололся.

VVA, так Makswell функцию для пространства и сделал.
Supermax вне форума  
 
Непрочитано 20.11.2009, 11:17
#17
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Елпанов Евгений, а! Вот и ты на эти грабли наступил.
Функция Distance, цитирую:

Я на ней тоже прокололся.
Другими словами, ты хочешь сказать, что такой код:
Код:
[Выделить все]
(distance '(0 0 0) '(0 0 10))
должен вернуть ноль?

ps. рекомендую проверить...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 20.11.2009, 11:25
#18
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Не, жаль что тут нельзя рисовать, возьми нарисуй линию и поверни ее на 45 градусов, затем замерь ее длинну через distance, а затем глянь в properties на ее настоящую длинну.
Код:
[Выделить все]
(distance (getpoint) (getpoint))
Supermax вне форума  
 
Непрочитано 20.11.2009, 11:28 Г-н
#19
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Не, жаль что тут нельзя рисовать, возьми нарисуй линию и поверни ее на 45 градусов, затем замерь ее длинну через distance, а затем глянь в properties на ее настоящую длинну.
Код:
[Выделить все]
(distance (getpoint) (getpoint))

Код:
[Выделить все]
Command: VIEWDIR
VIEWDIR = -1583.2096,-1391.5182,1075.4841 (read only)
Command: (setq p1 '(0 0 0) p2 '(1 0 0)) (1 0 0)

Command: (distance p1 p2) 1.0
Ну и?
Александр Ривилис вне форума  
 
Непрочитано 20.11.2009, 11:31
#20
Елпанов Евгений

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


Supermax, причем здесь линия? Функция distance может работать только с двумя аргументами - точками (списками из двух или трех цифр, которые могут быть как целыми, так и реальными). Единственное условие, что для вычисления длинны трехмерного вектора между этими точками, обе точки должны быть тоже трехмерными. Если хотя бы одна точка двухмерна, т.е. не имеет Z, то длинна вычисляется только для двухмерных точек и Z второй точки игнорируется.

ps. По поводу твоей повернутой линии - опубликуй здесь два списка 3д точек, между которыми неверно вычисляется расстояние - игнорируется высота.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 20.11.2009, 11:33
#21
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Код:
[Выделить все]
Command: VIEWDIR
VIEWDIR = -1583.2096,-1391.5182,1075.4841 (read only)
Command: (setq p1 '(0 0 0) p2 '(1 0 0)) (1 0 0)

Command: (distance p1 p2) 1.0
Ну и?
Клянусь своими мозгами, вчера эта distance вела себя так, как написано у Полещука!
А сейчас выдает реальную длину!
Я в шоке!
Supermax вне форума  
 
Непрочитано 20.11.2009, 11:36
#22
Дима_

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


Я читаю и не понимаю - чем distance то не угодил??? нахрена аналог TTTTT из 11 поста и уж тем более через Active-X?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.11.2009, 11:37
#23
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Клянусь своими мозгами
Мы тебе и так верим!
Приходи на встречу Репетиция Нового года в Москве. Можно будет обсудить длину вектора и многое другое, более предметно...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 20.11.2009, 11:37
#24
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Клянусь своими мозгами, вчера эта distance вела себя так, как написано у Полещука!
Процитируй Николая Николаевича. Не поверю, что у него такое написано пока сам не увижу. Возможно там идет речь о 2D-координатах:
Цитата:
If one or both of the supplied points is a 2D point, then distance ignores the Z coordinates of any 3D points supplied and returns the 2D distance between the points as projected into the current construction plane.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 20.11.2009, 11:46
#25
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Так я еще раз цитирую
AutoLisp и Visual Lisp в стране AutoCAD.
Цитата:
Вычисляет расстояние между первой точкой, заданной аргументом <точка>, и второй точкой, заданной аргументом <точка2>. Если точки трехмерные, то функция рассчитывает угол между осью Х и проекцией вектора, идущего из первой точки во вторую, на текущую плоскость построений.
Наверное надо было написать двухмерные?
Supermax вне форума  
 
Непрочитано 20.11.2009, 11:49
#26
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
AutoLisp и Visual Lisp в стране AutoCAD.
наверное
стране = среде

и еще, напиши пожалуйста издательство и год выпуска, таких книг было несколько...

ps. и еще, какая страничка? Вечерком хочу посмотреть...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 20.11.2009, 11:57
#27
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Елпанов Евгений, стр. 38 "БХВ-Петербург" 2006 год.
Цитата:
наверное
стране = среде
Точно, точно.
Шутю я.

На вечер постараюсь прийти. Часов так в 16.
Supermax вне форума  
 
Непрочитано 20.11.2009, 12:04
#28
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Если точки трехмерные, то функция рассчитывает угол между осью Х и проекцией вектора, идущего из первой точки во вторую, на текущую плоскость построений.
Тут вообще полная ерунда - эта функция никогда не считала угол. Похоже это кусок из описания функции angle:
Цитата:
The angle is measured from the X axis of the current construction plane, in radians, with angles increasing in the counterclockwise direction. If 3D points are supplied, they are projected onto the current construction plane.
Александр Ривилис вне форума  
 
Непрочитано 20.11.2009, 12:06
#29
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
На вечер постараюсь прийти. Часов так в 16.
Обычно, договариваемся на семь вечера, часть народа приходит немного раньше, но большинство после восьми - пятница рабочий день. Хотя, с другой стороны, некоторые в девять уже уезжают - спешат на последние электрички, автобусы итд...

Рекомендую отписаться в теме о встрече, чтоб вас тоже посчитали
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 20.11.2009, 12:08
#30
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Не мужики, она опять стала чудить.
Я замеряю одно и то же расстояние переключаясь в разные плоскости обзора и показывает разные значения.
Я догадываюсь почему. Одна из точек не переведена в MSK. Ща попробую.
Supermax вне форума  
 
Непрочитано 20.11.2009, 12:11
#31
Елпанов Евгений

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


Supermax, расстояние между двумя точками не зависит от системы координат. Главное, чтоб все точки были в одной системе координат.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 20.11.2009, 12:23
#32
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Не, я таки точно не перевел одну точку в МСК. Дело в том, что одну точку я получаю через (entget ...), а она мне дается в МСК, значит и вторая должна быть в МСК. Подправил и все правильно заработало.

Александр Ривилис, ты прав. Только в angle написано
Цитата:
Если точки трехмерные, то функция вычисляет ...
а в distance
Цитата:
Если точки трехмерные, то функция рассчитывает ...
а дальше буква в букву.

Ну вот, польза есть налицо. Очипятку у Маэстро Полещука нарыли. Надо ему сообщить, однако. У него на сайте есть страничка с опечатками в этой книге.

Последний раз редактировалось Supermax, 20.11.2009 в 12:34.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как вычислить расстояние от точки до точки методами ActiveX?

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Как определить расстояние между 2 точками по spline? Хотабыч Программирование 5 22.01.2006 15:33
Как определить действительные конечные точки mark AutoCAD 1 05.10.2005 00:06
Как измерить в автокаде расстояние от точки до плоскости? Камиль AutoCAD 9 07.06.2005 20:48
Как в макросе запросить ввод объекта и точки. Torino AutoCAD 4 27.08.2003 18:58