Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - fixo

Pages: 1 ... 6 7 [8]
106
Blocks / Change attribute prompts
« on: March 13, 2012, 11:21:34 AM »
Code: [Select]
        [CommandMethod("CHPROMPTS")]
        static public void ChangePrompts()
        {

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;
            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    BlockReference bref = tr.GetObject(ed.GetEntity("\nSelect block").ObjectId, OpenMode.ForRead) as BlockReference;

                    if (bref == null)
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Nothing or wrong object selected");
                        return;
                    }
                    BlockTable bt = (BlockTable)(tr.GetObject(db.BlockTableId, OpenMode.ForRead));
                    BlockTableRecord btrec = null;
                    if (bref.IsDynamicBlock)
                    {
                        btrec = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead, false) as BlockTableRecord;
                    }
                    else
                    {
                        btrec = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead, false) as BlockTableRecord;
                    }

                    var adeftype = RXObject.GetClass(typeof(AttributeDefinition));

                    var tags =
                        (from ObjectId id in btrec
                         where id.ObjectClass.IsDerivedFrom(adeftype)
                         select (id.GetObject(OpenMode.ForRead, false) as AttributeDefinition).Tag).ToList<string>();

                    var prompts =
                        (from ObjectId id in btrec
                         where id.ObjectClass.IsDerivedFrom(adeftype)
                         select (id.GetObject(OpenMode.ForRead, false) as AttributeDefinition).Prompt).ToList<string>();

                    string info = "  ---   For info   ---\nUsed Tags / Prompts:\n----------------------\n";
                    for (int n = 0; n < tags.Count; n++)
                    {
                        info += tags[n] + "\t" + prompts[n] + "\n";
                    }

                    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(info);

                    for (int n = 0; n < tags.Count; n++)
                    {
                        string newprompt = "";

                        string question =
                            ("\nEnter a new Prompt for tag [ " + tags[n] + " ] instead of [ " + prompts[n] + " ] (hit Enter to keep old value): ");
                        PromptStringOptions pso = new PromptStringOptions(question);
                        pso.AllowSpaces = true;

                        // to bypass empty input
                        try
                        {
                            newprompt = ed.GetString(pso).StringResult;
                        }
                        catch
                        {
                        }

                        if (newprompt != string.Empty)
                        {
                            AttributeDefinition attdef =
                                (from ObjectId id in btrec
                                 where ((id.ObjectClass.IsDerivedFrom(adeftype) &&
                                 (id.GetObject(OpenMode.ForRead, false) as AttributeDefinition).Tag == tags[n]))
                                 select id.GetObject(OpenMode.ForWrite, false)).First() as AttributeDefinition;
                            attdef.Prompt = newprompt;
                        }
                    }

                    tr.Commit();
                }

            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\n{0}\n{1}", ex.Message, ex.StackTrace);
            }
        }

~'J'~

