Тема: entmod и расширенные данные

Вопрос поднимался на данном форуме , однако
ответа дать никто не смог.
Почему при удалении или модификации  группы -3 entget примитива
расширенные данные не удаляются и не редактируюся? осталось ждать ответа  только
от Н.Н.Полещука или
shaggy doc?

Re: entmod и расширенные данные

Тоже задавался этим вопросом, но ни в хелпе, ни в др. литературе не встречал ничего об удалении\редактировании. Может быть (рискну предположить), где нибудь в документации есть сноска что -3 группа это "только для чтения" при наличии таковой.

Re: entmod и расширенные данные

Цитата из Visual LISP Developer's Guide/Using the AutoLISP Language/Using AutoLISP to Manipulate AutoCAD Objects/Extended Data - xdata/Retrieval of Extended Data:

(setq working_elist
  (entget ent_name
    '("MY_APP_1" "SOME_OTHER")  ; Only xdata from "MY_APP_1"
  )                             ; and "SOME_OTHER" is retrieved.
)
(if working_elist
  (progn
    ...                         ; Updates working entity groups.
    (entmod working_elist)      ; Only [b]xdata[/b] from registered
  )                             ; applications still in the
)                               ; working_elist list [b]are modified[/b].

As the sample code shows, you can modify xdata retrieved by entget by using a subsequent call to entmod, just as you can use entmod to modify normal definition data. You can also create xdata by defining it in the entity list passed to entmake.
То есть можно модифицировать расширенные данные.

Re: entmod и расширенные данные

Ребята, я раньше в дискуссию не влезал, но не понимаю что же у Вас не выходит
У меня прекрасно редактируются и удаляются расширенные данные. Для удаления расширенных данных передавайте в entmod имя приложения ,без данных.
Прилагаю две свои старые простенькие функции для чтения и записи расширенных данных

;*************************************************************************
;Функция записывает в расширенные данные прмитива Prim
;Параметры:
;App - Имя приложения
;Prim - имя примитива
;DataList - список расширенных данных
;Элементами списка могут быть действительные и целые числа, строки и точки
;*************************************************************************
(defun SetExtData (App Prim DataList / AList)
 (if (not (tblsearch "APPID" App)) (regapp App))
 (setq AList '((STR 1000)(REAL 1040)(INT 1070)(LIST 1011))
   DataList (mapcar
         '(lambda (x) (cons (cadr (assoc (type x) AList)) x))
         DataList
        )
 )
 (entmod (cons (list -3 (cons App DataList)) (entget Prim)))
)
;******************************************************************
;Функция возвращает список из расширенных данных примитива Prim,
;занесенный туда с помощью функции SetExtData
;App - имя приложения
;******************************************************************
(defun GetExtData (App Prim)
 (mapcar 'cdr (cdadr (assoc -3 (entget Prim (list App)))))
)
-----------------------------------------------------------

Обратите внимание, что данные передаются только одноуровневым списком, который может включать строки, числа и точки
Пример.
Пусть в переменной Prim хранится имя примитива
Пишем данные в приложение TEST

(SetExtData "TEST" Prim '("Мама" "мыла" "раму" "Машей" 2003))

Пишем данные в приложение TEST1

(SetExtData "TEST1" Prim '("Маша" "мыла" "раму" "мамой" 1999 (1.0 2.0 4.0)))

Проверяем правильность записи данных

(GetExtData "TEST" Prim) Возврат: ("Мама" "мыла" "раму" "Машей" 2003)
(GetExtData "TEST1" Prim) Возврат: ("Маша" "мыла" "раму" "мамой" 1999 (1.0 2.0 4.0))

Удаляем данные из TEST:

(SetExtData "TEST" Prim nil)

Проверяем удаление

(GetExtData "TEST" Prim) Возврат nil

Re: entmod и расширенные данные

что-то я не совсем понял о чем идет речь. Про удаление РДП ничего сказать не могу - просто не пробовал, не было такой необходимости (как я понимаю речь идет об удалении ВСЕХ данных КАКОГО-ЛИБО приложения). Но вот с редактированием работал много и без всяких проблем...
Может подробнее расскажете в чем проблема, какой акад, как делаете???

Re: entmod и расширенные данные

> Олег
Тогда где ошибка?

(defun xdata-remove()
  (if
    (not (tblsearch "appid" "mydata"))
    (regapp "mydata")
    );if
  (setq name (car(entsel "\nВыберите примитив:"))
        data-name (entget name '("mydata"))
    )
  (if
    (equal
    (car(last data-name))
    -3)
    (progn
    (setq data-name (vl-remove
(last data-name) data-name));список изменился
;расширенных данных нет
    (entmod data-name);Возвращает список без xdata значит
;модификация произошла.Однако при проверке
;после выполнения программы данные остаются.
       );progn
    );if
  (princ)
  )

Re: entmod и расширенные данные

Ошибка в том, что для удаления расширенных данных надо (как я уже написал Выше и привел пример) записать в примитив имя приложения без данных.
В том и смысл расширенных данных, что они могут писаться разными разработчиками. Почему ты решил, что если делать entmod без группы -3 - то все расширенные данные должны стираться? Тогда при любом entmod обычных свойств примитива - грохались бы абсолютно все расширенные данные.
Если изменять твой пример, то получится что-то типа

(я не проверял, но прнинцип должен быть ясен)
(defun xdata-remove()
  (if  (not (tblsearch "appid" "mydata"))    (regapp "mydata"))
  (setq name (car (entsel "\nВыберите примитив::"))
    data-name (entget name '("mydata"))
  )
  (if (assoc -3 data-name)
    (progn
      (setq data-name (subst '(-3 ("mydata")) (assoc -3 data-name) data-name))
      (entmod data-name)
    )
  )
)

Re: entmod и расширенные данные

Спасибо.Работает.
Однако (assoc -3 ...) применять нельзя-выдает ошибку.

Re: entmod и расширенные данные

А в каком случае (assoc -3 ...) может выдавать ошибку?

Re: entmod и расширенные данные

> Олег
(-3("mydata"(100....)))-список не ассоциативный.

Re: entmod и расширенные данные

Эдуард,
в моем примере я применял assoc к результату работы функции entget, который ВСЕГДА ассоциативен
(-3("mydata"(100....))) - сам по себе список не ассоциативный, но когда он входит как подсписок в результат, возвращаемый функцией entget, то -3 является обычным ассоциатором.
(assoc -3 (entget Prim '("mydata"))) - определяет, имеются ли у примитива расширенные данные в принципе.

Re: entmod и расширенные данные

> Эдуард

(-3("mydata"(100....)))-список не ассоциативный.

-разумеется, тут и Вы и Олег полностью правы - это обычный список, а внутри другого списка он будет ассоциативным, даже так:
((-3("mydata"(100....))) )
Довольно частая ошибка, между прочим...

Re: entmod и расширенные данные

> Олег

> Сергей Попадьин
Точно , я погорячился.Assoc работает.
Создавал программу модификации Xdata в диалоговом
режиме. assoc где-то заглючил и я его отбросил.
Сейчас все в порядке.
Еще раз Олег - Спасибо.