Тема: Как найти общую длину всех выделенных отрезков?

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

Re: Как найти общую длину всех выделенных отрезков?

не помню толи сам накарябал то ли на форуме срисовал используйте этот лисп:

(defun c:ln (/)
  (apply '+
     (mapcar '(lambda
            (x)
             (vlax-curve-getDistAtParam
               (vlax-ename->vla-object x)
               (vlax-curve-getEndParam x)
             )
          )
         (vl-remove-if
           'listp
           (mapcar 'cadr (ssnamex (ssget)))
         )
     )
  )
)

Re: Как найти общую длину всех выделенных отрезков?

Большое спасибо. Только если честно, я ещё не профессионал и не знаю куда это писать. Но буду искать. Если не трудно подскажите

Re: Как найти общую длину всех выделенных отрезков?

уж сколько раз...
http://dwg.ru/forum/viewtopic.php?t=953

Re: Как найти общую длину всех выделенных отрезков?

> Умник
Програмка отличная, но как-то непонятно:

(vlax-curve-getDistAtParam
(vlax-ename->vla-object x);вызов через  vla-obj
(vlax-curve-getEndParam x);вызов через ent-name
)

В хелпе сказано, обе эти функции вызывать через vla-obj
но

(vlax-curve-getDistAtParam
x                         ;вызов через ent-name
(vlax-curve-getEndParam x);вызов через ent-name
)

Тоже отлично работает...
Может ли кто-нибудь прокаментировать?

Re: Как найти общую длину всех выделенных отрезков?

Попробовал запустить все vlax-curve с параметром ent-name
(car (entsel))
Все отработали без ошибок! Хотя хелп напоминает, что надо
(vlax-ename->vla-object (car (entsel)))
Интересно, это недокументированная возможность или...

Re: Как найти общую длину всех выделенных отрезков?

Нашёл на подсказанной вами ссылке програмку
(vl-load-com)
(defun entLen ( / set:entities int:allEntities int:curveEntities int:l rea:length)
  (setq set:entities (ssget))
  (if set:entities
    (progn
      (setq int:allEntities (sslength set:entities)   ; количество выбранных примитивов
       int:curveEntities 0            ; счетчик линейных примитивов
       int:l 0               ; счетчик
       rea:length 0.0            ; общая длина линейных примитивов
      ) ;_  setq
      (while (< int:l (sslength set:entities))
   (if (not
         (vl-catch-all-error-p
      (vl-catch-all-apply
        'vlax-curve-getStartPoint
        (list (vlax-ename->vla-object (ssname set:entities int:l)))
      ) ;_  vl-catch-all-apply
         ) ;_  vl-catch-all-error-p
       ) ;_  not
     (setq   int:curveEntities (1+ int:curveEntities)
      rea:length     (+ rea:length
                 (vlax-curve-getDistAtParam
                   (vlax-ename->vla-object (ssname set:entities int:l))
                   (vlax-curve-getEndParam (ssname set:entities int:l))
                 ) ;_  vlax-curve-getDistAtParam
              ) ;_  +
     ) ;_  setq
   ) ;_  if
   (setq int:l (1+ int:l))
      ) ;_  while
      (princ (strcat "\n Выбрано примитивов: " (itoa int:allEntities)
           ", из них линейных: " (itoa int:curveEntities)
           "\n Общая длина линейных примитивов: " (rtos rea:length)
           )
        )
    ) ;_  progn
    (alert "Примитивы не выбраны!")
  ) ;_  if
(prin1)
) ;_  defun
Создал файл с расширением LSP
Загрузил приложение
После ввода в командную строку (entLen), следует предложение выбора объекта. Но после его выбора, хоть я нажимаю на Enter, хоть на првую кнопку мыши, всё сбрасывается.
Что делать?
P.S. Точно так же загружаю програмку подсказанную Умником, набираю c:ln и полное молчание.

Re: Как найти общую длину всех выделенных отрезков?

Какая верисия AutoCAD?

Re: Как найти общую длину всех выделенных отрезков?

2005

Re: Как найти общую длину всех выделенных отрезков?

Кстати, программа

