Тема: Как построить линию с заданным уклоном в 2D?

Уважаемые знатоки LISP-приложений!
Нижайше обращаюсь к вам с ничтожнейшей просьбой.
Помогите, пожалуйста LISP’ом для построения линии с заданным уклоном с такими условиями:
1. Уклон должен быть в десятичной дроби (или же в промилле).
2. Отношение дельта h к длине L должно быть равно 5h/L, то есть длина L при вычислении должна быть в пять раз меньшей, чем требуемая по введенным данным.
3. Введенная длина отрезка должна соответствовать не фактической его длине, а той самой (1/5)L. То есть ввод длины – это длина не гипотенузы, а большего катета, деленной на пять, прямоугольного треугольника.
Cам я в синтаксисе написания lisp-программ понимаю плохо, но на мой взгляд реализовать это можно путем поворота UCS на угол, вычисляемый через отношение меньшего катета к большему, деленное на пять. И в связи с этим неплохо было бы уточнение направления построения: влево или вправо, т.е. угол – положительный или отрицательный. И потом – возврат к World UCS.
И, «пользуясь случаем» просил бы написать программку для вычисления такого уклона линии «by pick» и возможностью вставки вычисленного значения в чертеж (или же замены существующего dtext на это значение).
Благодарность тех, кому приходится строить продольные профили коммуникаций, гарантируется. Спасибо заранее. Особенно за то, что дочитали это сообщение до конца.

Re: Как построить линию с заданным уклоном в 2D?

путем поворота UCS на угол, вычисляемый через отношение

И потом – возврат к World UCS.

Вот это точно делать не надо. Если начальная точка отрезка известна, то зная угол и длину можно найти конечную точку через фунцию (polar).
Из пунктов 2 и 3 ничего не понял, наверно потому что не строю профили коммуникаций :))

Re: Как построить линию с заданным уклоном в 2D?

Посмотри здесь
https://www.caduser.ru/forum/topic20637.html

Re: Как построить линию с заданным уклоном в 2D?

Вопросы сразу и в лоб :)
1. Указание длины производить мышой или руками? Или и тем, и другим? При указании длины, я так полагаю, надо обращаться к "горизонтальной проекции" указанной длины?
2. Это вот "соотношение" задано жестко раз и навсегда? Или возможны варианты?
3. По п.1 - например, надо сделать отрезок падения высоты на 10 мм на 1000 мм длины. Чего будет вводиться (коммуникаций тоже пока не строил)?
4. Направление построения (вправо/влево/вверх/вниз) будет вводиться пользователем, или прога сама должна придумывать?
5. Вычисление "уклона By pick" - чего здесь имелось в виду? Нечто типа такого, наверное?

