private void DataGridTextColumn_MouseUp(object sender, MouseButtonEventArgs e) { if (sender is TextBlock) { TextBlock txt = sender as TextBlock; long result = 0; if (long.TryParse(txt.Text, out result)) { if (result != 0) { Handle handle = new Handle(result); ObjectId id = handle.toObjectId(); if (id.IsValid) { Met_Autodesk.SetImpliedSelection(handle.toObjectId()); (id.OpenEntity() as Autodesk.AutoCAD.DatabaseServices.Polyline).Focus(10, 10); this.WindowState = WindowState.Minimized; } else { MessageBox.Show("Id Inválido"); } } } } }
public void Vertex() { //Nuevo ObjectId ObjectId objid = new ObjectId(); //Obtengo la entidad que es polilínea Met_Autodesk.Entity("Selecciona Polilinea", out objid, typeof(Polyline)); //Abro entidad y la convierto en Polilinea Polyline pl = objid.OpenEntity() as Polyline; List <Point3d> listPoints = pl.ClockwisePoints(); for (int i = 0; i < listPoints.Count; i++) { ////Punto A Point3d ptActual = listPoints[i]; int idxPtActual = Met_Autodesk.GetPointIndex(pl, ptActual); SegmentType seg = pl.GetSegmentType(idxPtActual); string.Format("El Seg {0}:{1} en el punto X:{2} y Y:{3}\n", seg.ToString(), i + 1, Math.Round(ptActual.X, 2), Math.Round(ptActual.Y, 2)).ToEditor(); } }
public void Apartamentos() { //Nuevo ObjectId ObjectId objid = new ObjectId(); //Obtengo la entidad que es polilínea Met_Autodesk.Entity("Selecciona Polilinea", out objid, typeof(Polyline)); //Abro entidad y la convierto en Polilinea Polyline pl = objid.OpenEntity() as Polyline; //Obtengo Apartamentos dentro del Lote ObjectIdCollection idsApartments = Met_Autodesk.ObjectsInside(pl.GeometricExtents.MinPoint, pl.GeometricExtents.MaxPoint, typeof(Polyline).Filter(M.Constant.LayerApartamento)); foreach (ObjectId idAP in idsApartments) { Polyline plAp = idAP.OpenEntity() as Polyline; Met_Autodesk.TextInWindow(plAp.GeometricExtents.MinPoint, plAp.GeometricExtents.MaxPoint, M.Constant.LayerApartamento).ToEditor(); } }
internal static int InsertoColindancia(this M.ManzanaData insertedData) { int sigPosicion = -1; //Inserto en la polilinea if (Met_Autodesk.InsertDictionary(insertedData.hndPlColindancia.toObjectId(), M.Constant.XRecordColindancia, insertedData.rumboActual, insertedData.textColindancia)) { //Encapsulo en lista de colindancia M.Manzana.ColindanciaManzana.Add(insertedData); //Obtengo la siguiente posición de orientación de rumbo del listado sigPosicion = M.Manzana.OrientacionCalculada.LastIndexOf(insertedData.rumboActual) + 1; } return(sigPosicion); }
private void CreateAndValidatePolyline() { //Inicializo Variables-------------------------------------- //Deshabilito los pasos nuevamente tb1Paso0.IsEnabled = false; tb1Paso1.IsEnabled = false; tb1Paso2.IsEnabled = false; tb1Paso3.IsEnabled = false; //Envío a NULL itemsource tb2GridLotes.ItemsSource = null; //Limpio lista para reasignarla M.Colindante.Lotes.Clear(); //Listado de segmentos List <ObjectId> listSegments = new List <ObjectId>(); //Obtengo los lotes dentro de los segmentos ObjectIdCollection idsLotes = new ObjectIdCollection(); //---------------------------------------------------------- //Leo los segmentos seleccionados listSegments = M.Manzana.ColindanciaManzana.Select(x => x.hndPlColindancia.toObjectId()).ToList(); //Obtengo los Lotes / Macrolotes creando Polilínea idsLotes = Met_Autodesk.GetPolylinesInSegments(listSegments, M.Constant.LayerLote); if (idsLotes.Count > 0) { GetInfoLote(idsLotes); } else { this.ShowMessageAsync("Sin Lotes", "No se encontraron Lotes dentro de la Manzana, ejecutar Lectura de Lotes nuevamente"); } }
private List <string> ObtengoManzanas() { return(Met_Autodesk.ModelDBText(M.Constant.LayerManzana). Select(x => x.TextString).ToList()); }
private void btnAdd_Click(object sender, RoutedEventArgs e) { ObjectId idtxtCol = new ObjectId(), //Id de Texto con el que Colinda idLineCol = new ObjectId(); //Id de Linea/Polilinea con la que Colinda //Selecciono el Item string rumboSeleccionado = (cmbRumboActual.SelectedItem ?? "").ToString(); //Si ya se selecciono algo en el combobox de tipo if (cmbTipo.SelectedIndex != -1) { this.WindowState = WindowState.Minimized; //Solicito que me hagan saber el texto que colinda if (Met_Autodesk.Entity("Selecciona la línea de colindancia al " + rumboSeleccionado + "\n", out idLineCol, M.Constant.TiposLineas) && Met_Autodesk.Entity("Selecciona la colindancia al " + rumboSeleccionado + "\n", out idtxtCol, typeof(DBText))) { if (idLineCol.OpenEntity().Layer == M.Constant.LayerManzana) { //Obtengo el DBText seleccionado DBText DBTextColindancia = idtxtCol.OpenEntity() as DBText; //Texto del DB Text string txtColindancia = DBTextColindancia.TextString.FormatString(); //Modelo los datos M.ManzanaData insertedData = new M.ManzanaData() { hndPlColindancia = idLineCol.Handle, hndTxtColindancia = idtxtCol.Handle, inicialRumbo = (M.Constant.Orientaciones [Met_Manzana.ObtengoPosicion(rumboSeleccionado, 0), 1]), rumboActual = rumboSeleccionado, textColindancia = cmbTipo.SelectedIndex > 0 ? txtColindancia : "calle " + txtColindancia }; bool PolilineaNueva = false, RumboNuevo = false; int sigPosicion = 0; //Si ya se había insertado esa polilinea PolilineaNueva = M.Manzana.ColindanciaManzana.Where (x => x.hndPlColindancia.Value == insertedData.hndPlColindancia.Value). Count() > 0 ? false : true; //Si ya se había insertado ese rumbo en la lista RumboNuevo = M.Manzana.ColindanciaManzana. Where(x => x.rumboActual == insertedData.rumboActual).Count() > 0 ? false : true; //Si es Nueva Polilinea y nuevo Rumbo if (PolilineaNueva && RumboNuevo) { sigPosicion = insertedData.InsertoColindancia(); } else { sigPosicion = insertedData.ReasignoColindancia(PolilineaNueva, RumboNuevo); } //Reviso que rumbo mostrará SigColindancia(sigPosicion); if (ListPrincipal.ItemsSource != null) { ListPrincipal.Items.Refresh(); } else { ListPrincipal.ItemsSource = M.Manzana.ColindanciaManzana; } } else { this.ShowMessageAsync("Layer Incorrecto", "La línea debe de estar en Layer " + M.Constant.LayerManzana); } } this.WindowState = WindowState.Normal; } else { this.ShowMessageAsync("Datos no seleccionados", "Favor de seleccionar Tipo de Colindancia"); } }
//Paso 2 private void tb1SelMultiple_Click(object sender, RoutedEventArgs e) { //Ids seleccionados ObjectIdCollection idsSelected = new ObjectIdCollection(); //Envío a false selección para que vuelva a evaluar tb1CheckLoteIrregular.IsChecked = false; //Mensaje a Mostrar string msg = M.Manzana.EsMacrolote ? "Selecciona los Edificios irregulares" : "Selecciona los lotes irregulares"; this.WindowState = WindowState.Minimized; //Selecciona Polilíneas if (Met_Autodesk.SelectPolylines(out idsSelected, msg, M.Colindante.LayerTipo) && idsSelected.Count > 0) { List <long> listTipo = M.Manzana.EsMacrolote ? M.Colindante.Edificios.Select(x => x._long).ToList() : M.Colindante.Lotes.Select(x => x._long).ToList(); //Obtengo todos los ids en el Lote List <ObjectId> allIdsIn = listTipo.Select(x => new Handle(x).toObjectId()).ToList(); //Todos los ids fuera del lote List <ObjectId> idsAreOut = idsSelected.OfType <ObjectId>() .Where(x => !allIdsIn.Contains(x)).ToList(); //Si ninguno esta afuera de la manzana if (idsAreOut.Count == 0) { //Lo asigno a los IdsIrregulares M.Colindante.IdsIrregulares = idsSelected; //Envío a siguiente paso tb1Paso3.IsEnabled = true; //Envío a true Lote Irregular tb1CheckLoteIrregular.IsChecked = true; //Si no es macrolote obtengo Área Común de cada uno de ellos if (!M.Manzana.EsMacrolote) { string msgAreaComun = ""; foreach (ObjectId idPl in idsSelected) { if (!C.Met_Colindante.GetCommonArea(idPl, out msgAreaComun)) { this.ShowMessageAsync("Área Común", msgAreaComun); } } } } else { string _in = M.Manzana.EsMacrolote ? "del Macrolote" : "de la Manzana"; string msgOut = idsAreOut.Count == 1 ? "Polilínea seleccionado esta fuera" + _in: "Polilíneas seleccionadas están fuera" + _in; for (int i = 0; i < idsAreOut.Count; i++) { ObjectId id = idsAreOut[i]; M.Colindante.ListadoErrores.Add(new M.Error() { error = "Error de selección", description = "La polilínea seleccionada esta fuera " + _in, timeError = DateTime.Now.ToString(), longObject = id.Handle.Value, metodo = "ModuloColindante-tb1SelMultiple_Click", tipoError = M.TipoError.Error }); } this.ShowMessageAsync("Error de selección", msgOut); } } else { M.Colindante.ListadoErrores.Add(new M.Error() { error = "Error de Selección", description = "No se seleccionaron Ids o se canceló el proceso", timeError = DateTime.Now.ToString(), tipoError = M.TipoError.Advertencia, longObject = 0, metodo = "ModuloColindante-tb1SelMultiple_Click" }); } this.WindowState = WindowState.Normal; }
//PASO 1 private void tb1SelLoteTipo_Click(object sender, RoutedEventArgs e) { //Nuevo ID ObjectId idPl = new ObjectId(); //Mensaje a Mostrar string msg = M.Manzana.EsMacrolote ? "Selecciona Edificio Tipo" : "Selecciona Lote Tipo"; //Inicializo Obtención de Área Común //M.Colindante.ListCommonArea = new List<M.AreaComun>(); this.WindowState = WindowState.Minimized; //Seleccionar Entity con Polilínea Válida if (Met_Autodesk.Entity(msg, out idPl, typeof(Autodesk.AutoCAD.DatabaseServices.Polyline))) { //Reviso que este dentro del layer correcto, depende de si es Macrolote o lote if (idPl.OpenEntity().Layer == M.Colindante.LayerTipo) { //Lista dependiendo de si es Edificio o Lote List <long> listaTipo = M.Manzana.EsMacrolote ? M.Colindante.Edificios.Select(x => x._long).ToList() : M.Colindante.Lotes.Select(x => x._long).ToList(); //Reviso que este dentro de los edificios leídos en el plano if (listaTipo.OfType <long>().Select(x => new Handle(x).toObjectId()) .Contains(idPl)) { M.Colindante.IdTipo = idPl; long l = listaTipo.Where(x => new Handle(x).toObjectId() == idPl) .FirstOrDefault(); string numVivienda = "", msgAreaComun = ""; if (M.Manzana.EsMacrolote) { numVivienda = M.Colindante.Edificios.Search(l).numEdificio.ToString(); } else { numVivienda = M.Colindante.Lotes.Search(l).numLote.ToString(); if (!C.Met_Colindante.GetCommonArea(idPl, out msgAreaComun)) { this.ShowMessageAsync("Área Común", msgAreaComun); } } lblLoteTipo.Text = numVivienda; //lblLoteTipo.Text = lblLoteTipo.Visibility = System.Windows.Visibility.Visible; tb1Paso2.IsEnabled = true; } //Cuando el layer de Polilínea no esta dentro del mismo layer else { this.ShowMessageAsync("Error de selección", "La polilínea seleccionada esta afuera de las leídas por la Manzana"); } } else { this.ShowMessageAsync("Error de selección", string.Format("La polilínea no tiene el layer {0}", M.Colindante.LayerTipo)); } } else { M.Colindante.ListadoErrores.Add(new M.Error() { error = "Error de Selección", description = "No se seleccionó Id Valido o se canceló", timeError = DateTime.Now.ToString(), tipoError = M.TipoError.Advertencia, longObject = 0, metodo = "ModuloColindante-tb1Sel_Tipo_Click" }); } this.WindowState = WindowState.Normal; }
//PASO 0 private void tb1SelMacrolote_Click(object sender, RoutedEventArgs e) { ObjectId idPl = new ObjectId(); string msgAreaComun = ""; this.WindowState = WindowState.Minimized; //Valido que se haya obtenido de manera correcta una Polilínea if (Met_Autodesk.Entity("Selecciona Macrolote: ", out idPl, typeof(Autodesk.AutoCAD.DatabaseServices.Polyline))) { //Reviso que la polilínea este dentro del mismo layer if (idPl.OpenEntity().Layer == M.Constant.LayerLote) { //Reviso que este dentro de los Lotes Leídos al Inicio if (M.Colindante.Lotes.OfType <M.Lote>() .Select(x => new Handle(x._long).toObjectId()).Contains(idPl)) { //Busco Edificios y Apartamentos dentro de Macrolote if (!Met_Colindante.noEstaEnEdificios(idPl)) { //Dependiendo de cuantos edificios encuentre los asigno en lbl lblGnEdificios.Text = string.Format("{0} Edificios", M.Colindante.Edificios.Count); //Asigno Número de Lote lblMacrolote.Text = M.Colindante.Lotes.Search(idPl.Handle.Value).numLote.ToString(); //Inicializo Obtención de Área Común M.Colindante.ListCommonArea = new List <M.AreaComun>(); //Obtengo Área Común if (!Met_Colindante.GetCommonArea(idPl, out msgAreaComun)) { this.ShowMessageAsync("Área Común", msgAreaComun); } //Asigno el nombre del Área Común if (M.Colindante.ListCommonArea.Count > 0) { M.Colindante.NomAreaComun = M.Colindante.ListCommonArea[0].NombreAreaComun; } else { M.Colindante.NomAreaComun = "Área Común"; } //Muestro Número de Lote en el paso lblMacrolote.Visibility = System.Windows.Visibility.Visible; //Asigno ID Macrolote encontrado M.Colindante.IdMacrolote = idPl; //Muestro siguiente paso tb1Paso1.IsEnabled = true; } else { this.ShowMessageAsync("Selección de Edificios", "Hay un problema dentro del Macrolote, ir a Detalle..."); } } else { this.ShowMessageAsync("Error de selección", "El lote seleccionado esta afuera de la Manzana"); } } else { this.ShowMessageAsync("Error de selección", string.Format("El lote seleccionado no tiene el layer {0}", M.Constant.LayerLote)); } } else { M.Colindante.ListadoErrores.Add(new M.Error() { error = "Error de Selección", description = "No se seleccionó Polilínea válida o se canceló", timeError = DateTime.Now.ToString(), tipoError = M.TipoError.Advertencia, longObject = 0, metodo = "ModuloColindante-tb1SelMacrolote_Click" }); } this.WindowState = WindowState.Normal; }
private void GetInfoLote(ObjectIdCollection idsLotes) { string LoteOMacroLote = ""; //Complementa lbl de Lotes int countLote = 0, //Reviso cuantos Número de Lotes encontré countNumOficial = 0; //Reviso cuantos Números Oficiales encontré //Por cada lote encontrado en los segmentos foreach (ObjectId idLote in idsLotes) { //Punto minimo y máximo de la polílinea Point3d ptmin = new Point3d(), ptmax = new Point3d(); DBText idTextLote = new DBText(), idTextNumOficial = new DBText(); string valorLote = "", valorNumOficial = ""; int numLote = 0; //Abro entidad de PL Autodesk.AutoCAD.DatabaseServices.Polyline lote = (idLote.OpenEntity() as Autodesk.AutoCAD.DatabaseServices.Polyline); //Calculo punto mínimo y máximo ptmin = lote.GeometricExtents.MinPoint; ptmax = lote.GeometricExtents.MaxPoint; //Enfoco lote.Focus(20, 40); //Detecto Texto con LayerLote ObjectIdCollection idsTextoLotes = Met_Autodesk.ObjectsInside(ptmin, ptmax, typeof(DBText).Filter(M.Constant.LayerLote)); //Detecto Texto con Número Oficial ObjectIdCollection idsNoOficial = Met_Autodesk.ObjectsInside(ptmin, ptmax, typeof(DBText).Filter(M.Constant.LayerNoOficial)); //Reviso que sólo haya 1 para asignarlo //***NÚMERO LOTE--------------------------------------------------------------------------- if (idsTextoLotes.Count == 1) { idTextLote = idsTextoLotes.OfType <ObjectId>().FirstOrDefault().OpenEntity() as DBText; valorLote = idTextLote.TextString.GetAfterSpace(); if (int.TryParse(valorLote, out numLote)) { countLote++; } } else if (idsTextoLotes.Count > 1) //Si encontro más de uno imprimo cuantos encontró { valorLote = idsTextoLotes.Count + " Encontrados"; } //***----------------------------------------------------------------------------------------- //***NÚMERO OFICIAL--------------------------------------------------------------------------- if (idsNoOficial.Count == 1) { idTextNumOficial = idsNoOficial.OfType <ObjectId>().FirstOrDefault().OpenEntity() as DBText; valorNumOficial = idTextNumOficial.TextString.GetAfterSpace(); countNumOficial++; } else if (idsNoOficial.Count > 1) { valorNumOficial = idsTextoLotes.Count + " Encontrados"; } //***----------------------------------------------------------------------------------------- //Agrego Valor de Lotes M.Colindante.Lotes.Add(new M.Lote() { _long = idLote.Handle.Value, numOficial = valorNumOficial, numLote = numLote }); } //Valido si tiene todos los elementos necesarios if (countLote == idsLotes.Count && countNumOficial == idsLotes.Count) { if (M.Manzana.EsMacrolote) { tb1Paso0.IsEnabled = true;//Activo Paso 0 } else { tb1Paso1.IsEnabled = true;//Activo Paso 1 } } else { this.ShowMessageAsync("Error en Lotes", "La cantidad de Números de Lotes u Oficiales no es la correcta \n Ir a Detalles > Información del Lote"); } //Dependiendo de cuantos lotes encontró if (idsLotes.Count == 1) { LoteOMacroLote = M.Manzana.EsMacrolote ? "Macrolote" : "Lote"; } else { LoteOMacroLote = M.Manzana.EsMacrolote ? "Macrolotes" : "Lotes"; } lblGnLotes.Text = idsLotes.Count.ToString() + " " + LoteOMacroLote; tb2GridLotes.ItemsSource = M.Colindante.Lotes; }