Jump to content

Recommended Posts

Posted

Hey all,

 

New to C# and trying to slowly get my way around.

 

I can get a variation of my code to work with MDIActiveDocument but what I really want my program to do is allow the user to select a bunch of drawings and then perform some edits to them.

 

I am just trying to get some text inside of an excel file inputted into the .dwg file.

Here is my retag.cs file

using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

[assembly: CommandClass(typeof(retag.Retag))]

namespace retag
{
    internal class Retag
    {
        [CommandMethod("DwgRetag")]
        public void DwgRetag()
        {
            // get the excel information
            ExcelHandler xlHandler = new ExcelHandler();

            Dictionary<string, List<(string, string)>> tags = xlHandler.GetTagInfo();

            // get the list of .dwgs
            dwgHandler dwgHandler = new dwgHandler();

            List<string> dwgs = dwgHandler.GetListOfDwgs();

            dwgHandler.AddTags(tags, dwgs);

        }
    }
}

 

here is the dwgHandler.cs file

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

using System.Windows.Forms;
using Application = Autodesk.AutoCAD.ApplicationServices.Application;
using System.IO;
using Exception = System.Exception;

namespace retag
{
    internal class dwgHandler
    {

        public dwgHandler() { }

        public List<string> GetListOfDwgs()
        {
            List<string> dwgFiles = new List<string>();

            // Create an OpenFileDialog to select .dwg files
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                Filter = "DWG files (*.dwg)|*.dwg",
                Multiselect = true // Allow multiple file selection
            };

            // Show the dialog and get the result
            DialogResult result = openFileDialog.ShowDialog();

            if (result == DialogResult.OK)
            {
                // Add the selected file paths to the list
                foreach (string filePath in openFileDialog.FileNames)
                {
                    dwgFiles.Add(filePath);
                }
            }

            return dwgFiles;
        }

        public void AddTags(Dictionary<string, List<(string, string)>> tags, List<string> dwgs) 
        {

            string documentName;				// the document name
            List<(string, string)> dwgTags;		// drawing tags

            foreach (string filePath in dwgs)
            {
                dwg acDwg = new dwg(filePath);

                // get the tags per drawing
                documentName = Path.GetFileNameWithoutExtension(filePath).ToUpper();

                if (tags.TryGetValue(documentName, out dwgTags))
                {
                    
                    acDwg.addTags(dwgTags);
                    acDwg.CloseAndSave();

                } else
                {
                    continue;
                }
 
            }
        
        }

    }
}

 

and the dwg.cs is:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using Exception = System.Exception;

namespace retag
{
    internal class dwg
    {
        private Document doc;
        private Database acDb;
        private Editor ed;

        public dwg(string filePath) 
        {
            doc = Application.DocumentManager.Open(filePath, false);
            acDb = doc.Database;
            ed = doc.Editor;

        }

        public void CloseAndSave()
        {
            try
            {
                // Save the current document
                doc.Database.SaveAs(doc.Name, true, Autodesk.AutoCAD.DatabaseServices.DwgVersion.Current, doc.Database.SecurityParameters);
                Console.WriteLine("Document saved successfully.");

                // Close the document
                doc.CloseAndDiscard();
                Console.WriteLine("Document closed.");
            }
            catch (System.Exception ex)
            {
                Console.WriteLine($"Error saving or closing the document: {ex.Message}");
                // Handle the exception (log, display, etc.)
            }
        }


        public void addTags(List<(string, string)> tags)
        {           
            // Define the starting coordinates
            double x = -10.0;
            double y = 21.0;
            double verticalGap = 0.2;

            // Create a new layer for the first tag in each pair
            string layerName = "old tags";
            CreateLayer(layerName);

            // Iterate through the list of tag pairs
            foreach (var tagPair in tags)
            {
                // Create the first text object (tag1) on the specified layer
                CreateText(tagPair.Item1, x, y, layerName, addBrackets: true);

                // Create the second text object (tag2) next to the first one
                CreateText(tagPair.Item2, x + 1.0, y, "0", addBrackets: false); // Assuming "0" layer for tag2

                // Move to the next row
                y -= verticalGap;
            }

        }

        private ObjectId CreateLayer(string layerName)
        {
            using (Transaction tr = this.acDb.TransactionManager.StartTransaction())
            {
                try
                {
                    LayerTable layerTable = (LayerTable)tr.GetObject(acDb.LayerTableId, OpenMode.ForWrite);

                    if (!layerTable.Has(layerName))
                    {
                        // Create a new layer if it doesn't exist
                        using (LayerTableRecord newLayer = new LayerTableRecord())
                        {
                            newLayer.Name = layerName;
                            newLayer.Color = Color.FromColorIndex(ColorMethod.ByAci, 3); // Set color to green


                            ObjectId newLayerId = layerTable.Add(newLayer);
                            tr.AddNewlyCreatedDBObject(newLayer, true);

                            // Commit the transaction
                            tr.Commit();

                            return newLayerId;
                        }
                    }
                    else
                    {
                        // Layer already exists, return its ObjectId
                        return layerTable[layerName];
                    }
                }
                catch (Exception ex)
                {
                    // Handle exceptions (log, display, etc.)
                    Console.WriteLine($"Error creating layer: {ex.Message}");
                    return ObjectId.Null;
                }
            }
        }

        private void CreateText(string text, double x, double y, string layerName, bool addBrackets)
        {
            if (this.doc == null)
            {
                // Handle the case where there is no active document
                return;
            }

            using (Transaction tr = this.acDb.TransactionManager.StartTransaction())
            {
                try
                {
                    BlockTable bt = (BlockTable)tr.GetObject(acDb.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                    // Add brackets if requested
                    if (addBrackets)
                        text = $"({text})";

                    DBText textEntity = new DBText
                    {
                        TextString = text,
                        Position = new Point3d(x, y, 0),
                        Layer = layerName
                    };

                    btr.AppendEntity(textEntity);
                    tr.AddNewlyCreatedDBObject(textEntity, true);

                    // Commit the transaction
                    tr.Commit();
                }
                catch (Exception ex)
                {
                    // Handle exceptions (log, display, etc.)
                    Console.WriteLine($"Error creating text: {ex.Message}");
                }
            }
        }
    }
}

 

the main issue i am currently running into is that when it closes and saves, I get an error from autocad saying "error closing/writing file" and in my debug window I am getting "Exception thrown: 'Autodesk.AutoCAD.Runtime.Exception' in Acdbmgd.dll" and I cannot for the life of me figure out why this is happening. My google-fu comes up with stuff that I am confident I am not doing.

 

Any and all help is appreciated.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...