无法在 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.AttributeSyncForm
,AttributeSyncForm
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);
}
}
}
}
}
我试图从一个应用程序中创建的 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.AttributeSyncForm
,AttributeSyncForm
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);
}
}
}
}
}