/// <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); }
///// <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); }
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); } }
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); } }
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); }
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); }
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); } }
/// <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); }