Тема: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

Вообще, мне надо записать объект из VBA, чтобы потом (асинхронно) прочитать его в Лиспе. Имхо, для этого надо использовать Х-записи пользовательского словаря, потому что они могут содержать объекты (или я ошибаюсь ?!!!).
Вот обработчик события, в котором я использую запись объекта в Х-запись словаря:

Private Sub AcadDocument_SelectionChanged()
  Dim d As AcadDictionary, rec As AcadXRecord
  On Error Resume Next
  ActiveDocument.Dictionaries.Item("LAST_SEL").Delete
  On Error GoTo 0
  Set d = ActiveDocument.Dictionaries.Add("LAST_SEL")
  Set rec = d.AddXRecord("SEL")
  Dim q As Variant, c As Variant
  ReDim c(0 To 0) As Integer
  ReDim q(0 To 0) As Variant
  c(0) = 1
  Set q(0) = ActiveDocument.ActiveSelectionSet
  rec.SetXRecordData c, q
End Sub

Выдаёт ошибку: Method "AddXRecordData" of object "IAcadXRecord" failed
То, что это обработчик события, непринципиально, ошибка в этом коде возникает и в обычной процедуре. То, что я там наворотил с динамическими массивами, не ругайте - прошлый раз только так мне удалось записать в словарь, правда, строки, а не объекты.
Может, есть другой способ записать ОБЪЕКТ, чтобы потом прочитать его в Лиспе ? А через Х-записи это вообще невозможно ?

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

Maxim T,
Есть идея:
Если запись объекта ActiveSelectionSet в словарь "в лоб" не получается, я бы попробовал сохранить в словаре массив идентификаторов (ObjectID типа Long) входящих в ActiveSelectionSet. ObjectID является свойством любого объекта.
Идентификатор объекта уникален в пределах жизненного цикла чертежа DWG, так что путаницы быть не может.
ALink

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

> ALink
Спасибо. А объекты, похоже, нельзя записывать в словарь в принципе...

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

Ну вот же есть пример в Help'е, только речь идет об объектах AutoCAD или таких же из ObjectARX...
Или я неправильно понял вопрос?

' This example creates a dictionary and adds
    ' a custom object to that dictionary.
    Dim dictObj As AcadDictionary
    Set dictObj = ThisDrawing.Dictionaries.Add("TEST_DICTIONARY")
    ' Load the ARX application that defines the custom object.
    ' Note: The application listed here does not exist and
    ' will cause an error when run. Change the application name
    ' to the path and name of your ARX Application.
    ThisDrawing.Application.LoadArx ("MyARXApp.dll")
    ' Create the custom object in the dictionary
    Dim keyName As String
    Dim className As String
    Dim customObj As AcadObject
    keyName = "OBJ1"
    className = "CAsdkDictObject"
    Set customObj = dictObj.AddObject(keyName, className)

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

> Leonid
Дружище,
в приведенном примере речь идет именно о  пользовательских объектах. Это означает, что вы должны загрузить приложение ObjectARX, а ваш объект должен пройти соответствующую регистрацию. Попробуйте этот пример модифицировать, чтобы сохранить в словаре какоq-либо "нормальный" примитив, скажем, AcadLine. Ничего не выйдет.  (Если получится, не сочтите за труд, вышлите код.) Зато работает способ с получением доступа к  объектам по их ID из XRecord, я пробовал.
С уважением,
ALink

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

> ALink
Есть некоторые соображения, но надо проверить. О результатах постараюсь доложить.

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

Что за упаднические настроения... Сначала запоминаем в словаре не объект набора а его имя:

Sub AddObjectToXRecord()
Dim Dict As AcadDictionary
Dim xRec As AcadXRecord
Dim dType(0 To 0) As Integer
Dim dVal(0 To 0) As Variant
Dim selSet As AcadSelectionSet
Set selSet = ActiveDocument.ActiveSelectionSet
Set Dict = ActiveDocument.Dictionaries.Add("New_Dict")
Set xRec = Dict.AddXRecord("My_SelSet")
dType(0) = 0
dVal(0) = selSet.Name
xRec.SetXRecordData dType, dVal
End Sub

Понятно что для текущего набора оно будет "CURRENT", так ведь можно сделать и именной набор.
Затем выуживаем запись с помошью AutoLISP.

;;;****************************************************************************
;;;************** ФУНКЦИЯ ПОЛУЧЕНИЯ МЕТКИ ОБЪЕКТА КОЛЛЕКЦИИ *******************
;;;****************************************************************************
;;;                                                                           *
;;; Функция получает в качестве аргументов VLA-метку коллекции и название     *
;;; (или номер) элемента. Возвращает его VLA-метку или NIL в случае           *
;;; отсутствия.                                                               *
;;;                                                                           *
;;;****************************************************************************
(defun #xdm_Col_Item_Find (
         Collection   ; VLA- метка коллекции
         Item    ; название или номер элемента
         /
         result  ; возвращаемая метка элемента или NIL
         )
  (if
    (not
      (vl-catch-all-error-p  ; если нет ошибки
  (setq result
         (vl-catch-all-apply 'vla-item
     (list Collection Item))))) ; возвратить метку объекта
    result
    ); end if
  ); end of #xdm_Col_Item_Find
