Тема: LISP. Определение координат центра прямоугольной ячейки. Примеры

Прямоугольная ячейка должна быть пуста и может быть образована отрезками, полиниями или прямоугольником.

;**************** cen_rec.lsp *********************************************
;       Определение координат центра прямоугольной ячейки.
;
(defun C:CEN_REC ( / pp echo osm reg minp maxp pmin pmax pxy)
(vl-load-com)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq pp (getpoint "\n Укажите точку внутри ячейки: "))
(vl-cmdf "_BOUNDARY" "_A" "_O" "_R" "" pp "")
(setq reg (entlast))
      (setq vlaobj(vlax-ename->vla-object reg)); Преобразование области в VLA-объект.
      (vla-GetBoundingBox vlaobj 'minp 'maxp)  ; Массивы кординат диагонали прямоугольника.
      (setq
           pmin(vlax-safearray->list minp)     ; Преобразование массивов
           pmax(vlax-safearray->list maxp)     ; в списки.
           pxy (list                           ; Вычисление координат центра прямоугольника.
               (+(car pmin)(/(-(car pmax)(car pmin))2))
               (+(cadr pmin)(/(-(cadr pmax)(cadr pmin))2))
               )
      ); setq
(vl-cmdf "_ERASE" reg "")
(princ "\n Одна область удалена.")
(princ "\n Координаты центра ячейки: ")(princ pxy)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Возможный макрос для кнопки или пункта меню для предыдущей программы:

^C^C^P(if (not C:CEN_REC) (load "cen_rec")) CEN_REC

Пример использования предыдущей программы:

;**************** cr_text.lsp ******************************
;       Текст, выравненный по центру прямоугольной ячейки.
;       Текст пишется текущим стилем.
;       Автор Владимир Громов.
;
(defun C:CR_TEXT ( / pp echo osm reg minp maxp pmin pmax pxy
                     hit htt ht txt)
(vl-load-com)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(initget 6)
(setq pp (getpoint "\n Укажите точку внутри ячейки: "))
(vl-cmdf "_BOUNDARY" "_A" "_O" "_R" "" pp "")
(setq reg (entlast))
    (if reg
        (progn
        (setq vlaobj(vlax-ename->vla-object reg))
        (vla-GetBoundingBox vlaobj 'minp 'maxp)
        (setq
             pmin(vlax-safearray->list minp)
             pmax(vlax-safearray->list maxp)
             pxy (list
                 (+(car pmin)(/(-(car pmax)(car pmin))2))
                 (+(cadr pmin)(/(-(cadr pmax)(cadr pmin))2))
                 )
        ); setq
        (vl-cmdf "_ERASE" reg "")
;        (princ "\n Одна область удалена.")
        (setq hit (rtos (getvar "TEXTSIZE")))
        (princ (strcat "\n Высота текста <" hit ">: "))
        (setq ht (getstring))
        (if (= ht "") (setq ht (atof hit))
        (setq ht (atof ht)))
        (setq txt (getstring T "\n Введите текст: "))
        (vl-cmdf "_TEXT" "_J" "_M" pxy ht "" txt)
        ); progn
     ); if
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)

Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:CR_TEXT) (load "cr_text")) CR_TEXT

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Замечание  к программе CR_TEXT.
Шрифт текущего стиля не должен иметь фиксированную высоту.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Замечательная вещь cen_rec.lsp - спасибо за нее.
Вот только хотелось бы видить координаты не переключаясь в текстовое окно. У меня AutoCAD 2006 и командная строка отключена.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

> Nino
Вариант "cen_rec" с выводом на экран сообщения AutoCAD.

;**************** cen_rec.lsp *********************************************
;       Определение координат центра прямоугольной ячейки.
;
(defun C:CEN_REC ( / pp echo osm reg minp maxp pmin pmax pxy cx cy ak)
(vl-load-com)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq pp (getpoint "\n Укажите точку внутри ячейки: "))
(vl-cmdf "_BOUNDARY" "_A" "_O" "_R" "" pp "")
(setq reg (entlast))
      (setq vlaobj(vlax-ename->vla-object reg)); Преобразование области в VLA-объект.
      (vla-GetBoundingBox vlaobj 'minp 'maxp)  ; Массивы кординат диагонали прямоугольника.
      (setq
           pmin(vlax-safearray->list minp)     ; Преобразование массивов
           pmax(vlax-safearray->list maxp)     ; в списки.
           pxy (list                           ; Вычисление координат центра прямоугольника.
               (+(car pmin)(/(-(car pmax)(car pmin))2))
               (+(cadr pmin)(/(-(cadr pmax)(cadr pmin))2))
               )
      ); setq
