Что нового

можно ли сделать код с 12 000 case проще (короче)?

  • Автор темы dreamorder
  • Дата начала
D

dreamorder

Гость
Доброго времени суток гос-да .
Продолжая осваивать Autoit столкнулся с новой задачей.

для примера:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>


$Form1 = GUICreate("Form1", 800, 600, 365, 190)
GUISetBkColor(0x000000)
$Button1 = GUICtrlCreateButton("СБРОС",350, 5, 100, 19, $WS_BORDER, $WS_EX_STATICEDGE)
GUICtrlSetCursor (-1, 0)
GUISetState(@SW_SHOW,$Form1)

AdlibRegister('ran',Random(2500,3000))
AdlibRegister('Line', 3000)

Global $iStartX
Global $iStartY
Global $iEndX
Global $iEndY
Global $Per
Global $pPer

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
        Case $Button1
			obnulen()
	EndSwitch

WEnd

Func ran()
 $pPer = Random(-1, 1, 1)
EndFunc

Func obnulen()
	$Per = 0
EndFunc

Func Line()
	$Per += $pPer
	Select
Case $Per = 4
	$iStartX = 33
	$iStartY = 555
	$iEndX = 338
	$iEndY = 555
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 3
	$iStartX = 33
 $iStartY = 55
 $iEndX = 738
 $iEndY = 55
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 2
	$iStartX = 33
 $iStartY = 277
 $iEndX = 738
 $iEndY = 277
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 1
	$iStartX = 33
 $iStartY = 173
 $iEndX = 738
 $iEndY = 173
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 0
	$iStartX = 33
 $iStartY = 111
 $iEndX = 738
 $iEndY = 111
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -1
	$iStartX = 33
 $iStartY = 333
 $iEndX = 738
 $iEndY = 333
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -2
	$iStartX = 33
 $iStartY = 231
 $iEndX = 738
 $iEndY = 231
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -3
	$iStartX = 33
 $iStartY = 155
 $iEndX = 738
 $iEndY = 155
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -4
	$iStartX = 33
 $iStartY = 432
 $iEndX = 738
 $iEndY = 432	
EndSelect
EndFunc


Func grss($iStartX, $iStartY, $iEndX, $iEndY)
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
$hPenBlueThin = _GDIPlus_PenCreate(0xFF00ffFF,2) ; перо для синей линии
_GDIPlus_GraphicsDrawLine($hGraphic, $iStartX, $iStartY, $iEndX, $iEndY, $hPenBlueThin) ; линия отрезка
_GDIPlus_PenDispose($hPenBlueThin) ; удаление ресурсов
_GDIPlus_GraphicsDispose($hGraphic) ; удаление ресурсов
_GDIPlus_Shutdown()
EndFunc


Проблема в том, что в функцию Line() нужно будет впихнуть 12 000 координат :stars:
Возможно ли как то упростить, сократить или ещё что то ... ?
Я пока ещё плохо знаю массивы и как работать с ini файлами,
но мб с их помощью что то можно придумать?

Заранее благодарю всех откликнувшихся :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
как то упростить, сократить или ещё что то ... ?

Ты хочешь что сделать? Уменьшить количество строк в скрипте, ускорить работу скрипта, ...?
 
Автор
D

dreamorder

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




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

и вообще это реально нарисовать с помощью Autoit ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Та я про скрипт твой спрашивал.
Вот смотри, сразу можно сократить
Код:
Case $Per = 4
    grss(33, 555, 338, 555)

это уменьшит количество строк в скрипте.

А можно завести массивы
Код:
Dim $aStartX, $aStartY, $aEndX, $aEndY

заполнить их и брать
Код:
grss($aStartX[$Per], $aStartY[$Per], $aEndX[$Per], $aEndY[$Per])

это позволит избавиться от Select и ускорит работу скрипта.
Но тогда координаты должны быть от 0 и выше.
 
Автор
D

dreamorder

Гость
C2H5OH
Большое спасибо, но можно не большой пример с массивами (на основе моего скрипта),
уж больно туго до меня доходит про массивы (мало изучено мной) :blink:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Нельзя.

Проблема № 1 - у тебя присутствуют отрицательные числа в Case, а индексом массива не может быть отрицательное число.
Проблема решаема - нужно брать индексы со сдвигом, просто нужно понимать с каким диапазоном чисел (координат) придётся работать.

