Jump to content

CОМ via Lisp. Как определить размер коллекции?


Recommended Posts

В объектной модели приложения многие элементы представляют собой коллекции.

Помимо различных специфических свойств они имеют похожие методы/свойства "Item" и "Count"  с достаточно очевидной интерпретацией. Вместе с тем, доступ к некоторым из них вызвал затруднения.

Поясню на примере.

Небольшой фрагмент кода:

(vl-load-com)
(defun c:Example_Collection()
    (setq acadObj (vlax-get-acad-object) 
      v acadObj)
   (print "Исследуем коллекцию Application")
   (vlax-dump-object v 'T)

   (setq v (vla-get-MenuBar v))
   (print "Исследуем коллекцию MenuBar")
   (vlax-dump-object v 'T)
  
   ;(setq v (vla-item v 0));Такой доступ не прокатывает
   (setq v (vla-item v "Файл"))
   (print "Исследуем коллекцию пункта меню")
   (vlax-dump-object v 'T)
)

 

Спойлер

image.png.8937d65d3f96c76e2886d3edce804735.png

Все штатно и ожидаемо.

Имеем свойство "menubar" - только для чтения.

 

Спойлер

image.png.ce5bda15c58e1833b2b1a489d9e8e0c0.png

с попутным сообщением

Спойлер

image.png.f8be16cca1d4a9b2bd2040e65b053c96.png

 

Т.е., средствами лиспа не удалось определить количество элементов Item.

Не удается так же "добраться" до первого элемента меню через Item[0].

Теме не менее, удается извлечь 

Спойлер

image.png.f4c13a58ad465b354825944054d4bd81.png

Все параметры с ошибкой сопровождаются с похожими сообщениями об ошибке (см.выше).

 

На основании этого кейса хотелось бы получить ответы на следующие вопросы:

  1. Как средствами lisp все-таки получить значения свойств, для которых отображается "ошибка" в функции (vlax-dump-object и всех сходных с ней типа (vlax-get-... и (vlax-get-property...   ?
  2. Как получить размерность массивов Item, когда свойство "Count" недоступно (см. вопрос1) ?
  3. Как получить список доступных наименований, с помощью которых можно получить доступ к Item["Имя"] ?

 

 

Link to comment
Share on other sites

Работа с меню и его подэдементами в нанокад через лисп ИМХО не сделана. Да и через NET тоже.

Лично мне не удалось динамически загрузить / выгрузить меню и вообще работать с ним чисто программно.

Правда, я и нанокад знаю на уровне плинтуса.

16 минут назад, EdwardSt сказал:

Как средствами lisp все-таки получить значения свойств, для которых отображается "ошибка" в функции (vlax-dump-object

Никак ЯТД

16 минут назад, EdwardSt сказал:

Как получить список доступных наименований, с помощью которых можно получить доступ к Item["Имя"]

Попробуй сформировать список через vlax-for и анализируй уже его.

Link to comment
Share on other sites

8 минут назад, kpblc сказал:
25 минут назад, EdwardSt сказал:

Как получить список доступных наименований, с помощью которых можно получить доступ к Item["Имя"]

Попробуй сформировать список через vlax-for и анализируй уже его.

Спасибо за совет. К сожалению, vlax-for неявно обращается к "Count"  и выдает такое же сообщение об ошибке.

Link to comment
Share on other sites

12 минут назад, kpblc сказал:

мне не удалось динамически загрузить / выгрузить меню и вообще работать с ним чисто программно.

Однако)))

Динамически работать с меню даже нанодев пока не умеет

Link to comment
Share on other sites

15 минут назад, EdwardSt сказал:

Спасибо за совет. К сожалению, vlax-for неявно обращается к "Count"  и выдает такое же сообщение об ошибке.

Ну ква, сорян, фигня получилась.

13 минут назад, doctorraz сказал:

Динамически работать с меню даже нанодев пока не умеет

Странно... Думаю, это просто сакральное знание, недоступное простым смертным :) До достижения нирваны плюсов :D

Link to comment
Share on other sites

Только что, kpblc сказал:

Думаю, это просто сакральное знание, недоступное простым смертным

Спойлер

image.png.c2ae7eb4f971090380e5766c417e9c3f.png

 

Link to comment
Share on other sites

По-хорошему, если свойства должны быть недоступны, то они и должны быть в секции private, чтоб  dump-object (и ему подобные) их не видели.

Если уж отображаются в качестве публичных, то, как минимум (в случае RO - только для чтения), должны отображать значение. 

Непонятно, почему это не реализовано, вроде не должно вызывать сложности.

Тем более, что доступ по имени (откуда бы его знать заранее!!), работает.

Link to comment
Share on other sites

@doctorraz, я имею в виду программную работу. Без диалогов, движений мышью и прочей шушеры

Link to comment
Share on other sites

20 минут назад, kpblc сказал:

я имею в виду программную работу. Без диалогов, движений мышью и прочей шушеры

офф я к тому, что если б дин  подгрузка  частичных адаптаций была возможно, то она б была реализована...

насколько я понял, конфиг cfg загружается в память один раз и висит там статически..

cuix и xml может быть повторно прочитан по требованию... еще и умеет всякие Condition по условию и программно 

Спойлер

<RibbonTabSelector Rule="editor:beedit" UID="ID_RBN_0537" Tabs="ID_TabBlockEditor"/>

не отрицаю, что на плюсах возможно, что то можно сделать, но учитывая, что нк на с++ и разработчики этого не сделали... были причины...

Edited by doctorraz
Link to comment
Share on other sites

Все оказалось еще печальней.

Доступ по имени к Item тоже не реализован (что, впрочем, логично, если нет сведений о "Count").

Т.е. 

   

Спойлер

image.png.a6412a3a80ae668215bf4e66c8e3d67f.png

а 

Спойлер

image.png.bfb10f47367105b07d87b0871427ecea.png

 

Но оказалось, что в качестве имени можно указать любую белиберду в кавычках и тоже будет выдан "как-бы" осмысленный результат.

Т.е., метод таким образом не работает, но при этом не выдает ошибку, а возвращает такую же белиберду.

Какой запрос - такой и ответ, но хотелось более внятного результата, хотя бы в виде ошибки на невалидный запрос.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт Разработка? Tell a friend!
×
×
  • Create New...