/// <summary>
        /// Creates context menu for a <see cref="ParameterOverride"/> if it is an STEP 3D parameter.
        ///
        /// <seealso cref="IDstHubService.IsSTEPParameterType"/>
        /// </summary>
        /// <param name="parameter"><see cref="ParameterOverride"/> </param>
        private void ProcessParameterContextMenu(ParameterOrOverrideBase parameter)
        {
            if (!this.dstHubService.IsSTEPParameterType(parameter.ParameterType))
            {
                return;
            }

            try
            {
                IValueSet valueSet   = parameter.ValueSets.LastOrDefault();
                var       valuearray = valueSet.Computed;

                CompoundParameterType compound = (CompoundParameterType)parameter.ParameterType;

                var name_component   = compound.Component.FirstOrDefault(x => x.ShortName == "name");
                var source_component = compound.Component.FirstOrDefault(x => x.ShortName == "source");

                var part_name          = valuearray[name_component.Index];
                var part_filereference = valuearray[source_component.Index];

                this.fileRevisionId = part_filereference;

                this.ContextMenu.Add(new ContextMenuItemViewModel(
                                         $"Download Associated STEP 3D file to \"{part_name}\" {part_filereference}", "",
                                         this.DownloadGuidCommand,
                                         MenuItemKind.Export, ClassKind.NotThing));
            }
            catch (Exception exception)
            {
                Logger.Warn(exception, "Ignoring context menue creation for ParameterOrOverride");
            }
        }
        /// <summary>
        /// Set the value for this row from the <see cref="ParameterOrOverrideBase"/> and the associated <see cref="ParameterValueSetBase"/>
        /// </summary>
        /// <param name="parameterOrOveride">The <see cref="ParameterOrOverrideBase"/></param>
        /// <param name="valueSet">The <see cref="ParameterValueSetBase"/></param>
        /// <param name="index">The Index of the Value to get</param>
        public void SetScalarValue(ParameterOrOverrideBase parameterOrOveride, ParameterValueSetBase valueSet, int?index = null)
        {
            this.Value = index.HasValue && valueSet.Published.Count() > index
                ? valueSet.Published[index.Value]
                : valueSet.Published.FirstOrDefault();

            var actualValue = index.HasValue && valueSet.Published.Count() > index
                ? valueSet.ActualValue[index.Value]
                : valueSet.ActualValue.FirstOrDefault();

            // propagate values to aid in modelcode updates
            this.valueSetIndex = index;
            this.valueSet      = valueSet;

            this.UpdateModelCode();

            this.Switch = valueSet.ValueSwitch;
            if (this.Value == null || actualValue == null)
            {
                return;
            }

            if (this.Value != actualValue)
            {
                this.IsPublishable = true;
            }

            if (this.Scale != null)
            {
                this.Value += " [" + this.Scale.ShortName + "]";
            }
        }
Пример #3
0
        /// <summary>
        /// Adds the publishable <see cref="PublicationParameterOrOverrideRowViewModel"/> row view model to the tree.
        /// </summary>
        /// <param name="parameter">The <see cref="ParameterOrOverrideBase"/> that this row will belong to.</param>
        private void AddPublishableParameterRowViewModel(ParameterOrOverrideBase parameter)
        {
            var domainRow = this.Domains.SingleOrDefault(vm => vm.Thing == parameter.Owner);

            if (domainRow == null)
            {
                return;
            }

            // if the row already exists then simply update it
            var parameterRow = domainRow.ContainedRows.FirstOrDefault(pr => pr.Thing == parameter);

            if (parameterRow != null)
            {
                ((PublicationParameterOrOverrideRowViewModel)parameterRow).SetProperties();
                return;
            }

            // create the row only if it is publishable
            parameterRow = new PublicationParameterOrOverrideRowViewModel(parameter, this.Session, domainRow);

            // if the domain row has a checkbox, select this one as well.
            ((PublicationParameterOrOverrideRowViewModel)parameterRow).ToBePublished = domainRow.ToBePublished;

            domainRow.ContainedRows.SortedInsert(parameterRow, rowComparer);
        }
