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

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

Как отличить блок от обычного примитива (ActiveX) ?

Ответ
Поиск в этой теме
Непрочитано 19.04.2007, 20:33 #1
Как отличить блок от обычного примитива (ActiveX) ?
Matt
 
Питер
Регистрация: 18.04.2007
Сообщений: 4

Помогите, пожалуйста. Начал осваивать ActiveX и столкнулся с такой проблемой: не могу отличить блок от обычного примитива
Код:
[Выделить все]
(setq e1 (entnext))  ; get first record in database
  (while (NOT (eq e1 nil))
    (setq blockObj (vlax-ename->vla-object e1))
    (if 
       (eq :vlax-true (vla-get-HasAttributes blockObj))
   ....
В случае если в blockObj прочитался обычный примитив - программа вылетает, т.к. ActiveX не знает что такое HasAttributes. Как проверить, что в blockObj прочитался именно блок?? Или другое решение - как перебирать только блоки?
Просмотров: 2807
 
Непрочитано 19.04.2007, 21:39
#2
Лентяй

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


Молодой человек! [sm2001] Во-первых, блок может не иметь атрибутов (на чем, собсно, вы и попались ). Во-вторых, вставки блоков в ActiveX называются AcDbBlockReference. И, наконец, в третьих, смешивать функции AutoLISP и ActiveX - это дурной тон (спросите хоть kpblc'а). А потому хорошие дети поступают так:
Код:
[Выделить все]
(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(mapcar '(lambda (x y / n) (if (> (setq n (vla-get-count x)) 0)
			   (if (= (vla-get-ObjectName (vla-item x (1- n))) "AcDbBlockReference")
			     (print y))
			   (print "\nТута пусто")))
	(list (vla-get-ModelSpace adoc) (vla-get-PaperSpace adoc)) '("\nЭто блок!" "\nЭто не блок!"))
Лентяй вне форума  
 
Непрочитано 21.04.2007, 00:37
#3
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


->Matt
Как-то неверно вы представили себе объектную модель. Блок не надо путать с его вхождением - это небо и земля. Пользуйтесь справкой: F1->ActiveX and VBA Reference->Object Model очень помогает наглядно всё понять.

Код:
[Выделить все]
(vlax-for object (vla-get-ModelSpace
		   (vla-get-ActiveDocument (vlax-get-acad-object))
		   ) ;_ конец vla-get-ModelSpace
  (if (= (vla-get-ObjectName object) "AcDbBlockReference")
    (princ
      (strcat "\nInsert==="
	      (vla-get-name object)
	      (if (equal (vla-get-HasAttributes object) :vlax-true)
		"\t есть атрибуты"
		"\t нет  атрибутов"
		) ;_ конец if
	      ) ;_ конец strcat
      ) ;_ конец princ
    (princ (strcat "\n---------" (vla-get-ObjectName object)))
    ) ;_ конец if
  ) ;_ конец vlax-for
->Лентяй - чего-то намудрил.... :roll:
Евгений А. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как отличить блок от обычного примитива (ActiveX) ?