Что нового

Как записать в переменную, представленную строкой указатель на объект?

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

Вот функция

Код:
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 - строка с указанием на переменную родителя.

Все уперлось в то, что все пишется, но указатель попадает в переменную в виде строки.
Как его, блин, записать по нормальному?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А что возвращает Assign?
И что означает “указатель попадает в переменную в виде строки”?

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

Код:
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 использовать на значений переменной? она уже и так содержит то что нужно, или я не понимаю что нужно :smile:


Добавлено:
Сообщение автоматически объединено:

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

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

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


Добавлено:
Сообщение автоматически объединено:

О! Сразу вошел. :laugh:
Ругается на вот этой строчке.
Код:
$nTVItem_ID = GUICtrlCreateTreeViewitem($sUser1)

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


На последующих - не хочет. В заданную переменную одни нули пишет вместо указателя.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Supermax
На мои вопросы можно ответить по порядку?
Я тестировать немогу этот код, поэтому критично важно подробнее всё узнать.


Добавлено:
Сообщение автоматически объединено:

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

Короче, вот код, который пока еще не полный, но рабочий. Вчера модель из 10000 с хвостиком блоков обработал. Надо AVI записать. Просто круто получилось.
Код:
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


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

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

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

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

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

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Мне интересно. Ты на бум выбираешь куда написать тему или как? Я не в первый раз переношу твои темы... Следующий раз будет последним :-X (Нееет я не забаню, я говорю о предупреждениях)
 
Верх