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

时间:2017-02-07 19:07:13

标签: c# .net autocad autocad-plugin

我正在尝试从一个应用程序中创建的Windows窗体页面中提取变量,并将其传递给我编写的AutoCAD C#.Net函数。

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

我有一个类,其中包含我正在设置的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;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

试试这个。

// add this line:
using AttributeSyncExternal;

here: 

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

修改

泰洛先生看着上面的代码,我的眼睛很痛。 TBH我无法理解。

enter image description here

以下适用于我。它是一个简单的控制台应用程序,它说明了应该发生的事情:

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";
        }
    }
}

最终结果:

enter image description here

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在AutoCAD方面,DumpAttribute类必须知道' AttribuSyncForm的运行实例。 通常,在AutoCAD命令中创建表单的新实例,并使用Application.ShowModalDialog()(或ShowModelessDialog())显示。这样,CommandMethod就可以简单地访问AttribuSyncForm公共实例属性。

在表格方面:

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);
                }
            }
        }
    }
}