2017-02-07 2 views
1

Я пытаюсь вытащить переменную из страницы Windows Forms, созданной в одном приложении, и передать ее в функцию AutoCAD C# .Net, которую я написал.Невозможно получить доступ к переменной из разных пространств имен в разработке плагинов AutoCAD

Я могу присвоить значение в TextBoxblockNameInput другой переменной. Мне нужно получить ту же информацию в AutoCAD, чтобы потом загрузить все блоки с этим именем.

У меня есть класс со свойствами для blockName, который я устанавливаю и получаю значение. Все это работает в одном пространстве имен. Когда я вызываю одну и ту же переменную в другом пространстве имен, я получаю значение по умолчанию «Старый» вместо значения, которое было введено в 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

Я редактировал свой вопрос. Вы указываете «блоки» и «блок-имена», не определяя их, и это может не иметь отношения к проблеме, которую вы испытываете. Если вы считаете, что они актуальны, то вам следует вкратце объяснить, что они делают, чтобы те, кто не являются экспертами AutoCAD, также могут помочь решить вашу проблему. – Sabuncu

+0

Спасибо за ввод, что блок не должен быть важен для ответа на вопрос. Проблема состоит в том, что я не могу создать экземпляр класса в одном пространстве имен, присваивать значение переменной и затем вызывать это значение в другом пространстве имен, не возвращая это значение по умолчанию. –

+0

меняет значение BlockName на статические ошибки, и я не смог скомпилировать. Изменение общедоступного строкового блокаName = «Старый»; к публичной статической строке blockName = "old"; не имело никакого значения. –

ответ

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

Попробуйте это.

// add this line: 
using AttributeSyncExternal; 

here: 

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

редактировать:

Mr Tayloe мои глаза больно смотреть на коде выше. 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

+0

Я не включил все мои приложения в свой код для упрощения, но я уже использую AttributeSyncExternal.AttributeSyncForm в моем сценарии процесса. Я редактировал мой код, чтобы включить это. –

+0

ОК. Я вернусь к этому позже сегодня вечером ..... mr Tayloe ur code очень запутан, я дам упрощенный пример, и вы можете посмотреть на это – BKSpurgeon

+0

Это было бы очень полезно! –

0

Чтобы использовать using static AttributeSyncExternal.AttributeSyncForm, то AttributeSyncForm класс должен быть статический

Смежные вопросы