예제 #1
0
        protected virtual void UpdateReaction(IObjectBase reactionAsEntity, IBaseNode reactionNodeAsBaseNode)
        {
            var reaction     = reactionAsEntity.DowncastTo <IReaction>();
            var reactionNode = reactionNodeAsBaseNode.DowncastTo <ReactionNode>();

            reactionNode.ClearLinks();

            var newEductDistance    = new PointF(-70, 0);
            var newProductDistance  = new PointF(30, 0);
            var newModifierDistance = new PointF(-30, -30);

            foreach (var rp in reaction.Educts)
            {
                createReactionLink(ReactionLinkType.Educt, reactionNode, moleculeNodeFor(rp.Partner.Id, reactionNode, newEductDistance));
            }

            foreach (var rp in reaction.Products)
            {
                createReactionLink(ReactionLinkType.Product, reactionNode, moleculeNodeFor(rp.Partner.Id, reactionNode, newProductDistance));
            }

            foreach (var modifierName in reaction.ModifierNames)
            {
                // modifier are in the same container as reaction (and not in subcontainers)
                var modifier = getModifierNode(reaction, modifierName);
                if (modifier != null)
                {
                    createReactionLink(ReactionLinkType.Modifier, reactionNode, moleculeNodeFor(modifier.Id, reactionNode, newModifierDistance));
                }
            }
        }
        // signature is necessary for use as argument in RegisterUpdateMethod
        public void UpdateReactionBuilder(IObjectBase reactionAsObjectBase, IBaseNode reactionNodeAsBaseNode)
        {
            var reactionBuilder = reactionAsObjectBase.DowncastTo <IReactionBuilder>();
            var reactionNode    = reactionNodeAsBaseNode.DowncastTo <ReactionNode>();

            reactionNode.ClearLinks();

            foreach (var rpb in reactionBuilder.Educts)
            {
                createReactionLink(ReactionLinkType.Educt, reactionNode, getMoleculeNode(rpb.MoleculeName, reactionNode.Location));
            }

            foreach (var rpb in reactionBuilder.Products)
            {
                createReactionLink(ReactionLinkType.Product, reactionNode, getMoleculeNode(rpb.MoleculeName, reactionNode.Location));
            }

            foreach (var modifierName in reactionBuilder.ModifierNames)
            {
                createReactionLink(ReactionLinkType.Modifier, reactionNode, getMoleculeNode(modifierName, reactionNode.Location));
            }

            reactionNode.SetColorFrom(DiagramOptions.DiagramColors);
        }
예제 #3
0
        private void updateObserver(IObjectBase observerAsEntity, IBaseNode observerNodeAsBaseNode)
        {
            var observer     = observerAsEntity.DowncastTo <IObserver>();
            var observerNode = observerNodeAsBaseNode.DowncastTo <ObserverNode>();

            observerNode.ClearLinks();

            foreach (var oRef in observer.Formula.ObjectReferences)
            {
                var refId        = oRef.Object.Id;
                var refParentId  = oRef.Object.ParentContainer.Id;
                var moleculeNode = DiagramModel.GetNode <MoleculeNode>(refId);
                // if object reference is not molecule amount itself, it could be a child of molecule amount, e.g. a concentration
                if (moleculeNode == null)
                {
                    moleculeNode = DiagramModel.GetNode <MoleculeNode>(refParentId);
                }

                if (moleculeNode != null)
                {
                    createObserverLink(observerNode, moleculeNode);
                }
            }
        }