Screen grabber in Alaska
Re: Screen grabber in Alaska
I will try to help if you can give a sample program that demonstrates your problem.
We need to be able to compile and run the program.
The program you posted cannot be compiled and run because there are missing functions.
We need to be able to compile and run the program.
The program you posted cannot be compiled and run because there are missing functions.
The eXpress train is coming - and it has more cars.
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Screen grabber in Alaska
Hey, Roger!
The system itself demonstrates the problem. I could install it on Your computer using TeamViewer and Skype how to use it and how this problem occurs. The source code of the system is always fully available to You. Now there is a Skype online translator voice messages Russian - English. You could experience how it works. I have never used
The system itself demonstrates the problem. I could install it on Your computer using TeamViewer and Skype how to use it and how this problem occurs. The source code of the system is always fully available to You. Now there is a Skype online translator voice messages Russian - English. You could experience how it works. I have never used
Re: Screen grabber in Alaska
That sounds like a good idea.I could install it on Your computer using TeamViewer and Skype how to use it and how this problem occurs.
My Skype address is roger.donnay and I am using TeamViewer 11.
Let's try for 7 am tomorrow (Friday) (Mountain Daylight Time).
The eXpress train is coming - and it has more cars.
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Screen grabber in Alaska
And how it will be in Moscow time?
https://time.is/MDT
Moscow time it will be exactly 9 hours later, i.e. at 16 hours.
To be honest at this time I may not get, because we can be at this time in the Hacienda, and there the Internet is bad, h+
Many times I have shown its system partners, via TeamViewer. As we spoke in Skype. It is very convenient. Recently in Skype appeared the possibility of translating on the fly. I have never tried it. I hope we can understand each other. Spoken English I do not know, but on the screen everything I need to know.
https://time.is/MDT
Moscow time it will be exactly 9 hours later, i.e. at 16 hours.
To be honest at this time I may not get, because we can be at this time in the Hacienda, and there the Internet is bad, h+
Many times I have shown its system partners, via TeamViewer. As we spoke in Skype. It is very convenient. Recently in Skype appeared the possibility of translating on the fly. I have never tried it. I hope we can understand each other. Spoken English I do not know, but on the screen everything I need to know.
Re: Screen grabber in Alaska
Just let me know which time is best for you.
The eXpress train is coming - and it has more cars.
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Screen grabber in Alaska
I'm afraid I don't know. Just when I can - I can tell in Skype. That is, if you let it. Since I do sorry to disturb You. Especially I will try not to bother You when You have night.
Re: Screen grabber in Alaska
I can be available most times during the day and even at night (up to 9 pm).
Just send me a Skype message when you are available and I will answer you.
Just send me a Skype message when you are available and I will answer you.
The eXpress train is coming - and it has more cars.
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Screen grabber in Alaska
Thank you very much for this opportunity
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Screen grabber in Alaska
I now held a direct experiment proved that my intuitions were correct. I've commented out all the lines associated with the rotation of the image. The image of course was not the way it was intended. BUT IT HAS SURVIVED IN THE FORM OF THE FILE IS COMPLETELY OKAY! And when the image formation commands are used to rotate the image:
it is on the screen looks as it should, but remains a black square.
Below is the entire source text of this function. The commands associated with the rotation of the image, marked so on the right: // <<<##########, to their right was more noticeable. They are all at the end of the function body.
[/size]
Code: Select all
aMatrix := GraInitMatrix() // <<<##########
GraRotate( oPS, aMatrix, 360, {900, 425}, GRA_TRANSFORM_REPLACE ) // <<<##########
oPS:setGraTransform( aMatrix, GRA_TRANSFORM_REPLACE ) // <<<##########
Below is the entire source text of this function. The commands associated with the rotation of the image, marked so on the right: // <<<##########, to their right was more noticeable. They are all at the end of the function body.
Code: Select all
***********************************************************
******** Отображение заданной когнитивной функции
***********************************************************
FUNCTION LC_CognFun(mCurrInf, mOpSc, mClSc, mCognFun, nRun)
LOCAL GetList[0], GetOptions, oSay, oDevice, aMatrix, oBitmap
LOCAL aX[100000], aY[100000], aZ[100000] // Координаты X,Y,Z точек облака
*** АЛГОРИТМ: **************************************************************************************************************
*** 1. Создать БД облака точек: Points_XYZ.DBF из заданной модели M_CurrInf и заданных описательной и классификационной шкал
*** 2. Провести триангуляцию
*** 3. Провести заливку цветом
*** 4. Нарисовать редуцированную когн.функцию y=f(x) по максимумам информации
*** 5. Нарисовать оси и сетку по интервальным значениям
*** 6. Сделать заголовок и надписи по осям и по легенде
*** 7. Записать файл изображения с именем: "Модель-код опис.шкалы-код клас.шкалы"
****************************************************************************************************************************
IF ApplChange("") // Перейти в папку выбранного приложения или выйти из системы
LB_Warning("Необходимо задать (выбрать) хотя бы одно текущее приложение !!!")
RETURN NIL
ENDIF
*** 1. Создать БД облака точек: Points_XYZ.DBF из заданной модели M_CurrInf и заданных описательной и классификационной шкал
AFILL(aX,0)
AFILL(aY,0)
AFILL(aZ,0)
* ClearImageTr() // Очистка изображения
DIRCHANGE(M_PathAppl) // Перейти в папку текущего приложения
Ar_Model := { "Abs","Prc1","Prc2","Inf1","Inf2","Inf3","Inf4","Inf5","Inf6","Inf7" }
DO CASE
CASE mCognFun = 1
mNameCognFun = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-Pos.bmp'
CASE mCognFun = 2
mNameCognFun = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-Neg.bmp'
CASE mCognFun = 3
mNameCognFun = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-PosNeg.bmp'
ENDCASE
oScrn := DC_WaitOn('Расчет когнитивной функции: "'+mNameCognFun+'"')
M_Inf = Ar_Model[mCurrInf]
CLOSE ALL
USE (M_Inf) EXCLUSIVE NEW
USE Classes EXCLUSIVE NEW
USE Class_Sc EXCLUSIVE NEW
USE Gr_ClSc EXCLUSIVE NEW
USE Attributes EXCLUSIVE NEW
USE Opis_Sc EXCLUSIVE NEW
USE Gr_OpSc EXCLUSIVE NEW
SELECT Class_Sc
DBGOTO(mClSc)
mNameClSc = ALLTRIM(Name_ClSc)
mKodGrClSc1 = KodGr_Min
mKodGrClSc2 = KodGr_Max
SELECT Opis_Sc
DBGOTO(mOpSc)
mNameOpSc = ALLTRIM(Name_OpSc)
mKodGrOpSc1 = KodGr_Min
mKodGrOpSc2 = KodGr_Max
aNameCls := {}
SELECT Gr_ClSc
SET FILTER TO Kod_ClSc=mClSc
DBGOTOP()
DO WHILE .NOT. EOF()
AADD(aNameCls, DelZeroNameGr(Name_GrCS) )
DBSKIP(1)
ENDDO
aNameAtr := {}
SELECT Gr_OpSc
SET FILTER TO Kod_OpSc=mOpSc
DBGOTOP()
DO WHILE .NOT. EOF()
AADD(aNameAtr, DelZeroNameGr(Name_GrOS) )
DBSKIP(1)
ENDDO
SELECT Classes
SET FILTER TO Kod_ClSc=mClSc
DBGOTOP()
IF SUBSTR(Name_cls,1,12) = 'SPECTRINTERV'
aRGBCls := {} // Массив цветов признаков, если спектр
ENDIF
DO WHILE .NOT. EOF()
IF SUBSTR(Name_cls,1,12) = 'SPECTRINTERV'
* SpectrInterv: 999/999-{123,123,123}
* 123456789012 R G B
mPosR1 = AT('{', Name_cls)+1
mPosR2 = mPosR1+2
mPosG1 = mPosR2+2
mPosG2 = mPosG1+2
mPosB1 = mPosG2+2
mPosB2 = mPosB1+2
mRed = VAL(SUBSTR(Name_cls, mPosR1, mPosR2-mPosR1+1))
mGreen = VAL(SUBSTR(Name_cls, mPosG1, mPosG2-mPosG1+1))
mBlue = VAL(SUBSTR(Name_cls, mPosB1, mPosB2-mPosB1+1))
* MsgBox(Name_cls+' '+STR(mRed)+','+STR(mGreen)+','+STR(mBlue))
fColor := GraMakeRGBColor({ mRed, mGreen, mBlue})
* SetPixel(hDC1, x, y, AutomationTranslateColor(fColor,.f.) )
* AADD(aRGBCls, AutomationTranslateColor(fColor,.f.))
AADD(aRGBCls, fColor)
ENDIF
DBSKIP(1)
ENDDO
SELECT Attributes
SET FILTER TO Kod_OpSc=mOpSc
DBGOTOP()
IF SUBSTR(Name_atr,1,12) = 'SPECTRINTERV'
aRGBAtr := {} // Массив цветов признаков, если спектр
ENDIF
DO WHILE .NOT. EOF()
IF SUBSTR(Name_atr,1,12) = 'SPECTRINTERV'
* SpectrInterv: 999/999-{123,123,123}
* 123456789012 R G B
mPosR1 = AT('{', Name_atr)+1
mPosR2 = mPosR1+2
mPosG1 = mPosR2+2
mPosG2 = mPosG1+2
mPosB1 = mPosG2+2
mPosB2 = mPosB1+2
mRed = VAL(SUBSTR(Name_atr, mPosR1, mPosR2-mPosR1+1))
mGreen = VAL(SUBSTR(Name_atr, mPosG1, mPosG2-mPosG1+1))
mBlue = VAL(SUBSTR(Name_atr, mPosB1, mPosB2-mPosB1+1))
* MsgBox(Name_atr+' '+STR(mRed)+','+STR(mGreen)+','+STR(mBlue))
fColor := GraMakeRGBColor({ mRed, mGreen, mBlue})
* SetPixel(hDC1, x, y, AutomationTranslateColor(fColor,.f.) )
* AADD(aRGBAtr, AutomationTranslateColor(fColor,.f.))
AADD(aRGBAtr, fColor)
ENDIF
DBSKIP(1)
ENDDO
aMinGrIntCls := {}
aMaxGrIntCls := {}
aAvrGrIntCls := {}
SELECT Classes
SET FILTER TO Kod_ClSc=mClSc
DBGOTOP()
DO WHILE .NOT. EOF()
mNameGr = Name_cls
IF Min_GrInt+Max_GrInt+Avr_GrInt > 0 .AND. NUMTOKEN(mNameGr,',')=1 .AND. NUMTOKEN(mNameGr,'{')=1 .AND. NUMTOKEN(mNameGr,'}')=1 // Если классификационная шкала числовая
AADD(aMinGrIntCls, Min_GrInt)
AADD(aMaxGrIntCls, Max_GrInt)
AADD(aAvrGrIntCls, Avr_GrInt)
ELSE // Если классификационная шкала текстовая
AADD(aMinGrIntCls, Kod_cls-1.0)
AADD(aMaxGrIntCls, Kod_cls )
AADD(aAvrGrIntCls, Kod_cls-0.5)
ENDIF
DBSKIP(1)
ENDDO
aMinGrIntAtr := {}
aMaxGrIntAtr := {}
aAvrGrIntAtr := {}
SELECT Attributes
SET FILTER TO Kod_OpSc=mOpSc
DBGOTOP()
DO WHILE .NOT. EOF()
mNameGr = Name_atr
IF Min_GrInt+Max_GrInt+Avr_GrInt > 0 .AND. NUMTOKEN(mNameGr,',')=1 .AND. NUMTOKEN(mNameGr,'{')=1 .AND. NUMTOKEN(mNameGr,'}')=1 // Если описательная шкала числовая
AADD(aMinGrIntAtr, Min_GrInt)
AADD(aMaxGrIntAtr, Max_GrInt)
AADD(aAvrGrIntAtr, Avr_GrInt)
ELSE // Если описательная шкала текстовая
AADD(aMinGrIntAtr, Kod_atr-1.0)
AADD(aMaxGrIntAtr, Kod_atr )
AADD(aAvrGrIntAtr, Kod_atr-0.5)
ENDIF
DBSKIP(1)
ENDDO
SELECT (M_Inf)
PointsCount = 0 // Количество точек
**** Координаты точек позитивных и негативных редуцированных когнитивных функций
aXcfPos := {}
aYcfPos := {}
aZcfPos := {}
aXcfNeg := {}
aYcfNeg := {}
aZcfNeg := {}
Krnd2 = 0
FOR mKodGrOpSc = mKodGrOpSc1 TO mKodGrOpSc2
DBGOTO(mKodGrOpSc)
mXcfPos = -9999999
mYcfPos = -9999999
mZcfPos = -9999999
mXcfNeg = +9999999
mYcfNeg = +9999999
mZcfNeg = +9999999
FOR mKodGrClSc = mKodGrClSc1 TO mKodGrClSc2
PointsCount++
IF aMinGrIntAtr[mKodGrOpSc-mKodGrOpSc1+1]+aMaxGrIntAtr[mKodGrOpSc-mKodGrOpSc1+1]+aAvrGrIntAtr[mKodGrOpSc-mKodGrOpSc1+1] > 0 // Если описательная шкала числовая
aX[PointsCount] = aAvrGrIntAtr[mKodGrOpSc-mKodGrOpSc1+1] * (1+IF(RANDOM(.T.)>0,1,-1)*Krnd2) // Если шкалы числовые, то брать среднее числового интервального значения
ELSE
aX[PointsCount] = mKodGrOpSc * (1+IF(RANDOM(.T.)>0,1,-1)*Krnd2) // Если шкалы текстовые, то брать код градации описательной шкалы
ENDIF
IF aMinGrIntCls[mKodGrClSc-mKodGrClSc1+1]+aMaxGrIntCls[mKodGrClSc-mKodGrClSc1+1]+aAvrGrIntCls[mKodGrClSc-mKodGrClSc1+1] > 0 // Если классификационная шкала числовая
aY[PointsCount] = aAvrGrIntCls[mKodGrClSc-mKodGrClSc1+1] * (1+IF(RANDOM(.T.)>0,1,-1)*Krnd2) // Если шкалы числовые, то брать среднее числового интервального значения
ELSE
aY[PointsCount] = mKodGrClSc * (1+IF(RANDOM(.T.)>0,1,-1)*Krnd2) // Если шкалы текстовые, то брать код градации описательной шкалы
ENDIF
aZ[PointsCount] = FIELDGET(2+mKodGrClSc)
IF aZ[PointsCount] > mZcfPos
mXcfPos = aX[PointsCount]
mYcfPos = aY[PointsCount]
mZcfPos = aZ[PointsCount]
ENDIF
IF aZ[PointsCount] < mZcfNeg
mXcfNeg = aX[PointsCount]
mYcfNeg = aY[PointsCount]
mZcfNeg = aZ[PointsCount]
ENDIF
NEXT
AADD(aXcfPos, mXcfPos)
AADD(aYcfPos, mYcfPos)
AADD(aZcfPos, mZcfPos)
AADD(aXcfNeg, mXcfNeg)
AADD(aYcfNeg, mYcfNeg)
AADD(aZcfNeg, mZcfNeg)
NEXT
************* Визуализация облака точек когнитивной функции
X_Max := 1800
Y_Max := 850 // Размер графического окна для самого графика в пикселях
***** Задать атрибуты линии
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
graSetAttrLine( oPS, aAttr )
* PointsCount // число точек
**** Поиск минимальных и максимальных X и Y и нормирование
mMinXcf = +99999999999
mMaxXcf = -99999999999
mMinYcf = +99999999999
mMaxYcf = -99999999999
FOR p=1 TO PointsCount
mMinXcf = MIN(mMinXcf, aX[p])
mMaxXcf = MAX(mMaxXcf, aX[p])
mMinYcf = MIN(mMinYcf, aY[p])
mMaxYcf = MAX(mMaxYcf, aY[p])
NEXT
Kx = 0.6
Ky = 0.6
dXcf = (X_Max-Kx*X_Max)/2 - 150 // По сути это 0 по оси X
dYcf = (Y_Max-Ky*Y_Max)/2 + 70 // По сути это 0 по оси Y
FOR p=1 TO PointsCount
aX[p] = Kx * X_Max * ( aX[p] - mMinXcf) / (mMaxXcf - mMinXcf) + dXcf
aY[p] = Ky * Y_Max * ( aY[p] - mMinYcf) / (mMaxYcf - mMinYcf) + dYcf
NEXT
FOR p=1 TO LEN(aXcfPos)
aXcfPos[p] = Kx * X_Max * ( aXcfPos[p] - mMinXcf) / (mMaxXcf - mMinXcf) + dXcf
aYcfPos[p] = Ky * Y_Max * ( aYcfPos[p] - mMinYcf) / (mMaxYcf - mMinYcf) + dYcf
NEXT
FOR p=1 TO LEN(aXcfNeg)
aXcfNeg[p] = Kx * X_Max * ( aXcfNeg[p] - mMinXcf) / (mMaxXcf - mMinXcf) + dXcf
aYcfNeg[p] = Ky * Y_Max * ( aYcfNeg[p] - mMinYcf) / (mMaxYcf - mMinYcf) + dYcf
NEXT
FOR p=1 TO LEN(aMinGrIntAtr)
aMinGrIntAtr[p] = Kx * X_Max * ( aMinGrIntAtr[p] - mMinXcf) / (mMaxXcf - mMinXcf) + dXcf
aMaxGrIntAtr[p] = Kx * X_Max * ( aMaxGrIntAtr[p] - mMinXcf) / (mMaxXcf - mMinXcf) + dXcf
aAvrGrIntAtr[p] = Kx * X_Max * ( aAvrGrIntAtr[p] - mMinXcf) / (mMaxXcf - mMinXcf) + dXcf
NEXT
FOR p=1 TO LEN(aMinGrIntCls)
aMinGrIntCls[p] = Ky * Y_Max * ( aMinGrIntCls[p] - mMinYcf) / (mMaxYcf - mMinYcf) + dYcf
aMaxGrIntCls[p] = Ky * Y_Max * ( aMaxGrIntCls[p] - mMinYcf) / (mMaxYcf - mMinYcf) + dYcf
aAvrGrIntCls[p] = Ky * Y_Max * ( aAvrGrIntCls[p] - mMinYcf) / (mMaxYcf - mMinYcf) + dYcf
NEXT
**** Макс.значения координат по X и Y
p = LEN(aAvrGrIntCls)
mMaxYcf = aAvrGrIntCls[p]
p = LEN(aAvrGrIntAtr)
mMaxXcf = aAvrGrIntAtr[p]
DIRCHANGE(Disk_dir) // Перейти в папку с системой Эйдос
***** Создать БД для координат X,Y,Z точек облака
aStructure := { { "Num" , "N", 15, 0 }, ;
{ "pX" , "N", 19, 7 }, ;
{ "pY" , "N", 19, 7 }, ;
{ "pZ" , "N", 19, 7 }, ;
{ "pRed" , "N", 3, 0 }, ;
{ "pGreen", "N", 3, 0 }, ;
{ "pBlue" , "N", 3, 0 } }
DbCreate( 'Points_XYZ', aStructure )
CLOSE ALL
USE Points_XYZ EXCLUSIVE NEW
SELECT Points_XYZ
FOR p=1 TO PointsCount
APPEND BLANK
REPLACE Num WITH p
REPLACE pX WITH aX[p]
REPLACE pY WITH aY[p]
REPLACE pZ WITH aZ[p]
NEXT
CLOSE ALL
* LB_Warning( 'Построение точек завершено','4.8. Когнитивные функции системы "Эйдос"' )
*** 2. Провести триангуляцию
Triangulation(.F.)
*** 3. Провести заливку цветом
ClearImageTr() // Очистка изображения
DC_Impl(oScrn)
StrFile('Нормировать цвет', '_NormColor.txt')
* M_CurrInf = FileStr('_NormColor.txt')
Shading(.F.)
*** 4. Нарисовать редуцированную когн.функцию y=f(x)
** Нарисовать позитивную редуцированную когн.функцию y=f(x) по максимумам информации и точки значений нередуцированной когн.функции
IF mCognFun = 1 .OR. mCognFun = 3
FOR j=1 TO LEN(aXcfPos)-1
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[192] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 5 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {aXcfPos[j], aYcfPos[j]}, {aXcfPos[j+1], aYcfPos[j+1]} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[193] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 3 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {aXcfPos[j], aYcfPos[j]}, {aXcfPos[j+1], aYcfPos[j+1]} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[190] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {aXcfPos[j], aYcfPos[j]}, {aXcfPos[j+1], aYcfPos[j+1]} )
***** Нарисовать опорные точки
aAttr [ GRA_AL_COLOR ] := GRA_CLR_BLUE // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 2 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfPos[j], aYcfPos[j] }, 3 ) // Рисует круг стилем линии
aAttr [ GRA_AL_COLOR ] := GRA_CLR_DARKGRAY // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfPos[j], aYcfPos[j] }, 4 ) // Рисует круг стилем линии
NEXT
***** Нарисовать последнюю опорную точку
j = LEN(aXcfPos)
aAttr [ GRA_AL_COLOR ] := GRA_CLR_BLUE // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 2 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfPos[j], aYcfPos[j] }, 3 ) // Рисует круг стилем линии
aAttr [ GRA_AL_COLOR ] := GRA_CLR_DARKGRAY // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfPos[j], aYcfPos[j] }, 4 ) // Рисует круг стилем линии
ENDIF
** Нарисовать негативную редуцированную когн.функцию y=f(x) по минимума информации и точки значений нередуцированной когн.функции
IF mCognFun = 2 .OR. mCognFun = 3
FOR j=1 TO LEN(aXcfNeg)-1
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[12] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 5 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {aXcfNeg[j], aYcfNeg[j]}, {aXcfNeg[j+1], aYcfNeg[j+1]} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[9] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 3 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {aXcfNeg[j], aYcfNeg[j]}, {aXcfNeg[j+1], aYcfNeg[j+1]} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[34] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {aXcfNeg[j], aYcfNeg[j]}, {aXcfNeg[j+1], aYcfNeg[j+1]} )
***** Нарисовать опорные точки
aAttr [ GRA_AL_COLOR ] := GRA_CLR_RED // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 2 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfNeg[j], aYcfNeg[j] }, 3 ) // Рисует круг стилем линии
aAttr [ GRA_AL_COLOR ] := GRA_CLR_DARKGRAY // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfNeg[j], aYcfNeg[j] }, 4 ) // Рисует круг стилем линии
NEXT
***** Нарисовать последнюю опорную точку
j = LEN(aXcfNeg)
aAttr [ GRA_AL_COLOR ] := GRA_CLR_RED // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 2 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfNeg[j], aYcfNeg[j] }, 3 ) // Рисует круг стилем линии
aAttr [ GRA_AL_COLOR ] := GRA_CLR_DARKGRAY // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aXcfNeg[j], aYcfNeg[j] }, 4 ) // Рисует круг стилем линии
ENDIF
* FOR p=1 TO PointsCount
* aAttr [ GRA_AL_COLOR ] := GRA_CLR_RED // Задать цвет линии
* aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
* graSetAttrLine( oPS, aAttr )
* GraArc ( oPS, { aX[p], aY[p] }, 2 ) // Рисует круг стилем линии
* aAttr [ GRA_AL_COLOR ] := GRA_CLR_DARKGRAY // Задать цвет линии
* aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
* graSetAttrLine( oPS, aAttr )
* GraArc ( oPS, { aX[p], aY[p] }, 3 ) // Рисует круг стилем линии
* NEXT
*** 5. Нарисовать оси и сетку по числовым интервальным значениям или текстовым градациям
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := 1 // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
*** Горизонтальные линии
FOR j=2 TO LEN(aMinGrIntCls)-1
GraLine( oPS, { dXcf, aMinGrIntCls[j] }, { Kx*X_Max+dXcf, aMinGrIntCls[j] } )
GraLine( oPS, { dXcf, aMaxGrIntCls[j] }, { Kx*X_Max+dXcf, aMaxGrIntCls[j] } )
NEXT
*** Вертикальные линии
FOR j=2 TO LEN(aMinGrIntAtr)-1
GraLine( oPS, { aMinGrIntAtr[j], dYcf }, { aMinGrIntAtr[j], Ky*Y_Max+dYcf } )
GraLine( oPS, { aMaxGrIntAtr[j], dYcf }, { aMaxGrIntAtr[j], Ky*Y_Max+dYcf } )
NEXT
*** 6. Сделать заголовок и надписи по осям и по легенде
**** Написать заголовок диаграммы
aFonts := XbpFont():new():list() // Все доступные шрифты
oFont := XbpFont():new():create("22.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER // Выравнивание символов по горизонтали по центру относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
DO CASE
CASE mCognFun = 1
mNameCognFun = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-Pos.bmp'
CASE mCognFun = 2
mNameCognFun = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-Neg.bmp'
CASE mCognFun = 3
mNameCognFun = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-PosNeg.bmp'
ENDCASE
GraStringAt( oPS, { X_Max/2, Y_Max-25 }, 'КОГНИТИВНАЯ ФУНКЦИЯ: "'+mNameCognFun+'"' )
oFont := XbpFont():new():create("18.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER // Выравнивание символов по горизонтали по центру относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF )
GraStringAt( oPS, { X_Max/2, Y_Max- 55 }, 'Приложение: "'+ALLTRIM(M_NameAppl)+'"' )
* GraStringAt( oPS, { X_Max/2, Y_Max- 80 }, 'Классиф.шкала: ['+ALLTRIM(STR(mClSc))+']-'+mNameClSc )
* GraStringAt( oPS, { X_Max/2, Y_Max-105 }, 'Описат. шкала: ['+ALLTRIM(STR(mOpSc))+']-'+mNameOpSc )
*****************************************************************************************************
*** Легенда
*****************************************************************************************************
oFont := XbpFont():new():create("12.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_LEFT // Выравнивание символов по горизонтали по левому краю относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
s = 0.5
d1 = 20
d2 = 400
GraStringAt( oPS, { mMaxXcf+d1, mMaxYcf-s*20 }, 'Пояснения:' )
oFont := XbpFont():new():create("9.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_LEFT // Выравнивание символов по горизонтали по левому краю относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
*****************************************************************************************************
s++
s++
*****************************************************************************************************
GraStringAt( oPS, { mMaxXcf+d1, mMaxYcf-s*20}, 'Позитивная редуцированная когнитивная функция:' )
s = s + 0.85
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[192] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 5 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {mMaxXcf+d1, mMaxYcf-s*20}, {mMaxXcf+d2, mMaxYcf-s*20} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[193] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 3 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {mMaxXcf+d1, mMaxYcf-s*20}, {mMaxXcf+d2, mMaxYcf-s*20} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[190] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {mMaxXcf+d1, mMaxYcf-s*20}, {mMaxXcf+d2, mMaxYcf-s*20} )
*****************************************************************************************************
s++
s++
*****************************************************************************************************
GraStringAt( oPS, { mMaxXcf+d1, mMaxYcf-s*20}, 'Негативная редуцированная когнитивная функция:' )
s = s + 0.85
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[12] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 5 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {mMaxXcf+d1, mMaxYcf-s*20}, {mMaxXcf+d2, mMaxYcf-s*20} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[9] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 3 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {mMaxXcf+d1, mMaxYcf-s*20}, {mMaxXcf+d2, mMaxYcf-s*20} )
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
aAttr [ GRA_AL_COLOR ] := aCOLOR[34] // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraLine( oPS, {mMaxXcf+d1, mMaxYcf-s*20}, {mMaxXcf+d2, mMaxYcf-s*20} )
*****************************************************************************************************
s++
s++
*****************************************************************************************************
GraStringAt( oPS, { mMaxXcf+d1, mMaxYcf-s*20}, 'Шкала соответствия цветов спектра и количества информации' )
s = s + 0.85
GraStringAt( oPS, { mMaxXcf+d1, mMaxYcf-s*20}, 'в значениях аргумента когнитивной функции о ее значениях:' )
s = s - 1.15
****** Визуализация спектра - легенды ************************
N_Line = 360 // Число линий в спектре
D = 0
Delta = INT(360/ N_Line )
Kx = 327 / N_Line * (1 + mDeltaSpectr/360) // Коэффициент масштабирования по оси Y: преобразует аргумент функции в номер пикселя по оси Y
* mColorZer = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (0 - mInfMin) / (mInfMax-mInfMin) )) // Сделать нормировку значений по цветам спектра: MAX=Красный, MIN-фиолетовый ##############################
* aAvrGrIntCls[p] = Ky * Y_Max * ( aAvrGrIntCls[p] - mMinYcf) / (mMaxYcf - mMinYcf) + dYcf
mColorZer = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * ( 0 - mZcfNeg) / (mZcfPos - mZcfNeg) )) // Сделать нормировку значений по цветам спектра: MAX=Красный, MIN-фиолетовый ##############################
ma := 255/2
mb := 255/2
mc := 255/2
mU := 0
mV := 120
mW := 240
R := INT( ma * (1 + COS( ( mColorZer + mU ) * GradRad ) ) )
G := INT( mb * (1 + COS( ( mColorZer + mV ) * GradRad ) ) )
B := INT( mc * (1 + COS( ( mColorZer + mW ) * GradRad ) ) )
fColorZer := GraMakeRGBColor({ R, G, B })
Column = 0
mMinZer = +99999999
X1zer = 0
X2zer = 0
FOR n = 359 TO mDeltaSpectr STEP -Delta
ma := 255/2
mb := 255/2
mc := 255/2
mU := 0
mV := 120
mW := 240
R := INT( ma * (1 + COS( ( n + mU ) * GradRad ) ) )
G := INT( mb * (1 + COS( ( n + mV ) * GradRad ) ) )
B := INT( mc * (1 + COS( ( n + mW ) * GradRad ) ) )
fColor := GraMakeRGBColor({ R, G, B })
***** Закрасить фон прямоугольника ***************
GraSetColor( oPS, fColor, fColor )
++Column
* X1 := (Column-1) * Kx + mDeltaSpectr / 2
* X2 := Column * Kx + mDeltaSpectr / 2
* Y1 := 0
* Y2 := 0 + 30
* GraStringAt( oPS, { mMaxXcf+d1, mMaxYcf-s*20}, 'Негативная редуцированная когнитивная функция:' )
X1 := mMaxXcf+d1
X2 := mMaxXcf+d1+30
Y1 := mMaxYcf-s*20 - ( (Column-1) * Kx + mDeltaSpectr / 2 )
Y2 := mMaxYcf-s*20 - ( Column * Kx + mDeltaSpectr / 2 )
GraBox( oPS, { X1, Y1 }, { X2, Y2 }, GRA_FILL)
mZer = ABS( fColor - fColorZer )
IF mZer < mMinZer
mMinZer = mZer
X1zer = X1
X2zer = X2
Y1zer = Y1
Y2zer = Y2
ENDIF
NEXT
** Еще сделать надпись нуля, если минимум меньше нуля
IF mZcfNeg < 0
oFont := XbpFont():new():create('9.Arial')
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_LEFT // Выравнивание символов по горизонтали по левому краю относительно точки начала вывода
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
GraSetColor( oPS, aColor[222], aColor[222] )
GraStringAt( oPS, { X2zer+10, Y1zer }, '0.000')
ENDIF
GraBox( oPS, { X1zer, Y1zer }, { X2zer, Y2zer }, GRA_OUTLINE )
****** Надписи на легенде
Column = 0
FOR n = 360 TO mDeltaSpectr STEP -Delta
++Column
NEXT
Y1 := mMaxYcf-s*20 - mDeltaSpectr / 2
Y2 := mMaxYcf-s*20 - ( Column * Kx + mDeltaSpectr / 2 )
oFont := XbpFont():new():create("9.Arial")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_LEFT // Выравнивание символов по горизонтали по левому краю относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
GraStringAt( oPS, { X2+10, Y1 }, ALLTRIM(STR(mZcfPos,15,3)))
s = 0
GraStringAt( oPS, { X2+90, Y1-s*20 }, 'Значения когнитивной функции,')
s++
GraStringAt( oPS, { X2+90, Y1-s*20 }, 'характерные для значений аргумента')
GraStringAt( oPS, { X2+10, Y2 }, ALLTRIM(STR(mZcfNeg,15,3)))
s = -1
GraStringAt( oPS, { X2+90, Y2-s*20 }, 'Значения когнитивной функции,')
s++
GraStringAt( oPS, { X2+90, Y2-s*20 }, 'нехарактерные для значений аргумента')
************************************************
**** Параметры формирования когнитивных функций:
************************************************
oFont := XbpFont():new():create("12.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_LEFT // Выравнивание символов по горизонтали по левому краю относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
aModel = {'1. ABS -кол-во наблюдений пар: "класс-признак" в исх.данных ',;
'2. PRC1-усл.вероятность i-го признака в признаках j-го класса',;
'3. PRC2-усл.вероятность i-го признака у объектов j-го класса ',;
'4. INF1-количество знаний по А.Харкевичу; вероятности из PRC1',;
'5. INF2-количество знаний по А.Харкевичу; вероятности из PRC2',;
'6. INF3-Xи-квадрат, разности между факт.и теор.абс.частотами ',;
'7. INF4-ROI (Return On Investment); вероятности из PRC1 ',;
'8. INF5-ROI (Return On Investment); вероятности из PRC2 ',;
'9. INF6-разн.усл.и безусл.вероятностей; вероятности из PRC1 ',;
'10.INF7-разн.усл.и безусл.вероятностей; вероятности из PRC2 ' }
s = 4
GraStringAt( oPS, { X2+10, dYcf-s*20 }, 'Параметры формирования когнитивных функций:')
s++
oFont := XbpFont():new():create("9.Arial")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_LEFT // Выравнивание символов по горизонтали по левому краю относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
GraStringAt( oPS, { X2+10, dYcf-s*20 }, 'Модель: '+ALLTRIM(aModel[mCurrInf]))
s++
GraStringAt( oPS, { X2+10, dYcf-s*20 }, 'Диапазон кодов классификационных шкал: '+ALLTRIM(STR(mKodClSc1))+' - '+ALLTRIM(STR(mKodClSc2)))
s++
GraStringAt( oPS, { X2+10, dYcf-s*20 }, 'Диапазон кодов описательных шкал: '+ALLTRIM(STR(mKodOpSc1))+' - '+ALLTRIM(STR(mKodOpSc2)))
s++
GraStringAt( oPS, { X2+10, dYcf-s*20 }, 'Дата и время создания данной формы: '+DTOC(DATE())+' - '+TIME())
**** Надписи градаций по оси классов
oFont := XbpFont():new():create("9.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_RIGHT // Выравнивание символов по горизонтали по правому краю относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
FOR j=1 TO LEN(aMinGrIntCls)
IF SUBSTR(mNameClSc,1,12) = 'SpectrInterv'
GraSetColor( oPS, aRGBCls[j], aRGBCls[j] ) // Цвет текста наименования градации - цвет цветового диапазона
ENDIF
GraStringAt( oPS, { dXcf-20, aAvrGrIntCls[j] }, '['+ALLTRIM(STR(j))+']-'+aNameCls[j] ) // Надпись градации по оси Y
GraSetColor( oPS, GRA_CLR_BLACK, GRA_CLR_BLACK )
NEXT
***** Надписи наименований шкал Y и X
oFont := XbpFont():new():create("12.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER // Выравнивание символов по горизонтали по центру относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
AxName = '['+ALLTRIM(STR(mOpSc))+']-'+mNameOpSc
aTxtPar = DC_GraQueryTextbox(AxName, oFont) // {101,16} Определяет длину и высоту текста в пикселях для некоторых шрифтов
GraStringAt( oPS, { dXcf+(mMaxXcf-dXcf)/2-aTxtPar[1]/2, 10}, AxName ) // Надпись оси Х
AyName = '['+ALLTRIM(STR(mClSc))+']-'+mNameClSc
aTxtPar = DC_GraQueryTextbox(AyName, oFont) // {101,16} Определяет длину и высоту текста в пикселях для некоторых шрифтов
aMatrix := GraInitMatrix() // <<<##########
GraRotate( oPS, aMatrix, 90, { 15, dYcf+(mMaxYcf-dYcf)/2-aTxtPar[1]/2 }, GRA_TRANSFORM_ADD ) // <<<##########
oPS:setGraTransform( aMatrix, GRA_TRANSFORM_REPLACE ) // <<<##########
GraStringAt( oPS, { 15, dYcf+(mMaxYcf-dYcf)/2-aTxtPar[1]/2 }, AyName ) // Надпись оси Y
*** Наименования значений фактора писать с поворотом на 90 градусов
oFont := XbpFont():new():create("9.Arial Bold")
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_RIGHT // Выравнивание символов по горизонтали по правому краю относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
* DC_DebugQout(aRGBAtr)
FOR j=1 TO LEN(aAvrGrIntAtr)
AxName = '['+ALLTRIM(STR(j))+']-'+DelZeroNameGr(aNameAtr[j])
aMatrix := GraInitMatrix() // <<<##########
IF SUBSTR(mNameOpSc,1,12) = 'SpectrInterv'
GraRotate( oPS, aMatrix, 90, { aAvrGrIntAtr[j], dYcf-20 }, GRA_TRANSFORM_REPLACE ) // <<<##########
oPS:setGraTransform( aMatrix, GRA_TRANSFORM_REPLACE ) // <<<##########
GraSetColor( oPS, aRGBAtr[j], aRGBAtr[j] ) // Цвет текста наименования градации - цвет цветового диапазона
GraStringAt( oPS, { aAvrGrIntAtr[j], dYcf-20 }, AxName ) // Надпись градации по оси X
GraSetColor( oPS, GRA_CLR_BLACK, GRA_CLR_BLACK )
ELSE
GraRotate( oPS, aMatrix, 90, { aAvrGrIntAtr[j], dYcf-20 }, GRA_TRANSFORM_REPLACE ) // <<<##########
oPS:setGraTransform( aMatrix, GRA_TRANSFORM_REPLACE ) // <<<##########
GraStringAt( oPS, { aAvrGrIntAtr[j], dYcf-20 }, AxName ) // Надпись градации по оси X
ENDIF
NEXT
****** Не получается отключить режим вращения изображения
****** Вместо отключения можно докрутить до 360 градусов
X_Max := 1800
Y_Max := 850 // Размер графического окна для самого графика в пикселях
aMatrix := GraInitMatrix() // <<<##########
GraRotate( oPS, aMatrix, 360, {900, 425}, GRA_TRANSFORM_REPLACE ) // <<<##########
oPS:setGraTransform( aMatrix, GRA_TRANSFORM_REPLACE ) // <<<##########
*** Масштабирование: Kx = 1920/1280, Ky = 1080/720: GraScale( oPS, aMatrix, {Kx,Ky}, {X_Max/2, X_Max/2} )
* GraScale( oPS, aMatrix, {1920/1280,1080/720}, {X_Max/2, X_Max/2} )
*** 7. Записать файл изображения с именем: "Модель-код опис.шкалы-код клас.шкалы"
DIRCHANGE(M_PathAppl) // Перейти в папку текущего приложения
IF FILEDATE("Cogn_fun",16) = CTOD("//")
DIRMAKE("Cogn_fun")
Mess = 'В папке текущего приложения: "#" не было директории "Cogn_fun" для когнитивных функций и она была создана!'
Mess = STRTRAN(Mess, "#", UPPER(ALLTRIM(M_PathAppl)))
LB_Warning(Mess, '4.8. Когнитивные функции. (C) Система "Эйдос-Х++"' )
ENDIF
DIRCHANGE(M_PathAppl+"\Cogn_fun\") // Перейти в папку Cogn_fun
cFileName = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'.bmp'
DO CASE
CASE mCognFun = 1
cFileName = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-Pos.bmp'
CASE mCognFun = 2
cFileName = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-Neg.bmp'
CASE mCognFun = 3
cFileName = Ar_Model[mCurrInf]+'-'+STRTRAN(STR(mOpSc,4),' ','0')+'-'+STRTRAN(STR(mClSc,4),' ','0')+'-PosNeg.bmp'
ENDCASE
ERASE(cFileName)
* WTF oStatic1:status()
* oStatic1:unlockPS ()
DC_Scrn2ImageFile( oStatic1, cFileName )
* oBitmap := GraSaveScreen( oStatic1, oStatic1:CurrentPos() , oStatic1:CurrentSize() )
* oBitmap:SaveFile(cFileName)
* oBitmap:=LB_Scrn2ClipBoard(oStatic1)
* oBitmap:SaveFile(cFileName)
* DIRCHANGE(M_PathAppl) // Перейти в папку текущего приложения
DIRCHANGE(Disk_dir) // Перейти в папку с системой
RETURN NIL
Re: Screen grabber in Alaska
hi,
i wonder how it work with oPS while you have not assign it ?
p.s. SetPixel "draw" into hDC not Presentationspace.
i wonder how it work with oPS while you have not assign it ?
Code: Select all
line 288
graSetAttrLine( oPS, aAttr )
greetings by OHR
Jimmy
Jimmy