Re: Отмерить по линии расстояние и поставить точку

Дмитрий Космос пишет:

Все, работает! Спасибо! Уже применяю в работе. Очень полезно.

Рад если так,

Успехов :)

[FONT=Arial]~'J'~[/FONT]

(изменено: fixo, 21 февраля 2012г. 12:05:23)

Re: Отмерить по линии расстояние и поставить точку

В догонку ещё одна поделка, как обещал
указывает расстояние между двумя выбранными точками
на кривой (линии, полилинии,сплайне)
При работе нужно учесть один нюанс, когда откроется
редактор мультитекста, нужно просто закрыть его причём неважно,
что текст там будет отсутствовать или будет что-то напечатано, если его не закрыть программа
вывалится, добавлен откат и восстановление переменных
Точки указывать аккуратно используя нужные привязки

;;---------------------------------   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]

Re: Отмерить по линии расстояние и поставить точку

Спасибо,тоже полезно. :)  А можно сюда тоже добавить сначала выбор линии?

Re: Отмерить по линии расстояние и поставить точку

fixo пишет:


В догонку ещё одна поделка, как обещал

указывает расстояние между двумя выбранными точками

на кривой (линии, полилинии,сплайне)



Все получается только один раз с конкретной кривой! Если бы все доделать... СПАСИБО!

Re: Отмерить по линии расстояние и поставить точку

Kosmos пишет:

Спасибо,тоже полезно.   А можно сюда тоже добавить сначала выбор линии?

Здесь линия выбирается с первой указанной точкой, просто
ссылка на нее в теле кода появляется далее по коду

Или я опять чего не понял?

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Vladimir Mich пишет:

Все получается только один раз с конкретной кривой! Если бы все доделать... СПАСИБО!

Это в теории можно, но я бы не стал,
если нужно все точно расставить
Либо нужно использовать отдельную программу, которая будет изначально
расставлять все блоки соответственно условиям...

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Просто, если обе точки на кривой являются точками пересечения этой кривой с другими линиями, то в этом случае, что б программа понимала какую кривую брать, думаю предварительный выбор линии был бы здесь тоже уместен.

Re: Отмерить по линии расстояние и поставить точку

Дмитрий Космос пишет:

Просто, если обе точки на кривой являются точками пересечения этой кривой с другими линиями, то в этом случае, что б программа понимала какую кривую брать, думаю предварительный выбор линии был бы здесь тоже уместен.

Пожалуй ты прав я чего-то не подумал об этом
Позже вернусь :)

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

@Дмитрий Космос

Пробуй измененный код из поста #27 еще раз

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

День добрый! Вот еще две идеи (одну из них я вынесу в новую тему):

Первая:
   Ваша команда PIK, но использовать не блок, а линию, проведенную предварительно. А чтобы область применения была шире, думаю было бы полезно использовать не одну лишь линию, а выбранный набор объектов. Шаги приблизительно те же:
1. Выбираем линию №1, на которой и хотим отмерить (в данном случ. произвести копирование)
2. Выбираем линию №2, проведенную заранее, которая и будет копироваться в одну или др. сторону относительно линии №1. Важно что бы при последующем выполнении команды положение в целом линии №2 относительно линии №1 сохранялось (угол относительно линии №1, расстояние до линии №1, если линия №2 проведена в стороне).
3. Выбираем сторону смещения
4. набираем расстояние.

Если использовать вместо линии №2 уже набор объектов, то получается почти команда PIK, только блок создается не заранее, а в процессе уже самой командой. что экономит немного времени.

Буду очень признателен, если задумка вернется кодом. :)

Вторая задача тут

Re: Отмерить по линии расстояние и поставить точку

Дмитрий Космос пишет:

День добрый! Вот еще две идеи (одну из них я вынесу в новую тему):

Первая:
Ваша команда PIK, но использовать не блок, а линию, проведенную предварительно. А чтобы область применения была шире, думаю было бы полезно использовать не одну лишь линию, а выбранный набор объектов. Шаги приблизительно те же:
1. Выбираем линию №1, на которой и хотим отмерить (в данном случ. произвести копирование)
2. Выбираем линию №2, проведенную заранее, которая и будет копироваться в одну или др. сторону относительно линии №1. Важно что бы при последующем выполнении команды положение в целом линии №2 относительно линии №1 сохранялось (угол относительно линии №1, расстояние до линии №1, если линия №2 проведена в стороне).
3. Выбираем сторону смещения
4. набираем расстояние.

Если использовать вместо линии №2 уже набор объектов, то получается почти команда PIK, только блок создается не заранее, а в процессе уже самой командой. что экономит немного времени.

Буду очень признателен, если задумка вернется кодом.   

Вторая задача тут

