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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проблема создания наборов через ActiveX

Проблема создания наборов через ActiveX

Ответ
Поиск в этой теме
Непрочитано 06.07.2008, 16:02 #1
Проблема создания наборов через ActiveX
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Обращаюсь к знатокам ActiveX. Проблема в создании набора, не принимает фильтр 410 DXF код. При создании через ssget принимает, а через vla-select не принимает. Все этот vla-select принимает, а 410 нет. Только ее проклятую не хочет. Только в фильтр вставлю 410 - набор не заполняется. а это принадлежность к активному пространству, как же без нее? Kpblc, VVA - ПОМОГИТЕ!
Просмотров: 3095
 
Непрочитано 06.07.2008, 16:08
#2
Кулик Алексей aka kpblc
Moderator

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


А ты как набор формируешь? С использованием "мощности" пользователя? Так и на фига оно требуется, указание активного пространства, если объекты неактивного все равно в набор не попадают?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.07.2008, 17:13
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ага! Не попадают? Попадают аж бегут бегом! Все что на листе лезет в набор.

Я набор меряю и вижу, не слепой.

Набор у меня именованный.

Код:
[Выделить все]
(setq act-doc-s (vla-get-ActiveDocument (vlax-get-acad-object)))
; ну это тебе понятно
(setq s_n_a_m "vla-nabor1")
; имя набора
(setq vl_nabor_s (vla-get-SelectionSets act-doc-s))
; указатель на семейство наборов
(if (vl-catch-all-error-p (setq vl_nabor (vl-catch-all-apply (function vla-item) (list vl_nabor_s s_n_a_m))))
(setq vl_nabor (vla-Add vl_nabor_s s_n_a_m)))
; знаменитая Полещуковская метода
(vla-Clear vl_nabor)
; очистили набор

; далее:


; функция наполнения набора элементами с фильтром (почти как у 
; Полещука, только очистку набора в начало добавил. Так надо.)


(defun select-all-obj-filter (sel filter / i) (vla-Clear sel)
(vla-select sel acSelectionSetAll
nil
nil
(vlax-safearray-fill (vlax-make-safearray vlax-vbInteger (setq i (cons 1 (length filter)))) (mapcar (function car) filter))
(vlax-safearray-fill (vlax-make-safearray vlax-vbVariant i) (mapcar (function cdr) filter))
))

; функция создания фильтра набора доступных слоев
(defun df:laers-filtr-cont ( / )
(setq laers-all (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))))
(setq laers-filtr nil)
(Vlax-for x laers-all 
(if (or (= (vla-get-LayerOn x) :vlax-false) (= (vla-get-Lock x) :vlax-true) (= (vla-get-Freeze x) :vlax-true)
) T (setq laers-filtr (append laers-filtr (list (cons 8 (vla-get-Name x)))))
))
(setq laers-filtr (append '((-4 . "<OR")) laers-filtr '((-4 . "OR>"))))
)

; ну и собственно само оно
(select-all-obj-filter vl_nabor (append laers-filtr (list (cons 410 (getvar "CTAB")) '(60 . 1))))

Так вот именно 410 и ломает кайф. Как? Почему? А фиг его знает! Без нее - на ура, с ней - никак.
Supermax вне форума  
 
Непрочитано 06.07.2008, 22:09
#4
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Код:
[Выделить все]
Не ломай голову, это - известный баг Автокада,
то же самое и в VBA, этот код нельзя использовать
Можешь выбирать объекты без него (на крайняк испльзовать
фильтр с кодом 67) но все равно потом нужно фильтровать
объекты по свойству OwnerID блока соответствующего листа
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 07.07.2008, 19:18
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Так я и не ломаю, просто так как я это делаю долго машина 25000 элементов лопатит.
Код:
[Выделить все]
(select-all-obj-filter vl_nabor (append laers-filtr '((60 . 1))))
(vlax-for x vl_nabor (if (/= (getvar "CTAB") (cdr (assoc 410 (entget (vlax-vla-object->ename x))))) 
(vla-RemoveItems vl_nabor (vlax-safearray-fill (vlax-make-safearray vlax-vbObject '(0 . 0)) (list x)))))
Может как-то получить все элементы текущего пространства, а потом из них наборы лепить? Но когда их 50-100000 как-то оно за машину боязно. Я прям слышу как кулер начинает обороты менять, то ли питание садится, то ли температура проца расти начинает.
Supermax вне форума  
 
Непрочитано 07.07.2008, 20:50
#6
Кулик Алексей aka kpblc
Moderator

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


Я бы делал так:
Код:
[Выделить все]
(defun pickset-get-by-owner (/ res)
  (vlax-for ent (vla-get-block
                  (vla-get-layout
                    (vla-get-paperspace
                      (vla-get-activedocument (vlax-get-acad-object))
                      ) ;_ end of vla-get-PaperSpace
                    ) ;_ end of vla-get-layout
                  ) ;_ end of vla-get-block
    (setq res (cons ent res))
    ) ;_ end of vlax-for
  (reverse res)
  ) ;_ end of defun
и не особо мучился.
Ну или второй вариант:
Код:
[Выделить все]
(or *kpblc-activedoc*
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of or

(defun _kpblc-get-active-space-obj ()
  ;; http://arcada.com.ua/forum/viewtopic.php?t=486
  (if (and (zerop (vla-get-activespace *kpblc-activedoc*))
           (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
           ) ;_ end of and
    (vla-get-paperspace *kpblc-activedoc*)
    (vla-get-modelspace *kpblc-activedoc*)
    ) ;_ end of if
  ) ;_ end of defun

(defun pickset-get-by-owner2 (/ res)
  (vlax-for ent (vla-get-block (_kpblc-get-active-space-obj))
    (setq res (cons ent res))
    ) ;_ end of vlax-for
  (reverse res)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проблема создания наборов через ActiveX

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с печатью через сеть на HP Design Jet 500 Alex_NB AutoCAD 5 27.01.2009 12:09
Программа для создания наборов картинок Солидворкер Прочее. Программное обеспечение 4 28.12.2007 07:11
Проблема. Мышка зависает через определенное время dextron3 Разное 4 20.11.2007 08:41
Проблема с печатью через сеть Garbag AutoCAD 5 28.08.2004 08:56
Есть ли альтернатива _REFEDIT через ActiveX? {Smirnoff} Программирование 11 23.07.2004 13:30