/// <summary>
        /// Define la transacción que prueba la zona de contacto de la compuerta
        /// </summary>
        /// <param name="doc">El documento activo.</param>
        /// <param name="tr">La transacción activa.</param>
        /// <param name="input">La entrada de la transacción.</param>
        /// <returns>La compuerta insertada</returns>
        private object TestZoneTask(Document doc, Transaction tr, object[] input)
        {
            Compuerta cmp = (Compuerta)input[0];
            Point3d   test_pt;
            Editor    ed = doc.Editor;

            while (Selector.Point("Selecciona una zona de contacto", out test_pt, true))
            {
                string            zoneName;
                Point3dCollection zone;
                cmp.GetZone(test_pt, out zoneName, out zone);
                if (zoneName == String.Empty)
                {
                    ed.WriteMessage("\nPunto fuera de la zona");
                }
                else
                {
                    String coords = string.Empty;
                    zone.OfType <Point3d>().ToList().ForEach(x => coords += String.Format("\n({0:N2},{1:N2})", x.X, x.Y));
                    ed.WriteMessage("\nCoordenadas:{1}\nPunto dentro de la zona {0}", zoneName, coords);
                    //ed.WriteMessage("\n{0}", zoneName);
                }
            }
            return(null);
        }
        /// <summary>
        /// Define los puntos de conexión de la compuerta
        /// </summary>
        /// <param name="com">Los puntos de conexión.</param>
        /// <returns>Los puntos de conexión</returns>
        public static Dictionary <String, Point3d> GetConnectionPointsNInputs(this Compuerta com, int inputNum)
        {
            Dictionary <String, Point3d> connPoints = new Dictionary <string, Point3d>();
            char letraInp = 'A';

            String[] names = new String[inputNum + 1];
            for (int i = 0; i < inputNum; i++)
            {
                names[i] = "INPUT" + letraInp;
                letraInp++;
            }
            names[inputNum] = "OUTPUT";
            Point3d cOutput = com.Box[1].MidPoint(com.Box[2]);

            Point3d[] pts   = new Point3d[inputNum + 1];
            double    delta = (com.Box[0].DistanceTo(com.Box[3])) / inputNum;

            for (int i = 0; i < inputNum; i++)
            {
                if (i == 0)
                {
                    pts[i] = com.Box[3] - new Vector3d(0, delta / 2, 0);
                }
                else
                {
                    pts[i] = pts[i - 1] - new Vector3d(0, delta, 0);
                }
            }
            pts[inputNum] = cOutput;
            for (int i = 0; i < names.Length; i++)
            {
                connPoints.Add(names[i], pts[i]);
            }
            return(connPoints);
        }
        public void InsertCompuerta()
        {
            if (Compuertas == null)
            {
                Compuertas = new Dictionary <Handle, Compuerta>();
            }
            Point3d pt;

            if (Selector.Point("Selecciona el punto de inserción de la compuerta", out pt))
            {
                TransactionWrapper tr  = new TransactionWrapper();
                Compuerta          cmp = null;
                if (Commands.myControlCompuertas != null)
                {
                    if (Commands.myControlCompuertas.CompuertaName == "OR")
                    {
                        cmp = new OR();
                    }
                }
                if (cmp != null)
                {
                    cmp = tr.Run(InsertCompuertaTask, cmp, pt) as Compuerta;
                    Compuertas.Add(cmp.Id, cmp);
                }
            }
        }
        public void TestZoneCommand()
        {
            Point3d  test_pt;
            ObjectId pickEnt;

            if (Selector.Entity("Selecciona una compuerta", out pickEnt, out test_pt))
            {
                //Buscamos la compuerta por ObjectId
                Compuerta cmp = this.Compuertas.Values.FirstOrDefault(x => x.Block.Id == pickEnt);
                Editor    ed  = Application.DocumentManager.MdiActiveDocument.Editor;
                if (cmp != null)
                {
                    TransactionWrapper t = new TransactionWrapper();
                    //Se dibujan las zonas
                    ObjectIdCollection ids = t.Run(DrawZonesTask, cmp) as ObjectIdCollection;
                    ed.Regen();
                    //Se realizan las pruebas de contacto
                    t.Run(TestZoneTask, cmp);
                    //Se eliminan los rectangulos dibujados de la zona
                    t.Run(EraseZonesTask, ids);
                }
                else
                {
                    ed.WriteMessage("No es una compuerta");
                }
            }
        }
        /// <summary>
        /// Define la caja de colisión para una compuerta de dos entradas
        /// </summary>
        /// <param name="com">La compuerta con dos entradas.</param>
        /// <returns>Las zonas para la compuerta de dos entradas</returns>
        public static Dictionary <String, Point3dCollection> GetZonesTwoInputs(this Compuerta com)
        {
            Dictionary <String, Point3dCollection> zones = new Dictionary <string, Point3dCollection>();

            String[]            names  = new String[] { "INPUTA", "INPUTB", "OUTPUT" };
            Point3dCollection[] z      = new Point3dCollection[3];
            Point3d             center = com.Box[0].MidPoint(com.Box[1]).MidPoint(com.Box[3].MidPoint(com.Box[2]));

            z[0] = new Point3dCollection(new Point3d[]
            {
                com.Box[0].MidPoint(com.Box[3]),
                center,
                com.Box[3].MidPoint(com.Box[2]),
                com.Box[3]
            });
            z[1] = new Point3dCollection(new Point3d[]
            {
                com.Box[0],
                com.Box[0].MidPoint(com.Box[1]),
                center,
                com.Box[0].MidPoint(com.Box[3]),
            });
            z[2] = new Point3dCollection(new Point3d[]
            {
                com.Box[0].MidPoint(com.Box[1]),
                com.Box[1],
                com.Box[2],
                com.Box[2].MidPoint(com.Box[3])
            });
            for (int i = 0; i < names.Length; i++)
            {
                zones.Add(names[i], z[i]);
            }
            return(zones);
        }
