| 1 | /* mode: -*- c++ -*- */ |
|---|
| 2 | -------------------- Especificacion TCL ------------------------------- |
|---|
| 3 | |
|---|
| 4 | tol::tableset create tablename SetReference |
|---|
| 5 | |
|---|
| 6 | tol::tableset destroy tablename |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | tablename info |
|---|
| 10 | |
|---|
| 11 | name |
|---|
| 12 | |
|---|
| 13 | nombre de la referencia del conjunto |
|---|
| 14 | |
|---|
| 15 | datarows |
|---|
| 16 | |
|---|
| 17 | numero de filas (subconjuntos) incluyendo conjuntos vacios. La |
|---|
| 18 | existencia de un conjunto vacio == el conjunto no es graficable, a |
|---|
| 19 | menos que se pueda escojer como eje X al conjunto de indices |
|---|
| 20 | [0..row-1], pero esto ya se trataria en tcl. columns: numero de |
|---|
| 21 | columnas, correspondiente al cardinal del subconjunto de mayor |
|---|
| 22 | cantidad de elementos. |
|---|
| 23 | |
|---|
| 24 | |
|---|
| 25 | rowsnames |
|---|
| 26 | |
|---|
| 27 | lista con los nombres de los elementos del conjunto. |
|---|
| 28 | |
|---|
| 29 | header |
|---|
| 30 | |
|---|
| 31 | como se determino el header de las columnas, puede ser : struct| |
|---|
| 32 | row | generic. En caso de retornar firstRow tambien retorna |
|---|
| 33 | la cantidad de columnas explicitas(ya me explicare mejor). |
|---|
| 34 | |
|---|
| 35 | |
|---|
| 36 | columns |
|---|
| 37 | |
|---|
| 38 | Para cada columna retoran una lista con su informacion, que |
|---|
| 39 | incluye: |
|---|
| 40 | |
|---|
| 41 | name |
|---|
| 42 | nombre de la columna |
|---|
| 43 | |
|---|
| 44 | type |
|---|
| 45 | |
|---|
| 46 | tipo de datos (inferido) de la columna. Hay que definir, |
|---|
| 47 | por ahora tenemos general|real|date. Si tipo es real entonces |
|---|
| 48 | contendra informacion adicional sobre reales extendidos como ? o |
|---|
| 49 | INF: {unknown yes|no INF yes|no}. |
|---|
| 50 | |
|---|
| 51 | eje, {type real unknown yes INF no} |
|---|
| 52 | |
|---|
| 53 | grpname data get i j |
|---|
| 54 | |
|---|
| 55 | retorna el elemento que esta en la fila i column j |
|---|
| 56 | |
|---|
| 57 | grpname data apply all script |
|---|
| 58 | |
|---|
| 59 | - ejecuta 'script' para cada elemento de la tabla |
|---|
| 60 | - concatena al script 'i j value' (fila, columna y valor) |
|---|
| 61 | |
|---|
| 62 | grpname data apply row idx script |
|---|
| 63 | |
|---|
| 64 | - ejecuta 'script' para cada elemento de la fila 'idx' |
|---|
| 65 | - concatena al script 'j value' (columna valor) |
|---|
| 66 | |
|---|
| 67 | grpname data apply column idx script |
|---|
| 68 | |
|---|
| 69 | - ejecuta 'script' para cada elemento de la columna 'idx' |
|---|
| 70 | - concatena al script 'i value' (fila valor) |
|---|
| 71 | |
|---|
| 72 | grpname data column idx |
|---|
| 73 | |
|---|
| 74 | retorna los datos de la column idx si. Si el tipo de la columna no |
|---|
| 75 | es real retorna una lista con todos sus valores. Si el tipo de la |
|---|
| 76 | columna es real retorna una lista que contiene vectores blt y |
|---|
| 77 | posiblemente valores desconocidos, ej, {Y1 Y2 {} {} Y3 *INF* |
|---|
| 78 | |
|---|
| 79 | |
|---|
| 80 | grpname data names |
|---|
| 81 | |
|---|
| 82 | retorna una lista con los nombres de los subconjuntos que forman el |
|---|
| 83 | set. Que hacemos cuando algun 'subset' no sea set?, cuando no sea |
|---|
| 84 | sea estamos asumiendo que es un conjunto de un elemento, asi que |
|---|
| 85 | siempre tomaremos el name del syntaxobject. Aunque, por que no |
|---|
| 86 | retornar esta informacion en el subcomando 'info rows' |
|---|
| 87 | |
|---|
| 88 | ------------------- Especificacion implementacion C++ ----------------- |
|---|
| 89 | |
|---|
| 90 | JAVIER !!!! vamos a serpara la especificacion del comando en TCL de |
|---|
| 91 | la especificacion de la implementacion en C. |
|---|
| 92 | |
|---|
| 93 | |
|---|
| 94 | |
|---|
| 95 | // Estructura de la información que se puede guardar: |
|---|
| 96 | struct Tol_SetData { |
|---|
| 97 | int rows |
|---|
| 98 | int cols |
|---|
| 99 | header (de donde se ha obtenido) |
|---|
| 100 | struct Tol_ColumnData { |
|---|
| 101 | char *name |
|---|
| 102 | // lista de datos o |
|---|
| 103 | // lista de vectores Blt |
|---|
| 104 | (definir esto en C) |
|---|
| 105 | int type |
|---|
| 106 | } |
|---|
| 107 | } |
|---|
| 108 | |
|---|
| 109 | // ¿Como guardo los datos? |
|---|
| 110 | // A) como listas siempre y si me lo piden como vectores lo transformo |
|---|
| 111 | // B) como listas y siempre que pueda como vectores (el saber si puedo |
|---|
| 112 | // o no lo se al final de recorrer el conjunto |
|---|
| 113 | |
|---|
| 114 | } |
|---|
| 115 | |
|---|
| 116 | |
|---|
| 117 | /* |
|---|
| 118 | El numero de filas lo obtengo del set directamente. (Si los nombres |
|---|
| 119 | de las columnas se obtienen del primer subconjunto,¿le quitamos uno |
|---|
| 120 | al numero de filas? SI |
|---|
| 121 | |
|---|
| 122 | Si tiene estructura el numero de filas, columnas y el tipo me lo da la |
|---|
| 123 | propia estructura, no tengo apenas problemas. |
|---|
| 124 | |
|---|
| 125 | |
|---|
| 126 | El número de columnas no me lo da el primer subconjunto. --> Es un |
|---|
| 127 | problema para ir añadiendo a la estructura Tol_ColumnData, p.ejem: |
|---|
| 128 | |
|---|
| 129 | A B C |
|---|
| 130 | 3 4 5 |
|---|
| 131 | 4 3 |
|---|
| 132 | 6 2 1 5 |
|---|
| 133 | 1 3 3 |
|---|
| 134 | |
|---|
| 135 | --> <-- |
|---|
| 136 | Si en TOL puedo pedir el numero de elementos que tiene el subconjunto |
|---|
| 137 | que mas elementos tiene (valga la redundancia) seria genial. NO SE PUEDE |
|---|
| 138 | |
|---|
| 139 | --> Ademas para este conjunto, ¿el nombre de las columnas seria de |
|---|
| 140 | firstRow: ['A', 'B', 'C', ''] o mixto entre generico y firstRow |
|---|
| 141 | ['A', 'B', 'C', 'Col4'] ? |
|---|
| 142 | MIXTO, NO PUEDE HABER UN NOMBRE DE COLUMNA VACIO |
|---|
| 143 | |
|---|
| 144 | |
|---|
| 145 | Algoritmo para recoger datos: |
|---|
| 146 | |
|---|
| 147 | // Cuando se trate cada subConjunto hay que tener en cuenta |
|---|
| 148 | // que se puede aumentar el número de columnas, en cuyo caso |
|---|
| 149 | // hay que actualizar la información que se tenga hasta entonces |
|---|
| 150 | // con vacios (para datos) y con nombres genericos (para nombres |
|---|
| 151 | // de columna) |
|---|
| 152 | |
|---|
| 153 | cols // las columnas que tiene el conjunto |
|---|
| 154 | |
|---|
| 155 | proc Main { } { |
|---|
| 156 | set structured 1 |
|---|
| 157 | set rowData -1 |
|---|
| 158 | set cols 0 |
|---|
| 159 | set rows [setRef->subItems] |
|---|
| 160 | |
|---|
| 161 | |
|---|
| 162 | set sub1Set (Primer subcjto de setRef) |
|---|
| 163 | set structure [sub1Set->structure] |
|---|
| 164 | if sub1Set->type == "Text" { |
|---|
| 165 | GetSubSetInfoAsLabel sub1Set &cols |
|---|
| 166 | incr rows -1 |
|---|
| 167 | set rowData 0 |
|---|
| 168 | } else { |
|---|
| 169 | set rowData 0 |
|---|
| 170 | GetSubSetInfoAsData sub1Set &rowData &cols |
|---|
| 171 | } |
|---|
| 172 | |
|---|
| 173 | |
|---|
| 174 | foreach subSet (menos el primero) setRef { |
|---|
| 175 | set structured [expr structured && (subSet->structure == structure)] |
|---|
| 176 | GetSubSetInfoAsData subSet &rowData &cols |
|---|
| 177 | } |
|---|
| 178 | } |
|---|
| 179 | if structured { |
|---|
| 180 | if (He cogido inf de header) { |
|---|
| 181 | meterla como datos |
|---|
| 182 | } |
|---|
| 183 | } |
|---|
| 184 | elseif (No he cogido inf de header) { |
|---|
| 185 | Meter nombres genericos |
|---|
| 186 | } |
|---|
| 187 | } |
|---|
| 188 | |
|---|
| 189 | |
|---|
| 190 | proc GetSubSetInfoAsData (subSet &rowData &cols) { |
|---|
| 191 | set col 0 |
|---|
| 192 | foreach it subSet { |
|---|
| 193 | if (col > cols ) { |
|---|
| 194 | set cols col |
|---|
| 195 | UpdateInfoRowsAnteriores |
|---|
| 196 | } |
|---|
| 197 | if (it->Type == "Real") { |
|---|
| 198 | if (it->Data == '?') { |
|---|
| 199 | SetColType col Real? |
|---|
| 200 | } elseif (it->Data == Inf) { |
|---|
| 201 | SetColType col RealInf |
|---|
| 202 | } else { |
|---|
| 203 | SetColType col Real |
|---|
| 204 | } |
|---|
| 205 | } else { |
|---|
| 206 | SetColType col it->Type |
|---|
| 207 | } |
|---|
| 208 | SetColData col rowData it->Data |
|---|
| 209 | incr col |
|---|
| 210 | } |
|---|
| 211 | for (i=col; col < cols; i++) { |
|---|
| 212 | SetColData i rowData "" |
|---|
| 213 | } |
|---|
| 214 | incr rowData |
|---|
| 215 | } |
|---|
| 216 | |
|---|
| 217 | |
|---|
| 218 | proc UpdateInfoRowsAnteriores { |
|---|
| 219 | //Para cada columna que ya exista ir introduciendo vacios hasta llegar |
|---|
| 220 | //al numero de fila actual. |
|---|
| 221 | } |
|---|
| 222 | |
|---|
| 223 | |
|---|
| 224 | proc GetSubSetInfoAsLabel (subSet &cols) { |
|---|
| 225 | set col 0 |
|---|
| 226 | foreach it subSet { |
|---|
| 227 | SetColName col it |
|---|
| 228 | incr col |
|---|
| 229 | } |
|---|
| 230 | set cols col |
|---|
| 231 | } |
|---|
| 232 | |
|---|
| 233 | |
|---|
| 234 | |
|---|
| 235 | SetColData col row data |
|---|
| 236 | SetColType col type |
|---|
| 237 | SetColName col name |
|---|