private void CreateSignalObject()
        {
            __cSignalObject = ScriptManager.Manager.CreateScript(__cProfile.ScriptName, this) as SignalObject;
            if (__cSignalObject != null)
            {
                string sTitle = string.Format("{0}", __cSignalObject.About.Comment);
                if (this.InvokeRequired)
                {
                    this.BeginInvoke((MethodInvoker) delegate {
                        this.Text = sTitle;
                        this.Invalidate(false);
                    });
                }
                else
                {
                    this.Text = sTitle;
                    this.Invalidate(false);
                }

                __cSignalObject.onReady            += SignalObject_onReady;
                __cSignalObject.onScriptParameters += SignalObject_onScriptParameters;
                __cSignalObject.onTradeResponse    += SignalObject_onTradeResponse;

                OutputWriter cOutputWriter = __cSignalObject.Output as OutputWriter;
                cOutputWriter.onOutputData += OutputWriter_onOutputData;

                SignalSetting cSignalSetting = __cProfile.Script as SignalSetting;
                __cSignalObject.ApplyProperty(cSignalSetting.Property);
                __cSignalObject.AddDataStreams(RequestSetting.Convert(cSignalSetting.DataRequests));
            }
        }
        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();
            SignalObject signal = (SignalObject)target;

            if (GUILayout.Button("Call Signal"))
            {
                signal.CallSignal();
            }
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="item"></param>
 /// <param name="signal"></param>
 public AESignalItem(SignalItem item, SignalObject signal, TDBFile TDB)
 {
     typeWidget  = (int)TypeWidget.SIGNAL_WIDGET;
     Item        = item;
     Signal      = signal;
     sigFonction = new List <SignalHead.MstsSignalFunction>();
     foreach (var sig in Signal.SignalHeads)
     {
         sigFonction.Add(sig.sigFunction);
         if (sig.sigFunction == SignalHead.MstsSignalFunction.SPEED)
         {
             File.AppendAllText(@"C:\temp\AE.txt", "SPEED\n");
         }
     }
     foreach (var fn in sigFonction)
     {
         File.AppendAllText(@"C:\temp\AE.txt", "FN " + fn + "\n");
     }
     hasDir     = false;
     Location.X = item.TileX * 2048 + item.X;
     Location.Y = item.TileZ * 2048 + item.Z;
     try
     {
         var     node = TDB.TrackDB.TrackNodes[signal.trackNode];
         Vector2 v2;
         if (node.TrVectorNode != null)
         {
             var ts = node.TrVectorNode.TrVectorSections[0];
             v2 = new Vector2(ts.TileX * 2048 + ts.X, ts.TileZ * 2048 + ts.Z);
         }
         else if (node.TrJunctionNode != null)
         {
             var ts = node.UiD;
             v2 = new Vector2(ts.TileX * 2048 + ts.X, ts.TileZ * 2048 + ts.Z);
         }
         else
         {
             throw new Exception();
         }
         var v1 = new Vector2(Location.X, Location.Y);
         var v3 = v1 - v2;
         v3.Normalize();
         //v2 = v1 - Vector2.Multiply(v3, signal.direction == 0 ? 12f : -12f);
         v2    = v1 - Vector2.Multiply(v3, 12f);
         Dir.X = (float)v2.X;
         Dir.Y = (float)v2.Y;
         //v2 = v1 - Vector2.Multiply(v3, signal.direction == 0 ? 1.5f : -1.5f);//shift signal along the dir for 2m, so signals will not be overlapped
         v2         = v1 - Vector2.Multiply(v3, 1.5f);
         Location.X = (float)v2.X;
         Location.Y = (float)v2.Y;
         hasDir     = true;
     }
     catch { }
 }
        private void FSSSignalDiscoveryCallback(FSSSignalDiscoveredEvent obj)
        {
            var signal = new SignalObject()
            {
                Name      = string.IsNullOrEmpty(obj.SignalNameLocalised) ? obj.SignalName : obj.SignalNameLocalised,
                IsStation = obj.IsStation
            };

            _singals.Add(signal);
            OnAction("AddSignal");
        }
