我在编写一些我编写的VB代码时遇到了一些麻烦,这些代码基于一组预定义的分隔符(逗号,分号,冒号等)来分割字符串。我已经成功编写了一些可以加载到自定义VB组件中的代码(我把这个代码放在一个名为Grasshopper的插件中的VB.NET组件中),一切正常。例如,假设我的传入字符串是“123,456”。当我将这个字符串输入我写的VB代码时,我得到一个新的列表,其中第一个值是“123”,第二个值是“456”。
但是,我一直在尝试将此代码编译到它自己的类中,因此我可以将其与标准VB组件分开加载到Grasshopper中。当我尝试编译此代码时,它不会将字符串分成具有两个值的新列表。相反,我收到一条消息“System.String []”。你们看到我的编译代码有什么问题吗?您可以通过以下链接找到我的问题的屏幕截图:click to see image
这是已编译类的VB代码:
Public Class SplitString
Inherits GH_Component
Public Sub New()
MyBase.New("Split String", "Split", "Splits a string based on delimeters", "FireFly", "Serial")
End Sub
Public Overrides ReadOnly Property ComponentGuid() As System.Guid
Get
Return New Guid("3205caae-03a8-409d-8778-6b0f8971df52")
End Get
End Property
Protected Overrides ReadOnly Property Internal_Icon_24x24() As System.Drawing.Bitmap
Get
Return My.Resources.icon_splitstring
End Get
End Property
Protected Overrides Sub RegisterInputParams(ByVal pManager As Grasshopper.Kernel.GH_Component.GH_InputParamManager)
pManager.Register_StringParam("String", "S", "Incoming string separated by a delimeter like a comma, semi-colon, colon, or forward slash", False)
End Sub
Protected Overrides Sub RegisterOutputParams(ByVal pManager As Grasshopper.Kernel.GH_Component.GH_OutputParamManager)
pManager.Register_StringParam("Tokenized Output", "O", "Tokenized Output")
End Sub
Protected Overrides Sub SolveInstance(ByVal DA As Grasshopper.Kernel.IGH_DataAccess)
Dim myString As String
DA.GetData(0, myString)
myString = myString.Replace(",", "|")
myString = myString.Replace(":", "|")
myString = myString.Replace(";", "|")
myString = myString.Replace("/", "|")
myString = myString.Replace(")(", "|")
myString = myString.Replace("(", String.Empty)
myString = myString.Replace(")", String.Empty)
Dim parts As String() = myString.Split("|"c)
DA.SetData(0, parts)
End Sub
结束班
这是我在Grasshopper中创建的自定义VB代码:
Private Sub RunScript(ByVal myString As String, ByRef A As Object)
myString = myString.Replace(",", "|")
myString = myString.Replace(":", "|")
myString = myString.Replace(";", "|")
myString = myString.Replace("/", "|")
myString = myString.Replace(")(", "|")
myString = myString.Replace("(", String.Empty)
myString = myString.Replace(")", String.Empty)
Dim parts As String() = myString.Split("|"c)
A = parts
End Sub
结束班
答案 0 :(得分:1)
嗯,对Grasshopper一无所知,我只能猜测......
System.String []
是.NET在字符串数组上调用ToString()
时会打印的内容。所以,我猜你已经给了Grasshopper一个想要一个字符串的数组。
所以,稍微进一步猜测,我们会怎样尝试:
Dim parts As String() = myString.Split("|"c)
For I = 0 to parts.Length -1
DA.SetData(I, parts[I])
答案 1 :(得分:0)
好吧,我尝试了你建议的代码片段......但它没有用。我认为原始代码中的问题是我正在尝试将值列表(即部分)发送到单个输出节点。所以,当我使用DA.SetData(0,parts)时,我正在将值列表写入我编译组件的第一个输出节点。但是,我认为问题在于组件不知道部件是列表。在我之前给出的示例中,如果我的传入字符串是“123,456”,那么我的结果拆分列表应该有两个值(123和456)。我认为我没有声明零件是一个清单。你有什么想法怎么做?再次,如果你点击原始电子邮件中的链接(使用Internet Explorer时...我不确定为什么Firefox没有打开它)你应该看到Grasshopper插件中的设置截图应该有助于你了解发生了什么。再次感谢您的帮助。