Выбор по гиперссылке

Автор Тема: Выбор по гиперссылке  (Прочитано 2305 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Выбор по гиперссылке
« : 15-03-2021, 12:37:28 »
Имеется несколько полилиний с присвоенными гиперссылками. На полилиниях расположены блоки с гиперссылками, соответствующими гиперссылке линии. Сейчас я выбираю нужные мне блоки по слою, по цвету. Как добавить условие выбора по гиперссылке?
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:55 (/)
  2.  (setq trassa (car (entsel "Укажите трассу >")))
  3.  (vlax-for hp (vla-get-hyperlinks (vlax-ename->vla-object trassa))
  4.   (setq NameOb (vla-get-url hp))
  5.  )
  6. ;;; (alert NameOb)
  7.  (setq vla_curve   (vlax-ename->vla-object trassa)
  8.        LayerTrassa (cdr (assoc 8 (entget trassa)))
  9.        ColorTrassa (cdr (assoc 62 (entget trassa)))
  10.        ss_trassa   (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget trassa)))
  11.  )
  12.  (vl-cmdf "_.zoom" "_Object" trassa "")
  13.  (setq nabor (ssget "_X" (list (cons 0 "insert") (cons 8 LayerTrassa) (cons 62 ColorTrassa))))
  14.  (SSSETFIRST nabor nabor)
  15. )