Пример #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PublicationParameterOrOverrideRowViewModel"/> class
 /// </summary>
 /// <param name="parameterOrOverrideBase">
 /// The associated <see cref="ParameterOrOverrideBase"/>
 /// </param>
 /// <param name="session">
 /// The associated <see cref="ISession"/>
 /// </param>
 /// <param name="containerViewModel">
 /// The container Row.
 /// </param>
 public PublicationParameterOrOverrideRowViewModel(ParameterOrOverrideBase parameterOrOverrideBase, ISession session, IRowViewModelBase <Thing> containerViewModel)
     : base(parameterOrOverrideBase, session, containerViewModel, false)
 {
     this.WhenAnyValue(vm => vm.ToBePublished).Subscribe(_ => this.ToBePublishedChanged());
     this.IsCheckable = true;
     this.SetProperties();
 }
Пример #5
0
        /// <summary>
        /// Add the listener associated to the <see cref="ParameterOrOverrideBase" />
        /// </summary>
        /// <param name="parameterOrOverride">The <see cref="ParameterOrOverrideBase" /></param>
        private void AddParameterOrOverrideListener(ParameterOrOverrideBase parameterOrOverride)
        {
            if (this.ParameterBaseListener.ContainsKey(parameterOrOverride))
            {
                return;
            }

            Func <ObjectChangedEvent, bool> discriminator =
                objectChange => objectChange.EventKind == EventKind.Updated &&
                objectChange.ChangedThing.RevisionNumber > this.RevisionNumber;

            Action <ObjectChangedEvent> action = x => this.PopulateParameters();

            if (this.AllowMessageBusSubscriptions)
            {
                var listener = CDPMessageBus.Current.Listen <ObjectChangedEvent>(parameterOrOverride)
                               .Where(discriminator)
                               .ObserveOn(RxApp.MainThreadScheduler)
                               .Subscribe(action);

                this.ParameterBaseListener.Add(parameterOrOverride, listener);
            }
            else
            {
                var parameterOrOverrideObserver = CDPMessageBus.Current.Listen <ObjectChangedEvent>(typeof(ParameterOrOverrideBase));
                this.ParameterBaseListener.Add(parameterOrOverride,
                                               this.MessageBusHandler.GetHandler <ObjectChangedEvent>().RegisterEventHandler(parameterOrOverrideObserver, new ObjectChangedMessageBusEventHandlerSubscription(parameterOrOverride, discriminator, action)));
            }
        }
Пример #6
0
        /// <summary>
        /// Set the value for this row from the <see cref="ParameterOrOverrideBase"/> and the associated <see cref="ParameterValueSetBase"/>
        /// </summary>
        /// <param name="parameterOrOveride">The <see cref="ParameterOrOverrideBase"/></param>
        /// <param name="valueSet">The <see cref="ParameterValueSetBase"/></param>
        public void SetScalarValue(ParameterOrOverrideBase parameterOrOveride, ParameterValueSetBase valueSet)
        {
            // perform checks to see if this is indeed a scalar value
            if (valueSet.Published.Count() > 1)
            {
                logger.Warn("The value set of Parameter or override {0} is marked as Scalar, yet has multiple values.", this.Thing.Iid);
            }

            this.Value = valueSet.Published.FirstOrDefault();

            // handle zero values returned
            if (this.Value == null)
            {
                logger.Warn("The value set of Parameter or override {0} is marked as Scalar, yet has no values.", this.Thing.Iid);
                this.Value = "-";
            }

            if (parameterOrOveride.Scale != null)
            {
                this.Value += " [" + parameterOrOveride.Scale.ShortName + "]";
            }

            this.Switch    = valueSet.ValueSwitch;
            this.ModelCode = valueSet.ModelCode();
        }
