Автор Тема: Как записать в переменную, представленную строкой указатель на объект?  (Прочитано 5488 раз)

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

Оффлайн Supermax [?]

  • Сообщений: 7
  • Репутация: -1
    • Награды
Что-то ничего не получается.
Я из Автокада получаю строку, которая является именем переменной и пытаюсь создать элемент.
Завис из-за того, что функция Assign пишет в переменную все в виде строк.

Вот функция

Код: AutoIt [Выделить]
Func StartCad ()
              Assign($AutoCAD.ActiveDocument.GetVariable("USERS2"), GUICtrlCreateTreeViewitem($AutoCAD.ActiveDocument.GetVariable("USERS1"),Execute($AutoCAD.ActiveDocument.GetVariable("USERS3"))), 2)
              MsgBox(64, "Tutorial", Eval($AutoCAD.ActiveDocument.GetVariable("USERS2")))
EndFunc



USERS1 - переменная из Автокада с строкой названия TreeViewitem
USERS2 - строка с именем переменной, которая создается и куда надо записать указатель на созданный объект
USERS3 - строка с указанием на переменную родителя.

Все уперлось в то, что все пишется, но указатель попадает в переменную в виде строки.
Как его, блин, записать по нормальному?
« Последнее редактирование: Декабрь 21, 2009, 21:14:18 от CreatoR »

Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
А что возвращает Assign?
И что означает “указатель попадает в переменную в виде строки”?

Вот тоже самое, но в расчленённом виде, чтобы было яснее:

Код: AutoIt [Выделить]
Func StartCad ()
    $sUser1 = $AutoCAD.ActiveDocument.GetVariable("USERS1")
    $sUser2 = $AutoCAD.ActiveDocument.GetVariable("USERS2")
    $sUser3 = $AutoCAD.ActiveDocument.GetVariable("USERS3")
   
    $nTVItem_ID = GUICtrlCreateTreeViewitem($sUser1)
   
    Assign($sUser2, $nTVItem_ID, Execute($sUser3), 2)
   
    $sUser2 = Eval($sUser2)
   
    MsgBox(64, "Tutorial", $sUser2)
EndFunc


Теперь напрашиваются вопросы:
* Зачем там Execute?
* Зачем Eval использовать на значений переменной? она уже и так содержит то что нужно, или я не понимаю что нужно :)


Добавлено: Декабрь 21, 2009, 21:23:13
P.S
И вопрос не столько по AutoItX, сколько по обработке строк и значений.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Supermax [?]

  • Сообщений: 7

  • Автор темы
  • Репутация: -1
    • Награды
