gpt4 book ai didi

java - 解析立体光刻 (STL) 文件时验证标签顺序

转载 作者:行者123 更新时间:2023-11-30 08:10:37 25 4
gpt4 key购买 nike

我想解析 ASCII 格式的立体光刻文件 (STL),但这样做时遇到一些问题。

现在,文件必须遵循一定的格式:

solid [NAME]
facet normal [NX] [NY] [NZ]
outer loop
vertex [P1X] [P1Y] [P1Z]
vertex [P2X] [P2Y] [P2Z]
vertex [P3X] [P3Y] [P3Z]
endloop
endfacet
... + more facet-endfacet blocks
endsolid [NAME]

我可以使用 ScannerBufferedReader 来读取这些文件。我也可以毫无问题地确定给定的参数(P1X、P1Y 等)是否存在以及它们是否有效,或者即使它根本就是一个 STL 文件。

我的主要问题是我真的不知道如何确定标签的顺序是否正确。现在,我只能确定所有标签是否都正确关闭(每个开始标签都有一个结束标签)。这是代码:

private static boolean areTagsBalanced()
{
HashMap<String, String> tagPairs = new HashMap<String, String>();
tagPairs.put(SOLID, ENDSOLID);
tagPairs.put(FACET, ENDFACET);
tagPairs.put(OUTER, ENDLOOP);

Stack<String> openingTags = new Stack<String>();
HashSet<String> closingTags = new HashSet<String>(tagPairs.values());

for (int i=0; i<fileContent.size(); i++)
{
if (tagPairs.containsKey(fileContent.get(i)))
{
openingTags.push(fileContent.get(i));
}
else if (closingTags.contains(fileContent.get(i)))
{
if (openingTags.isEmpty() || !fileContent.get(i).equals(tagPairs.get(openingTags.pop())))
{
return false;
}
}
}
return openingTags.isEmpty();
}

正如您所见,代码并不关心在文件中找到标签的顺序。也许有人对我有一些意见。谢谢!

附注:

我需要检查标签的正确顺序,因为我的代码会将此代码标记为有效,尽管标签的顺序完全困惑:

solid
vertex
vertex
vertex
facet normal
endfacet
outer loop
endloop
endsolid

最佳答案

根据wiki判断STL 规则非常简单,您唯一需要检查的是标签父级。

有几种方法:

  • 设置一个 map 来存储有效的父项
  • 使用 isValidParent(Tag name) 等方法将标签类型设置为枚举
  • 简单的 if-else 方法。

map 似乎是最简单的一个(至少当我们只有一个允许的 parent 时):

Map<String, String> parents = new HashMap<>();
parents.put(SOLID, null);
parents.put(FACET, SOLID);
parents.put(OUTER, FACET);
parents.put(VERTEX, OUTER);

然后在循环中检查每个新开始标签的父级:

if (tagPairs.containsKey(fileContent.get(i))) {
// current top of the stack is a parent for new opening tag
String parent = openingTags.peek();
if (!parents.get(fileContent.get(i)).equals(parent)) {
return false;
}
openingTags.push(fileContent.get(i));
}

关于java - 解析立体光刻 (STL) 文件时验证标签顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30437528/

25 4 0