(vl-load-com)
(defun entLen ( / set:entities int:allEntities int:curveEntities int:l rea:length)
  (setq set:entities (ssget))
  (if set:entities
    (progn
      (setq int:allEntities (sslength set:entities)   ; количество выбранных примитивов
       int:curveEntities 0            ; счетчик линейных примитивов
       int:l 0               ; счетчик
       rea:length 0.0            ; общая длина линейных примитивов
      ) ;_  setq
      (while (< int:l (sslength set:entities))
   (if (not
         (vl-catch-all-error-p
      (vl-catch-all-apply
        'vlax-curve-getStartPoint
        (list (vlax-ename->vla-object (ssname set:entities int:l)))
      ) ;_  vl-catch-all-apply
         ) ;_  vl-catch-all-error-p
       ) ;_  not
     (setq   int:curveEntities (1+ int:curveEntities)
      rea:length     (+ rea:length
                 (vlax-curve-getDistAtParam
                   (vlax-ename->vla-object (ssname set:entities int:l))
                   (vlax-curve-getEndParam (ssname set:entities int:l))
                 ) ;_  vlax-curve-getDistAtParam
              ) ;_  +
     ) ;_  setq
   ) ;_  if
   (setq int:l (1+ int:l))
      ) ;_  while
      (princ (strcat "\n Выбрано примитивов: " (itoa int:allEntities)
           ", из них линейных: " (itoa int:curveEntities)
           "\n Общая длина линейных примитивов: " (rtos rea:length)
           )
        )
    ) ;_  progn
    (alert "Примитивы не выбраны!")
  ) ;_  if
(prin1)
) ;_  defun

пошла без проблем. Большое спсибо "kos"-у

Re: Как найти общую длину всех выделенных отрезков?

Может, следует в последней программе заменить слово "примитив" на слово "объект"?

Re: Как найти общую длину всех выделенных отрезков?

diz пишет:

P.S. Точно так же загружаю програмку подсказанную Умником, набираю c:ln и полное молчание.

Только сейчас до меня дошло! biggrin
В командной строке нужно было набирать ln, а не c:ln
А по поводу версии AutoCAD я спросил, т.к. в вериях до AutoCAD 2000 эти функции не работают.

Re: Как найти общую длину всех выделенных отрезков?

Если набираю ln, то следует предложение выбора объекта. Но после его выбора, хоть я нажимаю на Enter, хоть на првую кнопку мыши, всё сбрасывается. Но всё таки лучше чем раньше

Re: Как найти общую длину всех выделенных отрезков?

Мой вариант:

(defun c:elen(/ fList firSet entSet filOut entList totLen)
  (vl-load-com)
  (setq fList '((-4 . "<OR")(0 . "*LINE")
      (0 . "CIRCLE")(0 . "ARC")
      (0 . "ELLIPSE")(-4 . "OR>")
      (-4 . "<NOT")(0 . "MLINE")
      (-4 . "NOT>"))
   filOut 0
   ); end setq
  (if
    (not
      (and
   (setq firSet(ssget "_I")
         entSet(ssget "_I" fList)
         ); end setq
   ); end and
      ); end not
    (setq entSet(ssget fList))
    (setq filOut(-(sslength firSet)(sslength entset)))
    ); end if
  (if entSet
    (progn
      (setq entList
      (mapcar 'vlax-ename->vla-object
                    (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex entSet))))
       totLen
        (apply '+
          (mapcar '(lambda (x)
                (vlax-curve-getDistAtParam x
             (vlax-curve-getEndParam x)))
             entList); end mapcar
          ); end apply
       ); end setq
      (if(/= 0 filOut)
   (princ(strcat "\n" (itoa filout)
            " were filtered out (unsupported type)"))
   ); end if
      (princ(strcat "\nTotal entities: "(itoa(length entList))
          " Total length: "(rtos totLen)); end strcat
       ); end princ
      ); end progn
    (progn
        (if(/= 0 filOut)
   (princ(strcat "\n" (itoa filout)
            " were filtered out (unsupported type)"))
   (princ "\nNothing selected")
   ); end if
    ); end progn
    ); end if
      (princ)
      ); end c:elen 

Re: Как найти общую длину всех выделенных отрезков?

