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

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

Вычислить угол поворота блока

Ответ
Поиск в этой теме
Непрочитано 22.02.2016, 12:44 #1
Вычислить угол поворота блока
mamuk
 
Сургут
Регистрация: 06.05.2010
Сообщений: 248

Доброго времени суток! есть lisp простановка пикетажа.
Пикеты (блок с атрибутом) вставляются через 100 единиц.
Проблема пикеты вставляются "вверх ногами" если направление трассы (полилинии линии и т.д.) задано например с лева на право.
Вопрос как вычислять угол поворота для пикета так что бы его не разворачивало вверх тормашками?
сам код
Код:
[Выделить все]
 
(defun c:трассировка (/ sn obj dst_obj dst_pk i koord_pk prz angle_obj att lst_att att_old att_new num lst_koord kol_ver list_ver)
(vl-load-com)
  (setq sn (getvar "osmode"))
  (setvar "osmode" 0)
(setq obj (car (entsel"\nВыбирите объект для трассировки (полилиния, линиия, сплайн, дуга, круг, 3D-полилиния):")))
 (setq lst_koord (vl-remove-if-not '(lambda(x)(=(car x) 10))(entget obj)))
  (setq kol_ver (cdr(assoc 90 (entget obj))))
  (setq i -1)
  (repeat kol_ver
  (setq i (1+  i))
  (setq koord_ver (cdr (nth i lst_koord)))
  (setq list_ver (append list_ver (list  koord_ver))))
(setq dst_obj (vlax-curve-getDistAtParam obj
		(vlax-curve-getEndParam obj)))
(setq dst_pk -100
      i  -1)
(while(< (+ dst_pk 100) dst_obj)
(progn
(setq i (1+ i))
(setq dst_pk (+ dst_pk 100))
(setq koord_pk (vlax-curve-getPointAtDist obj dst_pk))
(setq prz (vlax-curve-getFirstDeriv obj
	      (vlax-curve-getParamAtPoint obj koord_pk)))
(setq angle_obj (* (angle  '(0 0 0) prz) 57.29747))
(setvar "attreq" 0)
(command "_.insert" "пикет" koord_pk 1.0 1.0 angle_obj)
(setq att (entnext (entlast)))
(setq lst_att (entget att))  
(setq att_old (assoc 1 lst_att)) 
(setq num (strcat "ПК-" (itoa i)))
(setq att_new (cons 1 num))
(setq lst_att (subst att_new att_old lst_att))
(entmod lst_att)
(entupd (cdr (assoc -1 lst_att)))
) 
)
 (command "_.insert" "пикет" (car(reverse  list_ver)) 1.0 1.0 (angtos(angle (nth (- kol_ver 2) list_ver) (car(reverse  list_ver))) 0 3))
  (setq att (entnext (entlast)))
(setq lst_att (entget att))  
(setq att_old (assoc 1 lst_att)) 
(setq num (strcat "ПК-" (itoa (fix (/ dst_obj 100)))"+" (rtos (- dst_obj (* 100 (fix (/ dst_obj 100))))2 2)))
(setq att_new (cons 1 num))
(setq lst_att (subst att_new att_old lst_att))
(entmod lst_att)
(entupd (cdr (assoc -1 lst_att)))
  (setvar "osmode" sn)
   (princ "\nТрассировка завершена")
)
сделал простой тест когда неважно как задавались точки чтобы вычислялся нужный угол
Код:
[Выделить все]
 (defun c:md_test (/ pt1 pt2 pt3 srav an)
(setq pt1 (getpoint))
(setq pt2 (getpoint))
(setq srav (mapcar '>= pt1 pt2))
(setq an (angle pt1 pt2))
(setq pt3 (polar pt1 an (/ (distance pt1 pt2)2)))
(if (= T (equal  '(nil nil T) srav))
  (progn
    (command "_.text" pt3 "" (angtos an) "test")
)
  )
(if (= T (equal  '(T T T) srav))
  (progn
    (setq an (angle pt2 pt1))
    (command "_.text" pt3 "" (angtos an) "test")
)
  )
  (if (/= (angtos an) "90")
    (progn
  (if (= T (equal  '(T nil T) srav))
  (progn
    (setq an (angle pt2 pt1))
    (command "_.text" pt3 "" (angtos an) "test")
)
  )
  )
    )
  (if (= (angtos an) "90")
    (progn
      (command "_.text" pt3 "" (angtos an) "test")
      )
    )
(if (= T (equal  '(nil T T) srav))
  (progn
    (command "_.text" pt3 "" (angtos an) "test")
)
  )
    )
угол вычисляется, но это простой пример который мне удалось реализовать.
Но как быть углом поворота блока в первом коде?
Как узнать что блок находится на на определенном отрезке и вычислить для него необходимый угол поворота?
Просмотров: 4077
 
Непрочитано 22.02.2016, 13:00
#2
Кулик Алексей aka kpblc
Moderator

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


1. Вставляй блоки некомандными методами.
2. После вставки получай угол поворота (для DXF - кажется, группа 51; для ActiveX - свойство Rotation) и устанавливай его как надо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.02.2016, 13:37
#3
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
2. После вставки получай угол поворота (для DXF - кажется, группа 51; для ActiveX - свойство Rotation) и устанавливай его как надо.
в том и проблема что, нужно вычислить угол "как надо".
и во втором lisp-е у меня получилось его вычислить.
Но как узнать между какими вершинами вставился блок на полилинии чтобы применить второй lisp
mamuk вне форума  
 
Непрочитано 22.02.2016, 17:42
#4
VVA

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


Посмотри тему, может чего подберешь. rotate text to align line Там упоминается Talon от Asmi. Он есть здесь AsmiTools - сборник Lisp программ от Александра Смирнова
Еще когда-то сохранил в закромах код из интернета, особо не проверял
Код:
[Выделить все]
    (defun NormalAnglefoText (ang)
    ;;  Argument: angle in radians  
    ;;  Returns a text angle in radians, flops text at >90 and <270
      (setq ang (NormalAngle ang))
      (NormalAngle
      (if (and (> ang (* 0.5 pi)) (< ang (* 1.502 pi)))
        (+ ang pi)
        ang
      ) ;_ end of if
      )
    ) ;_ end of defun

(defun NormalAngle (a)
;-------------------------------------------
;; Argument: angle in radians, any number including negative.
;; Returns: normalized angle in radians between zero and (* pi 2)
  (if (numberp a)
    (angtof (angtos a 0 14) 0))
)
----- добавлено через ~6 мин. -----
Цитата:
Сообщение от mamuk Посмотреть сообщение
Но как узнать между какими вершинами вставился блок на полилинии чтобы применить второй lisp
vlax-curve-getParamAtPoint - Параметр полилинии. Целая часть - номер вершины, начиная с 0
Как указать необходимые участки полилинии и Find segments of polyline
Зная параметр, узнать координаты точки - vlax-curve-getPointAtParam
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.02.2016, 18:08
#5
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


спасибо!! посмотрю!!!!!!
mamuk вне форума  
 
Непрочитано 22.02.2016, 18:16
#6
Кулик Алексей aka kpblc
Moderator

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


По-моему, будет проще использовать vlax-curve-getpointatdist. Но это уже на вкус и цвет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.02.2016, 20:59
#7
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Спасибо!! ваши советы помогли! теперь угол нормально вычисляется! в не зависимости от направления!
mamuk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вычислить угол поворота блока

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
В определении блока некорректно указывается устройство печати hwd AutoCAD 8 25.12.2012 16:06
Угол поворота текста sqr(max) Программирование 2 04.07.2007 10:33
На заметку программистам ShaggyDoc Программирование 48 13.06.2007 22:44
Угол поворота Viewport plaz AutoCAD 15 05.12.2006 02:27