Exemple #6
0
        ///// <summary>
        ///// Define un comando para la inserción de un pulso de tamaño y valor true (Vcc)
        ///// </summary>
        //[CommandMethod("DibujaVcc")]
        //public void InsertVcc()
        //{
        //    Point3d insPt;
        //    if (Selector.Point("Selecciona el punto de inserción de Vcc", out insPt))
        //    {
        //        Boolean vcc = true;
        //        Pulso p = new Pulso(insPt, vcc);
        //    }
        //}
        /// <summary>
        /// Define la transacción que inserta una compuerta
        /// </summary>
        /// <param name="doc">El documento activo.</param>
        /// <param name="tr">La transacción activa.</param>
        /// <param name="input">La entrada de la transacción.</param>
        /// <returns>La compuerta insertada</returns>
        private object InsertCompuertaTask(Document doc, Transaction tr, object[] input)
        {
            Compuerta cmp = (Compuerta)input[0];
            Point3d   pt  = (Point3d)input[1];

            cmp.Insert(pt, tr, doc);
            return(cmp);
        }
        /// <summary>
        /// Define la transacción que dibuja las áreas de contacto de la compuerta
        /// No es necesario que sean visibles para realizar la prueba.
        /// </summary>
        /// <param name="doc">El documento activo.</param>
        /// <param name="tr">La transacción activa.</param>
        /// <param name="input">La entrada de la transacción.</param>
        /// <returns>La compuerta insertada</returns>
        private object DrawZonesTask(Document doc, Transaction tr, object[] input)
        {
            Compuerta cmp = (Compuerta)input[0];
            Drawer    d   = new Drawer(tr);

            cmp.InitBox();
            cmp.DrawBox(d);
            return(d.Ids);
        }