107
Layers / Change layer of the selected objects to the target object layer
« on: February 17, 2012, 08:55:05 PM »
Code: [Select]
        <CommandMethod("MatchLayersByTarget", "MHL", CommandFlags.Modal Or CommandFlags.Transparent)> _
        Public Sub MatchLayerTest()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            Dim how As Boolean = False
            Dim pso As PromptSelectionOptions = New PromptSelectionOptions()
            pso.MessageForRemoval = vbLf & "Nothing selected, please try again: "
            pso.MessageForAdding = vbLf & "Select objects to be changed"

            Dim psr As PromptSelectionResult = ed.GetSelection(pso)
            If psr.Status <> PromptStatus.OK Then
                Return
            End If

            Dim peo As New PromptEntityOptions(vbLf & "Select an object on the target layer: ")
            peo.AllowObjectOnLockedLayer = True

            Dim per As PromptEntityResult = ed.GetEntity(peo)
            If per.Status <> PromptStatus.OK Then
                Return
            End If
            Try
                Using tr As Transaction = db.TransactionManager.StartTransaction()
                    Dim ent As Entity = TryCast(tr.GetObject(per.ObjectId, OpenMode.ForRead), Entity)
                    If ent Is Nothing Then
                        Return
                    End If
                    Dim lt As LayerTable = tr.GetObject(db.LayerTableId, OpenMode.ForRead)
                    Dim ltrIds As New ObjectIdCollection
                    Dim lname As String = ent.Layer
                    Dim lid As ObjectId = lt(lname)
                    Dim ltr As LayerTableRecord = TryCast(tr.GetObject(lid, OpenMode.ForWrite), LayerTableRecord)
                    If ltr.IsLocked Then
                        ltr.IsLocked = False
                        If Not ltrIds.Contains(lid) Then ltrIds.Add(lid)
                    End If
                    Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)


                    For Each selobj As SelectedObject In psr.Value
                        Dim sent As Entity = TryCast(tr.GetObject(selobj.ObjectId, OpenMode.ForRead), Entity)
                        If sent IsNot Nothing Then
                            sent.UpgradeOpen()

                            lid = lt(sent.Layer)
                            ltr = TryCast(tr.GetObject(lid, OpenMode.ForWrite), LayerTableRecord)
                            If ltr.IsLocked Then
                                ltr.IsLocked = False
                                If Not ltrIds.Contains(lid) Then ltrIds.Add(lid)
                            End If
                            sent.Layer = lname
                            sent.DowngradeOpen()
                        End If
                    Next
                    ''restore layer states
                    For Each lid In ltrIds
                        ltr = TryCast(tr.GetObject(lid, OpenMode.ForWrite), LayerTableRecord)
                        If Not ltr.IsLocked Then
                            ltr.IsLocked = True
                        End If
                    Next
                    tr.Commit()
                End Using
                how = True
            Catch ex As Autodesk.AutoCAD.Runtime.Exception
                ed.WriteMessage(ex.Message)
                how = False
            Finally
                Dim result As String = "   ---   The program has ended up with " + IIf(how, "success", "bugs").ToString
                ed.WriteMessage(vbLf + result)
            End Try
        End Sub

~'J'~

108
Tables / Create simple table
« on: January 14, 2012, 09:54:14 PM »
There a few ways how to create table, the following one
is likes me more, probably it will be useful for somebody else
(Code written for AutoCAD 2010)

Code: [Select]
        [CommandMethod("CreatePlainTable")]
        public void CreateMyTable()
        {
            // based on code written by Kean Walmsley
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                Table tbl = new Table();
                tbl.TableStyle = db.Tablestyle;
                tbl.Position = ed.GetPoint("\nPick a point: ").Value;
                TableStyle ts = (TableStyle)tr.GetObject(tbl.TableStyle, OpenMode.ForRead);
                double textht = ts.TextHeight(RowType.DataRow);
                int rows = 10;
                int columns = 4;
                //insert rows
                tbl.InsertRows(1, textht * 2, rows);
                // insert columns
                tbl.InsertColumns(1, textht * 15, columns);// first column is already exist, thus we'll have 5 columns
                //create range to merge the cells in the first row
                CellRange range = CellRange.Create(tbl, 0,0, 0, columns);
                tbl.MergeCells(range);
                // set style for title row
                tbl.Cells[0, 0].Style = "Title";
                tbl.Cells[0, 0].TextString = "Title";

                tbl.Rows[0].Height = textht * 2;
                tbl.InsertRows(1, textht * 2, 1);
                // set style for header row
                tbl.Rows[1].Style = "Header";
                tbl.Rows[1].Height = textht * 1.5;
                //create contents in the first cell and set textstring
                tbl.Cells[1, 0].Contents.Add();
                tbl.Cells[1, 0].Contents[0].TextString = "Header #1";
                for (int c = 1; c <= columns; c++)
                {
                    //for all of the rest cells just set textstring (or value)
                    tbl.Cells[1, c].TextString = "Header  #" + (c + 1).ToString();
                }

                for (int r = 2; r < rows + 2; r++)//exact number of data rows + title row + header row
                {
                    // set style for data row
                    tbl.Rows[r].Style = "Data";
                    tbl.Rows[r].Height = textht * 1.25;
                    //create contents in the first cell and set textstring
                    tbl.Cells[r, 0].Contents.Add();
                    tbl.Cells[r, 0].Contents[0].TextString = "DataRow  #" + (r - 1).ToString() + " Col 1";
                    for (int c = 1; c <= columns; c++)
                    {
                        //for all of the rest cells just set textstring (or value)
                        tbl.Cells[r, c].TextString = "DataRow  #" + (r - 1).ToString() + " Col " + (c + 1).ToString(); ;
                    }
                }
                // set equal column widths
                foreach (Column col in tbl.Columns)
                    col.Width = textht * 15;

                //change last column values just to show data formatting               
                // to set numeric values with precision of 3 decimals:
                // create DataTypeParameter object
                // set data type,set value, then data format for every cell:
               
                DataTypeParameter dtp = new DataTypeParameter();
                dtp.DataType = DataType.Double;
                dtp.UnitType = UnitType.Distance;  // or  UnitType.Unitless

                //populate column with dummy values:
                for (int r = 2; r < rows + 2; r++)//exact number of data rows + title row + header row 
                {
                    tbl.Cells[r, columns].Contents[0].DataType = dtp;
                    tbl.Cells[r, columns].Contents[0].Value = Math.Pow(Math.PI, 1.0 / r);
                    tbl.Cells[r, columns].Contents[0].DataFormat = "%lu2%pr3%th44";//or "%lu2%pr3%"
                }
                tbl.GenerateLayout();
                btr.AppendEntity(tbl);
                tr.AddNewlyCreatedDBObject(tbl, true);
                tr.Commit();
            }
        }