Я поюзал первую функцию Умника- нормально работает для линий и дуг.

Re: Как найти общую длину всех выделенных отрезков?

> diz
Вопрос, с которого надо было начинать...

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

У какого типа примитива ты смотришь длинну?
Что есть прогон - отрезок, полилиния, сплайн или может быть блок?

Re: Как найти общую длину всех выделенных отрезков?

... или может быть твердое тело, мультилиния и т.д...

Re: Как найти общую длину всех выделенных отрезков?

> Александр Ривилис
Твердое тело наврятли... У него не посмотришь длинну (или что-то выражающее длинну) в свойствах...
Хотя можно передавать в названии слоя или в названии цвета, но не думаю - тогда проще выделить и посмотреть на слой или цвет...
Скорее всего прогон - примитив не имеющий свойства окончания...

Re: Как найти общую длину всех выделенных отрезков?

Мне в основном нужно находить сумму длин прямых линий, и это хорошо выполнияется программой, которрую выложил kos (я писал об этом), но почему то все остальные предложенные программы не идут. Следует предложение выбора объекта, и после выбора хоть я жму на Enter, хоть на правую кнопку, всё сбрасывается. Просто интересно почему?
И ещё вопрос. Я создал кнопку для работающего лиспа, но после перезагрузки компьютера, что бы она работала нужно нужно каждый раз загружать этот лисп. Нельзя ли зделать так, что бы это происходило автоматически?

Re: Как найти общую длину всех выделенных отрезков?

> diz
Я использую запосщенную приблуду на 2004 и на 2005 (англ. версии) все работает чудесно... У вас случаем в командной сторке сколько строчек - если 2 то результата видно не будет - надо увеличить количество строк до 3-х - результат выводиться в командную строку или воспользуйтесь такой прогой:

(defun c:ln (/)
  (alert
    (strcat "Total Length is "
        (rtos (apply '+
             (mapcar '(lambda
                    (x)
                     (vlax-curve-getDistAtParam
                       (vlax-ename->vla-object x)
                       (vlax-curve-getEndParam x)
                     )
                  )
                 (vl-remove-if
                   'listp
                   (mapcar 'cadr (ssnamex (ssget)))
                 )
             )
          )
          2
          2
        )
    )
  )
)

кстати говоря, если вы не использовали раньше лиспов то нужно дописать строчку:
(vl-load-com)
второй после defun
у меня подгружено больше двух сотен функций и загружать с каждой функцией (vl-load-com) смысла нет ...

Re: Как найти общую длину всех выделенных отрезков?

> diz
Чтобы не нужно было загружать вручную lsp-файл, впришите в макрос для кнопки:

^C^C^P(if (null entLen) (load "entlen.lsp")) (entlen) ^P

Подразумевается, что имя lsp-файла entlen.lsp и он находится в путях доступа AutoCAD.

Re: Как найти общую длину всех выделенных отрезков?

У меня действительно была 1 строка в командной строке. Теперь всё получается. Всем большое спасибо!!!

Re: Как найти общую длину всех выделенных отрезков?

> diz

> Александр Ривилис
Лучше сделать свое отдельное меню (пусть даже пока из обной кнопки) и подгрузить егою
Подробнее
http://cadhlp.kulichki.com/pdmnu.htm
Посмотри там же сборник CADHLP там есть свое меню и в разделе Расчеты аналогичная прога, взятая тут

/*
https://www.caduser.ru/forum/topic11823.html
*/
(defun C:Dlina (/ Nab Sum i Curve Param)
 (vl-load-com)
     (if (setq Nab (ssget))
         (progn
               (setq Sum 0 i 0)
               (repeat (sslength Nab)
               (setq Curve (vlax-ename->vla-object (ssname Nab i))
                         i (1+ i)
               Param (vl-catch-all-apply 'vlax-curve-getEndParam
               (list Curve))
    )
    (if (not (vl-catch-all-error-p Param))
        (setq Sum (+ Sum (vlax-curve-getDistAtParam Curve Param)))
)
)
)
)
(princ (strcat "\nСумма длин выбранных элементов равна: " (rtos Sum 2 2)))
(prin1)
)