Застрял в синей Spinner после Windows Форма закрыта, пытаясь передать значение - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь передать значение обратно из WinForms, которые я пытаюсь настроить, однако, как только форма закрывается, Revit застревает в синей прядильной машине после нажатия кнопки продолжения и не возвращается к работе. оригинальная программа.

Я проверил, но не нашел ничего, что могло бы вернуть его в программу. Большинство (если не все) учебных пособий по WinForms не имеют отношения к работе с Revit. Большинство из того, что я нашел / наблюдал, имеет дело с передачей значения из одной формы в другую, хотя я нашел это , хотя это немного отличается.

вот мой код:

Form1.cs

public partial class Form1 : System.Windows.Forms.Form
    {
        private UIApplication uiapp;
        private UIDocument uidoc;
        private Autodesk.Revit.ApplicationServices.Application app;
        private Document doc;

        private string myVal;

        public string MyVal
        {
            get { return myVal; }
            set { myVal = value; }
        }

        public Form1(ExternalCommandData commandData)
        {
            InitializeComponent();

            uiapp = commandData.Application;
            uidoc = uiapp.ActiveUIDocument;
            app = uiapp.Application;
            doc = uidoc.Document;
    }

    public delegate void delPassData(System.Windows.Forms.ComboBox text);

        private void Form1_Load(object sender, EventArgs e)
        {
            //Create a filter to get all the title block types.
            FilteredElementCollector colTitleBlocks = new FilteredElementCollector(doc);
            colTitleBlocks.OfCategory(BuiltInCategory.OST_TitleBlocks);
            colTitleBlocks.WhereElementIsElementType();

            foreach(Element x in colTitleBlocks)
            {
                comboBox1TitleBlockList.Items.Add(x.Name);
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1Continue_Click(object sender, EventArgs e)
        {

            MyVal = comboBox1TitleBlockList.Text;  // is returning with Titleblock.Name

            button1Continue.DialogResult = DialogResult.OK;
            Debug.WriteLine("OK button was clicked.");
            Close();
            //Dispose();
            return;
        }

        private void button2Cancel_Click(object sender, EventArgs e)
        {
            button2Cancel.DialogResult = DialogResult.Cancel;
            Debug.WriteLine("Cancel button was clicked");
            //Dispose();

            Close();
            return;
        }

        private void comboBox1TitleBlockList_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }

Command.cs

 Form1 form1 = new Form1(commandData);

 System.Windows.Forms.Application.Run(new Form1(commandData)); // not sure if this line is required.

 form1.ShowDialog();

 String elementString = form1.MyVal; //<---- this is returning null. need to figure out how to pass value from form1 back to Command.cs

if (elementString != null)
   {
       elementString = form1.MyVal.ToString();
       Element eFromString = doc.GetElement(elementString);
       titleBlockId = eFromString.Id;                                
   }
   else
   {
        titleBlockId = collector.FirstElementId();
   }

Любая помощь и направление приветствуются.

1 Ответ

0 голосов
/ 11 марта 2020

Это никогда не сработает. Вы говорите, что not sure if this line is required пытается ... Я даже не могу описать, чего он пытается достичь.

Revit API основан исключительно на событиях, а ваша надстройка Revit может выполнять вызовы Revit API только из действительный контекст Revit API. Такой контекст предоставляется только в обработчиках событий, которые вы связываете с событиями Revit.

Ваш код не подписан на подобные события. Следовательно, это не надстройка Revit.

Проработайте через Revit API материал для начала работы и постройте надстройку в соответствии с архитектурными требованиями надстройки Revit.

...