Тема: Как из точки построить отрезки к вершинам полилинии ?
Как из точки построить отрезки к вершинам полилинии ? Поиском не нашел.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Как из точки построить отрезки к вершинам полилинии ?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как из точки построить отрезки к вершинам полилинии ? Поиском не нашел.
Функция составлена из элементов кода форума
(defun get_vertices (obj / i verts) (setq i (vlax-curve-getendparam obj)) (while (>= i 0) (setq verts (cons (vlax-curve-getpointatparam obj i) verts) i (- i 1) ) ) verts ) ;|======================================================================================= * Функция возвращает vla-активное пространство (лист / модель). * Параметры вызова: * Нет * Примеры вызова: (_kpblc-get-active-space-obj) =======================================================================================|; (defun _kpblc-get-active-space-obj () (setq *kpblc-acad* (vlax-get-acad-object) *kpblc-activedoc* (vla-get-activedocument *kpblc-acad*) ) ;_ end of setq (if (and (zerop (vla-get-activespace *kpblc-activedoc*)) (= :vlax-false (vla-get-mspace *kpblc-activedoc*)) ) ;_ end of and (vla-get-paperspace *kpblc-activedoc*) (vla-get-modelspace *kpblc-activedoc*) ) ;_ end of if ) ;_ end of defun (defun draw-polyline (lst) ; Функция отрисовки полилинии по заданному списку ;;; Преобразовываем полученный список точек в гарантированно ;;; список 3Д-точек и сразу преобразовываем его в одномерный (setq lst (apply 'append (mapcar '(lambda (x) (list (car x) (cadr x) (cond ((caddr x)) (t 0.) ) ;_ end of cond ) ;_ end of list ) ;_ end of lambda lst ) ;_ end of mapcar ) ;_ end of apply ) ;_ end of setq (vla-addpolyline ; добавляем полилинию (_kpblc-get-active-space-obj) (vlax-make-variant ; создаем вариант (vlax-safearray-fill ; из заполняемого безопасного массива (vlax-make-safearray ; создаем безопасный массив vlax-vbdouble ; с элементами типа Double (числа двойной точности) (cons 0 (1- (length lst))) ; длиной в полученный lst. ) ;_ end of vlax-make-safearray lst ; и заполняем данными из списка ) ;_ end of vlax-safearray-fill ) ;_ end of vlax-make-variant ) ;_ end of vla-AddPolyline ) ;_ end of defun (defun c:point-poly ( / ) (vl-load-com) (setq obj_one nil) (setq lst_sectPoly nil) (setq obj_one (car (entsel "\nУкажите полилинию <Отмена> : "))) (if (= obj_one nil) (princ "\nНичего не выбрано...")) (setq obj_one (vlax-ename->vla-object obj_one)) (setq vert_poly (get_vertices obj_one)) (setq pointPly (getpoint "\nУкажите точку <Отмена> : ")) (foreach item vert_poly (draw-polyline (list item pointPly)) ) )
Может, проще сделать наподобие
(vl-load-com) (defun test (/ adoc pt ent) (if (and (= (type (setq pt (vl-catch-all-apply (function (lambda () (getpoint "\nУкажите точку <Отмена> : "))))) ) ;_ end of type 'list ) ;_ end of = (= (type (setq ent (vl-catch-all-apply (function (lambda () (car (entsel "\nУкажите полилинию <Отмена> : ")))))) ) ;_ end of type 'ename ) ;_ end of = (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE") ) ;_ end of and (progn (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) (setq ent (entget ent)) (mapcar (function (lambda (x) (setq x (cdr x)) (entmakex (list (cons 0 "LINE") (cons 10 (trans x (cdr (assoc 210 ent)) 0)) (cons 11 (trans pt 1 0))) ) ;_ end of entmakex ) ;_ end of lambda ) ;_ end of function (vl-remove-if-not (function (lambda (x) (= (car x) 10) ) ;_ end of lambda ) ;_ end of function ent ) ;_ end of vl-remove-if-not ) ;_ end of mapcar (vla-endundomark adoc) ) ;_ end of progn ) ;_ end of if (princ) ) ;_ end of defun
На немировых системах координат не проверял.
Спасибо огромное это то что надо !!!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → Как из точки построить отрезки к вершинам полилинии ?
Форум работает на PunBB, при поддержке Informer Technologies, Inc