ssget и vla-get-ActiveSelectionSet - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > ssget и vla-get-ActiveSelectionSet

ssget и vla-get-ActiveSelectionSet

Ответ
Поиск в этой теме
Непрочитано 03.03.2006, 17:01
ssget и vla-get-ActiveSelectionSet
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,202

В некоторых программах на лиспе публикуемых в т.ч. на этом форуме (см.например у Fatty
,Лентяя и т.п.) используется следующий оборот для получения обекта текущего выбора:

Код:
[Выделить все]
...
(SSGET)
(setq ass (vla-get-ActiveSelectionSet
     (vla-get-ActiveDocument (vlax-get-acad-object))
   )
)
...
Оно удобно.Но порой такая конструкция приводит к ошибке при повторной попытке доступа:
Код:
[Выделить все]
Automation Error. Calling method Clear of interface
После которой помогает только перезагрузка файла.
Мне не удается зафиксировать условия для появления этой ошибки.

Откуда это? Зачем? Отчего оно появляется, и как этого можно избежать?
(некоторое время назад многоуважаемый г-н Alaspher выразился в том смысле, что вообще затея с подобным оборотом чревата нехорошими последствиями, в плане того, что нефиг смешивать мух с котлетами)

Вопрос практический, хотелось бы иметь аналог ssget, но дающий на выходе LA-OBJECT IAcadSelectionSet а не набор.
Просмотров: 10842
 
Автор темы   Непрочитано 13.03.2006, 12:02
#21
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Еще раз, для ленивых:

Я хочу применить ФИЛЬТР для SS. Фильтр в виде DXF кода, как он задается для ssget или для SelectOnScreen.

А если в фильтре будет не имя? что мне на каждый DXF номер писать соотв. свойство? То есть,придется написать нечто типа соответствия для ВСЕХ DXF кодов ВСЕХ акадовских объектов - я пас! Лучше уж через entget. Но и это еще не все - есть закавыка со всякими and и or в фильтре.

В общем - нет в жизни счастья....

Но вопросы есть еще:
есть ли способ перекинуть ВСЕ объекты из одной SS в другую?
Я сделал это через vla-add, но у меня где-то теряется один объект, я не понимаю где...
Код:
[Выделить все]
(vla-AddItems
	      sel_set
	      (vlax-make-variant
		(vlax-safearray-fill
		  (vlax-make-safearray
		    vlax-vbObject
		    (cons 1 (vla-get-count PFSS))
		  )
		  (vlax-for i PFSS
		    (setq list_PFSS (cons i list_PFSS))
		  )
		)
	      )
	    )
Apelsinov вне форума  
 
Непрочитано 14.03.2006, 02:15
#22
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от Apelsinov
Еще раз, для ленивых:

Я хочу применить ФИЛЬТР для SS. Фильтр в виде DXF кода, как он задается для ssget или для SelectOnScreen.

А если в фильтре будет не имя? что мне на каждый DXF номер писать соотв. свойство? То есть,придется написать нечто типа соответствия для ВСЕХ DXF кодов ВСЕХ акадовских объектов - я пас! Лучше уж через entget. Но и это еще не все - есть закавыка со всякими and и or в фильтре.

В общем - нет в жизни счастья....
Так вот для того, чтобы не мучаться этими проблемами, следует с самого нацахал паботать в ActiveX. Тогда не будет заморочек с перетолмачиванием DXF кодов в свойства и обратно.
Кстати, а сколько елементов вы указываете в фильтре? ИМХО вряд-ли больше 3-4-х. В чем же тогда ваши трудности?
Цитата:
Но вопросы есть еще:
есть ли способ перекинуть ВСЕ объекты из одной SS в другую?
Я сделал это через vla-add, но у меня где-то теряется один объект, я не понимаю где...
Код:
[Выделить все]
(vla-AddItems
	      sel_set
	      (vlax-make-variant
		(vlax-safearray-fill
		  (vlax-make-safearray
		    vlax-vbObject
		    (cons 1 (vla-get-count PFSS))
		  )
		  (vlax-for i PFSS
		    (setq list_PFSS (cons i list_PFSS))
		  )
		)
	      )
	    )
