Тема: Как автоматически вставить блоки в вершины полилинии?

Вставка блоков в вершины полилинии...!
Есть 1500 полилиний... в каждую вершину у каждой полилинии надо вставить блок....
как автоматизировать процесс...?
Спасите мой рассудок...)
С уважением!

Re: Как автоматически вставить блоки в вершины полилинии?

Выковырять координаты вершин полилинии и запихнуть их в список - это уже не раз обсуждалось...
А после замапкарить к этому списку '(lambda (x) (command "_.insert" "blockname" x ....) или нечто наподобие...

Re: Как автоматически вставить блоки в вершины полилинии?

Я не програмер.... можно по конкретней!
<<это уже не раз обсуждалось...>>---не мого за всем уследить (нет времени).
<<А после замапкарить к этому списку '(lambda (x) (command "_.insert" "blockname" x ....) или нечто наподобие...>>
---)))) глупости какие...))
Кинте пожалусто програму на лиспе..... ее я хотябы знаю как подрубить...
С УВАЖЕНИЕМ!

Re: Как автоматически вставить блоки в вершины полилинии?

Кинте пожалусто програму на лиспе

Ну так бы сразу и сказал....
Для LWPOLYLINE в WCS

;;; Вставка блока в вершины мнгожества LWPOLYLINE
(defun c:block2vertix (/ osm ss ptl e)
  (princ "\nУкажите полилинии >")
  (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (while (> (sslength ss) 0)
        (setq e (ssname ss 0))
        (ssdel e ss)
        (setq ptl (append ptl
                          (apply 'append
                                 (mapcar '(lambda (x)
                                            (if (= 10 (car x))
                                              (list (cdr x))
                                            ) ;_  if
                                          ) ;_  lambda
                                         (entget e)
                                 ) ;_  mapcar
                          ) ;_  apply
                  ) ;_  append
        ) ;_  setq
      ) ;_  while
      (setq osm (getvar "osmode"))
      ;; имя блока "123"
      (mapcar '(lambda (x) (command "_.insert" "123" x "" "" "")) ptl)
      (setvar "osmode" osm)
    ) ;_  progn
  ) ;_  if
  (princ)
) ;_  defun

Re: Как автоматически вставить блоки в вершины полилинии?

Не стреляйте.... "Бормотание" забыл убрать

