Тема: Автоматическая простановка номеров вершин полилинии
Подскажите VBA-код, который автоматом проставлял в выделенной полилинии номера вершин (1-начало полилинии, 2, ...)
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Автоматическая простановка номеров вершин полилинии
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите VBA-код, который автоматом проставлял в выделенной полилинии номера вершин (1-начало полилинии, 2, ...)
А тебе надо именно VBA-шный код? Лиспом-то ИМХО проще будет...
Можно и в лиспе, просто VBA-мне более понятен, а в лиспе я не шарю.
Вообще, нужно, чтобы ставилось обозначение точки (типа окружности) и номер точки (вершины полилинии)
Ну на всякий случай лисповой вариант (потому как через 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
Упс, при копировании ошибки. Вот исправлено:
(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
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
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Автоматическая простановка номеров вершин полилинии
Форум работает на PunBB, при поддержке Informer Technologies, Inc