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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vlax-curve-getclosestpointtoprojection - непонятный результат

vlax-curve-getclosestpointtoprojection - непонятный результат

Ответ
Поиск в этой теме
Непрочитано 11.06.2008, 13:21 #1
vlax-curve-getclosestpointtoprojection - непонятный результат
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,787

Суть в том, что стандартная в общем-то функция vlax-curve-getclosestpointtoprojection у меня в ADT 2006 и 2008 не возвращает ожидаемый результат - я получаю не проекцию на продолжение примитива, а просто ближайшую точку, независимо ни от чего. Где я ошибаюсь?
Для проверки можно провернуть следующий код (предварительно нарисовав, например, отрезок):
Код:
[Выделить все]
(defun test (/ pt ent)
  (if (and (setq ent (car (entsel "\nЛюбой отрезок или полилиния : ")))
           (setq pt (getpoint "\nТочка : "))
           ) ;_ end of and
    (progn
      (entmakex (list (cons 0 "POINT")
                      (cons 10 pt)
                      (cons 62 1)
                      ) ;_ end of list
                ) ;_ end of entmakex
      (setq ent (vlax-ename->vla-object ent))
      (entmakex
        (list
          (cons 0 "POINT")
          (cons
            10
            (vlax-curve-getclosestpointtoprojection
              ent
              pt
              (vlax-safearray->list (vlax-variant-value (vla-get-normal ent)))
              t
              ) ;_ end of vlax-curve-getClosestPointToProjection
            ) ;_ end of cons
          (cons 62 2)
          ) ;_ end of list
        ) ;_ end of entmakex
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
---
Добавлю: особенно это напрягает, если точка лежит "за пределами" примитива ent... В результате я получаю начало или конец примитива в качестве проекции, что не устраивает ни в каком варианте.

Миниатюры
Нажмите на изображение для увеличения
Название: closestpointtoproj.png
Просмотров: 123
Размер:	3.0 Кб
ID:	7397  

__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 11.06.2008 в 14:24.
Просмотров: 4990
 
Непрочитано 11.06.2008, 16:56
#2
Елпанов Евгений

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


Удивлен, что ты называешь эту программу обычной..
Она никогда не работала правильно

PS. Кстати, в некоторых местах, мне пришлось заменять своими аналогами даже команду vlax-curve-getclosestpointto, а ты про проекции...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 11.06.2008, 23:32
#3
Кулик Алексей aka kpblc
Moderator

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


Нда... Не очень известия. Если для прямых участков я еще могу что-то наваять, то с дугами придется ковырять геометрию... Эх-эх-эх, где мои учебники за 7 класс?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.06.2008, 09:30
#4
Елпанов Евгений

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
... Если для прямых участков я еще могу что-то наваять, то с дугами придется ковырять геометрию...
С дугами еще проще!
1. Делаешь проекцию исходной точки на плоскость дуги
2. Прибавляешь к центру дуги вектор, который имеет длину, равную радиусу и направление на полученную точку.

В этом смысле, для прямого сегмента, надо еще найти нужную нормаль плоскости, в которой искать перпендикуляр...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 12.06.2008, 22:12
#5
Кулик Алексей aka kpblc
Moderator

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


У меня в моей конкретной ситуации все еще проще: только мировая система координат, Elevation (Z) = 0. То есть все двумерное и гарантированно принадлежит одной плоскости.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.06.2008, 13:10
#6
Елпанов Евгений

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У меня в моей конкретной ситуации все еще проще: только мировая система координат, Elevation (Z) = 0. То есть все двумерное и гарантированно принадлежит одной плоскости.
А почему, тогда, не воспользоваться более стабильной функцией vlax-curve-getclosestpointto?
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 13.06.2008, 23:57
#7
Кулик Алексей aka kpblc
Moderator

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


Дело в том, что обрабатываются АЕС-объекты (объекты ADT). А для них vlax-curve-getclosestpointto вообще зачастую отказывается срабатывать. Увы и ах, завтра (когда протрезвею) придется садиться за уравнения 2-мерной геометрии
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.07.2017, 13:36
#8
tujn08


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


аналогичная проблема, но на порядок непонятнее у меня.
Кто разобрался как работает.
Акад 2013

----- добавлено через ~7 мин. -----
сработало только когда принудительно вторую точку откинул на 100000000 (в бесконечность). аргумент <продолжение> плоскости не работает как надо.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 35
Размер:	56.1 Кб
ID:	190550  
tujn08 вне форума  
 
Автор темы   Непрочитано 04.07.2017, 13:47
#9
Кулик Алексей aka kpblc
Moderator

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


tujn08, ты сам-то понял чего написал? Теперь код, исходник и все остальное. А заодно - справка, в чем разница между vlax-curve-getclosestpointto и vlax-curve-getclosestpointtoprojection.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.07.2017, 13:59
#10
tujn08


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


в моем случае все что меньше 100000000000 показывает проекцию второго ближайшего пересечения, Если еще меньше, то ерунду
tujn08 вне форума  
 
Автор темы   Непрочитано 04.07.2017, 14:09
#11
Кулик Алексей aka kpblc
Moderator

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


Не понимаю... Если координаты хотя бы по Х известны, то на фига использовать проекцию на горизонтальную прямую? Не проще ли просто поменять одну из координат точки?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.07.2017, 14:18
#12
tujn08


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


Код:
[Выделить все]
 (progn 
(vl-load-com)
	(setq nab (ssget "_X" (list (cons 8 "VID_01") (cons 0 "*LINE"))))
	(setq o_obj (ssname nab 0))
	(setq vla_line (vlax-ename->vla-object o_obj)) ; перевели в вла объект
	(setq pt1 (list 2037.3 2098.9448 0.0))
	(setq a 10) ; 1 вариант совершенно непонятный для меня
	;(setq a 10000000000000000000)  ; 2 вариант - второе пересечение
	;(setq a 1000000000000000000000000000000)  ; 3 вариант - искомый вариант
	(setq pt2 (list (+ 2037.3 a) 2098.9448 0.0))
	(setq temp (vlax-curve-getClosestPointToProjection vla_line pt1 pt2 T)) ; T в случае 1 вариант результат не дает
	(command "_point" temp)
)
----- добавлено через ~3 мин. -----
Ближайшая проекционная точка на плоскость будет пересечение в . Я уже забываю зачем все это делаю )))
Вложения
Тип файла: dwg
DWG 2013
Чертеж1.dwg (33.0 Кб, 6 просмотров)
tujn08 вне форума  
 
