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 ... 4 5 [6] 7 8
76
Tables / Change FlowDirection of table
« on: July 04, 2012, 02:14:01 PM »
Code: [Select]
     // By Virupaksha Aithal
        // http://adndevblog.typepad.com/autocad/2012/07/creating-table-with-flow-direction.html
        [CommandMethod("cta")]
        public static void FlowDirectionTest()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            Table table = new Table();
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                //  Get the table style Dictionary
                DBDictionary tsdict = (DBDictionary)tr.GetObject(db.TableStyleDictionaryId, OpenMode.ForRead);
                //  Get the table style ObjectId
                ObjectId styleId;
                styleId = tsdict.GetAt("Standard");
                // Set the table style Id
                table.TableStyle = styleId;
                // 5 row, 6 columns
                table.SetSize(5, 6);
                // Flow direction from bottom to top
                Autodesk.AutoCAD.DatabaseServices.FlowDirection flow = table.FlowDirection;
                flow = Autodesk.AutoCAD.DatabaseServices.FlowDirection.BottomToTop;
                // Generate the table layout based on the table style
                table.GenerateLayout();
                table.Position = Point3d.Origin;
                ObjectId modelId;
                modelId = SymbolUtilityServices.GetBlockModelSpaceId(db);
                BlockTableRecord btr = tr.GetObject(modelId, OpenMode.ForWrite) as BlockTableRecord;
                // Add to Database
                ObjectId objectId;
                objectId = btr.AppendEntity(table);
                tr.AddNewlyCreatedDBObject(table, true);
                // Commit transaction
                tr.Commit();
            }
        }

~'J'~

77
Blocks / Insert block from container
« on: June 29, 2012, 10:12:31 PM »
       using System.IO;
------------------------------------
// based on code written by Fenton Webb
Code: [Select]
        [CommandMethod("insFrom")]
        public static void ExtBlockCopyTest()
        {
            ObjectId blkTblRecId = ObjectId.Null;
           // Change path of file and block name here
            InsertBlockFromContainer(@"C:\Test\TitleExample.dwg", "TITLEBLOCK", blkTblRecId);
        }



        public static void InsertBlockFromContainer(string Container, string blkName, ObjectId blkTblRecId)
        {
            // Find the file containing all the blocks

            if (!File.Exists(Container))
            {
                MessageBox.Show("Could not find file !");

                return;

            }

            // Read the database in memory

            Database sourceDb = new Database(false, true);

            sourceDb.ReadDwgFile(Container, FileOpenMode.OpenForReadAndAllShare, false, "");

            using (Transaction sourceTr = sourceDb.TransactionManager.StartTransaction())
            {
                // Find the ObjectId of the block we are interested in.

                BlockTable sourceBt = null;

                sourceBt = sourceTr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead) as BlockTable;

                ObjectId sourceBtId;

                BlockTableRecord sourceBtr = null;

                if (!sourceBt.Has(blkName))
                {

                    MessageBox.Show("Block not found !");

                    return;

                }

                sourceBtr = sourceTr.GetObject(sourceBt[blkName], OpenMode.ForRead) as BlockTableRecord;

                sourceBtId = sourceBtr.ObjectId;

                Database curDoc = HostApplicationServices.WorkingDatabase;

                Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;

                // Create a new block table record in the current database.
                using (Transaction tr = curDoc.TransactionManager.StartTransaction())
                {

                    BlockTable destBt = null;

                    destBt = tr.GetObject(curDoc.BlockTableId, OpenMode.ForRead) as BlockTable;

                    ObjectId destBtId = destBt.ObjectId;

                    // WBlockClone the BlockTable record to the current database

                    ObjectIdCollection idColl = new ObjectIdCollection();

                    idColl.Add(sourceBtId);

                    // ObjectId of the btr that we want to clone

                    IdMapping idMap = new IdMapping();

                    curDoc.WblockCloneObjects(idColl, destBtId, idMap, DuplicateRecordCloning.Ignore, false);

                    // Create an instance of the block

                    BlockTableRecord destBtr = null;

                    destBtr = tr.GetObject(destBt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                    ObjectId destBtrId;

                    destBtrId = destBt[blkName];

                    // Insert an instance of the block in point(0,0,0)
                    BlockReference bref = new BlockReference(Point3d.Origin, destBtrId);

                    destBtr.AppendEntity(bref);

                    tr.AddNewlyCreatedDBObject(bref, true);
                    // Check, then insert the attributes
                    BlockTableRecord btrec = null;

                    btrec = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;

                    if (btrec.HasAttributeDefinitions)
                    {
                        foreach (ObjectId id in btrec)
                        {
                            AttributeDefinition atdef = tr.GetObject(id, OpenMode.ForRead) as AttributeDefinition;

                            if (atdef != null)
                            {
                                using (AttributeReference atref = new AttributeReference())
                                {
                                    atref.SetAttributeFromBlock(atdef, bref.BlockTransform);

                                    atref.Position = atdef.Position + bref.Position.GetAsVector();

                                    atref.TextString = atdef.TextString;

                                    bref.AttributeCollection.AppendAttribute(atref);

                                    tr.AddNewlyCreatedDBObject(atref, true);
                                }
                            }
                        }
                    }

                    tr.Commit();
                }

            }
        }

