我正在编写一个类库,用于从名为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=>-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](。抱歉,如果ı过度解释ı不知道你的水平。