Пример #7
0
 /// <summary>
 /// Checks if creating a <see cref="BinaryRelationship"/> for requirement verification is allowed for these two objects
 /// </summary>
 /// <param name="parameter">The <see cref="ParameterOrOverrideBase"/></param>
 /// <param name="relationalExpression">The <see cref="RelationalExpression"/></param>
 /// <returns>True if creation is allowed</returns>
 public bool IsCreateBinaryRelationshipForRequirementVerificationAllowed(ParameterOrOverrideBase parameter, RelationalExpression relationalExpression)
 {
     return((parameter.ParameterType.Iid == relationalExpression.ParameterType.Iid) &&
            (!(parameter.ParameterType is QuantityKind) || (parameter.Scale == relationalExpression.Scale)) &&
            !relationalExpression.QueryRelationships
            .Any(
                x => x is BinaryRelationship relationship &&
                (relationship.Source.Iid == parameter.Iid)));
 }
Пример #8
0
 /// <summary>
 /// Update the rows representing the publishable <see cref="ParameterOrOverrideBase"/>
 /// </summary>
 /// <param name="parameter">The updated <see cref="ParameterOrOverrideBase"/></param>
 private void UpdatePublishableParameter(ParameterOrOverrideBase parameter)
 {
     if (parameter.CanBePublished)
     {
         this.AddPublishableParameterRowViewModel(parameter);
     }
     else
     {
         this.RemovePublishableParameterRowViewModel(parameter);
     }
 }
Пример #9
0
        /// <summary>
        /// Updates the <paramref name="elementRow"/> children with the <paramref name="parameterOrOverrideBase"/>
        /// </summary>
        /// <typeparam name="TThing">The precise type of <see cref="ElementBase"/></typeparam>
        /// <typeparam name="TRow">The type of <paramref name="elementRow"/></typeparam>
        /// <param name="parameterOrOverrideBase">The <see cref="ParameterOrOverrideBase"/></param>
        /// <param name="oldElement">The old <see cref="ElementBase"/> to be updated</param>
        /// <param name="elementRow">The row to perform on the update</param>
        private void UpdateRow <TThing, TRow>(ParameterOrOverrideBase parameterOrOverrideBase, TThing oldElement, TRow elementRow)
            where TRow : ElementBaseRowViewModel <TThing> where TThing : ElementBase
        {
            var updatedElement = (TThing)oldElement?.Clone(true);

            this.AddOrReplaceParameter(updatedElement, parameterOrOverrideBase);

            CDPMessageBus.Current.SendMessage(new HighlightEvent(elementRow.Thing), elementRow.Thing);

            elementRow.UpdateThing(updatedElement);

            elementRow.UpdateChildren();
        }
Пример #10
0
        private void RegisterBinaryRelationShip(ParameterOrOverrideBase parameter, RelationalExpression expression)
        {
            var relationShip = new BinaryRelationship(Guid.NewGuid(), null, null)
            {
                Source = parameter,
                Target = expression
            };

            expression.Relationships.Add(relationShip);
            relationShip.Source.Relationships.Add(relationShip);
            relationShip.Target.Relationships.Add(relationShip);

            this.iteration.Relationship.Add(relationShip);
        }
Пример #11
0
        /// <summary>
        /// Add the listener associated to the <see cref="ParameterOrOverrideBase"/>
        /// </summary>
        /// <param name="parameterOrOverride">The <see cref="ParameterOrOverrideBase"/></param>
        private void AddParameterOrOverrideListener(ParameterOrOverrideBase parameterOrOverride)
        {
            if (this.ParameterBaseListener.ContainsKey(parameterOrOverride))
            {
                return;
            }

            var listener = CDPMessageBus.Current.Listen <ObjectChangedEvent>(parameterOrOverride)
                           .Where(objectChange => objectChange.EventKind == EventKind.Updated && objectChange.ChangedThing.RevisionNumber > this.RevisionNumber)
                           .ObserveOn(RxApp.MainThreadScheduler)
                           .Subscribe(_ => this.PopulateParameters());

            this.ParameterBaseListener.Add(parameterOrOverride, listener);
        }
Пример #12
0
        private void SetValueSet(ParameterSubscription subscription, ParameterOrOverrideBase param, IReadOnlyList <string> values)
        {
            var i = 0;

            foreach (var parameterValueSet in param.ValueSets)
            {
                var valueset = new ParameterSubscriptionValueSet(Guid.NewGuid(), this.cache, this.uri)
                {
                    SubscribedValueSet = (ParameterValueSetBase)parameterValueSet
                };
                this.SetValueSet(valueset, values[i]);
                subscription.ValueSet.Add(valueset);
                i++;
            }
        }
