Ejemplo n.º 1
0
        public void WeldingLineStart()
        {
            #region Select welding mode
            var weldingModeOpts = new PromptKeywordOptions("\nWeld over points or object? ");
            weldingModeOpts.Keywords.Add("Points");
            weldingModeOpts.Keywords.Add("polYline");
            weldingModeOpts.Keywords.Add("Line");
            weldingModeOpts.Keywords.Add("Circle");
            weldingModeOpts.Keywords.Add("Arc");
            weldingModeOpts.Keywords.Add("Block");
            weldingModeOpts.Keywords.Default = "Points";

            var weldingModeRslt = _ed.GetKeywords(weldingModeOpts);
            // If the user pressed cancel - return with no error
            if (weldingModeRslt.Status != PromptStatus.OK)
            {
                return;
            }

            if (weldingModeRslt.StringResult == "Block")
            {
                ImportInsulationBlock();
                return;
            }

            var selectedObjectId = new ObjectId();
            // If the user selected Points mode
            if (weldingModeRslt.StringResult == "Points")
            {
                //Prompt the user for vertices
                _weldingVertices.Clear();
                _weldingVertices = GetPointsFromUser();
                if (_weldingVertices.Count < 1)
                {
                    return;
                }
            }
            // Else the user selected an Object mode from the list
            else
            {
                // Prompt for object
                var objectSelectionOpts = new PromptEntityOptions("\nSelect the object : ");
                objectSelectionOpts.SetRejectMessage("\nEntity is not of the predifined type :" + weldingModeRslt.StringResult);
                objectSelectionOpts.AddAllowedClass(typeof(Line), false);
                objectSelectionOpts.AddAllowedClass(typeof(Polyline), false);
                objectSelectionOpts.AddAllowedClass(typeof(Circle), false);
                objectSelectionOpts.AddAllowedClass(typeof(Arc), false);

                var objectSelectionRslt = _ed.GetEntity(objectSelectionOpts);
                // If the user pressed cancel - return with no error
                if (objectSelectionRslt.Status != PromptStatus.OK)
                {
                    return;
                }
                // else get the slected object id and type
                selectedObjectId = objectSelectionRslt.ObjectId;
            }
            #endregion

            #region Welding side selection

            // Prompt the user to select object side M for middle - draw on the middle of the line or Point - for side.
            var weldingSideOpts = new PromptKeywordOptions("\nPick side point or draw in the middle. ");
            weldingSideOpts.Keywords.Add("Side");
            weldingSideOpts.Keywords.Add("Middle ");
            weldingSideOpts.Keywords.Default = "Side";
            var weldingSideRslt = _ed.GetKeywords(weldingSideOpts);
            // If the user pressed cancel - return with no error
            if (weldingSideRslt.Status != PromptStatus.OK)
            {
                return;
            }

            // If tThe user selected 'Side'
            var sidePoint = new Point3d();
            if (weldingSideRslt.StringResult == "Side")
            {
                // Prompt the user to pick up a side point on the desired side.
                var sidePointOpts = new PromptPointOptions("\nPick side point : ");
                var sidePointRslt = _ed.GetPoint(sidePointOpts);
                // If the user pressed cancel - return with no error
                if (sidePointRslt.Status != PromptStatus.OK)
                {
                    return;
                }
                sidePoint = sidePointRslt.Value;
            }
            // Else If the user selected 'Middle'
            else if (weldingSideRslt.StringResult == "Middle")
            {
                sidePoint = new Point3d(0, 0, 0);
            }
            // else
            // Not supposed to end here, because the choise in the prompt is restricted to two options
            #endregion

            #region Welding arcs lenght and distance selection

            // Prompt the user to set welding arcs lenght
            var weldingArcsChordOpts = new PromptDoubleOptions("\nWelding arcs lenght : ")
            {
                UseDefaultValue = true,
                DefaultValue    = Settings.Default.WeldingArcsLenght
            };

            var weldingArcsChordRslt = _ed.GetDouble(weldingArcsChordOpts);
            // If the user pressed cancel - return with no error
            if (weldingArcsChordRslt.Status != PromptStatus.OK)
            {
                return;
            }
            if (weldingArcsChordRslt.Value <= 0)
            {
                _ed.WriteMessage("Lenght must be positive number.");
                return;
            }
            Settings.Default.WeldingArcsLenght = weldingArcsChordRslt.Value;
            //else
            // The choice is Ok and lenght is provided. Continue...

            // Prompt the user to set the distance between the welding arcs
            var weldingArcsDistanceOpts = new PromptDoubleOptions("\nSet the distance between the welding arcs : ")
            {
                UseDefaultValue = true,
                DefaultValue    = Settings.Default.WeldingArcsDistance
            };
            var weldingArcsOffsetRslt = _ed.GetDouble(weldingArcsDistanceOpts);
            // If the user pressed cancel - return with no error
            if (weldingArcsOffsetRslt.Status != PromptStatus.OK)
            {
                return;
            }
            if (weldingArcsOffsetRslt.Value <= 0)
            {
                _ed.WriteMessage("Distance must be positive number.");
            }
            Settings.Default.WeldingArcsDistance = weldingArcsOffsetRslt.Value;
            Settings.Default.Save();
            //else
            // The choice is Ok and distance is provided. Continue...
            #endregion

            #region Hand over the process to the specific drawing function
            _weldingArcs.Clear();

            switch (weldingModeRslt.StringResult)
            {
                #region Points
            case "Points":

                for (var i = 0; i < _weldingVertices.Count; i++)
                {
                    // слага ги в глобалната
                    _weldingVertices[i] = _weldingVertices[i].TransformBy(GeometryUtility.GetTransforMatrixToWcs());
                }
                using (var tr = _doc.Database.TransactionManager.StartTransaction())
                {
                    var sPt = new Point3d(sidePoint.X + 0.00001, sidePoint.Y + 0.00001, sidePoint.Z);
                    sPt = sPt.TransformBy(GeometryUtility.GetTransforMatrixToWcs());
                    // реперната точка и тя в глобалната

                    var tP1 = new Point3d(0, 0, 0);
                    var tP2 = new Point3d(_weldingVertices[1].X - _weldingVertices[0].X, _weldingVertices[1].Y - _weldingVertices[0].Y, _weldingVertices[1].Z - _weldingVertices[0].Z);
                    var tP3 = new Point3d(sPt.X - _weldingVertices[0].X, sPt.Y - _weldingVertices[0].Y, sPt.Z - _weldingVertices[0].Z);


                    var ucs = GeometryUtility.GetUcs(tP1, tP2, tP3, false);
                    for (var i = 0; i < _weldingVertices.Count; i++)
                    {
                        _weldingVertices[i] = _weldingVertices[i].TransformBy(ucs);
                    }
                    if (weldingSideRslt.StringResult == "Side")
                    {
                        sidePoint = sidePoint.TransformBy(_ed.CurrentUserCoordinateSystem);
                        sidePoint = sidePoint.TransformBy(ucs);
                    }

                    var oldUcs = _ed.CurrentUserCoordinateSystem;
                    _ed.CurrentUserCoordinateSystem = Matrix3d.Identity;

                    _weldingArcs = BuildWeldingArcsOverPts(_weldingVertices,
                                                           sidePoint,
                                                           weldingArcsChordRslt.Value,
                                                           weldingArcsOffsetRslt.Value,
                                                           weldingArcsOffsetRslt.Value / 2);
                    DrawWeldingLine(_weldingArcs, tr);

                    _ed.CurrentUserCoordinateSystem = oldUcs;

                    foreach (Arc a in _weldingArcs)
                    {
                        a.TransformBy(ucs.Inverse());
                    }


                    tr.Commit();
                }
                break;
                #endregion

                #region Line
            case "Line":
                using (var tr = _doc.Database.TransactionManager.StartTransaction())
                {
                    _weldingVertices.Clear();

                    var ent  = tr.GetObject(selectedObjectId, OpenMode.ForRead) as Entity;                                                                     // Lishkov 07/07/2012
                    var name = ent.GetType().ToString();                                                                                                       // Lishkov 07/07/2012
                    if ((name.IndexOf("Line") < 0) || (name.IndexOf("Polyline") >= 0))
                    {
                        MessageBox.Show("Selection is not  Line !", "E R R O R"); break;
                    }                                                                                                                                             // Lishkov 07/07/2012

                    var weldingLine = (Line)tr.GetObject(selectedObjectId, OpenMode.ForWrite);

                    var sPt = new Point3d(sidePoint.X + 0.00001, sidePoint.Y + 0.00001, sidePoint.Z);
                    sPt = sPt.TransformBy(GeometryUtility.GetTransforMatrixToWcs());

                    var tP1 = new Point3d(0, 0, 0);
                    var tP2 = new Point3d(weldingLine.EndPoint.X - weldingLine.StartPoint.X, weldingLine.EndPoint.Y - weldingLine.StartPoint.Y, weldingLine.EndPoint.Z - weldingLine.StartPoint.Z);
                    var tP3 = new Point3d(sPt.X - weldingLine.StartPoint.X, sPt.Y - weldingLine.StartPoint.Y, sPt.Z - weldingLine.StartPoint.Z);

                    var ucs = GeometryUtility.GetUcs(tP1, tP2, tP3, false);
                    weldingLine.TransformBy(ucs);
                    if (weldingSideRslt.StringResult == "Side")
                    {
                        sidePoint = sidePoint.TransformBy(_ed.CurrentUserCoordinateSystem);
                        sidePoint = sidePoint.TransformBy(ucs);
                    }

                    var oldUcs = _ed.CurrentUserCoordinateSystem;
                    _ed.CurrentUserCoordinateSystem = Matrix3d.Identity;

                    _weldingVertices.Add(weldingLine.StartPoint);
                    _weldingVertices.Add(weldingLine.EndPoint);

                    _weldingArcs = BuildWeldingArcsOverPts(_weldingVertices,
                                                           sidePoint,
                                                           weldingArcsChordRslt.Value,
                                                           weldingArcsOffsetRslt.Value,
                                                           weldingArcsOffsetRslt.Value / 2);
                    DrawWeldingLine(_weldingArcs, tr);

                    _ed.CurrentUserCoordinateSystem = oldUcs;

                    foreach (Arc a in _weldingArcs)
                    {
                        a.TransformBy(ucs.Inverse());
                    }

                    weldingLine.TransformBy(ucs.Inverse());


                    tr.Commit();
                }

                break;
                #endregion

                #region Polyline
            case "polYline":
            case "Polyline":
            case "polyline":

                using (var tr = _doc.Database.TransactionManager.StartTransaction())
                {
                    var weldingPoly = tr.GetObject(selectedObjectId, OpenMode.ForWrite) as Polyline;
                    if (weldingPoly == null)
                    {
                        MessageBox.Show("Selection is not  PolyLine !", "E R R O R");
                        break;
                    }

                    var temp  = new Point3dCollection();
                    var temp1 = new Point3dCollection();
                    DBObjectCollection acDbObjColl = null;     //acPoly.GetOffsetCurves(0.25);

                    var acBlkTbl    = tr.GetObject(_db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    var acBlkTblRec = (BlockTableRecord)tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                    //офсетирано копие
                    acDbObjColl = weldingPoly.GetOffsetCurves(0.001);    //тестова на много малко разстояние от оригинала // Lishkov 07/07/2012
                    foreach (Entity acEnt in acDbObjColl)
                    {
                        // Add each offset object
                        acBlkTblRec.AppendEntity(acEnt);
                        tr.AddNewlyCreatedDBObject(acEnt, true);
                    }
                    Polyline weldingPolyOffset = null;
                    try
                    {
                        weldingPolyOffset = tr.GetObject(acDbObjColl[0].ObjectId, OpenMode.ForWrite) as Polyline;
                    }
                    catch { }
                    if (weldingPolyOffset != null)
                    {
                        //точките деления по двете полилинии
                        temp  = GeometryUtility.DividePoly(ref weldingPoly, weldingArcsOffsetRslt.Value);
                        temp1 = GeometryUtility.DividePoly(ref weldingPolyOffset, weldingArcsOffsetRslt.Value);

                        //проверка вярна ли е посоката на офсетиране
                        var tP    = sidePoint.TransformBy(GeometryUtility.GetTransforMatrixToWcs());
                        var dist1 = temp[0].DistanceTo(tP);
                        var dist2 = temp1[0].DistanceTo(tP);

                        foreach (Point3d p in temp)
                        {
                            if (p.DistanceTo(tP) < dist1)
                            {
                                dist1 = p.DistanceTo(tP);
                            }
                        }
                        foreach (Point3d p in temp1)
                        {
                            if (p.DistanceTo(tP) < dist2)
                            {
                                dist2 = p.DistanceTo(tP);
                            }
                        }

                        //ако не е вярна посоката на офсетиране
                        #region
                        if (dist1 < dist2)    //ако посоката е грешна изтриваме тестовата и правим в обратна поскока на зададеното разстояние
                        {
                            weldingPolyOffset.Erase();
                            acDbObjColl = weldingPoly.GetOffsetCurves(-weldingArcsChordRslt.Value);
                            foreach (Entity acEnt in acDbObjColl)
                            {
                                // Add each offset object
                                acBlkTblRec.AppendEntity(acEnt);
                                tr.AddNewlyCreatedDBObject(acEnt, true);
                            }
                            try
                            {
                                weldingPolyOffset = tr.GetObject(acDbObjColl[0].ObjectId, OpenMode.ForWrite) as Polyline;
                            }
                            catch
                            {
                                MessageBox.Show("Offset error", "E R R O R");
                                return;
                            }
                            temp1 = GeometryUtility.DividePoly(ref weldingPolyOffset, weldingArcsOffsetRslt.Value);
                        }
                        else     //ако посоката е вярна изтриваме тестовата и правим в същата поскока на зададеното разстояние // Lishkov 07/07/2012
                        {
                            weldingPolyOffset.Erase();
                            acDbObjColl = weldingPoly.GetOffsetCurves(weldingArcsChordRslt.Value);
                            foreach (Entity acEnt in acDbObjColl)
                            {
                                // Add each offset object
                                acBlkTblRec.AppendEntity(acEnt);
                                tr.AddNewlyCreatedDBObject(acEnt, true);
                            }
                            try
                            {
                                weldingPolyOffset = tr.GetObject(acDbObjColl[0].ObjectId, OpenMode.ForWrite) as Polyline;
                            }
                            catch
                            {
                                MessageBox.Show("Offset error", "E R R O R");
                                return;
                            }
                            temp1 = GeometryUtility.DividePoly(ref weldingPolyOffset, weldingArcsOffsetRslt.Value);
                        }
                        #endregion

                        //work
                        var oldUcs = _ed.CurrentUserCoordinateSystem;
                        _ed.CurrentUserCoordinateSystem = Matrix3d.Identity;

                        for (var i = 0; i < temp.Count - 1; i++)
                        {
                            var tempP = temp1[0];
                            var oP    = temp1[0];
                            foreach (Point3d p in temp1)
                            {
                                if (temp[i].DistanceTo(p) < temp[i].DistanceTo(tempP))
                                {
                                    oP    = tempP;
                                    tempP = p;
                                }
                            }

                            var ucs = GeometryUtility.GetUcs(temp[i], temp[i + 1], tempP, true);

                            Arc acArc;
                            if (weldingSideRslt.StringResult != "Side")
                            {
                                acArc = new Arc(
                                    new Point3d(0, 0, 0),
                                    weldingArcsChordRslt.Value / 2,
                                    Math.PI / 2.0 + Math.PI,
                                    Math.PI / 2.0 + Math.PI + Math.PI
                                    );
                            }
                            else
                            {
                                // BricsCAD hack
                                acArc = new Arc(
                                    new Point3d(),
                                    weldingArcsChordRslt.Value / 2,
                                    Math.PI / 2.0 + Math.PI,
                                    Math.PI / 2.0 + Math.PI + Math.PI
                                    )
                                {
                                    Center = new Point3d(0, weldingArcsChordRslt.Value / 2, 0)
                                };
                            }

                            _weldingArcs.Add(acArc);
                            try
                            {
                                acArc.TransformBy(ucs);
                            }
                            catch
                            {
                                _weldingArcs.RemoveAt(_weldingArcs.Count - 1);
                                if (i > 0)
                                {
                                    var tP1 = new Point3d(0, 0, 0);
                                    var tP2 = new Point3d(temp[i].X - temp[i - 1].X, temp[i].Y - temp[i - 1].Y, temp[i].Z - temp[i - 1].Z);
                                    var tP3 = new Point3d(oP.X - temp[i - 1].X, oP.Y - temp[i - 1].Y, oP.Z - temp[i - 1].Z);

                                    ucs = GeometryUtility.GetUcs(tP1, tP2, tP3, true);
                                    try
                                    {
                                        _weldingArcs.Add(acArc);
                                        var lp1 = new Point3d(0, 0, 0);
                                        var lp2 = new Point3d(weldingArcsOffsetRslt.Value, 0, 0);
                                        var l   = new Line3d(acArc.StartPoint, acArc.EndPoint);
                                        acArc.TransformBy(Matrix3d.Displacement(lp1.GetVectorTo(lp2)));
                                        acArc.TransformBy(ucs);
                                        acArc.TransformBy(Matrix3d.Displacement(-temp[i - 1].GetVectorTo(Point3d.Origin)));
                                    }
                                    catch
                                    {
                                        _weldingArcs.RemoveAt(_weldingArcs.Count - 1);
                                    }
                                }
                            }
                            acArc.SetDatabaseDefaults();
                        }
                        if (!weldingPoly.Closed)
                        {
                            var acA   = (Arc)_weldingArcs[_weldingArcs.Count - 1];
                            var acArc = (Entity)acA.Clone();
                            acArc.TransformBy(Matrix3d.Displacement(temp[temp.Count - 2].GetVectorTo(temp[temp.Count - 1])));
                            _weldingArcs.Add(acArc);
                        }
                        weldingPolyOffset.Erase();
                        DrawWeldingLine(_weldingArcs, tr);
                        _ed.CurrentUserCoordinateSystem = oldUcs;
                    }
                    tr.Commit();
                }
                break;
                #endregion

                #region Circle
            case "Circle":
                // ElseIf the user picked up object of type 'arc' or 'circle'
                //    Call the function that makes welding over arc or circle.
                //    _Circle is an Arc with start angle of 0 and end angle of 360
                using (var tr = _doc.Database.TransactionManager.StartTransaction())
                {
                    var weldingCircle = tr.GetObject(selectedObjectId, OpenMode.ForRead) as Circle;
                    if (weldingCircle != null)
                    {
                        using (var T = _doc.Database.TransactionManager.StartTransaction())
                        {
                            var weldingLine = T.GetObject(selectedObjectId, OpenMode.ForWrite) as Circle;

                            var r = new Ray
                            {
                                BasePoint = weldingLine.Center,
                                UnitDir   = weldingLine.Center.GetVectorTo(weldingLine.StartPoint)
                            };

                            var pts = new Point3dCollection();
                            weldingLine.IntersectWith(r, Intersect.OnBothOperands, pts, IntPtr.Zero, IntPtr.Zero);

                            var sPt = new Point3d(sidePoint.X + 0.00001, sidePoint.Y + 0.00001, sidePoint.Z);
                            sPt = sPt.TransformBy(GeometryUtility.GetTransforMatrixToWcs());
                            var ucs = GeometryUtility.GetUcs(weldingLine.Center, pts[0], sPt, false);
                            weldingLine.TransformBy(ucs);
                            if (weldingSideRslt.StringResult == "Side")
                            {
                                sidePoint = sidePoint.TransformBy(_ed.CurrentUserCoordinateSystem);
                                sidePoint = sidePoint.TransformBy(ucs);
                            }

                            var oldUcs = _ed.CurrentUserCoordinateSystem;
                            _ed.CurrentUserCoordinateSystem = Matrix3d.Identity;



                            var arcSide = GeometryUtility.SideOfPointToArc(weldingCircle.Center, weldingCircle.Radius, sidePoint);
                            var sAng    = -1 + weldingCircle.Center.DistanceTo(sidePoint) / weldingCircle.Radius;
                            _weldingArcs = BuildWeldingArcsOverArc(weldingCircle.Center,
                                                                   weldingCircle.Radius,
                                                                   0.0,
                                                                   2 * Math.PI,
                                                                   /* sAng ,  */
                                                                   weldingArcsChordRslt.Value,
                                                                   weldingArcsOffsetRslt.Value,
                                                                   0,
                                                                   arcSide);
                            DrawWeldingLine(_weldingArcs, T);

                            _ed.CurrentUserCoordinateSystem = oldUcs;
                            foreach (Arc a in _weldingArcs)
                            {
                                a.TransformBy(ucs.Inverse());
                            }
                            weldingLine.TransformBy(ucs.Inverse());

                            T.Commit();
                        }
                    }
                    else
                    {
                        MessageBox.Show("\nYou did not slected object of type Circle. Try again...");
                    }
                    tr.Commit();
                }
                break;
                #endregion

                #region Arc
            case "Arc":
                using (var tr = _doc.Database.TransactionManager.StartTransaction())
                {
                    var weldingArc = tr.GetObject(selectedObjectId, OpenMode.ForRead) as Arc;
                    if (weldingArc != null)
                    {
                        using (var T = _doc.Database.TransactionManager.StartTransaction())
                        {
                            var weldingLine = T.GetObject(selectedObjectId, OpenMode.ForWrite) as Arc;

                            var sPt = sidePoint.TransformBy(GeometryUtility.GetTransforMatrixToWcs());

                            var tP1 = new Point3d(0, 0, 0);
                            var tP2 = new Point3d(weldingLine.EndPoint.X - weldingLine.StartPoint.X, weldingLine.EndPoint.Y - weldingLine.StartPoint.Y, weldingLine.EndPoint.Z - weldingLine.StartPoint.Z);
                            var tP3 = new Point3d(sPt.X - weldingLine.StartPoint.X, sPt.Y - weldingLine.StartPoint.Y, sPt.Z - weldingLine.StartPoint.Z);

                            var ucs = GeometryUtility.GetUcs(tP1, tP2, tP3, false);
                            weldingLine.TransformBy(ucs);
                            if (weldingSideRslt.StringResult == "Side")
                            {
                                sidePoint = sidePoint.TransformBy(_ed.CurrentUserCoordinateSystem);
                                sidePoint = sidePoint.TransformBy(ucs);
                            }

                            var oldUcs = _ed.CurrentUserCoordinateSystem;
                            _ed.CurrentUserCoordinateSystem = Matrix3d.Identity;



                            var arcSide = GeometryUtility.SideOfPointToArc(weldingArc.Center, weldingArc.Radius, sidePoint);

                            var sAng = -1 + weldingArc.Center.DistanceTo(sidePoint) / weldingArc.Radius;

                            _weldingArcs = BuildWeldingArcsOverArc(weldingArc.Center,
                                                                   weldingArc.Radius,
                                                                   weldingArc.StartAngle,
                                                                   weldingArc.EndAngle,
                                                                   weldingArcsChordRslt.Value,
                                                                   weldingArcsOffsetRslt.Value,
                                                                   weldingArcsOffsetRslt.Value / 2,
                                                                   arcSide);

                            DrawWeldingLine(_weldingArcs, T);

                            _ed.CurrentUserCoordinateSystem = oldUcs;

                            foreach (Arc a in _weldingArcs)
                            {
                                a.TransformBy(ucs.Inverse());
                            }

                            weldingLine.TransformBy(ucs.Inverse());

                            T.Commit();
                        }
                    }
                    else
                    {
                        MessageBox.Show("\nYou did not slected object of type Arc. Try again...");
                    }
                    tr.Commit();
                }
                break;
                #endregion
            }
            #endregion
        }