Exemple #5
0
 internal Signal(double trackPosition, int sectionIndex, SignalObject signalObject, Vector2 position, double yaw, double pitch, double roll, bool showObject, bool showPost)
 {
     TrackPosition = trackPosition;
     SectionIndex  = sectionIndex;
     SignalObject  = signalObject;
     Position      = position;
     Yaw           = yaw;
     Pitch         = pitch;
     Roll          = roll;
     ShowObject    = showObject;
     ShowPost      = showPost;
 }
Exemple #6
0
        private static void NewAlert(Packet p)
        {
            int    x        = (short)p.ReadUShort();
            int    y        = (short)p.ReadUShort();
            string username = p.ReadASCII(p.ReadByte());

            UserObject   user   = RenderObjectsManager.GetUser(username);
            SignalObject signal = new SignalObject(x, y);

            RenderObjectsManager.AddSignal(signal);

            UOClientManager.SysMessage(string.Format("[Alert][{0}] sends an alert!", user.Name), 83);
        }
        static DebugWindowSignalAspect GetAspect(SignalObject signal)
        {
            var aspect = signal.this_sig_lr(MstsSignalFunction.NORMAL);

            if (aspect >= MstsSignalAspect.CLEAR_1)
            {
                return(DebugWindowSignalAspect.Clear);
            }
            if (aspect >= MstsSignalAspect.STOP_AND_PROCEED)
            {
                return(DebugWindowSignalAspect.Warning);
            }
            return(DebugWindowSignalAspect.Stop);
        }
Exemple #8
0
        private void SignalObject_onReady(object sender, EventArgs e)
        {
            SignalObject cObject = sender as SignalObject;

            int iCount = cObject.MaxDataStream;

            for (int i = 1; i <= iCount; i++)
            {
                __cChart.AddSeries(cObject.BarsOfData(i), i);
            }

            __cChart.AddDrwText(cObject.DrwText);
            __cChart.AddTradeContainer(new TradeContainer());
            cObject.onUpdate        += __cChart.onUpdate;
            cObject.onTradeResponse += __cChart.onTradeResponse;
        }
Exemple #9
0
        internal void Create(Vector3 wpos, Transformation RailTransformation, double StartingDistance, double EndingDistance, double Brightness)
        {
            double dz = TrackPosition - StartingDistance;

            if (ShowPost)
            {
                // post
                double dx = Position.X;
                wpos += dx * RailTransformation.X + dz * RailTransformation.Z;
                CompatibilityObjects.SignalPost.CreateObject(wpos, RailTransformation, Transformation.NullTransformation, -1, StartingDistance, EndingDistance, TrackPosition, Brightness);
            }
            if (ShowObject)
            {
                // signal object
                double dx = Position.X;
                double dy = Position.Y;
                wpos += dx * RailTransformation.X + dy * RailTransformation.Y + dz * RailTransformation.Z;
                SignalObject.Create(wpos, RailTransformation, new Transformation(Yaw, Pitch, Roll), SectionIndex, StartingDistance, EndingDistance, TrackPosition, Brightness);
            }
        }
Exemple #10
0
        internal void Create(Vector3 wpos, Transformation RailTransformation, double StartingDistance, double EndingDistance, double Brightness)
        {
            double dz = TrackPosition - StartingDistance;

            if (ShowPost)
            {
                /*
                 * Post-
                 * Need to clone a copy of the vector for transform
                 * Do it in the post as this is the lesser used option
                 */
                Vector3 wpos2 = new Vector3(wpos);
                wpos2 += Position.X * RailTransformation.X + dz * RailTransformation.Z;
                CompatibilityObjects.SignalPost.CreateObject(wpos2, RailTransformation, Transformation.NullTransformation, -1, StartingDistance, EndingDistance, TrackPosition, Brightness);
            }
            if (ShowObject)
            {
                // signal object
                wpos += Position.X * RailTransformation.X + Position.Y * RailTransformation.Y + dz * RailTransformation.Z;
                SignalObject.Create(wpos, RailTransformation, new Transformation(Yaw, Pitch, Roll), SectionIndex, StartingDistance, EndingDistance, TrackPosition, Brightness);
            }
        }
        public float SignalLocation;                           // relative signal position //


        //================================================================================================//
        //
        // Constructor
        //

        public TrackCircuitSignalItem(SignalObject thisRef, float thisLocation)
        {
            SignalState    = ObjectItemInfo.ObjectItemFindState.Object;
            SignalRef      = thisRef;
            SignalLocation = thisLocation;
        }
