OSDN Git Service

revises makefile
[qcad/qcad.git] / qcadwin / Param.cpp
1 //---------------------------------------------------------------------------\r
2 // Form for Parameter\r
3 //---------------------------------------------------------------------------\r
4 #include <vcl.h>\r
5 #include <math.h>\r
6 #pragma hdrstop\r
7 \r
8 #include "Param.h"\r
9 #include "CPanel.h"\r
10 \r
11 //---------------------------------------------------------------------------\r
12 #pragma package(smart_init)\r
13 #pragma resource "*.dfm"\r
14 TFParam *FParam;\r
15 //---------------------------------------------------------------------------\r
16 const double Pi = M_PI;\r
17 //---------------------------------------------------------------------------\r
18 class QPhaseController{\r
19   private:\r
20     int Size;\r
21     int Resolution;\r
22     double AngleStep;\r
23     double Theta;\r
24     TCanvas *Canvas;\r
25   public:\r
26   QPhaseController(TCanvas *c){\r
27     Canvas = c;\r
28     Resolution = 8;\r
29     AngleStep = Pi/(double)Resolution;\r
30     Size = 30;\r
31     Draw();\r
32   };\r
33   void Draw(void){\r
34     Canvas->Brush->Color = clBtnFace;\r
35     Canvas->Pen->Color = clBlack;\r
36     Canvas->Pen->Width = 2;\r
37     int s = Size*2;\r
38     Canvas->FillRect(Rect(0,0,s,s));\r
39     Canvas->Brush->Color = clWhite;\r
40     Canvas->Ellipse(0,0,Size*2,Size*2);\r
41     int x = Size*cos(Theta);\r
42     int y = -Size*sin(Theta);\r
43     Canvas->Pen->Color = clRed;\r
44     Canvas->MoveTo(Size,Size);\r
45     Canvas->LineTo(Size+x,Size+y);\r
46   };\r
47   void SetTheta(double t){\r
48     Theta = t/(double)180*Pi;\r
49     Draw();\r
50   };\r
51   double GetTheta(int X, int Y){\r
52     double x = (double)(X-Size);\r
53     double y = (double)(Y-Size);\r
54     Theta = atan2(-y,x);\r
55     Theta = ((double)(int)((Theta + Pi)/AngleStep+AngleStep*0.5)*AngleStep-Pi);\r
56     return Theta/Pi*180;\r
57   };\r
58 };\r
59 //---------------------------------------------------------------------------\r
60 __fastcall\r
61 TFParam::TFParam(TComponent* Owner) : TForm(Owner) {\r
62   qpcRot = new QPhaseController(ImageRotPhase->Canvas);\r
63   qpcCRot = new QPhaseController(ImageCRotPhase->Canvas);\r
64 }\r
65 //---------------------------------------------------------------------------\r
66 void __fastcall\r
67 TFParam::FormDestroy(TObject *Sender) {\r
68   delete qpcRot;\r
69   delete qpcCRot;\r
70 }\r
71 //---------------------------------------------------------------------------\r
72 // Methods for Create Circuit\r
73 //---------------------------------------------------------------------------\r
74 void\r
75 TFParam::CreateCircuit(int type, int mx, int my, QDraw *qDraw, QManager *qManager) {\r
76 \r
77   if ( qManager->GetCircuitInclude(mx, my) != NULL) {\r
78     return;\r
79   }\r
80 \r
81   switch (type) {\r
82   case CP_WALSH:\r
83     qManager->AddCircuit(new QWalsh(mx,my));\r
84     break;\r
85 \r
86   case CP_MESURE:\r
87     qManager->AddCircuit(new QMeasure(mx,my));\r
88     break;\r
89 \r
90   case CP_NOT:\r
91     qManager->AddCircuit(new QNot(mx,my));\r
92     break;\r
93 \r
94   case CP_PAULI_X:\r
95     qManager->AddCircuit(new QPauliX(mx,my));\r
96     break;\r
97 \r
98   case CP_PAULI_Y:\r
99     qManager->AddCircuit(new QPauliY(mx,my));\r
100     break;\r
101 \r
102   case CP_PAULI_Z:\r
103     qManager->AddCircuit(new QPauliZ(mx,my));\r
104     break;\r
105 \r
106   case CP_CNOT:\r
107     CreateCNOT(mx, my, qDraw, qManager);\r
108     break;\r
109 \r
110   case CP_CCNOT:\r
111     CreateCCNOT(mx, my, qDraw, qManager);\r
112     break;\r
113 \r
114   case CP_SWAP:\r
115     CreateSWAP(mx, my, qDraw, qManager);\r
116     break;\r
117 \r
118   case CP_ROT:\r
119     CreateROT(mx, my, qDraw, qManager);\r
120     break;\r
121 \r
122   case CP_CROT:\r
123     CreateCROT(mx, my, qDraw, qManager);\r
124     break;\r
125   }\r
126 }\r
127 //---------------------------------------------------------------------------\r
128 void\r
129 TFParam::CreateCNOT(int mx, int my, QDraw *qDraw, QManager *qManager) {\r
130   QCNot *qc = new QCNot(mx,my);\r
131   qc->Draw(qDraw);\r
132   if (!Execute(qc,qManager)) {\r
133     delete qc;\r
134   } else {\r
135     qManager->AddCircuit(qc);\r
136   }\r
137 }\r
138 //---------------------------------------------------------------------------\r
139 void\r
140 TFParam::CreateCCNOT(int mx, int my, QDraw *qDraw, QManager *qManager) {\r
141   QCCNot *qc = new QCCNot(mx,my);\r
142   qc->Draw(qDraw);\r
143   if (!Execute(qc,qManager)) {\r
144     delete qc;\r
145   } else {\r
146     qManager->AddCircuit(qc);\r
147   }\r
148 }\r
149 //---------------------------------------------------------------------------\r
150 void\r
151 TFParam::CreateSWAP(int mx, int my, QDraw *qDraw, QManager *qManager) {\r
152   QSwap *qc = new QSwap(mx,my);\r
153   qc->Draw(qDraw);\r
154   if (!Execute(qc,qManager)) {\r
155     delete qc;\r
156   } else {\r
157     qManager->AddCircuit(qc);\r
158   }\r
159 }\r
160 //---------------------------------------------------------------------------\r
161 void\r
162 TFParam::CreateROT(int mx, int my, QDraw *qDraw, QManager *qManager) {\r
163   QRot *qc = new QRot(mx,my);\r
164   qc->Draw(qDraw);\r
165   if (!Execute(qc,qManager)) {\r
166     delete qc;\r
167   } else {\r
168     qManager->AddCircuit(qc);\r
169   }\r
170 }\r
171 //---------------------------------------------------------------------------\r
172 void\r
173 TFParam::CreateCROT(int mx, int my, QDraw *qDraw, QManager *qManager) {\r
174   QCRot *qc = new QCRot(mx,my);\r
175   qc->Draw(qDraw);\r
176   if (!Execute(qc,qManager)) {\r
177     delete qc;\r
178   } else {\r
179     qManager->AddCircuit(qc);\r
180   }\r
181 }\r
182 //---------------------------------------------------------------------------\r
183 // Methods for Modify Circuit\r
184 //---------------------------------------------------------------------------\r
185 void\r
186 TFParam::ModifyCircuit(QCircuit *qc, QManager *qManager) {\r
187   QCircuit *oldqc = qc->Clone();\r
188   qManager->ClrCircuitFlg(qc);\r
189 \r
190   switch (qc->GetType()) {\r
191   case QC_BITBOX:\r
192     if (Execute((QBitbox*)qc)) {\r
193       qManager->ModifyCircuit(oldqc, qc);\r
194     }\r
195     break;\r
196 \r
197   case QC_CNOT:\r
198     if (Execute((QCNot*)qc, qManager)) {\r
199       qManager->ModifyCircuit(oldqc, qc);\r
200     }\r
201     break;\r
202 \r
203   case QC_CCNOT:\r
204     if (Execute((QCCNot*)qc, qManager)) {\r
205       qManager->ModifyCircuit(oldqc, qc);\r
206     }\r
207     break;\r
208 \r
209   case QC_SWAP:\r
210     if (Execute((QSwap*)qc, qManager)) {\r
211       qManager->ModifyCircuit(oldqc, qc);\r
212     }\r
213     break;\r
214 \r
215   case QC_ROT:\r
216     if (Execute((QRot*)qc, qManager)) {\r
217       qManager->ModifyCircuit(oldqc, qc);\r
218     }\r
219     break;\r
220 \r
221   case QC_CROT:\r
222     if (Execute((QCRot*)qc, qManager)) {\r
223       qManager->ModifyCircuit(oldqc, qc);\r
224     }\r
225     break;\r
226   }\r
227 \r
228   delete oldqc;\r
229   qManager->SetAllCircuitFlg();\r
230 }\r
231 //---------------------------------------------------------------------------\r
232 bool\r
233 TFParam::Execute(QBitbox *qBitBox) {\r
234   TSBitBox->TabVisible = true;\r
235   CBBitState->Items->Clear();\r
236   CBBitState->Items->Add("|0>");\r
237   CBBitState->Items->Add("|1>");\r
238   CBBitState->ItemIndex = qBitBox->GetState();\r
239   CBEnabled->Checked = qBitBox->Enabled;\r
240   int mr = ShowModal();\r
241   TSBitBox->TabVisible = false;\r
242 \r
243   if (mr==mrCancel)return false;\r
244   qBitBox->Enabled = CBEnabled->Checked;\r
245   qBitBox->SetState((int)CBBitState->ItemIndex);\r
246   return true;\r
247 }\r
248 //---------------------------------------------------------------------------\r
249 /**\r
250  * CNot\r
251  */\r
252 bool\r
253 TFParam::Execute(QCNot *qCNot,QManager *qManager) {\r
254 \r
255   int *LineIndex = new int[qManager->GetLineNumber()];\r
256   int index = 0;\r
257 \r
258   CBTarget->Items->Clear();\r
259   for (int i=0;i<qManager->GetLineNumber();i++) {\r
260     QCNot testqc(qCNot->GetX(), qCNot->GetY());\r
261     testqc.SetTarget(i);\r
262     if (i != qCNot->GetY() &&\r
263         qManager->CanPutCircuit(&testqc)) {\r
264       CBTarget->Items->Add("q"+IntToStr(i+1));\r
265       LineIndex[index] = i;\r
266       index++;\r
267     }\r
268   }\r
269   if(index == 0){\r
270     MessageBeep(MB_OK);\r
271     delete []LineIndex;\r
272     return false;\r
273   }\r
274 \r
275   CBTarget->ItemIndex = 0;\r
276   for (int i=0;i<CBTarget->Items->Count;i++) {\r
277     if(qCNot->GetTarget()==LineIndex[i]){\r
278       CBTarget->ItemIndex = i;\r
279     }\r
280   }\r
281 \r
282   TSCnot->TabVisible = true;\r
283   int mr = ShowModal();\r
284   TSCnot->TabVisible = false;\r
285 \r
286   if (mr==mrCancel) {\r
287     delete []LineIndex;\r
288     return false;\r
289   }\r
290 \r
291   qCNot->SetTarget(LineIndex[CBTarget->ItemIndex]);\r
292 \r
293   delete [] LineIndex;\r
294   return true;\r
295 }\r
296 //---------------------------------------------------------------------------\r
297 /**\r
298  * CCNot\r
299  */\r
300 bool\r
301 TFParam::Execute(QCCNot *qCCNot,QManager *qManager) {\r
302 \r
303   int *LineIndex = new int[qManager->GetLineNumber()];\r
304   int index = 0;\r
305 \r
306   CBTarget1->Items->Clear();\r
307   CBTarget2->Items->Clear();\r
308 \r
309   for (int i=0;i<qManager->GetLineNumber();i++) {\r
310     QCCNot testqc(qCCNot->GetX(), qCCNot->GetY());\r
311     testqc.SetTarget1(i);\r
312     testqc.SetTarget2(i);\r
313     if (i != qCCNot->GetY() && qManager->CanPutCircuit(&testqc)) {\r
314       CBTarget1->Items->Add("q"+IntToStr(i+1));\r
315       CBTarget2->Items->Add("q"+IntToStr(i+1));\r
316       LineIndex[index] = i;\r
317       index++;\r
318     }\r
319   }\r
320   if(index < 2){\r
321     MessageBeep(MB_OK);\r
322     delete []LineIndex;\r
323     return false;\r
324   }\r
325 \r
326   CBTarget1->ItemIndex = 0;\r
327   for (int i=0;i<CBTarget1->Items->Count;i++) {\r
328     if(qCCNot->GetTarget1()==LineIndex[i]){\r
329       CBTarget1->ItemIndex = i;\r
330     }\r
331   }\r
332   CBTarget2->ItemIndex = 0;\r
333   for (int i=0;i<CBTarget2->Items->Count;i++) {\r
334     if(qCCNot->GetTarget2()==LineIndex[i]){\r
335       CBTarget2->ItemIndex = i;\r
336     }\r
337   }\r
338 \r
339   int mr;\r
340   TSCCNot->TabVisible = true;\r
341   while (1) {\r
342     mr = ShowModal();\r
343     if (mr == mrCancel) break;\r
344     if (CBTarget1->ItemIndex == CBTarget2->ItemIndex) {\r
345       ShowMessage("Select different lines.");\r
346     } else {\r
347       break;\r
348     }\r
349   }\r
350   TSCCNot->TabVisible = false;\r
351 \r
352   if (mr==mrCancel) {\r
353     delete [] LineIndex;\r
354     return false;\r
355   }\r
356 \r
357   qCCNot->SetTarget1(LineIndex[CBTarget1->ItemIndex]);\r
358   qCCNot->SetTarget2(LineIndex[CBTarget2->ItemIndex]);\r
359 \r
360   delete [] LineIndex;\r
361   return true;\r
362 }\r
363 \r
364 //---------------------------------------------------------------------------\r
365 /**\r
366  * Swap\r
367  **/\r
368 bool\r
369 TFParam::Execute(QSwap *qSwap, QManager *qManager) {\r
370 \r
371   int *LineIndex = new int[qManager->GetLineNumber()];\r
372   int index = 0;\r
373 \r
374   CBSwapTarget1->Items->Clear();\r
375   CBSwapTarget2->Items->Clear();\r
376 \r
377   for (int i=0;i<qManager->GetLineNumber();i++) {\r
378     if (qManager->GetCircuitInclude(qSwap->GetX(), i) == NULL) {\r
379       CBSwapTarget1->Items->Add("q"+IntToStr(i+1));\r
380       CBSwapTarget2->Items->Add("q"+IntToStr(i+1));\r
381       LineIndex[index] = i;\r
382       index++;\r
383     }\r
384   }\r
385   CBSwapTarget1->ItemIndex = qSwap->GetTarget1();\r
386   CBSwapTarget2->ItemIndex = qSwap->GetTarget2();\r
387 \r
388   int mr;\r
389   TSSwap->TabVisible = true;\r
390   while (1) {\r
391     mr = ShowModal();\r
392     if (mr == mrCancel) break;\r
393     QSwap testqc(qSwap->GetX(), qSwap->GetY());\r
394     testqc.SetTarget(LineIndex[CBSwapTarget1->ItemIndex],LineIndex[CBSwapTarget2->ItemIndex]);\r
395     if (!qManager->CanPutCircuit(&testqc)) {\r
396       ShowMessage("Circuits are overlapped!");\r
397     } else if (CBSwapTarget1->ItemIndex == CBSwapTarget2->ItemIndex) {\r
398       ShowMessage("Select different lines.");\r
399     } else {\r
400       break;\r
401     }\r
402   }\r
403 \r
404   TSSwap->TabVisible = false;\r
405 \r
406   if (mr==mrCancel) {\r
407     delete [] LineIndex;\r
408     return false;\r
409   }\r
410 \r
411   qSwap->SetTarget(LineIndex[CBSwapTarget1->ItemIndex],LineIndex[CBSwapTarget2->ItemIndex]);\r
412 \r
413   delete [] LineIndex;\r
414   return true;\r
415 }\r
416 //---------------------------------------------------------------------------\r
417 /**\r
418  * Controled Rotator\r
419 **/\r
420 bool\r
421 TFParam::Execute(QCRot * qCRot, QManager * qManager) {\r
422 \r
423   EdCRotPhase->Text = FloatToStr(qCRot->GetPhase());\r
424   int *LineIndex = new int[qManager->GetLineNumber()];\r
425   int index = 0;\r
426 \r
427   CBCRTarget->Items->Clear();\r
428   for (int i=0;i<qManager->GetLineNumber();i++) {\r
429     QCRot testqc(qCRot->GetX(), qCRot->GetY());\r
430     testqc.SetTarget(i);\r
431     if (i != qCRot->GetY() && qManager->CanPutCircuit(&testqc)) {\r
432       CBCRTarget->Items->Add("q"+IntToStr(i+1));\r
433       LineIndex[index] = i;\r
434       index++;\r
435     }\r
436   }\r
437   if(index == 0){\r
438     MessageBeep(MB_OK);\r
439     delete []LineIndex;\r
440     return false;\r
441   }\r
442 \r
443   CBCRTarget->ItemIndex = 0;\r
444   for (int i=0;i<CBCRTarget->Items->Count;i++) {\r
445     if(qCRot->GetTarget()==LineIndex[i]){\r
446       CBCRTarget->ItemIndex = i;\r
447     }\r
448   }\r
449 \r
450   qpcCRot->SetTheta(qCRot->GetPhase());\r
451   TSCRot->TabVisible = true;\r
452   int mr = mrNone;\r
453   while(mr == mrNone){\r
454     mr = ShowModal();\r
455     if (mr!=mrOk) {\r
456       TSCRot->TabVisible = false;\r
457       delete []LineIndex;\r
458       return false;\r
459     }\r
460     try {\r
461       StrToFloat(EdCRotPhase->Text);\r
462     } catch (EConvertError &e) {\r
463       MessageBox(this->Handle,"Please input valid value.", "QCAD - Alert",MB_ICONERROR);\r
464       mr = mrNone;\r
465     }\r
466   }\r
467 \r
468   TSCRot->TabVisible = false;\r
469   qCRot->SetTarget(LineIndex[CBCRTarget->ItemIndex]);\r
470   qCRot->SetPhase(StrToFloat(EdCRotPhase->Text));\r
471 \r
472   delete [] LineIndex;\r
473   return true;\r
474 }\r
475 //---------------------------------------------------------------------------\r
476 /**\r
477  * Rotator\r
478 **/\r
479 bool\r
480 TFParam::Execute(QRot * qRot, QManager * qManager) {\r
481   EdRotPhase->Text = FloatToStr(qRot->GetPhase());\r
482   qpcRot->SetTheta(qRot->GetPhase());\r
483   TSRot->TabVisible = true;\r
484   int mr = mrNone;\r
485   while(mr == mrNone){\r
486     mr = ShowModal();\r
487     if (mr!=mrOk) {\r
488       TSRot->TabVisible = false;\r
489       return false;\r
490     }\r
491     try {\r
492       StrToFloat(EdRotPhase->Text);\r
493     } catch (EConvertError &e) {\r
494       MessageBox(this->Handle,"Please input valid value.", "QCAD - Alert",MB_ICONERROR);\r
495       mr = mrNone;\r
496     }\r
497   }\r
498   qRot->SetPhase(StrToFloat(EdRotPhase->Text));\r
499   TSRot->TabVisible = false;\r
500   return true;\r
501 }\r
502 //---------------------------------------------------------------------------\r
503 void __fastcall TFParam::ImageRotPhaseMouseMove(TObject *Sender,\r
504       TShiftState Shift, int X, int Y)\r
505 {\r
506   if(!Shift.Contains(ssLeft)){\r
507     return;\r
508   }\r
509   EdRotPhase->Text = FloatToStr(qpcRot->GetTheta(X,Y));\r
510   qpcRot->Draw();\r
511 }\r
512 //---------------------------------------------------------------------------\r
513 \r
514 void __fastcall TFParam::ImageCRotPhaseMouseMove(TObject *Sender,\r
515       TShiftState Shift, int X, int Y)\r
516 {\r
517   if(!Shift.Contains(ssLeft)){\r
518     return;\r
519   }\r
520   EdCRotPhase->Text = FloatToStr(qpcCRot->GetTheta(X,Y));\r
521   qpcCRot->Draw();\r
522 }\r
523 //---------------------------------------------------------------------------\r
524 \r