Тема: Уклон в свойствах линии?
Сабж, как вписать еще одну переменную в свойства линии, так чтоб она еще и отображала ее уклон?
PS: Честно говоря надоело считать на калькуляторе ;) а книжки под рукой нет =(
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Уклон в свойствах линии?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сабж, как вписать еще одну переменную в свойства линии, так чтоб она еще и отображала ее уклон?
PS: Честно говоря надоело считать на калькуляторе ;) а книжки под рукой нет =(
> Nesmit
Тебе нужен угол в градусах/радианах относительно Х или именно уклон в процентах?
> Nesmit
Хочу Вас огорчить - в свойства стандартного примитива AutoCAD вписать еще одно дополнительное свойство нельзя. Можно лишь создать свой примитив (производный от линии) и добавить нужные свойства. Второй вариант своей lisp-функцией отображать отображать уклон. Т.е. запускашь фунцию, выбираешь линию, а функция печатает уклон.
> Александр Ривилис
Это ветка лисп, значит нужно сохранить вычисленные значения в примитиве...
Т.е. в расширенных данных можно записать угол, правда, в окне свойств он отображаться не будет...
Хотя упоминание калькулятора ставит мое предложение под большое сомнение...
> Nesmit
Поясните еще раз, что и в какой форме вам нужно.
> Евгений Елпанов
...Т.е. в расширенных данных можно записать угол, правда, в окне свойств он отображаться не будет...
Так и я об этом же. Какой тогда смысл их записывать в расширенные данные, если для отображения все равно нужно писать функцию. Так пусть она сразу и вычисляет уклон и печатает. Тем более, что линию могли повращать, а расширенные данные будут отражать неправильную информацию.
Если нельзя ничего добавлять в свойства, то вопрос отпадает. Отдельно функцию, я уже написал.
Спасибо за ответ.
Я в реакторах не разбираюсь но мне кажется для этого случая помогут именно они, как в примере в книге Н.Н. Полещука "Visul LISP и секреты...". И вообще тема интересная и вечно актуальная - всегда нехватает "самых нужных" свойств объекта для удобства и наглядности работы без промежуточных ручных вычислений.
> Runa
Никто не мешает сделать альтернативное окно свойств - для себя, с нужными только вам значениями...
> Евгений Елпанов
Но не у всех (в том числе и у меня) хватает умений, опыта и т.д. Да и как на лиспе можно сделать окно свойств подобное встроеному?
Вобще то в окне свойств для отрезка есть наклон. Однако, он учитывает еще и направление, потому не всегда покажет правильно. Кроме того, наклон можно получить по командн _.list, хотя там практически то же самое.
На Лиспе можно попросить пользователя выбрать отрезок, затем прграммно определить его начало и конец, по полученным данным вычислить угол и вывести его в командную строку или в окошко alert.
> Runa
Не обязательно делать сложное окно...
например нам нужно от отрезка только угол наклона и длинна с большой точностью.
Короче примерно так:
(defun c:test ( / x) (if (setq x (car (entsel "Выберите отрезок"))) (alert (strcat "Длинна отрезка " (rtos (distance (cdr(assoc 10 (entget x))) (cdr(assoc 11 (entget x)))) 2 8) "\n Угол наклона " (rtos (* 180(/ (angle (cdr(assoc 10 (entget x))) (cdr(assoc 11 (entget x)))) pi)) 2 8) "градусов"))))
Как всегда забыл указать...
после загрузки вызывать из командной строки командой
test
:^D
> Евгений Елпанов
Когда я увидел эту ветку мне пришла в голову одна идея: вот например одна моя функция которая вычисляет длину в плане и уклон в промиллях для точек с разными отметками Z
(defun c:rdd ( / runa01 runa02 runa03 runa04 runa05) (setq runa01 (GETPOINT "\nSpecify first point: ")) (if (null runa01) (setq runa01 (getvar "LASTPOINT"))) (setq runa02 (GETPOINT runa01 " Specify second point: ")) (if (null runa02) (princ "\nCannot computer distance.") (PROGN (setq runa03 (- (last runa02) (last runa01)) runa05 (distance runa01 runa02)) (setq runa01 (list (car runa01) (cadr runa01)) runa02 (list (car runa02) (cadr runa02))) (setq runa04 (distance runa01 runa02)) (princ (STRCAT "\nDistance = " (RTOS runa04 2) " м, Slope = " (rtos (* (/ runa03 runa04) 1000) 2 3) " %%, Delta Z = " (rtos runa03 2) " м.")) (princ (STRCAT "\nDist by z: " (rtos runa05 2) " м, L(M 1:500)= " (rtos (/ runa04 0.5) 2) " мм, " "L(M 1:200)= " (rtos (/ runa04 0.2) 2) " мм")) );PROGN );if (princ) )
ведь можна наверное сделать реактор который бы сам запускал ее и вычислял нужные свойства для выделеной линии?
> Runa
Думаю интереснее сделать программу, которая делая вычисления добавляла их перезаписывая в гиперссылку...
Перезаписывала потому, что линии могут изменяться (перемещаться, вертеться)- это же чертеж...
Зато из плюсов - нажал кнопку обновить вычисления, и подводи курсор к любой линии, сразу выскакивает гиперссылка с нужными значениями!
Простой вопрос перерос в дискуссию.
Runa была права, это как раз то свойство линии которое (для геодезиста) хорошо бы добавить.
А писать отдельной программой неимеет смысла, т.к. формула уклона = превышение(dZ) / расстояние (L).
Такая вот тривиальная формула, а заставляет много раз повторять такое вычисление, и не обязательно ее отображать на чертеже.
PS: Я так понял, сам объект Line написан на ARX или на откомпилирован в лиспе и поэтому подправить/добавить ничего нельзя, только переписывать объект заново. Я правильно понимаю суть проблемы?
> Nesmit
Да, подправить ничего нельзя, но можно чего-нибудь добавить доступными средствами!
> Nesmit
вообщето я мужского рода, просто "runa" мне писать удобней :)
Ну отображать на чертеже такую информацию я и не собирался просто хотелось сделать все красивее - выделил нужную линию и получил уклон когда это нужно.
Линии обычные, автокадовские.
> Евгений
ну вообщето я тоже сначала подумал о гиперсылке но мне показалось что в принципе хранить эту информацию незачем да и линий многовато 1 - 2 тыс (в LDT) поэтому я решил что реакторы то что нужно, но не нашел нужного во первых во вторых я так понимаю что нужны будут еще другие реакторы которые будут добавлять нужный реактор к нужным линиям.
Похоже легче создать пару функций на всякий случай и пользоватся ими.
> Евгений Елпанов
Каким способом если не секрет?
Спасибо за програмку, очень интересная (rdd).
> Runa
Приношу свои извинения. :)
Вот наваял програмку добавления гиперссылок ко всем линиям, после запуска она перезаписывает гиперссылки заменяя новыми, т.е. если линии изменялись перед считыванием данных надо запустить программу...
Пользуясь гиперссылками можно посмотреть уклон не вызывая окно свойств или в окне свойств в графе гиперссылки.
(defun c:test (/ A2 A3 SSET) (if (setq sset (ssget "_x" '((0 . "LINE")))) (foreach a1 (mapcar (function (lambda (a1) (list (cdr (assoc 10 a1)) (cdr (assoc 11 a1)) (vlax-ename->vla-object (cdr (assoc -1 a1)) ) ;_ конец функции vlax-ename->vla-object ) ;_ конец функции list ) ;_ конец функции lambda ) ;_ конец функции function (mapcar (function entget) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex sset)) ) ;_ конец функции vl-remove-if ) ;_ конец функции mapcar ) ;_ конец функции mapcar (if (vl-catch-all-error-p (setq a2 (vl-catch-all-apply 'vla-item (list (setq a3 (vla-get-Hyperlinks (caddr a1))) 0 ) ;_ конец функции list ) ;_ конец функции vl-catch-all-apply ) ;_ конец функции setq ) ;_ конец функции vl-catch-all-error-p (vla-add a3 (strcat "уклон " (rtos (if (zerop (distance (list (caar a1) (cadar a1)) (list (caadr a1) (cadadr a1)) ) ;_ конец функции distance ) ;_ конец функции zerop 0.0 (/ (distance (list 0. 0. (caddar a1)) (list 0. 0. (car (cddadr a1))) ) ;_ конец функции distance (distance (list (caar a1) (cadar a1)) (list (caadr a1) (cadadr a1)) ) ;_ конец функции distance ) ;_ конец функции / ) ;_ конец функции if 2 8 ) ;_ конец функции rtos ) ;_ конец функции strcat ) ;_ конец функции vla-add (progn (vla-delete a2) (vlax-release-object a2) (vla-add a3 (strcat "уклон " (rtos (if (zerop (distance (list (caar a1) (cadar a1)) (list (caadr a1) (cadadr a1)) ) ;_ конец функции distance ) ;_ конец функции zerop 0.0 (/ (distance (list 0. 0. (caddar a1)) (list 0. 0. (car (cddadr a1))) ) ;_ конец функции distance (distance (list (caar a1) (cadar a1)) (list (caadr a1) (cadadr a1)) ) ;_ конец функции distance ) ;_ конец функции / ) ;_ конец функции if 2 12 ) ;_ конец функции rtos ) ;_ конец функции strcat ) ;_ конец функции vla-add ) ;_ конец функции progn ) ;_ конец функции if ) ;_ конец функции foreach ) ;_ конец функции if (princ) )
Вызывается программа командой
test из акада
PS. Посмотрел в окне предварительного просмотра - что-то длинновато получилось
:^D
> Nesmit
на здоровье, только RDD - моя программулина, первая кстати и она досих пор лидер по вызову. Без нее я как без рук.
> Евгений Елпанов
спасибо за программу. Ее можно будет приспособить для многих вещей. В том чиле для Nesmit но вот для уклонов придется еще что нибудь выдумывать поскольку очень важно знать не только уклон но и его направление.
> Runa
Нет ничего проще...
Напиши форму записи, которая была бы удобна, появится минутка - доделаю.
Например:
уклон=0.0254254% направление=56.025гр.
PS. Только, мне кажется, чем короче запись тем удобнее - в окне свойств не особо длинная строка...
:^D
> Евгений Елпанов
большое спасибо но не нужно, не люблю пудрить мозги но всегда так получается:).
Я имел ввиду что направление уклона будет указано в чертеже например крестик в нижней или верхней точке нарисованый например функцией (grdraw). Для всех линий рисовать их нет смысла, а вставлять точки не хочется.
У меня идей пока что нет, но оно мне и не горит... до следущей вертикалки.)
> Runa
Тогда посмотрим, что скажет Nesmit, как человек измученный калькулятором...
:^D
PS. Надеюсь без обид.
> Евгений Елпанов
Как вариант:
удаляет предыдущие линки и записывает новый
(defun C:put-hyp-to-lines (/ acsp adoc an cnt
desc hv hyp ukl util)
(vl-load-com)
(setq adoc (vla-get-activedocument
(vlax-get-acad-object)
)
acsp (vla-get-block (vla-get-activelayout adoc))
util (vla-get-utility adoc)
)
(setq cnt 1)
(vlax-for a acsp
(if (wcmatch (vla-get-objectname a) "AcDbLine")
(progn
(setq an (vla-get-angle a)
hv (* (vla-get-length a) (sin an))
ukl (/ hv (vla-get-length a))
)
(setq hyp (vla-get-hyperlinks a))
(if (not (zerop (vla-get-count hyp)))
(vlax-for i hyp
(vla-delete i)
)
)
(setq desc (vla-add hyp "Уклон"))
(vla-put-urldescription
desc
(vl-princ-to-string
(list (strcat "Линия ?" (itoa cnt)) ukl an)
)
)
(setq cnt (1+ cnt))
)
)
)
)
(C:put-hyp-to-lines)
;Test:
(setq ln (vlax-ename->vla-object(car (entsel))))
(vlax-for i (vla-get-hyperlinks ln)
(setq desc
(vla-get-urldescription i)))
~'0'~
> OLeg(jr.)
У вас ошибочка закралась...
(setq an (vla-get-angle a))
Здесь вычисляется угол в проекции на XY т.е. далее копится ошибка.
:^((
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → Уклон в свойствах линии?
Форум работает на PunBB, при поддержке Informer Technologies, Inc