| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как выбрать объект методами автолисп по имени?

Как выбрать объект методами автолисп по имени?

Ответ
Поиск в этой теме
Непрочитано 10.11.2015, 10:27 #1
Как выбрать объект методами автолисп по имени?
kurstep
 
Регистрация: 27.01.2012
Сообщений: 240

Здравствуйте. Очень часто в автокаде необходимо выбрать конкретный объект. Возможно ли это сделать не используя фильтры.
Ведь каждый объект имеет свой номер который не меняеться после закрытия чертежа
( типа (-1 . <Имя объекта: 7fffd636650>))
Я пытался выбрать через фуннкцию
Код:
[Выделить все]
 (pl:obj-filter-select-manual  sel '( (-1 . <Имя объекта: 7fffd636650>)))
Но результата это не дает. Подскажите как это можно осуществить?
Просмотров: 5549
 
Непрочитано 10.11.2015, 10:49
1 | #2
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Команда: (entget (car (entsel)))
Выберите объект : ((-1 . <Имя объекта: 7ffffb06540>) (0 . "LINE") (330 . <Имя
объекта: 7ffffb03990>) (5 . "238A") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (62 . 7) (6 . "Continuous") (100 . "AcDbLine") (10 1.2212
3.1366 0.0) (11 6.90465 7.1618 0.0) (210 0.0 0.0 1.0))

Выбор объекта по его метке (5 . "238A")
(setq Ob (handent "238A"))
Puroshev вне форума  
 
Непрочитано 10.11.2015, 11:06
#3
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от kurstep Посмотреть сообщение
Очень часто в автокаде необходимо выбрать конкретный объект.
Вы пытаетесь добавить объект к уже существующему набору. Какой смысл выбирать один примитив по фильтру, если вас есть указатель на него?
Воспользуйтесь командой vla-AddItems и не ищите сложных путей.

Вот еще вопрос. Вы действительно добавляете объект к набору или же вам просто нужно выбрать один объект и работать с ним?
__________________
Автоматизация должна быть автоматической.

Последний раз редактировалось ProPeller, 10.11.2015 в 11:19.
ProPeller вне форума  
 
Непрочитано 10.11.2015, 11:40
#4
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Тоже теперь вдруг стало любопытно. Странно, почему не работает конструкция типа (слету не смекну, как использовать в фильтре тип ENAME, поэтому использовал handle (STR)):
Код:
[Выделить все]
 (ssget "_X"  '((5 . "14FEA5")))
Оно ясно, что конструкция данная не имеет особого практического смысла, поскольку можно создать пустой набор и добавить в него нужный примитив, типа того:
Код:
[Выделить все]
 (setq ss (ssadd))
(ssadd (car (entsel)) ss)
Но все же почему методы AutoLISP справедливы не для всех групп-точечных пар?
skkkk вне форума  
 
Непрочитано 10.11.2015, 11:45
#5
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от skkkk Посмотреть сообщение
Но все же почему методы AutoLISP справедливы не для всех групп-точечных пар?
Скорее не методы, а именно фильтры. Может быть потому что с таким фильтром можно выбрать только лишь один объект? Как вы уже правильно сказали, практического смысла это не имеет.
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Автор темы   Непрочитано 10.11.2015, 12:00
#6
kurstep


 
Регистрация: 27.01.2012
Сообщений: 240


Такой выбор понятен....

Цитата:
Сообщение от skkkk Посмотреть сообщение
Оно ясно, что конструкция данная не имеет особого практического смысла, поскольку можно создать пустой набор и добавить в него нужный примитив, типа того:
Код:
[Выделить все]
(setq ss (ssadd))
(ssadd (car (entsel)) ss)
но можно ли передать команде ssadd <имя объекта> без указания на него интерактивно (car (entsel)) , то есть передать непосредственно значение <имя объекта: 7ffdee4234> ?
kurstep вне форума  
 
Непрочитано 10.11.2015, 12:01
#7
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от ProPeller Посмотреть сообщение
Скорее не методы, а именно фильтры.
Ну да, корявенько выразился, хотел выпендриться - только опозорился (с)
Цитата:
Сообщение от ProPeller Посмотреть сообщение
Может быть потому что с таким фильтром можно выбрать только лишь один объект?
Все равно не пойму логику. Ведь я же могу выбрать один объект с фильтром, например, по слою или типу примитива, если он один и есть такой.
При попытке использовать фильтр по хэндлу ошибки не возникает (типа "неверный список ssget"), а просто выдается nil как будто такого объекта и нет вовсе. Мне, конечно, остается только догадываться о внутренней реализации механизмов лиспа и фильтров в частности, но думалось, что там все идет по одному определенному алгоритму, и возможжно, получается, что фильтр по хэндлу специально исключили из функционала, потому что посчитали, что это не имеет практического значения? Непонятно.
skkkk вне форума  
 
Непрочитано 10.11.2015, 12:40
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832


Цитата:
Сообщение от kurstep Посмотреть сообщение
можно ли передать команде ssadd <имя объекта> без указания на него интерактивно (car (entsel)) , то есть передать непосредственно значение <имя объекта: 7ffdee4234> ?
Можно. Сначала запомни ename-указатель на примитив в отдельную переменную, а потом ее и используй. Другой вопрос, что не факт, что такой подход сработает (можно в переменную загнать указатель на примитив внутри блока, например).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.11.2015, 13:16
#9
kurstep


 
Регистрация: 27.01.2012
Сообщений: 240


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Другой вопрос, что не факт, что такой подход сработает
В том то и дело, что не работает, как я понимаю ename-указатель - это особый тип данных и когда его загоняешь в переменную он не читается правильно
kurstep вне форума  
 
Непрочитано 10.11.2015, 13:36
#10
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от kurstep Посмотреть сообщение
и когда его загоняешь в переменную он не читается правильно
Работает он правильно, просто функция pl:obj-filter-select-manual подразумевает под собой использование фильтра, а фильтр с подобными условиями работать не будет в силу особенностей ЯП. До сих пор не понимаю, с какой целью вы используете pl:obj-filter-select-manual.
Цитата:
Сообщение от kurstep Посмотреть сообщение
ename-указатель - это особый тип данных и когда его загоняешь в переменную
Хотя, вопрос как "загонять". Расскажите как вы это делаете?
__________________
Автоматизация должна быть автоматической.

Последний раз редактировалось Кулик Алексей aka kpblc, 10.11.2015 в 13:44.
ProPeller вне форума  
 
Непрочитано 10.11.2015, 13:46
#11
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Offtop: ProPeller, в расширенном режиме есть галочка "Отключить смайлы в тексте". Хотя даже прикольно эта рожица туда затесалась

Добавлено: Алексей уже поправил.
skkkk вне форума  
 
Непрочитано 10.11.2015, 13:48
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832


Offtop: Хотя я правил не это
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.11.2015, 14:02
#13
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от skkkk Посмотреть сообщение
Offtop: ProPeller, в расширенном режиме есть галочка "Отключить смайлы в тексте". Хотя даже прикольно эта рожица туда затесалась
Offtop: Пасиба!))
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop: Хотя я правил не это
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 10.11.2015, 16:44
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
Тоже теперь вдруг стало любопытно. Странно, почему не работает конструкция типа (слету не смекну, как использовать в фильтре тип ENAME, поэтому использовал handle (STR)):
Потому что иногда нужно читать и официальную документацию:
Цитата:
Filterable Entities

