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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > И опять VLA-SELECT

И опять VLA-SELECT

Ответ
Поиск в этой теме
Непрочитано 21.09.2006, 09:50 #1
И опять VLA-SELECT
Лентяй
 
Project Engineer
 
Лос Анджелес
Регистрация: 05.01.2005
Сообщений: 1,392

Возликуйте, kpblc, Apelsinov, Fatty и прочие ненавистники VLA-SELECT'а, ибо у меня с ним проблема. Суть же такова. Необходимо выбрать ВСЕ примитивы, созданные командой "COPY".
Код:
[Выделить все]
vla-select ass acSelectionSetLast
выбирает только САМЫЙ ПОСЛЕДНИЙ примитив, причем никогда не угадаешь, какой именно [sm2100] , а не весь скопированный набор. Причем самый смех состоит в том, что на одном компьютере набор таки да - выбирается, а на других - нет [sm2103] . А мне надо выбирать именно набор [sm1212] ! Так что, уважаемый знатоки, помоеите ценным советом. ПЕРЕСЧЕТ ПРИМИТИВОВ ВОВПРОСТРАНСТВУ НЕ ПРЕДЛАГАТЬ :twisted: :twisted: :twisted: !
Просмотров: 5660
 
Непрочитано 21.09.2006, 10:10
#2
Кулик Алексей aka kpblc
Moderator

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


На уровне предположения: а что говорит vla-pickfirstselectionset?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.09.2006, 17:54
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


У меня 2 варианта
1. (entnext (entlast))
2. через реактор на добавление примитивов
Код:
[Выделить все]
(defun r-acdb-add (react  cmd / ietm_obj cmd_name tset)
  (setq item_obj (vlax-ename->vla-object (cadr cmd)))
  (if (not (member item_obj *COPY_ITEM*))
        (setq *COPY_ITEM* (append *COPY_ITEM* (list item_obj))))
  )

(if *vlr-AcDb*
  (progn
    (setq *vlr-AcDb* nil)
    (vlr-remove-all :VLR-AcDb-Reactor)))

