Forge, API и программирование – Русский – только для чтения
Задавайте вопросы и делитесь знаниями по Autodesk Forge и программированию на API программного обеспечения Autodesk
отмена
Отображаются результаты для 
Показать  только  | Вместо этого искать 
Вы имели в виду: 

AutoLISP. Выбор объектов на слое

16 ОТВЕТ 16
РЕШЕНО
Ответить
Сообщение 1 из 17
lena.talkhina
2726 просмотров, 16 ответов

AutoLISP. Выбор объектов на слое

Всем привет!

 

Пытаюсь подсчитать сумму длин объектов на слое.

Взяла готовый 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.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

16 ОТВЕТ 16
Сообщение 2 из 17
kpblc2000
в ответ: lena.talkhina

Чтобы добавить LightWeightPolyline, замени на
(setq set_line (ssget "_X" (list (cons 0 "LINE,LWPOLYLINE") layer)
Чтобы добавить сплайны, 3D-полилинии, легкие полилинии, можно сделать так:
(setq set_line (ssget "_X" (list (cons 0 "*LINE") layer)

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | 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

Сообщение 3 из 17
lena.talkhina
в ответ: kpblc2000

Через запятую! Так просто!

 

Только теперь у меня выбор слоя некорректно работает.

 

Так что кидаю весь код - что не так?

 

(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.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

Сообщение 4 из 17
Alexander.Rivilis
в ответ: kpblc2000


@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
Expert Elite Member

Сообщение 5 из 17


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.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

Сообщение 6 из 17

Лена. Вопрос на засыпку. Для дуги расстояние между начальной и конечной точкой - это что длина дуги? 😉 Про полилинию я молчу...

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | 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
Expert Elite Member

Сообщение 7 из 17

Вот тут есть заготовка для длин выбранных кривых: 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
Expert Elite Member

Сообщение 8 из 17
kpblc2000
в ответ: lena.talkhina

Саш, я специально посмотрел - в layer хранится точечная пара. Так что ошибка не здесь 🙂

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | 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

Сообщение 9 из 17
Alexander.Rivilis
в ответ: kpblc2000


@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
Expert Elite Member

Сообщение 10 из 17
kpblc2000
в ответ: kpblc2000

Для полилинии нет DXF-группы 11. Там методика получения длины совсем другая.

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | 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

Сообщение 11 из 17
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

Сообщение 12 из 17


Alexander.Rivilis написано:

Лена. Вопрос на засыпку. Для дуги расстояние между начальной и конечной точкой - это что длина дуги? 😉 Про полилинию я молчу...


На самом деле в ТЗ речь только о линейных объектах. С дугами - это я играюсь

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

Сообщение 13 из 17

Поторопилась с выводами.

 

вообщем так, у меня есть 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.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

Сообщение 14 из 17
kpblc2000
в ответ: lena.talkhina

Без проверок:

(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

Сообщение 15 из 17
kpblc2000
в ответ: kpblc2000

Почему первый срабатывал неверно - понятно: ты суммировала кратчайшие расстояния между начальной и конечной точками любой кривой. А это не всегда длина свмой кривой 😉

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | 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

Сообщение 16 из 17
lena.talkhina
в ответ: kpblc2000


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.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

Сообщение 17 из 17
lena.talkhina
в ответ: kpblc2000


kpblc2000 написано:
Почему первый срабатывал неверно - понятно: ты суммировала кратчайшие расстояния между начальной и конечной точками любой кривой. А это не всегда длина свмой кривой 😉

Вот первый как раз сработал...сейчас еще раз проверю и выложу.

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.

Новая тема  

Autodesk Design & Make Report