Тема: LISP. Измерение площади и периметра

После загрузки файла zx-area-len-r который можно взять здесь  http://dwg.ru/dwl/331
вам будет доступно 3 команды
1. zxar - требует нарисовать полилинию, после нажатия правой кнопки мыши (или enter) значения площади и длины полилинии
    висят на курсоре и появляются в командной строке. Можно прерваться - полилиния и текст на курсоре
    удаляются. Можно вставить текст в чертеж. Далее в зависимости от настроек: текст вставляется в чертеж,
    а полилиния удаляется, или текст вставляется в чертеж, полилиния остается, а значение ее площади и
    длины привязываются к тексту. Т.е. если редактировать полилинию, в соответствии со значением ее площади
    и длины, будут изменятся значения текста.
2. zxarall - выделяются полилинии, после нажатия правой кнопки мыши (или enter) на курсоре и в командной строке появляются
    значения площади и длины. Далее в зависимости от настроек. Можно просто вставить текст в чертеж или вставить в чертеж
    и связать его значение с параметрами (площадью и длиной) выбранных полилиний. При дальнейшем редактировании любой
    из полилиний значение текста будет меняться в зависимости от  общей площади и длины полилиний вошедших в набор,
    при этом все полилинии и текст будут подсвечены.
3. zxarparam - появляется окно настроек программы. Можно настроить ширину и цвет полилинии; высоту, цвет и стиль текста;
    окончания для значений длины и площади; коэффициенты для значений длины и площади; что выводить - площадь, длину
    или все вместе; создавать ли связь полилинии(полилиний) с текстом; подсвечивать ли связанные объекты.

Re: LISP. Измерение площади и периметра

> serzh
По твоей ссылке
открывается окно с текстом...
Warning: mysql_query(): Too many connections in /home/acad2000/htdocs/dwl/index.php on line 187
Warning: mysql_query(): A link to the server could not be established in /home/acad2000/htdocs/dwl/index.php on line 187
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/acad2000/htdocs/dwl/index.php on line 188
Позиция не найдена

Re: LISP. Измерение площади и периметра

> Евгений Елпанов
на dwg.ru так бывает, попробуй позже.

Re: LISP. Измерение площади и периметра

> Евгений Елпанов
у меня открывается

Re: LISP. Измерение площади и периметра

> serzh
Скачал, попробовал, первое впечатление хорошее. Как я понял, начальные установки ширины полилинии и высоты текста расчитаны на масштаб чертежа 1:100. Лично мне не хватает в настройках возможности выбора слоя.

Re: LISP. Измерение площади и периметра

> Владимир Громов
Ну да, было бы не плохо насчет слоев. Добавить их в настройки не сложно, но меня пока устраивает как есть. Если кому очень надо, пишите, добавлю.

Re: LISP. Измерение площади и периметра

> Сергей
У нас архитекторы рисуют контур площади на слое "Площади", который не выводится на печать, этот слой переключается автоматически, а значение пишется или на плане на слое "Помещения" или сразу в экспликацию на слое "Экспликация", тоже автоматически.
А вот периметр, все-таки, им нужен в метрах.
Но в вашей программе меня больше всего интересует возможность изменения значения площади при изменении контура. Конечно, изменение контура из полилинии не такая простая операция, особенно при добавлении вершин, но научиться можно. Сейчас при изменении плана приходится определять площадь заново. Я думаю, ваща программа придется нашим по душе. Но надо еще с ней поработать.

Re: LISP. Измерение площади и периметра

> Владимир Громов
Добавил настройки слоев отдельно для полилинии и текста. А чтобы периметр выводился в метрах, достаточно указать в настройках в поле коэффициент 0.001

Re: LISP. Измерение площади и периметра

> serzh
Понял. Большое спасибо!

Re: LISP. Измерение площади и периметра

> serzh
Прога отличная, наверно си использовался. На dwg.ru я уже писал комментарий, хотелось бы, чтобы  значение высоты текста было вещественной, а не целой. Если нарисовать 1 единицу растояния акада = 1м, то высота текста, равная 1 оказывается очень большой.

