开源改变世界

激光插件:isInside() 函数问题 #1172

推推 grbl 3年前 (2023-02-02) 210次浏览
打开
juankygali 打开了这个问题 2019 年 2 月 27 日 · 76条评论
打开

激光插件:isInside() 函数问题#1172

juankygali 打开了这个问题 2019 年 2 月 27 日 · 76条评论

评论

激光插件:isInside() 函数问题 #1172

嗨,我正在尝试开发一个插件来以特定方式处理 gcode,以便我的机器可以“打印”PCB 在水平线上的移动。机器的行为将是:在路径内部进行蚀刻(PCB 的痕迹)。

我的想法是检测路径内的点来决定我们是否必须蚀刻。通过处理位于棋盘上的虚拟点地图,它将生成 gcode 来执行所有水平传递。它类似于 pyrograph 插件,但从 gcode 文件开始,而不是图像文件。

我得到的结果如下: 在这个测试中,我看到插件正在运行,尽管它花费了很多时间。我在路径内使用 G1 命令移动(绘制了连续的线条,不准确,但这是为分辨率参数赋予更高值的问题)
激光插件:isInside() 函数问题 #1172

测试具有很多路径的文件: 处理过程中消耗的时间很多…它不起作用,因为插件在检测内部路径时失败(没有在路径内部生成 G1 命令,函数 isInside() 返回 false) .
激光插件:isInside() 函数问题 #1172

我把我用来做检测的代码部分放在:

for y in range(0,n_steps_y):
			bool_row=[]
			for x in range(0,n_steps_x):
				for bid in app.editor.getSelectedBlocks():
					for path in app.gcode.toPath(bid):
                                               #here I evaluate if the point is inside
	                        		result = path.isInside(points_matrix[y][x])
						if result: #if it is true, it is inside path, I save the value in a position of the row
							bool_row.append(True)
							break
						else: #if it is not inside it will be a false
							bool_row.append(False)
			bool_matrix.append(bool_row) #I save the row in a matrix

不确定我是否正确使用函数 isInside()

我希望你能帮助我。如果需要,我会留下孔代码。请问我是否有不清楚的地方。

非常感谢!!

激光插件:isInside() 函数问题 #1172
贡献者
斯芬克斯 评论了 2019 年 2 月 27 日  

@juankygali,为什么要用之字形而不是蛇形?
您的插件可以在图像轮廓的内部/外部绘制 (Inkscape) 吗?
我需要在程序 Inkscape 获得的图像轮廓内进行 vyzhech。

激光插件:isInside() 函数问题 #1172
作者

你好@sfinexer. 是的,我想改进代码以进行“蛇形”运动,但到那时它只是一个测试。
该插件现在被编码为在轮廓内部“绘制”,但很容易更改为相反的方向(在外部绘制)。

然而,它花了很多时间来处理……我不确定我是否正在接近它。

抱歉,我不明白你说的“vyzhech”是什么意思?

激光插件:isInside() 函数问题 #1172
贡献者
斯芬克斯 评论了 2019 年 2 月 27 日  

@juankygali翻译 )) 烧录/烫画。

我认为这是一个非常有用的插件。
可以打个补丁吗

激光插件:isInside() 函数问题 #1172 哈维 补充道 漏洞 复制 标签 2019 年 2 月 27 日
激光插件:isInside() 函数问题 #1172
合作者

#933的副本

激光插件:isInside() 函数问题 #1172
作者

@juankygali翻译 )) 烧录/烫画。

@sfinexer好的,我明白了,所以你需要做和我几乎一样的过程。但是你是从 Inkscape 获取 gcode 文件吗?也许 Inkscape 可以使我试图获得的过程……只是想知道。我这样做的目的是直接从 Eagle 获取 gcode,然后在 bCNC 中处理它。

我认为这是一个非常有用的插件。
可以打个补丁吗

我会将 python 文件上传到此线程,但在此之前我想清理代码并可能修改以制作“蛇形”动作。

激光插件:isInside() 函数问题 #1172
贡献者

