(изменено: Дмитрий Кос, 1 ноября 2010г. 19:07:06)

Тема: Как создать выноску Пикетажа по оси трассы (полилинии)

Здравствуйте! Очень нуже код, который бы расставлял пикетаж по полилинии. Например есть трасса дороги (полилиния). Выбираю её, щелкаю место, где нужно подписать Пикетаж (расстояние от начала полилинии до выбранной точки на полилинии) и после правого клика выбираю место надписи выноски. Было бы еще неплохо иметь возможность выбора расположения текста, например вертикально, горизонтально или перпендикулярно касательной к полилинии в точке, где узнаем Пикетаж. Формат Пикетажа ПК 00+00,00.
Думаю многим дорожникам это было бы очень полезно.
Кстати огромное спасибо всем, кто разрабатывает коды! Очень многое выложенное здесь - Бесценно! :)

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

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

Здравствуйте! Очень нуже код, который бы расставлял пикетаж по полилинии. Например есть трасса дороги (полилиния). Выбираю её, щелкаю место, где нужно подписать Пикетаж (расстояние от начала полилинии до выбранной точки на полилинии) и после правого клика выбираю место надписи выноски. Было бы еще неплохо иметь возможность выбора расположения текста, например вертикально, горизонтально или перпендикулярно касательной к полилинии в точке, где узнаем Пикетаж. Формат Пикетажа ПК 00+00,00.
Думаю многим дорожникам это было бы очень полезно.
Кстати огромное спасибо всем, кто разрабатывает коды! Очень многое выложенное здесь - Бесценно!

ПОсмотри прграммы из постов #32 и #36 здесь:
http://www.cadtutor.net/forum/showthrea … ling/page4

(изменено: Дмитрий Кос, 1 ноября 2010г. 21:01:03)

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

Запускается с команды STAN ? Я правильно понял?
Если так, то это тоже полезная программа, но не то что мне хотелось бы. Нужен пикет в конкретной одной точке, в которую я ткну мышкой.

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

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

Запускается с команды STAN ? Я правильно понял?
Если так, то это тоже полезная программа, но не то что мне хотелось бы. Нужен пикет в конкретной одной точке, в которую я ткну мышкой.

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

(изменено: Victor, 2 ноября 2010г. 13:22:53)

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

Приготовься что начало окжется концом. Не слабо сделать реверс линии без программных методов.