;;;..............................................................................
*************************************************************************
;;;******************* ФУНКЦИЯ ПОЛУЧЕНИЯ ДАННЫХ Х-ЗАПИСИ **********************
;;;****************************************************************************
;;;                                                                           *
;;; Функция получает в качестве аргументов имя словаря, название Х-Записи и   *
;;; возвращает список состоящий из списков типов и данных.                    *
;;;                                                                           *
;;;****************************************************************************
(defun #xdm_XRecord_Get_Data (
            dicName   ; имя словаря
            recName    ; имя Х-записи
             /
        dictCol    ; коллекция словарей
        curDict    ; текущий словарь
        curXRec    ; текущая Х-запись
              Types
              Data
              tList
              dList
              outList
            )
  (setq dictCol
   (vla-get-dictionaries
     (vla-get-activedocument
       (vlax-get-acad-object)))) ; получить коллекцию словарей
    (if
    (setq curDict(#xdm_Col_Item_Find dictCol dicName)) ; если найден нужный словарь
    (progn
      (if
  (setq curXRec(#xdm_Col_Item_Find curDict recName)) ; если найдена нужная Х-Запись
  (progn
    (vla-GetXRecordData curXRec 'Types 'Data) ; получить варианты типов и данных
    (setq Types(vlax-safearray->list Types) ; получить список типов
    Data (vlax-safearray->list Data) ; получить список данных
    dList(mapcar 'vlax-variant-value Data) ; получить список из вариантов данных
    outList(list Types dList) ; сформировать возвращаемый список
    ); end setq
    (vlax-release-object curXRec) ; удалить VLA-объект Х-Записи
    ); end progn
  ); end if
      (vlax-release-object curDict) ; удалить VLA-объект Словаря
      ); end progn
    ); end if
  (vlax-release-object dictCol) ; удалить VLA-объект коллекции словарей
  outList ; возвратить список из списка типов и данных
  ); end of #xdm_XRecord_Get_Data

Затем находим через лисп нужный набор в коллекции Наборов по имени. Кстати можно опять же с помощью функции  #xdm_Col_Item_Find ...
Еще надо учесть что в словари не пишется что попало и попытка записать в группу 0 что либо кроме строки обречена на неудачу. Типы данных в X-Записи распределяются следующим образом:

0?9
 String (with the introduction of extended symbol names in AutoCAD 2000, the 255-character limit has been lifted. There is no explicit limit to the number of bytes per line, although most lines should fall within 2049 bytes)
10?39
 Double precision 3D point value
40?59
 Double-precision floating-point value
60?79
 16-bit integer value
90?99
 32-bit integer value
100
 String (255-character maximum; less for Unicode strings)
102
 String (255-character maximum; less for Unicode strings)
105
 String representing hexadecimal (hex) handle value
110?119
 Double precision floating-point value
120?129
 Double precision floating-point value
130?139
 Double precision floating-point value
140?149
 Double precision scalar floating-point value
170?179
 16-bit integer value
210?239
 Double-precision floating-point value
270?279
 16-bit integer value
280?289
 16-bit integer value
290?299
 Boolean flag value
300?309
 Arbitrary text string
310?319
 String representing hex value of binary chunk
320?329
 String representing hex handle value

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

XRecord is capable of storing object IDs, which allows XRecords to own other objects including other XRecords
Меня здесь болше всего привлеkает строка о том что XRecord в состоянии хранить другой  XRecord. Есть идеи как ето сделать??

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

cadhelp пишет:

XRecord is capable of storing object IDs ...

Прошу быть осторожными с хранением в словарях ID объектов. ID остаются актуальными лишь в пределах текущего сеанса. Попытка назавтра обратиться к объекту по его ID из XRecord вашего словаря закончится фатально. Сохранять следует значения дескрипторов Handle.
Подробнее (в том числе и о непрятных моментах) см.:
https://www.caduser.ru/forum/topic17720.html
Запись XRecord в XRecord, действительно открывает любопытные возможности.
Например, несколько коллекций хранят Handle выделенных юзером объектов из различных смысловых групп. А сами эти коллекции являются элементами "более общей" коллекции, с помощью которой удобно удобно получать доступ к наборам пользователя и делать с ними нечто полезное.
Коллекция "верхнего" уровня сохраняется в своей записи XRecord, а уже в нее записываются записи XRecord "частных" наборов.
Этот подход, вероятно, сгодится для сохранения иерархических списков (структур) данных между сеансами работы с чертежом.

Re: Добавление ОБЪЕКТОВ в Х-записи словаря - кто делал ?

> Этот
подход, вероятно, сгодится для сохранения
>иерархических списков (структур) данных между
> сеансами работы с чертежом.
в етом и идея

dictionary_trees
->
   XRecТрее_less_then_5м
      ->XRecord("0"):(x,y,type,address)
      ->XRecord("n+1"):(x,y,type,address)
      ->...
   XRecТрее_less_then_10м
      ->XRecord("0"):(x,y,type,address)
      ->XRecord("n+1"):(x,y,type,address)
      ->...
   XRecТрее_...