~'J'~

78
Hatching / Scale the hatch
« on: June 29, 2012, 05:45:14 PM »
Code: [Select]
        [CommandMethod("HatchScale","hsc", CommandFlags.Modal)]
        static public void HatchScaleHalf()
        {
            Entity en;

            Database db = acApp.DocumentManager.MdiActiveDocument.Database;

            Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;

            try
            {

                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    double cursc = ed.GetDouble("\nEnter Hatch scale: ").Value;

                    ObjectId id = ed.GetEntity("\nSelect Hatch: ").ObjectId;

                    en = tr.GetObject(id, OpenMode.ForWrite, false) as Entity;

                    Hatch hatch = en as Hatch;

                    if (hatch != null)
                    {
                        HatchPatternType hp = hatch.PatternType;

                        string hpn = hatch.PatternName;

                        double scl = hatch.PatternScale;

                        if (!hatch.IsWriteEnabled) hatch.UpgradeOpen();

                        hatch.PatternScale = scl * cursc;

                        hatch.SetHatchPattern(hp, hpn);

                        hatch.EvaluateHatch(true);
                    }
                    else
                    {
                        ed.WriteMessage("\nIt is not hatch!");

                        return;
                    }
                    tr.Commit();

                    ed.UpdateScreen();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage(ex.ToString());
            }
        }

~'J'~

79
       
Code: [Select]
        // based on article by Wayne Brill
        // http://adndevblog.typepad.com/autocad/2012/06/use-getclosestpointto-and-onsegat-to-locate-a-polyline-vertex-near-a-point.html
        [CommandMethod("oseg")]
       public  static void TEST_PointOnPoly()
        {

                Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;

                Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;

                CoordinateSystem3d cs = ed.CurrentUserCoordinateSystem.CoordinateSystem3d;

                Plane plan = new Plane(Point3d.Origin, cs.Zaxis);

                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("osmode", 512);

                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    try
                    {
                        Entity ename;

                        Point3d pt;

                        Point3d ptWcs;

                        PromptEntityOptions peo = new PromptEntityOptions("\nSelect Pline: ");

                        peo.SetRejectMessage("\nYou have to select LWPOLYLINE!");

                        peo.AddAllowedClass(typeof(Polyline), false);

                        PromptEntityResult res = ed.GetEntity(peo);

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

                        ObjectId id = res.ObjectId;

                        // Convert to WCS incase selection was made

                        // while in a UCS.

                        pt = res.PickedPoint;

                        // Transform from UCS to WCS

                        Matrix3d mat =

                          Matrix3d.AlignCoordinateSystem(

                            Point3d.Origin,

                            Vector3d.XAxis,

                            Vector3d.YAxis,

                            Vector3d.ZAxis,

                            cs.Origin,

                            cs.Xaxis,

                            cs.Yaxis,

                            cs.Zaxis

                          );

                        ptWcs = pt.TransformBy(mat);

                        ename = tr.GetObject(id, OpenMode.ForRead) as Entity;

                        Polyline pline = ename as Polyline;

                        if (pline == null)
                        {

                            ed.WriteMessage("\nSelected Entity is not a Polyline");

                            return;

                        }

                        Point3d clickpt = pline.GetClosestPointTo(ptWcs, false);

                        for (int c = 0; c < pline.NumberOfVertices; c++)
                        {

                            double segParam= new double();

                            // This is the test filter here...it uses the

                            // nifty API OnSegmentAt

                            if (pline.OnSegmentAt(c, clickpt.Convert2d(plan), segParam))
                            {

                                ed.WriteMessage("\nSelected Segment: {0} \n", c + 1);

                                break;

                            }

                        }
                        }

                        catch (System.Exception ex)
                        {

                           ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);

                        }

                    }

                }

~'J'~

