2014-11-26 4 views
1

Я работаю над утилитой, в которой список текстовых файлов заполняется в Combobox. Затем на основе выбранного элемента Combobox я хочу получить конкретный текст, который находится рядом со словом «материал». Теперь каждый из текстовых файлов может иметь несколько «материальных» значений. Эти TextFiles содержат определенный текст в приведенном ниже формате,Задать конкретный текст из выбранного текстового файла и получить цвет, связанный с конкретным текстом

MV_PL--0 

material Aluminium 
color 0.752941 0.752941 0.752941 
specular_color 0.87451 0.87451 0.87451 
end 

material Brass_Frosted 
color 0.811765 0.713726 0.478431 
specular_color 0.87451 0.803922 0.635294 
end 

мне удалось получить только первое значение рядом с «материалом» в ListBox. Как я могу получить все значения, перечисленные рядом с «материалом» в каждом текстовом файле?

[КОД]

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim strPath As String = "C:\Users\Test\" 
    Dim dirInfo As New IO.DirectoryInfo(strPath) 
    For Each file As FileInfo In dirInfo.GetFiles("*.txt", SearchOption.TopDirectoryOnly) 
     FileComboBox.Items.Add(file.Name) 
    Next 
End Sub 

Private Sub FileComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FileComboBox.SelectionChangeCommitted 

    MatlListBox.Items.Clear() 
    Dim strPath As String = "C:\Users\Test\" 
    Dim strRead As String = IO.File.ReadAllText(strPath + FileComboBox.SelectedItem.ToString) 

    Dim Material As String = strRead.Split(New String() {"material "}, StringSplitOptions.None)(1).Split(" ")(0) 
    MatlListBox.Items.Add(Material) 

End Sub 

[/ код]

Наконец, как только я получаю определенное значение, рядом с «материал» Мне нужно преобразовать значения, доступные в следующей строке «цвет 0,752941 0,752941 0,752941» к цвету, который может быть присвоен обратному цвету текстового поля. Просьба сообщить ...

+0

Как вы интерпретируете значение цвета? Я предполагаю, что они являются своего рода значениями RGB, но является ли это «процентом»? Каковы минимальные/максимальные значения для них? В .Net значения цвета RGB варьируются от 0 до 255. –

+0

Привет .. Спасибо за ваш ответ. Я тоже пытаюсь выработать эти ценности. В родительском приложении, для которого я разрабатываю утилиту, он показывает различный цвет в Preview, когда каждый тип материала выбран в Listbox. Я продолжу попытки преобразования цвета. Но вы можете помочь с заполнением всех значений Material из текстового файла в Listbox? – DK2014

+0

Ну, с одной стороны, вы разделите strRead на String, а не на массив строк. Вам нужно будет сделать массив массив и пропустить его. – Capellan

ответ

2

Я уверен, что вы, вероятно, можете проанализировать файл с помощью какого-то причудливого RegEx, но я сосать их. Вот простая старая процедура обработки строк, которая извлекает имя и цвет из выбранного текстового файла. Я не добавил ни одного из условий Else, которые возникли бы, если файл был плохо сформирован или имел недопустимое значение в одной из строк. Реализация здесь использует пользовательский класс «Материал», который содержит имя и значение цвета. Экземпляры материала добавляются в ComboBox. Переопределенная функция ToString() внутри определяет, как ComboBox отображает экземпляр Material. Когда SelectedIndex изменения ComboBox, мы бросили SelectedItem обратно материал и использовать значение, чтобы изменить цвет TextBox:

Private Sub FileComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FileComboBox.SelectionChangeCommitted 
    Dim materials As New List(Of Material) 
    Dim strPath As String = "C:\Users\Test\" 
    Dim lines As New List(Of String)(File.ReadAllLines(strPath + FileComboBox.SelectedItem.ToString)) 
    For i As Integer = 0 To lines.Count - 1 
     If lines(i).StartsWith("material") AndAlso i < lines.Count - 1 Then 
      Dim mat As New Material 

      Dim values() As String 
      values = lines(i).Split(" ") 
      If values.Length >= 2 Then 
       mat.Name = values(1) 

       If lines(i + 1).StartsWith(" color") Then 
        values = lines(i + 1).Split(" ") 
        If values.Length >= 5 Then 
         Dim value As Double 
         Dim R, G, B As Byte 
         If Double.TryParse(values(2), value) Then 
          If value >= 0 And value <= 1 Then 
           R = value * 255 

           If Double.TryParse(values(3), value) Then 
            If value >= 0 And value <= 1 Then 
             G = value * 255 

             If Double.TryParse(values(4), value) Then 
              If value >= 0 And value <= 1 Then 
               B = value * 255 

               mat.Color = Color.FromArgb(R, G, B) 
               materials.Add(mat) 
              End If 
             End If 
            End If 
           End If 
          End If 
         End If 
        End If 
       End If 
      End If 
     End If 
    Next 
    materials.Sort() 
    MatlListBox.DataSource = materials 
End Sub 

Private Class Material 
    Implements IComparable(Of Material) 

    Public Name As String 
    Public Color As Color 

    Public Overrides Function ToString() As String 
     Return Name 
    End Function 

    Public Function CompareTo(other As Material) As Integer Implements IComparable(Of Material).CompareTo 
     Return Me.Name.CompareTo(other.Name) 
    End Function 

End Class 

Private Sub MatlListBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles MatlListBox.SelectedIndexChanged 
    If MatlListBox.SelectedIndex <> -1 Then 
     Dim mat As Material = DirectCast(MatlListBox.SelectedItem, Material) 
     TextBox1.BackColor = mat.Color 
    End If 
End Sub 
+0

Большое спасибо idle_Mind .. Я заметил, что хотя он читает все значения Material, они не заполняют их в Listbox. Поэтому я переместил строку MatlListBox.Items.Add (mat) следующим образом: – DK2014

+0

Хммм ... Я пропустил пробел перед «цветом» в файле. См. Редактирование изменений ... нажмите. –

+0

Я изменил цвет на «цвет», затем обновил проверку длины массива и увеличил индексы, используемые для значений RGB. –

Смежные вопросы