Пример #13
0
        /// <summary>
        /// Removes a publishable parameter row view-model if the <see cref="ParameterOrOverrideBase" /> is no longer publishable.
        /// </summary>
        /// <param name="parameter">The parameter that is no longer publishable.</param>
        private void RemovePublishableParameterRowViewModel(ParameterOrOverrideBase parameter)
        {
            var domainRow = this.Domains.SingleOrDefault(vm => vm.Thing == parameter.Owner);

            if (domainRow == null)
            {
                return;
            }

            var parameterRow = domainRow.ContainedRows.FirstOrDefault(pr => pr.Thing == parameter);

            if (parameterRow != null)
            {
                domainRow.ContainedRows.RemoveAndDispose(parameterRow);
            }
        }
Пример #14
0
        /// <summary>
        /// Creates a <see cref="NestedParameter"/> based on the provided <see cref="ParameterOrOverrideBase"/> and <see cref="ParameterValueSetBase"/>
        /// </summary>
        /// <param name="parameter">
        /// The <see cref="ParameterOrOverrideBase"/> that contains the <see cref="ParameterValueSetBase"/> based on which the
        /// <see cref="NestedParameter"/> is created.
        /// </param>
        /// <param name="component">
        /// The <see cref="ParameterTypeComponent"/> that this <see cref="NestedParameter"/> is associated to. This may be null in case the <see cref="ParameterType"/>
        /// of the associated <see cref="Parameter"/> is a <see cref="ScalarParameterType"/>.
        /// </param>
        /// <param name="valueSet">
        /// The <see cref="ParameterValueSetBase"/> that provides the reference to the <see cref="ActualFiniteState"/> and values
        /// to create the <see cref="NestedParameter"/>
        /// </param>
        /// <param name="option">
        /// The <see cref="Option"/> for which the <see cref="NestedParameter"/> is created.
        /// </param>
        /// <returns>
        /// An instance of a non-volatile <see cref="NestedParameter"/>
        /// </returns>
        private NestedParameter CreatedNestedParameter(ParameterOrOverrideBase parameter, ParameterTypeComponent component, ParameterValueSetBase valueSet, Option option)
        {
            var componentIndex = component == null ? 0 : component.Index;
            var actualValue    = valueSet.ActualValue[componentIndex];
            var formula        = valueSet.Formula[componentIndex];

            var nestedParameter = new NestedParameter(Guid.NewGuid(), parameter.Cache, parameter.IDalUri)
            {
                IsVolatile          = true,
                AssociatedParameter = parameter,
                Owner       = parameter.Owner,
                Component   = component,
                ActualState = valueSet.ActualState,
                ActualValue = actualValue,
                Formula     = formula,
                ValueSet    = valueSet,
                Option      = option
            };

            return(nestedParameter);
        }
Пример #15
0
        /// <summary>
        /// Updates the <see cref="Domains"/> of the parameter in case the <see cref="ParameterOrOverrideBase.Owner"/> that contains Parameter changes.
        /// </summary>
        /// <param name="parameterOrOverrideBase">The <see cref="ParameterOrOverrideBase"/> to relocate or remove</param>
        private void RelocateParameterRowViewModel(ParameterOrOverrideBase parameterOrOverrideBase)
        {
            // In case the owner has changed check if there are other domains that contain that parameter.
            var oldOwners = this.Domains.Where(d => d.ContainedRows.Any(p => p.Thing == parameterOrOverrideBase) && d.Thing != parameterOrOverrideBase.Owner);

            foreach (var owner in oldOwners)
            {
                var row = owner.ContainedRows.FirstOrDefault(pr => pr.Thing == parameterOrOverrideBase);
                if (row != null)
                {
                    owner.ContainedRows.Remove(row);
                    row.Dispose();
                }
            }

            if (!parameterOrOverrideBase.CanBePublished)
            {
                return;
            }

            var domainRow = this.Domains.SingleOrDefault(vm => vm.Thing == parameterOrOverrideBase.Owner);

            if (domainRow == null)
            {
                return;
            }

            var parameterRow = domainRow.ContainedRows.FirstOrDefault(pr => pr.Thing == parameterOrOverrideBase);

            if (parameterRow == null)
            {
                parameterRow = new PublicationParameterOrOverrideRowViewModel(parameterOrOverrideBase, this.Session, domainRow);

                // if the domain row has a checkbox, select this one as well.
                ((PublicationParameterOrOverrideRowViewModel)parameterRow).ToBePublished = domainRow.ToBePublished;

                domainRow.ContainedRows.SortedInsert(parameterRow, rowComparer);
            }
        }
