Я пишу надстройку для 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 Выбрать элемент из 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. Но сейчас я как бы застрял ^^.
Я ценю любую помощь.