| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как узнать центр кольца?

Как узнать центр кольца?

Ответ
Поиск в этой теме
Непрочитано 24.10.2019, 10:47 #1
Как узнать центр кольца?
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 470

Командой _donut вставляется объект "кольцо".
Фактически, как я понимаю - "замкнутая полилиния".

Нужно узнать её точку вставки, она же центр кольца.

В списке (entget <примитив>) этой точки нет.

Возможно, она есть где-нибудь в #<variant 8197 ...> ?

т.е.

(setq obj (vlax-EName->vla-Object e)) ;Получаем #<VLA-OBJECT
(setq vvv (vla-Get-Coordinates obj)) ; Получаем #<variant 8197 ...>

А как из этого "варианта" точку центра выдернуть-то?
__________________
Счастливо, Алексей!
Просмотров: 1403
 
Непрочитано 24.10.2019, 10:55
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846


Самый простой вариант - получить boundingbox и на его основе вычислить центр
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.10.2019, 10:58
1 | 1 #3
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


у этого кольца/полилинии две вершины, расположенные на углах 0 и 180 градусов, соответственно центр бублика получается если взять первую вершину и прибавить к ней половину вектора от вершины 1 к вершине 2. Ну или можете взять одну из граней бублика, взять ее выпуклость и получить центр от туда.
Boxa вне форума  
 
Непрочитано 24.10.2019, 10:59
1 | 1 #4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846


Как пример:
Код:
[Выделить все]
 (defun t1 (/ ent mi ma)
  (if (setq ent (car (entsel "\nSelect entity : ")))
    (progn (vla-getboundingbox (vlax-ename->vla-object ent) 'mi 'ma)
           (mapcar (function (lambda (x) (* x 0.5)))
                   (apply (function mapcar) (cons (function +) (mapcar (function vlax-safearray->list) (list mi ma))))
                   ) ;_ end of mapcar
           ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.11.2019, 08:17
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Вся геометрия по полилинии есть на Afralisp Page I и Page II и у Lee Mac'a Bulge Conversion Functions

Цитата:
Сообщение от Boxa Посмотреть сообщение
Ну или можете взять одну из граней бублика, взять ее выпуклость и получить центр от туда.
Вариант вычисления по кривизне
Код:
[Выделить все]
 
(defun C:TEST (/ ent vx bulge lst)
  (vl-load-com)
  (if (setq ent (car (entsel "\nSelect entity : ")))
    (progn
      (setq ent (entget ent))
      (setq vx (massoc 10 ent))
      (setq bulge (cdr (assoc 42 ent)))
      (setq lst (polyarc-data bulge (car vx) (cadr vx)))
      (alert (strcat "Center "
                     (vl-prin1-to-string (car lst))
                     "\nRadius="
                     (vl-prin1-to-string (cadr lst))
                     "\nAngle="
                     (vl-prin1-to-string (caddr lst))
             ) ;_ end of strcat
      ) ;_ end of alert
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
(defun polyarc-data (bu p1 p2 / ang rad cen area cg)
;;; Polyarc-data
;;; Returns a list of the center, radius and angle of a 'polyarc'.
  (setq ang (* 2 (atan bu))
        rad (/ (distance p1 p2)
               (* 2 (sin ang))
            ) ;_ end of /
        cen (polar p1
                   (+ (angle p1 p2) (- (/ pi 2) ang))
                   rad
            ) ;_ end of polar
  ) ;_ end of setq
  (list cen (abs rad) ang)
) ;_ end of defun
(defun massoc (key alist)
  (mapcar 'cdr
          (vl-remove-if-not
            (function (lambda (x) (= key (car x))))
            alist
          ) ;_ end of vl-remove-if-not
  ) ;_ end of mapcar
) ;_ end of defun 
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 02.11.2019 в 08:23.
VVA вне форума  
 
Непрочитано 02.11.2019, 09:27
#6
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Почему просто не взять две вершины полилинии (а у кольца их две) и не вычислить точку по центру между ними?
Код:
[Выделить все]
 (setq pr (entget (car (entsel)))
      pt (assoc 10 pr)
      pt1 (cdr (assoc 10 (cdr (member pt pr))))
      pt2 (cdr pt)
      pt_centr (polar pt1 (angle pt1 pt2) (/ (distance pt1 pt2) 2))
      )
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как узнать центр кольца?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить к какому объекту относится центр? Den Commander AutoCAD 4 21.03.2017 18:17
Изогнутые пружинные упорные кольца для осевого крепления подшипников качения Сталкивался ли кто, есть ли такие стандартные кольца? kpd_110 Машиностроение 8 12.06.2016 13:47
VBA узнать центр дуги в полилинии AnteC Программирование 3 02.02.2013 01:27
Как задать жёсткость стержня в виде металлического кольца заполненного бетоном с арматурой внутри кольца? МишаИнженер Лира / Лира-САПР 5 19.10.2011 17:33
Центр тяжести плоской фигуры , геом. центр контура ? bdfy AutoCAD 1 10.05.2005 17:21