Анкерные системы Schöck Dorn
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум 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
Сообщений: 34,654

Кулик Алексей aka kpblc вне форума Вставить имя

Суть в том, что стандартная в общем-то функция 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
Просмотров: 104
Размер:	3.0 Кб
ID:	7397  

__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

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

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью 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
С.-Петербург
Сообщений: 34,654


Нда... Не очень известия. Если для прямых участков я еще могу что-то наваять, то с дугами придется ковырять геометрию... Эх-эх-эх, где мои учебники за 7 класс?
__________________

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

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью 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
С.-Петербург
Сообщений: 34,654


У меня в моей конкретной ситуации все еще проще: только мировая система координат, Elevation (Z) = 0. То есть все двумерное и гарантированно принадлежит одной плоскости.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.06.2008, 13:10
#6
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью 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
С.-Петербург
Сообщений: 34,654


Дело в том, что обрабатываются АЕС-объекты (объекты ADT). А для них vlax-curve-getclosestpointto вообще зачастую отказывается срабатывать. Увы и ах, завтра (когда протрезвею) придется садиться за уравнения 2-мерной геометрии
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.07.2017, 13:36
#8
tujn08


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


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

----- добавлено через ~7 мин. -----
сработало только когда принудительно вторую точку откинул на 100000000 (в бесконечность). аргумент <продолжение> плоскости не работает как надо.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 14
Размер:	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
С.-Петербург
Сообщений: 34,654


tujn08, ты сам-то понял чего написал? Теперь код, исходник и все остальное. А заодно - справка, в чем разница между vlax-curve-getclosestpointto и vlax-curve-getclosestpointtoprojection.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.07.2017, 13:59
#10
tujn08


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


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

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


Не понимаю... Если координаты хотя бы по Х известны, то на фига использовать проекцию на горизонтальную прямую? Не проще ли просто поменять одну из координат точки?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.07.2017, 14:18
#12
tujn08


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


Код:
[Выделить все]
 (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 Кб, 1 просмотров)
tujn08 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2017, 14:23
#13
Кулик Алексей aka kpblc
Moderator

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


Поехали... Что такое нормаль? На какую плоскость ты выполняешь проецирование?
В качестве подсказки: что такое единичные векторы? Что такое векторное произведение векторов?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.07.2017, 14:23
#14
tujn08


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


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
С.-Петербург
Сообщений: 34,654


Код:
[Выделить все]
 (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, если "желтая - нормаль к проекции", то на какую плоскость / прямую ты проецируешь точки? Мне почему-то кажется, что если это - нормаль, то проецировать ты будешь не на горизонт, а на вертикаль. Которая, правда, непонятно где находится.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vlax-curve-getclosestpointtoprojection - непонятный результат

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


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