Esempio n. 1
0
        /**
         * @brief   Metodo que encapsula como debe formatearse en la salida XML un objeto del tipo dwgArco.
         *
         * @param   a    Objeto del tipo dwgArco.
         * @param   xmldoc  Objeto de tipo XmlDocument al que se anexará la información del arco.
         * @param   capaId  Objeto del tipo ObjectId con el identificador de la capa a la que pertenece el arco. Esta capa será usada para asociarla a todas las lineas
         *                  que haya al descomponer el arco.
         * @param   dwgf    Objeto del tipo dwgFile para buscar información adicional sobre lineas vinculadas al arco.
         *
         * @return  Devuelve un tipo XmlElement con la información del arco formateada para ser añadido en el documento xmldoc.
         *
         **/
        public static XmlElement arco2xml(dwgArco a, XmlDocument xmldoc, ObjectId capaId, dwgFile dwgf)
        {
            XmlElement arco = xmldoc.CreateElement("arco");
            XmlAttribute xmlattribute = xmldoc.CreateAttribute("id");
            xmlattribute.Value = a.objId.ToString();
            arco.Attributes.Append(xmlattribute);

            xmlattribute = xmldoc.CreateAttribute("radio");
            xmlattribute.Value = a.radio.ToString();
            arco.Attributes.Append(xmlattribute);

            xmlattribute = xmldoc.CreateAttribute("angulo_inicio");
            xmlattribute.Value = a.angulo_inicio.ToString();
            arco.Attributes.Append(xmlattribute);

            xmlattribute = xmldoc.CreateAttribute("angulo_final");
            xmlattribute.Value = a.angulo_final.ToString();
            arco.Attributes.Append(xmlattribute);

            xmlattribute = xmldoc.CreateAttribute("center_point_id");
            xmlattribute.Value = a.punto_centro.ToString();
            arco.Attributes.Append(xmlattribute);

            var puntolinea2 = dwgf.dwgLineas.Values.Where(x => x.capaId.ToString() == capaId.ToString() && x.parentId.ToString() == a.objId.ToString());

            foreach (dwgLinea obj2 in puntolinea2)
            {
                XmlElement linea = exportXml.linea2xml(obj2, xmldoc);
                arco.AppendChild(linea);
            }

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

            return arco;
        }
Esempio 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;
        }