~'J'~

109
Text / Simple numbering suit with prefix
« on: January 07, 2012, 05:47:10 PM »
Code: [Select]
#region Imports

// Microsoft

using System;

using System.Collections.Generic;

using System.Text;

// Autodesk

using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.Geometry;
#endregion

[assembly: CommandClass(typeof(MyTextPlugin.TextCommands))]

namespace MyTextPlugin
{
    public class TextCommands
    {


        [CommandMethod("NumPrefix")]
        static public void NumberingWithPrefix()
        {
            Document doc = acadApp.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;
            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    PromptStringOptions pso = new PromptStringOptions("\nEnter a Prefix : ");
                    pso.AllowSpaces = true;
                    pso.UseDefaultValue = true;
                    pso.DefaultValue = "AB";
                    PromptResult res;
                    string pfx = string.Empty;
                    res = ed.GetString(pso);
                    if (res.Status == PromptStatus.OK)
                    {
                        pfx = res.StringResult;
                    }
                    if (res.Status == PromptStatus.None)
                    {
                        pfx = "AB";
                    }

                    int num = new Int32();
                    PromptIntegerOptions pio = new PromptIntegerOptions("");
                    pio.Message = "\nEnter a Starting Number: ";

                    // Restrict input to positive and non-negative or non-zero values
                    pio.AllowZero = false;
                    pio.AllowNegative = false;
                    // Add default value
                    pio.DefaultValue = 1;
                    // Allow user the empty input by press Enter key
                    pio.AllowNone = true;

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

                        num = ires.Value;

                    }
                    if (ires.Status == PromptStatus.None)
                    {
                        num = 1;
                    }
                    int inc = new Int32();
                    pio = new PromptIntegerOptions("");
                    pio.Message = "\nEnter an Increment Number by: ";
                    // Restrict input to positive and non-negative or non-zero values
                    pio.AllowZero = false;
                    pio.AllowNegative = false;
                    // Add default value
                    pio.DefaultValue = 1;
                    // Allow user the empty input by press Enter key
                    pio.AllowNone = true;
                    // Get the value entered by the user
                    ires = ed.GetInteger(pio);
                    if (ires.Status == PromptStatus.OK)
                    {
                        inc = ires.Value;
                    }
                    if (ires.Status == PromptStatus.None)
                    {
                        inc = 1;
                    }
                    double hgt = new double();
                    PromptDoubleOptions pdo = new PromptDoubleOptions("\nEnter a Text Height: ");
                    pdo.AllowNone = true;
                    // Restrict input to positive and non-negative or non-zero values
                    pdo.AllowZero = false;
                    pdo.AllowNegative = false;
                    pdo.UseDefaultValue = true;
                    pdo.DefaultValue = 1.0; // may be db.Textsize or other default
                    pdo.Message = "\nEnter a text height: ";

