Я пишу надстройку для Revit с шаблоном Джереми Таммика, который создает мне ленту с кнопками.Я читаю в файле Excel, выбирая строки и отправную точку. Моя лента Моя WinForm После того, как пользователь закончил ввод, он должен нажать на кнопку «Готово» (которая в моем случае отсутствует ^^), и он должен сгенерировать некоторые FamilyInstances в проекте, не закрывая WinForm.
Мои проблемы:
- Я не могу использовать
ShowDialog()
верно?Потому что это создаст мне модальную форму, и тогда я не смогу получить никакого пользовательского ввода, так как окно Revit неактивно - Я не могу использовать
Show()
верно?Так как мой код просто продолжится
Мой вопрос:
Может кто-нибудь помочь мне найти правильный подход к моей проблеме.Я не совсем уверен, сработает ли мой подход в конце
Что я пробовал до сих пор:
Я пытался сделать транзакцию в классе WinForm, но я знал,это не сработало.Я имею в виду отдельный класс, который будет сохранять пользовательский ввод, и второй класс ExternalCommand, который будет выполнять транзакцию для создания FamilyInstances.Я посмотрел в SDK и нашел ModelessForm_ExternalEvent, но мне было трудно понять это ...Я также нашел эти посты и попытался понять их:https://forums.autodesk.com/t5/revit-api-forum/winform-focus-after-user-selection/td-p/7344224 Revit Pick элемент из WinForm
Мой код:
У меня есть класс приложения, который создает ленту и кнопки:
class App : IExternalApplication
{
public Result OnStartup(UIControlledApplication a)
{
// Ingenieurbau Reiter erstellen
string engineerTabName = "Ingenieurbau Addin";
a.CreateRibbonTab(engineerTabName);
// Gruppen erstellen
RibbonPanel lswPanel = a.CreateRibbonPanel(engineerTabName, "Lärmschutzwand");
// Buttons hinzufügen
AddLswPushButtons(lswPanel);
AddTestPushButton(lswPanel);
return Result.Succeeded;
}
private void AddLswPushButtons(RibbonPanel panel)
{
// Strings erzeugen
string lswName1 = "LSW Daten einlesen";
string lswAssemblyName1 = Assembly.GetExecutingAssembly().Location;
string lswClassName1 = "IngenieurbauAddin1.Lsw.DataInput";
// ButtonData erzeugen
PushButtonData lswPushButtonData1 = new PushButtonData(lswName1, lswName1, lswAssemblyName1, lswClassName1);
// ButtonData dem Panel hinzufügen und in einen PushButton umwandeln
PushButton lswPushButton1 = panel.AddItem(lswPushButtonData1) as PushButton;
// ButtonBild einfügen
lswPushButton1.LargeImage = PngImageSource("IngenieurbauAddin1.Resources.Excel.png");
}
}
У меня естьКласс DataInput, который показывает форму:
[Transaction(TransactionMode.Manual)]
class DataInput : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Application app = uiapp.Application;
Document doc = uidoc.Document;
// Form instanziieren
DataInputForm dataInputForm = new DataInputForm(uidoc);
// Form starten
dataInputForm.Show();
return Result.Succeeded;
}
}
И это мой класс DataInputForm (я знаю, что PlaceFamily
не работает):
public partial class DataInputForm : System.Windows.Forms.Form
{
private UIDocument UIDocument { get; set; }
private Document Document { get; set; }
public DataInputForm(UIDocument uiDocument)
{
UIDocument = uiDocument;
Document = uiDocument.Document;
InitializeComponent();
}
private void btnSelectPoint_Click(object sender, EventArgs e)
{
Hide();
SelectionHelper selectionHelper = new SelectionHelper(Document);
XYZ point = selectionHelper.SelectLineEndPoint(UIDocument);
labelPointLocalXValue.Text = Math.Round(point.X, 3).ToString();
labelPointLocalYValue.Text = Math.Round(point.Y, 3).ToString();
labelPointLocalZValue.Text = Math.Round(point.Z, 3).ToString();
Show();
PlaceFamily(point);
}
private void PlaceFamily(XYZ point)
{
FamilySymbolHelper familySymbolHelper = new FamilySymbolHelper(Document);
FamilyInstanceHelper familyInstanceHelper = new FamilyInstanceHelper(Document);
FamilySymbol famSym = familySymbolHelper.FamilySymbolByName("Master-Bauteil");
try
{
using (Transaction t = new Transaction(Document, "Familie platzieren"))
{
t.Start();
FamilyInstance famInst = familyInstanceHelper.FamilyInstanceByPoint(famSym, point);
t.Commit();
}
}
catch (Exception e)
{
TaskDialog.Show("Error", e.Message);
}
}
}
Я просто хочу ввестивходные данные (Excelfile, Lines, Point), а затем он должен сгенерировать мне FamilyInstances.Но я застрял сейчас ^^.Я ценю любую помощь.