使用graph for Scala将具有自定义节点和边的图形转换为点格式
我创建了一个带有自定义节点和边的简单图形,如下所示:使用graph for Scala将具有自定义节点和边的图形转换为点格式,scala,graph,Scala,Graph,我创建了一个带有自定义节点和边的简单图形,如下所示: case class Agent(val name: String) { override def toString = name // without Airport-prefix } class Ask[N](nodes: Product, val message: String, val msgNo: String) extends DiEdge[N](nodes) with ExtendedKey[N]
case class Agent(val name: String) {
override def toString = name // without Airport-prefix
}
class Ask[N](nodes: Product, val message: String, val msgNo: String)
extends DiEdge[N](nodes)
with ExtendedKey[N]
with EdgeCopy[Ask]
with OuterEdge[N,Ask] {
def mesage = message
def keyAttributes = Seq(msgNo)
override def copy[NN](newNodes: Product) =
new Ask[NN](newNodes,message, msgNo)
}
object Ask {
def apply(src: Agent, dst: Agent, message:String, msgNo: String) =
new Ask[Agent](NodeProduct(src, dst), message, msgNo)
def unapply(e: Ask[Agent]) = Some(e)
}
implicit class AskAssoc[A <: Agent](val e: LDiEdge[A]) {
@inline def ## (message: String, msgNo: String) =
new Ask[A](e.nodes, message,msgNo) //with OuterEdge[A,Ask]
}
val (ham, ny) = (Agent("HAM"), Agent("JFK")) // two nodes
val g = Graph[Agent,Ask](((ham ~+> ny) ("Ask") ) ## ("messgae", "kfree"))
val root = DotRootGraph(directed = true,
id = Some("Wikipedia_Example"))
但我无法绕过边缘转换器。我认为#EdgeT不是从自定义图中提取innerEdge的正确方法。你能帮我做这个吗
def edgeTransformer(innerEdge: Graph[Agent,Ask]#EdgeT):
Option[(DotGraph,DotEdgeStmt)] = innerEdge.edge match {
case LDiEdge(source, target,label) => source match {
case label: Agent =>
Some((root,
DotEdgeStmt(source.toString,
target.toString,
if (label.nonEmpty) List(DotAttr("label", label.toString))
else Nil)))
}}
我找到解决办法了
边缘转换器需要匹配Ask,而不是LDiEdge。要做到这一点,首先要实现Ask,就像
def unapply[N](e:Ask[N]):选项[(N,N,String,String)]=Some((e._1,e._2,e.message,e.msgNo))
然后你可以和这个图案搭配
案例询问(源、目标、消息、msgNo)=>
这就是我所缺少的 我找到了解决办法
边缘转换器需要匹配Ask,而不是LDiEdge。要做到这一点,首先要实现Ask,就像
def unapply[N](e:Ask[N]):选项[(N,N,String,String)]=Some((e._1,e._2,e.message,e.msgNo))
然后你可以和这个图案搭配
案例询问(源、目标、消息、msgNo)=>
这就是我所缺少的