Entity filter lists recognize all DXF group codes except for handles (group 5), names (the "pseudo" group code -1), and extended entity data codes (in the range 1,000-2,000). To retrieve extended entity data, a filter list must specify the data's registered application name.
Александр Ривилис вне форума  
 
Непрочитано 06.02.2024, 04:38
#15
power_factor


 
Регистрация: 15.11.2022
Сообщений: 10


Цитата:
Сообщение от kurstep Посмотреть сообщение
но можно ли передать команде ssadd <имя объекта> без указания на него интерактивно (car (entsel)) , то есть передать непосредственно значение <имя объекта: 7ffdee4234> ?
А можно ли то же самое с entget? То есть передать в функцию entget <Entity name>, <hanle>, <soft pointer> или что-то ещё без каких-либо промежуточных действий c entsel и прочим.

Во всей литературе единственным примером работы с entget является код вида: (enget (entlast)) или (entget (entnext)). Понятно, что эти примеры прекрасно работают, но ведь и entlast, и entnext используют имя объекта или какую-то иную "метку". Так почему же невозможно использовать эту метку сразу, если она мне известна?
power_factor вне форума  
 
Непрочитано 06.02.2024, 07:32
#16
name02


 
Регистрация: 10.01.2020
Сообщений: 185


Функция entget как раз и служит для получения информации в списочном виде из объекта ENTITY - смотри справку тут
То есть ты предварительно получаешь объект и передаешь его как аргумент в entget.
Если хочешь, то можешь сделать свою функцию и передавать в нее хоть ENTITY, хоть HANDLE и уже внутри нее реализовать что-то
Или я не правильно понял что тебе нужно...
name02 вне форума  
 
