in code/nxt-integration/src/main/kotlin/org/fbme/integration/nxt/refactorings/CompositeCreator.kt [19:75]
fun createComposite(
fbNetwork: FBNetwork,
functionBlockDeclarationList: List<FunctionBlockDeclaration>,
model: SModel,
factory: IEC61499Factory // TODO add user name for fb name in interface
) {
// maybe sort functionBlockDeclarationList somehow
val innerFBs = functionBlockDeclarationList.stream().map(Declaration::name).collect(Collectors.toSet())
val compositeFBNetworkName = java.lang.String.join("_", innerFBs)
val compositeFBIdentifier = StringIdentifier(compositeFBNetworkName)
val compositeFB =
factory.createCompositeFBTypeDeclaration(compositeFBIdentifier) // name in interface (TODO set by user)
model.addRootNode((compositeFB as PlatformElement).node)
val compositeFunctionBlockDeclaration =
factory.createFunctionBlockDeclaration(compositeFBIdentifier) // name in network
compositeFunctionBlockDeclaration.typeReference.setTarget(compositeFB) // connect declaration in network to real fb in interface
setDeclarationCoordinates(
compositeFunctionBlockDeclaration,
functionBlockDeclarationList
) // set network coordinates
fbNetwork.functionBlocks.add(compositeFunctionBlockDeclaration)
val eventConnections: List<FBNetworkConnection> = fbNetwork.eventConnections
val dataConnections: List<FBNetworkConnection> = fbNetwork.dataConnections
val declarationExtractor = DeclarationExtractor(eventConnections, dataConnections, innerFBs)
var minX = functionBlockDeclarationList.stream().mapToInt(FunctionBlockDeclaration::x).min().orElse(0)
for (blockDeclaration in functionBlockDeclarationList) {
val fbType = blockDeclaration.typeReference.getTarget() ?: continue
val fbName = blockDeclaration.name
val shift = createShift(fbName, fbType)
copyEvents(blockDeclaration, fbType, compositeFB, declarationExtractor, fbName, shift)
minX = Math.min(minX, blockDeclaration.x + shift.getX(Type.INPUT))
}
// setting new associations
val parameterDeclarationCopyMap = declarationExtractor.parameterDeclarationCopyMap
setEventAssociations(compositeFB.inputEvents, parameterDeclarationCopyMap)
setEventAssociations(compositeFB.outputEvents, parameterDeclarationCopyMap)
rehangExternalConnections(
declarationExtractor.externalConnectionsInputMap,
compositeFunctionBlockDeclaration,
Type.INPUT
)
rehangExternalConnections(
declarationExtractor.externalConnectionsOutputMap,
compositeFunctionBlockDeclaration,
Type.OUTPUT
)
// TODO think about optimal coordinate shifts
// int decX = minX > 500 ? minX - 500 : 0;
val decX = minX
val decY = functionBlockDeclarationList.stream().mapToInt(FunctionBlockDeclaration::y).min().orElse(0)
adjustNetworkCoordinates(declarationExtractor, compositeFB, functionBlockDeclarationList, fbNetwork, decX, decY)
// add connections to external input/output based on existed external connection from inner blocks
createInnerIOConnections(compositeFB, declarationExtractor.declarationPortPathMap, factory, decX, decY)
}