コード例 #1
0
ファイル: Normals.cs プロジェクト: kojtoLtd/KojtoCAD
        public void KojtoCAD_3D_Change_Explicit_Normal_Length_Selection()
        {
            if ((container != null) && (container.Bends.Count > 0) && (container.Nodes.Count > 0) && (container.Triangles.Count > 0))
            {
                Database db = HostApplicationServices.WorkingDatabase;
                Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

                Matrix3d old = ed.CurrentUserCoordinateSystem;
                ed.CurrentUserCoordinateSystem = Matrix3d.Identity;

                try
                {
                    PromptPointResult  pPtRes;
                    PromptPointOptions pPtOpts = new PromptPointOptions("");

                    pPtOpts.Message = "\nEnter the Point of the Node: ";
                    pPtRes          = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint(pPtOpts);

                    if (pPtRes.Status == PromptStatus.OK)
                    {
                        quaternion       nq   = new quaternion(0, pPtRes.Value.X, pPtRes.Value.Y, pPtRes.Value.Z);
                        WorkClasses.Node Node = null;

                        foreach (WorkClasses.Node node in container.Nodes)
                        {
                            if (node == nq)
                            {
                                Node = node;
                                break;
                            }
                        }
                        if ((object)Node != null)
                        {
                            PromptDoubleOptions pDoubleOpts_ = new PromptDoubleOptions("");
                            pDoubleOpts_.Message       = "\n Enter new Explicit Length : ";
                            pDoubleOpts_.DefaultValue  = 0.0;
                            pDoubleOpts_.AllowZero     = true;
                            pDoubleOpts_.AllowNegative = true;

                            PromptDoubleResult pDoubleRes_ = Application.DocumentManager.MdiActiveDocument.Editor.GetDouble(pDoubleOpts_);
                            if (pDoubleRes_.Status == PromptStatus.OK)
                            {
                                Node.ExplicitNormalLength = pDoubleRes_.Value;
                            }
                        }
                    }
                }
                catch { }
                finally { ed.CurrentUserCoordinateSystem = old; }
            }
            else
            {
                MessageBox.Show("\nData Base Empty !\n", "Range Error !", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
コード例 #2
0
ファイル: CamCncExport.cs プロジェクト: kojtoLtd/KojtoCAD
 public void NodeToCNC(string path, int NodeNumer, double L, double Lp, double Ls, double R, double toolR, string projectName, double gabaritX,
                       double gabaritY, double gabaritZ, string material, string maschine, string prisposoblenia, string startPos, string toolStr, string G43H, string outCoord)
 {
     try
     {
         WorkClasses.Node node     = container.Nodes[NodeNumer];
         string           FileName = path + String.Format("O{0}({1}-VYZEL NOMER {2})", 2000 + node.Numer + 1, projectName, node.Numer + 1) + ".txt";
         using (StreamWriter outf = new StreamWriter(FileName))
         {
             DateTime time = DateTime.Now;
             outf.WriteLine("%");
             outf.WriteLine(String.Format("O{0}({1}-VYZEL NOMER {2})", 2000 + node.Numer + 1, projectName, node.Numer + 1));
             outf.WriteLine("(MACHINE  {0})", maschine);
             outf.WriteLine(String.Format("(DATE {0}.{1}.{2})", time.Day, time.Month, time.Year));
             outf.WriteLine(String.Format("(GABAGRITI NA ZAGOTOVKATA X,Y,Z MM {0},{1},{2})", gabaritX, gabaritY, gabaritZ));
             outf.WriteLine(String.Format("(MATERIAL-{0})", material));
             outf.WriteLine("(QUADRANT 1,2,3,4)");
             outf.WriteLine("(CENTAR NA KOORDINATNATA SISTEMA X,Y,Z MM-CENTAR )");
             outf.WriteLine(String.Format("(PRISPOSOBLENIA-{0})", prisposoblenia));
             outf.WriteLine("(CYCLE TIME )");
             outf.WriteLine("G90G94G40G80G50G55G69");
             outf.WriteLine("G17G22G21G49G98G64G15");
             outf.WriteLine("G52X0Y0Z0");
             outf.WriteLine("(===HEADER END/PROGRAMM START===)");
             outf.WriteLine();
             outf.WriteLine(String.Format("G0{0}", startPos));
             outf.WriteLine(toolStr);
             outf.WriteLine(String.Format("G43{0}", G43H));
             outf.WriteLine("M1");
             outf.WriteLine();
             outf.WriteLine();
             //-----------------------------
             CNC_bends(outf, node, L, Lp, Ls, R, toolR, gabaritX, gabaritY, gabaritZ);
             //------------------------------
             outf.WriteLine();
             outf.WriteLine(outCoord);
             outf.WriteLine("M30");
             outf.WriteLine("%");
             outf.Flush();
             outf.Close();
         }
     }
     catch
     {
         if (((object)container == null) || container.Nodes.Count < 1)
         {
             MessageBox.Show("Node missing !", "Range Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
     }
 }
コード例 #3
0
ファイル: Normals.cs プロジェクト: kojtoLtd/KojtoCAD
        public void KojtoCAD_3D_Restore_Node_Normal_By_Selection()
        {
            if ((container != null) && (container.Bends.Count > 0) && (container.Nodes.Count > 0) && (container.Triangles.Count > 0))
            {
                Database db = HostApplicationServices.WorkingDatabase;
                Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

                Matrix3d old = ed.CurrentUserCoordinateSystem;
                ed.CurrentUserCoordinateSystem = Matrix3d.Identity;

                try
                {
                    PromptPointResult  pPtRes;
                    PromptPointOptions pPtOpts = new PromptPointOptions("");

                    pPtOpts.Message = "\nEnter the Point of the Node: ";
                    pPtRes          = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint(pPtOpts);

                    if (pPtRes.Status == PromptStatus.OK)
                    {
                        quaternion       nq   = new quaternion(0, pPtRes.Value.X, pPtRes.Value.Y, pPtRes.Value.Z);
                        WorkClasses.Node Node = null;

                        foreach (WorkClasses.Node node in container.Nodes)
                        {
                            if (node == nq)
                            {
                                Node = node;
                                break;
                            }
                        }
                        if ((object)Node != null)
                        {
                            container.RestoreNodesNormals(Node.Numer);
                        }
                    }
                }
                catch { }
                finally { ed.CurrentUserCoordinateSystem = old; }
            }
            else
            {
                MessageBox.Show("\nData Base Empty !\n", "Range Error !", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
コード例 #4
0
ファイル: Normals.cs プロジェクト: kojtoLtd/KojtoCAD
        private quaternion GetNodeCentroidByNoFictiveBendsMidPoints(int nodeNumer)
        {
            quaternion rez = new quaternion();

            WorkClasses.Node node = container.Nodes[nodeNumer];
            foreach (int B in node.Bends_Numers_Array)
            {
                WorkClasses.Bend bend = container.Bends[B];
                if (!bend.IsFictive())
                {
                    quaternion q = bend.MidPoint;
                    //quaternion q = bend.MidPoint - node.Position;
                    //q /= q.abs();
                    //q *= 300;
                    rez += q;
                }
            }
            rez /= node.Bends_Numers_Array.Count;
            // rez += node.Position;
            return(rez);
        }
コード例 #5
0
        public void KojtoCAD_3D_Set_ExplicitCuttingMethodForEndsOf3D_Bends()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

            Matrix3d old = ed.CurrentUserCoordinateSystem;

            ed.CurrentUserCoordinateSystem = Matrix3d.Identity;

            try
            {
                if ((container != null) && (container.Bends.Count > 0) && (container.Triangles.Count > 0))
                {
                    PromptPointResult  pPtRes;
                    PromptPointOptions pPtOpts = new PromptPointOptions("");

                    pPtOpts.Message = "\nEnter the Point of the Node: ";
                    pPtRes          = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint(pPtOpts);

                    if (pPtRes.Status == PromptStatus.OK)
                    {
                        quaternion       nq   = new quaternion(0, pPtRes.Value.X, pPtRes.Value.Y, pPtRes.Value.Z);
                        WorkClasses.Node Node = null;
                        foreach (WorkClasses.Node node in container.Nodes)
                        {
                            if (node == nq)
                            {
                                Node = node;
                                break;
                            }
                        }
                        if ((object)Node != null)
                        {
                            //----------------
                            PromptKeywordOptions pop_ = new PromptKeywordOptions("");
                            pop_.AppendKeywordsToMessage = true;
                            pop_.AllowNone = false;
                            pop_.Keywords.Add("Base");
                            pop_.Keywords.Add("Additional");
                            pop_.Keywords.Add("Global");
                            pop_.Keywords.Default = "Base";
                            PromptResult res_ = ed.GetKeywords(pop_);
                            if (res_.Status == PromptStatus.OK)
                            {
                                switch (res_.StringResult)
                                {
                                case "Base": Node.ExplicitCuttingMethodForEndsOf3D_Bends = 0; break;

                                case "Additional": Node.ExplicitCuttingMethodForEndsOf3D_Bends = 1; break;

                                case "Global": Node.ExplicitCuttingMethodForEndsOf3D_Bends = -1; break;
                                }
                            }
                            //----------------
                        }
                        //
                    }
                    //
                }
                else
                {
                    MessageBox.Show("\nData Base Empty !\n\nMissing Bends !", "Range Error !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch { }
            finally { ed.CurrentUserCoordinateSystem = old; }
        }
コード例 #6
0
ファイル: CamCncExport.cs プロジェクト: kojtoLtd/KojtoCAD
        public void CNC_bends(StreamWriter outf, WorkClasses.Node node, double L, double Lp, double Ls, double R, double toolR, double gabaritX, double gabaritY, double gabaritZ)
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

            quaternion tempNodeNormal = node.GetNodesNormalsByNoFictiveBends(ref container);

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable acBlkTbl;
                acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord acBlkTblRec;
                acBlkTblRec = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                UCS ucs = node.CreateNodeUCS(L, ref container);
                UCS Ucs = node.CreateNodeUCS(L + Lp + Ls, ref container);

                int counter = 0;
                for (int i = 0; i < node.Bends_Numers_Array.Count; i++)
                {
                    WorkClasses.Bend b = container.Bends[node.Bends_Numers_Array[i]];
                    if (b.IsFictive())
                    {
                        continue;
                    }
                    outf.WriteLine(String.Format("(BAR {0} - PRYT NOMER {1})", counter + 1, b.Numer + 1));
                    outf.WriteLine();

                    //---------------------
                    quaternion bendNormal    = b.Normal - b.MidPoint;
                    plane      gabaritTOP    = new plane(ucs.ToACS(new quaternion(0, 10, 0, gabaritZ / 2.0)), ucs.ToACS(new quaternion(0, 100, 0, gabaritZ / 2.0)), ucs.ToACS(new quaternion(0, 0, 10, gabaritZ / 2.0)));
                    plane      gabaritBottom = new plane(ucs.ToACS(new quaternion(0, 10, 0, -gabaritZ / 2.0)), ucs.ToACS(new quaternion(0, 100, 0, -gabaritZ / 2.0)), ucs.ToACS(new quaternion(0, 0, 10, -gabaritZ / 2.0)));
                    quaternion Q1            = gabaritTOP.IntersectWithVector((b.MidPoint + b.Start) / 2.0, (b.MidPoint + b.Start) / 2.0 + bendNormal);
                    quaternion Q2            = gabaritTOP.IntersectWithVector(b.MidPoint, b.Normal);
                    Q1 = ucs.FromACS(Q1);
                    Q2 = ucs.FromACS(Q2);
                    complex cQ1     = new complex(Q1.GetX(), Q1.GetY());
                    complex cQ2     = new complex(Q2.GetX(), Q2.GetY());
                    matrix  Int_Mat = Common.IntersectCircleAndLine(R, cQ1, cQ2);
                    if (Int_Mat.GetAt(0, 4) < 0) /*ERRROR*/ return {
                        ;
                    }
                    complex    iP1       = new complex(Int_Mat.GetAt(0, 0), Int_Mat.GetAt(0, 1));
                    complex    iP2       = new complex(Int_Mat.GetAt(0, 2), Int_Mat.GetAt(0, 3));
                    complex    iP        = ((cQ2 - iP1).abs() < (cQ2 - iP2).abs()) ? iP1 : iP2;
                    quaternion iQ        = ucs.ToACS(new quaternion(0.0, iP.real(), iP.imag(), gabaritZ / 2.0));
                    quaternion cenTOP    = iQ;// gabaritTOP.IntersectWithVector(iQ, iQ + bendNormal);
                    quaternion cenBottom = gabaritBottom.IntersectWithVector(iQ, iQ + bendNormal);
                    Q2 = ucs.ToACS(Q2);
                    quaternion outTOP = Q2 - iQ; quaternion inTOP = iQ - Q2;
                    outTOP /= outTOP.abs(); inTOP /= inTOP.abs();
                    outTOP *= toolR; inTOP *= toolR;
                    outTOP  = iQ + outTOP; inTOP = iQ + inTOP;

                    // MessageBox.Show(String.Format("{0},{1},{2}\n{3},{4},{5}\n{6},{7},{8}",
                    //iQ.GetX(), iQ.GetY(), iQ.GetZ(), cenTOP.GetX(), cenTOP.GetY(), cenTOP.GetZ(), cenBottom.GetX(), cenBottom.GetY(), cenBottom.GetZ()));
                    //--------------------------
                    double     gabaritR   = Math.Sqrt(gabaritX * gabaritX / 4.0 + gabaritY * gabaritY / 4.0);
                    matrix     gabaritMat = Common.IntersectCircleAndLine(gabaritR, cQ1, cQ2);
                    complex    gabaritP1  = new complex(gabaritMat.GetAt(0, 0), gabaritMat.GetAt(0, 1));
                    complex    gabaritP2  = new complex(gabaritMat.GetAt(0, 2), gabaritMat.GetAt(0, 3));
                    complex    gabaritP   = ((cQ2 - gabaritP1).abs() < (cQ2 - gabaritP2).abs()) ? gabaritP1 : gabaritP2;
                    quaternion gabaritQ   = ucs.ToACS(new quaternion(0.0, gabaritP.real(), gabaritP.imag(), gabaritZ / 2.0));
                    //---------------------

                    bool bp = ((node.Position - b.Start).abs() < (node.Position - b.End).abs()) ? true : false;//kой край на реброто е във възела
                    Pair <quaternion, quaternion> bendAxe = (bp == true) ?
                                                            new Pair <quaternion, quaternion>(ucs.FromACS(b.Start), ucs.FromACS(b.End)) :
                                                            new Pair <quaternion, quaternion>(ucs.FromACS(b.End), ucs.FromACS(b.Start));

                    Pair <quaternion, quaternion> pa = new Pair <quaternion, quaternion>(ucs.FromACS(b.MidPoint), ucs.FromACS(b.Normal));
                    quaternion ucsOriginDescriptor   = new quaternion();
                    cenTOP   = ucs.FromACS(cenTOP); cenBottom = ucs.FromACS(cenBottom); inTOP = ucs.FromACS(inTOP); outTOP = ucs.FromACS(outTOP);
                    gabaritQ = ucs.FromACS(gabaritQ);
                    //  double test = Math.Sqrt(cenTOP.GetX() * cenTOP.GetX() + cenTOP.GetY() * cenTOP.GetY());
                    // MessageBox.Show(test.ToString());


                    double baseAng = 0.0;
                    if (((b.Normal - b.MidPoint) / (tempNodeNormal - node.Position)).absV() < Constants.zero_dist)
                    {
                        outf.WriteLine(String.Format("#110={0:f4}(ALPHA-OS C)", 0.0));
                        outf.WriteLine(String.Format("#111 = {0:f4} (BETHA-OS B)", 0.0));
                        outf.WriteLine(String.Format("#112 = {0:f4} (DELTA X-G52 X)", 0.0));
                        outf.WriteLine(String.Format("#113 = {0:f4} (DELTA Z-G52 X)", 0.0));

                        Pair <complex, complex> benAxeXY = new Pair <complex, complex>(
                            new complex(bendAxe.First.GetX(), bendAxe.First.GetY()), new complex(bendAxe.Second.GetX(), bendAxe.Second.GetY()));
                        matrix Int_M    = Common.IntersectCircleAndLine(R, benAxeXY.First, benAxeXY.Second);
                        double baseAng2 = (benAxeXY.Second - benAxeXY.First).arg();
                        if (baseAng2 > Math.PI)
                        {
                            baseAng2 = baseAng2 - 2 * Math.PI;
                        }

                        outf.WriteLine(String.Format("#114 = {0:f4} (GAMMA R-G68)", baseAng2 * 180.0 / Math.PI));

                        outf.WriteLine(String.Format("#115 = {0:f4} (OBRABOTKA NAD Z=0)", gabaritZ / 2.0 + 5.0));
                        outf.WriteLine(String.Format("#116 = {0:f4} (OBRABOTKA POD Z=0)", -gabaritZ / 2.0 - 2.0));
                    }
                    else
                    {
                        quaternion nB1 = ucs.FromACS(b.Normal);
                        quaternion nB2 = ucs.FromACS(b.MidPoint);
                        complex    cN1 = new complex(nB1.GetX(), nB1.GetY());
                        complex    cN2 = new complex(nB2.GetX(), nB2.GetY());
                        line2d     projectTo_ucsXY_Line = new line2d(cN1, cN2);

                        complex normalTo_projectTo_ucsXY_Line = new complex(projectTo_ucsXY_Line.A, projectTo_ucsXY_Line.B);
                        normalTo_projectTo_ucsXY_Line /= normalTo_projectTo_ucsXY_Line.abs();
                        normalTo_projectTo_ucsXY_Line *= -1.0;

                        baseAng = normalTo_projectTo_ucsXY_Line.arg();
                        if (baseAng > Math.PI)
                        {
                            baseAng = baseAng - 2 * Math.PI;
                        }

                        outf.WriteLine(String.Format("#110={0:f4}(ALPHA-OS C)", -((-baseAng + Math.PI / 2.0) * 180.0 / Math.PI)));

                        pa.First.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);
                        pa.Second.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);

                        bendAxe.First.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);
                        bendAxe.Second.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);

                        ucsOriginDescriptor.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);

                        cenTOP.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);
                        cenBottom.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);
                        inTOP.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);
                        outTOP.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);
                        gabaritQ.set_rotateAroundAxe(new quaternion(0, 0, 0, 100.0), -baseAng + Math.PI / 2.0);

                        pa                  = new Pair <quaternion, quaternion>(ucs.ToACS(pa.First), ucs.ToACS(pa.Second));
                        bendAxe             = new Pair <quaternion, quaternion>(ucs.ToACS(bendAxe.First), ucs.ToACS(bendAxe.Second));
                        ucsOriginDescriptor = ucs.ToACS(ucsOriginDescriptor);
                        cenTOP              = ucs.ToACS(cenTOP); cenBottom = ucs.ToACS(cenBottom); inTOP = ucs.ToACS(inTOP); outTOP = ucs.ToACS(outTOP);
                        gabaritQ            = ucs.ToACS(gabaritQ);

                        pa                  = new Pair <quaternion, quaternion>(Ucs.FromACS(pa.First), Ucs.FromACS(pa.Second));
                        bendAxe             = new Pair <quaternion, quaternion>(Ucs.FromACS(bendAxe.First), Ucs.FromACS(bendAxe.Second));
                        ucsOriginDescriptor = Ucs.FromACS(ucsOriginDescriptor);
                        cenTOP              = Ucs.FromACS(cenTOP); cenBottom = Ucs.FromACS(cenBottom); inTOP = Ucs.FromACS(inTOP); outTOP = Ucs.FromACS(outTOP);
                        gabaritQ            = Ucs.FromACS(gabaritQ);

                        quaternion normal = (pa.Second - pa.First) * 1000.0;
                        pa = new Pair <quaternion, quaternion>(pa.First, pa.First + normal);
                        double k = (pa.Second.GetX() < pa.First.GetX()) ? 1.0 : -1.0;

                        double ang = (pa.Second - pa.First).angTo(new quaternion(0, 0, 0, 100));
                        ang *= k;
                        outf.WriteLine(String.Format("#111 = {0:f4} (BETHA-OS B)", ang * 180.0 / Math.PI));

                        pa.First.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);
                        pa.Second.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);

                        bendAxe.First.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);
                        bendAxe.Second.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);

                        ucsOriginDescriptor.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);

                        cenTOP.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);
                        cenBottom.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);
                        inTOP.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);
                        outTOP.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);
                        gabaritQ.set_rotateAroundAxe(new quaternion(0, 0, 100.0, 0.0), ang);

                        pa                  = new Pair <quaternion, quaternion>(Ucs.ToACS(pa.First), Ucs.ToACS(pa.Second));
                        bendAxe             = new Pair <quaternion, quaternion>(Ucs.ToACS(bendAxe.First), Ucs.ToACS(bendAxe.Second));
                        ucsOriginDescriptor = Ucs.ToACS(ucsOriginDescriptor);
                        cenTOP              = Ucs.ToACS(cenTOP); cenBottom = Ucs.ToACS(cenBottom); inTOP = Ucs.ToACS(inTOP); outTOP = Ucs.ToACS(outTOP);
                        gabaritQ            = Ucs.ToACS(gabaritQ);

                        pa                  = new Pair <quaternion, quaternion>(ucs.FromACS(pa.First), ucs.FromACS(pa.Second));
                        bendAxe             = new Pair <quaternion, quaternion>(ucs.FromACS(bendAxe.First), ucs.FromACS(bendAxe.Second));
                        ucsOriginDescriptor = ucs.FromACS(ucsOriginDescriptor);
                        cenTOP              = ucs.FromACS(cenTOP); cenBottom = ucs.FromACS(cenBottom); inTOP = ucs.FromACS(inTOP); outTOP = ucs.FromACS(outTOP);
                        gabaritQ            = ucs.FromACS(gabaritQ);
                        outf.WriteLine(String.Format("#112 = {0:f4} (DELTA X-G52 X)", ucsOriginDescriptor.GetX()));
                        outf.WriteLine(String.Format("#113 = {0:f4} (DELTA Z-G52 X)", ucsOriginDescriptor.GetZ()));
                        double backX = ucsOriginDescriptor.GetX();
                        double backZ = ucsOriginDescriptor.GetZ();

                        quaternion moveQ = new quaternion(0, -backX, 0.0, -backZ);
                        pa                   = new Pair <quaternion, quaternion>(pa.First + moveQ, pa.Second + moveQ);
                        bendAxe              = new Pair <quaternion, quaternion>(bendAxe.First + moveQ, bendAxe.Second + moveQ);
                        ucsOriginDescriptor += moveQ;
                        cenTOP              += moveQ; cenBottom += moveQ; inTOP += moveQ; outTOP += moveQ;
                        gabaritQ            += moveQ;

                        Pair <complex, complex> benAxeXY = new Pair <complex, complex>(
                            new complex(bendAxe.First.GetX(), bendAxe.First.GetY()), new complex(bendAxe.Second.GetX(), bendAxe.Second.GetY()));
                        matrix Int_M = Common.IntersectCircleAndLine(R, benAxeXY.First, benAxeXY.Second);

                        complex Int_P1   = new complex(Int_M.GetAt(0, 0), Int_M.GetAt(0, 1));
                        complex Int_P2   = new complex(Int_M.GetAt(0, 2), Int_M.GetAt(0, 3));
                        complex Int_P    = ((benAxeXY.Second - Int_P1).abs() < (benAxeXY.Second - Int_P2).abs()) ? Int_P1 : Int_P2;
                        double  baseAng2 = (benAxeXY.Second - benAxeXY.First).arg();
                        if (baseAng2 > Math.PI)
                        {
                            baseAng2 = baseAng2 - 2 * Math.PI;
                        }

                        outf.WriteLine(String.Format("#114 = {0:f4} (GAMMA R-G68)", baseAng2 * 180.0 / Math.PI));

                        //----------------------
                        pa                  = new Pair <quaternion, quaternion>(ucs.ToACS(pa.First), ucs.ToACS(pa.Second));
                        bendAxe             = new Pair <quaternion, quaternion>(ucs.ToACS(bendAxe.First), ucs.ToACS(bendAxe.Second));
                        ucsOriginDescriptor = ucs.ToACS(ucsOriginDescriptor);
                        cenTOP              = ucs.ToACS(cenTOP); cenBottom = ucs.ToACS(cenBottom); inTOP = ucs.ToACS(inTOP); outTOP = ucs.ToACS(outTOP);
                        gabaritQ            = ucs.ToACS(gabaritQ);
                        quaternion gabaritB = gabaritQ + cenBottom - cenTOP;
                        quaternion inBottom = inTOP + cenBottom - cenTOP;

                        double positiveZ = (ucs.FromACS(gabaritQ).GetZ() > ucs.FromACS(inTOP).GetZ()) ? ucs.FromACS(gabaritQ).GetZ() + 5.0 : ucs.FromACS(inTOP).GetZ() + 5.0;
                        double negativeZ = (ucs.FromACS(gabaritB).GetZ() < ucs.FromACS(inBottom).GetZ()) ? ucs.FromACS(gabaritB).GetZ() - 2.0 : ucs.FromACS(inBottom).GetZ() - 2.0;

                        outf.WriteLine(String.Format("#115 = {0:f4} (OBRABOTKA NAD Z=0)", positiveZ));
                        outf.WriteLine(String.Format("#116 = {0:f4} (OBRABOTKA POD Z=0)", negativeZ));

                        #region draw test1

                        /*
                         * Line LL = new Line((Point3d)pa.First, (Point3d)pa.Second);
                         * LL.ColorIndex = 1;
                         * acBlkTblRec.AppendEntity(LL);
                         * tr.AddNewlyCreatedDBObject(LL, true);
                         *
                         * Line LLL = new Line((Point3d)inTOP, (Point3d)outTOP);
                         * LLL.ColorIndex = 1;
                         * acBlkTblRec.AppendEntity(LLL);
                         * tr.AddNewlyCreatedDBObject(LLL, true);
                         *
                         *
                         * Line LLLL = new Line((Point3d)cenTOP, (Point3d)cenBottom);
                         * LLLL.ColorIndex = 1;
                         * acBlkTblRec.AppendEntity(LLLL);
                         * tr.AddNewlyCreatedDBObject(LLLL, true);
                         *
                         * Line LLLLL = new Line((Point3d)bendAxe.First, (Point3d)bendAxe.Second);
                         * LLLLL.ColorIndex = 1;
                         * acBlkTblRec.AppendEntity(LLLLL);
                         * tr.AddNewlyCreatedDBObject(LLLLL, true);
                         *
                         * Line PP = new Line((Point3d)outTOP, (Point3d)gabaritQ);
                         * PP.ColorIndex = 2;
                         * acBlkTblRec.AppendEntity(PP);
                         * tr.AddNewlyCreatedDBObject(PP, true);
                         *
                         * Line PPP = new Line((Point3d)gabaritB, (Point3d)gabaritQ);
                         * PPP.ColorIndex = 2;
                         * acBlkTblRec.AppendEntity(PPP);
                         * tr.AddNewlyCreatedDBObject(PPP, true);
                         *
                         * Line PPPP = new Line((Point3d)inBottom, (Point3d)inTOP);
                         * PPPP.ColorIndex = 2;
                         * acBlkTblRec.AppendEntity(PPPP);
                         * tr.AddNewlyCreatedDBObject(PPPP, true);
                         */
                        #endregion
                    }

                    outf.WriteLine("G65P1401");
                    outf.WriteLine("M1");
                    outf.WriteLine();

                    counter++;
                }

                //outf.WriteLine(String.Format("G43{0}", G43H));
                tr.Commit();
                Application.DocumentManager.MdiActiveDocument.Editor.UpdateScreen();
            }
