vlax-invoke-method: как быть, если аргументы возвращаются по ссылке ?
Реклама i
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vlax-invoke-method: как быть, если аргументы возвращаются по ссылке ?

vlax-invoke-method: как быть, если аргументы возвращаются по ссылке ?

Ответ
Поиск в этой теме
Непрочитано 28.08.2010, 20:55 #1
vlax-invoke-method: как быть, если аргументы возвращаются по ссылке ?
batmax
 
Регистрация: 28.08.2010
Сообщений: 10

Добрый день.
Не работает следующий код:

Код:
[Выделить все]
(defun c:mbb ( / ent entobj minp maxp)
  (vl-load-com)
  (setq ent (entlast))
  (setq entobj (vlax-ename->vla-object ent))
  (setq minp (vlax-3D-point '(3.0 4.0 5.0)))
  (setq maxp (vlax-3D-point '(3.0 4.0 5.0)))
  (vlax-invoke-method entobj 'GetBoundingBox minp maxp)
  (setq minp (vlax-safearray->list (vlax-variant-value minp)))
  (setq maxp (vlax-safearray->list (vlax-variant-value maxp)))
  (princ minp)(princ "!!!")(princ maxp)(princ)
)
Пишет при запуске:
(3.0 4.0 5.0)!!!(3.0 4.0 5.0)
Хотя там должны быть другие значения.
То есть я так понимаю, что переменные minp и maxp не изменились при вызове метода GetBoundingBox. В документации по VBA написано, что этот метод возвращает аргументы ПО ССЫЛКЕ.
Как быть в таком случае, ведь в лиспе все переменные передаются по значению ?
Просмотров: 3304
 
Непрочитано 28.08.2010, 21:41
2 | #2
Кулик Алексей aka kpblc
Moderator

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


Попробуй так:
Код:
[Выделить все]
(defun c:mbb ( / ent entobj minp maxp)
  (vl-load-com)
  (setq ent (entlast))
  (setq entobj (vlax-ename->vla-object ent))
  (setq minp (vlax-3D-point '(3.0 4.0 5.0)))
  (setq maxp (vlax-3D-point '(3.0 4.0 5.0)))
  (vlax-invoke-method entobj 'GetBoundingBox 'minp 'maxp)
  (setq minp (vlax-safearray->list (vlax-variant-value minp)))
  (setq maxp (vlax-safearray->list (vlax-variant-value maxp)))
  (princ minp)(princ "!!!")(princ maxp)(princ)
)
Обрати внимание на апострофы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.08.2010, 21:43
1 | #3
Дима_

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


Во первых зачем ты передаешь "родную" автокадовскую функцию через vlax-invoke-method (подойдет и vla-getboundingbox),
2 для чего ты устанавливаешь точки minpt и maxpt,
3 в функцию надо передавать не значения установленных тобой точек а имена для заполнения то есть строчку
(vlax-invoke-method entobj 'GetBoundingBox minp maxp)
поменяй на
(vla-GetBoundingBox entobj 'minpt 'maxpt)
а две предыдущие строки вобще смысла не имеют (сотри).
p.s. опаздал - модератор не спит
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.08.2010, 22:01
#4
Кулик Алексей aka kpblc
Moderator

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


Offtop:
Цитата:
Сообщение от Дима_ Посмотреть сообщение
модератор не спит
Я сегодня весь день был лишен инета - какие-то проблемы у провайдера. Только-только связь дали...

Поправка: только что сообразил, в коде ошибка:
Код:
[Выделить все]
(vl-load-com)

(defun test (/ ent minp maxp)
  (if (and (setq ent (entlast))
           (setq ent (vlax-ename->vla-object ent))
           (vlax-method-applicable-p ent 'getboundingbox)
           ) ;_ end of and
    (progn
      (vla-getboundingbox ent 'minp 'maxp)
      (princ (strcat "\nPoints :\nMinP : "
                     (vl-princ-to-string (vlax-safearray->list minp))
                     "\nMaxP : "
                     (vl-princ-to-string (vlax-safearray->list maxp))
                     ) ;_ end of strcat
             ) ;_ end of princ
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.08.2010, 22:08
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Дима_ Посмотреть сообщение
имена для заполнения то есть строчку
не строчку, а символ
gomer вне форума  
 
Непрочитано 28.08.2010, 22:17
#6
Дима_

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


да запятую я там не поставил - имелось в виду строчку кода (идет со следующей строки)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.08.2010, 13:35
#7
batmax


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


to kpblc: огромное спасибо за апострофы, синтаксис вполне в духе Лиспа - если нельзя передать переменную по ссылке, что мешает передать (по значению) её символ
to Дима_: в 2007 версии функции vla-getboundingbox (как и вообще всех vla-...) ещё нет.

К тому же пришлось убрать vlax-variant-value. Окончательно код выглядит так:

Код:
[Выделить все]
(defun c:mbb ( / ent entobj minp maxp)
  (vl-load-com)
  (setq ent (entlast))
  (setq entobj (vlax-ename->vla-object ent))
  (vlax-invoke-method entobj 'GetBoundingBox 'minp 'maxp)
  (setq minp (vlax-safearray->list minp))
  (setq maxp (vlax-safearray->list maxp))
  (princ minp)(princ "!!!")(princ maxp)(princ)
)
batmax вне форума  
 
Непрочитано 29.08.2010, 13:48
#8
Кулик Алексей aka kpblc
Moderator

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


vla-getboundingbox есть как минимум с 2005 версии ))
P.S. Посмотри мой вариант кода из #4, сравни со своим и найди отличия
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.08.2010, 13:53
#9
Дима_

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


Цитата:
Сообщение от batmax Посмотреть сообщение
to Дима_: в 2007 версии функции vla-getboundingbox (как и вообще всех vla-...) ещё нет.
да прям, проверь еще разок...
p.s. ну и если пошли слова про дух лиспа, то не очень понятно для чего тебе переменные ent и entobj попробуй:
Код:
[Выделить все]
(setq ent (entlast))
  (setq entobj (vlax-ename->vla-object ent))
  (vlax-invoke-method entobj 'GetBoundingBox 'minp 'maxp)
заменить на :
Код:
[Выделить все]
(vla-getboundingbox (vlax-ename->vla-object (entlast)) 'minp 'maxp)
p.p.s опять обогнал
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vlax-invoke-method: как быть, если аргументы возвращаются по ссылке ?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Порекомендуйте литературу для повышения квалификации(грунты, геотехника) acid Поиск литературы, чертежей, моделей и прочих материалов 6 13.05.2015 22:14
Справка по форуму Admin FAQ: Часто задаваемые вопросы 13 04.03.2014 11:12
Юмор 2009 DEM Разное 1736 01.01.2010 22:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51