comparison horori/mover/src/mover.cpp @ 0:aaaa401818a1 draft

first commit.
author pyon <pyon@macmini>
date Mon, 24 May 2021 21:32:58 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:aaaa401818a1
1 // Filename : mover.cpp
2 // Last Change: 2020-05-14 木 17:14:42.
3 //
4 #include <wx/dir.h>
5 #include <wx/textfile.h>
6 #include <wx/splash.h>
7 #include <wx/msgdlg.h>
8 #include <wx/fileconf.h>
9
10 #include "mover.h"
11 #include "../../searcher/include/net.h"
12
13 MoveFrame::MoveFrame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style)
14 : wxFrame(parent, id, title, pos, size, style)
15 {
16 CreateControls();
17 InitializeControlsValue();
18 LoadDB();
19
20 this->Connect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnKey));
21 m_buttonAuto->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnAuto), NULL, this);
22 m_dataViewListCtrl->Connect(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(MoveFrame::OnSelect), NULL, this);
23 m_dataViewListCtrl->Connect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnListChar), NULL, this);
24 m_textCtrlName->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnName), NULL, this);
25 m_textCtrlHno->Connect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnHnoChar), NULL, this);
26 m_textCtrlHno->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnHno), NULL, this);
27 m_checkBox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(MoveFrame::OnCheck), NULL, this);
28 m_listViewThumb->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler(MoveFrame::OnThumbDeselected), NULL, this);
29 m_listViewThumb->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(MoveFrame::OnThumbSelected), NULL, this);
30 m_listViewThumb->Connect(wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(MoveFrame::OnThumbDClick), NULL, this);
31 m_buttonSave->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnSave), NULL, this);
32 }
33
34 MoveFrame::~MoveFrame()
35 {
36 this->Disconnect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnKey));
37 m_buttonAuto->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnAuto), NULL, this);
38 m_dataViewListCtrl->Disconnect(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(MoveFrame::OnSelect), NULL, this);
39 m_dataViewListCtrl->Disconnect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnListChar), NULL, this);
40 m_textCtrlName->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnName), NULL, this);
41 m_textCtrlHno->Disconnect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnHnoChar), NULL, this);
42 m_textCtrlHno->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnHno), NULL, this);
43 m_checkBox->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(MoveFrame::OnCheck), NULL, this);
44 m_listViewThumb->Disconnect(wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler(MoveFrame::OnThumbDeselected), NULL, this);
45 m_listViewThumb->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(MoveFrame::OnThumbSelected), NULL, this);
46 m_listViewThumb->Disconnect(wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(MoveFrame::OnThumbDClick), NULL, this);
47 m_buttonSave->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnSave), NULL, this);
48 }
49
50 /* Functions */
51 void MoveFrame::CreateControls()
52 {
53 this->SetIcon(wxIcon(wxT("sample")));
54 this->SetSizeHints(wxDefaultSize, wxDefaultSize);
55 this->SetBackgroundColour(wxColour(210, 210, 255));
56
57 wxGridBagSizer* gbSizer = new wxGridBagSizer(0, 0);
58 gbSizer->SetFlexibleDirection(wxBOTH);
59 gbSizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
60
61 m_dirPicker = new wxDirPickerCtrl(this, wxID_ANY, wxEmptyString, wxT("Select a folder"), wxDefaultPosition, wxSize(320, -1), wxDIRP_DIR_MUST_EXIST|wxDIRP_SMALL|wxDIRP_USE_TEXTCTRL);
62 gbSizer->Add(m_dirPicker, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 5);
63
64 m_buttonAuto = new wxButton(this, wxID_ANY, wxT("一括判定"), wxDefaultPosition, wxDefaultSize, 0);
65 m_buttonAuto->SetDefault();
66 gbSizer->Add(m_buttonAuto, wxGBPosition(0, 1), wxGBSpan(1, 1), wxALL, 5);
67
68 m_spinCtrlUD = new wxSpinCtrl(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(50, -1), wxSP_ARROW_KEYS, -50, 50, 0);
69 gbSizer->Add(m_spinCtrlUD, wxGBPosition(0, 2), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5);
70
71 m_spinCtrlLR = new wxSpinCtrl(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(50, -1), wxSP_ARROW_KEYS, -50, 50, 0);
72 gbSizer->Add(m_spinCtrlLR, wxGBPosition(0, 3), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
73
74 m_checkBox = new wxCheckBox(this, wxID_ANY, wxT("申請書モード"), wxDefaultPosition, wxDefaultSize, 0);
75 gbSizer->Add(m_checkBox, wxGBPosition(0, 5), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
76
77 m_dataViewListCtrl = new wxDataViewListCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(320, 1200), wxDV_SINGLE|wxDV_ROW_LINES);
78 m_dataViewListColumnNo = m_dataViewListCtrl->AppendTextColumn(wxT("No"), wxDATAVIEW_CELL_INERT, 30, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
79 m_dataViewListColumnHno = m_dataViewListCtrl->AppendTextColumn(wxT("被保険者番号"), wxDATAVIEW_CELL_INERT, 100, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
80 m_dataViewListColumnName = m_dataViewListCtrl->AppendTextColumn(wxT(" 氏名"), wxDATAVIEW_CELL_INERT, 150, static_cast<wxAlignment>(wxALIGN_LEFT), 0);
81 //m_dataViewListColumnChecked = m_dataViewListCtrl->AppendToggleColumn(wxT("確認"), wxDATAVIEW_CELL_EDITABLE, -1, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
82 m_dataViewListCtrl->SetAlternateRowColour(wxColour(230, 230, 255)) ;
83 gbSizer->Add(m_dataViewListCtrl, wxGBPosition(1, 0), wxGBSpan(7, 1), wxALL|wxEXPAND, 5);
84
85 m_bitmapName = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(HNAME_WW, HNAME_WH), 0);
86 gbSizer->Add(m_bitmapName, wxGBPosition(1, 1), wxGBSpan(1, 4), wxALL, 5);
87
88 wxFont font(24, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD);
89 m_textCtrlName = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(580, -1), wxTE_PROCESS_ENTER);
90 m_textCtrlName->SetFont(font);
91 gbSizer->Add(m_textCtrlName, wxGBPosition(1, 5), wxGBSpan(1, 4), wxALL|wxALIGN_BOTTOM, 5);
92
93 m_bitmapHno = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(HNO_WW, HNO_WH), 0);
94 gbSizer->Add(m_bitmapHno, wxGBPosition(2, 1), wxGBSpan(1, 4), wxALL, 5);
95
96 m_textCtrlHno = new wxTextCtrl(this, wxID_ANY, wxT("0123456789"), wxDefaultPosition, wxSize(200, -1), wxTE_PROCESS_ENTER);
97 m_textCtrlHno->SetMaxLength(10);
98 m_textCtrlHno->SetFont(font);
99 gbSizer->Add(m_textCtrlHno, wxGBPosition(2, 5), wxGBSpan(1, 1), wxALL|wxALIGN_BOTTOM, 5);
100
101 m_staticTextHnoMsg = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
102 m_staticTextHnoMsg->SetForegroundColour(wxColour(255, 0, 0));
103 m_staticTextHnoMsg->SetFont(font);
104 gbSizer->Add(m_staticTextHnoMsg, wxGBPosition(2, 6), wxGBSpan(1, 1), wxALL|wxALIGN_BOTTOM, 5);
105
106 m_bitmapTk = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(RIGHT_W, RIGHT_H1), 0);
107 gbSizer->Add(m_bitmapTk, wxGBPosition(3, 1), wxGBSpan(1, 6), wxALL, 5);
108
109 m_bitmapIk = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(RIGHT_W, RIGHT_H2), 0);
110 gbSizer->Add(m_bitmapIk, wxGBPosition(4, 1), wxGBSpan(1, 6), wxALL, 5);
111
112 m_listViewThumb = new wxListView(this, wxID_ANY, wxDefaultPosition, wxSize(RIGHT_W, THUMB_H * 2.5), wxLC_ICON);
113 m_listViewThumb->SetBackgroundColour(wxColour(230, 230, 255));
114 gbSizer->Add(m_listViewThumb, wxGBPosition(5, 1), wxGBSpan(1, 6), wxALL, 5);
115
116 m_staticTextDate = new wxStaticText(this, wxID_ANY, wxT("開催日"), wxDefaultPosition, wxDefaultSize, 0);
117 gbSizer->Add(m_staticTextDate, wxGBPosition(6, 1), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5);
118
119 m_datePicker = new wxDatePickerCtrl(this, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT|wxDP_DROPDOWN|wxDP_SHOWCENTURY);
120 gbSizer->Add(m_datePicker, wxGBPosition(6, 2), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
121
122 m_staticTextCcn = new wxStaticText(this, wxID_ANY, wxT("合議体"), wxDefaultPosition, wxDefaultSize, 0);
123 gbSizer->Add(m_staticTextCcn, wxGBPosition(6, 3), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5);
124
125 wxArrayString m_choiceCcnChoices;
126 m_choiceCcn = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceCcnChoices, 0);
127 gbSizer->Add(m_choiceCcn, wxGBPosition(6, 4), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
128
129 m_buttonSave = new wxButton(this, wxID_ANY, wxT("保存"), wxDefaultPosition, wxDefaultSize, 0);
130 gbSizer->Add(m_buttonSave, wxGBPosition(6, 5), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
131
132 m_textCtrlMsg = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(200, -1), wxTE_READONLY|wxTE_RIGHT);
133 m_textCtrlMsg->SetBackgroundColour(wxColour(230, 230, 255));
134 gbSizer->Add(m_textCtrlMsg, wxGBPosition(6, 6), wxGBSpan(1, 1), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
135
136 this->SetSizer(gbSizer);
137 this->Layout();
138
139 this->Centre(wxBOTH);
140
141 m_buttonAuto->SetFocus();
142 }
143
144 void MoveFrame::InitializeControlsValue()
145 {
146 wxString conf_file = wxGetCwd() + wxFILE_SEP_PATH + wxT("mover.conf");
147 wxFileConfig* conf = new wxFileConfig(wxT("MyApp"), wxT("T.Mutoh"), conf_file, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
148
149 wxString work;
150 conf->SetPath(wxT("/Dirs"));
151 conf->Read(wxT("work"), &work);
152
153 conf->SetPath(wxT("/Server"));
154 conf->Read(wxT("addr"), &m_addr);
155 conf->Read(wxT("port"), &m_port);
156
157 delete conf;
158
159 m_dirPicker->SetPath(work);
160
161 wxDateTime today = wxDateTime::Today();
162 wxDateTime sun = today.SetToNextWeekDay(wxDateTime::WeekDay::Sun);
163 wxDateTime thu = sun.SetToNextWeekDay(wxDateTime::WeekDay::Thu);
164 m_datePicker->SetValue(thu);
165
166 LoadDefaultImages();
167 }
168
169 void MoveFrame::LoadDefaultImages()
170 {
171 wxBitmap bmp;
172
173 bmp.LoadFile(wxT("image/mover.png"), wxBITMAP_TYPE_PNG);
174 m_bitmapName->SetBitmap(bmp);
175
176 bmp.LoadFile(wxT("image/0123456789.png"), wxBITMAP_TYPE_PNG);
177 m_bitmapHno->SetBitmap(bmp);
178
179 bmp.LoadFile(wxT("image/testpattern.png"), wxBITMAP_TYPE_PNG);
180 m_bitmapTk->SetBitmap(bmp);
181
182 bmp.LoadFile(wxT("image/testpattern2.png"), wxBITMAP_TYPE_PNG);
183 m_bitmapIk->SetBitmap(bmp);
184 }
185
186 void MoveFrame::LoadDB()
187 {
188 wxString conf_file = wxGetCwd() + wxFILE_SEP_PATH + wxT("mover.conf");
189 wxFileConfig* conf = new wxFileConfig(wxT("MyApp"), wxT("T.Mutoh"), conf_file, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
190
191 wxString buf;
192 conf->SetPath(wxT("/Ccn"));
193 conf->Read(wxT("ccn"), &buf);
194 wxArrayString ccn = wxSplit(buf, ':');
195 for (int i = 0; i < ccn.GetCount(); i++) {
196 m_choiceCcn->Append(ccn[i]);
197 }
198 conf->Read(wxT("sss"), &buf);
199 m_sss = wxSplit(buf, ':');
200
201 delete conf;
202
203 wxString hhsdb = wxT("hhsdb.csv");
204 wxString url = wxT("/ha/");
205 if (!HttpGetFile(m_addr, m_port, url, hhsdb)) return;
206
207 wxTextFile hhsfile;
208 hhsfile.Open(hhsdb);
209 for (int i = 0; i < hhsfile.GetLineCount(); i++) {
210 wxArrayString buf = wxSplit(hhsfile.GetLine(i), ',', '\\');
211 m_hhash[buf[0]] = wxString::Format(wxT("%s (%s)"), buf[2], buf[3]);
212 if (m_maxhno.Cmp(buf[0]) < 0) m_maxhno = buf[0];
213 }
214 hhsfile.Close();
215 }
216
217 void MoveFrame::AutoDetect()
218 {
219 m_dataViewListCtrl->DeleteAllItems();
220 wxDir dir(m_dirPicker->GetPath());
221 if (!dir.IsOpened()) return;
222
223 wxString dirname, fn;
224 bool cont = dir.GetFirst(&dirname, wxEmptyString, wxDIR_DIRS);
225
226 wxVector<wxVariant> data;
227 while (cont) {
228 data.push_back(wxVariant(dirname));
229
230 wxDir subdir(m_dirPicker->GetPath() + wxFILE_SEP_PATH + dirname);
231 if (!subdir.IsOpened()) return;
232
233 subdir.GetFirst(&fn, wxT("*.tif"), wxDIR_FILES);
234 fn = m_dirPicker->GetPath() + wxFILE_SEP_PATH + dirname + wxFILE_SEP_PATH + fn;
235 wxString hno = AnalizeHhsno(fn, m_spinCtrlLR->GetValue() * 5, m_spinCtrlUD->GetValue() * 5);
236
237 data.push_back(wxVariant(hno));
238 data.push_back(wxVariant(m_hhash[hno]));
239 //data.push_back(wxVariant(false));
240
241 m_dataViewListCtrl->AppendItem(data);
242
243 data.clear();
244
245 cont = dir.GetNext(&dirname);
246 }
247 wxMessageBox(wxT("自動認識終了"));
248 }
249
250 void MoveFrame::SelectItem(int r)
251 {
252 m_dataViewListCtrl->SelectRow(r);
253
254 m_offx = 0;
255 m_offy = 0;
256 m_listViewThumb->DeleteAllItems();
257
258 wxString dirno = m_dataViewListCtrl->GetTextValue(r, 0);
259 wxString hno = m_dataViewListCtrl->GetTextValue(r, 1);
260 wxString hname = m_dataViewListCtrl->GetTextValue(r, 2);
261
262 wxString img_path = m_dirPicker->GetPath() + wxFILE_SEP_PATH + dirno;
263 wxDir dir(img_path);
264 if (!dir.IsOpened()) return;
265
266 wxString fn;
267 bool cont = dir.GetFirst(&fn, wxT("*.tif"), wxDIR_FILES);
268
269 m_curms = img_path + wxFILE_SEP_PATH + fn;
270 wxImage image(m_curms, wxBITMAP_TYPE_TIFF);
271 wxImage img_buf;
272 wxBitmap bmp_buf;
273
274 img_buf = image.GetSubImage(wxRect(HNAME_X, HNAME_Y, HNAME_W, HNAME_H));
275 bmp_buf = img_buf.Scale(HNAME_WW, HNAME_WH, wxIMAGE_QUALITY_HIGH);
276 m_bitmapName->SetBitmap(bmp_buf);
277
278 img_buf = image.GetSubImage(wxRect(HNO_X, HNO_Y, HNO_W, HNO_H));
279 bmp_buf = img_buf.Scale(HNO_WW, HNO_WH, wxIMAGE_QUALITY_HIGH);
280 m_bitmapHno->SetBitmap(bmp_buf);
281
282 m_textCtrlName->SetValue(hname);
283 m_textCtrlHno->SetValue(hno);
284 m_staticTextHnoMsg->SetLabel(wxEmptyString);
285 if (hno.Cmp(m_maxhno) > 0) m_staticTextHnoMsg->SetLabel(wxString::Format(wxT("> %s !"), m_maxhno));
286
287 wxImageList* imglist = new wxImageList(THUMB_W, THUMB_H);
288 m_listViewThumb->SetImageList(imglist, wxIMAGE_LIST_NORMAL);
289 for (int i = 0; cont; i++) {
290 wxString buf = img_path + wxFILE_SEP_PATH + fn;
291 wxImage img(buf, wxBITMAP_TYPE_TIFF);
292 bmp_buf = img.Scale(THUMB_W, THUMB_H, wxIMAGE_QUALITY_HIGH);
293 imglist->Add(bmp_buf);
294 m_listViewThumb->InsertItem(i, fn, i);
295
296 if (i == 2) {
297 wxImage im = img.GetSubImage(wxRect(0, 0, img.GetWidth() - 1, 300)); // 2480x300
298 bmp_buf = im.Scale(RIGHT_W, RIGHT_H1, wxIMAGE_QUALITY_HIGH);
299 m_bitmapTk->SetBitmap(bmp_buf);
300 }
301 if (i == 3) {
302 wxImage im = img.GetSubImage(wxRect(0, 20, img.GetWidth() - 1, 700)); // 2480x500
303 bmp_buf = im.Scale(RIGHT_W, RIGHT_H2, wxIMAGE_QUALITY_HIGH);
304 m_bitmapIk->SetBitmap(bmp_buf);
305 }
306 cont = dir.GetNext(&fn);
307 }
308 }
309
310 void MoveFrame::ThumbnailPaper()
311 {
312 wxString path = m_dirPicker->GetPath();
313 wxDir dir(path);
314 if (!dir.IsOpened()) return;
315
316 wxString file;
317 bool cont = dir.GetFirst(&file, wxT("*.tif"), wxDIR_FILES);
318
319 wxImageList* imglist = new wxImageList(THUMB_W / 2, THUMB_H / 2);
320 m_listViewThumb->SetImageList(imglist, wxIMAGE_LIST_NORMAL);
321 wxBitmap bmp;
322 int n = 0;
323 for (int i = 0; cont; i++) {
324 wxImage img(path + wxFILE_SEP_PATH + file, wxBITMAP_TYPE_TIFF);
325 bmp = img.Scale(THUMB_W / 2, THUMB_H / 2, wxIMAGE_QUALITY_HIGH);
326 imglist->Add(bmp);
327 m_listViewThumb->InsertItem(i, file, i);
328 n++;
329 cont = dir.GetNext(&file);
330 }
331
332 int m = m_listViewThumb->GetSelectedItemCount();
333 m_textCtrlMsg->SetValue(wxString::Format(wxT("%d / %d"), m, n));
334 wxMessageBox(wxString::Format(wxT("%d files found."), n));
335 }
336
337 wxString MoveFrame::AnalizeHhsno(wxString file, int offx, int offy)
338 {
339 wxImage image(file, wxBITMAP_TYPE_TIFF);
340 int sx = MS_X + offx; // start x
341 int sy = MS_Y + offy;
342 int bw = MS_W / 10; // block width
343 int bh = MS_H / 10;
344 int area = bw * bh;
345 int black = 0;
346 int th = 38;
347 int x, y;
348 unsigned char r, g, b;
349
350 int max_n;
351 float max, bk;
352
353 wxString hno;
354 for (int c = 0; c < 10; c++) {
355 max = 0.0;
356 max_n = -1;
357
358 for(int n = 0; n < 10; n++) {
359 for (x = sx + bw * c; x < sx + bw * (c + 1); x++) {
360 for (y = sy + bh * n; y < sy + bh * (n + 1); y++) {
361 r = image.GetRed(x, y);
362 g = image.GetGreen(x, y);
363 b = image.GetBlue(x, y);
364 if ((int)r < th && (int)g < th && (int)b < th) black++;
365 }
366 }
367
368 bk = (float)black / area;
369 if (max < bk) {
370 max = bk;
371 max_n = n;
372 }
373 black = 0;
374 }
375 hno.Append(wxString::Format(wxT("%d"), max_n));
376 }
377
378 return hno;
379 }
380
381 void MoveFrame::MoveLookWin(int x, int y)
382 {
383 m_offx += x * 5;
384 m_offy += y * 5;
385
386 wxImage image(m_curms, wxBITMAP_TYPE_TIFF);
387 wxImage img_buf;
388 wxBitmap bmp_buf;
389
390 img_buf = image.GetSubImage(wxRect(HNAME_X + m_offx, HNAME_Y + m_offy, HNAME_W, HNAME_H));
391 bmp_buf = img_buf.Scale(HNAME_WW, HNAME_WH, wxIMAGE_QUALITY_HIGH);
392 m_bitmapName->SetBitmap(bmp_buf);
393
394 img_buf = image.GetSubImage(wxRect(HNO_X + m_offx, HNO_Y + m_offy, HNO_W, HNO_H));
395 bmp_buf = img_buf.Scale(HNO_WW, HNO_WH, wxIMAGE_QUALITY_HIGH);
396 m_bitmapHno->SetBitmap(bmp_buf);
397
398 wxString hno = AnalizeHhsno(m_curms, m_offx, m_offy);
399 m_textCtrlName->SetValue(m_hhash[hno]);
400 m_textCtrlHno->SetValue(hno);
401
402 m_staticTextHnoMsg->SetLabel(wxEmptyString);
403 if (hno.Cmp(m_maxhno) > 0) m_staticTextHnoMsg->SetLabel(wxString::Format(wxT("> %s !"), m_maxhno));
404 }
405
406 /* Event Handlers */
407 void MoveFrame::OnKey(wxKeyEvent& event)
408 {
409 int mod = event.GetModifiers();
410 int key = event.GetKeyCode();
411
412 switch (key) {
413 case WXK_F5: {
414 wxMessageBox("aaa");
415 break;
416 }
417 }
418 }
419
420 void MoveFrame::OnAuto(wxCommandEvent& WXUNUSED(event))
421 {
422 if (m_checkBox->IsChecked()) {
423 ThumbnailPaper();
424 return;
425 }
426
427 m_offx = 0;
428 m_offy = 0;
429 AutoDetect();
430 SelectItem(0);
431 m_dataViewListCtrl->SetFocus();
432 }
433
434 void MoveFrame::OnSelect(wxDataViewEvent& WXUNUSED(event))
435 {
436 int r = m_dataViewListCtrl->GetSelectedRow();
437 SelectItem(r);
438 }
439
440 void MoveFrame::OnListChar(wxKeyEvent& event)
441 {
442 int mod = event.GetModifiers();
443 int key = event.GetKeyCode();
444
445 switch (key) {
446 case WXK_UP: {
447 if (mod == wxMOD_CONTROL) {
448 MoveLookWin(0, 1);
449 return;
450 }
451 break;
452 }
453 case WXK_DOWN: {
454 if (mod == wxMOD_CONTROL) {
455 MoveLookWin(0, -1);
456 return;
457 }
458 break;
459 }
460 case WXK_RIGHT: {
461 if (mod == wxMOD_CONTROL) {
462 MoveLookWin(-1, 0);
463 return;
464 }
465 break;
466 }
467 case WXK_LEFT: {
468 if (mod == wxMOD_CONTROL) {
469 MoveLookWin(1, 0);
470 return;
471 }
472 break;
473 }
474 case WXK_RETURN: {
475 int r = m_dataViewListCtrl->GetSelectedRow();
476 m_dataViewListCtrl->SetTextValue(m_textCtrlHno->GetValue(), r, 1);
477 m_dataViewListCtrl->SetTextValue(m_textCtrlName->GetValue(), r, 2);
478 //if (r != m_dataViewListCtrl->GetItemCount() - 1) SelectItem(r + 1);
479 return;
480 }
481 }
482 event.Skip();
483 }
484
485 void MoveFrame::OnName(wxCommandEvent& WXUNUSED(event))
486 {
487 int r = m_dataViewListCtrl->GetSelectedRow();
488 m_dataViewListCtrl->SetTextValue(m_textCtrlHno->GetValue(), r, 1);
489 m_dataViewListCtrl->SetTextValue(m_textCtrlName->GetValue(), r, 2);
490 //if (r != m_dataViewListCtrl->GetItemCount() - 1) SelectItem(r + 1);
491 m_dataViewListCtrl->SetFocus();
492 }
493
494 void MoveFrame::OnHnoChar(wxKeyEvent& event)
495 {
496 int mod = event.GetModifiers();
497 int key = event.GetKeyCode();
498
499 if (key == 45) { // num-key '-' as BackSpace
500 wxString t = m_textCtrlHno->GetStringSelection();
501 if (t.IsEmpty()) {
502 long p = m_textCtrlHno->GetInsertionPoint();
503 if (p > 0) m_textCtrlHno->Remove(p - 1, p);
504 } else {
505 m_textCtrlHno->Cut();
506 }
507 return;
508 }
509
510 switch (key) {
511 case WXK_UP: {
512 if (mod == wxMOD_CONTROL) {
513 MoveLookWin(0, 1);
514 return;
515 }
516 break;
517 }
518 case WXK_DOWN: {
519 if (mod == wxMOD_CONTROL) {
520 MoveLookWin(0, -1);
521 return;
522 }
523 break;
524 }
525 case WXK_RIGHT: {
526 if (mod == wxMOD_CONTROL) {
527 MoveLookWin(-1, 0);
528 return;
529 }
530 break;
531 }
532 case WXK_LEFT: {
533 if (mod == wxMOD_CONTROL) {
534 MoveLookWin(1, 0);
535 return;
536 }
537 break;
538 }
539 }
540 event.Skip();
541 }
542
543 void MoveFrame::OnHno(wxCommandEvent& WXUNUSED(event))
544 {
545 m_textCtrlHno->SelectAll();
546 if (m_textCtrlHno->GetLineLength(0) != 10) {
547 wxMessageBox(wxT("Bat input"));
548 return;
549 }
550
551 wxString hno = m_textCtrlHno->GetValue();
552 m_textCtrlName->SetValue(m_hhash[hno]);
553
554 int r = m_dataViewListCtrl->GetSelectedRow();
555 if (r == wxNOT_FOUND) {
556 return;
557 }
558 m_dataViewListCtrl->SetTextValue(hno, r, 1);
559 m_dataViewListCtrl->SetTextValue(m_hhash[hno], r, 2);
560
561 //if (r != m_dataViewListCtrl->GetItemCount() - 1) SelectItem(r + 1);
562 m_dataViewListCtrl->SetFocus();
563 }
564
565 void MoveFrame::OnCheck(wxCommandEvent& WXUNUSED(event))
566 {
567 if (m_checkBox->IsChecked()) {
568 m_buttonAuto->SetLabel(wxT("表示"));
569 } else {
570 m_buttonAuto->SetLabel(wxT("一括判定"));
571 }
572
573 m_dataViewListCtrl->DeleteAllItems();
574 m_textCtrlName->SetValue(wxEmptyString);
575 m_textCtrlHno->SetValue(wxT("0123456789"));
576 m_listViewThumb->DeleteAllItems();
577 LoadDefaultImages();
578 }
579
580 void MoveFrame::OnThumbDeselected(wxListEvent& WXUNUSED(event))
581 {
582 int m = m_listViewThumb->GetItemCount();
583 int n = m_listViewThumb->GetSelectedItemCount();
584 m_textCtrlMsg->SetValue(wxString::Format(wxT("%d / %d"), n, m));
585 }
586
587 void MoveFrame::OnThumbSelected(wxListEvent& WXUNUSED(event))
588 {
589 int m = m_listViewThumb->GetItemCount();
590 int n = m_listViewThumb->GetSelectedItemCount();
591 m_textCtrlMsg->SetValue(wxString::Format(wxT("%d / %d"), n, m));
592 }
593
594 void MoveFrame::OnThumbDClick(wxListEvent& WXUNUSED(event))
595 {
596 wxString file = m_dirPicker->GetPath() + wxFILE_SEP_PATH;
597
598 if (!m_checkBox->IsChecked()) {
599 int r = m_dataViewListCtrl->GetSelectedRow();
600 file += m_dataViewListCtrl->GetTextValue(r, 0) + wxFILE_SEP_PATH;
601 }
602
603 for (int i = 0; i < m_listViewThumb->GetItemCount(); i++) {
604 if (m_listViewThumb->IsSelected(i))
605 file += m_listViewThumb->GetItemText(i, 0);
606 }
607
608 wxImage img(file, wxBITMAP_TYPE_TIFF);
609 wxBitmap bmp = img.Scale(THUMB_W * 6, THUMB_H * 6, wxIMAGE_QUALITY_HIGH);
610 wxSplashScreen* splash = new wxSplashScreen(bmp, wxSPLASH_CENTRE_ON_SCREEN|wxSPLASH_TIMEOUT, 10000, NULL, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_RAISED|wxSTAY_ON_TOP);
611 wxYield();
612 }
613
614 void MoveFrame::OnSave(wxCommandEvent& WXUNUSED(event))
615 {
616 if (m_choiceCcn->GetCurrentSelection() == wxNOT_FOUND) {
617 wxMessageBox(wxT("Bad choice."));
618 return;
619 }
620
621 wxDateTime dt = m_datePicker->GetValue();
622 wxString ymd = dt.Format(wxT("%Y%m%d"));
623 wxString year = dt.Format(wxT("%Y"));
624
625 wxDateTime::Month month = dt.GetMonth();
626 if (month == wxDateTime::Jan || month == wxDateTime::Feb || month == wxDateTime::Mar) {
627 year = wxString::Format(wxT("%d"), dt.GetYear() - 1);
628 }
629
630 wxString ymddir = wxFILE_SEP_PATH + year + wxFILE_SEP_PATH + ymd;
631 if (!wxDirExists(ymddir)) wxFileName::Mkdir(ymddir, wxS_DIR_DEFAULT, 0);
632
633 int n = m_choiceCcn->GetCurrentSelection();
634 wxString ccndir = ymddir + wxFILE_SEP_PATH + m_choiceCcn->GetString(n);
635 if (!wxDirExists(ccndir)) wxFileName::Mkdir(ccndir, wxS_DIR_DEFAULT, 0);
636 wxString sssdir = ymddir + wxFILE_SEP_PATH + m_choiceCcn->GetString(n) + wxFILE_SEP_PATH + m_sss[n];
637 if (!wxDirExists(sssdir)) wxFileName::Mkdir(sssdir, wxS_DIR_DEFAULT, 0);
638
639 if (m_checkBox->IsChecked()) {
640 wxString srcdir = m_dirPicker->GetPath();
641 wxString dstdir = sssdir;
642
643 wxDir dir(srcdir);
644 if (!dir.IsOpened()) return;
645
646 if (m_listViewThumb->GetSelectedItemCount() == 0) {
647 wxMessageBox(wxT("no item selected."));
648 return;
649 }
650
651 for (int i = 0; i < m_listViewThumb->GetItemCount(); i++) {
652 if (m_listViewThumb->IsSelected(i)) {
653 wxString file = m_listViewThumb->GetItemText(i, 0);
654 wxString src = srcdir + wxFILE_SEP_PATH + file;
655 wxString dst = dstdir + wxFILE_SEP_PATH + file;
656 wxCopyFile(src, dst, true);
657 }
658 }
659
660 } else {
661 for (int r = 0; r < m_dataViewListCtrl->GetItemCount(); r++) {
662 wxString srcdir = m_dirPicker->GetPath() + wxFILE_SEP_PATH + m_dataViewListCtrl->GetTextValue(r, 0);
663 wxString dstdir = ccndir + wxFILE_SEP_PATH + m_dataViewListCtrl->GetTextValue(r, 1);
664
665 wxDir dir(srcdir);
666 if (!dir.IsOpened()) return;
667 if (!wxDirExists(dstdir)) wxFileName::Mkdir(dstdir, wxS_DIR_DEFAULT, 0);
668
669 wxString file;
670 bool cont = dir.GetFirst(&file, wxT("*.tif"), wxDIR_FILES);
671 while (cont) {
672 wxString src = srcdir + wxFILE_SEP_PATH + file;
673 wxString dst = dstdir + wxFILE_SEP_PATH + file;
674 wxCopyFile(src, dst, true);
675 cont = dir.GetNext(&file);
676 }
677 }
678
679 wxString listfn = ymd + wxT("_") + m_choiceCcn->GetString(n) + wxT(".csv");
680 if (wxFileExists(listfn)) wxRemoveFile(listfn);
681
682 wxTextFile listfile;
683 listfile.Create(listfn);
684 for(int r = 0; r < m_dataViewListCtrl->GetItemCount(); r++) {
685 wxString s = m_dataViewListCtrl->GetTextValue(r, 0);
686 s += wxT(",") + m_dataViewListCtrl->GetTextValue(r, 1);
687 s += wxT(",") + m_dataViewListCtrl->GetTextValue(r, 2);
688 listfile.AddLine(s);
689 }
690 listfile.Write();
691 listfile.Close();
692 }
693 wxMessageBox(wxT("コピー終了"));
694 }
695