Exemple #12
0
        //================================================================================================//
        //
        // return function value
        // Possible functions :
        //                        BLOCK_STATE
        //                        ROUTE_SET
        //                        NEXT_SIG_LR
        //                        NEXT_SIG_MR
        //                        THIS_SIG_LR
        //                        THIS_SIG_MR
        //                        OPP_SIG_LR
        //                        OPP_SIG_MR
        //                        DIST_MULTI_SIG_MR
        //                        SIG_FEATURE
        //                        DEF_DRAW_STATE
        //                        HASHEAD
        //                        DEBUG_HEADER   (does not return a value)
        //                        DEBUG_OUT      (does not return a value)
        //
        //================================================================================================//

        public int SH_function_value(SignalHead thisHead, SignalScripts.SCRScripts.SCRStatTerm thisTerm,
                                     int[] localFloats, SIGSCRfile sigscr)
        {
            int return_value     = 0;
            int parameter1_value = 0;
            int parameter2_value = 0;

            // extract parameters (max. 2)

            if (thisTerm.PartParameter != null)
            {
                if (thisTerm.PartParameter.Length >= 1)
                {
                    SignalScripts.SCRScripts.SCRParameterType thisParameter = thisTerm.PartParameter[0];
                    parameter1_value = SH_termvalue(thisHead, thisParameter,
                                                    localFloats, sigscr);
                }

                if (thisTerm.PartParameter.Length >= 2)
                {
                    SignalScripts.SCRScripts.SCRParameterType thisParameter = thisTerm.PartParameter[1];
                    parameter2_value = SH_termvalue(thisHead, thisParameter,
                                                    localFloats, sigscr);
                }
            }

            // switch on function

            SignalScripts.SCRExternalFunctions thisFunction = thisTerm.Function;
            String dumpfile = String.Empty;

            switch (thisFunction)
            {
            // BlockState

            case (SignalScripts.SCRExternalFunctions.BLOCK_STATE):
                return_value = (int)thisHead.mainSignal.block_state();
                break;

            // Route set

            case (SignalScripts.SCRExternalFunctions.ROUTE_SET):
                return_value = (int)thisHead.route_set();
                break;

            // next_sig_lr

            case (SignalScripts.SCRExternalFunctions.NEXT_SIG_LR):
                return_value = (int)thisHead.next_sig_lr((MstsSignalFunction)parameter1_value);
#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    File.AppendAllText(dpe_fileLoc + @"printproc.txt",
                                       " NEXT_SIG_LR : Located signal : " +
                                       thisHead.mainSignal.sigfound[parameter1_value].ToString() + "\n");
                }
#endif
#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    var sob = new StringBuilder();
                    sob.AppendFormat(" NEXT_SIG_LR : Located signal : {0}", thisHead.mainSignal.sigfound[parameter1_value].ToString());

                    if (thisHead.mainSignal.sigfound[parameter1_value] > 0)
                    {
                        SignalObject otherSignal = thisHead.mainSignal.signalRef.SignalObjects[thisHead.mainSignal.sigfound[parameter1_value]];
                        sob.AppendFormat(" (");

                        foreach (SignalHead otherHead in otherSignal.SignalHeads)
                        {
                            sob.AppendFormat(" {0} ", otherHead.TDBIndex);
                        }

                        sob.AppendFormat(") ");
                    }
                    sob.AppendFormat("\n");

                    File.AppendAllText(dpr_fileLoc + @"printproc.txt", sob.ToString());
                }
#endif

                break;

            // next_sig_mr

            case (SignalScripts.SCRExternalFunctions.NEXT_SIG_MR):
                return_value = (int)thisHead.next_sig_mr((MstsSignalFunction)parameter1_value);
#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    File.AppendAllText(dpe_fileLoc + @"printproc.txt",
                                       " NEXT_SIG_LR : Located signal : " +
                                       thisHead.mainSignal.sigfound[parameter1_value].ToString() + "\n");
                }
#endif
#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    File.AppendAllText(dpr_fileLoc + @"printproc.txt",
                                       " NEXT_SIG_LR : Located signal : " +
                                       thisHead.mainSignal.sigfound[parameter1_value].ToString() + "\n");
                }
