很难调整字符串以填充Class



我正在编写一个类库,用于从名为SpaceClaim的CAD软件中的3D模型中提取数据。当我从模型中提取数据时,我会得到一个字符串,下面是3种可用的可能性:

{Cone: Origin = (0.006, -0.006, 0.01), Direction = (0, 0, 1), Radius = 0.008, HalfAngle = 0.785398163397448}
{Cylinder: Origin = (-0.003, 0.001, 0), Direction = (0, 0, 1), Radius = 0.00921954445729289}
{Plane: Origin = (0, 0, 0.01), DirX = (1, 0, 0), DirY = (0, 1, 0), DirZ = (0, 0, 1)}

因此,首先我们有类型(平面、圆锥体或Cilinder(,然后原点是一个看起来很奇怪的数组(用[]替换(((,现在我只需要半径(如果类型=圆锥体或Cilinder(和半角(如果类型=Cone(

我上了一个名为FaceInfo:的课

public class FaceInfo
{            
public string Type { get; set; }
public Coordinates Origin { get; set; }
public double Radius { get; set; } = 0;
public double HalfAngle { get; set; } = 0;
}
public class Coordinates
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public Coordinates(string value)
{
string [] split = value.Split(new char[] { '(', ')', ',' });
X = double.Parse(split[0]);
Y = double.Parse(split[1]);
Z = double.Parse(split[2]);
}
}

我试过替换字符、拆分、子字符串。

一切都会在某个时刻失败。

请帮忙。谢谢

PS。坐标类仍然使用((作为数组,也需要解决这个问题。但首先是返回的字符串。如果数据不可读,则使用((或[]没有意义。

要提取数据,可以使用以下解决方案。

string pattern = @"((?<origin>.*)).+=s*((?<direction>.*)).+=s*(?<radius>[d.]*).+=s*(?<halfAngle>.*)}"; // continue the pattern for your needs
Regex rx = new Regex(pattern);
Match m = rx.Match(searchString);
FaceInfo faceInfo = new FaceInfo();
if (m.Success)
{
faceInfo.Origin = new Coordinates(m.Groups["origin"].Value);
faceInfo.Direction = new Coordinates(m.Groups["direction"].Value);
faceInfo.Radius = Convert.ToDouble(m.Groups["radius"].Value);
faceInfo.HalfAngle = Convert.ToDouble(m.Groups["halfAngle"].Value);
}

并将坐标类修改为

public class Coordinates
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public Coordinates(string value)
{
string[] split = value.Split(new char[] { ',' });
X = double.Parse(split[0]);
Y = double.Parse(split[1]);
Z = double.Parse(split[2]);
}
}
这听起来像是一个解析任务。所以我会使用(伪代码,所以请检查我(
var lines = input.Split("n");
Console.WriteLine(lines[0]); // for QA
foreach(var line in lines) {
int index1= line.indexOf(":");
string _type = line.SubString(1,index1);
Console.WriteLine(_type); // for QA;
string restOfLine = line.SubString(index1+1, line.Length - index1);
Console.WriteLine(restOfLine); // for QA;
var parts = restOfLine.Split(',');
foreach(var p in parts) {
Console.WriteLine(p); // for QA;
// ... continue the parsing....
}
FaceInfo f = new FaceInfo();
f.Type = _type;
// f. .... whatever = whatever...
}

像那样的东西?请确保以非常正确的方式进行解析,因为此文本并非完全采用标准JSON格式。。。。这就是所有// for QA评论的目的。

因此,让字符串值是您从CAD程序中获得的输入字符串。您已经放置了示例输入,所以我也将使用它们。

{Cone: Origin = (0.006, -0.006, 0.01)
, 
Direction = (0, 0, 1), Radius = 0.008
, 
HalfAngle = 0.785398163397448}

当您使用拆分时

new char[] { '('  ,  ')'  , ',' }

每当它看到"(","("或","时,它就会解析字符串

因此,分割方法的输出数组看起来像

0=>圆锥体:原点

1=>0.006

2=&gt-0.006

3=>0.01

要查看阵列的元素,可以使用

简单方法:

foreach(string element in splitOutputArray)
{
// If you use form
MessageBox.Show(element);

// If you use console 
Console.WriteLine(element);
}


更正确的方法是:使用断点。https://learn.microsoft.com/en-us/visualstudio/debugger/using-breakpoints?view=vs-2022

因此,当您查看数组的元素时,您会注意到这个问题。你的索引不正确。

可能的解决方案:

字段(原点、方向…(和字段中的值(0.006、-0.006、0.01(均以","分隔。因此,您必须查看输出的元素并更正索引。

X = double.Parse(split[0]);
Y = double.Parse(split[1]);
Z = double.Parse(split[2]);

一定是像这个

X = double.Parse(split[1]);
Y = double.Parse(split[2]);
Z = double.Parse(split[3]);

摘要:您完成了大部分工作,但必须更正索引(split[index](。抱歉,如果ı过度解释ı不知道你的水平。

最新更新