Treeview na criação dinâmica de penas automáticas

Olá pessoal!

Gostaria de uma ajuda. Estou trabalhando num script com objetivo de facilitar a interação do usuário para análise gráfica das medidas analógicas, provenientes de uma estrutura de objetos, através do E3Chart. Utilizei o objeto Treeview da biblioteca HP para seleção e criação dinâmicas de penas na tela.

Contudo, estou encontrando algumas dificuldades na hora de validar a medida que já foi criada a partir da seleção do usuário, assim como encontrar a melhor forma de ajustar os eixos conforme a seleção.

Tela de testes:

Cenário de teste:

Estou utilizando a propriedade SelectionList do objeto Treeview para definição da medida e, consequentemente, da pena automática que será atribuída ao E3Chart. Assim, ao segundo click no botão “Vizualizar”, a mesma pena é gerada.

image

Segue o script preliminar da funcionalidade:

Sub hpCommandButton1_OnEventClick()

auxString = Screen.Item(“hptreeview1”).SelectionList ’ propriedade SelectionList do objeto treeview

If auxString <> Empty then

' ETAPA 01: "TRATAMENTO DA STRING"
auxString = replace(auxString, Chr(34),"") ' retirando ""/Chr(34) da string
auxVetor = split(auxString, vbNewline) ' transformando a string em um vetor de linhas

' laço1 para cada linha
For i=0 to Ubound(auxVetor)
	vetorColunas = split(auxVetor(i), ";") ' separação da linha em um vetor de células
Next

' ETAPA 02: "FILTRANDO AS MEDIDAS DE INTERESSE"

' declaração do vetor
vetorMedidas = array

' laço3 para validação das medidas
For i=0 to Ubound(vetorColunas)
	 
	 ' buscando os objetos do servidor
	 set obj  = Application.GetObject(vetorColunas(i))
	 
	 ' teste de validação de medidas "analógicas" e "digitais"
	 if typename(obj)= "PowerAnalogMeasurement" OR typename(obj)= "PowerDiscreteMeasurement" then
		ReDim Preserve vetorMedidas (UBound(vetorMedidas) + 1)  ' redimensionamento do vetor com acréscimo
		vetorMedidas(UBound(vetorMedidas)) = vetorColunas(i)  ' novo valor para nova posição
	 end if
Next

' ETAPA 03: "PLOTANDO O GRÁFICO"

' laço4 para criação das penas
For i=0 to Ubound(vetorMedidas)			
	If Err.Number <> 0 then
		MsgBox "Erro de script! " & VbNewline & Err.Number
	Else
		Set medida = Application.GetObject(vetorMedidas(i)) ' busca os objetos de medida no servidor
		Set chart = Screen.Item("E3Chart1") ' busca a coleção de penas d objeto E3Chart
			
		'Msgbox "Medidas Encontradas: " & vetorMedidas(i)
		'Msgbox "Tag: " & medida.Item("Scada").Tag
		'Msgbox "DocString: " & medida.DocString
				
		' laço5 para validação da coleção de penas
		For Each pens in Chart.Pens
			' teste de validação de penas existentes
			If pens.YLink = medida.Item("Scada").Tag then
				Msgbox "Pena: " & pens.Name & " já existe!"
			End if
		Next
		' configuração das penas
		Set pen = chart.Pens.AddPen("") ' criação da pena
			pen.DataSourceType = 3 ' 0 = RT | 1 = hist | 2 = HistOrRT | 3 = automatica
			pen.YLink = medida.Item("Scada").Tag ' tag
			pen.UseTimeStamp = True
			pen.UseAutomaticAxis = True
			pen.name = medida.DocString ' nome
			pen.Connect() ' conexão da pena
	
	End If
	
	on error goto 0
	
Next

Else

Msgbox "Seleciona alguma medida!"

End If

End Sub

A minha maior dificuldade está no processo de validação para criação das penas e no controle dos eixos a medida que as medidas são inseridas pelo usuário.

Boa tarde, Matheus.

Respondendo à sua dúvida neste tópico, assim como vimos antes, primeiramente a string de saída da TreeView, que aponta para os objetos da SE, deve ser filtrada de forma retornar as medidas elétricas que serão plotadas:

Sub hpCommandButton1_eventClick()

'tratamento da string:

'propriedade SelectionList:
auxString = Screen.Item(“hptreeview1”).SelectionList

'retirando “” da string:
auxString = replace(auxString, Chr(34),"")

'transformando da string em um vetor de linhas:
auxVetor = split(auxString, vbNewline)

'teste 0: visualização após retirar as aspas “”
Msgbox auxVetor(0)

'Para cada linha:
For i=0 to Ubound(auxVetor)

'separo a linha em um vetor de células:
vetorColunas = split(auxVetor(i), “;”)

For j=0 to Ubound(vetorColunas)

  'teste 1: visualização após separação
  Msgbox vetorColunas(j)

Next

Next

vetorMedidas = array

For i=0 to Ubound(vetorColunas)

set obj = Application.GetObject(vetorColunas(i))

if typename(obj)= “PowerAnalogMeasurement” OR typename(obj)= “PowerDiscreteMeasurement” then

  ReDim Preserve vetorMedidas (UBound(vetorMedidas) + 1)  'acrecimo do array
  vetorMedidas(UBound(vetorMedidas)) = vetorColunas(i)  'novo valor para nova posição

end if

Next

For i=0 to Ubound(vetorMedidas)

  Msgbox "Medidas Encontradas: " & vetorMedidas(i)

Next

End Sub

A partir deste ponto, com o uso do vetorMedidas, deve-se realizar a criação das penas automáticas no E3Chart.

Nisso foi sugerido percorrer todos os elementos do array de medidas e fazer uso do método AddPen, de forma a criar penas automáticas e associa-las à propriedade de eixo vertical com caminho da sua respectiva medida.

**Exatamente, @WillianP! O script está funcional! **

Contudo, tive que controlar a duplicidade de penas utilizando o método Remove(Index) no laço da etapa 3: “Plotando o Gráfico”. Assim, caso a pena já exista na coleção, ela será removida através desse método, conforme mostra o script abaixo:
--------------------------
**For Each pen in pens **
**If pen.YLink = medida.Item(“Scada”).Tag then **
**pens.Remove(pen.Name) **
End if
Next
--------------------------