|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Возможны ли 64-битные вычисления в LISP?
Programming, automation, CADs, GISs. "Теплоком"
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 306
|
||
Просмотров: 2066
|
|
||||
Регистрация: 11.10.2010
Сообщений: 979
|
__________________
(/= RegDate StartReadDate) |
|||
![]() |
|
||||
Programming, automation, CADs, GISs. "Теплоком" Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306
|
>>Лиспер
Мне надо наоборот - из строкового представления ObjectId получить число. 64-битные ObjectId не удаётся обработать из-за того, что в LISP вычисления 32-битные.
__________________
На LISPе можно мыслить! |
|||
![]() |
|
||||
Programming, automation, CADs, GISs. "Теплоком" Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306
|
Объясню ситуацию.
Есть объектный реактор :vlr-SubObjModified. Прицеплен к BlockReference. В callback-функции реактора не удаётся получить доступ вообще ни к каким свойствам объекта, вызвавшего этот реактор (notifier-object), поскольку на момент отработки кода callback-функции реактора объект то ли открыт для редактирования, то ли ещё х.з. почему. Поправка. Попытка получения vla-свойств приводит к ошибке "Automation error: Object was open for notifying". Короче, внутри реактора нельзя получить ни хэндл объекта, ни вообще какие-либо vla-свойства. Более того, даже (entget (vlax-vla-object->ename notifier-object)) возвращает nil. Я выкрутился с помощью (vl-princ-to-string (vlax-vla-object->ename notifier-object)) (возвращает строку типа "<entity name: 7ec33d40>") и substr для извлечения символьного представления ObjectId. Далее это символьное представление передаётся как параметр внешней программе, которая дожидается освобождения када и вызывает нужную функцию, передавая уже ей строковое представление ObjectId. Эта функция преобразует полученную hex-строку в целое число (для передачи методу ObjectIdToObject; математика преобразования элементарная: <младший_разряд>*(16^0) + <следующий_разряд>*(16^1)+<следующий_разряд>*(16^2)+...) и методом ObjectIdToObject получает объект, с которым надо работать. На x86 всё прекрасно работало, на x64 возник затык с разрядностью. В общем, если вкратце, то методу ObjectIdToObject надо передавать число, а у меня имеется только hex-строка, которую в 64-битном диапазоне я как раз и не могу корректно преобразовать в число.
__________________
На LISPе можно мыслить! Последний раз редактировалось Ax3, 01.03.2011 в 18:44. |
|||
![]() |
|
||||
Регистрация: 11.10.2010
Сообщений: 979
|
Я не работал с такими реакторами, поэтому вопрос: notifier-объект - это BlockDefinition или изменяемый в его составе объект?
P.S. А почему бы во внешней программе не попрбовать получить указатель на объект? И возвращать уже его? Или такое не сработает в принципе?
__________________
(/= RegDate StartReadDate) |
|||
![]() |
|
||||
Programming, automation, CADs, GISs. "Теплоком" Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306
|
В качестве notifier-object функция реактора получает указатель на BlockReference (ну то есть экземпляр блока), атрибуты которого пользователь только что изменил.
Поправка. notifier-object - это vla-объект. Да, выполнить преобразование во внешней программе - возможно, получится. Даже скорее всего. Но много переделывать придётся. Впрочем, если в LISP невозможно организовать 64-битные вычисления - куда деваться :-). Для меня просто сама ситуация выглядит странной - Автокад 64-битный сделали, а LISP работать с 64-битными числами не научили?
__________________
На LISPе можно мыслить! Последний раз редактировалось Ax3, 01.03.2011 в 18:40. |
|||
![]() |
|
||||
Programming, automation, CADs, GISs. "Теплоком" Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306
|
Так в том-то и загвоздка, что не могу в объектном реакторе на событие :vlr-subobjmodified получить хэндл объекта. Как-то нелепо...
Короче, я в своём конкретном случае выкрутился - сохраняю в глобальную переменную с именем tmp__<hex-строка_ObjectId> значение (vlax-vla-object->ename notifier-object), потом оттуда читаю, получается, сразу entity name. Всё работает. ObjectIdToObject32 не решит проблему, поскольку ей на входе как раз требуется 64-битное значение. Единственное, чем она отличается от ObjectIdToObject (как я понял) - это как раз тем, что она работает с 64-битными входными данными, и в 64-битной системе, я так понимаю, её как раз и надо использовать вместо ObjectIdToObject. Как бы там ни было, у меня не получается сформировать корректные входные данные для этой функции как раз потому, что все мои сложения и умножения при преобразовании строки в число выполняются в 32-битном режиме. Да в общем, не так важно, я свою конкретную проблему привёл просто в качестве примера ситуации, когда были бы очень кстати 64-битные вычисления. В общем, я так понял, ответ на заявленный в теме вопрос - нет. То есть 64-битные вычисления в AutoLISP невозможны. (Примечание. В AutoCAD до 2009 включительно, в более новых не проверял пока.) Всё верно? >>Лиспер. Александр Ривилис Огромное спасибо за участие!
__________________
На LISPе можно мыслить! Последний раз редактировалось Ax3, 02.03.2011 в 10:24. |
|||
![]() |
|
||||
Programming, automation, CADs, GISs. "Теплоком" Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306
|
да. (entget) внутри реактора возвращает nil.
То есть единственное, чем у меня получилось оперировать для передачи указателя на объект между функциями - это entity name.
__________________
На LISPе можно мыслить! Последний раз редактировалось Ax3, 02.03.2011 в 21:45. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) | Red Nova | LISP | 5021 | сегодня 17:50 |
{Конкурс} Lisp. Задачки для студентов | gomer | LISP | 10 | 05.01.2011 16:33 |
Запуск Lisp команды в новом документе | BlackHarp | LISP | 1 | 26.03.2009 23:06 |
LISP на _purge | Малюк | LISP | 12 | 23.12.2007 18:15 |
загрузка DOS прог через LISP | Gaa | LISP | 15 | 12.08.2005 19:19 |