(vl-cmdf "_ERASE" reg "")
(princ "\n Одна область удалена.")
(princ "\n Координаты центра ячейки: ")(princ pxy)
(setq cx (rtos (car pxy)))
(setq cy (rtos (cadr pxy)))
(setq ak (strcat "\n Координаты центра ячейки." "\n По X: " cx "\n По Y: " cy))
(alert ak)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Спасибо - всё работает.
Мне часто приходится делать всевозможные приборные панели (отсюда и контуры всевозможной формы) - деталь в AutoCAD,а для изготовления наклеек или шелкографии приходится делать файл в CorelDRAW, отсюда и появилась необходимость в определении координат центра контура любой формы в AutoCAD. Естественно контур сделан командой boundary полилинией или регионом.
Возможен ли такой вариант программы?

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

> Nino
Скажу сразу, саму программу определения центра прямоугольника я выудил на конференции и только привел ее в удобоваримый вид. Поэтому на счет определения центра любого контура пока ничего обещать не могу, мне бы еще подучится надо. Но, может, где-то такая тема уже и затрагивалась.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Можно в принципе попробовать преобразовывать полилинию в регион (_.region) и для него использовать _.massprop - в текстовом окне будут указаны координаты центра масс.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

> kpblc
Это верно, но вот как взять координаты области в лиспе и передать дальше...?
Но это уже другая тема, может и появится отдельно.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Центр тяжести для региона:
https://www.caduser.ru/forum/topic13329.html

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

> Владимир Громов
Пзволю-ка я себе внести кое-какие изменения в Ваш код, используя подсказку от > kpblc (2005-09-21 11:09:32):

;**************** cen_reg.lsp *********************************************
;       Определение координат центра прямоугольной ячейки.
;
(defun C:CEN_REG ( / pp echo osm reg minp maxp pmin pmax pxy)
(vl-load-com)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq pp (getpoint "\n Укажите точку внутри ячейки: "))
(vl-cmdf "_BOUNDARY" "_A" "_O" "_R" "" pp "")
(setq reg (entlast))
(setq pxy (vlax-safearray->list (vlax-variant-value (vla-get-Centroid (vlax-ename->vla-object reg))))); setq
(vl-cmdf "_ERASE" reg "")
(princ "\n Одна область удалена.")
(princ "\n Координаты центра ячейки: ")(princ pxy)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)

Внес изменение в команду: cen_reg вместо cen_rec.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

> che
Я так понимаю, что эта программа определяет координаты произвольной "ячейки". Тогда надо бы ее чуть-чуть переписать (шапка и запросы в командной строке). Только ведь она выбивается из темы. Все равно спасибо за помощь.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

> Владимир Громов
Да, есть отклонения. За это прошу прощения.

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Программа определения координат центра произвольного замкнутого контура размещена здесь:
https://www.caduser.ru/forum/topic20881.html

Re: LISP. Определение координат центра прямоугольной ячейки. Примеры

Определение размеров прямоугольной ячейки, образованной пересечением отрезков или полилиний.
Сохранить код в файле size_rec.lsp

;**************** size_rec.lsp *********************************************
;       Определение размеров прямоугольной ячейки.
;       Автор Владимир Громов
(defun C:SIZE_REC
( / pp echo osm reg minp maxp pmin pmax pxy cx cy sizex sizey ak)
(vl-load-com)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq pp (getpoint "\n Укажите точку внутри ячейки: "))
(vl-cmdf "_BOUNDARY" "_A" "_O" "_R" "" pp "")
(setq reg (entlast))
      (setq vlaobj(vlax-ename->vla-object reg)); Преобразование области в VLA-объект.
      (vla-GetBoundingBox vlaobj 'minp 'maxp)  ; Массивы кординат диагонали прямоугольника.
      (setq
           pmin(vlax-safearray->list minp)     ; Преобразование массивов
           pmax(vlax-safearray->list maxp)     ; в списки.
           pxy (list                           ; Вычисление координат центра прямоугольника.
               (+(car pmin)(/(-(car pmax)(car pmin))2))
               (+(cadr pmin)(/(-(cadr pmax)(cadr pmin))2))
               )
      ); setq
(vl-cmdf "_ERASE" reg "")
(princ "\n Одна область удалена.")
(setq cx (rtos (car pxy)))
(setq cy (rtos (cadr pxy)))
(setq sizex (distance pmin (list (car pmax) (cadr pmin))))
(setq sizey (distance (list (car pmax) (cadr pmin)) pmax))
(setq sizex (rtos sizex))
(setq sizey (rtos sizey))
(setq ak (strcat "\n Координаты центра ячейки." "\n По X: " cx "\   По Y: " cy
                 "\n Размеры ячейки. " "\n По X = " sizex "\   По Y = " sizey))
(alert ak)
(princ ak)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)

Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:SIZE_REC) (load "size_rec")) SIZE_REC