Проблема № 2 - у тебя присутствуют разные варианты действий к одним и тем же значениям в Case
Код:
Case $Per = -1
    $iStartX = 33
 $iStartY = 333
 $iEndX = 738
 $iEndY = 333
    grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -2
    $iStartX = 33
 $iStartY = 231
 $iEndX = 738
 $iEndY = 231
    grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -1
    $iStartX = 33
 $iStartY = 155
 $iEndX = 738
 $iEndY = 155
    grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -2
    $iStartX = 33
 $iStartY = 432
 $iEndX = 738
 $iEndY = 432
    grss($iStartX, $iStartY, $iEndX, $iEndY)
EndSelect
Это только тебе нужно порядок наводить в твоём скрипте.
 
Автор
D

dreamorder

Гость
C2H5OH
Прошу прощения за ошибки в скрипте, исправил (это просто для наглядности пример).
Про индексы понятно можно как то заменить к примеру -1 заменять 1000, -20 соответственно 20 000 диапазон координат всего от -100 до 100 и то по одной оси :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Добавить в начале
Код:
Dim $aStartX[9] = [33,33,33,33,33,33,33,33,33]
Dim $aStartY[9] = [432,155,231,333,111,173,277,55,555]
Dim $aEndX[9] = [738,738,738,738,738,738,738,738,738]
Dim $aEndY[9] = [432,155,231,333,111,173,277,55,555]


Переписать функцию
Код:
Func Line()
	$Per += $pPer
	grss($aStartX[$Per], $aStartY[$Per], $aEndX[$Per], $aEndY[$Per])
EndFunc
 
Автор
D

dreamorder

Гость
я так понимаю, если по оси будет 100+шт. координат, так их и записывать все в строку?

Код:
Dim $aStartX[120...] = [33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33 ...........]



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

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


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

не работает так:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>


$Form1 = GUICreate("Form1", 800, 600, 365, 190)
GUISetBkColor(0x000000)
$Button1 = GUICtrlCreateButton("СБРОС",350, 5, 100, 19, $WS_BORDER, $WS_EX_STATICEDGE)
GUICtrlSetCursor (-1, 0)
GUISetState(@SW_SHOW,$Form1)

AdlibRegister('ran',Random(2500,3000))
AdlibRegister('Line', 3000)

Global $iStartX
Global $iStartY
Global $iEndX
Global $iEndY
Global $Per
Global $pPer

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
        Case $Button1
			obnulen()
	EndSwitch

WEnd

Dim $aStartX[9] = [33,33,33,33,33,33,33,33,33]
Dim $aStartY[9] = [432,155,231,333,111,173,277,55,555]
Dim $aEndX[9] = [738,738,738,738,738,738,738,738,738]
Dim $aEndY[9] = [432,155,231,333,111,173,277,55,555]

Func ran()
 $pPer = Random(1, 2, 1)
EndFunc

Func Line()
    $Per += $pPer
    grss($aStartX[$Per], $aStartY[$Per], $aEndX[$Per], $aEndY[$Per])
EndFunc

Func obnulen()
	$Per = 0
EndFunc

#cs
Func Line()
	$Per += $pPer
	Select
Case $Per = 4
	$iStartX = 33
	$iStartY = 555
	$iEndX = 338
	$iEndY = 555
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 3
	$iStartX = 33
 $iStartY = 55
 $iEndX = 738
 $iEndY = 55
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 2
	$iStartX = 33
 $iStartY = 277
 $iEndX = 738
 $iEndY = 277
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 1
	$iStartX = 33
 $iStartY = 173
 $iEndX = 738
 $iEndY = 173
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 0
	$iStartX = 33
 $iStartY = 111
 $iEndX = 738
 $iEndY = 111
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -1
	$iStartX = 33
 $iStartY = 333
 $iEndX = 738
 $iEndY = 333
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -2
	$iStartX = 33
 $iStartY = 231
 $iEndX = 738
 $iEndY = 231
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -1
	$iStartX = 33
 $iStartY = 155
 $iEndX = 738
 $iEndY = 155
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -2
	$iStartX = 33
 $iStartY = 432
 $iEndX = 738
 $iEndY = 432
	grss($iStartX, $iStartY, $iEndX, $iEndY)
EndSelect
EndFunc
#ce

