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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получить ObjectID as Long в AutoCAD2010 x64

Получить ObjectID as Long в AutoCAD2010 x64

Ответ
Поиск в этой теме
Непрочитано 14.10.2011, 13:59 #1
Получить ObjectID as Long в AutoCAD2010 x64
Александрдрдр
 
Регистрация: 14.10.2011
Сообщений: 6

Здравствуйте, уважаемые форумчане!

Есть AutoCAD2010 x64 и нерешенная на данный момент проблема. Написал программку для соединения када с БД и импортом информации в чертеж. На 32-разрядной системе все рабоет на ура, но в 64 разрядах появляется затык при отыскивании в чертеже объекта с определенным шаблоном связи с БД. Вот кусочек кода:

(vlax-invoke-method dbconnect 'GetLinks currlink
(vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vblong '(0 . 0))
(list (64GetObjectIdString (vlax-ename->vla-object (ssname test i)))))) 1); (ssname test i) - это соотв. имя объекта.

Функция получения ObjectId:

(defun 64GetObjectIdString ( obj )
(or *util* (setq *util* (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object)))))
(if (vlax-method-applicable-p *util* 'GetObjectIdString)
(vla-GetObjectIdString *util* obj :vlax-false)
(vla-get-ObjectId obj)
)
)

А теперь - в чем собственно затык. Метод GetLinks коннекта с БД для выбора объекта по имени шаблона связи требует ID объекта как тип vlax-vblong. Если попытаться получить ID объекта обычным способом vla-get-ObjectId - получаем число 42 (всегда знал, что оно магическое и очень загадочное ). Используя vla-get-ObjectId32 получаем то же значение. Если же воспользоваться фукцией 64GetObjectIdString - то получаем уже вполне себе нормальный ID "8796087998480", но в типе "строка". Естественно создать из строки безопасный массив типа vlax-vblong не удается. Команда atoi возвращает от строки "8796087998480" свой верхний 32-разрядный предел - 2147483647. Когда искал решение, то частенько натыкался на использование метода vla-ObjectIDToObject32, но он возвращает указатель на объект, который у меня и так в принципе уже есть.

Соответсвенно вопрос - кто-нибудь может предложить в какую сторону копать? Пыталя найти какую-нибудь фукнцию по преобразовнию текста в тип vlax-vblong, но как-то безрезультатно...

Заранее огромное спасибо всем откликнувшимся.
Просмотров: 6135
 
Непрочитано 14.10.2011, 14:13
#2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Работа с ObjectID в 64- и 32-разрядных системах
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 14.10.2011, 14:21
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Александрдрдр, ты учитываешь, что ObjectID неизменен только в пределах одной сессии?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.10.2011, 14:52
#4
Александрдрдр


 
Регистрация: 14.10.2011
Сообщений: 6


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Эту статью я читал - результат 42. и как следствие у объекта с ObjectID = 42 нет никакой связи с БД

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Александрдрдр, ты учитываешь, что ObjectID неизменен только в пределах одной сессии?
Учитываю, вся инфа складывается в атрибуты и хранится там, а потом извлекается штатным экстрактором.

To TararykovDG

Эту статью я читал - результат тот же - 42. и как следствие - обращение не к тому примитиву. Повторюсь, что на 32-разрядной системе все работало на ура.

Последний раз редактировалось Кулик Алексей aka kpblc, 14.10.2011 в 15:18.
Александрдрдр вне форума  
 
Непрочитано 14.10.2011, 15:21
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


А если так:
Код:
[Выделить все]
(vlax-get-property (vlax-ename->vla-object (ssname (ssget) 0))
                   (strcat "ObjectID"
                           (if (wcmatch (getvar "platform") "*64*")
                             "32"
                             ""
                             ) ;_ end of If
                           ) ;_ end of strcat
                   ) ;_ end of vlax-get-property

P.S. Я бы задумывался о "привязке" к хендлам...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.10.2011, 15:36
#6
Александрдрдр


 
Регистрация: 14.10.2011
Сообщений: 6


Вот тут тож товарищ озадачивался, но как я понимаю элегантного решения не нашел..

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если так:
Код:
[Выделить все]
(vlax-get-property (vlax-ename->vla-object (ssname (ssget) 0))
                   (strcat "ObjectID"
                           (if (wcmatch (getvar "platform") "*64*")
                             "32"
                             ""
                             ) ;_ end of If
                           ) ;_ end of strcat
                   ) ;_ end of vlax-get-property

P.S. Я бы задумывался о "привязке" к хендлам...
Не, этот код аналогичен тому, что у меня есть - не помогает. А вот насчет хендлов надо призадуматься.

Последний раз редактировалось Кулик Алексей aka kpblc, 14.10.2011 в 15:57.
Александрдрдр вне форума  
 
