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

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

LISP: как задать нормаль

Ответ
Поиск в этой теме
Непрочитано 08.06.2005, 14:33 #1
LISP: как задать нормаль
Torino
 
Штаб
Регистрация: 21.08.2003
Сообщений: 943

Есть объект А.
Есть отрезок Б.
Я хочу переориентировать объект А так, чтобы его нормаль совпадала с отрезком Б.
Хочу использовать функцию (vla-put-normal).
У этой функции в качестве аргумента выступает safe array, описывающий вектор нормали.
С отрезка А я снимаю координаты двух концевых точек pt1 и pt2.

Вопрос: как вычислить вектор нормали для фукнции (vla-put-normal), используя pt1 и pt2?
Просмотров: 8184
 
Непрочитано 08.06.2005, 15:48
#2
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Всегда чё-то так туго до меня доходит, но может быть
что-то вроде:

(setq B (vlax-ename->vla-object (car (entsel "\nSelect line\n")))
norm (vla-get-normal B)
val_norm (vlax-get B 'Normal))
(alert (vl-prin1-to-string val_norm))
(setq A (vlax-ename->vla-object (car (entsel"\nSelect object\n"))))
(setq norm2 (vla-get-normal A)
val_norm2 (vlax-get A 'Normal)))
(alert (vl-prin1-to-string val_norm2))
(vla-put-normal A norm)
(vla-update A)
(alert (vl-prin1-to-string (vlax-get A 'Normal)))

Только не забудь что объект потом нужно будет двигать
поскоку он будет улетать если не привязан крепко к линии

Happy computing

Fatty
fixo вне форума  
 
Непрочитано 08.06.2005, 16:17
#3
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>Torino
Коордитнаты нормального вектора - это косинусы угла между заданным направлением (pt1 и pt2) и соответствующей осью координат. Или вопрос как именно вычислить эти косинусы?
AY вне форума  
 
Автор темы   Непрочитано 08.06.2005, 16:49
#4
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


>>Fatty
Программа не пашет
На строчке (vla-put-normal A norm) выдает ошибку "Несовпадение типов" (интересно почему на русском?)

>>AY
Теперь понятно. Спасибо

Вообще я хочу сделать следущее:
На рис. 1 - исходная ситуация:
[ATTACH]1118234946.jpg[/ATTACH]
Torino вне форума  
 
Автор темы   Непрочитано 08.06.2005, 16:53
#5
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


На рис. 2 то, что я хочу получить в результате:
[ATTACH]1118235203.jpg[/ATTACH]
Torino вне форума  
 
Непрочитано 08.06.2005, 18:25
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Попробуй что-нибудь такое:
Код:
[Выделить все]
(defun demo (/ crc lin)
  (setq lin (vlax-ename->vla-object
              (car (entsel "\nВыбери отрезок (только): "))
            )
        crc (vlax-ename->vla-object
              (car (entsel "\nВыбери чё надо повернуть: "))
            )
  )
  (vla-put-Normal
    crc
    (vlax-3d-point
      (mapcar (function -)
              (vlax-safearray->list
                (vlax-variant-value (vla-get-StartPoint lin))
              )
              (vlax-safearray->list
                (vlax-variant-value (vla-get-EndPoint lin))
              )
      )
    )
  )
  (princ)
)
Имей ввиду, что для блока здесь переопределяется только нормаль, т.е., его местоположение может оказаться неожиданным.
Alaspher вне форума  
 
Непрочитано 08.06.2005, 18:35
#7
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Согласен, не досмотрел насчет ситуации
когда объект - регион

(if (not (vl-catch-all-error-p
(setq result (vl-catch-all-apply
(function (lambda ()
(vla-put-normal A norm)))))))
T
(vl-catch-all-error-message result))
> "ActiveX Server returned an error: Несовпадение типов"

И тут с регионом не пролазит:

(demo)> "ActiveX Server returned an error: Несовпадение типов"

Счас принесут пиво - будем думать...
fixo вне форума  
 
Непрочитано 08.06.2005, 19:17
#8
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Fatty
...И тут с регионом не пролазит:

(demo)> "ActiveX Server returned an error: Несовпадение типов"

Счас принесут пиво - будем думать...
А что тут думать - для региона Normal - RO, только - TransformBy
Alaspher вне форума  
 
Непрочитано 08.06.2005, 19:23
#9
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Невнимательно смотрел список свойств (дуйствительно Alaspher)
Полез уже было в дебри пришлось кропать свою функцию, чтобы
проверить свойство Normal для объекта Region (для нашего случая)
удивительно, но свойство не подлежит модификации
Видно пиво невовремя...

(defun check-prop-modify (obj prop)
(if (and (vlax-property-available-p obj prop)
(null (vlax-property-available-p obj prop T))
)

nil
T
)
)
TesT:
(my-check-prop-modify A "normal");->nil оба-на?

Похоже что maestro Alaspher is absolutely right
fixo вне форума  
 
Непрочитано 08.06.2005, 22:46
#10
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Чёй-то не могу отловить ашипку хотя и выравнивает вроде
но смещает нет времени после пива видно нужно транлировать
точки но кажись нуно в этом мняправлении...

(defun test#bad (/ )
(vl-load-com)
(setq adoc
(vla-get-activedocument
(vlax-get-acad-object)
)
appd (vla-get-application adoc)
)
(vla-startundomark adoc)
(if (and (setq b (vlax-ename->vla-object
(car (entsel "\nselect line\n"))
)
)
(setq a (vlax-ename->vla-object
(car (entsel "\nselect object\n"))
)
)
)
(progn

(setq p1 (vla-get-startpoint b)
po (trans (vlax-get b 'Startpoint) 1 0 t)
pd (vlax-get b 'Endpoint)
p2 (vla-get-endpoint b))
(vl-cmdf "ucs" "m" po)
(setq norm1 (vlax-get a "normal")
norm2 (vlax-get b "normal")
ang (- (angle norm2 norm1)))

(setq matx
(list
(list (cos ang) (- (sin ang)) 0 (car po))
(list (sin ang) (cos ang) 0 (cadr po))
(list 0 0 1 (caddr po))
(list 0 0 0 1)
)
)
(setq txm (vlax-tmatrix matx))
(not (vl-catch-all-error-p
(vl-catch-all-apply
(function (lambda ()(vla-transformby a txm))))))
(vla-update a)
(princ "Объект выровнен но перемещен! "))
(princ "Чёй-то глючит! "))
(vl-cmdf "ucs" "w")
(vla-zoomall acapp)
(vla-endundomark adoc)
(princ)
)
fixo вне форума  
 
Автор темы   Непрочитано 09.06.2005, 10:28
#11
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


>>Alaspher
Упс... Не пашет.
Опять "несовпадение типов" на (vla-put-normal).

>>Fatty
Что-то делает, а что - не понятно.
В результате получаем следущее:
[ATTACH]1118298511.jpg[/ATTACH]
Т.е. нормаль региона не совпадает с направлением отрезка.
Torino вне форума  
 
Непрочитано 09.06.2005, 10:48
#12
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Torino
>>Alaspher
Упс... Не пашет.
Опять "несовпадение типов" на (vla-put-normal).
По коссвенным признакам, я понял, что ты используешь регионы, но явно это не было заявлено. По нормали региона я отвечал чуть выше. Если случится сегодня время - сделаю.
Alaspher вне форума  
 
Непрочитано 09.06.2005, 10:48
#13
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Скинь мне на мыло этот кусок в виде DWG
[email protected]
мое мыло закончилось
это моего отпрыска

Fatty
fixo вне форума  
 
Автор темы   Непрочитано 09.06.2005, 11:37
#14
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


>>Alaspher
Да именно регион.

>>Fatty
Я лучше выложу этот файл сюда.
[ATTACH]1118302657.dwg[/ATTACH]
Torino вне форума  
 
Непрочитано 09.06.2005, 15:13
#15
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


> Torino
Посмотри, может этот набросок поможет решить твою задачу:
Код:
[Выделить все]
(defun demorot (/ c crc dlt lin mod n norm pn0 x1 x2 y1 y2 z1 z2)
  (setq lin  (vlax-ename->vla-object (car (entsel "\nВыбери отрезок (только): ")))
        crc  (vlax-ename->vla-object (car (entsel "\nВыбери регион, который надо повернуть: ")))
        pn0  (getpoint "\nУкажи точку вращения: ")
        dlt  (mapcar (function -)
                     (vlax-safearray->list (vlax-variant-value (vla-get-StartPoint lin)))
                     (vlax-safearray->list (vlax-variant-value (vla-get-EndPoint lin)))
             )
        mod  (sqrt (apply (function +) (mapcar (function *) dlt dlt)))
        x1   (/ (car dlt) mod)
        y1   (/ (cadr dlt) mod)
        z1   (/ (caddr dlt) mod)
        norm (vlax-safearray->list (vlax-variant-value (vla-get-Normal crc)))
        x2   (car norm)
        y2   (cadr norm)
        z2   (caddr norm)
        n    (list (- (* y1 z2) (* z1 y2)) (- (- (* x1 z2) (* z1 x2))) (- (* x1 y2) (* y1 x2)))
        c    (+ (* x1 x2) (* y1 y2) (* z1 z2))
  )
  (vla-Rotate3D
    crc
    (vlax-3d-point pn0)
    (vlax-3d-point (mapcar (function +) pn0 n))
    (- (acos c))
  )
)

(defun asin (val)
  (atan (/ val (sqrt (- 1 (* val val)))))
)

(defun acos (val)
  (- (/ pi 2) (asin val))
)
Alaspher вне форума  
 
Автор темы   Непрочитано 09.06.2005, 16:44
#16
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


>>Alaspher
Точно! Работает.
Спасибо!
Torino вне форума  
 
Непрочитано 09.06.2005, 18:36
#17
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


>>Alaspher

Блеск!!!
Сколько же времени надо грызть ЛИСП
чтобы создавать такие эталоны?

С уважением

Fatty

_________________________________________

Больше всего беззубый мечтает об орехах
fixo вне форума  
 
Непрочитано 09.06.2005, 18:58
#18
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


>>Torino

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

>>Fatty

Сам-то код достаточно простой, если помнить геометрию :wink: (мне пришлось пару раз в справочник глянуть). А грызть..., это да - долго грызу.
Alaspher вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: как задать нормаль

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