我正在尝试从一个应用程序中创建的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;
}
}
}
答案 0 :(得分:0)
试试这个。
// add this line:
using AttributeSyncExternal;
here:
//THIS IS THE IN PROCESS AUTOCAD SCRIPT
namespace AttributeSyncExternal.Attributesync
修改强>
泰洛先生看着上面的代码,我的眼睛很痛。 TBH我无法理解。以下适用于我。它是一个简单的控制台应用程序,它说明了应该发生的事情:
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";
}
}
}
最终结果:
答案 1 :(得分:0)
要使用using static AttributeSyncExternal.AttributeSyncForm
,AttributeSyncForm
类必须是静态的
答案 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);
}
}
}
}
}