Непрочитано 06.02.2024, 09:00
#17
power_factor


 
Регистрация: 15.11.2022
Сообщений: 10


Цитата:
Сообщение от name02 Посмотреть сообщение
Или я не правильно понял что тебе нужно...
Или я правильно объяснить не могу)

В примере хелпа:
(entget (entlast))

Я хочу знать, можно ли:
(entget (-1 . <Entity name: slk0dsl1>))

или какой-то другой синтаксис, но напрямую в entget передать Entity name или другой уникальный идентификатор. Без промежуточного присваивания, entsel и т. п.
power_factor вне форума  
 
Непрочитано 06.02.2024, 09:32
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,036


использовать соответствующие функции лиспа - handent, vla-handletoobject.
Сергей812 вне форума  
 
Непрочитано 06.02.2024, 10:19
#19
name02


 
Регистрация: 10.01.2020
Сообщений: 185


Цитата:
Сообщение от power_factor Посмотреть сообщение
Я хочу знать, можно ли:
(entget (-1 . <Entity name: slk0dsl1>))
Думаю, что ты не очень понимаешь суть entsel/entnext и какой аргумент нужен entget.
entsel/entnext позволяют получить ОБЪЕКТ (он же entity). Напрямую изменить/прочесть его параметры ты не можешь, чтобы это сделать, надо как представить его в "читабельном" виде.
Для этого и нужен entget - он получает ОБЪЕКТ, а возвращает СПИСОК из точечных пар, соответствующих свойствам объекта. И вот как раз этот СПИСОК ты можешь изменить, что в свою очередь повлияет на ОБЪЕКТ.
Что в принципе и отражено в названии языка List Processing language — «язык обработки списков»
name02 вне форума  
 
Непрочитано 06.02.2024, 14:01
#20
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 463


Цитата:
Я хочу знать, можно ли:
(entget (-1 . <Entity name: slk0dsl1>))
Можно, но немного по-другому:

(entget (cdr(-1 . <Entity name: slk0dsl1>)))

Всю-то "точечную пару" зачем функции (entget) скармливать?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как выбрать объект методами автолисп по имени?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Revit 2012: не отображаются некоторые объекты в плане, видимость включена. Rudy Revit 3 04.12.2017 22:41
Объединение дуг, линий в единый объект, Как объединить? Vladimir.P AutoCAD 41 25.01.2015 08:03
Как выбрать объект через командную строку или программно? OSIP Программирование 12 25.09.2014 17:48
Можно ли выбрать объект модели из листа не активируя видовой экран? mkung Программирование 24 25.06.2014 09:31
Как зная точку выбрать объект и получить его свойства? Zaghim Программирование 6 13.09.2010 09:07