Re: LISP. Измерение площади и периметра

> che
Это уже давно исправлено. А если оставить поле пустым, используется высота используемого стиля.
Использовалься только LISP

Re: LISP. Измерение площади и периметра

> serzh
В предыдущей версии все работало, но в параметрах высоту текста требовал ввести целым положительным числом. А в новой версии zxarparam вовсе не работает и выдает лисповскую ошибку:

Command: zxarparam
; error: bad argument type: stringp nil

Re: LISP. Измерение площади и периметра

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

Re: LISP. Измерение площади и периметра

> serzh
Действительно, все OK.

Re: LISP. Измерение площади и периметра

Программа работала отлично, боьлшое спасибо.
А потом случилось следующее (при загрузке).
Как бороться - не знаю, подозреваю, что дело в автокаде. Переустанавливал, не помогает:(

Command: appload
zx-area-len-r.VLX successfully loaded.
Command:
; warning:AutoCAD type library load failed: "Error loading type library/DLL"
; warning:AutoCAD type library load failed: "Error loading type library/DLL"
; warning:AutoCAD type library load failed: "Error loading type library/DLL"
2005г.  zxsergey@mail.ru; error: no function definition: vlax-get-acad-object
Command:

Что посоветуете? Автокад - 2005.

Re: LISP. Измерение площади и периметра

ICQ 315047294

Re: LISP. Измерение площади и периметра

> serzh
..имеет ли значение версия акада?
прога подгрузилась вроде..привожу диалог:
Command:
ZXAR
Укажите первую точку полилинии >>
Следующая точка или <enter> замкнуть >>
Следующая точка или <enter> замкнуть >>
Следующая точка или <enter> замкнуть >>
Следующая точка или <enter> замкнуть >>
Следующая точка или <enter> замкнуть >>
Следующая точка или <enter> замкнуть >>
Yes or No, please.
Unknown command "ZXAR".  Press F1 for help.
ActiveX Server returned the error: unknown name: Length

в чем может быть дело?

Re: LISP. Измерение площади и периметра

> shtirlitz_a
Программа работает в ACAD 2004 и выше.
Видимо у вас 2002 или более позднияя версия. Конечно можно переделать, но пока нет времени.

Re: LISP. Измерение площади и периметра

с помощью чего открыть этот файл

Re: LISP. Измерение площади и периметра

имею в виду программу

Re: LISP. Измерение площади и периметра

> serzh
У всех ли работает zxarall в режиме ADT в режиме ACAD 2005 на обычной, ранее нарисованной полилинии?
У меня на одной машине не хочет связывать значение с параметрами полилинии, на другой связывает но не дает редактировать полилинию. Кроме того не ясен закон, по которому устанавливаются данные: после Enter все пропадает, после правой кнопки мыши выходит со второго раза в начале координат и не всегда...

Re: LISP. Измерение площади и периметра

> iv
http://dwg.ru/dnl/index.php?id=260
Щас все должно работать с 2004 по 2007, в том числе и в ADT.
Изменения: команда zxar теперь рисует прямоугольник, если нужна полилиния надо после вызова zxar нажать Enter

Re: LISP. Измерение площади и периметра

Люди помогите с програми как поставить прогру в автокад я имею ввиду zx-area-len-r  не понимаю и все что куда ставить  объясните за ранее благодарен

Re: LISP. Измерение площади и периметра

Вариант программы, выводящую площадь замкнутых примитивов по слоям. По просьбе
Valery Brelovsky (2007-06-26 11:38:24). Эта тема больше подходит.
Вычисляет площадь как замкнутых, так и не замкнутых примитивов, если начальная и конечная точка совпадает.

;Команда MAREA1
(defun c:marea1 (/ m ss clist temp)
  (defun sort (lst predicate)
    (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate))
  )
  (defun combine (inlist is-greater is-equal / sorted current result)
    (setq sorted (sort inlist is-greater))
    (setq current (list (car sorted)))
    (foreach item (cdr sorted)
      (if (apply is-equal (list item (car current)))
  (setq current (cons item current))
  (progn
    (setq result (cons current result))
    (setq current (list item))
  )
      )
    )
    (cons current result)
  )
  (defun marea1_1 (lst / sum_len)
    (setq sum_len 0)
    (foreach item (mapcar 'car lst)
      (setq
  sum_len  (+ sum_len
       (if (and (vlax-property-available-p item 'area)
        (or (vlax-curve-isClosed item)
            (equal (vlax-curve-getStartPoint item)
               (vlax-curve-getEndPoint item)
               1e-6)
            )
        
        )
         (vla-get-area item)
     0
       ) ;_  if
    ) ;_  +
      )
    )
    (if  (not (zerop sum_len))
      (princ
  (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4))
      )
    )
  )
  (vl-load-com)
  (and
    (setq m (getreal "\nвведите маштабный коэффициент:\t"))
    (setq ss (ssget "_:L"))
    (setq ss (mapcar
         (function vlax-ename->vla-object)
         (vl-remove-if
     (function listp)
     (mapcar
       (function cadr)
       (ssnamex ss)
     ) ;_  mapcar
         ) ;_ vl-remove-if
       )
    )
    (mapcar '(lambda (x)
         (setq temp (cons (cons x (vla-get-Layer x)) temp))
       )
      ss
    )
    (setq clist  (combine temp
       '(lambda (a b)
          (> (cdr a) (cdr b))
        )
       '(lambda (a b)
          (eq (cdr a) (cdr b))
        )
    )
    )
    (princ
      "\n\n  Общая площадь всех линейных примитивов по слоям:"
    )
    (mapcar 'marea1_1 clist)
  )
  (princ)
) ;_  defun