(defun c:ang-by-pick (/ ent ins_point text_height mtext_obj)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (setq
    text_height
     (vla-get-height (vla-get-activetextstyle *kpblc-activedoc*))
    ) ;_ end of setq
  (if (= text_height 0)
    (if    (not (setq text_height (getreal "\nВведите высоту текста <2.5> : ")))
      (setq text_text_height 2.5)
      ) ;_ end of if
    ) ;_ end of if
  (while (setq ent (entsel "\nУкажите отрезок <Отмена> : "))
    (if    (= (cdr (assoc 0 (entget (car ent)))) "LINE")
      (progn
    (setq ins_point
           (getpoint "\nУкажите точку вставки текста <Прекратить> : ")
          ) ;_ end of setq
    (if ins_point
      (setq    ent      (vlax-ename->vla-object (car ent))
        mtext_obj (vla-addmtext
                (_kpblc-get-active-space-obj)
                (vlax-3d-point ins_point)
                50
                (strcat
                  "L(full) = "
                  (rtos (vla-get-length ent) 2 3)
                  "\n"
                  "L(h) = "
                  (rtos
                (* (vla-get-length ent) (cos (vla-get-angle ent)))
                2
                3
                ) ;_ end of rtos
                  "\n"
                  "H = "
                  (rtos
                (* (vla-get-length ent) (sin (vla-get-angle ent)))
                2
                3
                ) ;_ end of rtos
                  ) ;_ end of strcat
                ) ;_ end of vla-AddMText
        ) ;_ end of setq
      ) ;_ end of if
    ) ;_ end of progn
      (progn
    (princ "\nНе отрезки не обрабатываются!")
    ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of while
  ) ;_ end of defun
(defun _kpblc-get-active-space-obj ()
  (if (and (zerop (vla-get-activespace *kpblc-activedoc*))
       (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
       ) ;_ end of and
    (vla-get-paperspace *kpblc-activedoc*)
    (vla-get-modelspace *kpblc-activedoc*)
    ) ;_ end of if
  ) ;_ end of defun

Re: Как построить линию с заданным уклоном в 2D?

Спасибо всем, кто откликнулся!
to Valery Brelovsky: ссылка на lisp от Runa не подходит по причине построения в 3D и задания нормального уклона (отношение вертикали к горизонтали 1:1, а не 5:1). Переделать текст проги под свои нужды не могу по причине своей вышеупомянутой безграмотности :)
to kpblc: (без грубой лести, со всей серьезностью). Скромно надеялся на Ваше участие в обсуждении своей проблемы, т.к. имел опыт работы с Вашими программами.
Суть задачи такова:
Профили инженерных коммуникаций (трубопроводов систем водопровода, канализации, теплотрассы) строятся в разных масштабах: вертикальном – 1:100 и горизонтальном 1:500, что соответствует масштабу генплана 1:500. Иногда встречается масштаб 1:1000, но очень редко и не вижу особого смысла добавлять в lisp другое соотношение сторон кроме 5:1. Это ответ на Ваш второй вопрос.
По поводу первого: задание длины может быть как произвольным (мышью) для нахождения пересечения с некой вертикальной линией, так и точным, когда известна длина этой самой горизонтальной проекции.
По п.3: Падение высоты на 10 мм на 1000 мм длины означает уклон (нормальный) 0,01 или же 0,05 для построения в нашем случае. Фактически, длина горизонтальной проекции при построении должна быть в 5 раз меньше вводимой. Для Вашего примера: вводится уклон 0,01, но строится гипотенуза по соотношению 10 мм высоты на 200 мм длины.
По п.4: Направление построения может быть влево или вправо от первой точки. Может быть стоит ввести условие типа: «Направление +X или –X » с выбором необходимого условия из падающего меню? В первом сообщении я упоминал об этом (поворот UCS по часовой или против на вычисленный угол).
Предлагаю такой алгоритм (не судите строго):
1. Ввод значения нужного уклона (нормального – 1:1 !).
2. Запрос направления построения: +Х или –Х (влево или вправо).
3. Поворот UCS на угол из соотношения: меньший катет к большему, деленное на 5. Плюс включение режима Ortho.
4. Запрос координат первой точки и т.д. как в стандартной команде LINE, но при вводе вручную числового значения, вводится именно горизонтальная проекция. То есть при вводе значения большего катета строится гипотенуза с большим катетом в 5 раз меньше введенного.
5. Возврат к нормальной UCS. Не все же линии на чертеже с уклоном :) .
По поводу второй программы. Ваше предложение я рассмотрел и прошу принять во внимание мои замечания. Меня конкретно интересовал этот самый уклон при Мг = 1:500.
А Ваша программа вычисляет и вставляет все значения кроме этого :) и при Мв = 1:100, Мг = 1:100, т.е. 1:1. С меня было бы достаточно получить или dtext с этим значением как новый примитив, или замену значения существующего текста на это (как при lisp-команде копировании значения текста). На этом форуме (или не на этом?) была выложена такая программка (текст ниже). К сожалению, не знаю авторства, но кажый раз испытываю чувство благодарности и уважения к автору при ее использовании. Она вычисляет нужный уклон линии, с появлением результата в командной строке. Я изменил одну формулу под свой случай (5:1) –  (rtos (* (/ (cadr dlt) (car dlt)) 0.2)) . Надеюсь, автор не обидится. Если бы можно было вычисленное значение брать по модулю, с добавлением нуля перед запятой и занесением значения в dtext или буфер, цены бы ей вообще не было.
(defun C:Slope (/ dlt ln pt err_obj err_mes)
  (if (not
   (vl-catch-all-error-p
     (setq   err_obj   (VL-CATCH-ALL-APPLY
           (function
             (lambda ()
               (vla-getentity
            (vla-get-utility
              (vla-get-ActiveDocument
                (vlax-get-acad-object)
              )
            )
            'ln
            'pt
            "Select line:"
               )
             )
           )
         )
     )
   )
      )
    (progn
      (if (vlax-property-available-p ln 'delta nil)
   (progn
     (setq dlt (vlax-get ln 'delta))
     (princ (strcat "\nSlope: "
          (rtos (* (/ (cadr dlt) (car dlt)) 0.2))
       )
     )
   )
   (setq err_mes "У этой хрени дельты нет!")
      )
    )
    (setq err_mes (VL-CATCH-ALL-ERROR-MESSAGE err_obj))
  )
  (if err_mes
    (princ err_mes)
  )
  (princ)
)
С нетерпением жду Вашего ответа. В моей просьбе прошу не отказать :) Прошу прощение за свои бестолковые объяснения. И еще, укажите, please, имя команды в lisp, чтобы я понял как ее стартовать.

Re: Как построить линию с заданным уклоном в 2D?

Попробуй такую редакцию:

(vl-load-com)
(defun slope_list (/ abs_ukl dlt err_mes err_obj ln txt_ukl ukl)
(if (not
(vl-catch-all-error-p
(setq err_obj (vl-catch-all-apply
(function
(lambda ()
(vla-getentity
(vla-get-utility
(vla-get-activedocument
(vlax-get-acad-object)
)
)
'ln
'pt
"Select line:"
)
)
)
)
)
)
)
(progn
(if (vlax-property-available-p ln 'delta nil)
(progn
(setq dlt (vlax-get ln 'delta)
      ukl (* (/ (cadr dlt) (car dlt)) 0.2)
      abs_ukl (abs (* (/ (cadr dlt) (car dlt)) 0.2))
      txt_ukl (vl-string-subst "0." "." (rtos abs_ukl))
)
)
(setq err_mes "У этой хрени дельты нет!")
)
)
(setq err_mes (vl-catch-all-error-message err_obj))
)
(if err_mes
(princ err_mes)
)
err_mes
(list ukl abs_ukl txt_ukl)
)
(defun C:test ()
(setq line_data (slope_list))
(print (car line_data))
(print (car line_data))
(alert (caddr line_data))
(princ)
  )

~'J'~

Re: Как построить линию с заданным уклоном в 2D?

Вот еще. Чисто по тригонометрии все получается прекрасно. Кто бы мне помог это оформить в программку?
i – требуемый уклон (1:100) – вводимое значение,
с – длина наклонной линии,
b – «требуемая длина» (1:100) – горизонтальная проекция с – вводимое значение,
alfa - угол наклона линии c к ее горизонтальной проекции b при Мb 1:100
i’ – уклон при построении для Мb 1:500,
c’ – длина построенной линии при Мb 1:500
alfa’ – вычисляемый угол поворота UCS (угол наклона линии c’ к ее горизонтальной проекции b’ при М 1:500)
Итого, имеем:
   угол поворота UCS через уклон i:                  alfa’ = arctg 5i
   длина для построения с’ через ввод b:           c’ = b / (5 * cos alfa’)
В Excel:
alfa  =ГРАДУСЫ(ATAN(5*i))
c’    =b’/(5*COS(ATAN(5*i)))
to Олег(jr.) (2005-12-08 17:14:25):
Благодарю за поддержку. К сожалению, Вы не совсем меня поняли. Мне нужно появление результата уклона не в окне сообщения  Acad Message, а созданном новом dtext или же в буфере обмена с последующей вставкой в существующий dtext. Разумеется, порадовал модуль уклона и ноль перед запятой (которых временами бывает даже два!). Пока буду пользоваться Вашей программой. И еще, а можно ли зашить в прогу вычисление этого уклона с precision (округлением) до 0,0000 вне зависимости от значения, которое стоит в Format > Units… ?

Re: Как построить линию с заданным уклоном в 2D?

https://www.caduser.ru/forum/topic18252.html

Re: Как построить линию с заданным уклоном в 2D?

Так, есть предложение прислать или выложить хоть на webfile файлик с соответствующими обозначениями и графикой. Тогда под это дело будет проще и быстрее сделать.
Честно говоря (если действительно жестко установить соотношение 1:5), не очень понял - что же в результате (кроме значения уклона мм / 5 мм) вводится - горизонтальная проекция или наклонная линия (потому как если действительно поворачивать USC, то будет вводиться наклонная длина)? Можно попробовать нечто типа такого (построение только слева направо, проверялось в пространстве модели, вид сверху, мировая система координат):

(defun slope (/               start_point    end_point
          high_decr                   hor_length
          text_height      text_high_decr_obj
          text_len_obj     text_hor_len_obj
          )
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (setq    text_height
     (vla-get-height (vla-get-activetextstyle *kpblc-activedoc*))
    ) ;_ end of setq
  (if (equal text_height 0.0 0.1)
    (progn
      (setq text_height
         (getreal
           "\nВведите высоту выводимого программно текста <2.5> : "
           ) ;_ end of getreal
        ) ;_ end of setq
      (if (not text_height)
    (setq text_height 2.5)
    ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  (setq    start_point
     (getpoint "\nУкажите точку начала построений <(0.0,0.0)> : ")
    ) ;_ end of setq
  (if (not start_point)
    (setq start_point '(0.0 0.0 0.0))
    ) ;_ end of if
  (while (setq high_decr (getreal "\nВведите падение высоты <Отмена> : "))
    (vla-startundomark *kpblc-activedoc*)
    (if    (setq hor_length
           (getdist    start_point
            "\nУкажите горизонтальную проекцию отрезка <Отмена > : "
            ) ;_ end of getdist
          ) ;_ end of setq
      (progn
    (setq end_point    (list (+ (car start_point) hor_length)
                  (- (cadr start_point) high_decr)
                  (caddr start_point)
                  ) ;_ end of list
          ) ;_ end of setq
    (entmake (list (cons 0 "LINE")
               (cons 10 start_point)
               (cons 11 end_point)
               ) ;_ end of list
         ) ;_ end of entmake
    (setq start_point end_point)
    (setq text_high_decr_obj (vla-addtext
                   (_kpblc-get-active-space-obj)
                   (if (< (abs high_decr) 1)
                     (if (>= high_decr 0)
                       (strcat
                     "0."
                     (vl-string-left-trim
                       "0."
                       (rtos high_decr 2 16)
                       ) ;_ end of vl-string-left-trim
                     ) ;_ end of strcat
                       (strcat
                     "-0."
                     (vl-string-left-trim
                       "-0."
                       (rtos high_decr 2 16)
                       ) ;_ end of vl-string-left-trim
                     ) ;_ end of strcat
                       ) ;_ end of if
                     (rtos high_decr 2 16)
                     ) ;_ end of if
                   (vlax-3d-point
                     (getpoint
                       "\nУкажите точку вставки значения падения высоты : "
                       ) ;_ end of getpoint
                     ) ;_ end of vlax-3d-point
                   text_height
                   ) ;_ end of vla-addtext
          text_hor_len_obj     (vla-addtext
                   (_kpblc-get-active-space-obj)
                   (rtos (* 5 hor_length) 2 16)
                   (vlax-3d-point
                     (getpoint
                       "\nУкажите точку вставки значения длины горизонтальной проекции : "
                       ) ;_ end of getpoint
                     ) ;_ end of vlax-3d-point
                   text_height
                   ) ;_ end of vla-AddText
          text_len_obj     (vla-addtext
                   (_kpblc-get-active-space-obj)
                   (vl-string-trim
                     "0"
                     (rtos
                       (sqrt (+ (^ (* 5 hor_length) 2) (^ high_decr 2)))
                       2
                       16
                       ) ;_ end of rtos
                     ) ;_ end of vl-string-trim
                   (vlax-3d-point
                     (getpoint
                       "\nУкажите точку вставки значения длины наклонной линии : "
                       ) ;_ end of getpoint
                     ) ;_ end of vlax-3d-point
                   text_height
                   ) ;_ end of vla-addtext
          ) ;_ end of setq
    ) ;_ end of progn
      ) ;_ end of if
    (vla-endundomark *kpblc-activedoc*)
    ) ;_ end of while
  (princ)
  ) ;_ end of defun
(defun ^ (value int / result)
  (setq result 1)
  (repeat int
    (setq result (* result value))
    ) ;_ end of repeat
  ) ;_ end of defun
(defun _kpblc-get-active-space-obj ()
  (if (and (zerop (vla-get-activespace *kpblc-activedoc*))
       (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
       ) ;_ end of and
    (vla-get-paperspace *kpblc-activedoc*)
    (vla-get-modelspace *kpblc-activedoc*)
    ) ;_ end of if
  ) ;_ end of defun

Вызов, ессно, (slope)

Re: Как построить линию с заданным уклоном в 2D?

> kpblc
Глянь в хелпе функцию
expt

Re: Как построить линию с заданным уклоном в 2D?

> Евгений Елпанов
thnx, долго искал, не нашел. Написал свое. Мало знаю, однако...

Re: Как построить линию с заданным уклоном в 2D?

Тогда код можно немного поменять:

(defun slope (/           start_point  end_point
        high_decr             hor_length
        text_height      text_high_decr_obj
        text_len_obj     text_hor_len_obj
        )
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (setq  text_height
   (vla-get-height (vla-get-activetextstyle *kpblc-activedoc*))
  ) ;_ end of setq
  (if (equal text_height 0.0 0.1)
    (progn
      (setq text_height
       (getreal
         "\nВведите высоту выводимого программно текста <2.5> : "
         ) ;_ end of getreal
      ) ;_ end of setq
      (if (not text_height)
  (setq text_height 2.5)
  ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  (setq  start_point
   (getpoint "\nУкажите точку начала построений <(0.0,0.0)> : ")
  ) ;_ end of setq
  (if (not start_point)
    (setq start_point '(0.0 0.0 0.0))
    ) ;_ end of if
  (while (setq high_decr (getreal "\nВведите падение высоты <Отмена> : "))
    (vla-startundomark *kpblc-activedoc*)
    (if  (setq hor_length
         (getdist  start_point
      "\nУкажите горизонтальную проекцию отрезка <Отмена > : "
      ) ;_ end of getdist
        ) ;_ end of setq
      (progn
  (setq end_point  (list (+ (car start_point) hor_length)
            (- (cadr start_point) high_decr)
            (caddr start_point)
            ) ;_ end of list
        ) ;_ end of setq
  (entmake (list (cons 0 "LINE")
           (cons 10 start_point)
           (cons 11 end_point)
           ) ;_ end of list
     ) ;_ end of entmake
  (setq start_point end_point)
  (setq text_high_decr_obj (vla-addtext
           (_kpblc-get-active-space-obj)
           (if (< (abs high_decr) 1)
             (if (>= high_decr 0)
               (strcat
           "0."
           (vl-string-left-trim
             "0."
             (rtos high_decr 2 16)
             ) ;_ end of vl-string-left-trim
           ) ;_ end of strcat
               (strcat
           "-0."
           (vl-string-left-trim
             "-0."
             (rtos high_decr 2 16)
             ) ;_ end of vl-string-left-trim
           ) ;_ end of strcat
               ) ;_ end of if
             (rtos high_decr 2 16)
             ) ;_ end of if
           (vlax-3d-point
             (getpoint
               "\nУкажите точку вставки значения падения высоты : "
               ) ;_ end of getpoint
             ) ;_ end of vlax-3d-point
           text_height
           ) ;_ end of vla-addtext
        text_hor_len_obj   (vla-addtext
           (_kpblc-get-active-space-obj)
           (rtos (* 5 hor_length) 2 16)
           (vlax-3d-point
             (getpoint
               "\nУкажите точку вставки значения длины горизонтальной проекции : "
               ) ;_ end of getpoint
             ) ;_ end of vlax-3d-point
           text_height
           ) ;_ end of vla-AddText
        text_len_obj   (vla-addtext
           (_kpblc-get-active-space-obj)
           (vl-string-trim
             "0"
             (rtos
               (sqrt (+ (expt (* 5 hor_length) 2) (expt high_decr 2)))
               2
[b]               16 ;; Заменить на нужную точность[/b]
               ) ;_ end of rtos
             ) ;_ end of vl-string-trim
           (vlax-3d-point
             (getpoint
               "\nУкажите точку вставки значения длины наклонной линии : "
               ) ;_ end of getpoint
             ) ;_ end of vlax-3d-point
           text_height
           ) ;_ end of vla-addtext
        ) ;_ end of setq
  ) ;_ end of progn
      ) ;_ end of if
    (vla-endundomark *kpblc-activedoc*)
    ) ;_ end of while
  (princ)
  ) ;_ end of defun
(defun _kpblc-get-active-space-obj ()
  (if (and (zerop (vla-get-activespace *kpblc-activedoc*))
     (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
     ) ;_ end of and
    (vla-get-paperspace *kpblc-activedoc*)
    (vla-get-modelspace *kpblc-activedoc*)
    ) ;_ end of if
  ) ;_ end of defun

Re: Как построить линию с заданным уклоном в 2D?

Да, господа… Я сейчас себе напоминаю Сашу Привалова из «Понедельник начинается в субботу». Как он пытался сотворить бутерброд и представлял, как его отрезают от батона, намазывают маслом из хрустальной масленки, сверху кладут ломтик… и т.д. и т.п. А врезультате получил огромный кристалл горного хрусталя с м-а-а-а-леньким бутербродиком внутри… Видать, не умею я правильно поставить задачу. Проблема в том, что о реализации концепций я имею довольно смутное представление. Попытка последняя, потом можете меня смесло слать к… акадовой бабушке :)
Есть: УКЛОН (i)!
Нужно: построить наклонную линию, горизонтальная проекция которой в 5 раз меньше той, которая соответствует этому уклону. Самое интересное, что мне не нужен вывод результатов о построении, я дал себя неправильно понять и ввел всех в заблуждение. Это ДРУГАЯ прога для получения в dtext уклона СУЩЕСТВУЮЩЕЙ линии. Итак, как я это вижу:
1. Старт
2. Запрос «Введите уклон i <…> »
3. Запрос «Влево/Вправо» - контекстное меню
4. Поворот UCS вокруг оси z на угол alfa’ = arctg 5i при «Влево» или alfa’ = -arctg 5i при «Вправо»
5. Включение ortho
6. Запрос «Укажите первую точку»
7. по поводу этого сильно сомневаюсь, но вдруг получится) команда Line (или ее подобие) в режиме полярного задания координат, в которой значение вводимой длины b преобразовывается по формуле c’ = b / (5 * cos alfa’). При динамическом вводе второй точки (кликом курсора) длина, отображаемая в панели Coordinates значения не имеет, то есть линия до некой произвольной точки. Если так нельзя, то пусть будет просто команда Line (стандартная), и все, без ввода гор. проекции. :(
8. После ввода второй точки, повтор п.2 «Введите уклон I <..последнее значение по умолчанию..>»
9. П. 3 пропускается (или же клик правой кнопкой подтверждения предыдущего значения) и повтор команды до щелчка пр. кнопкой – «Отмена».
Пример:
1. Старт
2. «Введите уклон i <…> » 0.02
3. «вЛево/вПраво» <вПраво> вПраво
4. Поворот UCS около оси Z на угол -5.710593 [ГРАДУСЫ(ATAN(5*0.02))]
5. Ortho
6. «Укажите первую точку» …
7. «Укажите вторую точку» …
8. «Введите уклон i <0.02> » 0.05
9. «вЛево/вПраво» <вПраво>
10. Поворот UCS около оси Z на угол -14.03624  [ГРАДУСЫ(ATAN(5*0.05))]
11. Ortho
12. etc
13. etc
14. *Cancel*
Как-то так. Если я в чем-то заблуждаюсь поправьте меня, please.
А вторая прога просто вычисляет уклон линии по клику и заносит данные или в буфер, или в dtext. И все. Извините за бестолковость.

Re: Как построить линию с заданным уклоном в 2D?

Люди Добрые! Опять обращаюсь к Вам я нижайше!
Понимаю, что прошу невыполнимого, но хотя бы так…
1. Запрос «Введите уклон i <…> »
2. Запрос «Влево/Вправо» - контекстное меню
3. Поворот UCS вокруг оси z на угол alfa’ = arctg 5i при «Влево» или alfa’ = -arctg 5i при «Вправо»
4. Включение ortho
5. Построение линии (просто LINE  !!)
6. Возврат к WCS (мировой системе координат)
Все!!! Больше НИ О ЧЕМ НЕ ПРОШУ!!
Уважаемый kpblc!
Оценил я вашу программку, введя необходимые мне изменения. Текст прилагаю. Не подскажете ли, как заменить vla-addmtext на vla-addtext? И почему нельзя поменять размер текста при вводе? Она упорно берется из переменной TEXTSIZE?

(defun c:ang-by-pick (/ ent ins_point text_height mtext_obj)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (setq
    text_height
     (vla-get-height (vla-get-activetextstyle *kpblc-activedoc*))
    ) ;_ end of setq
  (if (= text_height 0)
    (if  (not (setq text_height (getreal "\nВведите высоту текста <2.5> : ")))
      (setq text_text_height 2.5)
      ) ;_ end of if
    ) ;_ end of if
  (while (setq ent (entsel "\nУкажите отрезок <Отмена> : "))
    (if  (= (cdr (assoc 0 (entget (car ent)))) "LINE")
      (progn
  (setq ins_point
         (getpoint "\nУкажите точку вставки текста <Прекратить> : ")
        ) ;_ end of setq
  (if ins_point
    (setq  ent    (vlax-ename->vla-object (car ent))
    mtext_obj (vla-addmtext
          (_kpblc-get-active-space-obj)
          (vlax-3d-point ins_point)
          0
          (strcat
                       (rtos
     (/ (abs (/ (sin (vla-get-angle ent)) (cos (vla-get-angle ent)))) 5)
        2
        4
        ) ;_ end of rtos
            ) ;_ end of strcat
          ) ;_ end of vla-AddMText
    ) ;_ end of setq
    ) ;_ end of if
  ) ;_ end of progn
      (progn
  (princ "\nНе отрезки не обрабатываются!")
  ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of while
  ) ;_ end of defun
(defun _kpblc-get-active-space-obj ()
  (if (and (zerop (vla-get-activespace *kpblc-activedoc*))
     (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
     ) ;_ end of and
    (vla-get-paperspace *kpblc-activedoc*)
    (vla-get-modelspace *kpblc-activedoc*)
    ) ;_ end of if
  ) ;_ end of defun

Помогите, ведь сами мы не местные… И эл. почты тоже нет...

Re: Как построить линию с заданным уклоном в 2D?

> Vladimir S
Высота текста (который будет ставиться) вычисляется строками

  (setq    text_height
     (vla-get-height (vla-get-activetextstyle *kpblc-activedoc*))
    ) ;_ end of setq
  (if (= text_height 0)
    (if    (not (setq text_height (getreal "\nВведите высоту текста <2.5> : ")))
      (setq text_text_height 2.5)
      ) ;_ end of if
    ) ;_ end of if

Их можно преобразовать примерно в такое:

  (if (not (setq text_height (getreal "\nВведите высоту текста <2.5> : ")))
    (progn
      (setq text_height
         (vla-get-height (vla-get-activetextstyle *kpblc-activedoc*))
        ) ;_ end of setq
      (if (= text_height 0)
    (setq text_text_height 2.5)
    ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of if

В таком варианте будет произведен сначала запрос высоты, если пустой ввод (нажали Enter), то производится запрос textsize. И если textsize = 0, то устанавливается значение 2.5. Вариантов развития на самом деле тьма - это то, что "с ходу" придумалось с минимальными переделками.
Насчет замены vla-addmtext на vla-addtext: первый метод требует последовательно указывать:
- пространство, в котором вставлять (_kpblc-get-active-space-obj)
- точка вставки
- ширина
- собственно текст
Второй же метод требует:
- пространство (_kpblc-get-active-space-obj)
- текст
- точка вставки
- высота текста
Т.е. заменить mtext_obje (vla-addmtext ...) на

        mtext_obj (vla-addtext
                (_kpblc-get-active-space-obj)
                (strcat (rtos
                      (/ (abs (/ (sin (vla-get-angle ent))
                         (cos (vla-get-angle ent))
                         ) ;_ end of /
                          ) ;_ end of abs
                     5
                     ) ;_ end of /
                      2
                      4
                      ) ;_ end of rtos
                    ) ;_ end of strcat
                (vlax-3d-point ins_point)
                text_height
                ) ;_ end of vla-addtext

Насчет остального я сегодня пас, увы :(

Re: Как построить линию с заданным уклоном в 2D?

to kpblc!
А не могли бы Вы привести п_о_л_н_ы_й текст программы ang-by-pick, с внесенными изменениями?
С высотой текста ничего не получилось, при вводе любого значения text_height, все равно используется значение textsize. Если высота текста в текущем Text Style равна нулю, то высота текста по умолчанию равна 0.2. Только изменение textsize в командной строке ведет  изменению высоты текста :(
А при замене vla-addmtext на vla-addmtext выдается сообщение «invalid input» :((

Re: Как построить линию с заданным уклоном в 2D?

Сорри, я сегодня дунувши - ДР все-таки. Допустил ошибку: (setq text_text-height ...) надо заменить на (setq text_height ...). полный код:

(defun c:ang-by-pick (/ ent ins_point text_height mtext_obj)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (if (not (setq text_height (getreal "\nВведите высоту текста <2.5> : ")))
    (progn
      (setq text_height
         (vla-get-height (vla-get-activetextstyle *kpblc-activedoc*))
        ) ;_ end of setq
      (if (= text_height 0)
    (setq text_height 2.5)
    ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of if
  (while (setq ent (entsel "\nУкажите отрезок <Отмена> : "))
    (if    (= (cdr (assoc 0 (entget (car ent)))) "LINE")
      (progn
    (setq ins_point
           (getpoint "\nУкажите точку вставки текста <Прекратить> : ")
          ) ;_ end of setq
    (if ins_point
      (setq    ent      (vlax-ename->vla-object (car ent))
        mtext_obj (vla-addtext
                (_kpblc-get-active-space-obj)
                (strcat (rtos
                      (/ (abs (/ (sin (vla-get-angle ent))
                         (cos (vla-get-angle ent))
                         ) ;_ end of /
                          ) ;_ end of abs
                     5
                     ) ;_ end of /
                      2
                      4
                      ) ;_ end of rtos
                    ) ;_ end of strcat
                (vlax-3d-point ins_point)
                text_height
                ) ;_ end of vla-addtext
        ) ;_ end of setq
      ) ;_ end of if
    ) ;_ end of progn
      (progn
    (princ "\nНе отрезки не обрабатываются!")
    ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of while
  (princ)
  ) ;_ end of defun
(defun _kpblc-get-active-space-obj ()
  (if (and (zerop (vla-get-activespace *kpblc-activedoc*))
       (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
       ) ;_ end of and
    (vla-get-paperspace *kpblc-activedoc*)
    (vla-get-modelspace *kpblc-activedoc*)
    ) ;_ end of if
  ) ;_ end of defun

Re: Как построить линию с заданным уклоном в 2D?

to kpblc !
Спасибо огромнейшее !! Работает софтинка !! Так, как нужно !!
Поздравляю с ДР!! При первой же возможности дуну за Ваше здоровье !!
Happy Birthday 2U!
Happy Birthday 2U!!
Happy Birthday Mr. kpblc !!!
Happy Birthday To You !!!!
А на досуге, please, подумайте про поворот UCS. (только, разумеется не сегодня!) ОЧЕНЬ надо! Пока пользубсь Quickcalc’ом.. Забил функцию -atan(5*) и потом вставляю в комстроку при повороте UCS около оси Z. Очень неудобно… Подумайте, а?
Еще раз: «Happy Birthday !!!»
p.s. С Вашего негласного позволения переименовал программку в «slon» - помесь «slope» и «уклон». А второй lisp на построение можно назвать «sline» или «ukline». :)

Re: Как построить линию с заданным уклоном в 2D?

Спасибо, ик! Пальцы заплетаются, но кое-чего еще могут. Судя по > Vladimir S (2005-12-12 20:10:14) вводится фактическая длина уклонной линии, и именно в указанном направлении. Так? Если сильно хоцца, то тогда можно поворачивать UCS (правда, я против такого подхода), правда, я бы сначала запрашивал направление построения, а потом в цикле ставить разные уклоныЖ

(defun c:sline (/ *error* destination _orthomode_ ent)
  (defun *error* (msg)
    (if    _orthomode_
      (setvar "orthomode" _orthomode_)
      ) ;_ end of if
    (command "_-ucs" "_w")
    (vla-endundomark *kpblc-activedoc*)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (vl-load-com)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (initget "вПраво вЛево Right Left _ R L R L")
  (setq    destination
     (getkword
       "\nУкажите направление построения [вПраво/вЛево] <вЛево> : "
       ) ;_ end of GETKWORD
    ) ;_ end of setq
  (if (not destination)
    (setq destination "L")
    ) ;_ end of if
  (setq destination (= destination "L"))
  (while (setq slope (getreal (strcat "\nУкажите значение уклона <Отмена>")))
    (vla-startundomark *kpblc-activedoc*)
    (setq _orthomode_ (getvar "orthomode"))
    (setvar "orthomode" 1)
    (command "_.ucs"
         "_n"
         "_z"
         (if destination
           (atan (* 5 slope))
           (- (atan (* 5 slope)))
           ) ;_ end of if
         ) ;_ end of command
    (command "_.line"
         (if ent
           (trans (cdr (assoc 11 (entget ent))) 0 1)
           pause
           ) ;_ end of if
         pause
         ""
         ) ;_ end of command
    (setq ent (entlast))
    (command "_.ucs" "_w")
    (setvar "orthomode" _orthomode_)
    (vla-endundomark *kpblc-activedoc*)
    ) ;_ end of while
  ) ;_ end of defun

Re: Как построить линию с заданным уклоном в 2D?

Да, вот еще - особо код на логичность построений не проверял, поскольку не спец.

Re: Как построить линию с заданным уклоном в 2D?

to kpblc !!
Ура! Ура! Ура! Все работает!! Замечательно!
Несите медаль этому замечательному человеку! Спасибо огромное, век помнить буду!
Продуктивность работы возросла раз в десять, кроме шуток!
Одно маленькое замечание по поводу упомянутой «логичности построений»:
- в калькуляторе функция atan возвращает значение в градусах, а в Visual Lisp Editor – в радианах, ну а поворот UCS должен быть тоже в градусах :).
Фрагмент:

(if destination
            (* 180.0 (/ (atan (* 5 slope)) pi))
         (- (* 180.0 (/ (atan (* 5 slope)) pi)))
                 ) ;_ end of if

Но это не умаляет Ваших заслуг, дорогой kpblc! Еще раз: С Днем Рождения!

Re: Как построить линию с заданным уклоном в 2D?

Ну сорри что не до конца все ок было, сорри. Не спец я в подобных вещах, совсем не спец. Вечно у меня трудности с угловыми преобразованиями :(

Re: Как построить линию с заданным уклоном в 2D?

Вот мой вариант построения линий с корректировкой пользователем длины заложения, конечных отметок, превышения отметок и уклонов (десятичных и 1:NNN). Возможность отрисовки таких линий на профиле (разные масштабы по X и Y). А также заполнение графы Длина/Уклон в профиле по точкам и объекту (полилинии).
http://geol-dh.ru/kai_stru.html