(defun c:block2vertix (/ osm [b]ocmd[/b] ss ptl e)
..................
      (setq osm (getvar "osmode"))
      [b](setq ocmd (getvar "cmdecho"))[/b]
      ;; имя блока "123"
      (mapcar '(lambda (x) (command "_.insert" "123" x "" "" "")) ptl)
      [b](setvar "cmdecho" ocmd)[/b]
      (setvar "osmode" osm)
...................

Re: Как автоматически вставить блоки в вершины полилинии?

Низкий поклон вам Господин VK...
С Уважением!

Re: Как автоматически вставить блоки в вершины полилинии?

VK, а можно чтобы имя блока все-таки запрашивалось?

Re: Как автоматически вставить блоки в вершины полилинии?

Вроде так должно быть, не проверял....

(defun c:block2vertix (/ osm ocmd ss ptl e [b]bname[/b])
..............
(setq ocmd (getvar "cmdecho"))
;; запрос имени блока
[b](setq bname (getstring "\nИмя блока: "))[/b]
(mapcar '(lambda (x) (command "_.insert" [b]bname[/b] x "" "" "")) ptl)
................

Re: Как автоматически вставить блоки в вершины полилинии?

VK пишет:

Вроде так должно быть, не проверял....

(defun c:block2vertix (/ osm ocmd ss ptl e [b]bname[/b])
..............
(setq ocmd (getvar "cmdecho"))
;; запрос имени блока
[b](setq bname (getstring "\nИмя блока: "))[/b]
(mapcar '(lambda (x) (command "_.insert" [b]bname[/b] x "" "" "")) ptl)
................

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

Re: Как автоматически вставить блоки в вершины полилинии?

Вадим Иванов пишет:

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

А какой угол? правый или левый? внутренний или наружный?
По этому угол любой но соответственно меньше 180

(defun c:block2vertix_angle (/ osm ocmd ss ugl ptlv ptlugl ugl_v ptl e
        )
  (setq    old_ugl    (if old_ugl
          old_ugl
          180
        )      
    ugl    (getint
          (strcat "\n Enter the maximum angle 0°-180° <"(itoa old_ugl)">:")
        )
    old_ugl    (if ugl
          ugl
          old_ugl
        )
    ugl    (* (/ old_ugl 180.0) pi)
  )
  (princ "\nSelect Polyline:")
  (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (while (> (sslength ss) 0)
    (setq e (ssname ss 0))
    (ssdel e ss)
    (setq ptlv (apply 'append
              (mapcar '(lambda (x)
                     (if (= 10 (car x))
                       (list (cdr x))
                     ) ;_  if
                   ) ;_  lambda
                  (entget e)
              ) ;_  mapcar
           ) ;_  apply
    ) ;_  setq
    (while (caddr ptlv)
      (setq    ptlugl (if (< (if (> (setq ugl_v
                        (abs
                          (- (angle (cadr ptlv) (car ptlv))
                         (angle (cadr ptlv) (caddr ptlv))
                          )
                        )
                     )
                     pi
                  )
                (- (* 2 pi) ugl_v)
                ugl_v
                  )

                  ugl
               )
             (append ptlugl
                 (list (cadr ptlv))
             )
             ptlugl
               )
        ptlv   (cdr ptlv)
      )
    )
    (setq ptl (append ptl ptlugl))
      ) ;_  while
      (setq osm (getvar "osmode"))
      (setq ocmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
      (setvar "osmode" 0)
      ;; block name "123"

      (mapcar '(lambda (x) (vl-cmdf "_-ins ert" "123" x "" ""))
          ptl
      )
      (setvar "cmdecho" ocmd)
      (se tvar "osmode" osm)
    ) ;_  progn
  ) ;_  if
  (princ)
) ;_  defun

(изменено: Вадим Иванов, 11 января 2010г. 23:24:01)

Re: Как автоматически вставить блоки в вершины полилинии?

Спасибо большое.Работает класно. А можно коментариев добавить в код(я начинающий хотелось бы понимать что происходит).
(defun c:block2vertix_angle (/ osm ocmd ss ugl ptlv ptlugl ugl_v ptl e
       )
  (setq   old_ugl   (if old_ugl
        old_ugl
        180
      )     
   ugl   (getint
        (strcat "\n Enter the maximum angle 0°-180° <"(itoa old_ugl)">:")
      )
   old_ugl   (if ugl
        ugl
        old_ugl
      )
   ugl   (* (/ old_ugl 180.0) pi)
  )
  (princ "\nSelect Polyline:")
  (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (while (> (sslength ss) 0)
   (setq e (ssname ss 0))
   (ssdel e ss)
   (setq ptlv (apply 'append
           (mapcar '(lambda (x)
                 (if (= 10 (car x))
                   (list (cdr x))
                 ) ;_  if
               ) ;_  lambda
              (entget e)
           ) ;_  mapcar
         ) ;_  apply
   ) ;_  setq
   (while (caddr ptlv)
     (setq   ptlugl (if (< (if (> (setq ugl_v
                   (abs
                     (- (angle (cadr ptlv) (car ptlv))
                   (angle (cadr ptlv) (caddr ptlv))
                     )
                   )
                 )
                 pi
              )
            (- (* 2 pi) ugl_v)
            ugl_v
               )

               ugl
            )
          (append ptlugl
             (list (cadr ptlv))
          )
          ptlugl
             )
      ptlv   (cdr ptlv)
     )
   )
   (setq ptl (append ptl ptlugl))
      ) ;_  while
      (setq osm (getvar "osmode"))
      (setq ocmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
      (setvar "osmode" 0)
      ;; block name "blok12mm"

       (mapcar '(lambda (x) (command "_.ins ert" "blok12mm" x "" "" "")) ptl)
      (setvar "cmdecho" ocmd)
      (setvar "osmode" osm)
     
      (se tvar "cmdecho" ocmd)
      (se tvar "osmode" osm)
    ) ;_  progn
  ) ;_  if
  (princ)
) ;_  defun