четверг, 18 июня 2015 г.

Сумма длин примитивов в #AutoCAD

Прибегает ко мне как-то пользователь с просьбой: как быстро посчитать сумму длин отрезков?

Мы в современном мире делаем обычно гуглим, когда не знает, собственно, чем я и занялась.
Нагуглила следующее:
http://forum.dwg.ru/showthread.php?t=842&highlight=%25F1%25F3%25EC%25EC%25E0+%25E4%25EB%25E8%25ED


Дальше сделала все как обычно. Ctrl+C-Ctrl+V, сохраняем лиспик в хранилище, делаем кнопку, добавляем кнопку на панель, показываем пользователю как работает.

В чем проблема. Продвинутые пользователи AutoCAD прекрасно живут, используя командную строку, однако мои пользователи нажимают заветный крестик ("о боже, эта полоска занимает полэкрана!" - говорят они). Суть не в этом, объяснять каждому что такое Ctrl+9 я уже устала. В последнее время у нас большая текучка, берут много молодежи "только что из ВУЗа"...то, как  у нас обучают в нефтянке - это отдельный разговор, хотя к авиационщикам некоторым у меня тоже есть вопросы. Так вот, проще выводить результат не в командную строку, а отдельное окно.

Поэтому я немножечко заменила в коде princ на alert.
Конечный код следующий:
(vl-load-com)
(defun c:entLen (/ set:OfEnts int:l rea:LengthOfEnts)
  (setq  set:OfEnts (ssget)
  int:l 0
  rea:LengthOfEnts
   0.0
  ) ;_ setq
  (while (< int:l (sslength set:OfEnts))
    (setq rea:LengthOfEnts
     (+ rea:LengthOfEnts
        (vlax-curve-getDistAtParam
    (vlax-ename->vla-object (ssname set:OfEnts int:l))
    (vlax-curve-getEndParam (ssname set:OfEnts int:l))
        ) ;_ vlax-curve-getDistAtParam
     ) ;_ +
    ) ;_ setq
    (setq int:l (1+ int:l))
  ) ;_ while

  ( alert (strcat "\nПримитивов: - "
     (itoa (sslength set:OfEnts))
     "\nОбщая длина: - "
     (rtos rea:LengthOfEnts)
   ) ;_ strcat
  ) ;_ alert
  (princ)
  (prin1)
) ;_ defun

Результат работы как было:

как стало:


Мелочь, а приятно, согласитесь?!