Exemple #8
0
        private object ConnectionTask3(Document doc, Transaction tr, object[] input)
        {
            Compuerta cmp     = (Compuerta)input[0];
            Input     cmpFrom = (Input)input[1];

            cmp.InitBox(cmp.Name);
            cmpFrom.InitBox(cmpFrom.Name);
            Editor            ed = Application.DocumentManager.MdiActiveDocument.Editor;
            Point3d           pt1 = (Point3d)input[3], pt2 = (Point3d)input[2];
            String            zoneA;
            Point3dCollection zone;

            cmp.GetZone(pt1, out zoneA, out zone);
            if (((ObjectId)input[6]).IsNull)
            {
                switch (zoneA)
                {
                case "INPUTA":
                    if (((ObjectId)input[4]).IsNull)
                    {
                        Drawer d  = new Drawer(tr);
                        Line   lA = new Line(cmpFrom.ConnectionPoints["OUTPUT"], cmp.ConnectionPoints[zoneA]);
                        d.Entity(lA);
                    }
                    else
                    {
                        ed.WriteMessage("Ya existe un elemento conectado a esta entrada");
                    }
                    break;

                case "INPUTB":
                    if (((ObjectId)input[5]).IsNull)
                    {
                        Drawer d  = new Drawer(tr);
                        Line   lA = new Line(cmpFrom.ConnectionPoints["OUTPUT"], cmp.ConnectionPoints[zoneA]);
                        d.Entity(lA);
                    }
                    else
                    {
                        ed.WriteMessage("Ya existe un elemento conectado a esta entrada");
                    }
                    break;

                case "OUTPUT":
                    ed.WriteMessage("Imposible conectar con una salida");
                    break;
                }
            }
            else
            {
                ed.WriteMessage("Imposible conectar, prueba de nuevo");
            }
            return(null);
        }
        /// <summary>
        /// Define la transacción que inserta una compuerta
        /// </summary>
        /// <param name="doc">El documento activo.</param>
        /// <param name="tr">La transacción activa.</param>
        /// <param name="input">La entrada de la transacción.</param>
        /// <returns>La compuerta insertada</returns>
        private object InsertCompuertaTask(Document doc, Transaction tr, object[] input)
        {
            Compuerta         cmp  = (Compuerta)input[0];
            Point3d           pt   = (Point3d)input[1];
            DictionaryManager dMan = new DictionaryManager();

            cmp.Insert(pt, tr, doc);

            //En este objeto pueden guardar información de los elementos insertados
            var dicCompuerta = dMan.GetExtensionD(tr, doc, cmp.Block);

            dMan.SetData(dicCompuerta, tr, "Tipo", "Compuerta");
            return(cmp);
        }
        public void ChecarCables()
        {
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ObjectId compId;

            if (Selector.Entity("Selecciona una compuerta", out compId))
            {
                Compuerta cmp = this.Compuertas.FirstOrDefault(x => x.Value.Block.ObjectId == compId).Value;
                cmp.InitBox();
                ObjectId cableAId     = cmp.Search("INPUTA").OfType <ObjectId>().FirstOrDefault(),
                         cableBId     = cmp.Search("INPUTB").OfType <ObjectId>().FirstOrDefault();
                TransactionWrapper tr = new TransactionWrapper();
                tr.Run(TestConnectionTask, cmp, cableAId, cableBId);
            }
        }
Exemple #11
0
        public void Connect()
        {
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ObjectId inpId, outId;
            Point3d  pt1;

            if (Selector.Entity("\nSelecciona un pulso", typeof(Polyline), out inpId) &&
                Selector.Entity("Selecciona una Entrada", out outId, out pt1))
            {
                Compuerta cmp = Commands.Compuertas.FirstOrDefault(x => x.Value.Block.ObjectId == outId).Value;
                cmp.InitBox(cmp.Name);
                ObjectId cableAId     = cmp.Search("INPUTA").OfType <ObjectId>().FirstOrDefault(),
                         cableBId     = cmp.Search("INPUTB").OfType <ObjectId>().FirstOrDefault();
                TransactionWrapper tr = new TransactionWrapper();
                tr.Run(ConnectionTask, cmp, cableAId, cableBId, pt1, inpId);
            }
        }