(vl-load-com)
(defun c:tst( )
(setq obj (entsel "Klik polyline? "))
(setq pln (car obj))
(setq krd (cadr obj))
(setq krd_n (vlax-curve-getClosestPointTo pln krd))
(setq dis_pl (vlax-curve-getDistAtPoint pln krd_n))
(princ "\n")
(setq f (fix(/ dis_pl 100)))
(setq j (* f 100))
(setq r (- dis_pl j))
(setq krd (getpoint "Point of piket?"))
(entmake(list '(0 . "TEXT") '(100 . "AcDbEntity") '(100 . "AcDbText")
               (append '(10) krd) '(40 . 0.2) (cons 1 (strcat "PK " (itoa f) "+" (rtos r 2 2)))
              '(7 . "Standard") ) )
)

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

Воооооо!!! Victor, Спасибо огромное! Это, то что нужно! Реверс впринципе есть в Pltools.
Можно ли еще в этот код добавить выноску с возможностью выбора ориентации: вертикально, горизонтально, перпендикулярно полилинии, но что б еще запоминал последнее выбранное?

Как высоту текста и шрифт менять в коде - понятно. А вот чтобы курсив был и сжатие нужное - это что нужно прописать?

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

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

 (vl-load-com) 
(defun c:pk( ) 
(setq obj (entsel "Klik polyline? ")) 
(setq pln (car obj)) 
(setq krd (cadr obj)) 
(setq krd_n (vlax-curve-getClosestPointTo pln krd)) 
(setq dis_pl (vlax-curve-getDistAtPoint pln krd_n)) 
(princ "\n") 
(setq f (fix(/ dis_pl 100))) 
(setq j (* f 100)) 
(setq r (- dis_pl j)) 
(setq krd (getpoint "Point of piket?")) 
   (initget 1 "W H P")
   (setq key (getkword "\n(W)ertical/(H)orisontal/(P)erpendicular: "))
   (if(or(= key "W")(= key "w"))(setq ugol 1.570796326))
   (if(or(= key "H")(= key "s"))(setq ugol 0.0))
   (if(or(= key "P")(= key "o"))(progn
  (setq prm_pnt  (vlax-curve-getParamAtPoint pln krd_n))
  (setq proiz (vlax-curve-getFirstDeriv pln prm_pnt))
  (setq ugol (-(angle '(0 0 0) proiz) 1.570796326))
  ))
(entmake(list '(0 . "TEXT") '(100 . "AcDbEntity") '(100 . "AcDbText") 
               (append '(10) krd) '(40 . 0.2) (cons 1 (strcat "PK " (itoa f) "+" (rtos r 2 2))) 
               (cons 50  ugol)'(41 . 0.5)'(51 . 0.3)'(7 . "Standard") ) ) 

)

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

Спасибо! Все работает.  :) Выноски, расположение в отдельном слое за мной...

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

Поставил работает но как то странно.
создал полилинию разметил ее по 100метров, воспользовался лиспом в итоге:
PK 0+68.76   должно быть 1+0,00
PK 1+35.99   должно быть 2+0,00
PK 2+53.98   должно быть 3+0,00
Очень нужна это ценная прога.

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

Да проблема такая есть. Решения пока не нашел к сожалению.

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

revers?

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

revers не помогает с ним
PK 0+23.29 реверс PK 4+82.73
PK 1+96.44 реверс PK 3+31.87

Еще проблема сильно неточно меряет сделал тупо полилинию с шагом 100 метров пикеты выдал выше.
Еще не выдает начало полилинии как 0+00.
Прям беда а так очень ценная прога получилась бы.

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

В Civil 3D очень полно реализованы функции работы с планами, в том числе и расстановка пикетажа.

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; The definition of picket an point (not necessarily on the axis of the route)
;; Measure distance along the polyline from begin to the normal to the point
;;
;; Определение пикета произвольной точки (необязательно на оси трассы)
;; Измерение расстояния вдоль полилинии от её начала до нормали к точке
;;
;; Created by:  AlexKniga       2017-07-04
;; Posted https://www.caduser.ru/forum/topic48467.html
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(vl-load-com)
(defun c:pk( )
  (setq saveecho (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (setq obj (entsel "Select polyline: "))
  (setq pln (car obj))
  (princ "\n")
  (while (setq krd (getpoint "Point of picket: "))
    (setq krd_n (vlax-curve-getClosestPointTo pln krd))
    (setq dis_pl (vlax-curve-getDistAtPoint pln krd_n))
    ;;(princ "\n")
    ;;(setq f (fix(/ dis_pl 100)))
    ;;(setq r (- dis_pl (* f 100)))
    ;;(setq p (strcat "ПК " (itoa f) "+" (rtos r 2 3)))
    (princ (strcat (setq p (convert-distance-to-pk-string dis_pl 3 F)) "\n"))
    (command "_text" krd "" "" p) ;; Для стиля с задаваемой высотой текста
    ;;(command "_text" krd "" p) ;; Для стиля с фиксированной высотой текста
    ;;(entmake(list '(0 . "TEXT") '(100 . "AcDbEntity") '(100 . "AcDbText")
    ;;               (append '(10) krd) '(40 . 0.2) (cons 1 p) '(7 . "Standard")
    ;;        )
    ;;)
  )
  (setvar "CMDECHO" saveecho)
)

(defun convert-distance-to-pk-string (input-distance accuracy flag-cut-0 / )
  ; выражение длины в виде строки пикета с заданной точностью
  ; 159.189 -> "1+59.19"
  (setq piket (fix (/ input-distance 100.0)))
  (setq plus (atof (rtos (rem input-distance 100.0) 2 accuracy)))
  (if (or (> plus 100.0) (= plus 100.0))
    (progn
      (setq piket (+ piket 1))
      (setq plus (- plus 100.0))
      )
    )
  (strcat
    "ПК "
    (itoa piket)
    (if (and flag-cut-0 (not(> (abs plus) 0.0)))
      ""
      (strcat
    "+"
    (if (< plus 10.0) "0" "")
    (rtos plus 2 accuracy)
    )
      )
    )
  )

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

Критика приветствуется.

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

AlexKniga, ваш lisp просто супер! Очень помогает в работе, для расстановки ТСОДД.
А есть ли возможность его доработать - чтобы пикет не в месте клика появлялся, а скажем забивался в атрибут выбранного блока?

Вводим команду - выбираем блоки - выбираем ось - жмем ввод и в атрибут блока записывается пикет!

Такой вариант думаю многим необходим. Заранее спасибо!

Re: Как создать выноску Пикетажа по оси трассы (полилинии)

AlexKniga пишет:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; The definition of picket an point (not necessarily on the axis of the route)
;; Measure distance along the polyline from begin to the normal to the point
;;
;; Определение пикета произвольной точки (необязательно на оси трассы)
;; Измерение расстояния вдоль полилинии от её начала до нормали к точке
;;
;; Created by:  AlexKniga       2017-07-04
;; Posted https://www.caduser.ru/forum/topic48467.html
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(vl-load-com)
(defun c:pk( )
  (setq saveecho (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (setq obj (entsel "Select polyline: "))
  (setq pln (car obj))
  (princ "\n")
  (while (setq krd (getpoint "Point of picket: "))
    (setq krd_n (vlax-curve-getClosestPointTo pln krd))
    (setq dis_pl (vlax-curve-getDistAtPoint pln krd_n))
    ;;(princ "\n")
    ;;(setq f (fix(/ dis_pl 100)))
    ;;(setq r (- dis_pl (* f 100)))
    ;;(setq p (strcat "ПК " (itoa f) "+" (rtos r 2 3)))
    (princ (strcat (setq p (convert-distance-to-pk-string dis_pl 3 F)) "\n"))
    (command "_text" krd "" "" p) ;; Для стиля с задаваемой высотой текста
    ;;(command "_text" krd "" p) ;; Для стиля с фиксированной высотой текста
    ;;(entmake(list '(0 . "TEXT") '(100 . "AcDbEntity") '(100 . "AcDbText")
    ;;               (append '(10) krd) '(40 . 0.2) (cons 1 p) '(7 . "Standard")
    ;;        )
    ;;)
  )
  (setvar "CMDECHO" saveecho)
)

(defun convert-distance-to-pk-string (input-distance accuracy flag-cut-0 / )
  ; выражение длины в виде строки пикета с заданной точностью
  ; 159.189 -> "1+59.19"
  (setq piket (fix (/ input-distance 100.0)))
  (setq plus (atof (rtos (rem input-distance 100.0) 2 accuracy)))
  (if (or (> plus 100.0) (= plus 100.0))
    (progn
      (setq piket (+ piket 1))
      (setq plus (- plus 100.0))
      )
    )
  (strcat
    "ПК "
    (itoa piket)
    (if (and flag-cut-0 (not(> (abs plus) 0.0)))
      ""
      (strcat
    "+"
    (if (< plus 10.0) "0" "")
    (rtos plus 2 accuracy)
    )
      )
    )
  )

AlexKniga, спасибо за Lisp, но у меня префикс блока почему то отображается непонятными иероглифами. Скрин приложил. Подскажите пожалуйста в чем проблема уменя. И можно дополнить код проги что бы пикетаж указывался в выноске? то есть по второму клику проставлялась выноска в указанном месте.

Post's attachments

Снимок.JPG 90.8 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.