                    PromptDoubleResult dres;
                    dres = ed.GetDouble(pdo);
                    if (dres.Status == PromptStatus.None)
                    {
                        hgt = 1.0;
                    }
                    if (dres.Status == PromptStatus.OK)
                    {

                        hgt = dres.Value;
                    }

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

                    Point3d pt = new Point3d();
                    Point3d npt = new Point3d();
                    bool first = GetFirstPoint(ed, "Select text location: ", out pt);
                    DBText txt = new DBText();
                    txt.SetDatabaseDefaults();

                    txt.Position = pt;
                    txt.Height = hgt;
                    txt.TextString = pfx + num.ToString();
                    //Set justification to middle center:
                    txt.VerticalMode = TextVerticalMode.TextVerticalMid;
                    txt.HorizontalMode = TextHorizontalMode.TextMid;
                    txt.AlignmentPoint = pt;
                    btr.AppendEntity(txt);
                    tr.AddNewlyCreatedDBObject(txt, true);
                    tr.TransactionManager.QueueForGraphicsFlush();
                    num += inc;
                    while (GetNextPoint(ed, "Select text location (or press Enter to Exit): ", pt, out npt))
                    {
                        txt = new DBText();
                        txt.SetDatabaseDefaults();

                        txt.Position = npt;
                        txt.Height = hgt;
                        txt.TextString = pfx + num.ToString();
                        //Set justification to middle center:
                        txt.VerticalMode = TextVerticalMode.TextVerticalMid;
                        txt.HorizontalMode = TextHorizontalMode.TextMid;
                        txt.AlignmentPoint = npt;
                        btr.AppendEntity(txt);
                        tr.AddNewlyCreatedDBObject(txt, true);
                        tr.TransactionManager.QueueForGraphicsFlush();
                        pt = npt;
                        num += inc;
                    }

                    tr.Commit();

                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("Error: ==>\n{0}\nTrace: ==>\n{1}", ex.Message, ex.StackTrace);
            }
            finally
            {
                //do whatever you need

            }

        }
        /// <summary>
        /// Custom getpoint function without base point
        /// </summary>
        /// <param name="ed">document editor</param>
        /// <param name="pt">Point3d, by reference</param>
        /// <returns>Return true if success</returns>
        public static bool GetFirstPoint(Editor ed, string msg, out Point3d pt)
        {
            pt = new Point3d();

            PromptPointOptions opt = new PromptPointOptions("\n" + msg);

            PromptPointResult res = ed.GetPoint(opt);

            if (res.Status == PromptStatus.OK)
            {
                pt = res.Value;

                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// Custom getpoint function with base point
        /// </summary>
        /// <param name="ed">document editor</param>
        /// <param name="msg">string, user prompt</param>
        /// <param name="frompt">Point3d, by value</param>
        /// <param name="pt">Point3d, by reference</param>
        /// <returns>Return true if succes</returns>
        public static bool GetNextPoint(Editor ed, string msg, Point3d frompt, out Point3d pt)
        {
            pt = new Point3d();

            PromptPointOptions opt = new PromptPointOptions("\n" + msg);

            opt.UseBasePoint = false;

            opt.UseDashedLine = false;

            opt.AllowNone = true;

            opt.BasePoint = frompt;

            PromptPointResult res = ed.GetPoint(opt);

            if (res.Status == PromptStatus.OK)
            {
                pt = res.Value;
                return true;
            }
            else
            {
                return false;
            }
        }
   }
}

110
Blocks / Replace blocks by name
« on: January 03, 2012, 10:30:54 PM »
Hope this framework would be useful for beginners

Code: [Select]
#region Imports

// Microsoft

using System;

using System.Collections.Generic;

using System.Text;

// Autodesk

using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.Geometry;
#endregion

[assembly: CommandClass(typeof(BlockCS.ReplaceCommands))]

namespace BlockCS
{
    public class ReplaceCommands
    {
        [CommandMethod("BlockReplaceTest", "breplace", CommandFlags.Session | CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)]

