日志 - 日历
2008 8.21 Thu
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<> 2008 - 8 <>
搜索BLOG文章

看看你的文章有没有被百度收入

博客基本信息
用户名: lostCity
等级: 学士
在线时间: 6131 分钟
日志总数: 468
评论数量: 363
访问次数: 469899
建立时间: 2005-12-24
最新访问
100076983

XML RSS 2.0 WAP
我的日志
[TCL]文本方式的消息流程2008-04-04
# 所有代码如下
# 使用调试代码生成消息流程图如下:
#      0x01            0x02            0x03            0x04
#       |msg01yryryryryr|
#    01 |-------------->|
#       |               |     msg02     |
#    02 |               |-------------->|
#       |               |               |     msg04     |
#    03 |               |               |-------------->|
#       |               |               |  msg05sdgfdsg |
#    04 |               |               |<--------------|
#       |               |     msg06     |               |
#    05 |               |<--------------|               |
#       |     msg07     |               |               |
#    06 |<--------------|               |               |
#       |               |               |  msg08eterte  |
#    07 |<--------------|---------------|---------------|
#       |               |               |     msg09     |
#    08 |               |<--------------|---------------|
#       |               |               |     msg10     |
#    09 |               |               |<--------------|
#       |               |  msg11dsgdsg  |               |
#    10 |---------------|-------------->|               |
#       |               |               |     msg12     |
#    11 |---------------|---------------|-------------->|
#       |               |               |     msg13     |
#    12 |               |---------------|-------------->|
#       |               |               |     msg14     |
#    13 |               |               |-------------->|
#       |               |     msg15     |               |
#    14 |               |<--------------|               |
#       |               |     msg16     |               |
#    15 |<--------------|---------------|               |
#       |  msg17sgsgdgd |               |               |
#    16 |<--------------|               |               |


namespace eval MsgTextFlow {
#                moudle1            moudle2            moudle3  
#    head msgid sp1 |     msgname      |                  |
#                   |----------------->|                  |
#    -1--|-2---|-3--|-------4----------|
#    -----5-----|-6-|-6|-----7-----|-8-|-8-|               
#                   |--9-|--10--|--9---|
    set iFlow(L01) 4
    set iFlow(L02) 2
    set iFlow(L03) 2
    set iFlow(L04) 16
    set iFlow(FlowCT) ""
    set iFlow(FlowMD) ""
    set iFlow(SpLine) [string repeat " " 200]
    set iFlow(HLine)   "|"
    set iFlow(HLen)   [string length $iFlow(HLine)] 
}

proc MsgTextFlow::AddMsgToFlow {moudle1 moudle2 msgname {msgid ""}} {
    variable iFlow

    # 加入模块
    if {[lsearch $iFlow(FlowMD) $moudle1]==-1} {
        lappend iFlow(FlowMD) $moudle1
    }   
    if {[lsearch $iFlow(FlowMD) $moudle2]==-1} {
        lappend iFlow(FlowMD) $moudle2
    }  
    set Flowct [FormFlowMsgName $moudle1 $moudle2 $msgname]
    lappend iFlow(FlowCT) $Flowct
    set Flowct [FormFlowMsgDirec $moudle1 $moudle2 $msgid]
    lappend iFlow(FlowCT) $Flowct
    return $iFlow(FlowCT)
}

proc MsgTextFlow::FormFlowMsgDirec {moudle1 moudle2 {msgid ""}} {
    variable iFlow
    
    set tmptext ""
    set mdulist $iFlow(FlowMD)
    set mdulen  [llength $mdulist]
    set index1  [lsearch $mdulist $moudle1]  
    set index2  [lsearch $mdulist $moudle2]
    # 消息名称放置在后面模块位置
    set maxindex $index2
    set minindex $index1
    set msgdirec ">"
    if {$index1>$index2} {
        set maxindex $index1
        set minindex $index2
        set msgdirec "<"
    } 
    if {$msgid!=""} {
        set msgid [format [join "%0$iFlow(L02) d" ""] $msgid]
    }
    set start $iFlow(L01)
    set tmptext [ReplaceTextLine $tmptext $start $msgid] 

    set basestart [expr $iFlow(L01)+$iFlow(L02)+$iFlow(L03)-1]
    for {set i 0} {$i<$mdulen} {incr i} {
        set start [expr $basestart+$iFlow(L04)*$i]
        set tmptext [ReplaceTextLine $tmptext $start $iFlow(HLine)] 
        # --
        if {$i<$maxindex&&$i>=$minindex} {
            set start [expr $basestart+$iFlow(HLen)+$iFlow(L04)*$i]
            set str   [string repeat "-" $iFlow(L04)]
            set tmptext [ReplaceTextLine $tmptext $start $str] 
        }
        # fangxiang
        if {$i==[expr $maxindex-1]&&$index2>$index1} {
            set start [expr $basestart+$iFlow(L04)*($i+1)-1]
            set tmptext [ReplaceTextLine $tmptext $start $msgdirec] 
        } 
        if {$i==$minindex&&$index2<$index1} {
            set start [expr $basestart+$iFlow(L04)*($i)+1]
            set tmptext [ReplaceTextLine $tmptext $start $msgdirec] 
        } 
    }
    return $tmptext
}