80
Tables / Insert block in the current table
« on: June 28, 2012, 07:53:24 PM »
Code: [Select]
       <CommandMethod("BlockToTable", "btin", CommandFlags.Modal)> _
        Public Shared Sub TestBlockToTable()

            Dim ver As String = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("acadver").ToString().Substring(0, 2)

            Dim intver As Integer = Convert.ToInt32(ver)

            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

            Try
                Using tr As Transaction = db.TransactionManager.StartTransaction

                    Dim pso As PromptSelectionOptions = New PromptSelectionOptions

                    pso.MessageForRemoval = vbLf + "You have select the table only"

                    pso.MessageForAdding = vbLf + " Select the table: "

                    Dim entres As PromptSelectionResult

                    Dim sset As SelectionSet

                    Dim filt(0) As TypedValue

                    filt(0) = New TypedValue(DxfCode.Start, "ACAD_TABLE")

                    Dim selfilter As New SelectionFilter(filt)

                    entres = ed.GetSelection(pso, selfilter)

                    sset = entres.Value

                    If entres.Status <> PromptStatus.OK Then

                        ed.WriteMessage(vbLf + "Wrong selection!")

                        Return

                    End If

                    Dim tblid As ObjectId = entres.Value.GetObjectIds(0)

                    Dim obj As Entity = tr.GetObject(tblid, OpenMode.ForRead)

                    Dim atable As Table = TryCast(obj, Table)

                    Dim pio As PromptPointOptions = New PromptPointOptions(vbLf + "Pick a cell to insert block: ")

                    Dim pres As PromptPointResult = ed.GetPoint(pio)

                    If pres.Status <> PromptStatus.OK Then

                        ed.WriteMessage(vbLf + "Invalid point specification!")

                        Return

                    End If

                    Dim pt As Point3d = pres.Value

                    Dim peo As PromptEntityOptions = New PromptEntityOptions(vbLf + "Select the single block: ")

                    Dim res As PromptEntityResult = ed.GetEntity(peo)

                    If res.Status <> PromptStatus.OK Then

                        ed.WriteMessage(vbLf + "Wrong selection!")

                        Return

                    End If

                    Dim id As ObjectId = res.ObjectId

                    Dim ent As Entity = TryCast(tr.GetObject(id, OpenMode.ForRead), Entity)

                    If ent Is Nothing Then

                        ed.WriteMessage(vbLf + "Wrong object type selected!")

                        Return

                    End If

                    Dim bref As BlockReference = TryCast(ent, BlockReference)

                    If bref Is Nothing Then

                        ed.WriteMessage(vbLf + "Impossible to cast BlockReference from entity!")

                        Return

                    End If

                    Dim btrec As BlockTableRecord = DirectCast(tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead), BlockTableRecord)

                    Dim blkid As ObjectId = btrec.ObjectId

                    Dim hit As TableHitTestInfo = atable.HitTest(pt, Vector3d.ZAxis)

                    Dim i As Integer = hit.Row

                    Dim j As Integer = hit.Column

                    If Not atable.IsWriteEnabled Then atable.UpgradeOpen()
                    '' select appropriate syntax from code block below
                    If intver = 17 Then

                        atable.SetBlockTableRecordId(i, j, blkid, True)

                    End If

                    'If intver = 18 Then

                    '    Dim c As Cell = atable.Cells(i, j)
                    '    c.Contents.Add()
                    '  c.Contents.InsertAt(0);
                    '  c.Contents(0).BlockTableRecordId =  blockId;

                    'Else
                    '    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Change a syntax accordingly to the current version")

                    'End If

                    atable.RecomputeTableBlock(True)

                    how = True

                    tr.Commit()

                End Using

            Catch ex As Autodesk.AutoCAD.Runtime.Exception

                ed.WriteMessage(ex.Message + vbLf + ex.StackTrace)

                how = False

            Catch ex As System.Exception

                ed.WriteMessage(ex.Message + vbLf + ex.StackTrace)

                how = False

            Finally

                Dim result As String = "   ---   The program has ended up with " + IIf(how, "success", "bug").ToString

                ed.WriteMessage(vbLf + result)

            End Try

        End Sub

~'J'~

81
Text / Convert meters to inches
« on: June 25, 2012, 06:24:36 PM »
Code: [Select]
        [CommandMethod("metinch")]
        public static void ConvertMetersToInches()
        {

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

            var db = doc.Database;

            var ed = doc.Editor;

            var fact = UnitsConverter.GetConversionFactor(UnitsValue.Meters, UnitsValue.Inches);

            int decs = db.Dimdec;

            var sf = new SelectionFilter(new TypedValue[] { new TypedValue(0, "TEXT,MTEXT,INSERT") });

            var pso = new PromptSelectionOptions();

            pso.MessageForAdding = "Select texts / mtexts / blocks : ";

            pso.AllowDuplicates = false;

            var psr = ed.GetSelection(pso, sf);

            // make sure that the selection isn't empty
            if (psr.Status == PromptStatus.OK && psr.Value.Count > 0)
            {
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    foreach (SelectedObject so in psr.Value)
                    {
                        var ent = (Entity)tr.GetObject(so.ObjectId, OpenMode.ForRead);

                        if (ent == null) return;

                        if (ent.GetRXClass().DxfName == "TEXT")
                        {
                            var dtxt = ent as DBText;

                            var strval = dtxt.TextString;

                            double dim;

                            if (double.TryParse(strval, out dim))
                            {
                                dim = dim * fact;

                                if (!dtxt.IsWriteEnabled) dtxt.UpgradeOpen();

                                dtxt.TextString = Math.Round(dim, decs).ToString();
                            }
                        }
                        else if (ent.GetRXClass().DxfName == "MTEXT")
                        {
                            var mtxt = ent as MText;

                            var strval = mtxt.Contents;

                            double dim;

                            if (double.TryParse(strval, out dim))
                            {
                                dim = dim * fact;

                                if (!mtxt.IsWriteEnabled) mtxt.UpgradeOpen();

                                mtxt.Contents = Math.Round(dim, decs).ToString();
                            }
                        }
                        else if (ent.GetRXClass().DxfName == "INSERT")
                        {
                            var bref = ent as BlockReference;

                            if (!bref.IsWriteEnabled) bref.UpgradeOpen();

                            // process attributes here
                            var atts = bref.AttributeCollection;

                            // iterate through the list of attributes
                            foreach (ObjectId aid in atts)
                            {
                                var atref = tr.GetObject(aid, OpenMode.ForRead) as AttributeReference;

                                var strval = atref.TextString;

                                double dim;

                                if (double.TryParse(strval, out dim))
                                {
                                    dim = dim * fact;

                                    if (!atref.IsWriteEnabled) atref.UpgradeOpen();

                                    atref.TextString = Math.Round(dim, decs).ToString();
                                }
                            }
                        }
                    }
                    tr.Commit();
                }
            }
        }