Дмитрий, сделай набросок того что ты хочешь в АвтоКаде
а то у меня с соображалкой прблемы и залей потом файл куда-нибудь
а ссылку скинь сюда или в приватные сообщения

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Возможно это не очень красиво - влезать в "чужие" темы, но в моем ModPlus есть функция Мультикопирование... Возможно она Вам поможет...

Re: Отмерить по линии расстояние и поставить точку

Александр Пекшев aka Modis пишет:

Возможно это не очень красиво - влезать в "чужие" темы, но в моем ModPlus есть функция Мультикопирование... Возможно она Вам поможет...

По-моему все как раз нормально, когда есть свобода выбора - это
только на пользу

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Александр Пекшев aka Modis пишет:

Мультикопирование... Возможно она Вам поможет...

Спасибо, что не прошли мимо. Попробовал мультикопирование - немного не то.

fixo пишет:

Дмитрий, сделай набросок того что ты хочешь в АвтоКаде

Выкладываю

Re: Отмерить по линии расстояние и поставить точку

@Дмитрий Космос
Скачал, завтра посмотрю

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Залил сюда:

http://files.mail.ru/PTL28G

Можно пробовать

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

fixo пишет:

Залил сюда:

http://files.mail.ru/PTL28G

Можно пробовать

Так это же моя ссылка?

Re: Отмерить по линии расстояние и поставить точку

Наверно я не то кликнул по слабости ума
Скачай отсюда
http://dl.dropbox.com/u/18024145/PIKB.LSP

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Вот Он, настоящий успех, модернизация рутиной работы! Ура!!! Но в строчке 221 кода заменил pi на цифру 0, чтоб не поворачивал на 180. Получилось то, что нам нужно.
Огромное Спасибо! Цель достигнута! :)  :)  :)

Re: Отмерить по линии расстояние и поставить точку

Можно ли вернуться к коду #27
Программа очень ПОЛЕЗНАЯ!
Хотелось бы изменить ее работу следующим образом:

Указываем в первом цикле первую точку на кривой, указываем направление, указываем вторую точку на кривой, указываем точку для вывода цифры. (Это все устраивает.)
Во втором и последующих циклах указываем ТОЛЬКО последующие точки на кривой и точки для вывода цифр. Размерные желтые стрелочки следует выводить в другой слой или отказаться от них, т. к. когда вынесешь 50 размеров все пространство ими забьется.

Re: Отмерить по линии расстояние и поставить точку

Vladimir Mich пишет:

Можно ли вернуться к коду #27
Программа очень ПОЛЕЗНАЯ!
Хотелось бы изменить ее работу следующим образом:

Указываем в первом цикле первую точку на кривой, указываем направление, указываем вторую точку на кривой, указываем точку для вывода цифры. (Это все устраивает.)
Во втором и последующих циклах указываем ТОЛЬКО последующие точки на кривой и точки для вывода цифр. Размерные желтые стрелочки следует выводить в другой слой или отказаться от них, т. к. когда вынесешь 50 размеров все пространство ими забьется.

Посмотрю попозже, сейчас не могу

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Исправлю свое предыдущее сообщение:
Vladimir Mich пишет:
Можно ли вернуться к коду #27
Программа очень ПОЛЕЗНАЯ!
Хотелось бы изменить ее работу следующим образом:

Указываем в первом цикле первую точку на кривой, указываем вторую точку на кривой, указываем точку для вывода цифры. (Это все устраивает.)
Во втором и последующих циклах указываем ТОЛЬКО последующие точки на кривой и точки для вывода цифр. Размерные желтые стрелочки следует выводить в другой слой или отказаться от них, т. к. когда вынесешь 50 размеров все пространство ими забьется.
Спасибо!

Re: Отмерить по линии расстояние и поставить точку

Vladimir Mich пишет:

Размерные желтые стрелочки следует выводить в другой слой или отказаться от них

Не ясно тогда, где и в каком виде должен позиционироваться текст
(точка вставки, угол поворота отностельно кривой), могут быть варианты...

[FONT=Arial]~'J'~[/FONT]

Re: Отмерить по линии расстояние и поставить точку

Текст должен выводиться точно также как и сейчас выводится, только желательно не выводить стрелочки (или выводить их в другой слой, так как они закрывают чертеж ) и повторно в одном сеансе работы указывать одну и туже точку (точку начала отсчета) не совсем удобно.

Re: Отмерить по линии расстояние и поставить точку

Пробуй такой вариант

;;---------------------------------   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]

Сообщения с 26 по 50 из 96

Тему читают: 1 гость

Страницы Назад 1 2 3 4 Далее

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Форумы CADUser → Программирование → LISP → Отмерить по линии расстояние и поставить точку