Exemple #12
0
        private object ConnectionTask(Document doc, Transaction tr, object[] input)
        {
            Compuerta cmp = (Compuerta)input[0];

            cmp.InitBox(cmp.Name);
            Editor            ed  = Application.DocumentManager.MdiActiveDocument.Editor;
            Polyline          p1  = ((ObjectId)input[4]).GetObject(OpenMode.ForRead) as Polyline;
            Point3d           pt1 = (Point3d)input[3];
            String            zoneA;
            Point3dCollection zone;

            cmp.GetZone(pt1, out zoneA, out zone);
            switch (zoneA)
            {
            case "INPUTA":
                if (((ObjectId)input[1]).IsNull)
                {
                    Drawer d  = new Drawer(tr);
                    Line   lA = new Line(p1.EndPoint, cmp.ConnectionPoints[zoneA]);
                    d.Entity(lA);
                }
                else
                {
                    ed.WriteMessage("Ya existe un elemento conectado a esta entrada");
                }
                break;

            case "INPUTB":
                if (((ObjectId)input[2]).IsNull)
                {
                    Drawer d  = new Drawer(tr);
                    Line   lA = new Line(p1.EndPoint, cmp.ConnectionPoints[zoneA]);
                    d.Entity(lA);
                }
                else
                {
                    ed.WriteMessage("Ya existe un elemento conectado a esta entrada");
                }
                break;

            case "OUTPUT":
                ed.WriteMessage("Imposible conectar con una salida");
                break;
            }
            return(null);
        }
Exemple #13
0
        public void StartCalculo()
        {
            TransactionWrapper trW     = new TransactionWrapper();
            Editor             ed      = Application.DocumentManager.MdiActiveDocument.Editor;
            Object             acadObj = Application.AcadApplication;

            acadObj.GetType().InvokeMember("ZoomExtents", System.Reflection.BindingFlags.InvokeMethod, null, acadObj, null);
            Compuerta cmpFrom = Commands.Compuertas.FirstOrDefault(x => x.Value.Block.Name == "OUTPUT").Value;

            if (cmpFrom != null)
            {
            }
            else
            {
                ed.WriteMessage("No se encontro un Objeto de pulso salida");
            }
            acadObj.GetType().InvokeMember("ZoomPrevious", System.Reflection.BindingFlags.InvokeMethod, null, acadObj, null);
        }
Exemple #14
0
        public void ConnectFC()
        {
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ObjectId inpId, outId;
            Point3d  pt1, pt2;

            if (Selector.Entity("\nSelecciona VCC o GND ", out inpId, out pt1) &&
                Selector.Entity("\nSelecciona la entrada de conexión", out outId, out pt2))
            {
                Compuerta cmp  = Compuertas.FirstOrDefault(x => x.Value.Block.ObjectId == outId).Value;
                Input     inpB = Entradas.FirstOrDefault(x => x.Value.Block.ObjectId == inpId).Value;
                cmp.InitBox(cmp.Name);
                inpB.InitBox(inpB.Name);
                ObjectId cableAId     = cmp.Search("INPUTA").OfType <ObjectId>().FirstOrDefault(),
                         cableBId     = cmp.Search("INPUTB").OfType <ObjectId>().FirstOrDefault(),
                         outputId     = inpB.Search("OUTPUT").OfType <ObjectId>().FirstOrDefault();
                TransactionWrapper tr = new TransactionWrapper();
                tr.Run(ConnectionTask3, cmp, inpB, pt1, pt2, cableAId, cableBId, outputId);
            }
        }