Пример #16
0
        /// <summary>
        /// Adds or replace the <paramref name="parameterOrOverride"/> on the <paramref name="updatedElement"/>
        /// </summary>
        /// <param name="updatedElement">The <see cref="ElementBase"/></param>
        /// <param name="parameterOrOverride">The <see cref="ParameterOrOverrideBase"/></param>
        private void AddOrReplaceParameter(ElementBase updatedElement, ParameterOrOverrideBase parameterOrOverride)
        {
            if (updatedElement is ElementDefinition elementDefinition)
            {
                if (elementDefinition.Parameter.FirstOrDefault(p => p.ParameterType.Iid == parameterOrOverride.ParameterType.Iid)
                    is { } parameter)
                {
                    elementDefinition.Parameter.Remove(parameter);
                }

                elementDefinition.Parameter.Add((Parameter)parameterOrOverride);
            }

            else if (updatedElement is ElementUsage elementUsage)
            {
                if (parameterOrOverride is Parameter elementParameter)
                {
                    if (elementUsage.ElementDefinition.Parameter.FirstOrDefault(p => p.ParameterType.Iid == parameterOrOverride.ParameterType.Iid)
                        is { } parameter)
                    {
                        elementUsage.ElementDefinition.Parameter.Remove(parameter);
                    }

                    elementUsage.ElementDefinition.Parameter.Add(elementParameter);
                }

                else if (parameterOrOverride is ParameterOverride parameterOverride)
                {
                    if (elementUsage.ParameterOverride.FirstOrDefault(p => p.ParameterType.Iid == parameterOrOverride.ParameterType.Iid)
                        is { } parameter)
                    {
                        elementUsage.ParameterOverride.Remove(parameter);
                    }

                    elementUsage.ParameterOverride.Add(parameterOverride);
                }
            }
        }
        /// <summary>
        /// Process the <see cref="ParameterValueSet"/> .
        /// </summary>
        /// <param name="parameterValueSet">
        /// The <see cref="ParameterValueSetBase"/> to be processed.
        /// </param>
        /// <param name="parameterOrOverrideBase">
        /// The <see cref="ParameterOrOverrideBase"/> the <see cref="ParameterValueSetBase"/ belongs to.
        /// </param>
        /// <param name="componentIndex">
        /// The index of the <see cref="ParameterTypeComponent"/>.
        /// </param>
        /// <param name="computedValue">
        /// The manual value of the <see cref="ParameterValueSet"/>.
        /// </param>
        /// <param name="processedValueSets">
        /// A <see cref="Dictionary{Guid,ProcessedValueSet}"/> of ProcessedValueSe that capture the updated <see cref="Thing"/>s with its value validation result
        /// </param>
        /// <param name="provider">
        /// The <see cref="IFormatProvider"/> used to validate.
        /// </param>
        /// <param name="validationErrorText">
        /// <see cref="String"/> that holds the validation error text.
        /// </param>
        /// <returns>
        /// The added or changed <see cref="ProcessedValueSet"/>
        /// </returns>
        private ProcessedValueSet ProcessValueSet(ParameterValueSetBase parameterValueSet, ParameterOrOverrideBase parameterOrOverrideBase, int componentIndex, string computedValue, ref Dictionary <Guid, ProcessedValueSet> processedValueSets, IFormatProvider provider, out string validationErrorText)
        {
            var validationResult = ValidationResultKind.InConclusive;

            var switchKind       = parameterValueSet.ValueSwitch;
            var measurementScale = parameterOrOverrideBase.Scale;
            var parameterType    = parameterOrOverrideBase.ParameterType;

            validationErrorText = string.Empty;

            if (parameterType != null)
            {
                if (ValueSetConverter.TryParseDouble(computedValue, parameterType, out var convertedComputedValue))
                {
                    computedValue = convertedComputedValue.ToString(CultureInfo.InvariantCulture);
                }

                computedValue = computedValue?.ToValueSetObject(parameterType).ToValueSetString(parameterType) ?? parameterValueSet.Computed[componentIndex];

                var validManualValue = parameterType.Validate(computedValue, measurementScale, provider);

                if (validManualValue.ResultKind > validationResult)
                {
                    validationResult    = validManualValue.ResultKind;
                    validationErrorText = validManualValue.Message;
                }
            }

            var valueSetExists = processedValueSets.TryGetValue(parameterValueSet.Iid, out var processedValueSet);

            if (!valueSetExists)
            {
                processedValueSet = new ProcessedValueSet(parameterValueSet, validationResult);
            }

            if (processedValueSet.IsDirty(componentIndex, parameterType, switchKind, parameterValueSet.Manual[componentIndex], computedValue, parameterValueSet.Reference[componentIndex], computedValue, out var valueSetValues))
            {
                processedValueSet.UpdateClone(valueSetValues);

                if (!valueSetExists)
                {
                    processedValueSets.Add(parameterValueSet.Iid, processedValueSet);
                }
            }

            return(processedValueSet);
        }