А вот тут все гораздо смешнее. Потеря последнего елемента массива происходит при передаче его в vla-addItems.
При этом, если сделать массив не
Код:
[Выделить все]
(vlax-make-safearray vlax-vbObject (cons 1(vla-get-count PFSS)))
, а
Код:
[Выделить все]
(vlax-make-safearray vlax-vbObject (cons 0 (1- (vla-get-count PFSS))))
, то его длина не меняется, но ничего при передаче не теряется. И не спрашивайте меня, почему :?: . Все равно не знаю. :twisted:
Лентяй вне форума  
 
Автор темы   Непрочитано 14.03.2006, 16:50
#23
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от Лентяй
Так вот для того, чтобы не мучаться этими проблемами, следует с самого нацахал паботать в ActiveX. Тогда не будет заморочек с перетолмачиванием DXF кодов в свойства и обратно.
Да ради работы в этой самой ActiveX все это и затеялось, но тогда почему же в SelectOnScreen используется фильтр по DXF ?

Цитата:
Сообщение от Лентяй
Кстати, а сколько елементов вы указываете в фильтре? ИМХО вряд-ли больше 3-4-х. В чем же тогда ваши трудности?
Мои трудности в создании универсальной функции типа ssget, дающей на выходе SS, и с возможностью предвыбора объектов. Вот эта возможность пока и хромает из-за невозможности применить фильтр, стандартный для других методов получения SS методами ActiveX.

Цитата:
Сообщение от Лентяй
А вот тут все гораздо смешнее. Потеря последнего елемента массива происходит при передаче его в vla-addItems.
При этом, если сделать массив не
Код:
[Выделить все]
(vlax-make-safearray vlax-vbObject (cons 1(vla-get-count PFSS)))
, а
Код:
[Выделить все]
(vlax-make-safearray vlax-vbObject (cons 0 (1- (vla-get-count PFSS))))
, то его длина не меняется, но ничего при передаче не теряется. И не спрашивайте меня, почему :?: . Все равно не знаю. :twisted:
За это большое спасибо. Я и не думал спрашивать, боюсь непонять
Apelsinov вне форума  
 
Непрочитано 14.03.2006, 16:58
#24
Кулик Алексей aka kpblc
Moderator

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


Цитата:
И не спрашивайте меня, почему :?:
Может, просто нумерация массива идет с 0?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.03.2006, 20:02
#25
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от kpblc
Может, просто нумерация массива идет с 0?
Я бы согласился с этим объяснением, если бы после vla-AddItems в новом наборе осталось бы прежнее число элементов, только первый вы стал бы nil, а последний оказался отброшен. На деле же происходит изменение длины набора на последний елемент списка list_PFSS.
Лентяй вне форума  
 
Непрочитано 14.03.2006, 20:12
#26
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от Apelsinov
Да ради работы в этой самой ActiveX все это и затеялось, но тогда почему же в SelectOnScreen используется фильтр по DXF ?
Сугубо по причине удобства, дурных привычек и всепобеждающей лени.
Цитата:
Мои трудности в создании универсальной функции типа ssget, дающей на выходе SS, и с возможностью предвыбора объектов. Вот эта возможность пока и хромает из-за невозможности применить фильтр, стандартный для других методов получения SS методами ActiveX.
Понятно. Ищите стало быть, универсальный рецепт всеобщего счастья? И вам за это платят? Как я вам завидую!
Цитата:
За это большое спасибо. Я и не думал спрашивать, боюсь непонять
За это вам - большая пжалста. Я тоже не знаю досконально, как варенье в конфету попадает, но это не мешает нам ее есть и получать при этом удовольствие, не правда-ли?
Лентяй вне форума  
 
Автор темы   Непрочитано 14.03.2006, 20:36
#27
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от Лентяй
Понятно. Ищите стало быть, универсальный рецепт всеобщего счастья? И вам за это платят? Как я вам завидую!
Платят не за это, за это подзатыльники дают, шоб не выеживался мол.
Дак ведь всеж у меня получилось, как конфетка с вареньем, и только эта пакостная хрень мелкой червоточиной портит чистоту замысла.
НУ И ХРЕН С НЕЙ!!!
Все равно я объекты фильтрую в основном по имеющимся свойствам...

Кстати, о бяках, намедни, например, (одни запятые) присвояю я мтексту rotation, а у него этот ротайшон оказывается в ПСК, как вам оно нравится? Пьяные они там чтоли были...
Apelsinov вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > ssget и vla-get-ActiveSelectionSet