Exemple #15
0
        /// <summary>
        /// Define los puntos de conexión de la compuerta
        /// </summary>
        /// <param name="com">Los puntos de conexión.</param>
        /// <returns>Los puntos de conexión</returns>
        public static Dictionary <String, Point3d> GetConnectionPointsTwoInputs(this Compuerta com)
        {
            Dictionary <String, Point3d> connPoints = new Dictionary <string, Point3d>();

            String[] names   = new String[] { "INPUTA", "INPUTB", "OUTPUT" };
            Point3d  cInput  = com.Box[0].MidPoint(com.Box[3]);
            Point3d  cOutput = com.Box[1].MidPoint(com.Box[2]);

            Point3d[] pts = new Point3d[]
            {
                cInput.MidPoint(com.Box[3]),
                com.Box[0].MidPoint(cInput),
                cOutput
            };
            for (int i = 0; i < names.Length; i++)
            {
                connPoints.Add(names[i], pts[i]);
            }
            return(connPoints);
        }
        /// <summary>
        /// Define la caja de colisión para una compuerta de dos entradas
        /// </summary>
        /// <param name="com">La compuerta con dos entradas.</param>
        /// <returns>Las zonas para la compuerta de dos entradas</returns>
        public static Dictionary <String, Point3dCollection> GetZonesNInputs(this Compuerta com, int inputNum)
        {
            char letraInp = 'A';
            Dictionary <String, Point3dCollection> zones = new Dictionary <string, Point3dCollection>();

            String[] names = new String[inputNum + 1];
            for (int i = 0; i < inputNum; i++)
            {
                names[i] = "INPUT" + letraInp;
                letraInp++;
            }
            names[inputNum] = "OUTPUT";
            Point3dCollection[] z = new Point3dCollection[inputNum + 1];
            double delta          = (com.Box[0].DistanceTo(com.Box[3])) / inputNum;
            double midDistance    = com.Box[0].DistanceTo(com.Box[1]) / 2;
            int    j = 0;

            for (int i = inputNum; i > 0; i--)
            {
                z[j] = new Point3dCollection(new Point3d[] {
                    com.Box[0] + new Vector3d(0, delta * i, 0),
                    com.Box[0] + new Vector3d(midDistance, delta * i, 0),
                    com.Box[0] + new Vector3d(midDistance, delta * (i - 1), 0),
                    com.Box[0] + new Vector3d(0, delta * (i - 1), 0),
                });
                j++;
            }
            z[inputNum] = new Point3dCollection(new Point3d[]
            {
                com.Box[0].MidPoint(com.Box[1]),
                com.Box[1],
                com.Box[2],
                com.Box[2].MidPoint(com.Box[3])
            });
            for (int i = 0; i < names.Length; i++)
            {
                zones.Add(names[i], z[i]);
            }
            return(zones);
        }
        private object TestCompuertaTask(Document doc, Transaction tr, object[] input)
        {
            Compuerta cmp = (Compuerta)input[0];

            cmp.InitBox();
            Polyline p1 = ((ObjectId)input[1]).GetObject(OpenMode.ForRead) as Polyline;
            Polyline p2 = ((ObjectId)input[2]).GetObject(OpenMode.ForRead) as Polyline;
            Point3d  pt1 = (Point3d)input[3];
            Point3d  pt2 = (Point3d)input[4];
            String   zoneA, zoneB;
            //No nos interesa en este ejemplo las coordenadas
            Point3dCollection zone;

            cmp.GetZone(pt1, out zoneA, out zone);
            cmp.GetZone(pt2, out zoneB, out zone);
            InputValue inA = new InputValue()
            {
                Name = zoneA, Value = Pulso.GetValues(p1)
            },
                       inB = new InputValue()
            {
                Name = zoneB, Value = Pulso.GetValues(p2)
            };

            Boolean[] result = cmp.Solve(inA, inB);
            Drawer    d      = new Drawer(tr);
            Point3d   pt;

            if (Selector.Point("Selecciona el punto de inserción de la salida", out pt))
            {
                Pulso p = new Pulso(pt, result);
                p.Draw(d);
                Line lA = new Line(p1.EndPoint, cmp.ConnectionPoints[inA.Name]),
                     lB = new Line(p2.EndPoint, cmp.ConnectionPoints[inB.Name]),
                     lO = new Line(pt, cmp.ConnectionPoints["OUTPUT"]);
                d.Entities(lA, lB, lO);
                cmp.SetData(tr, doc, inA.Value.LastOrDefault(), inB.Value.LastOrDefault());
            }
            return(null);
        }
        public void TestCompuerta()
        {
            ObjectId p1Id, p2Id, cmpId;
            Point3d  pt1, pt2;
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

            if (Selector.Entity("\nSelecciona un pulso", typeof(Polyline), out p1Id) &&
                Selector.Entity("\nSelecciona la entrada de conexión", out cmpId, out pt1) &&
                Selector.Entity("\nSelecciona un pulso", typeof(Polyline), out p2Id) &&
                Selector.Entity("\nSelecciona la entrada de conexión", out cmpId, out pt2))
            {
                TransactionWrapper tr  = new TransactionWrapper();
                Compuerta          cmp = this.Compuertas.Values.FirstOrDefault(x => x.Block.Id == cmpId);
                if (cmp != null)
                {
                    tr.Run(TestCompuertaTask, cmp, p1Id, p2Id, pt1, pt2);
                }
                else
                {
                    ed.WriteMessage("No es Compuerta");
                }
            }
        }
        /// <summary>
        /// Tests the connection task.
        /// </summary>
        /// <param name="doc">The document.</param>
        /// <param name="tr">The tr.</param>
        /// <param name="input">The input.</param>
        private object TestConnectionTask(Document doc, Transaction tr, object[] input)
        {
            Compuerta cmp = input[0] as Compuerta;
            Editor    ed  = Application.DocumentManager.MdiActiveDocument.Editor;

            if (((ObjectId)input[1]).IsValid && ((ObjectId)input[2]).IsValid)
            {
                DBObject cableA = ((ObjectId)input[1]).GetObject(OpenMode.ForRead);
                DBObject cableB = ((ObjectId)input[2]).GetObject(OpenMode.ForRead);
                if (cableA is Line && cableB is Line)
                {
                    Cable cabA    = new Cable(cableA as Line),
                          cabB    = new Cable(cableB as Line);
                    ObjectId pAId = cabA.Search(true).OfType <ObjectId>().FirstOrDefault(),
                             pBId = cabB.Search(true).OfType <ObjectId>().FirstOrDefault();
                    if (pAId.IsValid && pBId.IsValid)
                    {
                        DBObject pulsoA = pAId.GetObject(OpenMode.ForRead),
                                 pulsoB = pBId.GetObject(OpenMode.ForRead);
                        if (pulsoA is Polyline && pulsoB is Polyline)
                        {
                            var    inputA = Pulso.GetValues(pulsoA as Polyline);
                            var    inputB = Pulso.GetValues(pulsoB as Polyline);
                            bool[] result = cmp.Solve(
                                new InputValue[]
                            {
                                new InputValue()
                                {
                                    Name = "INPUTA", Value = inputA
                                },
                                new InputValue()
                                {
                                    Name = "INPUTB", Value = inputB
                                }
                            });
                            Drawer d      = new Drawer(tr);
                            Pulso  output = new Pulso(cmp.ConnectionPoints["OUTPUT"], result);
                            output.Draw(d);
                        }
                    }
                    if (pAId.IsNull)
                    {
                        ed.WriteMessage("No se encontro un pulso conectado al cable A");
                    }
                    if (pBId.IsNull)
                    {
                        ed.WriteMessage("No se encontro un pulso conectado al cable B");
                    }
                }
            }
            if (((ObjectId)input[1]).IsNull)
            {
                ed.WriteMessage("\nCable A desconectado");
            }
            if (((ObjectId)input[2]).IsNull)
            {
                ed.WriteMessage("\nCable B desconectado");
            }

            return(null);
        }