コード例 #7
0
ファイル: Normals.cs プロジェクト: kojtoLtd/KojtoCAD
        public void KojtoCAD_3D_SetExplicitNodeNormalByNodePosition()
        {
            if ((container != null) && (container.Bends.Count > 0) && (container.Nodes.Count > 0) && (container.Triangles.Count > 0))
            {
                Database db = HostApplicationServices.WorkingDatabase;
                Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

                Matrix3d old = ed.CurrentUserCoordinateSystem;
                ed.CurrentUserCoordinateSystem = Matrix3d.Identity;

                try
                {
                    PromptPointResult  pPtRes;
                    PromptPointOptions pPtOpts = new PromptPointOptions("");

                    pPtOpts.Message = "\nEnter the Point of the Node: ";
                    pPtRes          = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint(pPtOpts);

                    if (pPtRes.Status == PromptStatus.OK)
                    {
                        quaternion       nq   = new quaternion(0, pPtRes.Value.X, pPtRes.Value.Y, pPtRes.Value.Z);
                        WorkClasses.Node Node = null;
                        foreach (WorkClasses.Node node in container.Nodes)
                        {
                            if (node == nq)
                            {
                                Node = node;
                                break;
                            }
                        }
                        if ((object)Node != null)
                        {
                            PromptKeywordOptions pKeyOpts = new PromptKeywordOptions("");
                            pKeyOpts.Message = "\nEnter an option ";
                            pKeyOpts.Keywords.Add("Selection");
                            pKeyOpts.Keywords.Add("NodeCentroid");
                            pKeyOpts.Keywords.Default = "Selection";
                            pKeyOpts.AllowNone        = true;
                            PromptResult pKeyRes = Application.DocumentManager.MdiActiveDocument.Editor.GetKeywords(pKeyOpts);
                            if (pKeyRes.Status == PromptStatus.OK)
                            {
                                PromptDoubleOptions pDoubleOpts = new PromptDoubleOptions("");
                                pDoubleOpts.Message       = "\n Enter Explicit Length of the Normal: ";
                                pDoubleOpts.DefaultValue  = 1.0;
                                pDoubleOpts.AllowZero     = false;
                                pDoubleOpts.AllowNegative = false;

                                PromptDoubleResult pDoubleRes = Application.DocumentManager.MdiActiveDocument.Editor.GetDouble(pDoubleOpts);
                                if (pDoubleRes.Status == PromptStatus.OK)
                                {
                                    switch (pKeyRes.StringResult)
                                    {
                                    case "NodeCentroid":
                                        quaternion q = GetNodeCentroidByNoFictiveBendsMidPoints(Node.Numer);
                                        q  = ((q - Node.Position).angTo(Node.Normal - Node.Position) <= Math.PI / 2.0) ? q - Node.Position : Node.Position - q;
                                        q /= q.abs();
                                        q += Node.Position;
                                        Node.SetExplicitNormal(q);
                                        Node.ExplicitNormalLength = pDoubleRes.Value;
                                        break;

                                    case "Selection":
                                        PromptPointResult  pPtRes_;
                                        PromptPointOptions pPtOpts_ = new PromptPointOptions("");
                                        pPtOpts_.Message = "\nEnter the Direction Point of the Normal: ";
                                        pPtRes_          = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint(pPtOpts_);
                                        if (pPtRes_.Status == PromptStatus.OK)
                                        {
                                            quaternion Q = new quaternion(0, pPtRes_.Value.X, pPtRes_.Value.Y, pPtRes_.Value.Z);
                                            Q  = ((Q - Node.Position).angTo(Node.Normal - Node.Position) <= Math.PI / 2.0) ? Q - Node.Position : Node.Position - Q;
                                            Q /= Q.abs();
                                            Q += Node.Position;
                                            Node.SetExplicitNormal(Q);
                                            Node.ExplicitNormalLength = pDoubleRes.Value;
                                        }
                                        else
                                        {
                                            MessageBox.Show("\nPoint not found - E R R O R  !", "E R R O R - Selection Point", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                            ed.WriteMessage("\nPoint not found - E R R O R  !");
                                        }
                                        break;
                                    }
                                }
                            }
                        }
                        else
                        {
                            MessageBox.Show("\nNode not found - E R R O R  !", "E R R O R - Selection Node", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            ed.WriteMessage("\nNode not found - E R R O R  !");
                        }
                    }
                }
                catch { }
                finally { ed.CurrentUserCoordinateSystem = old; }
            }
            else
            {
                MessageBox.Show("\nData Base Empty !\n", "Range Error !", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }