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

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

что не так с (vla-copyobjects)?

Ответ
Поиск в этой теме
Непрочитано 09.02.2006, 09:29 #1
что не так с (vla-copyobjects)?
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 40,411

Собственно проблема в следующем: в файле есть описания блоков, например, block_src. Этот блок может не иметь точки вставки, т.е. есть только описание его. Создается block_dest с использованием такого кода:
Код:
[Выделить все]
(vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) insertion-point block_dest_name)
В block_dest надо скопировать весь состав block_src (а там может быть все - и атрибуты в том числе) и добавить еще некоторое количество примитивов (не атрибуты - это гарантированно).
Блоки не анонимные. В блоке block_dest не должно быть описания блока block-src!
До состава блока block_src я добрался, список vla-указателей на состав блока получен. В этот список добавлены и эти отдельные примитивы.
Теперь собственно проблема:
При выполнении
Код:
[Выделить все]
(vla-copyobjects (vla-get-activedocument (vlax-get-acad-object)) (vlax-make-safearray vlax-vbobject (cons 0 (1- (length obj_list)))) obj_list) block_dest)
Вываливается ошибка "Invalid owner object" (это еще до атрибутов дело не дошло - они копируются отдельно).
Что делать, как обойти?
В более общем случае блоков block_src может быть несколько, у них могут быть собственные углы поворота (имена атрибутов гарантировано не совпадают).
Слой у примитивов блоков гарантированно один - "0".
Попытка пройтись через (entmake) (как сделано в ruCAD'e для многократной вставки блоков) тоже успеха не имела - не создается блок и все!
---
Или обязательно вставлять блок, разбивать его и получать ссылки на созданные объекты?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 3934
 
Непрочитано 09.02.2006, 09:56
#2
ZZZ

электрик
 
Регистрация: 11.03.2005
Киев
Сообщений: 157


Код:
[Выделить все]
;;;Переименовать блок
(defun c:z-block-rename  (/ select block block_name_old block_name_new object)
  (z-undo-begin-group 0)
  (setq select (entsel "\nSelect block:"))
  (while (or
	   (not select)
	   (not(z-ent-is-insert (car select)))
	   )
    (setq select (entsel "\nSelect block:")))
  (setq block (car select))
  (setq block_name_old (z-ent-dxf-code-data 2 block))
  (setq block_name_new (z-dialog-text-edit block_name_old))
  (if (and block_name_new (/= block_name_old block_name_new))
    (progn
      (entmake)
      (entmake (subst (cons 2 block_name_new)
		      (cons 2 block_name_old)
		      (entget (tblobjname "block" block_name_old))))
      (setq object (tblobjname "block" block_name_old))
      (while (and
	       (setq object (entnext object))
	       (not(z-ent-type-p ename "ENDBLK"))
	       )
	(entmake (entget object))
	)
      (entmake '((0 . "ENDBLK")))
      (entmake)
      (entmod (subst (cons 2 block_name_new) (cons 2 block_name_old) (entget block)))
      (entupd block)
      )
    ) ;if
  (z-undo-end-group 1)
  (princ)
  );z-block-rename
Единственное условие - вставить блок в чертёж и только его переименовать, а только потом добавлять атрибуты и примитивы в описание блока. Тут всех своих вложеных функций не привел, но принцип рабочий.
__________________
Когда под рукой нет ничего кроме молотка - всё вокруг кажется гвоздями...
Выбор правильного инструмента - залог успеха в любом деле.
ZZZ вне форума  
 
Непрочитано 09.02.2006, 13:32
#3
fixo

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


На скорую руку для наглядности
Смотри кто у кого владелец:

Код:
[Выделить все]
(defun C:test (/	 adoc	   blk_coll  blk_def1  blk_def2
	       blk_obj1	 blk_obj2  bname1    bname2    items
	       tmp
	      )
  (vl-load-com)
  (setq	adoc	 (vla-get-activedocument (vlax-get-acad-object))
	blk_coll (vla-get-blocks adoc)
  )
  (setq	blk_obj1 (vlax-ename->vla-object
		   (car (entsel "\n >> Блок в который копируем >>\n"))
		 )
	blk_obj2 (vlax-ename->vla-object
		   (car (entsel "\n >> Блок откуда копируем >> \n"))
		 )
	bname1	 (vlax-get blk_obj1 'Name)
	bname2	 (vlax-get blk_obj2 'Name)
	blk_def1 (vla-item blk_coll bname1)
	blk_def2 (vla-item blk_coll bname2)
  )
  (vlax-for a blk_def2
    (setq items (cons a items))
  )
  (setq	tmp (vlax-safearray-fill
	      (vlax-make-safearray
		vlax-vbobject
		(cons 0 (1- (length items)))
	      )
	      (reverse items)
	    )
  )

  (vla-copyobjects adoc tmp blk_def1)
  (mapcar (function (lambda (x)
		      (vl-catch-all-apply
			(function (lambda ()
				    (vlax-release-object x)
				  )
			)
		      )
		    )
	  )
	  (list blk_obj1 blk_obj2 blk_def1 blk_def2 blk_coll)
  )
  (princ)
)
Fatty

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 09.02.2006, 14:49
#4
Кулик Алексей aka kpblc
Moderator

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


Наверное, я хреново объяснил. В общем, суть такова - ни блок-источник, ни блок-получатель не вставлены в файл (т.е. там есть только их описание).
Все равно за идеи спасибо, сейчас пробую.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.02.2006, 18:17
#5
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Код:
[Выделить все]
(setq doc (vla-get-activedocument
         (vlax-get-acad-object)
       ) ;_  vla-get-activedocument
) ;_  setq
;создаем первый блок и добавляем в него линию
(setq blk-1 (vla-add (vla-get-blocks doc) (vlax-3d-point 0. 0. 0.) "1"))
(vla-AddLine blk-1 (vlax-3d-point 0. 0. 0.) (vlax-3d-point 100. 0. 0.))

;создаем второй блок
(setq blk-2 (vla-add (vla-get-blocks doc) (vlax-3d-point 0. 0. 0.) "2"))
;и копируем в него первый объект из описания первого блока
(vla-copyobjects doc
           (vlax-make-variant
             (vlax-safearray-fill
               (vlax-make-safearray
                 '9
                 (cons 0 0)
               ) ;_ vlax-make-safearray
               ;Считываем содержимое первого блока в список
               (list (vla-item blk-1 0))
             ) ;_  vlax-safearray-fill
           ) ;_  vlax-make-variant
           blk-2
) ;_  vla-copyobjects
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 10.02.2006, 09:54
#6
Кулик Алексей aka kpblc
Moderator

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


Спасибо, взял за основу последний код. Проверяю
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > что не так с (vla-copyobjects)?