/// <summary> /// 問題を設定する /// </summary> /// <returns></returns> private bool setNewProblem() { bool success = false; try { if( ProbNo == 0 ) { Cad2D.Clear(); { // Make model IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0,0.0) ); pts.Add( new CVector2D(2.0,0.0) ); pts.Add( new CVector2D(2.0,1.0) ); pts.Add( new CVector2D(1.0,1.0) ); pts.Add( new CVector2D(1.0,2.0) ); pts.Add( new CVector2D(0.0,2.0) ); uint id_l0 = Cad2D.AddPolygon( pts ).id_l_add; } DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans( Camera ); } else if( ProbNo == 1 ) { Cad2D.Clear(); { // Make model IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0,0.0) ); pts.Add( new CVector2D(1.0,0.0) ); pts.Add( new CVector2D(1.0,1.0) ); pts.Add( new CVector2D(0.5,1.0) ); pts.Add( new CVector2D(0.0,1.0) ); uint id_l0 = Cad2D.AddPolygon( pts ).id_l_add; } Cad2D.SetCurve_Arc(1,false,-0.2); Cad2D.SetCurve_Arc(2,false, 0.5); //Cad2D.SetCurve_Arc(3,false,-0.5); //Cad2D.SetCurve_Arc(4,true, -0.5); Cad2D.ConnectVertex_Line(1,2); DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans( Camera ); } else if( ProbNo == 2 ) { Cad2D.Clear(); { // Make model IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0,0.0) ); pts.Add( new CVector2D(1.0,0.0) ); pts.Add( new CVector2D(1.0,1.0) ); pts.Add( new CVector2D(0.5,1.0) ); pts.Add( new CVector2D(0.0,1.0) ); uint id_l0 = Cad2D.AddPolygon( pts ).id_l_add; } Cad2D.SetCurve_Arc(1,false, 0); //Cad2D.SetCurve_Arc(2,false, 0); //Cad2D.SetCurve_Arc(1,true, -1.0); Cad2D.SetCurve_Arc(2,true, -1.0); Cad2D.SetCurve_Arc(3,true, -1.0); //Cad2D.SetCurve_Arc(4,true, -0.5); Cad2D.SetCurve_Arc(5,true, -0.5); DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans( Camera ); } else if( ProbNo == 3 ) { Cad2D.Clear(); { uint id_l = 0; { IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0,0.0) ); pts.Add( new CVector2D(1.0,0.0) ); pts.Add( new CVector2D(1.0,1.0) ); pts.Add( new CVector2D(0.0,1.0) ); id_l = Cad2D.AddPolygon( pts ).id_l_add; } uint id_v1 = Cad2D.AddVertex(CAD_ELEM_TYPE.LOOP,id_l, new CVector2D(0.3,0.2)).id_v_add; uint id_v2 = Cad2D.AddVertex(CAD_ELEM_TYPE.LOOP,id_l, new CVector2D(0.7,0.2)).id_v_add; uint id_v3 = Cad2D.AddVertex(CAD_ELEM_TYPE.LOOP,id_l, new CVector2D(0.7,0.8)).id_v_add; uint id_v4 = Cad2D.AddVertex(CAD_ELEM_TYPE.LOOP,id_l, new CVector2D(0.3,0.8)).id_v_add; Cad2D.ConnectVertex_Line(id_v1,id_v2); Cad2D.ConnectVertex_Line(id_v2,id_v3); Cad2D.ConnectVertex_Line(id_v3,id_v4); Cad2D.ConnectVertex_Line(id_v4,id_v1); } DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans( Camera ); } else if( ProbNo == 4 ){ Cad2D.Clear(); { IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0,0.0) ); pts.Add( new CVector2D(1.0,0.0) ); pts.Add( new CVector2D(1.0,1.0) ); pts.Add( new CVector2D(0.0,1.0) ); Cad2D.AddPolygon( pts ); IList<CVector2D> aRelCo = new List<CVector2D>(); for (int i = 0; i < 3; i++) { aRelCo.Add(new CVector2D()); } { aRelCo[0].x = 0.25; aRelCo[0].y = -0.1; aRelCo[1].x = 0.5; aRelCo[1].y = -0.0; aRelCo[2].x= 0.75; aRelCo[2].y = -0.1; } Cad2D.SetCurve_Polyline(1, aRelCo); Cad2D.SetCurve_Arc(2, true, -1); } DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans( Camera ); } else if( ProbNo == 5 ) { Cad2D.Clear(); uint id_l_l, id_l_r; { IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0, 0.0) ); // 1 pts.Add( new CVector2D(1.5, 0.0) ); // 2 pts.Add( new CVector2D(1.5, 0.4) ); // 3 pts.Add( new CVector2D(1.0, 0.4) ); // 4 pts.Add( new CVector2D(1.0, 0.5) ); // 5 pts.Add( new CVector2D(2.0, 0.5) ); // 6 pts.Add( new CVector2D(2.0, 1.0) ); // 7 pts.Add( new CVector2D(0.0, 1.0) ); // 8 pts.Add( new CVector2D(0.0, 0.5) ); // 9 Id_l0 = Cad2D.AddPolygon( pts ).id_l_add; uint id_e1 = Cad2D.ConnectVertex_Line(5,9).id_e_add; Cad2D.ShiftLayer_Loop(Id_l0, true); double[] col = new double[3]{ 0.9, 0.4, 0.4 }; Cad2D.SetColor_Loop(Id_l0, col); Cad2D.AddVertex(CAD_ELEM_TYPE.EDGE, 3, new CVector2D(1.3,0.5) ); Cad2D.GetIdLoop_Edge(out id_l_l, out id_l_r, id_e1); } //////////////// DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } // ryujimiya:なぜかグローバルなDrawerへは格納していない。あとでチェック。-->格納するように変更 Drawer = new CDrawer_Cad2D(Cad2D); Drawer.SetPointSize(10); DrawerAry.PushBack( Drawer); DrawerAry.InitTrans(Camera); } else if( ProbNo == 6 ) { Cad2D.ShiftLayer_Loop(Id_l0,false); Cad2D.ShiftLayer_Loop(Id_l0,false); //////////////// DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } // ryujimiya:なぜかグローバルなDrawerへは格納していない。あとでチェック。-->格納するように変更 Drawer = new CDrawer_Cad2D(Cad2D); Drawer.SetPointSize(10); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans(Camera); } else if( ProbNo == 7 ) { Cad2D.Clear(); { // Make model IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0,0.0) ); pts.Add( new CVector2D(1.0,0.0) ); pts.Add( new CVector2D(2.0,0.0) ); pts.Add( new CVector2D(3.0,0.0) ); pts.Add( new CVector2D(3.0,1.0) ); pts.Add( new CVector2D(2.0,1.0) ); pts.Add( new CVector2D(1.0,1.0) ); pts.Add( new CVector2D(0.0,1.0) ); uint id_l0 = Cad2D.AddPolygon( pts ).id_l_add; } DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans( Camera ); } else if( ProbNo == 8 ) { Cad2D.Clear(); { // Make model IList<CVector2D> pts = new List<CVector2D>(); pts.Add( new CVector2D(0.0,0.0) ); pts.Add( new CVector2D(1.0,0.0) ); pts.Add( new CVector2D(1.0,1.0) ); pts.Add( new CVector2D(0.5,1.0) ); pts.Add( new CVector2D(0.0,1.0) ); uint id_l0 = Cad2D.AddPolygon( pts ).id_l_add; } Cad2D.SetCurve_Bezier(1,0.2,+0.5, 0.2,-0.5); Cad2D.SetCurve_Bezier(2,0.5,+0.5, 0.2,-0.5); Cad2D.ConnectVertex_Line(1,2); DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); DrawerAry.InitTrans( Camera ); } success = true; } catch (Exception exception) { Console.WriteLine(exception.Message + " " + exception.StackTrace); } Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); DrawerGlUtility.SetProjectionTransform(Camera); Glut.glutPostRedisplay(); ProbNo++; if (ProbNo == ProbCnt) ProbNo = 0; return success; }
/// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param> protected virtual void Dispose(bool disposing) { if (Disposed) { return; } Disposed = true; if (DrawerAry != null) { DrawerAry.Clear(); DrawerAry.Dispose(); DrawerAry = null; } if (Drawer != null) { // DrawerAryのクリアで破棄処理が実行されているので破棄の必要はない。nullにセットするだけ。 Drawer = null; } if (Camera != null) { Camera.Dispose(); Camera = null; } if (AVecStrok != null) { clearAVec(AVecStrok); AVecStrok = null; } }
/// <summary> /// Glut:マウスクリックイベントハンドラ /// </summary> /// <param name="button"></param> /// <param name="state"></param> /// <param name="x"></param> /// <param name="y"></param> private void myGlutMouse(int button, int state, int x, int y) { //Console.WriteLine("myGlutMouse"); // ryujimiya // メニューが左クリックでメニューイベントハンドラが処理された後、MouseUpのイベントが発生する // それは望んでいるイベントではないと思われるので除外するようにした。 if (isMenuItemClicked) { isMenuItemClicked = false; //Console.WriteLine("skipped: state {0}", state); return; } int[] viewport = new int[4]; Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); int winW = viewport[2]; int winH = viewport[3]; MovBeginX = (2.0 * x - winW) / winW; MovBeginY = (winH - 2.0 * y) / winH; PressButton = button; uint id_part_cad0 = Id_part_cad; CAD_ELEM_TYPE elemType_part_cad0 = ElemType_part_cad; { // hilight the picked element int sizeBuffer = 128; DelFEM4NetCom.View.DrawerGlUtility.PickSelectBuffer pickSelectBuffer = null; DelFEM4NetCom.View.DrawerGlUtility.PickPre((uint)sizeBuffer, out pickSelectBuffer, (uint)x, (uint)y, 5, 5, Camera); DrawerAry.DrawSelection(); List<DelFEM4NetCom.View.SSelectedObject> aSelecObj = (List<DelFEM4NetCom.View.SSelectedObject>)DelFEM4NetCom.View.DrawerGlUtility.PickPost(pickSelectBuffer, (uint)x, (uint)y, Camera); DrawerAry.ClearSelected(); Id_part_cad = 0; elemType_part_cad0 = CAD_ELEM_TYPE.NOT_SET; if( aSelecObj.Count > 0 ) { Drawer.GetCadPartID(aSelecObj[0].name, ref ElemType_part_cad, ref Id_part_cad); DrawerAry.AddSelected( aSelecObj[0].name ); } else { ElemType_part_cad = CAD_ELEM_TYPE.NOT_SET; Id_part_cad = 0; } } //Console.WriteLine("ElemType_part_cad: {0} Id_part_cad: {1}", ElemType_part_cad, Id_part_cad); if ( state == Glut.GLUT_DOWN ) { if (Mode == ModeDv.DragCurve) { if( ElemType_part_cad == CAD_ELEM_TYPE.EDGE && Cad2D.IsElemID(ElemType_part_cad,Id_part_cad) ) { CVector3D oloc = Camera.ProjectionOnPlane(MovBeginX, MovBeginY); if( Cad2D.GetEdgeCurveType(Id_part_cad) == CURVE_TYPE.CURVE_POLYLINE ) { bool res = Cad2D.PreCompDragPolyline(Id_part_cad, new CVector2D(oloc.x,oloc.y)); } return; } } else if( Mode == ModeDv.AddPoint ) { // add point clearAVec(AVecStrok); if( ElemType_part_cad == CAD_ELEM_TYPE.VERTEX ) { return; } CVector3D oloc = Camera.ProjectionOnPlane(MovBeginX, MovBeginY); CVector2D v0 = new CVector2D(oloc.x, oloc.y); uint id_v0 = Cad2D.AddVertex(ElemType_part_cad, Id_part_cad, v0).id_v_add; ElemType_part_cad = CAD_ELEM_TYPE.VERTEX; Id_part_cad = id_v0; if( !Cad2D.IsElemID(CAD_ELEM_TYPE.VERTEX, id_v0) ) { clearAVec(AVecStrok); return; } DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); } else if( Mode == ModeDv.DeletePoint ) { // delete point if( Cad2D.IsElemID(ElemType_part_cad, Id_part_cad) ) { bool iflag = Cad2D.RemoveElement(ElemType_part_cad, Id_part_cad); if( iflag ) { DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); } } Mode = ModeDv.Drag; Console.WriteLine("Mode:{0}", Mode); } } if( state == Glut.GLUT_UP ) { if (Mode == ModeDv.AddPoint) { //Mode = Mode.Drag; //Console.WriteLine("Mode:{0}", Mode); if (elemType_part_cad0 != CAD_ELEM_TYPE.VERTEX || !Cad2D.IsElemID(CAD_ELEM_TYPE.VERTEX, id_part_cad0)) { clearAVec(AVecStrok); return; } uint id_v0 = id_part_cad0; uint id_v1 = 0; if( ElemType_part_cad == CAD_ELEM_TYPE.VERTEX ) { if( !Cad2D.IsElemID(CAD_ELEM_TYPE.VERTEX, Id_part_cad) ) { clearAVec(AVecStrok); return; } id_v1 = Id_part_cad; } else { CVector2D v1 = AVecStrok[AVecStrok.Count - 1]; id_v1 = Cad2D.AddVertex(ElemType_part_cad, Id_part_cad, v1).id_v_add; if( !Cad2D.IsElemID(CAD_ELEM_TYPE.VERTEX,id_v1) ) { clearAVec(AVecStrok); return; } } CEdge2D e = new CEdge2D(id_v0,id_v1); { //e.itype = CURVE_TYPE.CURVE_POLYLINE; int n = AVecStrok.Count; CVector2D pos = Cad2D.GetVertexCoord(e.GetIdVtx(true)); CVector2D poe = Cad2D.GetVertexCoord(e.GetIdVtx(false)); e.SetVtxCoords(pos, poe); double sqlen = CVector2D.SquareLength(poe - pos); CVector2D eh = (poe - pos) * (1/sqlen); CVector2D ev = new CVector2D(-eh.y, eh.x); { IList<double> aRelCo = new List<double>(); foreach (CVector2D pp in AVecStrok) { double x1 = CVector2D.Dot(pp - pos, eh); double y1 = CVector2D.Dot(pp - pos, ev); aRelCo.Add(x1); aRelCo.Add(y1); } e.SetCurve_Polyline(aRelCo); } { IList<CVector2D> aVecDiv = new List<CVector2D>(); int ndiv = (int)((double)e.GetCurveLength() / (Camera.GetHalfViewHeight() * 0.04) + 1); e.GetCurveAsPolyline(ref aVecDiv, ndiv); IList<double> aRelCo = new List<double>(); foreach (CVector2D pp in aVecDiv) { double x1 = CVector2D.Dot(pp - pos, eh); double y1 = CVector2D.Dot(pp - pos, ev); aRelCo.Add(x1); aRelCo.Add(y1); } e.SetCurve_Polyline(aRelCo); } } Cad2D.ConnectVertex(e); DrawerAry.Clear(); if (Drawer != null) { Drawer = null; } Drawer = new CDrawer_Cad2D(Cad2D); DrawerAry.PushBack( Drawer ); clearAVec(AVecStrok); } } }
/// <summary> /// コンストラクタ /// </summary> public MainLogic() { Disposed = false; Camera = new CCamera(); Cad2D = new CCadObj2D_Move(); DrawerAry = new CDrawerArray(); Drawer = null; // インスタンスを生成しない AVecStrok = new List<CVector2D>(); // Glutのアイドル時処理でなく、タイマーで再描画イベントを発生させる MyTimer.Tick += (sender, e) => { Glut.glutPostRedisplay(); }; MyTimer.Interval = 1000 / 60; }