(if (not *vlr-AcDb*)
(setq *vlr-AcDb* (VLR-AcDb-Reactor
     "AcDb" '((:vlr-objectAppended . r-acdb-add)))))
В *COPY_ITEM* список добавленных объектов, ну и организовать своевременную очистку *COPY_ITEM*.
VVA вне форума  
 
Непрочитано 22.09.2006, 06:56
#4
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


С наборами в ActiveX вообще слабое место. Тут чистый LISP удобнее. Хоть переборы просили не предлагать, иначе не обойтись. Всегда, когда надо получить неизвестно что, образовавшееся в результате действий, использую функцию
Код:
[Выделить все]
(defun ru-ss-select-after-ent (ent_name / selection)
  (setq selection (ssadd))
  (while (and ent_name (setq ent_name (entnext ent_name)))
    (ssadd ent_name selection)
  ) 
  (if (zerop (sslength selection))
    nil
    selection
  ) 
)
Сначала получаем примитив-метку (setq ent (entlast))

Потом что-то делаем (рисуем, тушуем, копируваем)

Потом получаем все новенькое

(setq new_ss (ru-ss-select-after-ent ent))
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 24.09.2006, 11:34
#5
Лентяй

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


Прошу у всех прощения за запоздалый ответ, но будучи оторван от компьютера с русским шрифтом и АвтоКадом... Итак, по порядку.
Цитата:
kpblc : На уровне предположения: а что говорит vla-pickfirstselectionset?
А ни фига не говорит. Выводит имя имя набора "FIRST", как ему и поланается, и все.
Цитата:
VVA: В *COPY_ITEM* список добавленных объектов,..
Спасибо, конечно, но если у меня уже есть список, то на фига мне, српрашивается набор? Я и со списеом могу сделать все то же, что хотел с набором. Так что, как говорится в наших краях, nice try but no cigars .
Цитата:
ShaggyDoc: Хоть переборы просили не предлагать, иначе не обойтись. Сначала получаем примитив-метку (setq ent (entlast)). Потом что-то делаем (рисуем, тушуем, копируваем). Потом получаем все новенькое.
Именно этого я и опасался. Хотя идея примитива-метки может оказаться полезной, тем более. что примитив этот вытащить средствами ActiveX насложно. В понедельник попробую и доложу о результатах.
Лентяй вне форума  
 
Непрочитано 20.10.2006, 15:43
#6
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


у меня сходая ситуация только с получением примитивов после разбивки блока

мысль с примитивом-меткой ясна

интересует только одно:
(только не бейте сразу)

каким образом акад присваивает имена объектам?
то есть если в духе постсоветских очередей - каждому новому подошедшему следующий по порядку номерок на ладошке -
тогда очевидно, что все новые подошедшие стоят после примитива-метки...

а не может быть так, что новым раздаются номера тех, кто "отказался от очереди"?

оно вроде бы ответ напрашивается, но все таки решил спросить
Mr_Eugene вне форума  
 
Непрочитано 20.10.2006, 16:09
#7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


У блока есть метод Explode
Код:
[Выделить все]
(setq blk (car(entsel "\nУкажите блок")))
(setq blk (vlax-ename->vla-object blk))
(foreach memb (vlax-invoke Blk 'Explode)
  ;...Что-то делаем
  (princ "\nВ блок входили-")(princ(vla-get-ObjectName memb))
  )
(vla-delete blk)
VVA вне форума  
 
Непрочитано 20.10.2006, 17:23
#8
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


спасиббольшой!
тока у меня все гораздо хуже

во-первых мне разбивать блоки надо burst'ом так как могут попадаться аттрибуты

во-вторых в блок могут входить всякие spds-ы и dimensions, которые норовят восстановить свой масштаб после разбивки блока, которые всеравно надо разбивать на составляющие примитивы

была мысль сделать новое вхождение блока с масштабом 1, расколбасить его до упора, а потом полученными объектами заменить исходный состав блока. Во как!

если есть соображение по этому поводу - буду очень признателен

заранее благодарен
Mr_Eugene вне форума  
 
Непрочитано 20.10.2006, 18:25
#9
Zouss


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


Цитата:
Сообщение от Mr_Eugene
была мысль сделать новое вхождение блока с масштабом 1, расколбасить его до упора, а потом полученными объектами заменить исходный состав блока. Во как!
ну это уж слишком в духе "ВсеВМоделиАдинКАднаму"
я бы выловил примитивы блока из таблицы блоков, не знаю как у вас в Vlisp а у нас в Lisp это легко, правда как быть с атрибутами размерами посоветовать не могу, ибо цели ваши неведомы мне
Zouss вне форума  
 
Непрочитано 24.10.2006, 17:00
#10
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


кстати, после разбивки блока (при наличии вложенных блоков)
фокус с объектом-меткой проходит не до конца,
т.к. блоки с именами на * в конечный набор не попадают
видимо встают не в конец очереди

.... буду думать как их вылавливать....

вот еще что...
если в разбиваемый блок входили блоки с атрибутами, то в конечном наборе эти атрибуты участвуют дважды: сначала в блоке, потом сами по себе
пришлось их выкидывать
Код:
[Выделить все]
(defun ru-ss-select-after-ent (ent_name / selection) 
  (setq selection (ssadd)) 
  (while (and ent_name (setq ent_name (entnext ent_name)))
    (if (/= "ATTRIB" (cdr (assoc 0 (entget ent_name))))
       (ssadd ent_name selection)
    )
  ) 
  (if (zerop (sslength selection)) 
    nil 
    selection 
  ) 
);defun

to Zouss
Цитата:
я бы выловил примитивы блока из таблицы блоков
прошу подсказать как это делается, а то мне ничего кроме перебора через entnext до seqend не приходит
да, и вопрос такой интересует: сохраняют ли объекты блока имена после разбиения?
Mr_Eugene вне форума  
 
Непрочитано 24.10.2006, 17:40
#11
Zouss


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


я про (tblnext "block"):

Код:
[Выделить все]
;;;Функция (getblocklst) возвращает список блоков из таблицы блоков

(defun getblocklst (/ z blocklst)
  (setq	blocklst (cons (cdr (assoc 2 (tblnext "BLOCK" T))) blocklst)
  ) ;_  setq
  (while (setq z (tblnext "BLOCK"))
    (setq blocklst (cons (cdr (assoc 2 z)) blocklst))
  ) ;_  while
  blocklst
) ;_  defun
там в хелпе про эту функцию есть что-то про имена объектов, но по аглийски... ннепонятно

обьекты блока имена после разбиения имхо не сохраняют, ибо происходит удаление объекта Insertion (его имя видимо удаляется тоже), а вместо него создаются объекты перечисленные в таблице блоков, которые в таблице тоже имеют имена, но так как оне должны быть уникальны... дальше чето я уже иссяк
Zouss вне форума  
 
Непрочитано 24.10.2006, 21:12
#12
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


в хелпе нашел, что dxf-код -2 дает имя первого примитива блока,
а как добраться до остальных не понял...

но все равно спасибо!

буду думать дальше [sm2011]
Mr_Eugene вне форума  
 
Непрочитано 25.10.2006, 11:48
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Выдрал команды из BURST. Дописал цикл для вложенных блоков и взрыва размеров
Код:
[Выделить все]
;;;********* Ф-ции выдраны из BURST.LSP ************
;;; Наличие Express обязательна !!!
(Defun ITEM (N E) (CDR (Assoc N E)))
(acet-error-init (list (list "cmdecho" 0
"highlight" 1) T))
(Defun BITSET (A B) (= (Boole 1 A B) B))
(Defun bump (prmpt)(terpri)(Princ prmpt))
(Defun ATT-TEXT (AENT / TENT ILIST INUM)
(Setq TENT '((0 . "TEXT")))
(ForEach INUM '(8 6 38 39 62 67 210 10 40 1 50 41 51 7 71 72 73 11 74)
(If (Setq ILIST (Assoc INUM AENT))(Setq TENT (Cons ILIST TENT))))
(Setq tent (Subst (Cons 73 (item 74 aent))(Assoc 74 tent) tent))
(EntMake (Reverse TENT)))
(Defun LASTENT (/ E0 EN)(Setq E0 (EntLast))
(While (Setq EN (EntNext E0))(Setq E0 EN)) E0)
(Defun BURST-ONE (BNAME / BENT ANAME ENT ATYPE AENT AGAIN ENAME
         ENT SS-COLOR SS-LAYER SS-LTYPE mirror ss-mirror mlast)
 (Setq BENT   (EntGet BNAME) BLAYER (ITEM 8 BENT) BCOLOR (ITEM 62 BENT)
     BCOLOR (Cond ((> BCOLOR 0) BCOLOR)((= BCOLOR 0) "BYBLOCK")("BYLAYER"))
         BLTYPE (Cond ((ITEM 6 BENT)) ("BYLAYER")))
 (Setq ELAST (LASTENT))
(If (= 1 (ITEM 66 BENT))(Progn (Setq ANAME BNAME)
 (While (Setq ANAME (EntNext ANAME) AENT  (EntGet ANAME)
	      ATYPE (ITEM 0 AENT) AGAIN (= "ATTRIB" ATYPE))
  (bump "Converting attributes")(ATT-TEXT AENT))))
 (Progn (bump "Exploding block")(acet-explode BNAME))
 (Setq SS-LAYER (SsAdd) SS-COLOR (SsAdd) SS-LTYPE (SsAdd) ENAME ELAST)
 (While (Setq ENAME (EntNext ENAME))(bump "Gathering pieces")
   (Setq ENT (EntGet ENAME) ETYPE (ITEM 0 ENT))
   (If (= "ATTDEF" ETYPE)(Progn
    (If (BITSET (ITEM 70 ENT) 2)(ATT-TEXT ENT))
    (EntDel ENAME))(Progn (If (= "0" (ITEM 8 ENT))
 (SsAdd ENAME SS-LAYER))(If (= 0 (ITEM 62 ENT))
 (SsAdd ENAME SS-COLOR))(If (= "BYBLOCK" (ITEM 6 ENT))
 (SsAdd ENAME SS-LTYPE)))))(If (> (SsLength SS-LAYER) 0)
 (Progn (bump "Fixing layers")
   (Command "_.chprop" SS-LAYER "" "_LA" BLAYER "")))
   (If (> (SsLength SS-COLOR) 0)(Progn (bump "Fixing colors")
     (Command "_.chprop" SS-COLOR "" "_C" BCOLOR "")))
  (If (> (SsLength SS-LTYPE) 0)(Progn (bump "Fixing linetypes")
  (Command "_.chprop" SS-LTYPE "" "_LT" BLTYPE ""))))
 ;;;*************** END Burst.lsp *******************************

;;;Ф-ция взравает блоки BURST-ом
;;;Размеры, области - EXPLODE
;;; Взрывает все вложенные блоки
;;; Помещает остатки в набор *ssRET*
;;; Блокировка слоя не анализируется
;;; blk - Ename блока

(defun exp_blk ( blk  / adoc csp blk_obj)
;_Взрывает блок BURST'ом и возвращает список полученных объектов  
(defun BURST-LIST (blk / ret sc ec)
  (setq sc (1-(vla-get-count csp)))
  (BURST-ONE blk)
  (setq ec (vla-get-count csp))
  (while (< sc ec)
    (setq memb (vla-item csp sc))
    (setq ret (append ret (list memb)))
    (setq sc(1+ sc))) ret)
;_Взрывает объеты Expolde и помещает полученное в *ssREt*
(defun EXP2SS (en / sc ec)
  (setq sc (1-(vla-get-count csp)))
  (vl-cmdf "_.EXPLODE" en)
  (setq ec (vla-get-count csp))
  (while (< sc ec)
    (setq memb (vla-item csp sc))
    (ssadd (vlax-vla-object->ename memb) *ssRET*)
    (setq sc(1+ sc))))
;_Цикл по примитивам блока
;_Необходим, чтобы взорвать вложенные блоки
;_Помещает полученное в *ssREt*
;_ blk - Ename блока
  
(defun exp-blk-ss (blk / memb name)
(foreach memb (BURST-LIST Blk)
  (setq name (vla-get-ObjectName memb))
  (cond ((= name "AcDbBlockReference")(exp-blk-ss (vlax-vla-object->ename memb)));_BURST блокам
	((wcmatch (strcase name) "*DIMENSION,*REGION");_Взрываем размеры и области
	 (exp2SS (vlax-vla-object->ename memb)))
	(t  (ssadd (vlax-vla-object->ename memb) *ssRET*)))))
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
	blk_obj (vlax-ename->vla-object blk)
	csp (vla-ObjectIDToObject adoc (vla-get-OwnerID blk_obj)))
  (if (/= (type *ssRet*) 'PICKSET)(setq *ssRET* (ssadd)))
  (exp-blk-ss blk)
*ssRET*)

;;Пример использования - все примитивы взорванного блока делаются красным
(defun c:TEST ( / blk blk_obj)
(setq blk (car(entsel "\nУкажите блок")))
  ;_Чистим набор
  (setq *ssRET* nil *ssRET*  (ssadd))
  (exp_blk blk)
  (command "_CHANGE" *ssRET* "" "_P" "_C" 1 "")
  (princ))
VVA вне форума  
 
Непрочитано 25.10.2006, 15:43
#14
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


to VVA:

ух ты!
спасибо!
про vla-get-OwnerID и vla-ObjectIDToObject не знал

я правильно понял, что ID объекта неизменно до и после разбивки блока? если так, то [sm155]
хотя, нет наверное без объекта метки не обойтись...
и еще вопрос: ID сохраняется в пределах сеанса или навечно привязан к объекту?


а про возможность рекурсивного вызова функций я че-то даже не подумал

есчо раз спасибо! [sm3514]
Mr_Eugene вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > И опять VLA-SELECT

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

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