Re: Отмерить по линии расстояние и поставить точку
Все, работает! Спасибо! Уже применяю в работе. Очень полезно.
Рад если так,
Успехов :)
[FONT=Arial]~'J'~[/FONT]
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Отмерить по линии расстояние и поставить точку
Все, работает! Спасибо! Уже применяю в работе. Очень полезно.
Рад если так,
Успехов :)
[FONT=Arial]~'J'~[/FONT]
В догонку ещё одна поделка, как обещал
указывает расстояние между двумя выбранными точками
на кривой (линии, полилинии,сплайне)
При работе нужно учесть один нюанс, когда откроется
редактор мультитекста, нужно просто закрыть его причём неважно,
что текст там будет отсутствовать или будет что-то напечатано, если его не закрыть программа
вывалится, добавлен откат и восстановление переменных
Точки указывать аккуратно используя нужные привязки
;;--------------------------------- Dist2p.lsp ------------------------------------;; ;; fixo () 2011 * all rights released (типа делай с ней что хошь) ;; редакция от 2/16/12 ;; редакция от 2/21/12 (defun c:dist2p ( / *error* a b box dimbl dimz dist1 dist2 elist ht mp1 mp2 p1 p2 p3 par1 par2 plent pline pt1 pt2 sp txt wid) (defun *error* (msg) (cond ((not msg)) ((vl-position msg '("Function cancelled" "quit / exit abort" "console break") ) ) ((princ (strcat "\nDist2P Command Error: " msg))) ) (if dimbl (setvar "dimldrblk" dimbl) ) (if dimz (setvar "dimzin" dimz) ) (command "_undo" "_end") (princ) ) (command "_undo" "_begin") (setq dimbl (getvar "dimldrblk")) (setvar "dimldrblk" ".") (setq dimz (getvar "dimzin")) (setvar "dimzin" 0) (prompt "\n >>> ВЫБРАТЬ КРИВУЮ >>>\n") (setq sp nil) (while (not (or (and (setq sp (ssget "_+.:S:E" '((0 . "*line"))))))) (princ "\n\t---> ВЫБРАТЬ ТОЛЬКО КРИВУЮ!")) (setq plent (ssname sp 0) pline (vlax-ename->vla-object plent) ) (while (setq p1 (getpoint "\nПервая точка на кривой (или Enter для завершения): ")) (progn (setq p2 (getpoint p1 "\nВторая точка на кривой: ")) (while (member (car (setq p3 (grread t 15 0))) '(5 2)) (redraw) (if (listp (setq p3 (cadr p3))) (progn (grdraw p1 p3 1 1) (grdraw p2 p3 1 1) ) ) ) (setq p3 (cadr p3)) (setq p1 (vlax-curve-getclosestpointto pline p1)) (setq par1 (vlax-curve-getparamatpoint pline p1)) (setq dist1 (vlax-curve-getdistatparam pline par1)) (setq mp1 (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p1 p3)) (setq p2 (vlax-curve-getclosestpointto pline p2)) (setq par2 (vlax-curve-getparamatpoint pline p2)) (setq dist2 (vlax-curve-getdistatparam pline par2)) (setq mp2 (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p2 p3)) (setq txt (rtos (abs (- dist1 dist2)) 2 3));<-- точность 3 знака, изменить по условию (setq elist (list '(0 . "TEXT") '(100 . "AcDbEntity") '(67 . 0) '(410 . "Model") '(8 . "0") '(100 . "AcDbText") (cons 10 p3) (cons 11 (list (car p3) (+ (cadr p3) (/ (* (getvar "textsize")(getvar "dimscale")) 2)) 0.0)) (cons 40 (* (getvar "textsize")(getvar "dimscale"))) (cons 1 txt) '(50 . 0.0) '(41 . 1.0) '(51 . 0.0) (cons 7 (getvar "textstyle")) '(71 . 0) '(72 . 0) (cons 210 (list 0.0 0.0 1.0)) '(73 . 2) ) ) (setq box (textbox elist)) (setq pt1 (car box) pt2 (cadr box) wid (- (car pt2) (car pt1)) ht (- (cadr pt2) (cadr pt1)) pt1 (list (- (car pt1) (/ ht 2.0)) (+ (cadr pt1) (/ ht 2.0)) (caddr pt1)) pt2 (list (+ (car pt2) (/ ht 2.0)) (cadr pt1) (caddr pt1)) pt1 (mapcar '+ pt1 p3) pt2 (mapcar '+ pt2 p3) ) (command "_.acad_dim.mleader" p1 pt1 "") (vla-put-textstring (vlax-ename->vla-object (setq mldr(entlast))) txt) (command "_mleaderedit" "_L" "" "_A" p2 "") (command "_chprop" "_L" "" "_Color" "2" "");<-- цвет ("2") измени здесь ) (redraw) ) (*error* nil) (princ) ) (prompt "\n --- Команда на выполнение \"DIST2P\" или \"dist2p\" ---") (prin1) (or (vl-load-com) (princ) ) ;;--------------------------------- Dist2p.lsp ------------------------------------;;
[FONT=Arial]~'J'~[/FONT]
Спасибо,тоже полезно. :) А можно сюда тоже добавить сначала выбор линии?
В догонку ещё одна поделка, как обещалуказывает расстояние между двумя выбранными точками
на кривой (линии, полилинии,сплайне)
Все получается только один раз с конкретной кривой! Если бы все доделать... СПАСИБО!
Спасибо,тоже полезно. А можно сюда тоже добавить сначала выбор линии?
Здесь линия выбирается с первой указанной точкой, просто
ссылка на нее в теле кода появляется далее по коду
Или я опять чего не понял?
[FONT=Arial]~'J'~[/FONT]
Все получается только один раз с конкретной кривой! Если бы все доделать... СПАСИБО!
Это в теории можно, но я бы не стал,
если нужно все точно расставить
Либо нужно использовать отдельную программу, которая будет изначально
расставлять все блоки соответственно условиям...
[FONT=Arial]~'J'~[/FONT]
Просто, если обе точки на кривой являются точками пересечения этой кривой с другими линиями, то в этом случае, что б программа понимала какую кривую брать, думаю предварительный выбор линии был бы здесь тоже уместен.
Просто, если обе точки на кривой являются точками пересечения этой кривой с другими линиями, то в этом случае, что б программа понимала какую кривую брать, думаю предварительный выбор линии был бы здесь тоже уместен.
Пожалуй ты прав я чего-то не подумал об этом
Позже вернусь :)
[FONT=Arial]~'J'~[/FONT]
@Дмитрий Космос
Пробуй измененный код из поста #27 еще раз
[FONT=Arial]~'J'~[/FONT]
День добрый! Вот еще две идеи (одну из них я вынесу в новую тему):
Первая:
Ваша команда PIK, но использовать не блок, а линию, проведенную предварительно. А чтобы область применения была шире, думаю было бы полезно использовать не одну лишь линию, а выбранный набор объектов. Шаги приблизительно те же:
1. Выбираем линию №1, на которой и хотим отмерить (в данном случ. произвести копирование)
2. Выбираем линию №2, проведенную заранее, которая и будет копироваться в одну или др. сторону относительно линии №1. Важно что бы при последующем выполнении команды положение в целом линии №2 относительно линии №1 сохранялось (угол относительно линии №1, расстояние до линии №1, если линия №2 проведена в стороне).
3. Выбираем сторону смещения
4. набираем расстояние.
Если использовать вместо линии №2 уже набор объектов, то получается почти команда PIK, только блок создается не заранее, а в процессе уже самой командой. что экономит немного времени.
Буду очень признателен, если задумка вернется кодом. :)
Вторая задача тут
День добрый! Вот еще две идеи (одну из них я вынесу в новую тему):
Первая:
Ваша команда PIK, но использовать не блок, а линию, проведенную предварительно. А чтобы область применения была шире, думаю было бы полезно использовать не одну лишь линию, а выбранный набор объектов. Шаги приблизительно те же:
1. Выбираем линию №1, на которой и хотим отмерить (в данном случ. произвести копирование)
2. Выбираем линию №2, проведенную заранее, которая и будет копироваться в одну или др. сторону относительно линии №1. Важно что бы при последующем выполнении команды положение в целом линии №2 относительно линии №1 сохранялось (угол относительно линии №1, расстояние до линии №1, если линия №2 проведена в стороне).
3. Выбираем сторону смещения
4. набираем расстояние.Если использовать вместо линии №2 уже набор объектов, то получается почти команда PIK, только блок создается не заранее, а в процессе уже самой командой. что экономит немного времени.
Буду очень признателен, если задумка вернется кодом.
Вторая задача тут
Дмитрий, сделай набросок того что ты хочешь в АвтоКаде
а то у меня с соображалкой прблемы и залей потом файл куда-нибудь
а ссылку скинь сюда или в приватные сообщения
[FONT=Arial]~'J'~[/FONT]
Возможно это не очень красиво - влезать в "чужие" темы, но в моем ModPlus есть функция Мультикопирование... Возможно она Вам поможет...
Возможно это не очень красиво - влезать в "чужие" темы, но в моем ModPlus есть функция Мультикопирование... Возможно она Вам поможет...
По-моему все как раз нормально, когда есть свобода выбора - это
только на пользу
[FONT=Arial]~'J'~[/FONT]
Мультикопирование... Возможно она Вам поможет...
Спасибо, что не прошли мимо. Попробовал мультикопирование - немного не то.
Дмитрий, сделай набросок того что ты хочешь в АвтоКаде
@Дмитрий Космос
Скачал, завтра посмотрю
[FONT=Arial]~'J'~[/FONT]
Залил сюда:
Можно пробовать
Так это же моя ссылка?
Наверно я не то кликнул по слабости ума
Скачай отсюда
http://dl.dropbox.com/u/18024145/PIKB.LSP
[FONT=Arial]~'J'~[/FONT]
Вот Он, настоящий успех, модернизация рутиной работы! Ура!!! Но в строчке 221 кода заменил pi на цифру 0, чтоб не поворачивал на 180. Получилось то, что нам нужно.
Огромное Спасибо! Цель достигнута! :) :) :)
Можно ли вернуться к коду #27
Программа очень ПОЛЕЗНАЯ!
Хотелось бы изменить ее работу следующим образом:
Указываем в первом цикле первую точку на кривой, указываем направление, указываем вторую точку на кривой, указываем точку для вывода цифры. (Это все устраивает.)
Во втором и последующих циклах указываем ТОЛЬКО последующие точки на кривой и точки для вывода цифр. Размерные желтые стрелочки следует выводить в другой слой или отказаться от них, т. к. когда вынесешь 50 размеров все пространство ими забьется.
Можно ли вернуться к коду #27
Программа очень ПОЛЕЗНАЯ!
Хотелось бы изменить ее работу следующим образом:Указываем в первом цикле первую точку на кривой, указываем направление, указываем вторую точку на кривой, указываем точку для вывода цифры. (Это все устраивает.)
Во втором и последующих циклах указываем ТОЛЬКО последующие точки на кривой и точки для вывода цифр. Размерные желтые стрелочки следует выводить в другой слой или отказаться от них, т. к. когда вынесешь 50 размеров все пространство ими забьется.
Посмотрю попозже, сейчас не могу
[FONT=Arial]~'J'~[/FONT]
Исправлю свое предыдущее сообщение:
Vladimir Mich пишет:
Можно ли вернуться к коду #27
Программа очень ПОЛЕЗНАЯ!
Хотелось бы изменить ее работу следующим образом:
Указываем в первом цикле первую точку на кривой, указываем вторую точку на кривой, указываем точку для вывода цифры. (Это все устраивает.)
Во втором и последующих циклах указываем ТОЛЬКО последующие точки на кривой и точки для вывода цифр. Размерные желтые стрелочки следует выводить в другой слой или отказаться от них, т. к. когда вынесешь 50 размеров все пространство ими забьется.
Спасибо!
Размерные желтые стрелочки следует выводить в другой слой или отказаться от них
Не ясно тогда, где и в каком виде должен позиционироваться текст
(точка вставки, угол поворота отностельно кривой), могут быть варианты...
[FONT=Arial]~'J'~[/FONT]
Текст должен выводиться точно также как и сейчас выводится, только желательно не выводить стрелочки (или выводить их в другой слой, так как они закрывают чертеж ) и повторно в одном сеансе работы указывать одну и туже точку (точку начала отсчета) не совсем удобно.
Пробуй такой вариант
;;--------------------------------- D2p.lsp ------------------------------------;; ;; fixo () 2011 * all rights released (defun c:dist2p ( / *error* a b box dimbl dimz dist1 dist2 elist ht lname mp1 mp2 p1 p2 p3 par1 par2 plent pline pt1 pt2 sp txt wid) (defun *error* (msg) (cond ((not msg)) ((vl-position msg '("Function cancelled" "quit / exit abort" "console break") ) ) ((princ (strcat "\nDist2P Command Error: " msg))) ) (if dimbl (setvar "dimldrblk" dimbl) ) (if dimz (setvar "dimzin" dimz) ) (setvar "nomutt" 0) (command "_undo" "_end") (princ) ) (command "_undo" "_begin") (setq dimbl (getvar "dimldrblk")) (setvar "dimldrblk" ".") (setq dimz (getvar "dimzin")) (setvar "dimzin" 0) (setq lname "Temp-Text");<--- (if (not (snvalid lname))(progn (alert "Некорректное название слоя\n Отмена программы...")(exit)(princ))) (if (not (tblsearch "layer" lname)) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 lname) '(70 . 0) '(62 . 22);<--- '(6 . "CONTINUOUS") ) )) (setvar "nomutt" 0) (prompt "\n >>> ВЫБРАТЬ КРИВУЮ >>>\n") (setvar "nomutt" 1) (setq sp nil) (while (not (or (and (setq sp (ssget "_+.:S:E" '((0 . "*line"))))))) (princ "\n\t---> ВЫБРАТЬ ТОЛЬКО КРИВУЮ!")) (setvar "nomutt" 0) (setq plent (ssname sp 0) pline (vlax-ename->vla-object plent) ) (setq p1 (getpoint "\nПервая точка на кривой : ")) (while (setq p2 (getpoint p1"\nВторая точка на кривой (или Enter для завершения): ")) (progn (while (member (car (setq p3 (grread t 15 0))) '(5 2)) (redraw) (if (listp (setq p3 (cadr p3))) (progn (grdraw p1 p3 1 1) (grdraw p2 p3 1 1) ) ) ) (setq p3 (cadr p3)) (setq p1 (vlax-curve-getclosestpointto pline p1)) (setq par1 (vlax-curve-getparamatpoint pline p1)) (setq dist1 (vlax-curve-getdistatparam pline par1)) (setq mp1 (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p1 p3)) (setq p2 (vlax-curve-getclosestpointto pline p2)) (setq par2 (vlax-curve-getparamatpoint pline p2)) (setq dist2 (vlax-curve-getdistatparam pline par2)) (setq mp2 (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p2 p3)) (setq txt (rtos (abs (- dist1 dist2)) 2 3));<-- точность 3 знака, изменить по условию (setq elist (list '(0 . "TEXT") '(100 . "AcDbEntity") '(67 . 0) '(410 . "Model") (cons 8 lname) '(100 . "AcDbText") (cons 10 p3) (cons 11 (list (car p3) (+ (cadr p3) (/ (* (getvar "textsize")(getvar "dimscale")) 2)) 0.0)) (cons 40 (* (getvar "textsize")(getvar "dimscale"))) (cons 1 txt) '(50 . 0.0) '(41 . 1.0) '(51 . 0.0) (cons 7 (getvar "textstyle")) '(71 . 0) '(72 . 0) (cons 210 (list 0.0 0.0 1.0)) '(73 . 2) ) ) (entmake elist) (setq p1 p2) ) (redraw) ) (*error* nil) (princ) ) (prompt "\n --- Команда на выполнение \"D2P\" или \"d2p\" ---") (prin1) (or (vl-load-com) (princ) ) ;;--------------------------------- D2p.lsp ------------------------------------;;
[FONT=Arial]~'J'~[/FONT]
Форумы CADUser → Программирование → LISP → Отмерить по линии расстояние и поставить точку
Форум работает на PunBB, при поддержке Informer Technologies, Inc