Saya mencoba memberikan nilai kembali dari WinForms yang saya coba atur namun begitu formulir ditutup, Revit macet di pemintal biru setelah tombol lanjutkan diklik dan tidak kembali menjalankan program asli .

Saya sudah memeriksanya tetapi belum menemukan apa pun yang membuatnya kembali ke program. Sebagian besar (jika tidak semua) tutorial di WinForms tidak terkait dengan Revit. Sebagian besar yang saya temukan/tonton berurusan dengan meneruskan nilai dari satu bentuk ke bentuk lainnya, meskipun Saya menemukan yang ini meskipun sedikit berbeda.

Ini kode saya:

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

Setiap dan semua bantuan/arahan dihargai.

0
Cflux 11 Maret 2020, 05:12

1 menjawab

Jawaban Terbaik

Ini tidak akan pernah berhasil. baris Anda mengatakan not sure if this line is required mencoba untuk ... Saya bahkan tidak dapat menjelaskan apa yang ingin dicapai.

Revit API murni digerakkan oleh peristiwa dan add-in Revit Anda hanya dapat melakukan panggilan ke Revit API dari konteks Revit API yang valid. Konteks seperti itu hanya disediakan dalam event handler yang Anda kaitkan dengan acara Revit.

Kode Anda tidak berlangganan acara semacam itu. Oleh karena itu, ini bukan add-in Revit.

Silakan bekerja melalui Materi memulai API Revit dan membangun Anda add-in sesuai dengan persyaratan arsitektur add-in Revit.

0
Jeremy Tammik 11 Maret 2020, 06:49