Contact me: hankecnc@gmail.com

缩放是错误的,会导致不稳定的行为 #1311

推推 grbl 3年前 (2023-02-02) 219次浏览
关闭
onekk 打开了这个问题 2019 年 11 月 28 日 · 11 条评论
关闭

缩放是错误的,会导致不稳定的行为#1311

onekk 打开了这个问题 2019 年 11 月 28 日 · 11 条评论

注释

缩放是错误的,会导致不稳定的行为 #1311
贡献者
onekk 评论了 2019 年 11 月 28 日  

嗨,我注意到有时在CNCCanvas.py CNCCanvas()中使用fit2screen函数,它的行为不稳定,或者更好的是不遵守比例。

按“适合屏幕”按钮 6 或 7 次会出现问题。

由于 float approssimation 问题会破坏代码:

        if zx > 1.0:
            self.__tzoom = min(zx, zy)
        else:
            self.__tzoom = max(zx, zy)

zx 比例因子可能变为 0.99988,因此它被认为 < 0 并且以错误的方式使用了最大值(值 0.9998 为 1),由于浮点错误,简单的 >= 1.0 是不够的。

修改包含一些纠正因素的代码纠正错误的行为

	#New approach by onekk https://github.com/vlachoudis/bCNC/issues/1311
	def fit2Screen_onekk(self, event=None):
		"""Zoom to Fit to Screen"""

		bb = self.selBbox()
		if bb is None:
			return

		x1, y1, x2, y2 = bb

		# add a factor to improve reability
		bbox_width = (x2-x1) * 1.05
		bbox_height = (y2-y1) * 1.05

		try:
			zx = round(float(self.winfo_width() / bbox_width), 2)
		except:
			return

		try:
			zy = round(float(self.winfo_height() / bbox_height), 2)
		except:
			return

		print("BBCALC ", bbox_width, bbox_height)
		print("canvas ", self.winfo_width(), self.winfo_height())
		print("ZX, ZY ", zx, zy)

		if zx > 0.98:
			self.__tzoom = min(zx, zy)
		else:
			self.__tzoom = max(zx, zy)

		#####Added following from original code???:

		self._tx = self._ty = 0
		self._zoomCanvas()

		# Find position of new selection
		x1,y1,x2,y2 = self.selBbox()
		xm = (x1+x2)//2
		ym = (y1+y2)//2
		sx1,sy1,sx2,sy2 = map(float,self.cget("scrollregion").split())
		midx = float(xm-sx1) / (sx2-sx1)
		midy = float(ym-sy1) / (sy2-sy1)

		a,b = self.xview()
		d = (b-a)/2.0
		self.xview_moveto(midx-d)

		a,b = self.yview()
		d = (b-a)/2.0
		self.yview_moveto(midy-d)

		self.cameraPosition()

问候

卡罗·D。

缩放是错误的,会导致不稳定的行为 #1311 Harvie 将此添加到 0.9.15里程碑 2019 年 12 月 1 日
缩放是错误的,会导致不稳定的行为 #1311
合作者
哈维 评论了 2019 年 12 月 3 日  

我如何重现该问题?我多次点击 F 并没有发生任何不好的事情……
我也尝试了你发送的代码。我已将其重新格式化为使用选项卡作为 bCNC 的其余部分,并添加了代码的后半部分(编辑了您的帖子)。否则它根本不起作用。它似乎与原始代码非常相似。

缩放是错误的,会导致不稳定的行为 #1311
贡献者作者

问题是浮动“内部表示”,如果您多次点击 fit 2 屏幕并且比率接近 1.0,有时它可能变成 0.9999988,与 > 1.0 不匹配。

这是一种奇怪但预期的行为,正如在 bCNC 的其他问题中所见,它与臭名昭着的 IEEE 浮动表示有关,也许它还取决于 python 版本,因为内部数学做了一些小的改变,例如some 2.7 something 统一了内部整型和长整型。

别担心,我注意到在注意到奇怪的行为后打印缩放值时出现问题,如果您选择一些路径并进行缩放以适应该值接近 1.0 但由于近似错误在调整大小时会出现一些闪烁,(打印表述清楚)。

对于制表符和空格,由于 PEP8 空格是缩进 python 源代码的首选方式,而且 bCNC 源代码中“存在”许多其他错误,例如赋值和运算符周围的空格以及逗号后的空格(一些源文件引发 1400 PEP8 错误)。

问候

卡罗·D。

缩放是错误的,会导致不稳定的行为 #1311
合作者
哈维 评论了 2019 年 12 月 4 日  

我在 python2 中再次尝试,它做了一些低调的奇怪事情。如果我多次按 F,它会来回“振动”一个像素。它不会发生在 python3 中。(更新:也许我只是测试不够)

缩放是错误的,会导致不稳定的行为 #1311
合作者
哈维 评论了 2019 年 12 月 4 日  

现在我尝试了你的代码,它在 python2 和 python3 中也发生了。同样的问题……
我同意有问题……我不明白计算边界框每次都会产生不同的结果……