private Tecnomapas.TecnoGeo.Geometria.Geometria InterpretaGeometria(int gtype, bool tem_srid, int srid, bool tem_ponto, Decimal pontox, Decimal pontoy, Decimal pontoz, Decimal[] elem_info, Decimal[] ordinates) { int int16_1 = (int)Convert.ToInt16(Math.Floor((Decimal)gtype / new Decimal(1000))); int int16_2 = (int)Convert.ToInt16(Math.Floor((Decimal)(gtype - int16_1 * 1000) / new Decimal(100))); int num = gtype - int16_1 * 1000 - int16_2 * 100; bool ehLrs = int16_2 != 0; if (int16_1 != 2 && (int16_1 != 3 || ehLrs) && ((int16_1 != 3 || int16_2 != 3) && (int16_1 != 4 || int16_2 != 3)) && (int16_1 != 4 || int16_2 != 4) || (tem_ponto == elem_info.Length > 0 || elem_info.Length > 0 != ordinates.Length > 0) || (tem_ponto && ehLrs || tem_ponto && num != 1 && num != 4 && num != 5)) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } switch (num) { case 0: return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); case 1: if (tem_ponto) { return((Tecnomapas.TecnoGeo.Geometria.Geometria) new Ponto(int16_1 == 2 ? new Posicao(pontox, pontoy) : new Posicao(pontox, pontoy, pontoz), int16_1, ehLrs)); } PontoCollection pontoCollection1 = this.GerarPontos(elem_info, ordinates, int16_1, int16_2, false); if (pontoCollection1 == null || pontoCollection1.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)pontoCollection1[0]); case 2: LinhaCollection linhaCollection1 = this.GerarLinhas(elem_info, ordinates, int16_1, int16_2, false); if (linhaCollection1 == null || linhaCollection1.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)linhaCollection1[0]); case 3: PoligonoCollection poligonoCollection1 = this.GerarPoligonos(elem_info, ordinates, int16_1, int16_2, false); if (poligonoCollection1 == null || poligonoCollection1.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)poligonoCollection1[0]); case 4: if (tem_ponto) { Posicao posicao = int16_1 == 2 ? new Posicao(pontox, pontoy) : new Posicao(pontox, pontoy, pontoz); Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa complexa = new Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa(int16_1, ehLrs); complexa.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria) new Ponto(posicao, int16_1, ehLrs)); return((Tecnomapas.TecnoGeo.Geometria.Geometria)complexa); } PontoCollection pontoCollection2 = this.GerarPontos(elem_info, ordinates, int16_1, int16_2, true); if (pontoCollection2 == null) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } LinhaCollection linhaCollection2 = this.GerarLinhas(elem_info, ordinates, int16_1, int16_2, true); if (linhaCollection2 == null) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } PoligonoCollection poligonoCollection2 = this.GerarPoligonos(elem_info, ordinates, int16_1, int16_2, true); if (poligonoCollection2 == null) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa complexa1 = new Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa(ehLrs ? int16_1 - 1 : int16_1, ehLrs); for (int index = 0; index < pontoCollection2.Count; ++index) { complexa1.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria)pontoCollection2[index]); } for (int index = 0; index < linhaCollection2.Count; ++index) { complexa1.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria)linhaCollection2[index]); } for (int index = 0; index < poligonoCollection2.Count; ++index) { complexa1.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria)poligonoCollection2[index]); } if (complexa1.Elementos.Count > 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)complexa1); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); case 5: if (tem_ponto) { return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiPonto(new Ponto(int16_1 == 2 ? new Posicao(pontox, pontoy) : new Posicao(pontox, pontoy, pontoz), int16_1, ehLrs), int16_1, ehLrs)); } PontoCollection pontos = this.GerarPontos(elem_info, ordinates, int16_1, int16_2, true); if (pontos == null || pontos.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiPonto(pontos, ehLrs ? int16_1 - 1 : int16_1, ehLrs)); case 6: LinhaCollection linhas = this.GerarLinhas(elem_info, ordinates, int16_1, int16_2, true); if (linhas == null || linhas.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiLinha(linhas, ehLrs ? int16_1 - 1 : int16_1, ehLrs)); case 7: PoligonoCollection poligonos = this.GerarPoligonos(elem_info, ordinates, int16_1, int16_2, true); if (poligonos == null || poligonos.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiPoligono(poligonos, ehLrs ? int16_1 - 1 : int16_1, ehLrs)); default: return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } }
private LinhaCollection GerarLinhas(Decimal[] elem_info, Decimal[] ordinates, int dimensoes, int eixoLrs, bool multiplo) { LinhaCollection linhaCollection = new LinhaCollection(); int index1 = 0; bool ehLrs = eixoLrs != 0; while (index1 < elem_info.Length) { if (elem_info[index1 + 1] == new Decimal(4)) { try { int int32_1 = Convert.ToInt32(elem_info[index1 + 2]); Linha linha = new Linha(ehLrs ? dimensoes - 1 : dimensoes, ehLrs); for (int index2 = 0; index2 < int32_1; ++index2) { index1 += 3; if (elem_info[index1 + 1] != new Decimal(2)) { throw new Exception("Tipo heterogêneo de linha errado"); } int int32_2 = Convert.ToInt32(elem_info[index1]); int fim = index1 < elem_info.Length - 3 ? Convert.ToInt32(elem_info[index1 + 3]) - (index2 == int32_1 - 1 ? 1 : -1) : ordinates.Length - 1; SegmentoLinha segmento = this.GerarSegmento(ordinates, int32_2, fim, Convert.ToInt32(elem_info[index1 + 2]), dimensoes, eixoLrs); if (segmento == null) { throw new Exception("Falha ao ler um segmento"); } linha.Segmentos.Adicionar(segmento); } linhaCollection.Adicionar(linha); } catch { } if (!multiplo) { return(linhaCollection); } } else if (elem_info[index1 + 1] == new Decimal(2)) { try { int int32 = Convert.ToInt32(elem_info[index1]); int fim = index1 < elem_info.Length - 3 ? Convert.ToInt32((elem_info[index1 + 3]) - 1) : ordinates.Length - 1; SegmentoLinha segmento = this.GerarSegmento(ordinates, int32, fim, Convert.ToInt32(elem_info[index1 + 2]), dimensoes, eixoLrs); Linha linha = new Linha(ehLrs ? dimensoes - 1 : dimensoes, ehLrs); if (segmento == null) { throw new Exception("Falha ao ler um segmento"); } linha.Segmentos.Adicionar(segmento); linhaCollection.Adicionar(linha); } catch { } if (!multiplo) { return(linhaCollection); } } else if (elem_info[index1 + 1] == new Decimal(1005) || elem_info[index1 + 1] == new Decimal(2005)) { index1 += 3 * Convert.ToInt32(elem_info[index1 + 2]); } index1 += 3; } return(linhaCollection); }
public LinhaCollection List(string Value) { return(LinhaCollection.List(ReplaceValues(Value))); }