Тема: Автоматическая простановка номеров вершин полилинии

Подскажите VBA-код, который автоматом проставлял в выделенной полилинии номера вершин (1-начало полилинии, 2, ...)

Re: Автоматическая простановка номеров вершин полилинии

А тебе надо именно VBA-шный код? Лиспом-то ИМХО проще будет...

Re: Автоматическая простановка номеров вершин полилинии

Можно и в лиспе, просто VBA-мне более понятен, а в лиспе я не шарю.
Вообще, нужно, чтобы ставилось обозначение точки (типа окружности) и номер точки (вершины полилинии)

Re: Автоматическая простановка номеров вершин полилинии

Ну на всякий случай лисповой вариант (потому как через VBA я не очень люблю выбирать примитивы :))

(defun c:pline-vertex (/          adoc             ent
               vert_lst          counter         radius
               text_height      _kpblc-get-ent-no-error-by-type
               )
;;; Безошибочный выбор примитива по типу. Возвращает имя примитива
;;;    Параметры вызова:
;;;        enttype        тип примитива ("LINE", "INSERT" etc)
;;;        msg        сообщение.
;;;    Примеры вызова:
;;;(_kpblc-get-ent-no-error-by-type "LINE" nil)
  (defun _kpblc-get-ent-no-error-by-type (enttype msg / ent)
    (setvar "errno" 0)
    (if    (not msg)
      (setq msg "Выберите элемент")
      ) ;_ end of if
    (setq msg (strcat (vl-string-trim "\n: " msg) " : "))
    (while (or (not (setq ent (ssget "_+.:E:S" (list (cons 0 enttype)))))
           (= 7 (getvar "errno"))
           ) ;_ end of or
      (setvar "errno" 0)
      (princ "\nВыбран объект не того типа!")
      ) ;_ end of while
    (cond
      ((= (getvar "errno") 52)
       nil
       )
      (t (ssname ent 0))
      ) ;_ end of cond
    ) ;_ end of defun
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (if (not (setq radius (getdist "\nРадиус окружности <5.0> : ")))
    (setq radius 5.)
    ) ;_ end of if
  (if (not (setq text_height
          (getdist
            (strcat
              "\nВысота текста <"
              (if
            (=
              (cdr
                (assoc
                  40
                  (entget (tblobjname "style" (getvar "textstyle"))
                      ) ;_ end of entget
                  ) ;_ end of assoc
                ) ;_ end of cdr
              0.
              ) ;_ end of =
             "2.5"
             (rtos
               (cdr
                 (assoc
                   40
                   (entget (tblobjname "style" (getvar "textstyle"))
                       ) ;_ end of entget
                   ) ;_ end of assoc
                 ) ;_ end of cdr
               2
               ) ;_ end of rtos
             ) ;_ end of if
              "> : "
              ) ;_ end of strcat
            ) ;_ end of getdist
         ) ;_ end of setq
       ) ;_ end of not
    (setq text_height 2.5)
    ) ;_ end of if
  (if
    (and (setq
       ent (_kpblc-get-ent-no-error-by-type
         "LWPOLYLINE"
         "Выберите полилинию : "
         ) ;_ end of _kpblc-get-ent-no-error-by-type
       ) ;_ end of setq
     (setq
       vert_lst (vl-remove-if-not '(lambda (x) (= (car x) dxf)) (entget ent))
       ) ;_ end of setq
     (setq counter 0)
     ) ;_ end of and
     (progn
       (mapcar
     '(lambda (x)
        (setq counter (1+ counter))
        (entmake (list '(0 . "CIRCLE")
               '(67 . 0)
               (cons 10 x)
               (cons 40 radius)
               '(210 0. 0. 1.)
               ) ;_ end of list
             ) ;_ end of entmake
        (entmake (list (cons 0 "TEXT")
               (cons 100 "AcDbEntity")
               (cons 67 0)
               (cons 100 "AcDbText")
               (cons 10 (mapcar '(lambda (a b) (+ a b)) x '(5. 5.)))
               (cons 40 text_height)
               (cons 1 (rtos counter 2))
               '(50 . 0.0)
               '(41 . 1.0)
               '(51 . 0.0)
               '(71 . 0)
               '(72 . 0)
               '(210 0.0 0.0 1.0)
               '(100 . "AcDbText")
               '(73 . 0)
               ) ;_ end of list
             ) ;_ end of entmake
        ) ;_ end of lambda
     vert_lst
     ) ;_ end of mapcar
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

Re: Автоматическая простановка номеров вершин полилинии

Упс, при копировании ошибки. Вот исправлено:

(defun c:pline-vertex (/          adoc             ent
               vert_lst          counter         radius
               text_height      _kpblc-get-ent-no-error-by-type
               )
;;; Безошибочный выбор примитива по типу. Возвращает имя примитива
;;;    Параметры вызова:
;;;        enttype        тип примитива ("LINE", "INSERT" etc)
;;;        msg        сообщение.
;;;    Примеры вызова:
;;;(_kpblc-get-ent-no-error-by-type "LINE" nil)
  (defun _kpblc-get-ent-no-error-by-type (enttype msg / ent)
    (setvar "errno" 0)
    (if    (not msg)
      (setq msg "Выберите элемент")
      ) ;_ end of if
    (setq msg (strcat (vl-string-trim "\n: " msg) " : "))
    (while (or (not (setq ent (ssget "_+.:E:S" (list (cons 0 enttype)))))
           (= 7 (getvar "errno"))
           ) ;_ end of or
      (setvar "errno" 0)
      (princ "\nВыбран объект не того типа!")
      ) ;_ end of while
    (cond
      ((= (getvar "errno") 52)
       nil
       )
      (t (ssname ent 0))
      ) ;_ end of cond
    ) ;_ end of defun
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (if (not (setq radius (getdist "\nРадиус окружности <5.0> : ")))
    (setq radius 5.)
    ) ;_ end of if
  (if (not (setq text_height
          (getdist
            (strcat
              "\nВысота текста <"
              (if
            (=
              (cdr
                (assoc
                  40
                  (entget (tblobjname "style" (getvar "textstyle"))
                      ) ;_ end of entget
                  ) ;_ end of assoc
                ) ;_ end of cdr
              0.
              ) ;_ end of =
             "2.5"
             (rtos
               (cdr
                 (assoc
                   40
                   (entget (tblobjname "style" (getvar "textstyle"))
                       ) ;_ end of entget
                   ) ;_ end of assoc
                 ) ;_ end of cdr
               2
               ) ;_ end of rtos
             ) ;_ end of if
              "> : "
              ) ;_ end of strcat
            ) ;_ end of getdist
         ) ;_ end of setq
       ) ;_ end of not
    (setq text_height 2.5)
    ) ;_ end of if
  (if
    (and (setq
       ent (_kpblc-get-ent-no-error-by-type
         "LWPOLYLINE"
         "Выберите полилинию : "
         ) ;_ end of _kpblc-get-ent-no-error-by-type
       ) ;_ end of setq
     (setq
       vert_lst (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
       ) ;_ end of setq
     (setq counter 0)
     ) ;_ end of and
     (progn
       (mapcar
     '(lambda (x)
        (setq counter (1+ counter))
        (entmake (list '(0 . "CIRCLE")
               '(67 . 0)
               x
               (cons 40 radius)
               '(210 0. 0. 1.)
               ) ;_ end of list
             ) ;_ end of entmake
        (entmake
          (list (cons 0 "TEXT")
            (cons 100 "AcDbEntity")
            (cons 67 0)
            (cons 100 "AcDbText")
            (cons 10 (mapcar '(lambda (a b) (+ a b)) (cdr x) '(5. 5.)))
            (cons 40 text_height)
            (cons 1 (rtos counter 2))
            '(50 . 0.0)
            '(41 . 1.0)
            '(51 . 0.0)
            '(71 . 0)
            '(72 . 0)
            '(210 0.0 0.0 1.0)
            '(100 . "AcDbText")
            '(73 . 0)
            ) ;_ end of list
          ) ;_ end of entmake
        ) ;_ end of lambda
     vert_lst
     ) ;_ end of mapcar
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

Re: Автоматическая простановка номеров вершин полилинии

Public Sub polypoint()
Dim pl As AcadLWPolyline
Dim sel As AcadSelectionSet
Dim p1(2) As Double
Dim t As AcadText
Dim c As AcadCircle
Dim n As Integer
Set sel = ThisDrawing.SelectionSets.Add("select")
sel.SelectOnScreen
For Each pl In sel
For n = 0 To UBound(pl.Coordinates) - 1 Step 2
p1(0) = pl.Coordinates(n)
p1(1) = pl.Coordinates(n + 1)
p1(2) = 0
Set t = ThisDrawing.ModelSpace.AddText(Str(n + 1), p1, 10)
Set c = ThisDrawing.ModelSpace.AddCircle(p1, 5)
Next
Next
sel.Delete
End Sub