#endif
                break;

            // this_sig_lr

            case (SignalScripts.SCRExternalFunctions.THIS_SIG_LR):
                bool             sigfound_lr    = false;
                MstsSignalAspect returnState_lr = thisHead.this_sig_lr((MstsSignalFunction)parameter1_value, ref sigfound_lr);
                return_value = sigfound_lr ? (int)returnState_lr : -1;
                break;

            // this_sig_mr

            case (SignalScripts.SCRExternalFunctions.THIS_SIG_MR):
                bool             sigfound_mr    = false;
                MstsSignalAspect returnState_mr = thisHead.this_sig_mr((MstsSignalFunction)parameter1_value, ref sigfound_mr);
                return_value = sigfound_mr ? (int)returnState_mr : -1;
                break;

            // opp_sig_lr

            case (SignalScripts.SCRExternalFunctions.OPP_SIG_LR):
                return_value = (int)thisHead.opp_sig_lr((MstsSignalFunction)parameter1_value);
#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    SignalObject foundSignal = null;
                    int          dummy       = (int)thisHead.opp_sig_lr((MstsSignalFunction)parameter1_value, ref foundSignal);
                    int          foundRef    = foundSignal != null ? foundSignal.thisRef : -1;
                    File.AppendAllText(dpe_fileLoc + @"printproc.txt",
                                       " OPP_SIG_LR : Located signal : " + foundRef.ToString() + "\n");
                }
#endif
#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    SignalObject foundSignal = null;
                    int          dummy       = (int)thisHead.opp_sig_lr((MstsSignalFunction)parameter1_value, ref foundSignal);
                    int          foundRef    = foundSignal != null ? foundSignal.thisRef : -1;
                    File.AppendAllText(dpr_fileLoc + @"printproc.txt",
                                       " OPP_SIG_LR : Located signal : " + foundRef.ToString() + "\n");
                }
#endif
                break;

            // opp_sig_mr

            case (SignalScripts.SCRExternalFunctions.OPP_SIG_MR):
                return_value = (int)thisHead.opp_sig_mr((MstsSignalFunction)parameter1_value);
                break;

            // next_nsig_lr

            case (SignalScripts.SCRExternalFunctions.NEXT_NSIG_LR):
                dumpfile = String.Empty;

#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    dumpfile = String.Concat(dpe_fileLoc, "printproc.txt");
                }
#endif

#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    dumpfile = String.Concat(dpr_fileLoc, "printproc.txt");
                }
#endif
                return_value = (int)thisHead.next_nsig_lr((MstsSignalFunction)parameter1_value, parameter2_value, dumpfile);
                break;

            // dist_multi_sig_mr

            case (SignalScripts.SCRExternalFunctions.DIST_MULTI_SIG_MR):

                dumpfile = String.Empty;

#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    dumpfile = String.Concat(dpe_fileLoc, "printproc.txt");
                }
#endif

#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    dumpfile = String.Concat(dpr_fileLoc, "printproc.txt");
                }
#endif

                return_value = (int)thisHead.dist_multi_sig_mr(
                    (MstsSignalFunction)parameter1_value,
                    (MstsSignalFunction)parameter2_value,
                    dumpfile);

                break;

            // sig_feature

            case (SignalScripts.SCRExternalFunctions.SIG_FEATURE):
                bool temp_value;
                temp_value   = thisHead.sig_feature(parameter1_value);
                return_value = Convert.ToInt32(temp_value);
                break;

            // approach control position

            case (SignalScripts.SCRExternalFunctions.APPROACH_CONTROL_POSITION):
                dumpfile = String.Empty;

#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    dumpfile = String.Concat(dpe_fileLoc, "printproc.txt");
                }
#endif

#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    dumpfile = String.Concat(dpr_fileLoc, "printproc.txt");
                }
#endif
                temp_value   = thisHead.mainSignal.ApproachControlPosition(parameter1_value, dumpfile);
                return_value = Convert.ToInt32(temp_value);
                break;

            // approach control speed

            case (SignalScripts.SCRExternalFunctions.APPROACH_CONTROL_SPEED):
                dumpfile = String.Empty;

#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    dumpfile = String.Concat(dpe_fileLoc, "printproc.txt");
                }
#endif

#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    dumpfile = String.Concat(dpr_fileLoc, "printproc.txt");
                }
#endif
                temp_value   = thisHead.mainSignal.ApproachControlSpeed(parameter1_value, parameter2_value, dumpfile);
                return_value = Convert.ToInt32(temp_value);
                break;

            // Check for CallOn

            case (SignalScripts.SCRExternalFunctions.TRAINHASCALLON):
                dumpfile = String.Empty;