proc MsgTextFlow::FormFlowMsgName {moudle1 moudle2 msgname} {
    variable iFlow
    
    set tmptext ""
    set mdulist $iFlow(FlowMD)
    set mdulen  [llength $mdulist]
    set index1  [lsearch $mdulist $moudle1]  
    set index2  [lsearch $mdulist $moudle2]
    # 消息名称放置在后面模块位置
    set maxindex $index2
    if {$index1>$index2} {
        set maxindex $index1
    } 
    set basestart [expr $iFlow(L01)+$iFlow(L02)+$iFlow(L03)-1]
    for {set i 0} {$i<$mdulen} {incr i} {
        set start [expr $basestart+$iFlow(L04)*$i]
        set tmptext [ReplaceTextLine $tmptext $start $iFlow(HLine)] 
        if {$i==[expr $maxindex-1]} {
            set msglen [string length $msgname]
            set start [expr $basestart+$iFlow(HLen)+$iFlow(L04)*$i+($iFlow(L04)-$msglen)/2]
            set tmptext [ReplaceTextLine $tmptext $start $msgname] 
        } 
    }
    return $tmptext
}

proc MsgTextFlow::FormFlowMoudle {} {
    variable iFlow
 
    set tmptext ""
    set mdulist $iFlow(FlowMD)
    set mdulen [llength $mdulist]
    for {set i 0} {$i<$mdulen} {incr i} {
        set mdu     [lindex $mdulist $i]
        set L06     [string length $mdu]
        set start   [expr $iFlow(L01)+$iFlow(L02)+$iFlow(L03)+$iFlow(HLen)+$iFlow(L04)*$i-$L06/2-1]
        set tmptext [ReplaceTextLine $tmptext $start $mdu]   
    }
    return $tmptext
}

proc MsgTextFlow::ReplaceTextLine {textline start newtext} {
    variable iFlow
    
    set newlen [string length $newtext]
    set tlen   [expr $start+$newlen] 
    set textline [format [join "%-$tlen s" ""] $textline]
    set textline [string replace $textline $start [expr $tlen-1] $newtext]
    set textline [string trimright $textline]
#    if { [info level -1]=="FormFlowMsgDirec 0x02 0x03 2"} {
#        puts [info level 0]
#        puts "=$textline="
#    }   
    return $textline
}

proc MsgTextFlow::PrintTextFlow {} {
    variable iFlow
    
    set title [MsgTextFlow::FormFlowMoudle]
    set Flowct [join $iFlow(FlowCT) "\n"]
    set Flowct "$title\n$Flowct"
    #puts $Flowct
    return $Flowct
}

# 调试调用代码
# -------------------------------------------------------
MsgTextFlow::AddMsgToFlow 0x01 0x02 msg01yryryryryr 1
MsgTextFlow::AddMsgToFlow 0x02 0x03 msg02 2
MsgTextFlow::AddMsgToFlow 0x03 0x04 msg04 3
MsgTextFlow::AddMsgToFlow 0x04 0x03 msg05sdgfdsg 4
MsgTextFlow::AddMsgToFlow 0x03 0x02 msg06 5
MsgTextFlow::AddMsgToFlow 0x02 0x01 msg07 6
MsgTextFlow::AddMsgToFlow 0x04 0x01 msg08eterte 7
MsgTextFlow::AddMsgToFlow 0x04 0x02 msg09 8
MsgTextFlow::AddMsgToFlow 0x04 0x03 msg10 9
MsgTextFlow::AddMsgToFlow 0x01 0x03 msg11dsgdsg 10
MsgTextFlow::AddMsgToFlow 0x01 0x04 msg12 11
MsgTextFlow::AddMsgToFlow 0x02 0x04 msg13 12
MsgTextFlow::AddMsgToFlow 0x03 0x04 msg14 13
MsgTextFlow::AddMsgToFlow 0x03 0x02 msg15 14
MsgTextFlow::AddMsgToFlow 0x03 0x01 msg16 15
MsgTextFlow::AddMsgToFlow 0x02 0x01 msg17sgsgdgd 16
MsgTextFlow::PrintTextFlow
# -------------------------------------------------------


原创文章如转载,请注明:转载自lostCity [ http://lostCity.blog.zj.com/ ]
本文链接地址:http://lostCity.blog.zj.com/blog/d-198004.html

上一篇:不眠夜
下一篇:无
TAG: 流程图
相关文章
文章评论0条回复
给文章评分
评分: -5 -3 -1 - +1 +3 +5
我来说两句
认证码*   看不清,就点我! 输入四位字母或数字
(您还没有登录,登录发表)
粗体 斜体 下划线 插入url链接 飞行字 移动字