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

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

Как можно повернуть следующий отрезок трассы на заданный угол относительно предыдущего отрезка?

Ответ
Поиск в этой теме
Непрочитано 05.05.2020, 16:46 #1
Как можно повернуть следующий отрезок трассы на заданный угол относительно предыдущего отрезка?
kirikov8080
 
Регистрация: 21.12.2010
Сообщений: 9

Доброго всем. Регулярно проектирую трассы водопроводов. Вопрос к зубрам форума: Как можно повернуть следующий отрезок трассы на угол (30,45,60,90 градусов) относительно предыдущего отрезка? Сейчас приходиться копировать последний отрезок, поворачивать на нужный угол и пристыковывать к предыдущему. Можно ли макросом или лиспом ускорить процесс: при отрисовке следующего отрезка, выбирать предыдущий как базовый и задавать нужный угол поворота? В интернете нашел лисп, но он работает странно: то поворачивает на нужный угол, то нет:
https://forums.autodesk.com/t5/visua...t/true#M328756

p.s. Если на форуме уже выкладывали такой макрос или лисп - ткните, пожалуйста, не нашел.

----- добавлено через ~1 ч. -----
Сам лисп:
Код:
[Выделить все]
 
(defun c:alin ( / *adoc* pea pt opt ptt el esel ent pent ang difang nang ptw ss )

  (vl-load-com)
  (setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))

  (setq pt (getpoint "\nSpecify first point : "))
  (while
    (and
      pt
      (setq opt (cons pt opt))
      (not (initget 128))
      (setq ptt (getpoint pt "\nSpecify next point or - F8 for orthomode [Angle line/Undo] : "))
      (setq opt (cons ptt opt))
    )
    (cond
      ( (eq (type ptt) 'list)
        (vla-startundomark *adoc*)
        (command "_.LINE" "_non" pt "_non" ptt "")
        (setq el (cons (entlast) el))
        (setvar 'orthomode 0)
        (setq pt ptt)
        (vla-endundomark *adoc*)
      )
      ( (or (wcmatch ptt "a*") (wcmatch ptt "A*"))
        (vla-startundomark *adoc*)
        (setq esel (entsel "\nPick target curve to obtain its angle"))
        (setq ent (car esel))
        (setq pent (vlax-curve-getclosestpointto ent (cadr esel)))
        (setq ang (angle '(0.0 0.0) (vlax-curve-getfirstderiv ent (vlax-curve-getparamatpoint ent pent))))
        (setq difang (cvunit (getreal "\nSpecify angle to picked curve in decimal degrees : ") "degree" "radian"))
        (setq nang (cvunit (- ang difang) "radian" "degree"))
        (setq ptw (trans pt 1 0))
        (command "_.UCS" "_W")
        (command "_.UCS" "_Z" nang)
        (setvar 'orthomode 1)
        (command "_.LINE" "_non" (trans ptw 0 1) "\\")
        (while (> (getvar 'cmdactive) 0) (command ""))
        (setq el (cons (entlast) el))
        (setvar 'orthomode 0)
        (setq ptw (trans (getvar 'lastpoint) 1 0))
        (command "_.UCS" "_P")
        (command "_.UCS" "_P")
        (setq pt (trans ptw 0 1))
        (vla-endundomark *adoc*)
      )
      ( (or (wcmatch ptt "u*") (wcmatch ptt "U*"))
        (if (eq (length opt) 2) 
          (setq pt nil)
          (progn 
            (if (equal (cadr opt) (cadddr opt) 1e-8) 
              (setq opt (cddddr opt)) 
              (setq opt (cddr opt))
            )
            (if (null opt)
              (setq pt nil)
              (progn
                (command "_.UNDO" "") 
                (setq el (cdr el)) 
                (setq pt (cadr opt))
              )
            )
          )
        )
      )
    )
  )
  (if (not (null el))
    (progn
      (setq ss (ssadd))
      (foreach l el
        (ssadd l ss)
      )
      (setq pea (getvar 'peditaccept))
      (setvar 'peditaccept 1)
      (command "_.PEDIT" "_M" ss "" "_J")
      (while (> (getvar 'cmdactive) 0) (command ""))
      (setvar 'peditaccept pea)
    )
  )
  (princ)
)
Просмотров: 2797
 
Непрочитано 05.05.2020, 23:39
#2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


kirikov8080, А чем штатное полярное отслеживание (F10) с соответствующими настройками не устраивает?
Миниатюры
Нажмите на изображение для увеличения
Название: pline.png
Просмотров: 36
Размер:	76.3 Кб
ID:	225843  Нажмите на изображение для увеличения
Название: pline2.png
Просмотров: 35
Размер:	5.6 Кб
ID:	225844  
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 05.05.2020 в 23:44.
VVA вне форума  
 
Автор темы   Непрочитано 06.05.2020, 20:37
#3
kirikov8080


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


Спасибо за такое изящное решение. А для углов от 1 до 90 град. такого же решения нет? Бывает, что трассу под стандартными углами проложить невозможно и приходиться решать вопрос гнутыми вставками.
kirikov8080 вне форума  
 
Непрочитано 08.05.2020, 07:41
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Динамический ввод, там можно вводить угол и длину отрезка.
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как можно повернуть следующий отрезок трассы на заданный угол относительно предыдущего отрезка?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот МСК на конкретно заданный угол Игорь Ка AutoCAD 13 18.10.2022 18:18
Как повернуть объект в 3D пространстве относительно произвольной оси? МишаИнженер AutoCAD 15 05.05.2020 09:32
Можно ли повернуть только часть блока? Малявка AutoCAD 4 26.05.2011 15:45
Подскажите каким образом можно все слои перекрасить в заданный цвет? 25segments Программирование 3 12.05.2010 12:35
как можно узнать угол поворота одного примитива оносительно другого? Nelebog AutoCAD 19 11.08.2009 20:26