#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    dumpfile = String.Concat(dpe_fileLoc, "printproc.txt");
                }
#endif

#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    dumpfile = String.Concat(dpr_fileLoc, "printproc.txt");
                }
#endif
                temp_value   = thisHead.mainSignal.TrainHasCallOn(true, dumpfile);
                return_value = Convert.ToInt32(temp_value);
                break;

            // Check for CallOn

            case (SignalScripts.SCRExternalFunctions.TRAINHASCALLON_RESTRICTED):
                dumpfile = String.Empty;

#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    dumpfile = String.Concat(dpe_fileLoc, "printproc.txt");
                }
#endif

#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    dumpfile = String.Concat(dpr_fileLoc, "printproc.txt");
                }
#endif
                temp_value   = thisHead.mainSignal.TrainHasCallOn(false, dumpfile);
                return_value = Convert.ToInt32(temp_value);
                break;

            case (SignalScripts.SCRExternalFunctions.HASHEAD):
                return_value = thisHead.mainSignal.HasHead(parameter1_value);
#if DEBUG_PRINT_ENABLED
                if (thisHead.mainSignal.enabledTrain != null)
                {
                    File.AppendAllText(dpe_fileLoc + @"printproc.txt",
                                       " HASHEAD : required head : " + parameter1_value + " ; state :  " + return_value + "\n");
                }
#endif
#if DEBUG_PRINT_PROCESS
                if (TDB_debug_ref.Contains(thisHead.TDBIndex))
                {
                    File.AppendAllText(dpr_fileLoc + @"printproc.txt",
                                       " HASHEAD : required head : " + parameter1_value + " ; state :  " + return_value + "\n");
                }
#endif
                break;

            // def_draw_state

            case (SignalScripts.SCRExternalFunctions.DEF_DRAW_STATE):
                return_value = thisHead.def_draw_state((MstsSignalAspect)parameter1_value);
                break;

            // DEBUG routine : to be implemented later

            default:
                break;
            }

#if DEBUG_PRINT_ENABLED
            if (thisHead.mainSignal.enabledTrain != null)
            {
                File.AppendAllText(dpe_fileLoc + @"printproc.txt",
                                   "Function Result : " + thisFunction.ToString() + "(" + parameter1_value.ToString() + ") = " +
                                   return_value.ToString() + "\n");
            }
#endif
#if DEBUG_PRINT_PROCESS
            if (TDB_debug_ref.Contains(thisHead.TDBIndex))
            {
                File.AppendAllText(dpr_fileLoc + @"printproc.txt",
                                   "Function Result : " + thisFunction.ToString() + "(" + parameter1_value.ToString() + ") = " +
                                   return_value.ToString() + "\n");
            }
#endif

            // check sign

            if (thisTerm.TermOperator == SignalScripts.SCRTermOperator.MINUS)
            {
                return_value = -(return_value);
            }

            return(return_value);
        }
