Что нового

Выбрать нужную таблицу в программе и получить значение нужной ячейки

astanid

Новичок
Сообщения
38
Репутация
0
Есть учебная программа для расчета электрических сетей. программа доступна по ссылке https://yadi.sk/d/X3wFvGMwvrhXQ
Окно программы на приложенном скриншоте.
Нужно немного автоматизировать работу с ней :smile:
но все что у меня получилось это активировать окно программы и запустить расчет (т.е получить доступ к главному меню)
Код:
Local $hWnd = WinActivate("[TITLE:Mustang]")
_dbg($hWnd)
;Расчет режима
WinMenuSelectItem($hWnd, "", "УР", "Расчет")
Сама программа выглядит примерно как на скриншоте.
Мне для работы нужно кликнуть на вкладку Исходные данные, потом Узлы (сделать скриншот таблицы - это просто), потом Ветви (еще скриншот), потом перейти на вкладку Результаты и аналогично открыть две таблицы Узлы и Ветви
но как это сделать ?
пробовал
Код:
ControlClick($hWnd, "", "Результаты")
WinMenuSelectItem($hWnd, "", "Результаты")
не работает :(
кроме этого мне нужно будет прочитать значения ряда ячеек и записать эти значения в ексель. Вопрос как прочитать значения ячеек ?
 

Вложения

  • Clipboard01.jpg
    Clipboard01.jpg
    76.5 КБ · Просмотры: 17
A

Alofa

Гость
astanid сказал(а):
... как это сделать ?
Примерно так:
Код:
#include <ScreenCapture.au3>
#include <UIAutomate.au3> ; Смотри: http://autoit-script.ru/index.php?topic=16780.0

$hWnd = WinWait('[CLASS:TMFrameForm;TITLE:Mustang]')
WinActivate($hWnd)
WinMenuSelectItem($hWnd, '', 'УР', 'Исходные данные')
$oParent = _UIA_GetElementFromHandle(ControlGetHandle($hWnd, '', 'TPageControl1'))

; Делаем скриншоты
_ScreenCaptureElement(@ScriptDir, $oParent, 'Исходные данные', 'Узлы', 'Ветви')
_ScreenCaptureElement(@ScriptDir, $oParent, 'Результаты', 'Узлы', 'Ветви')

Func _ScreenCaptureElement($Dir, $oPar, $sTab1, $sTab2 = '', $sTab3 = '')
	For $i = 1 To 1000
		$sVar = Eval('sTab' & $i)
		If Not $sVar Then ExitLoop
		Local $oElement = _UIA_WaitControlTypeElement($oPar, $UIA_TabItemControlTypeId, $sVar)
		If @error Then Return 0
		_UIA_ElementMouseClick($oElement)
		If $i > 1 Then
			_ScreenCapture_CaptureWnd($Dir & '\' & $sTab1 & ' - ' & $sVar & '.jpg', $hWnd, 0, 0, -1, -1, False)
		EndIf
	Next
EndFunc   ;==>_ScreenCaptureElement

astanid сказал(а):
... как прочитать значения ячеек ?
Окно у этой программы "геморройное" - Delphi вариант.
Поэтому вы можете сохранить ваши таблицы в текстовый формат (пункт в контекстном меню "Вывод в TXT-файл") и далее выуживать информацию уже из него.
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
спасибо. отличный код. 1 из 2 проблем фактически решили :smile:
координаты только чуть чуть подправил, чтобы белые поля не выводились
Код:
_ScreenCapture_CaptureWnd($Dir & '\' & $sTab1 & ' - ' & $sVar & '.jpg', $hWnd, 0, 0,1512,340, False) ;
интересно правда можно ли как то программно проанализировать где справавнизу начинается "белая" бесполезная часть экрана, чтобы не включать ее (таблица то в общем случае может быть динамического размера)
Окно у этой программы "геморройное" - Delphi вариант.
Поэтому вы можете сохранить ваши таблицы в текстовый формат (пункт в контекстном меню "Вывод в TXT-файл") и далее выуживать информацию уже из него.
если имеется в виду "экспорт в формат ЦДУ", то не совсем очевидно как с ним работать.
например мне нужно значение Uрас узла 6 и 61. Таблица Результаты-Узлы.
21.00 кВ и 45.70 кВ предпоследняя и последняя строка
текстовый файл экспорта во вложении. значения там лежат мягко скажем не совсем очевидно и без пробелов... анализировать его не представляю как
0102 0.10.010000 1121.0000121.0000
0201 1121.0000 -576.58616.02473121.0000-10000.010000.00
0201 2330.0000120.000090.00000
0201 3330.0000
0201 410.0000090.0000070.00000
0201 5330.0000
0201 620.0000095.0000070.00000
0201 7330.0000
0201 821.00000 300.000012.0302121.00000-10000.010000.00
0201 6145.70313 600.00001193.93245.70313-10000.010000.00
0202 1121.0000 16.02473
0202 2352.93302.936453120.000090.00000
0202 3355.90855.294327
0202 410.868452.68333990.0000070.00000
0202 5362.08958.342022
0202 621.0023211.9589895.0000070.00000
0202 7361.58778.164600
0202 821.0000012.49557 12.03021
0202 6145.7031363.00068 1193.932
0290 1
0290 2
0290 3
0290 4
0290 5
0290 6
0290 7
0290 8
0290 61
0301 2 56.96000047.56000-494.000 3.930000
0301 3 53.61000030.69000-329.000 1.920000
0301 2 36.90000038.07000-389.000 3.970000
0301 5 72.85000030.40000-333.000 1.440000
0301 2 76.90000038.07000-389.000 3.970000
0301 5 60.43000016.5600029.900000.057600 7.810000
0301 2 10.20000011.0400039.900000.343198 9.090000
0301 3 42.47000063.3800012.100000.031800 3.170000
0301 7 80.60000033.0000013.300000.058000 3.030000
0301 6 61 1.244000
0301 2 0.000009-0.00004
0301 3 0.000003-0.00001
0301 5 0.000008-0.00003
0301 7 0.000003-0.00001
0401 30.830000-0.300000.4700003.700000-7.000004.300000
вот здесь описание формата.
http://www.rastrwin.ru/support/forum/read.php?FID=1&TID=712
первые 4 байта - тип данных,
следующие 4 - int,
далее 9 раз по 8 байт - float.
я признаюсь пока не понял логику :(
 

Вложения

  • Результаты - Узлы.jpg
    Результаты - Узлы.jpg
    69.7 КБ · Просмотры: 7
A

Alofa

Гость
astanid сказал(а):
... если имеется в виду "экспорт в формат ЦДУ"

Нет, читайте внимательно:
astanid сказал(а):
... (пункт в контекстном меню "Вывод в TXT-файл")
c9809b34cf7315443eb3030f261ab95c.png
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
... (пункт в контекстном меню "Вывод в TXT-файл")
да, уже интересней. вопросов тут тогда два:
1. как сделать этот вывод (как сделать ControlClick, выбрать пункт "Вывод в ТХТ", сохранить). предварительно надо удалять тхт файл если он уже существует (иначе пропишет в конец)
2. как прочитать этот файл в массив чтоб потом с ним работать
 
A

Alofa

Гость
astanid сказал(а):
1. как сделать этот вывод (как сделать ControlClick, выбрать пункт "Вывод в ТХТ", сохранить). предварительно надо удалять тхт файл если он уже существует (иначе пропишет в конец)...
Здесь не Стол Заказов (есть на форуме такая ветка), проявите немного своего усилия.

astanid сказал(а):
2. как прочитать этот файл в массив чтоб потом с ним работать

Вот пример расшифровки файла "Вывод.TXT" таблицы из вкладок Исходные данные -> Узлы:
Код:
#include <Array.au3>
Local $hFile, $sHeader, $Ub = -1, $aArray[17][0]

$hFile = FileOpen(@ScriptDir & '\Вывод.TXT')
If $hFile = -1 Then Exit MsgBox(4096, "Ошибка", "Невозможно открыть файл.")

While 1
	$sLine = FileReadLine($hFile)
	If @error = -1 Then ExitLoop
	$aRes = StringRegExp($sLine, '(.{14})(.{7})(.{5})(.{9})(.{9})(.{9})(.{9})(.{9})(.{9})(.{5})(.{9})(.{9})(.{9})(.{9})(.{9})(.{9})(.{9})', 3)
	If Not @error Then
		If $Ub = -1 Then
			$sHeader = _ArrayToString($aRes)
			$Ub += 1
			ContinueLoop
		EndIf
		ReDim $aArray[17][$Ub + 1]
		For $i = 0 To UBound($aRes) - 1
			$aArray[$i][$Ub] = $aRes[$i]
		Next
		$Ub += 1
	EndIf
WEnd
FileClose($hFile)

_ArrayTranspose($aArray)
_ArrayDisplay($aArray, 'Исходные данные -> Узлы', Default, 32 + 64, Default, $sHeader, Default, 0xDDFFDD)
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
не очень красиво, но вот так работает.
Код:
;открываем контекстное меню
MouseClick("right",653,261,1)
;десятый элемент вывод в ТХТ файл
send("{DOWN 10}"& "{enter}")

$h2 = WinWait('[TITLE:Экспорт]')
_dbg($h2)

ControlSend($h2, "Открыть", "[CLASSNN:Edit1]", $file_path&"test.txt"& "{enter}")


безусловно хотелось бы "нормальную" быструю схему работы с ячейками этих самых таблиц. с возможностью как чтения так и записи в ячейку значения. через ТХТ файл это работать если и будет, то совсем не быстро :(
Окно у этой программы "геморройное" - Delphi вариант.
попробую создать тему в столе заказов, надеюсь проблема принципиально реализуема :smile:
 
Верх