Еле-еле в тему попал. Ну давай как-нибудь разберемся  :'(
У меня Автокад. В нем библиотека блоков. Там дерево как у лукоморья.
Этот TreeView создан только в самом начале.
Код: AutoIt [Выделить]
$A0 = GUICtrlCreateTreeView (6, 6, 400, 250, BitOr ($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
 

Все остальное заполнение происходит из автокада. Причем имена переменных создаются на основе идентификатора блока (одни цифры) и прибавочки в самое начало $A получается "$A2128413704"
Очень важно, чтобы сам Автокад создавал эти имена, поскольку у каждого блока есть его собственный идентификатор и идентификатор его родителя. Блоков сотни, если не тысячи. Один в другой вложены.
Никакие заведомо определенные переменные не катят.

Поскольку имя переменной у меня строка, то я и использовал  Assign. Сейчас попробую функцию по твоему сделать.


Добавлено: Декабрь 21, 2009, 21:55:30
О! Сразу вошел.  :laugh:
Ругается на вот этой строчке.
Код: AutoIt [Выделить]
 $nTVItem_ID = GUICtrlCreateTreeViewitem($sUser1)
 

Не хочет кушать с одним аргументом.
Вот так: Работает только на первой строке, где указатель на родителя "$A0"
Код: AutoIt [Выделить]
;......
$nTVItem_ID = GUICtrlCreateTreeViewitem($sUser1,Execute($sUser3))
   
    Assign($sUser2, $nTVItem_ID, 2)
;......


На последующих - не хочет. В заданную переменную одни нули пишет вместо указателя.
« Последнее редактирование: Декабрь 21, 2009, 21:55:30 от Supermax, Причина: Объединение сообщений »

Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Supermax
На мои вопросы можно ответить по порядку?
Я тестировать немогу этот код, поэтому критично важно подробнее всё узнать.


Добавлено: Декабрь 21, 2009, 22:38:09
Supermax [?]
Цитировать
Ругается на вот этой строчке
Там второй параметр это ID TreeView, получается User3 это ID TreeView? это элемент созданный AutoIt'ом? а иначе работать не будет (не должно).

Оффлайн Supermax [?]

  • Сообщений: 7

  • Автор темы
  • Репутация: -1
    • Награды
Прорвался.
Отвечу на вопросы по порядку и дам решение проблемы.
Цитировать
А что возвращает Assign?
Ответ - 1
Цитировать
И что означает “указатель попадает в переменную в виде строки”?
В хелпе у
Код: AutoIt [Выделить]
аргумент "данные" то же в кавычках, вот я и думал, что только строки писать можно, но оказывается, что пишет, все что угодно.
Цитировать
Теперь напрашиваются вопросы:
* Зачем там Execute?
Не, там Eval нужен. Я тоже не смог разобраться в хелпе и переменные изначально (аж в Автокаде) формировал с $, а оказывается не надо его было туда пихать.
Цитировать
* Зачем Eval использовать на значений переменной? она уже и так содержит то что нужно, или я не понимаю что нужно
Не, я из Автокада получаю имя переменной, куда надо писать указатель на создаваемый объект и мя переменной (тоже строка) родителя. Иначально, самый старый пра-прадедушка А0, то-есть $А0 если формировать переменную в теле скрипта, там и создан. А все остальные переменные создаются под диктовку Автокада, иначе дерево "не посадить", и чтобы записать их нужна Assign. Более того, когда я создаю нужную переменную и записываю в нее указатель, так сразу после этого создаю еще одну из самого указателя и записываю туда имя самой переменной (без буквы А вначале). Чтобы получив указатель при нажатии на элементе TreeViewItem добавив к нему буковку В получить обратно указатель на элемент в теле Автокада.

Короче, вот код, который пока еще не полный, но рабочий. Вчера модель из 10000 с хвостиком блоков обработал. Надо AVI записать. Просто круто получилось.
Код: AutoIt [Выделить]
Func StartCad ()
    $sUser1 = $AutoCAD.ActiveDocument.GetVariable("USERS1")
    $sUser2 = $AutoCAD.ActiveDocument.GetVariable("USERS2")
    $sUser3 = $AutoCAD.ActiveDocument.GetVariable("USERS3")
   
    $nTVItem_ID = GUICtrlCreateTreeViewitem($sUser1,Eval($sUser3))
    $Gx = $nTVItem_ID
    Assign("B" & String($nTVItem_ID), StringTrimLeft($sUser2, 1), 2)

    Assign($sUser2, $nTVItem_ID, 2)
   $AutoCAD.ActiveDocument.SendCommand("(spisreal) ")
                           
EndFunc
 


Короче все получилось. Но будете смеяться. Знаете как я эту функцию запускаю из Автокада?
Я сделал махонькую кнопочку
Код: AutoIt [Выделить]
$cadbutton = GUICtrlCreateButton ("",0,0,1,1)
$AutoCAD.ActiveDocument.SendCommand("(setq funcautoit " & hex($cadbutton) & ") ")
 

и отправляю в Автокад ее ID, правда он туда попадает в 16-тиричном виде, хотя в самом скрипте в десятичном. Почему он конвертируется по дороге так и не узнал и еле-еле вычислил.

Так вот, я повесил в обработке событий эту кнопочку на эту функцию через COM интерфейс ее кликаю.  :whistle:
Код: AutoIt [Выделить]
     Case $array[0] = $cadbutton
            StartCad()
 

Как еще мне ее запустить - не знаю. Но работает, как ураган.
Функция создает элемент и запускает функцию в Автокаде, которая отправляет следующие данные кликая на эту же кнопочку.
Ее на экране не видно 1 пиксель всего, но работает!

Тему можно смело перекинуть в раздел для новичков.
 :laugh:


« Последнее редактирование: Декабрь 23, 2009, 20:34:15 от Supermax »

Русское сообщество AutoIt


Оффлайн Medic84 [?]

  • Администратор
  • *
  • Сообщений: 1416
  • Репутация: 303
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Мне интересно. Ты на бум выбираешь куда написать тему или как? Я не в первый раз переношу твои темы... Следующий раз будет последним :-X (Нееет я не забаню, я говорю о предупреждениях)

   
На форуме принято отмечать полезные сообщения пальцем вверх =)
Никогда не даю подробных примеров сразу, я сначала навожу на мысль - как можно написать. Учитесь мыслить сами, а не за других людей.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
3892 Просмотров
Последний ответ Декабрь 23, 2009, 21:55:01
от Medic84
6 Ответов
6144 Просмотров
Последний ответ Октябрь 08, 2010, 11:37:45
от Yashied
4 Ответов
3320 Просмотров
Последний ответ Ноябрь 15, 2011, 20:21:21
от agikon
4 Ответов
3062 Просмотров
Последний ответ Октябрь 26, 2013, 21:41:03
от SHoCK13666
4 Ответов
1768 Просмотров
Последний ответ Ноябрь 02, 2013, 19:50:26
от Suppir
1 Ответов
1098 Просмотров
Последний ответ Октябрь 22, 2015, 14:43:28
от madmasles
4 Ответов
1107 Просмотров
Последний ответ Январь 24, 2017, 11:10:06
от inververs
2 Ответов
825 Просмотров
Последний ответ Март 29, 2017, 10:37:23
от Alofa
1 Ответов
2281 Просмотров
Последний ответ Ноябрь 03, 2017, 19:32:29
от Tempo
3 Ответов
722 Просмотров
Последний ответ Декабрь 20, 2017, 09:55:30
от ra4o