/** * @brief Metodo que encapsula como debe formatearse en la salida XML un objeto del tipo dwgLinea. * * @param l Objeto del tipo dwgLinea. * @param xmldoc Objeto de tipo XmlDocument al que se anexará la información de la linea. * * @return Devuelve un tipo XmlElement con la información de la linea formateada para ser añadido en el documento xmldoc. * **/ public static XmlElement linea2xml(dwgLinea l, XmlDocument xmldoc) { XmlElement linea = xmldoc.CreateElement("linea"); XmlAttribute xmlattribute = xmldoc.CreateAttribute("id"); xmlattribute.Value = l.objId.ToString(); linea.Attributes.Append(xmlattribute); xmlattribute = xmldoc.CreateAttribute("p1_id"); xmlattribute.Value = l.p_origen.objId.ToString(); linea.Attributes.Append(xmlattribute); xmlattribute = xmldoc.CreateAttribute("p2_id"); xmlattribute.Value = l.p_final.objId.ToString(); linea.Attributes.Append(xmlattribute); xmlattribute = xmldoc.CreateAttribute("ancho"); xmlattribute.Value = l.LineWeight.ToString(); linea.Attributes.Append(xmlattribute); XmlElement color = rgb2xml(l.color_R, l.color_G, l.color_B, xmldoc); linea.AppendChild(color); XmlElement mapa = xmldoc.CreateElement("mapa_atributos"); linea.AppendChild(mapa); /* xmlattribute = xmldoc.CreateAttribute("parent_id"); xmlattribute.Value = l.parentId.ToString(); linea.Attributes.Append(xmlattribute); */ return linea; }
/** * @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; }