使用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)=>

这就是我所缺少的