/** * @brief Metodo que encapsula como debe formatearse en la salida XML un objeto del tipo dwgPolylinea. * * @param p Objeto del tipo dwgPolylinea. * @param xmldoc Objeto de tipo XmlDocument al que se anexará la información de la polilinea. * @param capaId Objeto del tipo ObjectId con el identificador de la capa a la que pertenece la polilinea. Esta capa será usada para asociarla a todas las lineas * y arcos que haya al descomponer la polilinea. * @param dwgf Objeto del tipo dwgFile para buscar información adicional sobre lineas y arcos vinculados a la polilinea. * * @return Devuelve un tipo XmlElement con la información de la polilinea formateada para ser añadido en el documento xmldoc. * **/ public static XmlElement polylinea2xml(dwgPolylinea p, XmlDocument xmldoc, ObjectId capaId, dwgFile dwgf) { XmlElement polylinea = xmldoc.CreateElement("polilinea"); XmlAttribute xmlattribute = xmldoc.CreateAttribute("id"); xmlattribute.Value = p.objId.ToString(); polylinea.Attributes.Append(xmlattribute); var puntolinea2 = dwgf.dwgLineas.Values.Where(x => x.capaId.ToString() == capaId.ToString() && x.parentId.ToString() == p.objId.ToString()); foreach (dwgLinea obj2 in puntolinea2) { XmlElement linea = exportXml.linea2xml(obj2, xmldoc); polylinea.AppendChild(linea); } var puntolinea3 = dwgf.dwgArcos.Values.Where(x => x.capaId.ToString() == capaId.ToString() && x.parentId.ToString() == p.objId.ToString()); foreach (dwgArco obj2 in puntolinea3) { XmlElement arco = exportXml.arco2xml(obj2, xmldoc, capaId, dwgf); polylinea.AppendChild(arco); } XmlElement mapa = xmldoc.CreateElement("mapa_atributos"); polylinea.AppendChild(mapa); return polylinea; }
/** * @brief Metodo que contiene toda la lógica para procesar cada tipo de entidad. En función del tipo de entidad crea las estructuras * en memoria necesarias y almacena toda la información en la clase dwgFile para que posteriormente sea explotada. * **/ private static void ProcesarObjetos(ObjectId acObjId, BlockTable acBlkTbl, BlockTableRecord acBlkTblRec, Transaction t, ObjectId parentId) { Entity ent = (Entity)t.GetObject(acObjId, OpenMode.ForRead); switch (acObjId.ObjectClass.DxfName) { case "POINT": DBPoint porigen = (DBPoint)ent; dwgPunto punto = new dwgPunto(); punto.objId = acObjId; punto.capaId = ent.LayerId; punto.parentId = parentId; punto.coordenadas = porigen.Position; punto.colorPunto = porigen.Color; punto.color_R = porigen.Color.Red; punto.color_G = porigen.Color.Green; punto.color_B = porigen.Color.Blue; if (dwgf.dwgPuntos.ContainsKey(punto.objId) == false) { dwgf.dwgPuntos.Add(punto.objId, punto); } log("Procesado punto: " + punto.objId.ToString(),true,true); break; case "LINE": Line lorigen = (Line)ent; dwgLinea linea = new dwgLinea(); linea.objId = acObjId; linea.capaId = ent.LayerId; linea.parentId = parentId; linea.colorLinea = lorigen.Color; linea.color_R = lorigen.Color.Red; linea.color_G = lorigen.Color.Green; linea.color_B = lorigen.Color.Blue; linea.LineWeight = (Double)lorigen.LineWeight; if (linea.LineWeight == -1) { log("Ancho de la linea igual al ancho de la capa: " + linea.objId.ToString(), true, true); // Reemplazar por el ancho de la capa. linea.LineWeight = dlwdefault; dwgCapa c; dwgf.dwgCapas.TryGetValue(linea.capaId,out c); if (c != null) { linea.LineWeight = c.default_gruesoLinea; } } else if ((linea.LineWeight == -2) || (linea.LineWeight == -3)) { // -2: Reemplazar por el ancho del bloque. Esto habra que implementarlo cuando se de soporte a bloques. // -3: ancho por defecto del autocad. Comando LWDEFAULT log("Ancho de la linea igual al del bloque o al ancho por defecto: " + linea.objId.ToString(), true, true); linea.LineWeight = dlwdefault; } DBPoint p_origen_0 = new DBPoint(lorigen.StartPoint); DBPoint p_final_0 = new DBPoint(lorigen.EndPoint); acBlkTblRec.AppendEntity(p_origen_0); acBlkTblRec.AppendEntity(p_final_0); t.AddNewlyCreatedDBObject(p_origen_0, true); t.AddNewlyCreatedDBObject(p_final_0, true); dwgPunto p_origen_1 = new dwgPunto(); p_origen_1.objId = p_origen_0.ObjectId; p_origen_1.coordenadas = p_origen_0.Position; p_origen_1.capaId = linea.capaId; linea.p_origen = p_origen_1; dwgPunto p_final_1 = new dwgPunto(); p_final_1.objId = p_final_0.ObjectId; p_final_1.coordenadas = p_final_0.Position; p_final_1.capaId = linea.capaId; linea.p_final = p_final_1; if (dwgf.dwgPuntos.ContainsKey(p_origen_1.objId) == false) { dwgf.dwgPuntos.Add(p_origen_1.objId, p_origen_1); } if (dwgf.dwgPuntos.ContainsKey(p_final_1.objId) == false) { dwgf.dwgPuntos.Add(p_final_1.objId, p_final_1); } if (dwgf.dwgLineas.ContainsKey(linea.objId) == false) { dwgf.dwgLineas.Add(linea.objId, linea); } log("Procesada linea: " + linea.objId.ToString(), true, true); break; case "LWPOLYLINE": dwgPolylinea poli = new dwgPolylinea(); poli.objId = acObjId; poli.capaId = ent.LayerId; poli.parentId = parentId; // Descomponemos en subcomponentes. DBObjectCollection entitySet = new DBObjectCollection(); log("Descomponemos polylinea en lineas y puntos: " + poli.objId.ToString(), true, true); entitySet = dwgDecoder.ObtenerPuntosyLineas(ent, acBlkTbl, acBlkTblRec, t); // Procesamos cada uno de los subcomponentes. // Solo pueden ser: lineas y arcos. Una polylinea no puede formarse con nada mas. foreach (Entity ent2 in entitySet) { switch (ent2.ObjectId.ObjectClass.DxfName) { case "LINE": log("Obtenida linea: " + poli.objId.ToString() + ":" + ent2.ObjectId.ToString(),true, true); poli.lineas.Add(ent2.ObjectId); break; case "ARC": log("Obtenido arco: " + poli.objId.ToString() + ":" + ent2.ObjectId.ToString(), true, true); poli.arcos.Add(ent2.ObjectId); break; default: log("Al descomponer polylinea, objeto no reconocido:" + ent2.ObjectId.ObjectClass.DxfName, true, true); break; } log("Procesamos la nueva entidad obtenida - " + ent2.ObjectId.ObjectClass.DxfName + ":" + ent2.ObjectId, true, true); dwgDecoder.ProcesarObjetos(ent2.ObjectId, acBlkTbl, acBlkTblRec, t, poli.objId); } if ((entitySet.Count > 0) && (dwgf.dwgPolylineas.ContainsKey(poli.objId) == false)) { dwgf.dwgPolylineas.Add(poli.objId, poli); } log("Procesada polilinea: " + poli.objId.ToString(),true, true); break; case "ARC": Arc ar = (Arc) ent; dwgArco arco = new dwgArco(); arco.objId = acObjId; arco.capaId = ent.LayerId; arco.parentId = parentId; arco.radio = ar.Radius; arco.angulo_inicio = ar.StartAngle; arco.angulo_final = ar.EndAngle; DBPoint p_centro = new DBPoint(ar.Center); acBlkTblRec.AppendEntity(p_centro); t.AddNewlyCreatedDBObject(p_centro, true); dwgPunto p_centro_1 = new dwgPunto(); p_centro_1.objId = p_centro.ObjectId; p_centro_1.coordenadas = p_centro.Position; p_centro_1.capaId = arco.capaId; if (dwgf.dwgPuntos.ContainsKey(p_centro_1.objId) == false) { dwgf.dwgPuntos.Add(p_centro_1.objId, p_centro_1); } arco.punto_centro = p_centro_1.objId; // Descomponemos en subcomponentes. log("Descomponemos arco en lineas: " + arco.objId.ToString(), true, true); DBObjectCollection entitySet2 = new DBObjectCollection(); entitySet2 = herramientasCurvas.curvaAlineas((Curve)ent, 5, acBlkTbl, acBlkTblRec, t,arco.capaId, dwgf); // Procesamos cada uno de los subcomponentes. // Solo pueden ser: lineas. Eso lo garantiza la funcion curvaAlineas foreach (Entity ent2 in entitySet2) { log("Nueva entidad - " + ent2.ObjectId.ObjectClass.DxfName + ":" + ent2.ObjectId, true, true); arco.lineas.Add(ent2.ObjectId); dwgDecoder.ProcesarObjetos(ent2.ObjectId, acBlkTbl, acBlkTblRec, t, arco.objId); } if (dwgf.dwgArcos.ContainsKey(arco.objId) == false) { dwgf.dwgArcos.Add(arco.objId, arco); } log("Procesado arco: " + arco.objId.ToString(),true, true); break; default: log("Elemento no reconocido para procesar. No procesado. " + acObjId.ObjectClass.ClassVersion.ToString(),true,true); break; } return; }