        public void TestBlockReplaceByName()
        {
            // objects initializing
            Document doc = acadApp.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;

            try
            {
                using (doc.LockDocument())
                {
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        PromptStringOptions psto =
                            new PromptStringOptions("\nEnter a replacement block name: ");

                        psto.AllowSpaces = true;

                        psto.DefaultValue = "MyBlock";//old block

                        PromptResult stres;

                        stres = ed.GetString(psto);

                        if (stres.Status != PromptStatus.OK)
                            return;

                        string oldblock = stres.StringResult;
                       
                        ed.WriteMessage("\nText Entered\t{0}", oldblock);

                        psto = new PromptStringOptions("\nEnter a block name to be replaced: ");

                        psto.AllowSpaces = true;

                        psto.DefaultValue = "NewBlock";//new block

                        stres = ed.GetString(psto);

                        if (stres.Status != PromptStatus.OK)

                            return;

                        string newblock = stres.StringResult;

                        BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;

                        if (!bt.Has(newblock)) return;

                        ObjectId newblkId = bt[newblock];

                        acadApp.SetSystemVariable("nomutt", 0);

                        TypedValue[] tvs = { new TypedValue(0, "insert"), new TypedValue(2, oldblock) };

                        SelectionFilter filt = new SelectionFilter(tvs);

                        PromptSelectionOptions pso = new PromptSelectionOptions();

                        pso.MessageForRemoval = "You must select the blocks only";

                        pso.MessageForAdding = "\nSelect replacement blocks: ";

                        ed.SelectionAdded += new SelectionAddedEventHandler(ed_SelectionAdded);

                        PromptSelectionResult res = ed.GetSelection(pso, filt);



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

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

                        SelectionSet sset = res.Value;

                        foreach (SelectedObject obj in sset)
                        {
                            Entity ent = (Entity)obj.ObjectId.GetObject(OpenMode.ForRead) as Entity;

                            BlockReference oldblk = ent as BlockReference;

                            Point3d ip = oldblk.Position;

                            Scale3d scl = oldblk.ScaleFactors;

                            double rot = oldblk.Rotation;

                            BlockReference newblk = new BlockReference(ip, newblkId);

                            newblk.SetPropertiesFrom(ent);

                            newblk.Rotation = rot;

                            newblk.ScaleFactors = scl;
                           
                            btr.AppendEntity(newblk);

                            tr.AddNewlyCreatedDBObject(newblk, true);

                            ApplyAttributes(db, tr, newblk);

                            oldblk.UpgradeOpen();

                            oldblk.Erase();

                            oldblk.Dispose();

                        }
                     
                        tr.Commit();
                    }

                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage(ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                acadApp.SetSystemVariable("nomutt", 1);

               ed.SelectionAdded -= ed_SelectionAdded;
 
            }

        }


        void ed_SelectionAdded(object sender, SelectionAddedEventArgs e)
        {
            ((Editor)sender).WriteMessage("\n\t{0} blocks to selection added", e.AddedObjects.Count);

        }


        public void ApplyAttributes(Database db, Transaction tr, BlockReference bref)
        {
            BlockTableRecord btrec = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;

            if (btrec.HasAttributeDefinitions)
            {
                Autodesk.AutoCAD.DatabaseServices.AttributeCollection atcoll = bref.AttributeCollection;

                foreach (ObjectId subid in btrec)
                {
                    Entity ent = (Entity)subid.GetObject(OpenMode.ForRead);

                    AttributeDefinition attDef = ent as AttributeDefinition;

                    if (attDef != null)
                    {

                        AttributeReference attRef = new AttributeReference();

                        attRef.SetDatabaseDefaults();//optional

                        attRef.SetAttributeFromBlock(attDef, bref.BlockTransform);

                        attRef.Position = attDef.Position.TransformBy(bref.BlockTransform);

                        attRef.Tag = attDef.Tag;

                        attRef.AdjustAlignment(db);

                        atcoll.AppendAttribute(attRef);

                        tr.AddNewlyCreatedDBObject(attRef, true);

                    }
                }

            }
        }
    }
}

111
Windows forms / Binding ListBox With ComboBox programmaticlly
« on: January 22, 2011, 01:37:28 PM »
Attached is a quick example how to do it easily

Enjoy!

Pages: 1 ... 6 7 [8]