Автор темы   Непрочитано 04.07.2017, 14:23
#13
Кулик Алексей aka kpblc
Moderator

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


Поехали... Что такое нормаль? На какую плоскость ты выполняешь проецирование?
В качестве подсказки: что такое единичные векторы? Что такое векторное произведение векторов?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.07.2017, 14:23
#14
tujn08


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


1. не работает условие продолжении плоскости
2. должно показывать ближайшую проекционную точку, а показывает дальнюю (случай 2)

----- добавлено через ~3 мин. -----
желтая линия- нормаль к проекции
tujn08 вне форума  
 
Автор темы   Непрочитано 04.07.2017, 14:29
#15
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun tt (pt / ss)
  ;; pt - точка на твоей горизонтальной "прямой", куда выполнять проецирование.
  ;; (tt (getpoint))
  (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE") (8 . "VID_01"))))
    (mapcar (function (lambda (ent / elevation normal c)
                        (setq elevation (cond ((cdr (assoc 38 (entget ent))))
                                              (t 0.)
                                              ) ;_ end of cond
                              normal    (cdr (assoc 210 (entget ent)))
                              ) ;_ end of setq
                        (mapcar (function (lambda (x)
                                            (setq x (trans (list (cadr x) (caddr x) elevation) normal 0))
                                            (list (car x) (cadr pt) (caddr x))
                                            ) ;_ end of lambda
                                          ) ;_ end of function
                                (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
                                ) ;_ end of mapcar
                        ) ;_ end of lambda
                      ) ;_ end of function
            (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
            ) ;_ end of mapcar
    ) ;_ end of if
  ) ;_ end of defun
----- добавлено через ~1 мин. -----
tujn08, если "желтая - нормаль к проекции", то на какую плоскость / прямую ты проецируешь точки? Мне почему-то кажется, что если это - нормаль, то проецировать ты будешь не на горизонт, а на вертикаль. Которая, правда, непонятно где находится.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vlax-curve-getclosestpointtoprojection - непонятный результат

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

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