Exemple #13
0
        public SignalShape(SignalObject mstsSignal, string path, IWorldPosition positionSource, ShapeFlags flags)
            : base(path, positionSource, flags)
        {
#if DEBUG_SIGNAL_SHAPES
            Console.WriteLine("{0} signal {1}:", Location.ToString(), mstsSignal.UID);
            UID = mstsSignal.UID;
#endif
            var signalShape = Path.GetFileName(path).ToUpper();
            if (!viewer.SIGCFG.SignalShapes.ContainsKey(signalShape))
            {
                Trace.TraceWarning("{0} signal {1} has invalid shape {2}.", WorldPosition.ToString(), mstsSignal.UiD, signalShape);
                return;
            }
            var mstsSignalShape = viewer.SIGCFG.SignalShapes[signalShape];
#if DEBUG_SIGNAL_SHAPES
            Console.WriteLine("  Shape={0} SubObjs={1,-2} {2}", Path.GetFileNameWithoutExtension(path).ToUpper(), mstsSignalShape.SignalSubObjs.Count, mstsSignalShape.Description);
#endif

            // The matrix names are used as the sub-object names. The sub-object visibility comes from
            // mstsSignal.SignalSubObj, which is mapped to names through mstsSignalShape.SignalSubObjs.
            var visibleMatrixNames = new bool[SharedShape.MatrixNames.Count];
            for (var i = 0; i < mstsSignalShape.SignalSubObjs.Count; i++)
            {
                if ((((mstsSignal.SignalSubObject >> i) & 0x1) == 1) && (SharedShape.MatrixNames.Contains(mstsSignalShape.SignalSubObjs[i].MatrixName)))
                {
                    visibleMatrixNames[SharedShape.MatrixNames.IndexOf(mstsSignalShape.SignalSubObjs[i].MatrixName)] = true;
                }
            }

            // All sub-objects except the one pointing to the first matrix (99.00% times it is the first one, but not always, see Protrain) are hidden by default.
            //For each other sub-object, look up its name in the hierarchy and use the visibility of that matrix.
            visibleMatrixNames[0] = true;
            SubObjVisible         = new bool[SharedShape.LodControls[0].DistanceLevels[0].SubObjects.Length];
            SubObjVisible[0]      = true;
            for (var i = 1; i < SharedShape.LodControls[0].DistanceLevels[0].SubObjects.Length; i++)
            {
                if (i == SharedShape.RootSubObjectIndex)
                {
                    SubObjVisible[i] = true;
                }
                else
                {
                    var subObj        = SharedShape.LodControls[0].DistanceLevels[0].SubObjects[i];
                    int minHiLevIndex = 0;
                    if (subObj.ShapePrimitives[0].Hierarchy[subObj.ShapePrimitives[0].HierarchyIndex] > 0)
                    // Search for ShapePrimitive with lowest Hierarchy Value and check visibility with it
                    {
                        var minHiLev = 999;
                        for (var j = 0; j < subObj.ShapePrimitives.Length; j++)
                        {
                            if (subObj.ShapePrimitives[0].Hierarchy[subObj.ShapePrimitives[j].HierarchyIndex] < minHiLev)
                            {
                                minHiLevIndex = j;
                                minHiLev      = subObj.ShapePrimitives[0].Hierarchy[subObj.ShapePrimitives[j].HierarchyIndex];
                            }
                        }
                    }
                    SubObjVisible[i] = visibleMatrixNames[SharedShape.LodControls[0].DistanceLevels[0].SubObjects[i].ShapePrimitives[minHiLevIndex].HierarchyIndex];
                }
            }

#if DEBUG_SIGNAL_SHAPES
            for (var i = 0; i < mstsSignalShape.SignalSubObjs.Count; i++)
            {
                Console.WriteLine("  SUBOBJ {1,-12} {0,-7} {2,3} {3,3} {4,2} {5,2} {6,-14} {8} ({7})", ((mstsSignal.SignalSubObj >> i) & 0x1) != 0 ? "VISIBLE" : "hidden", mstsSignalShape.SignalSubObjs[i].MatrixName, mstsSignalShape.SignalSubObjs[i].Optional ? "Opt" : "", mstsSignalShape.SignalSubObjs[i].Default ? "Def" : "", mstsSignalShape.SignalSubObjs[i].JunctionLink ? "JL" : "", mstsSignalShape.SignalSubObjs[i].BackFacing ? "BF" : "", mstsSignalShape.SignalSubObjs[i].SignalSubType == -1 ? "<none>" : MSTS.SignalShape.SignalSubObj.SignalSubTypes[mstsSignalShape.SignalSubObjs[i].SignalSubType], mstsSignalShape.SignalSubObjs[i].SignalSubSignalType, mstsSignalShape.SignalSubObjs[i].Description);
            }
            for (var i = 0; i < SubObjVisible.Length; i++)
            {
                Console.WriteLine("  SUBOBJ {0,-2} {1,-7}", i, SubObjVisible[i] ? "VISIBLE" : "hidden");
            }
#endif

            if (mstsSignal.SignalUnits == null)
            {
                Trace.TraceWarning("{0} signal {1} has no SignalUnits.", WorldPosition.ToString(), mstsSignal.UiD);
                return;
            }

            for (var i = 0; i < mstsSignal.SignalUnits.Count; i++)
            {
#if DEBUG_SIGNAL_SHAPES
                Console.Write("  UNIT {0}: TrItem={1,-5} SubObj={2,-2}", i, mstsSignal.SignalUnits.Units[i].TrItem, mstsSignal.SignalUnits.Units[i].SubObj);
#endif
                // Find the simulation SignalObject for this shape.
                var signalAndHead = viewer.Simulator.Signals.FindByTrItem(mstsSignal.SignalUnits[i].TrackItem);
                if (!signalAndHead.HasValue)
                {
                    Trace.TraceWarning("Skipped {0} signal {1} unit {2} with invalid TrItem {3}", WorldPosition.ToString(), mstsSignal.UiD, i, mstsSignal.SignalUnits[i].TrackItem);
                    continue;
                }
                // Get the signal sub-object for this unit (head).
                var mstsSignalSubObj = mstsSignalShape.SignalSubObjs[mstsSignal.SignalUnits[i].SubObject];
                if (mstsSignalSubObj.SignalSubType != SignalSubType.Signal_Head) // SIGNAL_HEAD
                {
                    Trace.TraceWarning("Skipped {0} signal {1} unit {2} with invalid SubObj {3}", WorldPosition.ToString(), mstsSignal.UiD, i, mstsSignal.SignalUnits[i].SubObject);
                    continue;
                }
                var mstsSignalItem = (SignalItem)(viewer.Simulator.TDB.TrackDB.TrackItems[mstsSignal.SignalUnits[i].TrackItem]);
                try
                {
                    // Go create the shape head.
                    Heads.Add(new SignalShapeHead(viewer, this, i, signalAndHead.Value.Value, mstsSignalItem, mstsSignalSubObj));
                }
                catch (InvalidDataException error)
                {
                    Trace.TraceWarning(error.Message);
                }
#if DEBUG_SIGNAL_SHAPES
                Console.WriteLine();
#endif
            }
        }