« Последнее редактирование: 15-03-2021, 12:47:34 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор по гиперссылке
« Ответ #1 : 15-03-2021, 13:02:06 »
1958,
Правило форматирования кода у нас на форуме у меня в подписи.
Фильтра по гиперссылке нет. Точнее нет фильтра по конкретной гиперссылке. Но можно отфильтровать по самому факту наличия у полилинии гиперссылки:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget "_X" '((0 . "*POLYLINE") (-3 ("PE_URL")))))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Re: Выбор по гиперссылке
« Ответ #2 : 15-03-2021, 15:59:44 »
Прошу прощения за неправильное форматирование кода (в очередной раз  )
Теперь пара вопросов:
1. Почему не получается выбрать блоки (setq ss (ssget "_X" '((0 . "insert") (8 . LayerTrassa) (62 . ColorTrassa) (-3 ("PE_URL")))))
2. Если отбросить выбор по кодам 8 и 62, набор создается. Можно перебрать элементы набора, сравнить гиперссылки на равенство с нужным значением, если равны, то как добавить этот элемент в другой набор? Что-то у меня не получается.
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:55 (/)
  2.  (setq nabor        (ssadd)
  3.        nabor        nil
  4.        PO_OutptData (ssadd)
  5.        PO_OutptData nil
  6.        NameOb       "12"
  7.        hp           "23"
  8.        trassa       (car (entsel "Укажите трассу >"))
  9.  )
  10.  (vlax-for hp (vla-get-hyperlinks (vlax-ename->vla-object trassa))
  11.   (if (setq NameOb (vla-get-url hp))
  12.    NameOb
  13.   )
  14.  )
  15. ;;; (alert (strcat "имя трассы  " NameOb))
  16.  (setq OutFile     (strcat NameOb ".CSV")
  17.        vla_curve   (vlax-ename->vla-object trassa)
  18.        LayerTrassa (cdr (assoc 8 (entget trassa)))
  19.        ColorTrassa (cdr (assoc 62 (entget trassa)))
  20.        ss_trassa   (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget trassa)))
  21.  )
  22. ;;;Зуммирование экрана, чтобы вся трасса была видна
  23.  (vl-cmdf "_.zoom" "_Object" trassa "")
  24.  (setq ss  (ssget "_X"
  25.                   '((0 . "insert")
  26. ;;;                    (8 . LayerTrassa) (62 . ColorTrassa)
  27.                     (-3 ("PE_URL"))
  28.                    )
  29.            )
  30.        ips 0
  31.  )
  32.  (alert (vl-prin1-to-string (sslength ss)))
  33.  (while (< ips (sslength ss))
  34.   (setq obj (ssname ss ips))
  35.   (vlax-for hp (vla-get-hyperlinks (vlax-ename->vla-object obj))
  36.    (setq hp_obj (vla-get-url hp)
  37.          ips    (1+ ips)
  38.    )
  39.   )
  40. ;;;  (alert hp_obj)
  41.   (if (= hp_obj NameOb)
  42.    (ssadd (entget obj) nabor)
  43.   )
  44.  )
  45.  (sssetfirst nabor nabor)
  46. )

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор по гиперссылке
« Ответ #3 : 15-03-2021, 16:28:04 »
1. Почему не получается выбрать блоки (setq ss (ssget "_X" '((0 . "insert") (8 . LayerTrassa) (62 . ColorTrassa) (-3 ("PE_URL")))))
Наверное потому, что вы недостаточно знаете lisp.
Должно быть приблизительно так:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62  ColorTrassa) '(-3 ("PE_URL")))))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Re: Выбор по гиперссылке
« Ответ #4 : 15-03-2021, 17:14:15 »
Это правда. Мои познания дилетантские. Но и ваш вариант не работает.
Укажите трассу >
** Error: неверный тип аргумента: lselsetp nil **

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Выбор по гиперссылке
« Ответ #5 : 15-03-2021, 17:17:54 »
Если цвет выбранного примитива установлен "ПоСлою", то ColorTrassa будет равна nil. Для фильтрации (если не ошибаюсь) надо устанавливать ColorTrassa в 256
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Выбор по гиперссылке
« Ответ #6 : 15-03-2021, 17:18:32 »
Код - Auto/Visual Lisp [Выбрать]
  1.     (setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256))) '(-3 ("PE_URL")))))
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Re: Выбор по гиперссылке
« Ответ #7 : 15-03-2021, 18:32:57 »
Если цвет выбранного примитива установлен "ПоСлою", то ColorTrassa будет равна nil. Для фильтрации (если не ошибаюсь) надо устанавливать ColorTrassa в 256
Цвет примитивов задан не "ПоСлою", он задается свой для каждой линии и блоков, расположенных вдоль этой линии. Ваш код также не работает. Если убрать выбор по слою и по цвету, то выбор выполняется. Мне надо выбрать блоки, которые расположены непосредственно по указываемой линии. Не хочется перебирать кучу ненужных блоков. Ну, да ладно с этими слоями и цветом, в принципе блоков, содержащих гиперссылку, не так много. Как мне отобрать из полученного набора блоки, которые содержат нужную гиперссылку? В выше приведенном мною коде что-то не получается.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Выбор по гиперссылке
« Ответ #8 : 15-03-2021, 18:37:10 »
Кха, я не обратил внимания - а что будет, если вместо
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256))) '(-3 ("PE_URL")))))
сделать
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256))) (-3 ("PE_URL")))))
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Re: Выбор по гиперссылке
« Ответ #9 : 15-03-2021, 18:43:43 »
Для примера привожу кусок чертежа. Зелеными кружками показаны блоки с гиперссылкой. Они расположены на линии фиолетового цвета с такой же гиперссылкой.

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Re: Выбор по гиперссылке
« Ответ #10 : 15-03-2021, 18:47:05 »
Кха, я не обратил внимания - а что будет, если вместо
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256))) '(-3 ("PE_URL")))))
сделать
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256))) (-3 ("PE_URL")))))
Не работает. :(
Укажите трассу >
** Error: неверная функция: "PE_URL" **

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор по гиперссылке
« Ответ #11 : 15-03-2021, 20:52:31 »
Не работает. :(
Укажите трассу >
** Error: неверная функция: "PE_URL" **
Ну тогда так:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62 (if ColorTrassa ColorTrassa 256)) '(-3 ("PE_URL")))))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Re: Выбор по гиперссылке
« Ответ #12 : 16-03-2021, 06:30:55 »
Ну тогда так:
Код - Auto/Visual Lisp [Выбрать]
(setq ss (ssget "_X" (list '(0 . "insert") (cons 8 LayerTrassa) (cons 62 (if ColorTrassa ColorTrassa 256)) '(-3 ("PE_URL")))))
Так тоже не получается:
Команда: 55
Укажите трассу >
** Error: неверный тип аргумента: lselsetp nil **

Для меня важнее следующее:
Ну, да ладно с этими слоями и цветом, в принципе блоков, содержащих гиперссылку, не так много. Как мне отобрать из полученного набора блоки, которые содержат нужную гиперссылку? В выше приведенном мною коде что-то не получается.

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
Re: Выбор по гиперссылке
« Ответ #13 : 16-03-2021, 07:29:57 »
Для меня важнее следующее:
Цитата: 1958 от 15-03-2021, 18:32:57
Ну, да ладно с этими слоями и цветом, в принципе блоков, содержащих гиперссылку, не так много. Как мне отобрать из полученного набора блоки, которые содержат нужную гиперссылку? В выше приведенном мною коде что-то не получается.
А-ха-ха! Зачем я в третьей строке делал обнуление? Убрал эту строку, всё работает! (Естественно без выбора LayerTrassa и ColorTrassa).
Прошу прощения за доставленные хлопоты.