~'J'~

82
External databases / Extract data from drawing to xml file
« on: June 25, 2012, 09:35:35 AM »
Code: [Select]
     Imports System
Imports System.Text
Imports System.IO
Imports System.Data
Imports System.Reflection
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Text.RegularExpressions
Imports System.Windows.Forms

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Colors
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DataExtraction
''----------------------------------------------------------''
Example how to exract data into the .xml file in Debug folder
''----------------------------------------------------------''

  '' based on Kean Walmsley's example from there:
        '' http://through-the-interface.typepad.com/through_the_interface/2008/04/extracting-data.html
        <CommandMethod("exlines")> _
        Public Sub ExtractLines()
            Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
            Dim starttime As Double
            Dim endtime As Double

            Dim dialog As New System.Windows.Forms.OpenFileDialog

            With dialog
                .CheckPathExists = True
                .CheckPathExists = True
                .DefaultExt = "dxf"
                .DereferenceLinks = True
                .Multiselect = False
                .Filter = "Drawing (*.dwg)|*.dwg|All files (*.*)|*.*"
                .Title = "Select drawing"
                .FilterIndex = 1

            End With

            If dialog.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
                Return
            End If

            Dim fname As String = dialog.FileName

            starttime = DateAndTime.Timer

            Try

                ''------------------------------------------------------------------------------------------------------''
                ' following datatable easy to write to the any data file (Excel, Access, SQL etc)

                Dim dataTable As System.Data.DataTable = ExtractLines(fname)
                ''------------------------------------------------------------------------------------------------------''
                endtime = DateAndTime.Timer
                '' write data to Lines.xml in the Debug folder
               '' change the full path name of the file if you want to save it in other folder
                dataTable.WriteXml("Lines.xml")

                ed.WriteMessage(vbLf + "Elapsed time: {0:f4} seconds" + vbLf + "Found {1} objects" + vbLf, endtime - starttime, dataTable.Rows.Count)

            Catch ex As System.Exception
                MsgBox(vbCr & ex.ToString & vbCr & ex.StackTrace)
            End Try
            '' Display the  file
            Process.Start("lines.xml", Nothing)
        End Sub

        Public Function extractLines(ByVal fname As String) As System.Data.DataTable
            Dim dataTable As New System.Data.DataTable()
            Dim blkTable As New System.Data.DataTable()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument

            Dim ed As Editor = doc.Editor

            Dim tags As New List(Of String)()
            If Not System.IO.File.Exists(fname) Then
                ed.WriteMessage(vbLf & "Drawing file does not exist.")
                Return Nothing
                Exit Function
            End If
            Dim es As IDxExtractionSettings = New DxExtractionSettings()

            Dim de As IDxDrawingDataExtractor = es.DrawingDataExtractor

            de.Settings.ExtractFlags = ExtractFlags.None Or ExtractFlags.ModelSpaceOnly

            de.Settings.ExtractFlags = ExtractFlags.ExtractBlockOnly ''Or ExtractFlags.ModelSpaceOnly

            Dim fr As IDxFileReference = New DxFileReference(Path.GetDirectoryName(fname), fname)

            de.Settings.DrawingList.AddFile(fr)

            ' Scan the drawing for object types & their properties

            de.DiscoverTypesAndProperties(Path.GetDirectoryName(fname))

            Dim types As List(Of IDxTypeDescriptor) = de.DiscoveredTypesAndProperties

            ' Select all the types and properties for extraction

            ' by adding them one-by-one to these two lists

            Dim selTypes As New List(Of String)()

            Dim selProps As New List(Of String)()

            For Each type As IDxTypeDescriptor In types


                selTypes.Add(type.GlobalName)

                For Each pr As IDxPropertyDescriptor In type.Properties


                    If Not selProps.Contains(pr.GlobalName) Then


                        selProps.Add(pr.GlobalName)
                    End If

                Next
            Next

            de.Settings.SetSelectedTypesAndProperties(types, selTypes, selProps)

            ' Now perform the extraction itself

            de.ExtractData(Path.GetDirectoryName(fname))

            ' Get the results of the extraction

            dataTable = de.ExtractedData

            If dataTable.Rows.Count > 0 Then

                dataTable.TableName = "Lines"

                Dim selrows As DataRow() = dataTable.Select("AcDxObjectTypeGlobalName Like '%Line' Or AcDxObjectTypeGlobalName Like '%Text' Or AcDxObjectTypeGlobalName Like '%MText'")

                blkTable = dataTable.Clone()

                For Each dr As DataRow In selrows
                    blkTable.ImportRow(dr)
                Next
                '' commented lines is just for populating form listbox control
                'Dim columns As String() = New String() {"AcDxObjectTypeName"}

                'Dim dvw As DataView = blkTable.DefaultView
                'distinctTable = dvw.ToTable(False, columns)

                'Dim bnames As New List(Of String)()
                'For Each dr As System.Data.DataRow In distinctTable.Rows
                '    Dim bname As String = dr(0).ToString()
                '    If Not bnames.Contains(bname) Then
                '        bnames.Add(bname)
                '    End If
                'Next

                'Me.lst.DataSource = bnames'' <-- to fill ListBox only

                'lst.SelectedIndex = -1'' <-- set selected items to nothing
            End If

            Return blkTable
        End Function

