Author Topic: Autonumbering with prefix  (Read 1503 times)

0 Members and 1 Guest are viewing this topic.

Offline fixo

  • Full Member
  • ***
  • Posts: 135
  • Karma: +4/-0
  • Gender: Male
    • prefered language: C
    • Prog expertise: Good
    • View Profile
Autonumbering with prefix
« on: May 30, 2013, 10:44:34 PM »
   VB.NET
Code: [Select]
#Region "AutoNumbering with prefix"

        ''' <summary>
        '''  Function to return increment string
        ''' </summary>
        ''' <param name="prefix"></param>
        ''' <param name="start"></param>
        ''' <param name="rate"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Shared Function TextInc(prefix As String, start As String, rate As Integer) As String
            Dim result As String = ""
            Dim head As String = ""
            Dim szero As Boolean = False
            Dim leg As Integer = (prefix & start).Length
            If start.StartsWith("0") Then
                szero = True
                Dim pos As Integer = start.LastIndexOf("0")

                For n As Integer = 0 To pos
                    head = head & "0"
                Next
            End If
            Dim num As Integer = Convert.ToInt32(start) + rate

            If szero Then
                result = String.Concat(prefix, head, num.ToString())
                If result.Length > leg Then
                    If head.Length > 1 Then
                        result = String.Concat(prefix, head.Remove(1, result.Length - leg), num.ToString())
                    Else
                        result = String.Concat(prefix, num.ToString())
                    End If
                End If
            Else
                result = String.Concat(prefix, num.ToString())
            End If
            Return result

        End Function

        ''' <summary>
        '''  Command for autonumbering with text with prefix
        ''' </summary>
        <CommandMethod("inm")> _
        Public Shared Sub IncrementWithFrame()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Dim db As Database = doc.Database
            Dim ucs As Matrix3d = ed.CurrentUserCoordinateSystem
            ' Get or discard prefix as string entered by the user
            Dim pso As New PromptStringOptions(vbLf & vbTab & "Enter prefix or press Enter w/o it: ")
            pso.AllowSpaces = True
            pso.DefaultValue = ""
            Dim res As PromptResult
            res = ed.GetString(pso)
            If res.Status <> PromptStatus.OK Then
                Return
            End If

            Dim pfx As String = res.StringResult
            Dim pos As Integer = pfx.Length
            ed.WriteMessage(vbLf & "Prefix Entered:" & vbTab & "{0}", pfx)
            ' Get initial number as string entered by the user
            pso = New PromptStringOptions(vbLf & "Enter initial number  : ")
            pso.UseDefaultValue = True
            pso.DefaultValue = "0001"

            res = ed.GetString(pso)
            If res.Status <> PromptStatus.OK Then
                Return
            End If

            Dim strnum As String = res.StringResult
            ed.WriteMessage(vbLf & "initial number:" & vbTab & "{0}", strnum)

            Dim pio As New PromptIntegerOptions("")
            pio.Message = vbLf & "Enter an increment step: "

            ' Restrict input to positive and non-negative values
            pio.AllowZero = False
            pio.AllowNegative = False
            ' Add default value
            pio.DefaultValue = 1
            pio.AllowNone = True

            ' Get step value entered by the user
            Dim ires As PromptIntegerResult = ed.GetInteger(pio)
            If ires.Status <> PromptStatus.OK Then
                Return
            End If

            Dim rate As Integer = ires.Value

            ed.WriteMessage(vbLf & "Step entered" & vbTab & "{0}", rate)
            ' Get gap value entered by the user
            Dim pdo As New PromptDoubleOptions(vbLf & "Enter the gap size between text and frame  : ")
            pdo.AllowNone = True
            pdo.UseDefaultValue = True
            pdo.DefaultValue = db.Textsize / 2

            Dim dbres As PromptDoubleResult
            dbres = ed.GetDouble(pdo)
            If res.Status <> PromptStatus.OK Then
                Return
            End If

            Dim gap As Double = dbres.Value

            ed.WriteMessage(vbLf & "Gap Entered" & vbTab & "{0}", gap)
            ' using a current textsize
            Dim txtheight As Double = db.Textsize

            Using tr As Transaction = db.TransactionManager.StartTransaction()

                doc.TransactionManager.EnableGraphicsFlush(True)

                Dim btr As BlockTableRecord = DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)

                Dim ppo As New PromptPointOptions(vbLf & vbTab & "Specify text insertion point (Enter to stop): ")
                ppo.AllowNone = True
                Dim ptres As PromptPointResult
                Dim n As Integer = 0

                Dim txt As String = ""
                ' get text points multiple
                Do
                    Dim pt As New Point3d()
                    ptres = ed.GetPoint(ppo)

                    If ptres.Status = PromptStatus.OK Then
                        pt = ptres.Value
                        Dim otext As New DBText()
                        otext.Position = pt
                        otext.VerticalMode = TextVerticalMode.TextVerticalMid
                        otext.HorizontalMode = TextHorizontalMode.TextMid
                        otext.AlignmentPoint = otext.Position
                        otext.AdjustAlignment(db)
                        If n = 0 Then

                            txt = TextInc(pfx, strnum, 0)
                        Else
                            txt = TextInc(pfx, strnum, rate)
                        End If

                        otext.TextString = txt

                        n += 1
                        strnum = txt.TrimStart(pfx.ToCharArray())

                        btr.AppendEntity(otext)
                        tr.AddNewlyCreatedDBObject(otext, True)
                        tr.TransactionManager.QueueForGraphicsFlush()
                        Dim plan As Plane = otext.GetPlane()
                        Dim ext As Extents3d = otext.GeometricExtents
                        Dim bl As Point3d = ext.MinPoint
                        Dim ur As Point3d = ext.MaxPoint
                        Dim mp As Point3d = New Point3d((bl.X + ur.X) / 2, (bl.Y + ur.Y) / 2, (bl.Z + ur.Z) / 2).TransformBy(ucs)
                        otext.Position = mp
                        otext.AlignmentPoint = otext.Position
                        otext.AdjustAlignment(db)

                        Dim br As New Point3d(ur.X, bl.Y, bl.Z)
                        Dim ul As New Point3d(bl.X, ur.Y, bl.Z)
                        bl = bl.Subtract(New Vector3d(gap, gap, 0)).TransformBy(ucs)
                        ur = ur.Subtract(New Vector3d(-gap, -gap, 0)).TransformBy(ucs)
                        br = br.Subtract(New Vector3d(-gap, gap, 0)).TransformBy(ucs)
                        ul = ul.Subtract(New Vector3d(gap, -gap, 0)).TransformBy(ucs)
                        Dim poly As New Polyline()
                        poly.AddVertexAt(0, bl.Convert2d(plan), 0, 0, 0)
                        poly.AddVertexAt(0, br.Convert2d(plan), 0, 0, 0)
                        poly.AddVertexAt(0, ur.Convert2d(plan), 0, 0, 0)
                        poly.AddVertexAt(0, ul.Convert2d(plan), 0, 0, 0)
                        poly.Closed = True
                        poly.ColorIndex = 1
                        btr.AppendEntity(poly)
                        tr.AddNewlyCreatedDBObject(poly, True)

                        tr.TransactionManager.QueueForGraphicsFlush()

                    End If
                Loop While ptres.Status = PromptStatus.OK
                doc.TransactionManager.FlushGraphics()
                tr.Commit()
            End Using

        End Sub
#End Region


   C#
Code: [Select]
        /// <summary>
          /// function to return increment string
        /// </summary>
        /// <param name="prefix"></param>
        /// <param name="start"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        private static string TextInc(string prefix, string start, int step)
        {
            string result = "";
            string head = "";
            bool szero = false;
            int leg = (prefix + start).Length;
            if (start.StartsWith("0"))
            {
                szero = true;
                int pos = start.LastIndexOf("0");

                for (int n = 0; n <= pos; n++)
                    head = head + "0";
            }
            int num = Convert.ToInt32(start) + step;

            if (szero)
            {
                result = String.Concat(prefix, head, num.ToString());
                if (result.Length > leg)
                {
                    if (head.Length > 1)
                        result = String.Concat(prefix, head.Remove(1, result.Length - leg), num.ToString());
                    else
                        result = String.Concat(prefix, num.ToString());
                }
            }
            else
            {
                result = String.Concat(prefix, num.ToString());
            }
            return result;

        }

        /// <summary>
        ///  Command for autonumbering with text with prefix
        /// </summary>
        [CommandMethod("inm")]
        public static void IncrementWithFrame()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            Matrix3d ucs = ed.CurrentUserCoordinateSystem;
            // Get or discard prefix as string entered by the user
            PromptStringOptions pso =
                 new PromptStringOptions("\n\tEnter prefix or press Enter w/o it: ");
            pso.AllowSpaces = true;
            pso.DefaultValue = "";
            PromptResult res;
            res = ed.GetString(pso);
            if (res.Status != PromptStatus.OK)  return;

            string pfx = res.StringResult;
            int pos = pfx.Length;
            ed.WriteMessage("\nPrefix Entered:\t{0}", pfx);
            // Get initial number as string entered by the user
            pso = new PromptStringOptions("\nEnter initial number  : ");
            pso.UseDefaultValue = true;
            pso.DefaultValue = "0001";

            res = ed.GetString(pso);
            if (res.Status != PromptStatus.OK)return;

            string strnum = res.StringResult;
            ed.WriteMessage("\ninitial number:\t{0}", strnum);

            PromptIntegerOptions pio = new PromptIntegerOptions("");
            pio.Message = "\nEnter an increment step: ";

            // Restrict input to positive and non-negative values
            pio.AllowZero = false;
            pio.AllowNegative = false;
            // Add default value
            pio.DefaultValue = 1;
            pio.AllowNone = true;

            // Get step value entered by the user
            PromptIntegerResult ires = ed.GetInteger(pio);
            if (ires.Status != PromptStatus.OK) return;

            int step = ires.Value;

            ed.WriteMessage("\nStep entered\t{0}", step);
            // Get gap value entered by the user
            PromptDoubleOptions pdo =
                           new PromptDoubleOptions("\nEnter the gap size between text and frame  : ");
            pdo.AllowNone = true;
            pdo.UseDefaultValue = true;
            pdo.DefaultValue = db.Textsize / 2;

            PromptDoubleResult dbres;
            dbres = ed.GetDouble(pdo);
            if (res.Status != PromptStatus.OK)  return;

            double gap = dbres.Value;

            ed.WriteMessage("\nGap Entered\t{0}", gap);
            // using a current textsize
            double txtheight = db.Textsize;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {

                doc.TransactionManager.EnableGraphicsFlush(true);

                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                PromptPointOptions ppo = new PromptPointOptions("\n\tSpecify text insertion point (Enter to stop): ");
                ppo.AllowNone = true;
                PromptPointResult ptres;
                int n = 0;

                string txt = "";
                // get text points multiple
                do
                {
                    Point3d pt = new Point3d();
                    ptres = ed.GetPoint(ppo);

                    if (ptres.Status == PromptStatus.OK)
                    {
                        pt = ptres.Value;
                        DBText otext = new DBText();
                        otext.Position = pt;
                        otext.VerticalMode = TextVerticalMode.TextVerticalMid;
                        otext.HorizontalMode = TextHorizontalMode.TextMid;
                        otext.AlignmentPoint = otext.Position;
                        otext.AdjustAlignment(db);
                        if (n == 0)
                        {
                            txt = TextInc(pfx, strnum, 0);

                        }
                        else
                            txt = TextInc(pfx, strnum, step);

                        otext.TextString = txt;
                       
                        n += 1;
                        strnum = txt.TrimStart(pfx.ToCharArray());
                       
                        btr.AppendEntity(otext);
                        tr.AddNewlyCreatedDBObject(otext, true);
                        tr.TransactionManager.QueueForGraphicsFlush();
                        Plane plan = otext.GetPlane();
                        Extents3d ext = otext.GeometricExtents;
                        Point3d bl = ext.MinPoint;
                        Point3d ur = ext.MaxPoint;
                        Point3d mp = new Point3d((bl.X + ur.X) / 2, (bl.Y + ur.Y) / 2, (bl.Z + ur.Z) / 2).TransformBy(ucs);
                        otext.Position = mp;
                        otext.AlignmentPoint = otext.Position;
                        otext.AdjustAlignment(db);

                        Point3d br = new Point3d(ur.X, bl.Y, bl.Z);
                        Point3d ul = new Point3d(bl.X, ur.Y, bl.Z);
                        bl = bl.Subtract(new Vector3d(gap, gap, 0)).TransformBy(ucs);
                        ur = ur.Subtract(new Vector3d(-gap, -gap, 0)).TransformBy(ucs);
                        br = br.Subtract(new Vector3d(-gap, gap, 0)).TransformBy(ucs);
                        ul = ul.Subtract(new Vector3d(gap, -gap, 0)).TransformBy(ucs);
                        Polyline poly = new Polyline();
                        poly.AddVertexAt(0, bl.Convert2d(plan), 0, 0, 0);
                        poly.AddVertexAt(0, br.Convert2d(plan), 0, 0, 0);
                        poly.AddVertexAt(0, ur.Convert2d(plan), 0, 0, 0);
                        poly.AddVertexAt(0, ul.Convert2d(plan), 0, 0, 0);
                        poly.Closed = true;
                        poly.ColorIndex = 1;
                        btr.AppendEntity(poly);
                        tr.AddNewlyCreatedDBObject(poly, true);
                        tr.TransactionManager.QueueForGraphicsFlush();

                    }

                } while (ptres.Status == PromptStatus.OK);
                doc.TransactionManager.FlushGraphics();
                tr.Commit();
            }

        }