Exemple #14
0
        } = new List <int>();                                     // Flags heads which are backfacing

        public SignalWorldInfo(SignalObject signalWorldItem, SignalConfigurationFile signalConfig)
        {
            if (null == signalConfig)
            {
                throw new ArgumentNullException(nameof(signalConfig));
            }
            if (null == signalWorldItem)
            {
                throw new ArgumentNullException(nameof(signalWorldItem));
            }

            HeadReference = new Dictionary <uint, uint>();

            // set flags with length to number of possible SubObjects type

            FlagsSet           = new BitArray(EnumExtension.GetLength <SignalSubType>());
            FlagsSetBackfacing = new BitArray(EnumExtension.GetLength <SignalSubType>());

            string fileName = Path.GetFileName(signalWorldItem.FileName);

            // search defined shapes in SIGCFG to find signal definition

            if (signalConfig.SignalShapes.TryGetValue(fileName, out SignalShape thisCFGShape))
            {
                HeadsSet = new BitArray(thisCFGShape.SignalSubObjs.Count);

                // loop through all heads and check SubObj flag per bit to check if head is set
                uint mask = 1;

                for (int i = 0; i < thisCFGShape.SignalSubObjs.Count; i++)
                {
                    uint headSet = signalWorldItem.SignalSubObject & mask;
                    SignalShape.SignalSubObject signalSubObjects = thisCFGShape.SignalSubObjs[i];
                    if (headSet != 0)
                    {
                        // set head, and if head is flag, also set flag
                        HeadsSet[i] = true;

                        if (signalSubObjects.BackFacing)
                        {
                            Backfacing.Add(i);
                            if ((int)signalSubObjects.SignalSubType >= 1)
                            {
                                FlagsSetBackfacing[(int)signalSubObjects.SignalSubType] = true;
                            }
                        }
                        else if ((int)signalSubObjects.SignalSubType >= 1)
                        {
                            FlagsSet[(int)signalSubObjects.SignalSubType] = true;
                        }
                    }
                    mask <<= 1;
                }

                // get TDB and head reference from World file
                foreach (SignalUnit signalUnitInfo in signalWorldItem.SignalUnits)
                {
                    HeadReference.Add(signalUnitInfo.TrackItem, (uint)signalUnitInfo.SubObject);
                }
            }
            else
            {
                Trace.TraceWarning("Signal not found : {0} n", fileName);
            }
        }
 public static void RemoveSignal(SignalObject obj)
 {
     _objects[(int)LAYER_ORDER.SIGNALS].Remove(obj);
 }
 public static void AddSignal(SignalObject obj)
 {
     _objects[(int)LAYER_ORDER.SIGNALS].Add(obj);
 }