~'J'~

83
Tables / Apply a minimum column width setting
« on: June 25, 2012, 06:21:56 AM »
 
Code: [Select]
       // Apply a minimum column width setting
        [CommandMethod("ChangeTableColumnsWidths", "CtCw", CommandFlags.UsePickSet)]

        public static void ChangeTableColumnsWidths()
        {

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

            Editor ed = doc.Editor;

            try
            {
                PromptEntityOptions peo = new PromptEntityOptions("\nSelect table to fix columns");

                peo.SetRejectMessage("\nYou have to select table...");

                peo.AddAllowedClass(typeof(Table), false);

                peo.AllowNone = false;

                PromptEntityResult per = ed.GetEntity(peo);

                if (per.Status != PromptStatus.OK)

                    return;

                ObjectId id = per.ObjectId;

                Transaction tr = doc.TransactionManager.StartTransaction();

                using (tr)
                {

                    // Open the table for read content
                    Table tb = tr.GetObject(id, OpenMode.ForRead) as Table;
                    List<List<double>> tbcontent = new List<List<double>>();
                    // to simplify code look up to the first cell of header rows, ignore title row
                    Cell cl = tb.Cells[1, 0];
                    // get text height
                    double th = (double)cl.TextHeight;//cl.Contents[0].TextHeight;

                    double ratio = 1.25;// ratio between height and width of characters, approx., calc by yourself for your font
                    double lwd = th * ratio;
                    for (int i = 1; i < tb.Rows.Count; i++)
                    {
                        List<double> tmpline = new List<double>();

                        for (int j = 0; j < tb.Columns.Count; j++)
                        {

                            tmpline.Add(tb.Cells[i, j].Value == null ? 0.0 : tb.Cells[i, j].TextString.Length); //if empty cell then add  zero
                        }
                        tbcontent.Add(tmpline);

                    }

                    List<double> raws = new List<double>();

                    for (int j = 0; j < tb.Columns.Count; j++)
                    {
                        List<double> tmp = new List<double>();
                        for (int i = 0; i < tbcontent.Count; i++)
                        {
                            List<double> tmpline = tbcontent[i];
                            double twid = tmpline[j] * lwd;
                            tmp.Add(twid);
                        }
                        raws.Add(tmp.Max());

                    }
                    //open for write
                    tb.UpgradeOpen();
                    //aplly new column width
                    for (int i = 0; i < raws.Count; i++)
                    {
                        tb.Columns[i].Width = raws[i];
                    }

                    tb.Width = raws.Sum();//optional, set table common with

                    tb.UpgradeOpen();

                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("\n" + ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {

            }
        }

      VB.NET
Code: [Select]

      ' Apply a minimum column width setting   
        <CommandMethod("ChangeTableColumnsWidths", "CtCw", CommandFlags.UsePickSet)> _
        Public Shared Sub ChangeTableColumnsWidths()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Try
                Dim peo As New PromptEntityOptions(vbLf & "Select table to fix columns")
                peo.SetRejectMessage(vbLf & "You have to select table...")
                peo.AddAllowedClass(GetType(Table), False)
                peo.AllowNone = False
                Dim per As PromptEntityResult = ed.GetEntity(peo)
                If per.Status <> PromptStatus.OK Then
                    Return
                End If
                Dim id As ObjectId = per.ObjectId
                Dim tr As Transaction = doc.TransactionManager.StartTransaction()
                Using tr
                    ' Open the table for read content   
                    Dim tb As Table = TryCast(tr.GetObject(id, OpenMode.ForRead), Table)
                    Dim tbcontent As New List(Of List(Of Double))()
                    ' to simplify code look up to the first cell of header rows, ignore title row   
                    Dim cl As Cell = tb.Cells(1, 0)
                    ' get text height         
                    Dim th As Double = CDbl(cl.TextHeight)
                    'cl.Contents[0].TextHeight;   
                    Dim ratio As Double = 1.25
                    ' ratio between height and width of characters, approx., calc by yourself for your font 
                    Dim lwd As Double = th * ratio
                    For i As Integer = 1 To tb.Rows.Count - 1
                        Dim tmpline As New List(Of Double)()
                        For j As Integer = 0 To tb.Columns.Count - 1
                            'if empty cell then add  zero
                            tmpline.Add(If(tb.Cells(i, j).Value Is Nothing, 0.0, tb.Cells(i, j).TextString.Length))
                        Next
                        tbcontent.Add(tmpline)
                    Next
                    Dim raws As New List(Of Double)()
                    For j As Integer = 0 To tb.Columns.Count - 1
                        Dim tmp As New List(Of Double)()
                        For i As Integer = 0 To tbcontent.Count - 1
                            Dim tmpline As List(Of Double) = tbcontent(i)
                            Dim twid As Double = tmpline(j) * lwd
                            tmp.Add(twid)
                        Next
                        raws.Add(tmp.Max())
                    Next
                    'open for write     
                    tb.UpgradeOpen()
                    'aplly new column width   
                    For i As Integer = 0 To raws.Count - 1
                        tb.Columns(i).Width = raws(i)
                    Next
                    tb.Width = raws.Sum()
                    'optional, set table common with   
                    tb.UpgradeOpen()
                    tr.Commit()
                End Using
            Catch ex As System.Exception
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(vbLf & ex.Message & vbLf & ex.StackTrace)
            Finally
            End Try
        End Sub

84
Tables / Create part reference table
« on: June 24, 2012, 08:55:35 PM »
The real world example, based on the drawing from there:
http://forums.augi.com/showthread.php?136467-lisp-table-help&p=1167872&viewfull=1#post1167872

~'J'~

85
Polylines / Extend curve
« on: June 22, 2012, 10:34:19 PM »
Code: [Select]
        [CommandMethod("ExtendCurve", "exc", CommandFlags.Modal)]
        static public void testExtendCurve()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;

            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    PromptEntityOptions peo = new PromptEntityOptions("\nSelect boundary edge... >>");

                    PromptEntityResult exres;
                    exres = ed.GetEntity(peo);
                    if (exres.Status != PromptStatus.OK)
                        return;

                    Entity exent = (Entity)tr.GetObject(exres.ObjectId, OpenMode.ForRead);
                    if (exent == null)
                        return;
                    Curve excur = exent as Curve;
                    peo = new PromptEntityOptions("\nSelect curve to extend >>");

                    PromptEntityResult res;
                    res = ed.GetEntity(peo);
                    if (res.Status != PromptStatus.OK)
                        return;

                    Entity ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                    if (ent == null)
                        return;

                    if (ent.GetRXClass().DxfName == "SPLINE")
                    {
                        ed.WriteMessage("\nCould not extend the spline");
                        return;
                    }
                    Curve cur = ent as Curve;
                    Point3dCollection pts = new Point3dCollection();
                    cur.IntersectWith(excur, Intersect.ExtendThis, pts, 0, 0);
                    if (pts.Count == 0)
                    {
                       ed.WriteMessage("\nCurves aren't intersects each other");
                        return;
                    }

                    Point3d pt = pts[0];// ought be to correct this point with circle and closed polyline
                   
                    if (!cur.IsWriteEnabled)
                        cur.UpgradeOpen();

                    Point3d pp = cur.GetClosestPointTo(res.PickedPoint, false);

                    bool sofar = false;

                    if (pp.DistanceTo(pt) < pt.DistanceTo(cur.EndPoint))
                        sofar = true;

                    if (sofar)
                    {
                        cur.Extend(true, pt);
                    }
                    else
                    {
                        cur.Extend(false, pt);
                    }
                   
                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage(ex.Message );
            }

        }

~'J'~

86
Layouts and printing / Get the layout an entity belongs to
« on: June 22, 2012, 07:26:01 PM »
Code: [Select]
  // based on code from:
  // http://adndevblog.typepad.com/autocad/2012/06/get-the-layout-an-entity-belongs-to.html
  [CommandMethod("EntityLayoutName","enl", CommandFlags.Modal)]
        static public void GetEntityLayout()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                PromptEntityOptions peo = new PromptEntityOptions("\nSelect object >>");

                PromptEntityResult res;

                res = ed.GetEntity(peo);

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

                Entity ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);

                if (ent == null)
                    return;

                BlockTableRecord btr = tr.GetObject(ent.OwnerId, OpenMode.ForRead, true) as BlockTableRecord;

                Layout lt = tr.GetObject(btr.LayoutId, OpenMode.ForRead, true) as Layout;

                string layoutName = lt.LayoutName;

                ed.WriteMessage("\nThe layout the selected entity belongs to is {0}", layoutName);

            }
        }

