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

Вернуться   Форум 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)
)
Просмотров: 2773
 
Непрочитано 05.05.2020, 23:39
#2
VVA

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


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,588


Динамический ввод, там можно вводить угол и длину отрезка.
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