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

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

LISP. Придание примитивам направление вертикально или горизонтально.

Ответ
Поиск в этой теме
Непрочитано 20.10.2011, 16:43 #1
LISP. Придание примитивам направление вертикально или горизонтально.
Pavel_GP
 
Инженер-гидрограф
 
г.г. Ленинград
Регистрация: 15.09.2011
Сообщений: 170

Здравствуйте.
Подскажите плз как придать направление группе примитивов (в данном случае отрезки) вертикально или горизонтально в коде.
Пример: Есть Отрезки, которые направлены в разные стороны. Необходимо их выбрать и чтоб их направление было строго вертикально или горизонтально. Чтобы это не делать с каждым отрезком отдельно, вычисляя его угол отклонения.

Спс. Жду совета.
Просмотров: 2002
 
Непрочитано 20.10.2011, 16:58
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Пример в студию и опиши как следует что делать с пограничными случаями (например отрезок под 45%).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 20.10.2011, 17:11
#3
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Пример файла.
Белый - как есть
Красный - как должно быть
Вложения
Тип файла: dwg
DWG 2004
ACAD-Чертеж1.dwg (101.0 Кб, 413 просмотров)
Pavel_GP вне форума  
 
Непрочитано 20.10.2011, 17:12
1 | #4
semvb

Инженер-технолог
 
Регистрация: 18.11.2003
Мурманск
Сообщений: 180


Не помню где брал, Спасибо АВТОРУ!
Код:
[Выделить все]
 ;;----------------------------------------------------
;;  Программа для выравнивания отрезков по осям X и Y
;;  Если отрезки не будут лежать в плоскости МСК
;;  результат работы не определен.
;;  Автор Александр Ривилис.
;;----------------------------------------------------
(defun C:L_ALIGN_XY ( / ss en e p1 p2 i n dir d dr x y l dl)
    (setvar "CMDECHO" 0)
    (if (null L_ALIGN_XY_delta_ang) (progn
       (setq L_ALIGN_XY_delta_ang 1.0)
    )) ;; (if (progn
    (setq d (getreal
      (strcat "\nМаксимальный угол отклонения от оси в градусах <"
              (rtos L_ALIGN_XY_delta_ang 2 3) ">: ")))
    (if d (setq L_ALIGN_XY_delta_ang (abs d)))
    (setq d (* PI (/ L_ALIGN_XY_delta_ang 180.0)))
    (princ "\nВыберите отрезки для выравнивания: ")
    (cond
      ((setq ss (ssget '((0 . "LINE"))))
        (setq i 0 n (sslength ss))
        (while (< i n)
          (setq e (entget (ssname ss i)))
          (setq p1 (cdr (assoc 10 e)) p2 (cdr (assoc 11 e)))
          (setq l (distance p1 p2)) ;; Длина отрезка
          (setq dir (angle p1 p2)) ;; Находим угол с осью X
          ;; Приводим угол в диапазон 0...2*PI
          (if (< dir 0.0) (setq dir (+ (* 2.0 PI) dir)))
          (cond
            ;; Отрезок условно параллелен оси X
            ((or (equal dir 0.0 d) (equal dir PI d) (equal dir (* 2.0 PI) d))
              (setq y (* 0.5 (+ (cadr p1) (cadr p2))))
              (setq p1 (list (car p1) y (caddr p1)))
              (setq p2 (list (car p2) y (caddr p2)))
              (setq dl (* 0.5 (- l (distance p1 p2))))
              ;; Восстанавливаем длину отрезка
              (setq p1 (polar p1 (angle p2 p1) dl))
              (setq p2 (polar p2 (angle p1 p2) dl))
              (setq e (subst (cons 10 p1) (assoc 10 e) e))
              (setq e (subst (cons 11 p2) (assoc 11 e) e))
              (entmod e)
            )
            ;; Отрезок условно параллелен оси Y
            ((or (equal dir (* PI 0.5) d) (equal dir (* PI 1.5) d))
              (setq x (* 0.5 (+ (car p1) (car p2))))
              (setq p1 (list x (cadr p1) (caddr p1)))
              (setq p2 (list x (cadr p2) (caddr p2)))
              (setq dl (* 0.5 (- l (distance p1 p2))))
              ;; Восстанавливаем длину отрезка
              (setq p1 (polar p1 (angle p2 p1) dl))
              (setq p2 (polar p2 (angle p1 p2) dl))
              (setq e (subst (cons 10 p1) (assoc 10 e) e))
              (setq e (subst (cons 11 p2) (assoc 11 e) e))
              (entmod e)
            )
          ) ;; (cond
          (setq i (1+ i))
        ) ;; endof (while
      )
      (T
       (princ "\nНичего не выбрано, или выбрано что-то не то!")
      )
    ) ;; (cond
    (princ)
)
semvb вне форума  
 
Автор темы   Непрочитано 21.10.2011, 08:54
#5
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Спс. код отличный.
Поправите код плз. Необходимо чтоб разворот отрезков был не в середине( как по коду), а в начальной точке отрезка.
Пример прикладываю:
Зеленый - исходный
Синий - по коду
Красный - как нужно

ПыСы. Предполагаю, что необходимо добавить смещение отрезка на величину равную половине расстоянию между начальной точки и конечной спроецированной перпендикулярно к оси первой точки. Как-то так =)
Вложения
Тип файла: dwg
DWG 2004
ACAD-Чертеж1.dwg (102.9 Кб, 408 просмотров)

Последний раз редактировалось Pavel_GP, 24.10.2011 в 09:59. Причина: Вопрос все актуален.
Pavel_GP вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Придание примитивам направление вертикально или горизонтально.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как ориентировать профнастил в заборе, вертикально или горизонтально? Сазоныч Конструкции зданий и сооружений 7 09.04.2011 01:44
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33