87
Hatching / Intersect an outerloop of hatch with curves
« on: June 17, 2012, 03:43:16 PM »
This code will work with associative hatch only

Code: [Select]
        [CommandMethod("hat", CommandFlags.Modal)]
        public static void IntersectHatchWithCurves()
        {

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;

            Transaction tr = db.TransactionManager.StartTransaction();
            using (tr)
            {
                try
                {
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false) as BlockTableRecord;
                    PromptEntityOptions peo = new PromptEntityOptions("\nSelect a hatch: ");
                    peo.SetRejectMessage("Select hatch only!");
                    peo.AddAllowedClass(typeof(Hatch), true);
                    PromptEntityResult res = doc.Editor.GetEntity(peo);
                    if (res.Status != PromptStatus.OK) return;
                    // Point3d pt = res.PickedPoint;
                    Entity ent = tr.GetObject(res.ObjectId, OpenMode.ForRead, false) as Entity;
                    Hatch hat = ent as Hatch;
                    if (hat == null)
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("No luck, mate...");
                        return;
                    }
                    // get outer loop of hatch
                    HatchLoop loops = hat.GetLoopAt(0);
                    Polyline pline = new Polyline();
                 if (loops.IsPolyline)
                 {
                     DoubleCollection bulgcoll=new DoubleCollection();
                     Point2dCollection pts=new Point2dCollection();
                     BulgeVertexCollection bulges =  loops.Polyline;

                    for (int i=0;i<bulges.Count;i++)
                    {
                        BulgeVertex bulg = bulges[i];
                        bulgcoll.Add(bulg.Bulge);
                        pts.Add(bulg.Vertex);
                    }
                     // create polyline around of the hatch
                     pline = new Polyline(bulges.Count);
                    for (int n = 0; n < pts.Count; n++)
                    {
                        pline.AddVertexAt(n, pts[n], bulgcoll[n], 0, 0);
                    }
                     // commented lines used just for debug only
                    //btr.AppendEntity(pline);
                    //tr.AddNewlyCreatedDBObject(pline, true);
                    //pline.ColorIndex = 5;
                 }

                    // select all intersection curves on layer "0"
                 TypedValue[] tvs = new TypedValue[] {
              new TypedValue((int) DxfCode.Start, "arc,circle,line,lwpolyline,spline"),
              new TypedValue((int) DxfCode.LayerName, "0")
            };
                 SelectionFilter sf = new SelectionFilter(tvs);
                 PromptSelectionOptions pso = new PromptSelectionOptions();
                    pso.MessageForRemoval="\nwrong object selected!";
                 pso.MessageForAdding = "\nSelect curves separately one by another: ";
                 PromptSelectionResult psr = ed.GetSelection(pso,sf);
                 int count = 0;
                 if (psr.Status == PromptStatus.OK)
                 {
                     count = psr.Value.GetObjectIds().Length;

                     ed.WriteMessage("\nSelected:    " + count.ToString());

                 }
                 else
                 {
                     ed.WriteMessage("\nBad selection");
                     return;

                 }

                 foreach (SelectedObject selobj in psr.Value)
                 {
                     
                         DBObject obj = tr.GetObject(selobj.ObjectId, OpenMode.ForRead) as DBObject;
                         Curve curv = obj as Curve;
                         if (obj.ObjectId != pline.ObjectId)
                         {
                         Point3dCollection ipts = new Point3dCollection();
                         // next line is may have another syntax for other Acad release
                         pline.IntersectWith(curv, Intersect.OnBothOperands, ipts, (int)IntPtr.Zero, (int)IntPtr.Zero);

                         if (ipts.Count > 0)
                         {
                             foreach (Point3d pt in ipts)
                             {
                                 // draw circles in intersection for dispaying the result
                                 Circle circ = new Circle(pt, Vector3d.ZAxis, 0.5);
                                 btr.AppendEntity(circ);
                                 tr.AddNewlyCreatedDBObject(circ, true);
                                 circ.ColorIndex = 2;
                             }
                         }
                     }
                 }
                    tr.Commit();
                }
                catch (Autodesk.AutoCAD.Runtime.Exception ex)
                {
                    ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);

                }
                finally
                {

                }
            }
        }

