将触发器添加到转换

时间:2014-11-10 17:14:38

标签: c# add-in enterprise-architect

如何在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 是只读的。

1 个答案:

答案 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);

        }