Пример #18
0
        /// <summary>
        /// Method for creating a <see cref="BinaryRelationship"/> for requirement verification between a <see cref="ParameterOrOverrideBase"/> and a <see cref="RelationalExpression"/>.
        /// </summary>
        /// <param name="session">The <see cref="Session"/> for which the <see cref="BinaryRelationship"/> will be created</param>
        /// <param name="iteration">The <see cref="Iteration"/> for which the  <see cref="BinaryRelationship"/> will be created</param>
        /// <param name="parameter">The <see cref="ParameterOrOverrideBase"/> that acts as the source of the <see cref="BinaryRelationship"/></param>
        /// <param name="relationalExpression">The <see cref="RelationalExpression"/> that acts as the target of the <see cref="BinaryRelationship"/></param>
        /// <returns>An awaitable <see cref="Task"/></returns>
        public async Task CreateBinaryRelationshipForRequirementVerification(ISession session, Iteration iteration, ParameterOrOverrideBase parameter, RelationalExpression relationalExpression)
        {
            session.OpenIterations.TryGetValue(iteration, out var tuple);

            var binaryRelationship = new BinaryRelationship(Guid.NewGuid(), null, null)
            {
                Owner = tuple?.Item1
            };

            var transaction = new ThingTransaction(TransactionContextResolver.ResolveContext(relationalExpression));

            binaryRelationship.Container = iteration;
            binaryRelationship.Source    = parameter;
            binaryRelationship.Target    = relationalExpression;

            var iterationClone = iteration.Clone(false);

            iterationClone.Relationship.Add(binaryRelationship);
            transaction.CreateOrUpdate(iterationClone);
            transaction.Create(binaryRelationship);

            try
            {
                var operationContainer = transaction.FinalizeTransaction();
                await session.Write(operationContainer);
            }
            catch (Exception ex)
            {
                LogManager.GetLogger(typeof(Iteration).FullName).Error("The inline update operation failed: {0}", ex.Message);
            }
        }
 /// <summary>
 /// Performs the drop operation when the payload is a <see cref="RelationalExpression"/>
 /// </summary>
 /// <param name="parameter">
 /// The <see cref="ParameterOrOverrideBase"/>
 /// </param>
 /// <param name="expression">
 /// The <see cref="RelationalExpression"/>
 /// </param>
 private async Task Drop(ParameterOrOverrideBase parameter, RelationalExpression expression)
 {
     await this.CreateBinaryRelationship(parameter, expression);
 }
