无法在 AutoCAD 插件开发中访问来自不同命名空间的变量

Cannot access variable from different namespace in AutoCAD plugin development

我试图从一个应用程序中创建的 Windows 表单页面中提取一个变量,并将其传递到我编写的 AutoCAD C# .Net 函数中。

我可以将 TextBox blockNameInput 中的值分配给另一个变量。我需要将相同的信息输入到 AutoCAD 中,以便我可以加载具有该名称的所有块。

我有一个 class,其中包含我正在设置并获取其值的 blockName 的属性。这一切都在同一个命名空间中工作。当我在不同的命名空间中调用同一个变量时,我得到默认值 "Old" 而不是输入到 TextBox 中的值。

我可能会在第二个命名空间中启动一个新的 BlockNameClass 实例,但我不知道解决方案是什么。相关代码如下:

//THIS IS THE OUT OF PROCESS AUTOCAD SCRIPT
namespace AttributeSyncExternal
{
    public partial class AttributeSyncForm : Form, IMessageFilter
    {
        public class BlockNameClass
        {
            public string blockName = "Old";
            public string BlockName
            {
                get
                {
                    return blockName;
                }
                set
                {
                    blockName = value;
                }
            }
        }

        public static readonly BlockNameClass _class = new BlockNameClass();
        public static BlockNameClass BlockNameClassInstance
        {
            get { return _class; } 
        }

         private void runButton_Click(object sender, EventArgs e)
        {
            BlockNameClassInstance.BlockName = blockNameInput.Text;
            //DO SOME OTHER STUFF HERE
        }
    }
}


using static AttributeSyncExternal.AttributeSyncForm;
//THIS IS THE IN PROCESS AUTOCAD SCRIPT
namespace AttributeSyncExternal.Attributesync
{
    public class DumpAttributes
    {
        [CommandMethod("LISTATT")]
        public void ListAttributes()
        {
            //DO SOME OTHER STUFF HERE
            string blockName = BlockNameClassInstance.BlockName;
        }
    }
}

试试这个。

// add this line:
using AttributeSyncExternal;

here: 

//THIS IS THE IN PROCESS AUTOCAD SCRIPT
namespace AttributeSyncExternal.Attributesync

编辑:

Tayloe 先生,看到上面的代码我的眼睛很痛。老实说我听不懂。

以下适合我。这是一个简单的控制台应用程序,说明应该发生什么:

namespace firstnamespacetest
{
    class Program
    {
        static void Main(string[] args)
        {
            test t = new test();

            Console.WriteLine(t.BlockName);
            // prints "Old value"

            // event handler changes value
            t.TextBoxHandler();

            //prints new value
            Console.WriteLine(t.BlockName);

            Console.ReadLine();
        }
    }
}

namespace secondNameSpace
{
    class test
    {
        private string _blockName;

        public string BlockName
        {
            get { return _blockName; }
            set { _blockName = value; }
        }

        public test()
        {
            // set initial value of blockname
            _blockName = "Old value";
        }

        public void TextBoxHandler()
        {
            _blockName = "New value of block";
        }
    }
}

最终结果:

要使用 using static AttributeSyncExternal.AttributeSyncFormAttributeSyncForm class 必须是静态的

在 AutoCAD 方面,DumpAttribute class 必须 'know' AttribuSyncForm 的 运行 实例。 通常,窗体的新实例在 AutoCAD 命令中创建并使用 Application.ShowModalDialog()(或 ShowModelessDialog())显示。这样做 CommandMethod 可以简单地访问 AttribuSyncForm public 实例属性。

在表单方面:

namespace AttributeSyncExternal
{
    public partial class AttributeSyncForm : Form
    {
        public AttributeSyncForm()
        {
            InitializeComponent();
        }

        public string BlockName
        {
            get { return blockNameInput.Text; }
            set { blockNameInput.Text = value; }
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.OK;
        }
    }
}

在 AutoCAD 方面

using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;

namespace AttributeSyncExternal.AttributeSync
{
    public class DumpAttributes
    {
        [CommandMethod("LISTATT")]
        public void ListAttributes()
        {
            using (var dlg = new AttributeSyncForm())
            {
                dlg.BlockName = "Old";
                if (AcAp.ShowModalDialog(dlg) == DialogResult.OK)
                {
                    AcAp.ShowAlertDialog(dlg.BlockName);
                }
            }
        }
    }
}