Screen grabber in Alaska

This forum is for eXpress++ general support.
Message
Author
User avatar
rdonnay
Site Admin
Posts: 4733
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Screen grabber in Alaska

#11 Post by rdonnay »

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.
The eXpress train is coming - and it has more cars.

User avatar
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

#12 Post by Eugene Lutsenko »

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

User avatar
rdonnay
Site Admin
Posts: 4733
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Screen grabber in Alaska

#13 Post by rdonnay »

I could install it on Your computer using TeamViewer and Skype how to use it and how this problem occurs.
That sounds like a good idea.

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.

User avatar
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

#14 Post by Eugene Lutsenko »

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.

User avatar
rdonnay
Site Admin
Posts: 4733
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Screen grabber in Alaska

#15 Post by rdonnay »

Just let me know which time is best for you.
The eXpress train is coming - and it has more cars.

User avatar
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

#16 Post by Eugene Lutsenko »

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.

User avatar
rdonnay
Site Admin
Posts: 4733
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Screen grabber in Alaska

#17 Post by rdonnay »

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.
The eXpress train is coming - and it has more cars.

User avatar
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

#18 Post by Eugene Lutsenko »

Thank you very much for this opportunity

User avatar
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

#19 Post by Eugene Lutsenko »

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:

Code: Select all

   aMatrix := GraInitMatrix()                                                                               // <<<##########
   GraRotate( oPS, aMatrix, 360, {900, 425}, GRA_TRANSFORM_REPLACE )                                        // <<<##########
   oPS:setGraTransform( aMatrix, GRA_TRANSFORM_REPLACE )                                                    // <<<##########
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.

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
[/size]

User avatar
Auge_Ohr
Posts: 1407
Joined: Wed Feb 24, 2010 3:44 pm

Re: Screen grabber in Alaska

#20 Post by Auge_Ohr »

hi,

i wonder how it work with oPS while you have not assign it ?

Code: Select all

line 288
graSetAttrLine( oPS, aAttr )
p.s. SetPixel "draw" into hDC not Presentationspace.
greetings by OHR
Jimmy

Post Reply