Как передать OdjctId.Null в Autolisp?

Автор Тема: Как передать OdjctId.Null в Autolisp?  (Прочитано 11896 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Здравствуйте!
Помогите начинающему.
Два вопроса:
1. Есть ли возможность вернуть из [LispFunction] в Autolisp ObjectId.Null? AutoCAD выдает ошибку eNullObjectId, а жаль.
2. Не нашел в SDK ничего, связанного с IdBuffer. С какой стороны к нему подойти, чтобы иметь возможность прочитать/записать в него данные?
Копию интернета уже сделал, ответов пока не нашел.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #1 : 15-03-2017, 13:21:42 »
Давайте зайдем с другой стороны. Что должна вернуть Lisp-функция, если ObjectId.IsNull? В Lisp нет прямого эквивалента ObjectId.Null, поэтому и ошибка. По идее, функция должна вернуть NIL, в .NET его эквивалент - null.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #2 : 15-03-2017, 13:24:21 »
2. Не нашел в SDK ничего, связанного с IdBuffer. С какой стороны к нему подойти, чтобы иметь возможность прочитать/записать в него данные?
Это что за IdBuffer?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #3 : 15-03-2017, 13:25:28 »
А мне казалось, что есть. <EntityName: 0>

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #4 : 15-03-2017, 13:26:52 »
AcDbIdBuffer
В лиспе (0 . "IDBUFFER")
Очень полезная оказалась вещь. Активно использую... но пока только в лиспе.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #5 : 15-03-2017, 13:27:45 »
А мне казалось, что есть. <EntityName: 0>
Ок, может быть и есть. Но лично я бы предпочел получить NIL вместо этого пустого ENAME.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #6 : 15-03-2017, 13:29:46 »
AcDbIdBuffer
В лиспе (0 . "IDBUFFER")
Очень полезная оказалась вещь. Активно использую... но пока только в лиспе.
Это недокументированная вещь и поэтому использовать не рекомендую. Для него нет никакого API. И честно говоря не понимаю зачем его можно использовать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #7 : 15-03-2017, 13:30:17 »
Код - Auto/Visual Lisp [Выбрать]
  1. (setq *NullEntity* (cdr (assoc 330 (entget (namedobjdict)))))
и
Код - Auto/Visual Lisp [Выбрать]
  1. (defun idbmake (aCustomData)
  2.   (entmakex
  3.     (cons
  4.       (cons 0 "IDBUFFER")
  5.       (cons (cons 100 "AcDbIdBuffer")
  6.             aCustomData))))
Даннные в нем EntityNames с кодом 330

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #8 : 15-03-2017, 13:36:41 »
Я это обнаружил в документации по DXF в хелпе
http://help.autodesk.com/view/ACD/2017/ENU/?guid=GUID-7A243F2B-72D8-4C48-A29A-3F251B86D03F
Потестировал. И использую для сохранения наборов EntityNames.
Вот хотел попробовать пообщаться с IdBuffer через c#.

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #9 : 15-03-2017, 13:49:12 »
Цитировать
Ок, может быть и есть. Но лично я бы предпочел получить NIL вместо этого пустого ENAME.
Дык Nil - это пусто, а <EName: 0> значит, что объект был и был удален, и скорее всего не в этой сессии акада.
Я это дело использую именно для таких проверок. <EName: 0> часто образуются в xRecord и IdBuffer.
В лиспе <EName: 0> можно сравнить с другим <EName: 12345> с помощью eq, например.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #10 : 15-03-2017, 13:58:20 »
Может быть, в каком-то контексте это и удобно, не спорю. Я себе представлял такой сценарий:
Код - Auto/Visual Lisp [Выбрать]
  1. (if (setq ename (my-super-puper-lisp-function-from-net))
  2.   (Alert "Ename получен, выполняем с ним какие-то действия")
  3.   (Alert "Ename не удалось получить, ничего не делаем")
  4. )

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #11 : 15-03-2017, 14:04:52 »
Кирилл Никифоров
Я бы рекомендовал заменить IDBUFFER на XRECORD, так как для него есть и документация  и API и в .NET и в lisp и в ObjectARX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #12 : 15-03-2017, 16:28:08 »
Дык Nil - это пусто, а <EName: 0> значит, что объект был и был удален, и скорее всего не в этой сессии акада.
а если возвращать LispDataType.None (int 5000) ?

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #13 : 15-03-2017, 16:37:35 »
Александр, Дмитрий! Спасибо.

Получается, что это не вопросы у меня были, а лайф-хаки.  ;D
Жалко, что переход с лиспа на .net не получается плавным. Общего у них маловато.
Надо переписывать все целиком, да еще и структуру данных пересматривать.

PS. Тогда поделюсь опытом. Может, кому пригодится.
1. Сравнение с <EntityName: 0> перед вызовом entget позволяет в autolisp избежать прерывания выполнения кода.
2. IdBuffer отлично сохраняется в любом Dictionary, xDictionary. Данные в нем можно перезаписать в autolisp (не vla) без удаления самого буфера, в отличие от XRecord.

Оффлайн Кирилл НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 4
Re: Как передать OdjctId.Null в Autolisp?
« Ответ #14 : 15-03-2017, 16:48:46 »
Цитировать
а если возвращать LispDataType.None (int 5000) ?

А на входе в лисп все равно будет nil. Или пусто.
Дело в том, что <EntityName: 0> не я создаю, они уже есть в данных, извлеченных из xRecord, например. И мне их надо прочитать.
И если они записаны с кодом LispDataType.ObjectId, то и читать их надо как EntityName.
Т.е. и в с# и в autolisp по отдельности проблем нет. А вот как передать такие данные из .net в лисп - вопрос.