Суть в том что есть программа для коммуникации с микроскопом, который электронным пучком точечно выжигает квадратную матрицу. Нужно чтобы данная программа выжигала пяти или шестиугольную матрицу. Квадрат задается как высота и ширина + кол-во точек. И как задать чтоб кол-во точек в каждой линии можно было задать.
import sem
def main():
# parameters of exposition
view_field = 0.1 # view field [mm]
pxl_matrix_w = 28 # ширина квадрата в точках
n_fields_x = 3 # количество линий (ширина)
n_fields_y = 3 # количество линий (высота)
field_spacing = 0.11 # расстояние между полями [mm]
# pixel dwell time для единичной линии [ms], количество = n_fields_x * n_fields_y
dwell_list = [ 0.50, 1.0, 5.0, 10.0, 15.0, 30.0, 50.0, 500.0, 5000.0 ]
# подключение к микроскопу SEM
m = sem.Sem()
res = m.Connect('localhost', 8300)
if res < 0:
print("Error: unable to connect")
return
# important: stop the scanning before we start scanning or before automatic procedures
m.ScStopScan()
# view field = 100 um
m.SetViewField(view_field)
# vypnout akvizici obrazu behem skenovani (SEM ma 4 kanaly, vypnout vsechny)
m.DtEnable(0, 0, 8)
m.DtEnable(1, 0, 8)
m.DtEnable(2, 0, 8)
m.DtEnable(3, 0, 8)
# elmag blanker je treba vypnout
elbl = m.ScGetBlanker(1)
m.ScSetBlanker(1, 0)
# elstat blanker - on acquisition
m.ScSetBlanker(0, 2)
# каждую команду будет ждать до конца сканирования и перемещения манипулятора m.SetWaitFlags(0x03)
# оригинальная позиция манипулятора
stg_orig_pos = m.StgGetPosition()
# pole
for fldyy in range (0, n_fields_y):
for fldxx in range (0, n_fields_x):
# dwell time
pxl_dwell = dwell_list[fldyy * n_fields_x + fldxx]
# rozdelit na skutecny dwell time [ns] a pixel count
if pxl_dwell < 100.0:
dwell = int(pxl_dwell * 100000)
pxlcount = 10
else:
dwell = int(pxl_dwell * 10)
pxlcount = 100000
# manipulator
m.StgMoveTo(stg_orig_pos[0] - fldxx * field_spacing, stg_orig_pos[1] + fldyy * field_spacing)
# expozice
for yy in range (0, pxl_matrix_w + 1):
for xx in range (0, pxl_matrix_w + 1):
virtfld = 1000
xpos = virtfld * xx / pxl_matrix_w
ypos = virtfld * yy / pxl_matrix_w
# viz dokumentace
m.ScScanLine(0, virtfld, virtfld, xpos, ypos, xpos, ypos, dwell, pxlcount, 1)
# stop the scanning
m.ScStopScan()
# progress
print("field (%d %d) pixel: (%d %d)" % (fldxx, fldyy, xx, yy))
# manipulator back
m.StgMoveTo(stg_orig_pos[0], stg_orig_pos[1])
# elmag blanker to begin
m.ScSetBlanker(1, elbl)
# wait for all process
m.GetWD()
# finish
m.Disconnect()
if __name__ == '__main__':
main()