使用 intersection 你可以让它只在路线内进行水平布局,而不是在水平布局上浪费时间而不会燃烧。处理需要很长时间(我不知道是否可以通过某种方式更快地完成)。交集适用于 gcode。然后你必须烧掉轨道的形状。(我在某个时候上传了类似的东西 – 即使在开发中 – 对于带有 2 个不同直径刀具的 PCB)。
但是,简单地使用口袋操作不是很方便吗?

激光插件:isInside() 函数问题 #1172
作者

你好@MARIOBASZ并感谢您的支持。

首先,我看到 intersection 函数是执行此操作的方法,但后来我意识到 isInside 函数已经在使用它了……所以会不一样吗?

关于使用 pocket 操作,我试过了,但我什么也得不到,因为它崩溃了。也许我做错了什么。

激光插件:isInside() 函数问题 #1172

对不起,我的无知,但我在这个话题上的知识是有限的。

祝好。

激光插件:isInside() 函数问题 #1172
合作者
哈维 评论了 2019 年 2 月 27 日  

@juankygali我已经为您提供了指向#933的链接。intersection 有一些bug,在某些情况下会影响isinside。如果您能帮我弄清楚发生了什么,我会非常高兴,因为岛屿和选项卡都依赖于此代码。

顺便说一句,你使用最新的 git master 吗?有一些关于此代码的检查尚未发布。

激光插件:isInside() 函数问题 #1172
作者

感谢您的回复@Harvie.

是的,我查看了#933并意识到代码中有一些更改是我在 git master 中没有的。我将尝试了解所做的事情,对其进行测试并希望找出一些有趣的东西。

问候。

激光插件:isInside() 函数问题 #1172
贡献者
马里奥巴斯 评论了 2019 年 2 月 27 日  

希望您能找到里面的不便!如果没有空间在内部生成它,而不是什么都不生成,Pocket 就会崩溃。如果有人可以修改它,那将是一个帮助。
但是 Profile In 行为正确。我想到的一个解决方案,(ok是简陋的)是:在make profile中,如果生成route,就生成一个pocket,如果没有则继续

激光插件:isInside() 函数问题 #1172
作者

啊,好的@MARIOBASZ, 我明白你的意思。好吧,在我的情况下,目的是水平移动,尽管我不需要在某些区域燃烧。那是因为 PCB 会有很多走线,而且我认为只在内部路径一条一条地通过比沿着整块板逐行通过会更耗时。只是行驶距离的问题。

激光插件:isInside() 函数问题 #1172
作者

@sfinexer我让插件能够使用蛇形动作来生成 gcode

激光插件:isInside() 函数问题 #1172

激光插件:isInside() 函数问题 #1172

如果你想尝试一些东西,我会附上插件的文件……至少它适用于 1 路径设计。

pyrograph_copy.zip

激光插件:isInside() 函数问题 #1172
贡献者
马里奥巴斯 评论了 2019 年 2 月 27 日  

我认为 Inside 的问题是在边界线上,如果两条迹线相交

激光插件:isInside() 函数问题 #1172
贡献者

@juankygail,我会尽可能看看你的代码,我很想看看它。
这是我用dif生成的(我不记得有没有修改),我看看能不能倒过来生成(就是生成里面的route)

激光插件:isInside() 函数问题 #1172

激光插件:isInside() 函数问题 #1172
作者

这是一个非常有趣的结果@MARIOBASZ. 你是怎么得到的?我正在尝试但没有结果。

首先,我认为您将痕迹隔离开来,然后生成线条图案(使用一些插件),最后使两者有所不同……对吗?如果你能给我解释一下就好了

激光插件:isInside() 函数问题 #1172
贡献者

@juankygail,
1-我打开 pcb 的痕迹(我使用 PCB Gcode)。我将它们标记为带有“Island”的岛屿
2-在您的情况下,是使用 Plugin Flaten Pocket type Raster 生成水平道路
3-它应该可以工作……但我只是注意到:如果线条重合,它似乎确实如此不生成路线(我应该检查如何解决这个问题)

激光插件:isInside() 函数问题 #1172
贡献者

