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

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

Ввод третьей координаты

Ответ
Поиск в этой теме
Непрочитано 26.08.2008, 16:00 #1
Ввод третьей координаты
Mazai
 
Москва
Регистрация: 04.04.2008
Сообщений: 97

Добрый день, подскажите пожалуйста, есть функция GETPOINT, которая даёт возможность пользователю ввести точку с помощью клавиатуры или мыши. Нужно получить от пользователя координату точки с заданием координаты Z. Не могу сообразить как можно сделать так, что бы при указании точки в двумерном пространстве (Х,У) пользователь дополнительно мог ввести третью координату Z. Понятно что пользователю проще указать на чертеже мышкой координату, но так как чертёж плоский, то как обязать его ввести ещё и третью координату в этом случае? Потому что после указания точки с помощью мыши мы получаем только две координаты Х,У. Наверное с помощью функции GETPOINT это выполнить невозможно. И необходимо предусмотреть дополнительную проверку. Или же всё-таки как-то можно задать грамотно ограничения с помощью функции INITGET с запретом "ввода нуля"?

Последний раз редактировалось Mazai, 26.08.2008 в 16:07.
Просмотров: 4157
 
Непрочитано 26.08.2008, 16:08
#2
VVA

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


getpoint в любом случае вернет 3 координаты. Наверное нужно сделать 2 запроса:
1. getpoint - запросить точку, взять только X и Y
2. getreal - Запросить Z
Ну и склеить все потом обратно
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.08.2008, 07:16
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Работа в 3D предполагает определенный уровень квалификации пользователя. Ввод точек там довольно сложное (не технически, а для мозгов) дело. GETPOINT позволяет ввести три координаты - и с клавиатуры, да и мышкой (координатные фильтры). Этому надо просто научить.

Но, для облегчения работы, надо делать свои функции с дополнительными опциями. Основаны они всё равно должны быть на GETPOINT, только пользователь должен опционально иметь дополнительные возможности. Квалифицированный - может сообразить, какие именно значения ввести. А кому-то дать возможность выбрать из опции.

Например, если просто надо задать Z, то на стороне пользователя может быть приглашение:

Ввод точки. Z=3000 Введи точку [Z]:

Грамотный пользователь может ввести трехмерную точку сразу. Менее подготовленный - введет двухмерную, но к ней присоединится Z=3000. Если ему надо изменить Z, он может выбрать опцию и ввести Z, причем лучше не через getreal, а через getdist - тогда и высоту можно также "измерить" или ввести числом.

Это самый простой случай, "по вертикали". Вместо Z можно включать опции, более понятные - "Поднять", "Опустить". В сложных случаях может понадобиться и задавать направление, наподобие "Вверх-Влево". Это лучше делать визуально или выбором из списка.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 27.08.2008, 10:17
#4
Mazai


 
Регистрация: 04.04.2008
Москва
Сообщений: 97


Спасибо за ответы.
Выполнив этот шаг я пошёл дальше. Конечной целью у меня было вычисление координаты Z в третьей точке, используя для этого метод интерполяции по двум известным точкам. То есть я предлагаю пользователю ввести две точки, по чертежу известны значения Z в них, а потом пользователь указывает на продолжении этой прямой третью, исследуемую точку, где необходимо узнать третью координату. Я не привязываюсь не к каким примитивам. И прошу пользователя указать только интересующие его точки. Решение актуально только в том случае, если пользователь укажет третью точку, лежащую на прямой, образованную первыми двумя точками.
Вопрос: как можно сделать так, что бы курсор мышки мог двигаться только вдоль этой прямой. Что бы у пользователя не было возможности ошибиться, выбирая исследуемую точку???
Mazai вне форума  
 
Непрочитано 27.08.2008, 11:38
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Привязать курсор не проблема - режим ОРТО и SNAPANG.

Но здесь принципиальная ошибка - нельзя в этом случае заставлять пользователя вводить именно точку, лежащую на прямой! Режимы и легко отключаются. Надо запрашивать не точку, а расстояние от известной точки до искомой. При этом может использоваться и функция getpoint с резиновой нитью, и SNAPANG (для облегчения), но из введенной точки надо использовать только координаты для вычисления расстояния, а у потом рассчитывать истинные координаты через polar. Это учитывает возможность неточного указания точек. Которое обязательно будет.

PS. Для 3D также потребуются и специальные функции для определения координат в пространстве с использованием векторов. Штатные-то предназначены для плоскости.
ShaggyDoc вне форума  
 
Непрочитано 29.08.2008, 21:44
#6
ceiba


 
Регистрация: 06.02.2008
Ярославль
Сообщений: 24


[quote=ShaggyDoc;280520]Привязать курсор не проблема - режим ОРТО и SNAPANG.

Вы извините, я не совсем не по теме, можно я спрошу?