Непрочитано 14.10.2011, 15:59
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Если уж совсем без ObjectID никак, то отчего б не попробовать
Код:
[Выделить все]
(atof (get-objectid-x86-x64 (car (entsel))))
Конечно, вместо целого получим двойную точность, но это не победить (как мне кажется).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.10.2011, 16:32
#8
Александрдрдр


 
Регистрация: 14.10.2011
Сообщений: 6


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если уж совсем без ObjectID никак, то отчего б не попробовать
Код:
[Выделить все]
(atof (get-objectid-x86-x64 (car (entsel))))
Конечно, вместо целого получим двойную точность, но это не победить (как мне кажется).
Да, такую штуку тож пробовал - не выходит каменный цветок.. Видимо придется искать какую-то эквивалентную замену.
Александрдрдр вне форума  
 
Непрочитано 14.10.2011, 16:34
#9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Александрдрдр Посмотреть сообщение
Видимо придется искать какую-то эквивалентную замену
Handle и только Handle.
Александр Ривилис вне форума  
 
Непрочитано 14.10.2011, 17:27
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Александрдрдр Посмотреть сообщение
Пыталя найти какую-нибудь фукнцию по преобразовнию текста в тип vlax-vblong, но как-то безрезультатно...
Есть вариант конечно - но предупреждаю сразу - изврат полный (но работать будет):
Код:
[Выделить все]
 (vl-load-com)
(SETQ converter 
     ((lambda (excel)
        (vlax-invoke-method (vlax-get-property excel 'Workbooks) 'Add)
        (vlax-get-property excel 'Range "a1"))
      (vlax-create-object "excel.application")))
(defun string->double(str)
  (vlax-put-property converter 'Formula str)
  (vlax-get-property converter 'Value))
Цитата:
Команда: (string->double "8796087998480")
#<variant 5 8796087998480>
p.s. Как вариант поискать аналогичный метод в менее громоздком, но установленном по умолчанию в виндах COM.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.10.2011, 19:00
1 | #11
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от Александрдрдр Посмотреть сообщение
Пыталя найти какую-нибудь фукнцию по преобразовнию текста в тип vlax-vblong, но как-то безрезультатно...
Код:
[Выделить все]
 (vlax-make-variant "2147483647" vlax-vbLong)
Код:
[Выделить все]
 (vlax-make-variant "8796087998480" vlax-vbDouble)
Vov.Ka вне форума  
 
Автор темы   Непрочитано 14.10.2011, 21:32
#12
Александрдрдр


 
Регистрация: 14.10.2011
Сообщений: 6


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
Код:
[Выделить все]
 (vlax-make-variant "2147483647" vlax-vbLong)
Код:
[Выделить все]
 (vlax-make-variant "8796087998480" vlax-vbDouble)
хех, и так я пробовал - но метод GetLink требует типа данных именно vblong и никаких других ему и даром не надо. А если попробовать сменить тип варианта, в котором число больше 2147483647 - то выскакивает ошибка о несовместимости типов данных.

Получается, что сам автокад присваивает номер объектам больше, чем 2147483647, а автолисп такое значение как тип vblong переварить не может. То есть ясно, что ничего не ясно.

Возникла идея поломать базу данных чертежа, полазять в словарях
Александрдрдр вне форума  
 
Непрочитано 14.10.2011, 22:13
#13
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


тут есть все диапазоны http://en.wikipedia.org/wiki/Long_integer
8796087998480 это уже не лонг для vba
у меня все 32bit, ничего больше помочь не могу
Vov.Ka вне форума  
 
Автор темы   Непрочитано 14.10.2011, 22:43
#14
Александрдрдр


 
Регистрация: 14.10.2011
Сообщений: 6


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
тут есть все диапазоны http://en.wikipedia.org/wiki/Long_integer
8796087998480 это уже не лонг для vba
у меня все 32bit, ничего больше помочь не могу
я понимаю.. но и на этом спасибо. у меня тоже не было проблем, пока наши сисадмины не решили, что за 64-разрядними системами будущее и начали планомерно заменять системные блоки. попробую узнать у автодеска - по результатам отпишусь.
Александрдрдр вне форума  
 
Непрочитано 14.10.2011, 23:33
#15
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Александрдрдр Посмотреть сообщение
попробую узнать у автодеска - по результатам отпишусь.
Можешь не пробовать. VisualLisp не поддерживает _int64 (т.е. 64-битное целое число). Рекомендую перейти на .NET/ObjectARX.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получить ObjectID as Long в AutoCAD2010 x64



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос в Excell Денэн Программирование 38 04.05.2011 08:53
переменная в которой можно было-бы сохранить значение для и sergeytr Программирование 11 20.12.2006 06:51
VBA Поочередное открытие файлов DWG из нужной папки ??? sf Программирование 7 21.03.2005 14:50