티스토리 뷰

[DIAdem] Flag 지정된 부분을 따로 떼어내는 스크립트 구현


이번 포스팅에서는 DIAdem에서 읽어온 데이터를 VIEW 창에서 플래그를 지정하여 원하는 데이터만 복사하는 방법에 대해서 알아보도록 하겠습니다. 


DIAdem은 Set Flag와 Flag Copy Data라는 기능을 통해서 범위가 지정된 데이터를 복사하는 기능을 가지고 있습니다. 

이는 DIAdem 자체 프로그램에서도 가능합니다. 


테스트를 위해서 아무런 데이터나 읽어오겠습니다. 저는 Example 파일을 읽어왔습니다. VIEW 화면으로 전환한뒤 Example 그룹의 1번부터 3번 채널까지 선택하여 그래프로 만들겠습니다. 


아래의 그림은 DIAdem의 VIEW 화면입니다. VIEW 화면에서 Band Cursor 기반으로 범위를 지정하고, 왼쪽 상단의 빨간 네모박스 를 통해서 지정에 대한 Flag를 지정하였습니다.



몇 개의 플래그를 지정하여 복사를 하고자 하면 Set Flags 명령 옆에 있는 Flags : Copy Data Points를 누르시면 됩니다. 



저 버튼을 누르게 되면 활성화된 그룹의 아랫부분에 다음과 같이 새로운 채널이 생기게 되고, 채널은 지정한 범위에 대한 값을 복사하여 관련 값을 가지고 있습니다.



하지만 빨간부분을 지정한 뒤, 아래의 그림처럼 빨간색과 녹색 차트 모두 복사를 하고 싶다고 한다면 어떻게 해야 할까요?

DIAdem의 VIEW 화면에서는 지정된 Flag에 대한 채널 부분의 값만 복사하기 때문에 이런 경우에는 Script 언어를 사용하셔야 합니다. 



아래는 설정된 플래그에 대한 채널뿐 아니라 지정하는 채널 모두 값은 위치의 값을 복사하는 스크립트 코드입니다. 

자세한 설명은 주석을 참고하세요. 이 코드에서 핵심은 CHF() 함수의 사용여부입니다. 


CHF의 첫번째 인자는 Index, 두번째 인자는 채널 이름을 넣습니다. 입력된 채널의 값중 Index 부분이 Flag인지 아닌지 여부를 판단해 주는 함수입니다. 만약 Flag로 지정이 된 상태라면 True가 아니라면 False를 리턴합니다. 


'-------------------------------------------------------------------------------

'-- VBS script file

'-- Created on 09/17/2014 13:11:07

'-- Author: 

'-- Comment: 

'-------------------------------------------------------------------------------

Option Explicit  'Forces the explicit declaration of all the variables in a script.


dim Index


' Index는 처음 복사 채널, To 는 복사할 마지막 채널 

' 2 to 4로 지정을 하면 2번재 처널부터 4번째 채널까지 복사

for Index = 2 to 3

  Call CopyFlaggedChnVal(Index, "[1]/[1]", "[1]/[" + cstr(index) + "]")

next


' 복사 코드

sub CopyFlaggedChnVal(Index, Chn_X, Chn_Y)


  Dim NewChn_X, NewChn_Y, X_No, Y_No, Xn_No, Yn_No, iMaxLen, iLoop, iCurrPos

  Dim Name, exIndexInserted

  

  ' 복사할 채널의 최대 길이를 가져온다.

  iMaxLen = ChnPropValGet(Chn_Y, "length")  


  ' 속성 설정 및 새로운 채널 생성

  Name = ChnPropValGet(Chn_Y, "Name")

  NewChn_Y = ChnAlloc(Name + "_NEW", iMaxLen)  

  

  Yn_No = cno(NewChn_Y(0))    

  Y_No = cno(Chn_Y) 

  iCurrPos = 1

  exIndexInserted = false

  

  ' 최대 길이 까지 돌면서 Flag된 부분만 복사

  ' Flag되었는지 여부는 Chf 함수를 통해서 확인

  

  for iLoop = 1 to iMaxLen  

    

    if Chf(iLoop, "[1]/[2]") then

    

      if iCurrPos <> 1 and exIndexInserted = false then

        ChdX(iCurrPos - 1, Yn_No) = NoValue      

      end if

    

      ChdX(iCurrPos, Yn_No) = ChdX(iLoop, Y_No)     

      iCurrPos = iCurrPos + 1

      exIndexInserted = true

    else

      exIndexInserted = false      

    end if

    

  next

  

  ChdX(iCurrPos - 1, Yn_No) = NoValue

  

  ' set channel length (necessary because of fast access

  Call ChnPropValSet(NewChn_Y(0), "length", iCurrPos)

  

  ' set channel characteristics (necessary because of fast access

  call ChnCharacter(NewChn_Y(0))  

  

end sub


이 코드를 Script 창에서 실행을 시키면 '채널이름_NEW' 라는 새로운 채널이 생긴것을 확인 할 수 있습니다.

이 채널의 값을 VIEW 화면으로 가져오면 빨간색 차트 선에 지정된 부분과 동일하게 초록색도 짤려서 복사된것을 확인할 수 있습니다. 




이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.



댓글