Всем привет!
Пытаюсь подсчитать сумму длин объектов на слое.
Взяла готовый lisp, но проблема в том, что он делает выбор только на отрезки следующим кодом:
(setq set_line (ssget "_x" (list '(0 . "LINE") layer))) ; Набор из линий на слое
Не могу понять, как снять эту выборку или как добавить полилинии.
Если я правильно поняла, можно list совсем убрать, но мне это не помогает почему-то
Layer - переменная, которая считывается при выборе объекта:
(setq layer (assoc 8 (entget (car (entsel "\nВыберите объект для определения слоя:")))))
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Решено! Перейти к решению.
Решено: kpblc2000. Перейти к решению.
Решено: Alexander.Rivilis. Перейти к решению.
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library
Через запятую! Так просто!
Только теперь у меня выбор слоя некорректно работает.
Так что кидаю весь код - что не так?
(defun c:SumSl (/ layer n sum_dl i set_line tip_obj p1 p2 dl_otr) (setq layer (assoc 8 (entget (car (entsel "\nВыберите объект для определения слоя:"))))) (setq set_line (ssget "_x" (list (cons 0 "LINE,LWPOLYLINE,Arc") layer))) ; Набор из линий на слое (setq n (sslength set_line)) ; Кол-во элементов в наборе (setq sum_dl 0.0) ; Cумма длин отрезков = 0 (setq i 0) ; Счетчик отрезков (while (> n 0) (setq name_obj (ssname set_line (- n 1))) (setq list_obj (entget name_obj)) (setq p1 (cdr (assoc 10 list_obj))) (setq p2 (cdr (assoc 11 list_obj))) (setq dl_otr (distance p1 p2)) (setq sum_dl (+ sum_dl dl_otr)) (setq i (+ i 1)) (setq n (- n 1)) ); end while (sssetfirst nil set_line) (alert (strcat "\nОбъектов - " (itoa i) "\nОбщая длина: " (rtos sum_dl) ) ;_ strcat ) ;_ alert (princ) (prin1) ); end_defun
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
@kpblc2000 wrote:
Чтобы добавить LightWeightPolyline, замени на
(setq set_line (ssget "_X" (list (cons 0 "LINE,LWPOLYLINE") layer)
Чтобы добавить сплайны, 3D-полилинии, легкие полилинии, можно сделать так:
(setq set_line (ssget "_X" (list (cons 0 "*LINE") layer)
Леша! Ты пошел у Лены на поводу и не обратил внимание, на ошибку в её коде.
Должно быть так:
;;; Отрезки, полилинии, мультилинии, сплайны: (setq set_line (ssget "_X" (list (cons 0 "*LINE") (cons 8 layer)))) ;;; Всё на слое: (setq set_line (ssget "_X" (list (cons 8 layer))))
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Alexander.Rivilis написано:
Леша! Ты пошел у Лены на поводу и не обратил внимание, на ошибку в её коде.
Должно быть так:
;;; Отрезки, полилинии, мультилинии, сплайны: (setq set_line (ssget "_X" (list (cons 0 "*LINE") (cons 8 layer)))) ;;; Всё на слое: (setq set_line (ssget "_X" (list (cons 8 layer))))
Буду оправдываться 🙂 Код не мой. Своровала.
Спасибо за исправление. Сейчас добавлю
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Лена. Вопрос на засыпку. Для дуги расстояние между начальной и конечной точкой - это что длина дуги? 😉 Про полилинию я молчу...
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Вот тут есть заготовка для длин выбранных кривых: http://forum.dwg.ru/showpost.php?p=13200&postcount=20
Только строку
(setq set:entities (ssget))
нужно заменить на
(setq set:entities (ssget "_X" (list (cons 0 "*LINE") (cons 8 layer))))
Ну и присвоить layer имя слоя.
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library
@kpblc2000 wrote:
Саш, я специально посмотрел - в layer хранится точечная пара. Так что ошибка не здесь 🙂
Правда твоя. 😞 Но это жуть...
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library
Alexander.Rivilis написано:
Лена. Вопрос на засыпку. Для дуги расстояние между начальной и конечной точкой - это что длина дуги? 😉 Про полилинию я молчу...
На самом деле в ТЗ речь только о линейных объектах. С дугами - это я играюсь
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Поторопилась с выводами.
вообщем так, у меня есть 2 кода
1. Считает все на слое, но при наличии нелинейных объектов врет. Проверила ручным выбором и подсчетом.
(defun calc_dist ( / lines layer index sum obj ) (vl-load-com) (setq sum 0) (setq index 0) (setq layer (assoc 8 (entget (car (entsel "\nВыберите объект на рассчитываемом слое:"))))) (setq lines (ssget "_x" (list '(0 . "*LINE") layer))) (repeat (sslength lines) (setq obj (vlax-ename->vla-object (ssname lines index))) (setq sum (+ sum (distance (vlax-curve-getStartPoint obj) (vlax-curve-getEndPoint obj)))) (setq index (1+ index)) ) ( alert (strcat "\nСумма длинн линейных объектов на слое - " (rtos sum) ) ;_ strcat ) ;_ alert (princ) (prin1) )
2. Считает отлично, но не на слое, а только выбранные объекты. Мне он почему-то больше по душе...
(vl-load-com) (defun entLen ( / ent set:entities int:allEntities int:curveEntities int:l rea:length) (setq ent (car (entsel "\nВыбери объект, по слою которого будет выполняться расчет : "))) (setq set:entities (ssget "_X" (list (cons 0 "LINE,LWPOLYLINE") (assoc 8 (entget ent))))) (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
Я что-то запуталась в коде ( в виду моего небольшого опыта...)
Где и что я делаю не так?
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Без проверок:
(vl-load-com)
(defun calc_dist (/ lines layer index sum obj) (vl-load-com) (setq sum 0) (setq index 0) (setq layer (assoc 8 (entget (car (entsel "\nВыберите объект на рассчитываемом слое:"))))) (setq lines (ssget "_X" (list '(0 . "*LINE") layer))) (repeat (sslength lines) (setq obj (vlax-ename->vla-object (ssname lines index))) (setq sum (+ sum (vlax-curve-getdistatpoint obj (vlax-curve-getendpoint obj)))) (setq index (1+ index)) ) ;_ end of repeat (alert (strcat "\nСумма длинн линейных объектов на слое - " (rtos sum))) (princ) (prin1) ) ;_ end of defun
ПОчему не срабатывает второй - не понимаю. Попробуй этот
(vl-load-com) (defun entlen (/ ent set:entities int:allentities int:curveentities int:l rea:length) (setq ent (car (entsel "\nВыбери объект, по слою которого будет выполняться расчет : ")) set:entities (ssget "_X" (list (cons 0 "LINE,LWPOLYLINE") (assoc 8 (entget ent)))) ) ;_ end of setq (if set:entities (progn (setq int:allentities (sslength set:entities) int:curveentities 0 int:l 0 rea:length 0. ) ;_ end of 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 2 14) ) ;_ end of strcat ) ;_ end of princ ) ;_ progn (alert "Примитивы не выбраны!") ) ;_ if (prin1) ) ;_ defun
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library
kpblc2000 написано:
ПОчему не срабатывает второй - не понимаю. Попробуй этот
(vl-load-com) (defun entlen (/ ent set:entities int:allentities int:curveentities int:l rea:length) (setq ent (car (entsel "\nВыбери объект, по слою которого будет выполняться расчет : ")) set:entities (ssget "_X" (list (cons 0 "LINE,LWPOLYLINE") (assoc 8 (entget ent)))) ) ;_ end of setq (if set:entities (progn (setq int:allentities (sslength set:entities) int:curveentities 0 int:l 0 rea:length 0. ) ;_ end of 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 2 14) ) ;_ end of strcat ) ;_ end of princ ) ;_ progn (alert "Примитивы не выбраны!") ) ;_ if (prin1) ) ;_ defun
Не знаю в чем дело...продолжает считать только по выбранным объектам, а не на слое выбранного объекта.
Это точно. Проверила на тестовом файле, вручную создала несколько объектов.
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
kpblc2000 написано:
Почему первый срабатывал неверно - понятно: ты суммировала кратчайшие расстояния между начальной и конечной точками любой кривой. А это не всегда длина свмой кривой 😉
Вот первый как раз сработал...сейчас еще раз проверю и выложу.
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.