通过split2contourn改变eulerize可以防止程序被阻塞。((第 79 和 80 行)
#paths_newbase.extend (newbase.eulerize ())
paths_newbase.extend (newbase.split2contours ()

激光插件:isInside() 函数问题 #1172
作者

@MARIOBASZ我一直在按照您解释的步骤进行操作,结果很有趣。也许这离解决我的问题还很远,但我认为这是一个很好的方法。

使用差异,我得到以下信息:
激光插件:isInside() 函数问题 #1172

使用交集(最接近我的应用程序的结果)我得到了这个:
激光插件:isInside() 函数问题 #1172

它有效但只需要一条路径,暂时不知道为什么

通过split2contourn改变eulerize可以防止程序被阻塞。((第 79 和 80 行)
#paths_newbase.extend (newbase.eulerize ())
paths_newbase.extend (newbase.split2contours ()

不确定这两个函数在做什么,但正如你所说,我看到在某些时候 eulerize 崩溃了……我将它更改为 split2contours 并且似乎有效。

激光插件:isInside() 函数问题 #1172
贡献者
马里奥巴斯 评论了 2019 年 2 月 28 日  

如果我没记错的话,交集只考虑了两个对象。必须继续评估其余的选定块。你是程序员吗?我不是在我的机器上发送我修改过的东西(我认为有时会产生一些错误,也许是重叠线的问题?)我不是程序员也许你可以帮我自动化任务:我做了一个变体来转换对象对于实体,如果它们都“相交”,则它适用于两个或多个对象。如果对象A与B相交,C与D相交,D与B与E相交,则没有连接所有的图形,生成一个实体AB,又生成一个CDE。我没有时间(和热情)继续完善它。
使用差异、相交和实体连接,更多轮廓输入,轮廓打开,在连续操作中,我可以更快地用 2 个不同直径的刀具铣削 PCB 轨道。海报或徽标也是如此,但需要手动进行许多连续操作,而且我还无法将它们自动化并作为插件工作。你可以帮帮我吗?我已就 PCB 问题寻求帮助,但没有收到答复,这令人沮丧。
有两点很重要要解决:limits lines 的叠加问题,如果没有空间,pocket 不会锁定(虽然我写的,我使用 profile out 然后 pocket 来欺骗他)#1037 # 988

激光插件:isInside() 函数问题 #1172
贡献者

小心这个问题:#1175

激光插件:isInside() 函数问题 #1172
作者

我正在阅读所引用的问题,我看到您正在尝试做与我类似的事情。

我的编程知识很差,我几乎看不懂代码,我需要很多时间来开发一些有用的东西……但我试图制作插件,因为我无法让机器按照我想要的方式运行(搬进来水平线,内部燃烧)与任何插件或它们的混合。

所以,关于你的目的,我想到了一些问题:
– 为什么你需要建立对象的联合?你不是从一个包含整个 PCB 的文件开始的吗?
– 在什么情况下使用 2 种不同的刀具进行铣削?

激光插件:isInside() 函数问题 #1172
合作者

Eulerize() 是正在进行的实验性功能,我创建它是因为我不知道我可以使用 split2contours…如果事实证明 split2contours() 做同样的事情,我想我会完全删除它。

激光插件:isInside() 函数问题 #1172
作者

我解决了我在代码中犯的一个错误。现在插件能够处理每条路径。

激光插件:isInside() 函数问题 #1172
它用了 1 秒钟,因为文件太简单了。

对于更复杂 的文件:分辨率参数设置为 10(每条水平线 10 个点),耗时约 3 分钟。显然我们需要设置更高的分辨率值,并等待 3 分钟以上 :’)
激光插件:isInside() 函数问题 #1172

错误是 isInside() 返回的布尔值没有正确保存,覆盖了它们自己。我犯下的愚蠢错误。

激光插件:isInside() 函数问题 #1172
作者

更新插件
pyrograph_copy_2.zip

激光插件:isInside() 函数问题 #1172
贡献者
马里奥巴斯 评论了 2019 年 3 月 1 日  

我从来没有用过激光或pirograph插件,你解决了线之间重合相交的问题吗?
您是否尝试过对所有轨道进行“连接”然后相交?
一个不适合您使用的临时解决方案是将要减去的痕迹或路线从直线转换为“提前锯切或 0.0001 毫米之字形”(我认为类似于 arcfit 应该如何工作或线性化,或生成摆线样式)。当线段叠加时,我显然更喜欢令人满意的交集问题解决方案。
缺点是速度慢:几分钟或几小时,具体取决于复杂情况……

激光插件:isInside() 函数问题 #1172
贡献者

用 2 个草莓铣削,0.10 + 0.70 如果我想要在大多数地方轨道之间的分离就是这样(我有在小分离焊接时产生短路的技能)。或者用字母制作一张海报,角度更明显而不是那么圆:
0.7 产生的 2 个问题:角度是一个。它侵入另一个轨道或相邻字母的地方。(Gcode 通过为 0.1 和另一个为 0.7 制作一个跟踪来解决这个问题,但是有一些关键区域你可以粗略出 0.5mm)
对于海报,我不知道
粗加工+终止的操作,即,两个工具,有时可能很方便。Solid Union 为我提供了这个服务,并且还可以生成一些连接两个图形的路线,而无需进行计算以节省时间。

激光插件:isInside() 函数问题 #1172
作者

我从来没有用过激光或pirograph插件,你解决了
线之间重合相交的问题吗?

目前,我只测试了不相交的路径。那是因为我在 bCNC 中加载的 pcb 不会有交叉路径。不过,我会测试它。

您是否尝试过对所有轨道进行“连接”然后相交?

是的,我试过了,按照你的步骤。差异效果很好,但生成的结果与我需要的相反。有了交集,事情就失败了,它只走了一条路。我按照你说的加入了街区,但结果是一样的……也许它需要更多的测试。

关于使用 2 种工具进行铣削的目的,我相信我明白了:使用最大的内部区域进行铣削,使用其他工具对形状进行轮廓加工,对吗?自动生成似乎更复杂的gcode。如您所见,我的“方法”有点简陋,但非常简单。此外,与水平线铣削相比,铣削形状不会花费更长的时间吗?事实上,我不知道铣削,也许这不是继续进行的理想方式,但我提出了这种情况。

激光插件:isInside() 函数问题 #1172
作者

也许您找到了问题 #1175 的解决方案?

我不这么认为,因为重合段的问题似乎取决于函数 intersectPath,或者它在差异插件中的应用。我看到 intersectPath 不止一次返回同一个交点。也许它正在造成一些混乱……

在图像中似乎内外都在燃烧(如果它停止显示 G0 运动有助于形象化),还是我错了?

它只在里面燃烧,G0 运动写在路径外面。

蛇形运动就是您所说的光栅扁平化生成的东西?最好选择垂直或水平蛇形运动

是的,pattern=raster flatten。一有进展我会第一时间更新。

激光插件:isInside() 函数问题 #1172
作者

我设法根据尖端工具的大小自动生成蛇形图案,并将图案作为孤岛并与路径相交。

使用 0.2 毫米的尖端工具仅需 15-20 秒。
激光插件:isInside() 函数问题 #1172
激光插件:isInside() 函数问题 #1172

激光插件:isInside() 函数问题 #1172
贡献者

精彩的!!

激光插件:isInside() 函数问题 #1172
贡献者

如果可以,请分享插件或将其上传到 Github。我想试试。

激光插件:isInside() 函数问题 #1172
贡献者
马里奥巴斯 评论了 2019 年 3 月 4 日  

这是 solid union 的一个例子,然后
是在通过完成位之后
激光插件:isInside() 函数问题 #1172

激光插件:isInside() 函数问题 #1172

激光插件:isInside() 函数问题 #1172
作者

不错的结果@MARIOBASZ

这是我现在拥有的插件:
difference_copy.zip

激光插件:isInside() 函数问题 #1172
合作者
哈维 评论了 2019 年 3 月 4 日  

这是我现在拥有的插件:
difference_copy.zip

@juankygali Please learn git basics (how to do fork,clone,commit,pull,push,log,status,pull request,etc…)
It’s not that hard. And it will open you whole new world of career opportunities.
It’s very important, because it enables you to be in sync with bCNC code that can be changing while you develop your plugin. It

喜欢 (0)