Echa un vistazo a este script para ver si es lo que estabas buscando.
Nombres predeterminados hasta aquí ( 1 );
Ntablas = N Mesa ();
listatablas = {};
Para ( yo = 1 , i <= Ntablas, i++,
listatablas[i] = Tabla de datos ( i )
);
//mostrar(tablaLista);
destino = {};
conTabla = {};
mismaTablaAlerta = exp. (
Diálogo (
"Elija diferentes tablas de datos para cada selección". ,
Caja de texto ( " " ),
Botón( "DE ACUERDO" )
)
);
noTablaAlerta = exp. (
Diálogo ( "Debe estar abierta una tabla de datos de diseño". , Caja de texto ( " " ), Botón( "DE ACUERDO" ) )
);
noMixtureFacAlert = exp. (
Diálogo ( "La Tabla de Diseño no tiene factores de mezcla". , Caja de texto ( " " ), Botón( "DE ACUERDO" ) )
);
hacerTrabajo = exp. (
//Evaluar la tabla de diseño
numCols = columna N (desTable);
numeroFilas = Fila N (desTable);
numMixFac = 0 ;
XMatriz = [];
mezclarInferior = [];
mezclarSuperior = [];
mezclaSuma = [];
mezclaCon = [];
//mostrar(numColumnas);
//mostrar(númFilas);
Tabla de datos actual (desTable);
Para ( yo = 1 , i <= numCols, i++,
columna = Columna ( i );
prop = columna << obtener propiedad ( "Mezcla" );
// mostrar (accesorio);
Si ( es lista (apoyo),
numMixFac++;
tmp = columna << obtener como matriz ;
//mostrar(tmp);
Matriz X ||= tmp;
//mostrar(MatrizX);
mezclarLower ||= {prop[ 1 ]};
mezclaSuperior ||= {prop[ 2 ]};
mixSuma ||= {prop[ 3 ]};
//mostrar(numMixFac);
);
);
Si ( numMixFac == 0 ,
noMixtureFacAlert,
satCon = j (númFilas, 1 , 0 );
//mostrar(satCon);
//Configurar matriz de restricción simple
numConstraintsOld = 2 * numMixFac + 1 ;
conMatriz = j ( 1 , numMixFac, 1 );
conMatriz = conMatriz |/ Identidad ( numMixFac ) |/ Identidad ( numMixFac );
//mostrar(matrizcon);
mixSumVal = mixSuma[ 1 ];
mixCon = mixCon || {mixSumVal} || mezclarLower || mezclarSuperior;
//mostrar(mixCon);
//Obtener restricciones de desigualdad lineal si hay una tabla de restricciones
Si (conVal == 1 ,
numRestriccionesNuevas = numRestriccionesAnteriores;
Tabla de datos actual (conTabla);
numIneqRow = Fila N (conTabla);
// busca restricciones duplicadas
FullConMat = conMatriz || mezclarCon`;
Para ( yo = 1 , i <= numIneqCon, i++,
estafa = Columna ( i );
prop = estafa << obtener propiedad ( "ConstraintState" );
charprop = Carbonizarse ( Nombre Expr. (accesorio));
Si ( numIneqRow != numMixFac + 1 ,
Tirar ( "Solo se pueden usar restricciones con diseños de mezcla pura". )
);
ineqConMat = con << obtener como matriz ;
//mostrar(ineqConMat);
prueba general = 0 ;
Para ( j = 1 , (j <= númeroRestriccionesAnteriores), j++,
//encontrar el primer elemento distinto de cero
Para ( k = 1 , k <= numMixFac + 1 , k++,
Si ( FullConMat[j, k] != 0 ,
piv = FullConMat[j, k];
ind = k;
k = numMixFac + 2 ;
)
);
prueba = 0 ;
Si ( ineqConMat[ind] != 0 ,
mult = piv / ineqConMat[ind];
nuevaFila = ineqConMat * mult;
nuevaFila = nuevaFila` - FullConMat[j, 0 ];
Para ( k = 1 , k <= numMixFac + 1 , k++,
Si ( Abdominales ( nuevaFila[k] ) > 1e - 10 ,
prueba++
)
);
,
prueba++
);
Si ( prueba == 0 ,
pruebageneral++;
j = numConstraintsOld + 1 ;
);
);
// mostrar (prueba general);
Si ( prueba general == 0 ,
tmp = ineqConMat[ 1 :: numMixFac];
conMatriz = conMatriz |/ tmp`;
numRestriccionesNueva++;
tmp = ineqConMat[numMixFac + 1 :: numMixFac + 1 ];
mixCon = mixCon || tmp;
);
//mostrar(mixCon);
);
,
numConstraintsNew = numConstraintsOld
);
//mostrar(matrizcon);
//Compruebe cómo las filas satisfacen las restricciones
resultMat = conMatrix * XMatrix`;
//mostrar(resultadoMat);
Para ( j = 1 , j <= filas numéricas, j++,
Para ( yo = 1 , i <= númeroRestriccionesNuevas, i++,
Si ( Abdominales ( resultMat[i, j] - mixCon[i] ) < . 00000001 ,
satCon[j, 1 ]++
)
)
);
//mostrar(satCon);
//etiquetar los puntos
Tabla de datos actual (desTable);
pointCol = desTable << Nueva columna ( "Tipo de punto" , Carácter, Nominal );
Para ( yo = 1 , i <= filas numéricas, i++,
Si (
(satCon[i] >= numMixFac),
puntoCol[i] = "Vértice" ;
Estado de fila ( yo ) = Estado de color ( 3 );,
(satCon[i] == numMixFac - 1 ),
puntoCol[i] = "Borde" ;
Estado de fila ( yo ) = Estado de color ( 4 );,
(satCon[i] == 1 ),
puntoCol[i] = "Interior" ;
Estado de fila ( yo ) = Estado de color ( 5 );,
numFace = numMixFac - satCon[i];
puntoCol[i] = Carbonizarse ( numCara ) || "Cara D" ;
Estado de fila ( yo ) = Estado de color ( numMixFac - satCon[i] + 6 );
)
);
ColPunto << etiqueta ( 1 );
//Crear secuencia de comandos de trama ternaria
xCadena = "" ;
Para ( yo = 1 , i <= numCols, i++,
columna = Columna ( i );
prop = columna << obtener propiedad ( "Mezcla" );
Si ( es lista (apoyo),
nombre de columna = Carbonizarse ( Nombre de columna ( i ) );
// mostrar (nombre de columna);
xCadena = xCadena || exp. ( " :" ) || nombre de columna || exp. ( "," );
);
);
len = Largo (xCadena);
xCadena2 = Sust. ( xCadena, 1 , len - 1 );
// mostrar (xString2);
Si ( numMixFac > 2 ,
cadena de cuadros = "" ;
Si ( numMixFac == 3 ,
cadena de cuadros = cadena de cuadros || "informe (objeto) [framebox (" || Carbonizarse ( 1 ) ||
")]< ,
numPlots = (numMixFac * (numMixFac - 1 )) / 2 ;
Para ( yo = 1 , i < númeroParcelas, i++,
cadena de cuadros = cadena de cuadros || "informe (objeto) [framebox (" || Carbonizarse (yo) ||
")]< \!NORTE "
);
cadena de cuadros = cadena de cuadros || "informe (objeto) [framebox (" || Carbonizarse (yo) ||
")]< ;
);
d1 = "obj=Gráfica ternaria(Y(" || xCadena2 || ")); \!NORTE " || cadena de marcos;
d2 = evaluar ( exp. ( Analizar gramaticalmente ( d1 ) ) );
d3 = exp. ( desTable << Nueva propiedad de tabla ( "Trama Ternaria" , un ) );
evaluar ( Sustituto ( Nombre Expr. (d3), exp. ( un ), Nombre Expr. ( d2 ) ) );
);
Si ( NTablas > 1 ,
dlg << Cerrar ventana
);
);
);
initState = 0 ;
Si (
(Ntablas == 0 ), noTableAlert,
(Ntablas == 1 ),
conVal = 0 ;
desTable = tableList[ 1 ];
hacer trabajo;,
dlg = Nueva ventana ( "Identificar puntos de mezcla" ,
cuadro de borde ( Izquierda ( 3 ), abajo( 3 ), Derecha ( 2 ), lados ( 28 ), cima( 3 ),
Cuadro de lista V (
caja de paneles ( "Configuración de la mesa" ,
comprobarObj = casilla de verificación (
{ "Usar tabla de restricciones" },
Si ( estado inicial == 0 ,
caja postal << adjuntar (
pbox2 = caja de paneles ( "Seleccionar tabla de datos de restricción" ,
comboObj3 = Caja combo (lista de tablas)
)
);
caja postal << volver a mostrar ;
,
pbox2 << Eliminar ;
caja postal << volver a mostrar ;
);
Si ( estado inicial == 0 ,
initState = 1 ,
initState = 0
);
)
),
caja = caja de paneles ( "Seleccionar tablas de datos" ,
caja de paneles ( "Seleccionar tabla de datos de diseño" , comboObj1 = Caja combo ( listatablas ) ),
),
Caja de botones ( "DE ACUERDO" ,
desTableNum = comboObj1 << conseguir ;
//mostrar(desTableNum);
desTable = Tabla de datos ( evaluar (numDesTabla));
//mostrar(desTable);
conVal = comprobarObj << conseguir ( 1 );
Si ((conVal == 1 ) & (Ntablas == 1 ),
Tirar ( "Tanto la tabla de diseño como la de restricciones deben estar abiertas". )
);
Si (conVal == 1 ,
conTableNum = comboObj3 << conseguir ;
//mostrar(conTableNum);
conTabla = Tabla de datos ( evaluar (NúmeroTablaCon));
//mostrar(conTabla);
);
Si ((conVal == 1 ) & (desTableNum == conTableNum),
misma alerta de tabla,
Si (conVal == 1 ,
Tabla de datos actual (conTabla);
numIneqCon = columna N (conTabla);
Para ( yo = 1 , i <= numIneqCon, i++,
estafa = Columna ( i );
prop = estafa << obtener propiedad ( "ConstraintState" );
charprop = Carbonizarse ( Nombre Expr. (accesorio));
Si (
(charprop != "ConstraintState (menor que)" ) & (caracteristicas !=
"ConstraintState (mayor que)" ),
Tirar ( "Necesita usar una tabla de restricciones". )
);
);
);
hacer trabajo;
);
)
)
)
)
);