~'J'~

88
Colors and linetypes / Using AutoCAD dialogs
« on: June 17, 2012, 10:34:21 AM »
Code: [Select]
       using Autodesk.AutoCAD.Runtime;
        using Autodesk.AutoCAD.ApplicationServices;
        using Autodesk.AutoCAD.DatabaseServices;
        using Autodesk.AutoCAD.Geometry;
        using Autodesk.AutoCAD.EditorInput;
        using Autodesk.AutoCAD.EditorInput;
        using Autodesk.AutoCAD.Windows;
        //________________________________________//

        [Obsolete]//   just for use ObjectId.Open method below
        [CommandMethod("setlt")]
        public static void SetLinetype()
        {
            var db = HostApplicationServices.WorkingDatabase;
            var ld = new Autodesk.AutoCAD.Windows.LinetypeDialog();
            if (ld.ShowDialog() != DialogResult.OK) return;
            var ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;           
            LinetypeTableRecord ltr = ld.Linetype.Open(OpenMode.ForRead, false) as LinetypeTableRecord;
            ed.WriteMessage("\nSelected linetype: " + ltr.Name);
            db.Celtype = ld.Linetype;
        }


        [CommandMethod("setc")]
        public static void SetColor()
        {
            var db = HostApplicationServices.WorkingDatabase;
            var cd = new Autodesk.AutoCAD.Windows.ColorDialog();
            if (cd.ShowDialog() != DialogResult.OK) return;
            var ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage("\nSelected color: " + cd.Color);
            db.Cecolor = cd.Color;

        }
   
        [CommandMethod("setlw")]
        public static void SetLineWeight()
        {
            var db = HostApplicationServices.WorkingDatabase;
            var lw = new Autodesk.AutoCAD.Windows.LineWeightDialog();
            if (lw.ShowDialog() != DialogResult.OK) return;
            var ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            LineWeight lwt = lw.LineWeight;
            ed.WriteMessage("\nSelected linetype: " + lwt.ToString());
            db.Celweight = lwt;
        }

~'J'~

