Тема: Программа+макрос на кнопку "Ориентирование обьектов в AutoCAD по контрольной линии"
Есть в AutoCAD очень хорошая возможность ориентироать под углом некоторые обьекты. В частности растровый. Можно ли немного автоматизировать этот процесс?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Программа+макрос на кнопку "Ориентирование обьектов в AutoCAD по контрольной линии"
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть в AutoCAD очень хорошая возможность ориентироать под углом некоторые обьекты. В частности растровый. Можно ли немного автоматизировать этот процесс?
Опять - двадцать пять. Приходится догадываться, что именно хочет т. Forma. А хочет он, видимо, выровнять криво отсканированный и вставленный в DWG растр, IMHO. Если это так, то тут как раз и пригодится команда "_ALIGN" ("ВЫРОВНЯТЬ"). Только автоматизировать там нечего, все и так просто. Если я не угадал, то считайте меня коммунистом.
> Владимир Громов
Всему виной гроза. Сижу на аккумуляторах и жутко дорогом dial-up.
Тороплюсь. Я поигрался с "_ALIGN" ("ВЫРОВНЯТЬ"). Очень не понравилось. Предлагаю провести на криво отсканированном чертеже (они всегда кривые) одну розовую жирную линию под углом соответствующим углу большинства линий кривого сканированного изображения. Затем кликнуть по ней и кликнуть по вставленному кривому растру. Он выправляется относительно контольной линии. Я делаю это вручную. Пересчетом и т.д.
p.s. Вы угадали. Не быть Вам коммунистом.( Забавная логика)
> Forma
Вот какая ситуация бывает у меня. Имеется сканированный план здания, иногда склеенный из кусков, т.к. мне доступен только сканер формата А3, а чертежи бывают формата > А1. Ясно, что растр не получится ортогональным, хоть ты тресни. Тогда я провожу из одного угла этого растра вертикальную или горизонтальную линию и выравниваю растр по одной паре точек. Это получается достаточно быстро и автоматизации не требует. Если же хочется иметь сознательно повернутый растр, то лучше его заранее обработать в редакторе растровых изображений и лучшим из них я считаю Ulead PhotoImpact.
> Владимир Громов
Да согласен с предварительной обработкой растра. Но есть два момента:
Первый. Не знаю этой программы. Попробую найти и посмотреть;
Второй. Вечно торопишься. Все надо быстро и сразу:)
Вот, посмотри здесь:
http://www.upi.kiev.ua/
Сам я глянул только мельком.
> Владимир Громов
Э-э-э... . Да он имеет 32 Mgb и 90 бледнозеленых. Так быстро не получится. Обосновать надо. И самое главное. Репер в нем есть? Что- то я сомневаюсь.>
> Forma
Оно?
(defun C:ALIGN_IMAGE ( / ss en el p1 p2 u v ang tmp i n ul vl) (defun vector_len (v / x y z) (setq x (nth 0 v) y (nth 1 v) z (nth 2 v)) (sqrt (+ (* x x) (* y y) (* z z))) ) (princ "\nВыберите отрезок, по которому будет выполняться выравнивание: ") (if (setq ss (ssget "_:S:E" '((0 . "LINE")))) (progn (setq el (entget (ssname ss 0))) (setq p1 (cdr (assoc 10 el)) p2 (cdr (assoc 11 el))) ;; Упорядочим отрезок по оси X (if (> (car p1) (car p2)) (progn (setq tmp (list p1 p2) p1 (last tmp) p2 (car tmp)) )) ;; (if (progn (setq ang (angle p1 p2)) (princ "\nВыберите растры для выравнивания: ") (if (setq ss (ssget '((0 . "IMAGE")))) (progn (setq n (sslength ss) i 0) (while (< i n) (setq el (entget (ssname ss i))) (setq u (cdr (assoc 11 el)) v (cdr (assoc 12 el))) (setq el (subst (cons 11 (polar '(0.0 0.0 0.0) ang (vector_len u))) (assoc 11 el) el)) (setq el (subst (cons 12 (polar '(0.0 0.0 0.0) (+ ang (* PI 0.5)) (vector_len v))) (assoc 12 el) el)) (entmod el) (setq i (1+ i)) ) )) ;; (if (progn )) ;; (if (progn (princ) )
> Александр Ривилис
Сейчас проверю.
> Forma
Надеюсь, что все нормально. Программа обрабатывает только растры (для других типов объектов нужны свои алгоритмы - единообразия достичь вряд ли получится).
> Александр Ривилис
Да. Оно. Спасибо. Все правильно. Но несколько ремарок.
1. Я обычно выравниваю по линии близкой к горизонтальной.
Мне достаточно. Но эта программа не только для меня.
Пользователь может определить контрольной линией- линию
близкой к вертикальной. Программа в этом случае отработает
некорректно.
2. Если можно, Когда кликаешь контрольную линию, что бы она как то подсветилась.
3. Для справки. Поворот нескольких растров относительно одной линии теоретически верен. Но в реальности так не бывает.
Все три ремарки не принципиальны. :)
Спасибо. Так меня достали эти тупые повороты.
Не по теме. Личное впечатление:
"Autodesk" с углами не дружит.
Например: Как провести линию под углом?
Меня спрашивали об этом раз двадцать. Домой звонят.:)
p.s. Вам лично благодарность от моей жены за пр-му "Выравнивание линий" :)
> Александр Ривилис
Вспомнил. Днем вертелся вопрос в голове. Точность поворота какая заложена? Нужно не менее 15 минут. Может там по умолчанию округление до целых градусов.
> Александр Ривилис
В код еще не вникал, но попробовал программу в действии. Выяснилось, что для выравнивания нужен горизонтальный отрезок, если задать вертикальный (часто надо выровнять по вертикали), то растр поворачивается на 90 градусов от вертикального положения. А если дать команду отмены, то отменяется и поворот растра и отрезок, нарисованный до выполнения "ALIGN_IMAGE", и режим ОРТО, установленный для отрисовки отрезка...
> Forma
Что имеется в виду под словом "репер"?
> Forma
Поворот - какой угодно. Самое главное то, что в качестве поворота надо указывать десятичные значения углов. Например, для того, чтобы повернуть какой-то объект на 15 градусов 10 минут, надо указать в качестве значения угла поворта 15,1(6), т.е. [15 + 10/60]. Поэтому зачастую проще нарисовать линию через нужные точки и дальше - либо _align, либо программы, представленные здесь - по необходимости
---
ИМХО
> Forma
> Владимир Громов
Вы оба меня озадачили. Ну по поводу отмены команды - тут и так все ясно, а вот по поводу выравнивания по вертикальному отрезку... И как же интересно я буду догадываться нужно ли мне выравнивать низ растра или бок? А если отрезок наклонный? Нет уж увольте... Выравнивается всегда низ растра. Угол измеряется с той точностью, с которой позволяет AutoCAD и нигде не округляется, если не учитывать потери при вычислениях.
> Александр Ривилис
Хорошо. Не критично. Спасибо.
Не по теме:
Вот, что меня начинает удивлять, так то что пользователи AutoCAD
не "врубаются" в задачу. У меня такое чувство, что мало практики.
> Александр Ривилис
Хоть я лицо и не вполне заинтересованное, но хочу уточнить. Сразу оговорюсь, что мое замечание ни к чему не обязывает. А дело вот в чем. У меня бывают старые чертежи, выполненные на доске и в них не всегда выдержан угол 90 градусов между горизонтальными и вертикальными линиями. Поэтому при обводке растра в AutoCAD'е приходится решать: если превалируют вертикальные линии, то и выравнивать надо по вертикали, а уж горизонтальные как получатся в режиме ОРТО. Задача ведь состоит не просто в выравнивании рамки растра, а того, что в нем нарисовано. Вот и все с моей стороны.
> Владимир Громов
Да. Правильно, отчасти. Но . Выравнивается рамка растра. Не запутывайте Александра Ривилиса.
Меня программа вполне устраивает. Но, как- бы незавершенная.
В LISP есть операторы подобные "if";"else";"goto" т.п.? Это я к тому, что- бы
отсортировать два "признака" контрольной линии: близкой к горизонтали (0-45;315-360) и близкой к вертикали (45-135;225-315).
С учетом, есс-но, >=.
По первому признаку повернуть горизонтальную составляющую растра, по второму- по вертикальной.
А, то я вроде как неформально ответственный за эту ветку на форуме.:)))
> Forma
С углами ошибочка вышла:)
> Forma
Где-то так:
(defun C:ALIGN_IMAGE ( / ss en el p1 p2 u v ang tmp i n ul vl) (defun vector_len (v / x y z) (setq x (nth 0 v) y (nth 1 v) z (nth 2 v)) (sqrt (+ (* x x) (* y y) (* z z))) ) (princ "\nВыберите отрезок, по которому будет выполняться выравнивание: ") (if (setq ss (ssget "_:S:E" '((0 . "LINE")))) (progn (setq el (entget (ssname ss 0))) (setq p1 (cdr (assoc 10 el)) p2 (cdr (assoc 11 el))) ;; Упорядочим отрезок по оси X (if (> (car p1) (car p2)) (progn (setq tmp (list p1 p2) p1 (last tmp) p2 (car tmp)) )) ;; (if (progn (setq ang (angle p1 p2)) ;; Разберемся с углом: (cond ((and (> ang (* PI 0.25)) (< ang (* PI 0.75))) (setq ang (- ang (* PI 0.5))) ) ((and (> ang (* PI 1.25)) (< ang (* PI 1.75))) (setq ang (+ ang (* PI 0.5))) ) ) ;; (cond (princ "\nВыберите растр для выравнивания: ") (if (setq ss (ssget "_:S:E" '((0 . "IMAGE")))) (progn (setq n (sslength ss) i 0) (while (< i n) (setq el (entget (ssname ss i))) (setq u (cdr (assoc 11 el)) v (cdr (assoc 12 el))) (setq el (subst (cons 11 (polar '(0.0 0.0 0.0) ang (vector_len u))) (assoc 11 el) el)) (setq el (subst (cons 12 (polar '(0.0 0.0 0.0) (+ ang (* PI 0.5)) (vector_len v))) (assoc 12 el) el)) (entmod el) (setq i (1+ i)) ) )) ;; (if (progn )) ;; (if (progn (princ) )
> Александр Ривилис
Опять я первую скобку потерял:(
Вот теперь нормально. Все логично завершено. Большое спасибо.
> Forma
Посыпаю голову пеплом. Неправильно поставил задачу. Уважаемый Александр Ривилис выполнил в точности, что я просил.:(
А, не менее уважаемый Владимир Громов деликатно подсказывал мне, что я пру как баран не в ту сторону.
Вот к чему приводят методы пригодные только для ловли блох.
Короче, надо привести кривой растр к ORTO по построеной контрольной линии. Есть у меня предчувствие, что все дело в знаках + и -. Не смею просить. Только надеюсь и уповаю.
Дополнение: Программа поворачивает растр на "правильный" угол, но с противоположным знаком.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → Программа+макрос на кнопку "Ориентирование обьектов в AutoCAD по контрольной линии"
Форум работает на PunBB, при поддержке Informer Technologies, Inc