Exemplo n.º 1
0
        /**
         * @brief       Metodo que encapsula como debe formatearse en la salida XML un objeto del tipo dwgPunto.
         *
         * @param   p    Objeto del tipo dwgPunto.
         * @param   xmldoc  Objeto de tipo XmlDocument al que se anexará la información del punto.
         *
         * @return  Devuelve un tipo XmlElement con la información del punto formateada para ser añadido en el documento xmldoc.
         *
         **/
        public static XmlElement punto2xml(dwgPunto p, XmlDocument xmldoc)
        {
            XmlElement   punto        = xmldoc.CreateElement("punto");
            XmlAttribute xmlattribute = xmldoc.CreateAttribute("id");

            xmlattribute.Value = p.objId.ToString();
            punto.Attributes.Append(xmlattribute);

            xmlattribute       = xmldoc.CreateAttribute("coord_x");
            xmlattribute.Value = p.coordenadas.X.ToString();
            punto.Attributes.Append(xmlattribute);

            xmlattribute       = xmldoc.CreateAttribute("coord_y");
            xmlattribute.Value = p.coordenadas.Y.ToString();
            punto.Attributes.Append(xmlattribute);

            XmlElement color = rgb2xml(p.color_R, p.color_G, p.color_B, xmldoc);

            punto.AppendChild(color);

            XmlElement mapa = xmldoc.CreateElement("mapa_atributos");

            punto.AppendChild(mapa);

            return(punto);
        }
Exemplo n.º 2
0
        /**
         * @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;
        }