Re: LISP. Измерение площади и периметра

Поправочка с линейным масштабом

;Команда MAREA1
(defun c:marea1 (/ m ss clist temp)
  (defun sort (lst predicate)
    (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate))
  )
  (defun combine (inlist is-greater is-equal / sorted current result)
    (setq sorted (sort inlist is-greater))
    (setq current (list (car sorted)))
    (foreach item (cdr sorted)
      (if (apply is-equal (list item (car current)))
  (setq current (cons item current))
  (progn
    (setq result (cons current result))
    (setq current (list item))
  )
      )
    )
    (cons current result)
  )
  (defun marea1_1 (lst / sum_len)
    (setq sum_len 0)
    (foreach item (mapcar 'car lst)
      (setq
  sum_len  (+ sum_len
       (if (and (vlax-property-available-p item 'area)
    (or (vlax-curve-isClosed item)
        (equal (vlax-curve-getStartPoint item)
         (vlax-curve-getEndPoint item)
         1e-6)
        )
    )
         (vla-get-area item)
   0
       ) ;_  if
    ) ;_  +
      )
    )
    (if  (not (zerop sum_len))
      (princ
  (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m m) 2 4))
      )
    )
  )
  (vl-load-com)
  (and
    (setq m (getreal "\nвведите линейный маштабный коэффициент:\t"))
    (setq ss (ssget "_:L"))
    (setq ss (mapcar
         (function vlax-ename->vla-object)
         (vl-remove-if
     (function listp)
     (mapcar
       (function cadr)
       (ssnamex ss)
     ) ;_  mapcar
         ) ;_ vl-remove-if
       )
    )
    (mapcar '(lambda (x)
         (setq temp (cons (cons x (vla-get-Layer x)) temp))
       )
      ss
    )
    (setq clist  (combine temp
       '(lambda (a b)
          (> (cdr a) (cdr b))
        )
       '(lambda (a b)
          (eq (cdr a) (cdr b))
        )
    )
    )
    (princ
      "\n\n  Общая площадь всех линейных примитивов по слоям:"
    )
    (mapcar 'marea1_1 clist)
  )
  (princ)
) ;_  defun