Changeset 1949 for branches


Ignore:
Timestamp:
Nov 16, 2010, 3:25:40 PM (14 years ago)
Author:
gah
Message:

add unit cell to molvisviewer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/blt4/gui/scripts/molvisviewer.tcl

    r1948 r1949  
    135135    private method Representation {option {model "all"} }
    136136    private method CartoonTrace {option {model "all"}}
     137    private method ComputeParallelPipedVertices { dataobj }
    137138    private method Cell {option}
    138139    private method Rock {option}
    139 
    140140}
    141141
     
    506506        "Set cartoon representation of bonds (sticks)."
    507507
    508     checkbutton $inner.cell -text "Cell" \
     508    checkbutton $inner.cell -text "Parallelpiped" \
    509509        -command [itcl::code $this Cell toggle] \
    510510        -font "Arial 9 bold"
     
    873873            set _active($model) $dataobj
    874874        }
    875         set vectors [$dataobj get components.parallelpiped.vectors]
    876         if { $vectors != "" } {
    877             set rows [ComputeParellelPiped]
    878             regsub -all {,} $vectors { } vectors
    879             set rows {}
    880             foreach { x y z } $vectors {
    881                 lappend rows "    \[ $x, $y, $z \]"
    882             }
    883             set rows [join $rows ",\\\n"]
    884             SendCmd "raw -defer {verts = \[$rows\]\n}"
     875        set vector [$dataobj get components.parallelpiped.vector]
     876        if { $vector != "" } {
     877            set vertices [ComputeParallelPipedVertices $dataobj]
     878    puts stderr "vertices=$vertices"
     879            SendCmd "raw -defer {verts = \[$vertices\]\n}"
    885880            SendCmd "raw -defer {run \$PYMOL_PATH/rappture/box.py\n}"
    886881            SendCmd "raw -defer {draw_box(verts)\n}"
     
    20472042}
    20482043
    2049 itcl::body Rappture::MolvisViewer::ComputeParallelPiped { dataobj } {
     2044itcl::body Rappture::MolvisViewer::ComputeParallelPipedVertices { dataobj } {
     2045    # Create a vector for every 3D point
     2046    blt::vector p0(3) p1(3) p2(3) p3(3) p4(3) p5(3) p6(3) p7(3)
     2047
     2048    set count 0
     2049    set parent [$dataobj element -as object "components.parallelpiped"]
     2050 puts stderr "parent=$parent"
     2051    foreach child [$parent children] {
     2052 puts stderr "child=$child"
     2053        if { ![string match "vector*" $child] } {
     2054            continue
     2055        }
     2056        incr count
     2057        set vector  [$parent get $child]
     2058        regexp -all {,} $vector {} vector
     2059        p$count set $vector
     2060    }
     2061    if { $count < 1 || $count > 3 } {
     2062        error "bad number of vectors supplied to paralledpiped"
     2063    }
     2064
    20502065    set scale [$dataobj get components.parallelpiped.scale]
    20512066    set n [llength $scale]
     2067    set sx 1.0
     2068    set sy 1.0
     2069    set sz 1.0
    20522070    if { $n == 1 } {
    20532071        set sx [lindex $scale 0]
    20542072        set sy [lindex $scale 0]
    20552073        set sz [lindex $scale 0]
    2056     } else { $n == 2 } {
     2074    } elseif { $n == 2 } {
    20572075        set sx [lindex $scale 0]
    20582076        set sy [lindex $scale 1]
    2059         set sz 1.0
    2060     } else { $n == 3 } {
     2077    } elseif { $n == 3 } {
    20612078        set sx [lindex $scale 0]
    20622079        set sy [lindex $scale 1]
    20632080        set sz [lindex $scale 2]
    20642081    }
    2065     set scale [$dataobj get components.parallelpiped.origin]
     2082    set origin [$dataobj get components.parallelpiped.origin]
    20662083    set n [llength $origin]
    2067     set x0 0.0
    2068     set y0 0.0
    2069     set z0 0.0
     2084    p0 set { 0.0 0.0 0.0 }
    20702085    if { $n == 1 } {
    2071         set x0 [lindex $origin 0]
    2072     } else { $n == 2 } {
    2073         set x0 [lindex $scale 0]
    2074         set y0 [lindex $scale 1]
    2075     } else { $n == 3 } {
    2076         set x0 [lindex $scale 0]
    2077         set y0 [lindex $scale 1]
    2078         set z0 [lindex $scale 2]
    2079     }
    2080     set vectors [$dataobj get components.parallelpiped.vectors]
    2081     regexp -all {,} $vectors {} vectors
    2082     regexp -all {;} $vectors {\n} vectors
    2083    
    2084 # -----------------------------------------------------------------------------
    2085 # vscale --
    2086 #
    2087 # Takes: List a and list b
    2088 # Returns: A new list with the components of a scaled by the components of b
    2089 # -----------------------------------------------------------------------------
    2090 
    2091 proc vscale {a b} {
    2092    set nl []
    2093    lappend nl [expr [lindex $a 0]*[lindex $b 0]]
    2094    lappend nl [expr [lindex $a 1]*[lindex $b 0]]
    2095    lappend nl [expr [lindex $a 2]*[lindex $b 0]]
    2096    return $nl
    2097 }
    2098 
    2099    set v1 [blt::vector create v1]
    2100    $v1 length 3
    2101    $v1 set [lindex $vectors 1]
    2102    $v1 expr v1 * $
    2103    # Scale lattice vectors
    2104    set vec1 [vscale $uc(lv1) $uc(alatt)]
    2105    set vec2 [vscale $uc(lv2) $uc(alatt)]
    2106    set vec3 [vscale $uc(lv3) $uc(alatt)]
    2107    # Scale lattice vectors
    2108    set vec1 [vscale $uc(lv1) $uc(alatt)]
    2109    set vec2 [vscale $uc(lv2) $uc(alatt)]
    2110    set vec3 [vscale $uc(lv3) $uc(alatt)]
    2111 
    2112    # Build list of unit cell vertices
    2113    set vlist []
    2114    lappend vlist [list 0.0 0.0 0.0]               ;# O
    2115    lappend vlist $vec1                            ;# O+a
    2116    lappend vlist $vec2                            ;# O+b
    2117    lappend vlist $vec3                            ;# O+c
    2118    lappend vlist [vsum [lindex $vlist 1] $vec2]   ;# O+a+b
    2119    lappend vlist [vsum [lindex $vlist 4] $vec3]   ;# O+a+b+c
    2120    lappend vlist [vsum [lindex $vlist 2] $vec3]   ;# O+b+c
    2121    lappend vlist [vsum [lindex $vlist 1] $vec3]   ;# O+a+c
    2122 }
     2086        set p0(0) [lindex $origin 0]
     2087    } elseif { $n == 2 } {
     2088        set p0(0) [lindex $origin 0]
     2089        set p0(1) [lindex $origin 1]
     2090    } elseif { $n == 3 } {
     2091        set p0(0) [lindex $origin 0]
     2092        set p0(1) [lindex $origin 1]
     2093        set p0(2) [lindex $origin 2]
     2094    }
     2095    p4 expr {p2 + p1}
     2096    p5 expr {p4 + p3}
     2097    p6 expr {p2 + p3}
     2098    p7 expr {p1 + p3}
     2099
     2100    # Generate vertices as a string for PyMOL
     2101    set s ""
     2102    blt::vector x
     2103    foreach vertex { 0 1 0 2 0 3 1 4 2 4 2 6 1 7 3 7 5 7 4 5 3 6 5 } {
     2104        x expr "p$vertex * $sx"
     2105        set values [x values]
     2106        append s "\[ [join $values {, }] \], \\\n"
     2107    }
     2108    x expr "p6 * $sx"
     2109    set values [x values]
     2110    append s "\[ [join $values {, }] \]  \\\n"
     2111    blt::vector destroy p0 p1 p2 p3 p4 p5 p6 p7 x
     2112    return $s
     2113}
Note: See TracChangeset for help on using the changeset viewer.