Пример #20
0
 /// <summary>
 /// Method for creating a <see cref="BinaryRelationship"/> between a <see cref="ParameterOrOverrideBase"/> and a <see cref="RelationalExpression"/>.
 /// </summary>
 /// <param name="session">The <see cref="Session"/> for which the <see cref="BinaryRelationship"/> will be created</param>
 /// <param name="iteration">The <see cref="Iteration"/> for which the  <see cref="BinaryRelationship"/> will be created</param>
 /// <param name="parameter">The <see cref="ParameterOrOverrideBase"/> that acts as the source of the <see cref="BinaryRelationship"/></param>
 /// <param name="relationalExpression">The <see cref="RelationalExpression"/> that acts as the target of the <see cref="BinaryRelationship"/></param>
 /// <returns>An awaitable <see cref="Task"/></returns>
 public Task CreateBinaryRelationshipForRequirementVerification(ISession session, Iteration iteration, ParameterOrOverrideBase parameter, RelationalExpression relationalExpression)
 {
     throw new Exception("The Binary Relationship could not be created");
 }
Пример #21
0
 /// <summary>
 /// Checks if creating a <see cref="BinaryRelationship"/> is allowed for these two objects
 /// </summary>
 /// <param name="parameter">The <see cref="ParameterOrOverrideBase"/></param>
 /// <param name="relationalExpression">The <see cref="RelationalExpression"/></param>
 /// <returns>True if creation is allowed</returns>
 public bool IsCreateBinaryRelationshipForRequirementVerificationAllowed(ParameterOrOverrideBase parameter, RelationalExpression relationalExpression)
 {
     return(false);
 }
        /// <summary>
        /// Calculate mean power parameter value based on multiple parameter values
        /// </summary>
        /// <param name="crossviewArrayAssembler">
        /// The <see cref="CrossviewArrayAssembler"/>
        /// </param>
        /// <param name="contentRow">
        /// The current Excel row values
        /// </param>
        /// <param name="namesRow">
        /// The current Excel row names
        /// </param>
        /// <param name="parameters">
        /// The <see cref="ParameterOrOverrideBase"/>s present on the <see cref="contentRow"/>
        /// </param>
        internal static void ComputePMean(
            CrossviewArrayAssembler crossviewArrayAssembler,
            object[] contentRow,
            object[] namesRow,
            List <ParameterOrOverrideBase> parameters)
        {
            ParameterOrOverrideBase redundancy = null, pOn = null, pStandBy = null, pDutyCycle = null, pMean = null;

            foreach (var parameterOrOverrideBase in parameters)
            {
                switch (parameterOrOverrideBase.ParameterType.ShortName.ToLowerInvariant())
                {
                case Redundancy:
                    redundancy = parameterOrOverrideBase;
                    break;

                case POn:
                    pOn = parameterOrOverrideBase;
                    break;

                case PStandBy:
                    pStandBy = parameterOrOverrideBase;
                    break;

                case PDutyCycle:
                    pDutyCycle = parameterOrOverrideBase;
                    break;

                case PMean:
                    pMean = parameterOrOverrideBase;
                    break;
                }
            }

            // ensure all required parameters are present
            if (redundancy == null || pOn == null || pStandBy == null || pDutyCycle == null || pMean == null)
            {
                return;
            }

            // ensure all required parameters have the same option dependency
            if (redundancy.IsOptionDependent != pOn.IsOptionDependent ||
                pOn.IsOptionDependent != pStandBy.IsOptionDependent ||
                pStandBy.IsOptionDependent != pDutyCycle.IsOptionDependent ||
                pDutyCycle.IsOptionDependent != pMean.IsOptionDependent)
            {
                return;
            }

            // ensure redundancy, p_on, and p_stby are not state dependent
            if (redundancy.StateDependence != null || pOn.StateDependence != null || pStandBy.StateDependence != null)
            {
                return;
            }

            // ensure redundancy has required components
            if (!(redundancy.ParameterType is CompoundParameterType))
            {
                return;
            }

            var compoundRedundancy = (CompoundParameterType)redundancy.ParameterType;

            var redundancySchemeComponent = compoundRedundancy.Component
                                            .FirstOrDefault(x => x.ShortName.Equals(RedundancyScheme, StringComparison.InvariantCultureIgnoreCase));

            if (redundancySchemeComponent == null)
            {
                return;
            }

            var redundancyTypeComponent = compoundRedundancy.Component
                                          .FirstOrDefault(x => x.ShortName.Equals(RedundancyType, StringComparison.InvariantCultureIgnoreCase));

            if (redundancyTypeComponent == null)
            {
                return;
            }

            var redundancyKComponent = compoundRedundancy.Component
                                       .FirstOrDefault(x => x.ShortName.Equals(RedundancyK, StringComparison.InvariantCultureIgnoreCase));

            if (redundancyKComponent == null)
            {
                return;
            }

            var redundancyNComponent = compoundRedundancy.Component
                                       .FirstOrDefault(x => x.ShortName.Equals(RedundancyN, StringComparison.InvariantCultureIgnoreCase));

            if (redundancyNComponent == null)
            {
                return;
            }

            // ensure p_duty_cyc and p_mean are state dependent
            if (pDutyCycle.StateDependence == null || pMean.StateDependence == null)
            {
                return;
            }

            // ensure p_duty_cyc and p_mean have the same state dependency
            if (pDutyCycle.StateDependence != pMean.StateDependence)
            {
                return;
            }

            foreach (var option in redundancy.ValueSets.Select(x => x.ActualOption))
            {
                var redundancyValueSet = redundancy.ValueSets.First(x => x.ActualOption == option) as ParameterValueSetBase;
                var pOnValueSet        = pOn.ValueSets.First(x => x.ActualOption == option) as ParameterValueSetBase;
                var pStandByValueSet   = pStandBy.ValueSets.First(x => x.ActualOption == option) as ParameterValueSetBase;

                var pDutyCycleValueSets = pDutyCycle.ValueSets.Where(x => x.ActualOption == option);
                var pMeanValueSets      = pMean.ValueSets.Where(x => x.ActualOption == option);

                foreach (var state in pDutyCycleValueSets.Select(x => x.ActualState))
                {
                    var pDutyCycleValueSet = pDutyCycleValueSets.First(x => x.ActualState == state) as ParameterValueSetBase;
                    var pMeanValueSet      = pMeanValueSets.First(x => x.ActualState == state) as ParameterValueSetBase;

                    var value = ComputePMean(
                        contentRow[crossviewArrayAssembler.GetContentColumnIndex(redundancyValueSet, redundancySchemeComponent)] as string,
                        contentRow[crossviewArrayAssembler.GetContentColumnIndex(redundancyValueSet, redundancyTypeComponent)] as string,
                        contentRow[crossviewArrayAssembler.GetContentColumnIndex(redundancyValueSet, redundancyKComponent)] as string,
                        contentRow[crossviewArrayAssembler.GetContentColumnIndex(redundancyValueSet, redundancyNComponent)] as string,
                        contentRow[crossviewArrayAssembler.GetContentColumnIndex(pOnValueSet)] as string,
                        contentRow[crossviewArrayAssembler.GetContentColumnIndex(pStandByValueSet)] as string,
                        contentRow[crossviewArrayAssembler.GetContentColumnIndex(pDutyCycleValueSet)] as string);

                    if (value == null)
                    {
                        continue;
                    }

                    var index = crossviewArrayAssembler.GetContentColumnIndex(pMeanValueSet);

                    contentRow[index] = value;

                    // highlight only interactible cells
                    if (namesRow[index] != null)
                    {
                        crossviewArrayAssembler.SpecialHighlighting[namesRow[index] as string] = Color.Green;
                    }
                }
            }
        }
Пример #23
0
 /// <summary>
 /// Initializes a new instance of the <see cref="IterationTrackParameter"/> class.
 /// </summary>
 /// <param name="parameterOrOverride">The <see cref="ParameterOrOverrideBase"/> that is used to construct this <see cref="IterationTrackParameter"/></param>
 public IterationTrackParameter(ParameterOrOverrideBase parameterOrOverride)
 {
     this.ParameterOrOverride = parameterOrOverride;
     this.ModelCode           = parameterOrOverride?.ModelCode() ?? "";
     this.UnitSymbol          = parameterOrOverride?.Scale?.UserFriendlyShortName ?? "-";
 }