c++ - 使用 C/C++ 从 DWG 文件导入线点
问题描述
我正在为我的机器人编写用于 2D 导航的路径跟踪应用程序,路径包含在 DWG 文件中。例如,假设 DWG 文件包含一个 2x2 平方米的正方形。
我想打开 DWG 文件,找出线条并获取一些坐标用作我的机器人的航点。
目前,找到一种从 DWG 文件中读取坐标的方法对我来说是完美的。我看到有一些允许处理 DWG 文件的开源库,例如libredwg或libDWG,但我不明白它们是否可以用于我的目的。
你能帮我吗?
编辑:我发现libopencad可用于我的应用程序,我测试了示例应用程序,它输出如下内容:
Layers count: 1
1. Layer 0 contains 8 geometries
|---------Line---------|
Start Position: 62.5852 -36.5942 0
End Position: -62.5852 -36.5942 0
Entity color: #ffffffff
|---------Line---------|
Start Position: 62.5852 -36.5942 0
End Position: 62.5852 36.5942 0
Entity color: #ffffffff
|---------Line---------|
Start Position: 62.5852 36.5942 0
End Position: -62.5852 36.5942 0
Entity color: #ffffffff
|---------Line---------|
Start Position: -62.5852 -36.5942 0
End Position: -62.5852 36.5942 0
Entity color: #ffffffff
|---------Line---------|
Start Position: 62.5852 -76.4212 0
End Position: -62.5852 -76.4212 0
Entity color: #ffffffff
|---------Line---------|
Start Position: 62.5852 -76.4212 0
End Position: 62.5852 -61.4214 0
Entity color: #ffffffff
|---------Line---------|
Start Position: 62.5852 -61.4214 0
End Position: -62.5852 -61.4214 0
Entity color: #ffffffff
|---------Line---------|
Start Position: -62.5852 -76.4212 0
End Position: -62.5852 -61.4214 0
Entity color: #ffffffff
对于包含两个正方形的示例 DWG 文件:
问题是:如何将第一个矩形的坐标与第二个矩形分开?
解决方案
在从 DWG 提取的数据中,实际上并没有 2 个矩形。您有 8 行,并提供了其他分组。根据这个示例,您可能会假设前 4 行代表一个矩形,接下来的 4 行代表第二个。在这种情况下确实如此,但你不能依赖它。这完全取决于谁创建了 DWG,他们使用了什么工具,以及他们是按顺序绘制矩形还是交替绘制、删除、绘制、移动线条。
导入线条后,您可以通过查找自己对它们进行分组。从第一行开始。具有与第一条线的任一端点匹配的端点的任何其他线都是相同形状的一部分。使用第一条下一行的端点重复该过程,寻找另一条与其有共同端点的线。
这个算法当然看起来像一个使用递归的地方,一个标准容器,如矢量或地图,可能两者兼而有之。此外,坐标是浮点数,因此您必须小心比较运算符,并确定与同一点足够接近的程度。
最后,您需要定义可接受/不可接受的输入文件的要求,并决定如何处理不匹配的数据。一个好的通用算法可以找到三角形、矩形或任何连接的线形。确定连接的线是否形成简单的闭合多边形、线是否相交等还有另一层复杂性。
如果您可以确定输入文件始终只包含形成矩形的线条,那就容易多了。除非您可以确定这一点,否则您的程序至少需要检测何时无法找到矩形并安全失败。
推荐阅读
- python - 为什么 VSCode 无法识别 sqlite3?
- wxwidgets - 您如何使用 wxWidgets 分发软件?
- google-cloud-platform - 如何编辑 App.Yaml(谷歌云平台)
- excel - 单元格是否为空白的公式,它将前一个单元格视为该单元格的值并将单元格相加
- pandas - 使用带有两个字符作为分隔符的 pandas 从文本中加载数据
- intellij-idea - Intellij 快捷方式直接转到任何变量类或方法
- php - SQL QUESTION - Difference between using special characters with '' or with "" in a query in PHP
- excel - Excel 快速分析菜单。移除
- css - 无法在水平滚动中滚动到左边缘的末尾 - css
- matlab - 更改颜色图形栏