如何在Enterprise Architect中的状态机转换的“Properties-Constraints-Triggers”区域添加触发器?引号是您在EA中手动到达的方式。
我尝试过什么
下面,这实际上导致触发器被添加到状态机,但我需要将其链接到特定的转换。变量 stateMachine 的类型为EA.Element。
EA.Element trigger = (EA.Element)stateMachine.Elements.AddNew("trigger", "Trigger");
State 的类型为EA.Element。 connector 的类型为EA.Connector(我尝试将触发器添加到的特定StateFlow转换)。所有这些似乎都没有做任何事情。实际上,即使在我添加新项目之后, Constraints 似乎也是一个空集合。
state.Constraints.AddNew("trigger", "Trigger");
connector.Constraints.AddNew("trigger", "Trigger");
state.StateTransitions.AddNew("trigger", "Trigger");
我已经挖掘了EA帮助而没有运气。虽然搜索功能不是很好,但我可能错过了一些东西。
有趣的信息(可能会有所作为)
Connector 类型的 MiscData 似乎具有State Flow触发器信息。根据一本非常可靠的书(谢谢Kilian先生), MiscData 的 PDATA1 似乎是State Flow触发器的名称。但是如何添加新的触发器呢? MiscData 是只读的。
答案 0 :(得分:3)
API可能不支持这种特定的关系(从Transition到Trigger)。 在这种情况下,您将不得不使用解决方法。
首先,您需要确定EA存储此信息的确切位置。最简单的解决方法是从空模型开始,仅创建所需的元素(状态机,两个状态,转换和触发器),并使用EA GUI创建链接。
然后检查数据库。由于您只有这些元素,因此很容易找到EA存储关系的位置。
如果我不得不猜测我会说它可能会存储在t_xref表中,或者存储在style或styleEx列中的某个位置(或者你自己指出的Pdata列)。 然后,您需要使用SQL更新或插入查询以及未记录的Repository.Execute操作将此信息直接添加到数据库中。 你可以在github上找到这样一个例子的例子:
/// <summary>
/// copy the workingset tot the given user
/// </summary>
/// <param name="user">the user to copy the working set to</param>
/// <param name="overwrite">if true then the first workingset found with the same name
/// for the given user will be overwritten</param>
public void copyToUser(User user, bool overwrite)
{
if (overwrite)
{
//check if a workingset with the same name already exists
WorkingSet workingSetToOverwrite = this.model.workingSets.Find(w =>
w.user != null
&& w.user.login == user.login
&& w.name == this.name);
if (workingSetToOverwrite != null)
{
workingSetToOverwrite.delete();
}
}
string insertQuery = @"insert into t_document (DocID,DocName, Notes, Style,ElementID, ElementType,StrContent,BinContent,DocType,Author,DocDate )
select '"+Guid.NewGuid().ToString("B")+@"',d.DocName, d.Notes, d.Style,
d.ElementID, d.ElementType,d.StrContent,d.BinContent,d.DocType,'" + user.fullName + @"',d.DocDate from t_document d
where d.DocID like '"+this.ID+"'";
this.model.executeSQL(insertQuery);
}