Мне тоже надо было указать точку на линии/полилинии, затем еще и угол поворота для последующего текста вдоль объекта вычислить. И, если при линии команда "osnap" ловила эту точку (приблизительно, но этого достаточно для последующей вставки текста), то при полилинии я (очень малоопытный лиспист), помучив голову, взяла точку указания (cadr (entsel "..."")) и прошлась по массиву отрезков, составляющих полилинию. Нашла отрезок, к которому эта точка ближе всего, и вычислила упавший на него перпендикуляр. Это так? Этот отрезок (его вершины), повторюсь, нужен для вычисления угла для подписи.

Ну, и для единообразия, оставила и для линии вычисление перпеникуляра, оно в отдельной маленькой функции.

Дело в том, что, когда использовала тут же команду "osnap" с полилинией, а затем искала перебором отрезок, которому принадлежит точка, то (из-за точности?) отрезок не находился. Не попадала привязанная точка ни на один.

Так вот, этот мой алгоритм с перпендикуляром достоин существования, или эту точность можно легко и быстро поставить на место, и отрезок найдется? И я очередной трехколесный изобрела? Ответьте, пожалуйста.
ceiba вне форума  
 
Непрочитано 29.08.2008, 23:10
#7
Кулик Алексей aka kpblc
Moderator

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


ceiba, а если попробовать vlax-curve-getclosestpointto? Например, при построенной линии (отрезке, сплайне, 3Д-полилинии или обычной lightweightpolyline) можно проверить такой лисп:
Код:
[Выделить все]
(defun test (/ pline point)
  (vl-load-com)
  (if (and (= (type (setq pline (vl-catch-all-apply
                                  '(lambda () (ssget "_:S:E" '((0 . "*LINE"))))
                                  ) ;_ end of VL-CATCH-ALL-APPLY
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           (setq pline (vlax-ename->vla-object (ssname pline 0)))
           ) ;_ end of and
    (while
      (= (type (setq point (vl-catch-all-apply
                             '(lambda () (getpoint "\nУкажите точку <Отмена> : "))
                             ) ;_ end of VL-CATCH-ALL-APPLY
                     ) ;_ end of setq
               ) ;_ end of type
         'list
         ) ;_ end of =
       (foreach item (list (cons 1 point)
                           (cons 2 (vlax-curve-getclosestpointto pline point))
                           ) ;_ end of list
         (entmakex (list (cons 0 "POINT")
                         (cons 10 (cdr item))
                         (cons 62 (car item))
                         ) ;_ end of list
                   ) ;_ end of entmakex
         ) ;_ end of foreach
       (entmakex (list (cons 0 "LINE")
                       (cons 10 point)
                       (cons 11 (vlax-curve-getclosestpointto pline point))
                       (cons 62 3)
                       ) ;_ end of list
                 ) ;_ end of entmakex
       ) ;_ end of while
    ) ;_ end of if
  ) ;_ end of defun
Нужное выделено полужирным.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.08.2008, 07:58
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


[quote=ceiba;281545]
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Привязать курсор не проблема - режим ОРТО и SNAPANG.

Вы извините, я не совсем не по теме, можно я спрошу?

Мне тоже надо было указать точку на линии/полилинии, затем еще и угол поворота для последующего текста вдоль объекта вычислить. И, если при линии команда "osnap" ловила эту точку (приблизительно, но этого достаточно для последующей вставки текста), то при полилинии я (очень малоопытный лиспист), помучив голову, взяла точку указания (cadr (entsel "..."")) и прошлась по массиву отрезков, составляющих полилинию. Нашла отрезок, к которому эта точка ближе всего, и вычислила упавший на него перпендикуляр. Это так? Этот отрезок (его вершины), повторюсь, нужен для вычисления угла для подписи.

Ну, и для единообразия, оставила и для линии вычисление перпеникуляра, оно в отдельной маленькой функции.

Дело в том, что, когда использовала тут же команду "osnap" с полилинией, а затем искала перебором отрезок, которому принадлежит точка, то (из-за точности?) отрезок не находился. Не попадала привязанная точка ни на один.

Так вот, этот мой алгоритм с перпендикуляром достоин существования, или эту точность можно легко и быстро поставить на место, и отрезок найдется? И я очередной трехколесный изобрела? Ответьте, пожалуйста.
Вот функция, которую я использую для получения точки точно на линии

Код:
[Выделить все]
 
(defun ru-get-point-on-ent (msg
                            /
                            ent_selected
                            old_aperture
                            om
                            result
                           )
;;; Выбор точки на примитиве. Возвращает (list примитив  точка)
    ;|
 (ru-get-point-on-ent "Укажи точку на отрезке или полилинии")
 Command: (ru-get-point-on-ent "Укажи точку на отрезке или полилинии")
Укажи точку на отрезке или полилинии <Выход>: (<Entity name: 4008f2b0> (898.383 
270.931 0.0))
ВОЗВРАЩАЕТ ТОЧКУ В WCS!!!
|;
    (setq om           (getvar "OSMODE")
          old_aperture (getvar "aperture")
    ) ;_ end of setq
    (setvar "OSMODE" 512)
    (setvar "aperture" (getvar "pickbox"))
    (if (setq ent_selected
                 (ru-get-entsel-by-type
                     msg
                     "Это не ОТРЕЗОК и не ПОЛИЛИНИЯ"
                     (list "LINE" "LWPOLYLINE")
                     t
                 ) ;_ end of ru-get-entsel-by-type
        ) ;_ end of setq
        (setq result (list (car ent_selected)
                           (trans (osnap (trans (cadr ent_selected) 0 1) "_nea") 1 0)
                     ) ;_ end of list
        ) ;_ end of setq
    ) ;_ end of if
    (setvar "OSMODE" om)
    (setvar "aperture" old_aperture)
    result
)
Обратите внимание на выделение. Там весь "секрет". Функция ru-get-entsel-by-type из библиотеки, она делает то же, что и entsel, но только позволяет выбрать примитив только из заданного списка (в данном случае LINE, LWPOLYLINE). Можно заменить на entsel, но заботиться о выборе самостоятельно.

Получаем список - (примитив точка). По имени примитива с помощью специальной функции определяем точки начала и конца указанного сегмента. Имея три точные точки можно делать что угодно - хоть текст вдоль рисовать, хоть врезать в линию, хоть перпендикуляры строить
ShaggyDoc вне форума  
 
Непрочитано 30.08.2008, 11:16
#9
ceiba


 
Регистрация: 06.02.2008
Ярославль
Сообщений: 24


Кулик Алексей aka kpblc: ceiba, а если попробовать vlax-curve-getclosestpointto? Например, при построенной линии (отрезке, сплайне, 3Д-полилинии или обычной lightweightpolyline) можно проверить такой лисп:

Да, Алексей, точку находит, спасибо. Правда, я с ActivX пока еще не связывалась. И чтобы использовать этот код, надо разбираться с VLA-объектами. Обещаю в ближайшем будущем начать эти разборки именно с вашего примера Пока же мне надо уровень просто автолиспа своего поднять. Вот скажите, Вы эти строки прямо сейчас, с маху написали? Я же пока долго рожаю очевидные вещи.

Стеснительно, конечно, но могу выложить то, что у меня решает эту задачу. Подписывает коммуникации. Лежащие в наших шаблонных слоях (например, "_VODOPROVOD") - автоматом. В других - предлагает подписать текстом по желанию.

Мы решили, что использовать тип линии, содержащий буквы, очень неудобно. Потому как эти буквы могут получиться на пересечениях и на углах. И ломаные приходится править, разрывать, буквы опять невычислимо сдвигаются. Лучше, как в туши планшеты вычерчивают, ставить подпись там, где красиво.

Последующее возможное редактирование - другой вопрос, возможно, придумаю еще что-нибудь для прочного приаттачивания введенного текста к отрезку, посмотрим.
Вложения
Тип файла: lsp tmp.lsp (6.8 Кб, 74 просмотров)
ceiba вне форума  
 
Непрочитано 30.08.2008, 11:21
#10
ceiba


 
Регистрация: 06.02.2008
Ярославль
Сообщений: 24


ShaggyDoc, спасибо, а в какой библиотеке мне найти RU-GET-ENTSEL-BY-TYPE? RUCAD у меня не стоит. Его весь качать? Или отдельно где-то что-то лежит?
ceiba вне форума  
 
Непрочитано 30.08.2008, 15:59
#11
VVA

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


ceiba, Здесь лежит
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.08.2008, 20:06
#12
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от ceiba Посмотреть сообщение
ShaggyDoc, спасибо, а в какой библиотеке мне найти RU-GET-ENTSEL-BY-TYPE? RUCAD у меня не стоит. Его весь качать? Или отдельно где-то что-то лежит?
Не надо ради функций ничего качать. Тем более, если где-то и лежит, то верия 4-х летней давности.

Все LISP-функции ruCAD (эта и около тысячи других) приведены в книге "САПР на базе AutoCAD - как это делается". Там есть и все, что вас интересует - и типами линий (генерируемыми автоматически) и подписыванием вдоль линии или с врезкой в разрыв.
ShaggyDoc вне форума  
 
Непрочитано 30.08.2008, 20:50
#13
ceiba


 
Регистрация: 06.02.2008
Ярославль
Сообщений: 24


VVA, ShaggyDoc, спасибо! Лежащее забрала, разбираю; книгу приобрету обязательно, пока у меня на столе отличный "VisualLISP и секреты адаптации AuotCAD" 2001 года.
ceiba вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ввод третьей координаты

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Координаты области выделения Тим Боль Программирование 6 04.11.2007 16:52
Как перевести координаты Модели в координаты Листа? ===AAA=== Программирование 6 24.10.2007 22:09
Где хранятся координаты полки выноски ОТНОСИТЕЛЬНО ТЕКСТА? kp+ Программирование 2 31.07.2006 09:55
Динамический ввод или демонический ввод? TheBuTeK Динамические блоки 20 13.10.2005 09:36