Func grss($iStartX, $iStartY, $iEndX, $iEndY)
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
$hPenBlueThin = _GDIPlus_PenCreate(0xFF00ffFF,2) ; перо для синей линии
_GDIPlus_GraphicsDrawLine($hGraphic, $iStartX, $iStartY, $iEndX, $iEndY, $hPenBlueThin) ; линия отрезка
_GDIPlus_PenDispose($hPenBlueThin) ; удаление ресурсов
_GDIPlus_GraphicsDispose($hGraphic) ; удаление ресурсов
_GDIPlus_Shutdown()
EndFunc


:'(


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

как машина будет знать когда и где рисовать отрезок? :stars:
что то не вяжется ничего :smile:


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

по задумке отрезки рисуются сперва в первом столбике х - 33, 53 так сказать, затем через 5 минут, к примеру, во второй столбик х - 54, 74 и т.д. Всего 120 "столбиков".
а вот как это реализовать?
:scratch:


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

думаю всё одно нужно писать не меньше 120х4 массивов, по 1му на каждую "стопку" полосок, а потом по заданному времени системы или таймеру переключаться с одного массива на следующий, но это в любом случае лучше чем 12 000 координат в case . 12 000 при условии
Код:
Case $Per = 1 Or 2

:smile:


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

вопрос гораздо проще :laugh:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>


$Form1 = GUICreate("Form1", 800, 600, 365, 190)
GUISetBkColor(0x000000)
$Button1 = GUICtrlCreateButton("СБРОС",350, 5, 100, 19, $WS_BORDER, $WS_EX_STATICEDGE)
GUICtrlSetCursor (-1, 0)
GUISetState(@SW_SHOW,$Form1)

AdlibRegister('ran',Random(2500,3000))
AdlibRegister('Line', 3000)

Global $iStartX = 33
Global $iStartY = 105
Global $iEndX = 138
Global $iEndY = 105
Global $Per
Global $pPer
Global $pPerx = 0 ; тут будет прибавляться число пикселей для сдвига по x по таймеру или часам ос

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
        Case $Button1
			obnulen()
	EndSwitch

WEnd


Func ran()
 $pPer = Random(-5, 5, 1)
EndFunc



Func obnulen()
	$Per = 0
EndFunc

;#cs
Func Line()
	$Per += $pPer
	$iStartX -= $pPerx ; тут будет прибавляться число пикселей для сдвига по x по таймеру или часам ос
	$iStartY -= $pPer
	$iEndX -= $pPerx   ; тут будет прибавляться число пикселей для сдвига по x по таймеру или часам ос
	$iEndY -= $pPer
	grss($iStartX, $iStartY, $iEndX, $iEndY)
EndFunc

	#cs
	Select
Case $Per = 4
	$iStartX = 33
	$iStartY = 555
	$iEndX = 338
	$iEndY = 555
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 3
	$iStartX = 33
 $iStartY = 55
 $iEndX = 738
 $iEndY = 55
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 2
	$iStartX = 33
 $iStartY = 277
 $iEndX = 738
 $iEndY = 277
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 1
	$iStartX = 33
 $iStartY = 173
 $iEndX = 738
 $iEndY = 173
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = 0
	$iStartX = 33
 $iStartY = 111
 $iEndX = 738
 $iEndY = 111
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -1
	$iStartX = 33
 $iStartY = 333
 $iEndX = 738
 $iEndY = 333
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -2
	$iStartX = 33
 $iStartY = 231
 $iEndX = 738
 $iEndY = 231
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -1
	$iStartX = 33
 $iStartY = 155
 $iEndX = 738
 $iEndY = 155
	grss($iStartX, $iStartY, $iEndX, $iEndY)
Case $Per = -2
	$iStartX = 33
 $iStartY = 432
 $iEndX = 738
 $iEndY = 432
	grss($iStartX, $iStartY, $iEndX, $iEndY)
EndSelect
EndFunc
#ce

Func grss($iStartX, $iStartY, $iEndX, $iEndY)
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
$hPenBlueThin = _GDIPlus_PenCreate(0xFF00ffFF,2) ; перо для синей линии
_GDIPlus_GraphicsDrawLine($hGraphic, $iStartX, $iStartY, $iEndX, $iEndY, $hPenBlueThin) ; линия отрезка
_GDIPlus_PenDispose($hPenBlueThin) ; удаление ресурсов
_GDIPlus_GraphicsDispose($hGraphic) ; удаление ресурсов
_GDIPlus_Shutdown()
EndFunc


:ok:


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

поставьте мне кто - нибудь жирный плюс за решение такой сложной задачи! :rofl:
 
Верх