Спасибо всем, кто откликнулся!
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, чтобы я понял как ее стартовать.