self.name = tk.StringVar()
self.nameEntered = ttk.Entry(topFrame, width=15, textvariable=self.name)

self.measureTypeStr = tk.StringVar()
measureType = ttk.Combobox(topFrame, width=15, textvariable=self.measureTypeStr, state='readonly', command=self.on_cmb_select)
# Adding combobox drop down list
measureType['values'] = ('圆弧',
'距离',
'角度')
measureType.current(1)
measureType.pack(side=tk.LEFT, padx=4)
cmbMeasureType.bind("<<ComboboxSelected>>", self.on_cmb_select)

def on_cmb_select(self,event):
if not self.name.get():
self.nameEntered.delete(0,tk.END)
self.nameEntered.insert(0, self.measureTypeStr.get())
pass

sqlite api

sqlite

self.conn = sqlite3.connect('conf.db')
self.cursor = self.conn.cursor()
sql = """
create table if not exists t_measurements(f_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
f_solutionId INTEGER NOT NULL,
f_name CHAR(300) NOT NULL , f_measureType CHAR(100) NOT NULL , f_points CHAR(500) NOT NULL );
"""
self.cursor.execute(sql)
sql = """
create table if not exists t_solution(f_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
f_name CHAR(300) NOT NULL , f_createDT CHAR(100) NOT NULL );
"""
self.cursor.execute(sql)
self.conn.commit()
阅读全文 »

treectrl

https://sourceforge.net/projects/tktreectrl/files/tktreectrl/tktreectrl-2.4.1/
有两个项目
把整个目录拷贝过去就可以了

TkTreectrl (考到 Lib)
treectrl2.4.1 (考到 tcl)

http://tkintertreectrl.sourceforge.net/

https://sourceforge.net/projects/tkintertreectrl/files/TkinterTreectrl-2.0/
https://sourceforge.net/projects/tktreectrl/files/tktreectrl/tktreectrl-2.4.1/

通常是虚拟环境的 env/xxx/Lib\site-packages 目录 还有个 env/xxx/tcl 目录,要使用修复后的版本

Put it in tcl folder (e.g your conda directory where you get this error –C:\Users<username>\AppData\Local\Continuum\miniconda3\tcl)

You will get rid of two types of of error:

Can’t find package error
Invalid argument Error

阅读全文 »

绘图

def onSpanSelect(self, x0, x1):
"""
记住当前 span 的数值,当新的 span 绘制完毕后,
根据记录信息,主动绘制之前的 span
:param x0:
:param x1:
:return:
"""
print("onSpanSelect enter... x0={},x1={}".format(x0, x1))
self.x1 = x0
self.x2 = x1
ylim = plt.gca().get_ylim()
self.y2 = ylim[1]
self.y1 = ylim[0]

def draw(self):
df = load_data_txt('4444_height.csv')
# 设置坐标轴范围
plt.xlim((13000, 35000)) # 也可写成plt.xlim(-5, 5)
plt.ylim((-2000, 4500)) # 也可写成plt.ylim(-2, 2)

self.fig = plt.figure(num=1)
self.ax = self.fig.add_subplot(111)
# self.ax.autoscale(enable=True , tight=False)

self.ax.plot(df['width'], df['height'], marker='o', mec='b', mfc='w')
self.ax.set_aspect(1)
self.ax.grid(True, linestyle='-.')

# ax.legend(p1, 'orig')

self.canvas = FigureCanvasTkAgg(self.fig, self)

toolbar = NavigationToolbar2Tk(self.canvas, self)
toolbar.update()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.X, expand=True)

self.canvas.draw()
self.canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

##关联鼠标点击事件
# self.fig.canvas.mpl_connect('button_press_event', self.on_ml_click)
# self.fig.canvas.mpl_connect('button_release_event', self.on_mouse_release)
# self.fig.canvas.mpl_connect('motion_notify_event', self.on_mouse_motion)

self.on_draw_points()

self.span = SpanSelector(self.ax, self.onSpanSelect, 'horizontal', useblit=True)
self.canvas.mpl_connect('key_press_event', self.span)

self.fig.canvas.draw()

中文内容

# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 显示负号
plt.rcParams['axes.unicode_minus'] = False
# 有中文使用 u'中文内容'
# 隐藏工具栏
plt.rcParams['toolbar'] = 'None'

20200914_200043.png

按摩工具:

  1. 手指:指甲不宜過長,以免戳傷。

  2. 棒子類:如原子筆鈍或尖端、各種筆類、筷子、叉子等,接觸面要圓滑,尖端大小要剛好。

阅读全文 »

# 已知三点坐标,求外接圆圆心坐标与半径。

x=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)))
y=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)))
r=(x1-x)*(x1-x+(y1-y)*(y1-y)

最小二乘法拟合圆

Least_Squares_Circle

def fit_circle(df):
# Coordinates of the 2D points
# x = r_[ 20.9564, 20.9593,20.9629]
# y = r_[ 30.1163, 30.0848,30.0259]

# x = r_[9, 35, -13, 10, 23, 0]
# y = r_[34, 10, 6, -14, 27, -10]

x = df['inner']
y = df['height']
df_list, name_list = load_data('凸轮轴信号轮,球形测头_10次5101(1)')

# coordinates of the barycenter
x_m = mean(x)
y_m = mean(y)

method_2 = "leastsq"

def calc_R(c):
""" calculate the distance of each 2D points from the center c=(xc, yc) """
return sqrt((x - c[0]) ** 2 + (y - c[1]) ** 2)

def calc_ecart(c):
""" calculate the algebraic distance between the 2D points and the mean circle centered at c=(xc, yc) """
Ri = calc_R(c)
return Ri - Ri.mean()

center_estimate = x_m, y_m
center_2, ier = optimize.leastsq(calc_ecart, center_estimate)

xc_2, yc_2 = center_2
Ri_2 = calc_R(center_2)
R_2 = Ri_2.mean()
residu_2 = sum((Ri_2 - R_2) ** 2)

print('x={},y={},r={}'.format(xc_2,yc_2,R_2))

from matplotlib import pyplot as p, cm

f = p.figure()
p.plot(x, y, 'ro', label='data', ms=9, mec='b', mew=1)

theta_fit = linspace(-pi, pi, 180)

x_fit2 = xc_2 + R_2 * cos(theta_fit)
y_fit2 = yc_2 + R_2 * sin(theta_fit)
p.plot(x_fit2, y_fit2, 'k--', label=method_2, lw=2)

p.plot([xc_2], [yc_2], 'gD', mec='r', mew=1)

p.grid()
p.title('Leasts Squares Circle')
p.show()

# 处理 校零 't1+t2+5'
pattern = re.compile(r't\d+') # 查找数字
idx_list = pattern.findall(it)
idx_list = [x[1:] for x in idx_list]

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Dispatcher.InvokeAsync(new Action(() => { taskInitProc(sender, e); }));
}

private void taskInitProc(object sender, RoutedEventArgs e)
{
}

查看 tftp server

netstat  -an|grep 69

# in either case you should see something like:
# udp 0 0 0.0.0.0:69 ...
# If there is a current TFTP server running on your system.
阅读全文 »

直线相对于X坐标轴的倾斜程度

计算公式:

20200818_163851.png
阅读全文 »