89
Blocks / Get block name by subentity
« on: June 16, 2012, 12:16:41 PM »
Code: [Select]
        [CommandMethod("bnm")]
        // expired by Barbara Hun:
        // http://adndevblog.typepad.com/autocad/2012/05/get-block-that-entities-are-included-in.html#tpe-action-posted-6a0167607c2431970b0167674896a4970b
        public static void getBlockNameFromItsSubentity()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;

            Matrix3d ucs = ed.CurrentUserCoordinateSystem;

            PromptNestedEntityOptions pno = new PromptNestedEntityOptions("\nSelect an subentity inside an INSERT: ");

            PromptNestedEntityResult nres = ed.GetNestedEntity(pno);

            if (nres.Status != PromptStatus.OK)
            {
                ed.WriteMessage("\nEntsel failed");
                return;
            }

            try
            {
                Transaction tr = db.TransactionManager.StartTransaction();

                using (tr)
                {
                    Point3d pickPt = nres.PickedPoint.TransformBy(ucs);

                    ed.WriteMessage("\nPicked point is {0}", pickPt);

                    ObjectId selId = nres.ObjectId;

                    List<ObjectId> objIds = new List<ObjectId>(nres.GetContainers());

                    // Reverse the "containers" list

                    // Now append the selected entity

                    objIds.Add(selId);

                    objIds.Reverse();

                    // Retrieve the sub-entity path for this entity

                    SubentityId subEnt = new SubentityId(SubentityType.Null, 0);

                    FullSubentityPath path = new FullSubentityPath(objIds.ToArray(), subEnt);

                    // Open the outermost container, relying on the open

                    // transaction...

                    Entity subent = tr.GetObject(objIds[0], OpenMode.ForRead, false) as Entity;

                    // Output the class name of the sub entity

                    ed.WriteMessage("\nThe sub entity is of type {0}", subent.GetType().Name);

                    // Get the object id of the owner block

                    ObjectId eid = subent.OwnerId;

                    DBObject bowner = tr.GetObject(eid, OpenMode.ForRead, false) as DBObject;

                    // Output the class name of the owner block

                    ed.WriteMessage("\nThe owner is of type {0}",

                    bowner.GetType().Name);

                    string blkname = string.Empty;

                    // Output the information of the block definition

                    BlockTableRecord btrec = bowner as BlockTableRecord;

                    if (btrec != null)
                    {

                        blkname = btrec.Name;


                        ed.WriteMessage("\nBlock Record name is {0}", blkname);

                    }
                    BlockReference bref = bowner as BlockReference;

                    if (bref != null)
                    {
                        bowner = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead, false) as BlockTableRecord;

                        if (bref.IsDynamicBlock)
                        {
                            btrec = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead, false) as BlockTableRecord;

                            blkname = btrec.Name;
                        }
                        else
                        {
                            blkname = bref.Name;
                        }

                        ed.WriteMessage("\nBlock Reference name is {0}", blkname);

                    }
                    tr.Commit();
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {

            }
        }

90
Blocks / Get all block references on a particular layout
« on: June 06, 2012, 07:01:24 PM »

Code: [Select]
      //inspired by Xiaodong Liang
      [CommandMethod("finb")]
        public static void FindBlokRefInLayout()
        {
            SelectionSet ss;

            string lName = "Layout1";

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            // switch to the Layout1
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("ctab", lName);

            Transaction tr = db.TransactionManager.StartTransaction();

            using (tr)
            {
                try
                {
                    BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;

                    foreach (ObjectId id in bt)
                    {

                        BlockTableRecord btr;

                        btr = tr.GetObject(id, OpenMode.ForRead) as BlockTableRecord;

                        // if this is a layout

                        if (btr.IsLayout)
                        {

                            ObjectId lid = btr.LayoutId;

                            Layout lt = tr.GetObject(lid, OpenMode.ForWrite) as Layout;

                            List<ObjectId> objs = new List<ObjectId>();

                            // get name of the layout

                            if (lt.LayoutName != lName)
                            { 
                                continue;
                            }
                            else
                            {

                                // select all blocks on Layout1

                                RXClass etype = RXObject.GetClass(typeof(BlockReference));

                                // iterate the entities within the layout

                                foreach (ObjectId eid in btr)
                                {
                                    Entity ent;

                                    ent = tr.GetObject(eid, OpenMode.ForRead) as Entity;

                                    // cast if this is a block reference

                                    if (eid.ObjectClass.IsDerivedFrom(etype))
                                    {

                                        objs.Add(eid);

                                        // highlight entity
                                       
                                        ent.Highlight();

                                    }

                                }
                            }
                            // populate the selectionset

                                ed.SetImpliedSelection(objs.ToArray<ObjectId>());

                            // perform the selection

                                PromptSelectionResult res = ed.SelectImplied();

                           
                                if (res.Status == PromptStatus.OK)
                                {

                                    ss = res.Value;
                                    // display information for user
                                    ed.WriteMessage("\n\t---\tSelected: {0} block instances", ss.GetObjectIds().Length);
                                }
                                else
                                {
                                    ed.WriteMessage("\nEmpty selection!");
                                   // return;
                                }

                        }

                    }
                    tr.Commit();
                }
                catch (System.Exception ex)
                {
                    ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);
                }
            }
        }

~'J'~

Pages: 1 ... 4 5 [6] 7 8