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

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

SSGET и XRECORD

Ответ
Поиск в этой теме
Непрочитано 24.02.2004, 00:30 #1
SSGET и XRECORD
{Smirnoff}
 
Инженер по системам безопасности
 
Рига
Регистрация: 23.11.2003
Сообщений: 1,099

Вопросик такой. Создаю я в базе рисунка XRecord:
Код:
[Выделить все]
(setq sc:settings_xr (entmakex (list '(0 . "XRECORD") '(100 . "AcDbXrecord") '(1 . "Settings") '(40 . 1.0))))
Проверяем это дело ENTGET:
Код:
[Выделить все]
(entget sc:settings_xr)
Получаем:
((-1 . <Entity name: 4006cd98>) (0 . "XRECORD") (330 . <Entity name: 0>) (5 . 
"33") (100 . "AcDbXrecord") (280 . 1) (1 . "Settings") (40 . 1.0))
Все вроде нормально, но не совсем. Когда я пытаюсь создать набор, чтобы потом "вытащить" из XRecord данные, функция SSGET возвращает nil:
Код:
[Выделить все]
(setq set (ssget "_X" '((0 . "XRECORD)(1 ."Settings"))))
nil
Да и вообще
(ssget "_X" '((0 . "XRECORD)))
nil
В чем может быть причина? Может XRecord вообще нельзя собрать в набор функцией SSGET? Либо XRecord должен быть включен в словарь? Либо только через чтение словаря его только и можно вытащить. Словарь я уже до этого создал и XRecord туда включил, а потом подумал нафига мне этот словарь? И быстрым движением все стер... А вот теперь у меня не получаеться как хотел, хочу разобраться, может можно все таки без словаря.

Мне нужно сохранять в чертеже некоторые параметры приложения, для работы в следующем сеансе.
Просмотров: 4638
 
Непрочитано 24.02.2004, 01:47
#2
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


>>Fantomas
ИНФОРМАЦИЮ МОЖНО ПРИШПИЛИТь К КАКОМУ-НИБУДь ПРИМИТИВУ ИСПОЛьЗУЯ REGAPP ФУНКЦИЮ.
ПОКОВЫРЯЙ ЭТУ ФУНКЦИЮ - ОЧЧЧЕНь ЗАНЯТНАЯ ШТУКОВИНА.
PRIMERCHIK:
Код:
[Выделить все]
(defun xd (/ ent1 ent lname xdt newent space)
(command "layer" "m" "base" "")
(setq ent1 (entnext))
(while
(/= ent1 nil) 
 (progn
   (setq ent (entget ent1))
   (setq lname (cdr (assoc 8 ent)))
   (regapp "PUD")
    (setq xdt
       (read (strcat "(" "(-3 ( \"PUD\" (1000 . \"" lname "\"))))")) 
    )
   (setq newent (append ent xdt))
   (entmod newent)
   (setq ent1 (entnext ent1))
 )
)
Startrek вне форума  
 
Непрочитано 24.02.2004, 14:49
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>Fantomas
Не знаю почему, но не видел примеров, чтоб XRECORD использовались без словаря.

>Startrek
Вы рассказываете об XDATA - расширенных данных примитива, а это немножко не одно и то же.
vk вне форума  
 
Автор темы   Непрочитано 24.02.2004, 16:36
#4
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Startek
Спасибо, Леонид. Расширенные данные я "цеплять" умею. Дело в том что: 1) графический объект может быть в любой момент стерт (заблокированный слой тоже не панацея) 2) параметров которые я хочу сохранять довольно много, посему "вжиматься" в список точечных пар разрешенных для расширенных данных не хочеться.

>VK
Да мне тоже кажеться, что SSGET работает только с "графическими" объектами. Я уже создавал словарь "обычным" методом и вносил туда X-записи. Все работает. Но сегодня я попытался сделать это через ActiveX и застопорился на одном моменте.

>ВСЕМ, ВСЕМ, ВСЕМ (программерам)
Посему вопросик посложнее. Все по порядку. Создаем мы значит пользовательский словарь, вносим туда X-запись:
Код:
[Выделить все]
;;;******************* ФУНКЦИЯ ПОДГОТОВКИ РАБОТЫ С ActiveX *******************

(defun sc_ax (/)
(vl-load-com)
  (setq sc:app (vlax-get-acad-object))
  (setq sc:act_doc (vla-get-activedocument sc:app))
  (setq sc:model (vla-get-modelspace sc:act_doc))
  (setq sc:paper (vla-get-paperspace sc:act_doc))
  (princ)
  ); end sc_ax

;;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

;;;***************** ФУНКЦИЯ СОЗДАНИЯ СЛОВАРЯ "My" ***********************

(defun dict_create (/)
(sc_ax)
  (if(= nil(dictsearch(namedobjdict) "My")) ; условие создания словаря по его отсутствию в базе
    (progn
    (setq sc:dict (entmakex '((0 . "DICTIONARY")(100 . "AcDbDictionary"))))
    (dictadd (namedobjdict) "My" sc:dict)
    (setq sc:vl_dict (vlax-ename->vla-object sc:dict))
    (setq sc:rec (vla-addXRecord sc:vl_dict "My_Record"))
    (setq sc:xrecdata (vlax-make-safearray ??????)) 
    (vla-SetXRecordData sc:rec vlax-vbArray sc:xrecdata)
    ); end progn
    ); end if
    (princ)
    ); end dist_create

;;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Словарь создаеться, "пустой" XRecord, я тоже записываю туда без проблемм. Вот как записать данные в этот XRecord?
В общем, вопрос с vla-SetXRecordData. Как правильно сформировать вариант типа Array и заполнить его значениями. Я что то совсем не понимаю, как элементы этого массива соотносяться с точечными парами которые в результате должны сохраняться в XRecord?
[sm1401]
{Smirnoff} вне форума  
 
Непрочитано 25.02.2004, 01:47
#5
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


>>Fantomas, vk
Вот что по этому поводу говорит HELP
Или я опять не в ту степь??

Xrecord objects are used to store and manage arbitrary data. They are composed of DXF group codes with normal object groups (that is, non-xdata group codes), ranging from 1 through 369 for supported ranges. This object is similar in concept to xdata but is not limited by size or order.

Xrecord objects are designed to work in such a way as not to offend releases R13c0 through R13c3. However, if read into a pre-R13c4 level of AutoCAD, xrecord objects disappear.

The following examples provide methods for creating and listing xrecord data.

(defun C:MAKEXRECORD( / xrec xname )
; create the xrecord's data list.
(setq xrec `((0 . "XRECORD")(100 . "AcDbXrecord")
(1 . "This is a test xrecord list")
(10 1.0 2.0 0.0) (40 . 3.14159) (50 . 3.14159)
(62 . 1) (70 . 180))
)

; use entmakex to create the xrecord with no owner.
(setq xname (entmakex xrec))

; add the new xrecord to the named object dictionary.
(dictadd (namedobjdict) "XRECLIST" xname)

(princ)
)


(defun C:LISTXRECORD ( / xlist )
; find the xrecord in the named object dictionary.
(setq xlist (dictsearch (namedobjdict) "XRECLIST"))

; print out the xrecord's data list.
(princ xlist)

(princ)
)
Startrek вне форума  
 
Автор темы   Непрочитано 25.02.2004, 10:32
#6
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Startek
Спасибо еще раз за отклик. "Обычным" способом который вы описываете у меня небыло проблемм. Я просто хотел сделать тоже самое через ActiveX и сделал:
Код:
[Выделить все]
(defun xrec_create (/ vlaXRecord XRecDataType XRecData)
  (if(= nil(dictsearch(namedobjdict) "MY_DICTIONARY"))
    (progn
    (setq scDictionary (entmakex '((0 . "DICTIONARY")(100 . "AcDbDictionary"))))
    (dictadd (namedobjdict) "MY_DICTIONARY" scDictionary)
    (setq vlaXRecord (vla-addXRecord (vlax-ename->vla-object scDictionary) "Scale"))
    (setq XRecDataType (vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbInteger '(0 . 1)) '(1 140))))
    (setq XRecData (vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbVariant '(0 . 1)) '("Scale" 1.0))))
    (vla-SetXRecordData vlaXRecord XRecDataType XRecData)
    (setq XRecord (vlax-vla-object->ename vlaXRecord))
    ); end progn
    ); end if
    (princ)
    ); end xrec_create
Правда в этом случае действовать "обычным" способом (без ActiveX) проще. Но хотелось попробовать и так и так, тем более что стараюсь чаще использовать ActiveX даже там где без него можно обойтись. Надо учиться с этим "зверем" работать, возможности то по круче.

Прошу прощения если там вкралась какая нибудь ошибочка, у меня все данные для работы этой функции передавались через аргументы. Но чтобы не вставлять огромный листинг, я ее привел к более простому виду прямо в окошке форума. Но кажется все правильно.
{Smirnoff} вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > SSGET и XRECORD

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

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