Jump to content

C#, read data from an AutoCAD variable and pass it to another AutoCAD variable.


Recommended Posts

Posted

Hi, I'm writing a function in C#. The goal is to read an XML file and extract all point numbers into a list. I can't figure out how to pass the file path for reading through an AutoCAD variable. Right now, I'm doing it via a configuration file, but that's not convenient. I want to get the file path from an AutoCAD variable—for example, my file path is stored in a variable like filepathXML.

Additionally, the function currently outputs the result to the AutoCAD command line, but I need to assign this result to an AutoCAD variable (e.g., listPointID). I also can't understand how to do that.

Overall, the code works and does what I need, but I'm struggling with handling the variables properly.

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;

public class PointIdExtractor
{
    [CommandMethod("GetPointIds")]
    public static void GetPointIdsCommand()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;

        try
        {
            // Getting the path from the configuration file
            string filePath = GetFilePathFromConfig();

            if (string.IsNullOrEmpty(filePath))
            {
                ed.WriteMessage("\nError: Failed to get file path from configuration");
                return;
            }

            if (!File.Exists(filePath))
            {
                ed.WriteMessage($"\nError: File not found at path: {filePath}");
                return;
            }

            List<int> ids = GetPointIdsFromFile(filePath);

            // We format the output as (1 2 3 4 5 ...)
            ed.WriteMessage($"\nFound point IDs: {FormatAsLispList(ids)}");
        }
        catch (System.Exception ex)
        {
            ed.WriteMessage($"\nError: {ex.Message}");
        }
    }

    private static string GetFilePathFromConfig()
    {
        try
        {
            // Path to configuration file next to DLL
            string configPath = Path.Combine(
                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                "PointExtractor.cfg");

            if (!File.Exists(configPath))
            {
                // Create a file with an example if it does not exist
                File.WriteAllText(configPath, "DataXmlPath=C:\\path\\to\\your\\file.xml");
                return null;
            }

            // Read all configuration lines
            foreach (string line in File.ReadAllLines(configPath))
            {
                if (line.StartsWith("DataXmlPath="))
                {
                    return line.Substring("DataXmlPath=".Length).Trim();
                }
            }
            return null;
        }
        catch
        {
            return null;
        }
    }

    private static string FormatAsLispList(List<int> numbers)
    {
        StringBuilder sb = new StringBuilder("(");
        bool first = true;

        foreach (int num in numbers)
        {
            if (!first) sb.Append(" ");
            sb.Append(num);
            first = false;
        }
        sb.Append(")");

        return sb.ToString();
    }

    public static List<int> GetPointIdsFromFile(string filePath)
    {
        List<int> ids = new List<int>();
        const string searchPattern = "<P id=\"";

        try
        {
            using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    int pos = 0;
                    while ((pos = line.IndexOf(searchPattern, pos, StringComparison.Ordinal)) != -1)
                    {
                        int start = pos + searchPattern.Length;
                        int end = line.IndexOf('"', start);

                        if (end > start)
                        {
                            string numStr = line.Substring(start, end - start);
                            if (int.TryParse(numStr, out int num))
                            {
                                ids.Add(num);
                            }
                        }

                        pos = end > 0 ? end : pos + 1;
                    }
                }
            }
            return ids;
        }
        catch (System.Exception ex)
        {
            throw new System.Exception($"Failed to process file {filePath}: {ex.Message}");
        }
    }
}

 

Posted

Are you trying to pass this list back to autolisp?

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...