Esta semana me he encontrado con un problema común que voy a simplificar para explicarlo aquí de manera más sencilla. Suponemos que tenemos una línea sobre la que queremos poner puntos, esos puntos serán el centro de una serie de círculos. Algo así:
Este es el código correspondiente para generar el círculo:
node User.Objects.circle01 Bentley.GC.Features.Circle
{
Technique = 'ByCenterRadius';
CenterPoint = {point02, point03, point04, point05};
Radius = 3;
Support = baseCS.XYPlane;
GraphLocation = <auto> {1080.0, 40.0};
}
El problema es que si los puntos los dibujamos manualmente luego debemos seleccionarlos uno a uno para hacer los círculos de manera replicable. Esto esta bien cuando hay pocos puntos, o cuando se saben cuantos se van a hacer desde el principio.
Si quiero añadir más puntos ahora debería añadirlos manualmente, y luego editar la lista anterior para que el nodo círculo lo tenga en cuenta. De nuevo, esto está bien si tengo que agregar pocos puntos.
Hay otra manera más “inteligente” y rápida de hacerlo: Seleccionar los puntos cuya dependencia cuelga de la línea o lo que es lo mismo seleccionar los sucesores de la recta.
Esto se hace accediendo a la propiedad ‘GetSuccessors’ que tienen todos los nodos de la siguiente manera:
line01.GetSuccessors(false)
El resultado será este:
{circle01, point05, point04, point03, point02}
El problema es que el círculo que estamos creando es también un sucesor de nuestra línea, por lo que debemos deshacernos de el y sacarlo de la lista para que el nodo círculo pueda funcionar, ya que busca puntos sobre los que hacer las circunferencias. La funcion ‘RemoveAt’ que es la que usaremos para borrar el elemento de la lista necesita saber el índice del elemento que queremos quitar, por tanto usaremos la funcion ‘IndexOf’.
Por pasos, con la funcion ‘indexOf’ obtenemos el índice del círculo en la lista:
IndexOf(lista, elemento)
IndexOf(line01.GetSuccessors(false),circle01)
En este caso el índice que arroja es ‘0’.
Ahora usamos la funcion ‘RemoveAt’ para eliminar el elemento de la lista, para que sea dinámico, en lugar de usar el 0, se usará la funcion ‘IndexOf’ completa:
RemoveAt(lista, índice)
RemoveAt(line01.GetSuccessors(false),IndexOf(line01.GetSuccessors(false),circle01))
El resultado es, por tanto:
{point05, point04, point03, point02}
El nodo quedará definido por:
node User.Objects.circle01 Bentley.GC.Features.Circle
{
Technique = 'ByCenterRadius';
CenterPoint = RemoveAt(line01.GetSuccessors(false),IndexOf(line01.GetSuccessors(false),circle01));
Radius = 3;
Support = baseCS.XYPlane;
GraphLocation = <auto> {1080.0, 40.0};
}
from [GC] Seleccionar todos los elementos que dependen de un nodo