Subversion Repositories wimsdev

Rev

Rev 8418 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

!if $wims_read_parm!=slib_header
 !goto proc
!endif

slib_author=Bernadette, Perrin-Riou
slib_example=[0,0,0;0,0,2;0,0,3;1,1,2]\
[0,0,0;0,0,1;0,0,2;0,1,2],,,[blue,blue],[0.01,0.01]\
[0,0,0;0,1,0;0,1,0;2,0,0],300,300,[red,red]\
[0,0,0,2,3,3;1,3,1,1,1,1;1,3,3,3,1,1],300,300,[blue,green],,p\
[0,0,0;0,0,1;0,0,2;1,0,2;2,0,2;0,1,2;0,1,3],300,300,[blue,green]\
[0,0,0;0,0,1;0,0,2;1,0,2;2,0,2],300,300,[blue,green]\
[0,0,0;0,1,0;0,1,1;1,1,0;1,1,1;1,2,0]\
[0,0,0,2,2,4;1,1,4,5,2,1],300,300,[violet,purple],,p\
[0,0,0,2,2,4;0,0,3,-5,-2,-3;1,1,4,1,2,1],300,300,,,p
[0,0,0,5,4,4;2,4,2,1,5,3],300,300,,,p\
[0,0,0,5,4,4;2,4,2,1,5,1],500,500,,,p

!exit

:proc
!reset slib_out slib_data slib_color
!distribute items $wims_read_parm into slib_d,slib_sizex,slib_sizey, slib_color,slib_width
slib_d=!declosing $slib_d
slib_d=!rows2lines $slib_d
slib_dcnt=!linecnt $slib_d
slib_d=!lines2rows $slib_d

!default slib_color=[red,red]
!default slib_width=[0.01,0.03]
!default slib_sizex=300
!default slib_sizey=300
slib_bondcnt=0
slib_data=ATOM
slib_b=!linecnt $slib_data
slib_cnt=0
!if $slib_id!=
  !increase slib_id
!endif
!if $(wims_read_parm[7])!=$empty
  slib_id=$(wims_read_parm[7])
!endif
!if $slib_id=
  slib_id=0
!endif

!if p iswordof $(wims_read_parm[6])
  !goto parallepipede
!endif

!for slib_n = 1 to $slib_dcnt
     slib_cube=$(slib_d[$slib_n;])
     slib_cube1=!items2words $slib_cube
     slib_cube=!words2items $slib_cube1
     slib_cube=!nospace $slib_cube
     slib_list=$(slib_data[;1])
     slib_new0=!positionof item c $slib_cube1 in $slib_list
     !if $slib_new0=
       slib_data=!append line c $slib_cube1 to $slib_data
       slib_list=$(slib_data[;1])
       !increase slib_cnt
       slib_new0=$slib_cnt
    !else
       slib_new0=$[$slib_new0-$slib_b]
    !endif
    slib_pos=$[$(slib_cube[1])+1] $[$(slib_cube[2])] $[$(slib_cube[3])]
    slib_new1=!positionof item c $slib_pos in $slib_list
    !if $slib_new1=
       slib_data=!append line c $slib_pos,$slib_new0 to $slib_data
       slib_list=$(slib_data[;1])
       !increase slib_cnt
       slib_new1=$slib_cnt
       !increase slib_bondcnt
   !else
      slib_new1=$[$slib_new1-$slib_b]
   !endif
   slib_pos=$[$(slib_cube[1])] $[$(slib_cube[2])+1] $[$(slib_cube[3])]
   slib_new2=!positionof item c $slib_pos in $slib_list
   !if $slib_new2=
      slib_data=!append line c $slib_pos,$slib_new0 to $slib_data
      slib_list=$(slib_data[;1])
      !increase slib_cnt
      slib_new2=$slib_cnt
      !increase slib_bondcnt
   !else
      slib_new2=$[$slib_new2-$slib_b]
     !endif
     slib_pos=$[$(slib_cube[1])] $[$(slib_cube[2])] $[$(slib_cube[3])+1]
     slib_new3=!positionof item c $slib_pos in $slib_list
     !if $slib_new3=
        slib_data=!append line c $slib_pos,$slib_new0 to $slib_data
        slib_list=$(slib_data[;1])
        !increase slib_cnt
        slib_new3=$slib_cnt
        !increase slib_bondcnt
   !else
      slib_new3=$[$slib_new3-$slib_b]
   !endif
   slib_pos=$[$(slib_cube[1])+1] $[$(slib_cube[2])+1] $[$(slib_cube[3])]
   slib_new4=!positionof item c $slib_pos in $slib_list
   !if $slib_new4=
        slib_data=!append line c $slib_pos,$slib_new1,$slib_new2 to $slib_data
        slib_list=$(slib_data[;1])
        !increase slib_cnt
        slib_new4=$slib_cnt
        slib_bondcnt=$[$slib_bondcnt+2]
   !else
      slib_new4=$[$slib_new4-$slib_b]
   !endif
   slib_pos=$[$(slib_cube[1])] $[$(slib_cube[2])+1] $[$(slib_cube[3])+1]
   slib_new5=!positionof item c $slib_pos in $slib_list
   !if $slib_new5=
        slib_data=!append line c $slib_pos,$slib_new2,$slib_new3 to $slib_data
        slib_list=$(slib_data[;1])
        !increase slib_cnt
        slib_new5=$slib_cnt
        slib_bondcnt=$[$slib_bondcnt+2]
  !else
      slib_new5=$[$slib_new5-$slib_b]
  !endif
     slib_pos=$[$(slib_cube[1])+1] $[$(slib_cube[2])] $[$(slib_cube[3])+1]
     slib_new6=!positionof item c $slib_pos in $slib_list
  !if $slib_new6=
        slib_data=!append line c $slib_pos,$slib_new3,$slib_new1 to $slib_data
        slib_list=$(slib_data[;1])
        !increase slib_cnt
        slib_new6=$slib_cnt
        slib_bondcnt=$[$slib_bondcnt+2]
  !else
      slib_new6=$[$slib_new6-$slib_b]
  !endif
  slib_pos=$[$(slib_cube[1])+1] $[$(slib_cube[2])+1] $[$(slib_cube[3])+1]
  slib_new7=!positionof item c $slib_pos in $slib_list
  !if $slib_new7=
        slib_data=!append line c $slib_pos,$slib_new4,$slib_new5,$slib_new6 to $slib_data
        slib_list=$(slib_data[;1])
        !increase slib_cnt
        slib_new7=$slib_cnt
        slib_bondcnt=$[$slib_bondcnt+3]
  !else
      slib_new7=$[$slib_new7-$slib_b]
  !endif
!next
!goto end
:parallepipede

!for slib_n = 1 to $slib_dcnt
  slib_step=$[sign($(slib_d[$slib_n;4]))],$[sign($(slib_d[$slib_n;5]))],$[sign($(slib_d[$slib_n;6]))]
 !for slib_i=0 to $(slib_d[$slib_n;4]) step $(slib_step[1])
   !for slib_j = 0 to $(slib_d[$slib_n;5]) step $(slib_step[2])
     !for slib_h = 0 to $(slib_d[$slib_n;6]) step $(slib_step[3])
       slib_Neig=
       slib_list= $(slib_data[;1])
       !reset slib_neig
       !if c $[$(slib_d[$slib_n;1])+$slib_i] $[$(slib_d[$slib_n;2])+$slib_j] $[$(slib_d[$slib_n;3])+$slib_h] isitemof $slib_list
         !goto break
       !endif
       slib_neig=!positionof item c $[$(slib_d[$slib_n;1]) + $slib_i] $[$(slib_d[$slib_n;2])+$slib_j] $[$(slib_d[$slib_n;3])+$slib_h+1] in $slib_list
       !if $slib_neig > $slib_b
         slib_Neig=!append item $[$slib_neig-$slib_b] to $slib_Neig
       !endif
       !reset slib_neig
       slib_neig=!positionof item c $[$(slib_d[$slib_n;1]) + $slib_i] $[$(slib_d[$slib_n;2])+$slib_j] $[$(slib_d[$slib_n;3])+$slib_h-1] in $slib_list
       !if $slib_neig > $slib_b
         slib_Neig=!append item $[$slib_neig-$slib_b] to $slib_Neig
       !endif
       !reset slib_neig
       slib_neig=!positionof item c $[$(slib_d[$slib_n;1])+$slib_i-1] $[$(slib_d[$slib_n;2])+$slib_j] $[$(slib_d[$slib_n;3])+$slib_h] in $slib_list
       !ifval $slib_neig > $slib_b
         slib_Neig=!append item $[$slib_neig-$slib_b] to $slib_Neig
       !endif
       !reset slib_neig
        slib_neig=!positionof item c $[$(slib_d[$slib_n;1])+$slib_i +1] $[$(slib_d[$slib_n;2])+$slib_j] $[$(slib_d[$slib_n;3])+$slib_h] in $slib_list
        !ifval $slib_neig > $slib_b
         slib_Neig=!append item $[$slib_neig-$slib_b] to $slib_Neig
       !endif
        !reset slib_neig
        slib_neig=!positionof item c $[$(slib_d[$slib_n;1])+$slib_i] $[$(slib_d[$slib_n;2])+$slib_j+1] $[$(slib_d[$slib_n;3])+$slib_h] in $slib_list
        !ifval $slib_neig > $slib_b
         slib_Neig=!append item $[$slib_neig-$slib_b] to $slib_Neig
       !endif
       !reset slib_neig
        slib_neig=!positionof item c $[$(slib_d[$slib_n;1])+$slib_i] $[$(slib_d[$slib_n;2])+$slib_j-1] $[$(slib_d[$slib_n;3])+$slib_h] in $slib_list
       !ifval $slib_neig > $slib_b
         slib_Neig=!append item $[$slib_neig-$slib_b] to $slib_Neig
       !endif
       slib_Neig=!singlespace $slib_Neig
       slib_Neig=!listuniq $slib_Neig
       slib_data=!append line c $[$(slib_d[$slib_n;1])+$slib_i] $[$(slib_d[$slib_n;2])+$slib_j] $[$(slib_d[$slib_n;3])+$slib_h], $slib_Neig\
       to $slib_data
       slib_cnt=!itemcnt $slib_Neig
       slib_bondcnt=$[$slib_cnt + $slib_bondcnt]
       !reset slib_Neig
:break
    !next
  !next
 !next
!next
:end
!if $slib_bondcnt >= 500
  slib_out=too_big
  !exit
!endif

slib_data=!items2words $slib_data
slib_data_cnt=!linecnt $slib_data
!reset slib_vertex slib_edge slib_edge_cnt slib_face slib_face_cnt slib_arete slib_vertex_cnt
slib_vertex_cnt=0

!for slib_j=2 to $slib_data_cnt
    slib_line=!line $slib_j of $slib_data
    slib_point=!word 2 to 4 of $slib_line
    slib_vertex=!append line $slib_point to $slib_vertex
    slib_e=!word 5 to -1 of $slib_line
    slib_e=!words2items $slib_e
    slib_n=!itemcnt $slib_e
    !if $slib_n>0
      slib_e=!exec pari [$slib_e]-vector($slib_n,i,1)
    !endif
    !if $slib_e!=
      slib_face=!append line $[$slib_n+1] $slib_vertex_cnt $slib_e to $slib_face
      !increase slib_face_cnt
      slib_e=!words2items $slib_e
      !for slib_m=1 to $[$slib_n]
         slib_edge=!append line $slib_vertex_cnt $[$(slib_e[$[$slib_m]])] to $slib_edge
         !increase slib_edge_cnt
      !next
    !endif
    !increase slib_vertex_cnt
!next
slib_edge=!replace internal , by $ $ in $slib_edge
slib_face=!replace internal , by $ $ in $slib_face
slib_vertex=!nonempty lines $slib_vertex
slib_data=$[$slib_vertex_cnt] 0 $[$slib_edge_cnt]\
$slib_vertex\
$slib_edge


!readproc slib/geo3D/off2jmol $slib_data,[S$slib_id,A$slib_id],$slib_color,$slib_width,url $slib_id

slib_out2=$slib_out

  !readproc oef/togetfile.proc tmp2_$slib_id new\
$slib_out

!!slib_rotation=moveto 0.0 { 722 -692 2 36.12}  100.0 0.0 0.0  {0 0 0} 3.08 {0 0 0} 0 0 0 3.0 0.0 0.0;

!reset slib_vertex slib_edge slib_edge_cnt slib_face slib_face_cnt slib_arete slib_vertex_cnt slib_data slib_out
!readproc slib/chemistry/jmolshow $(slib_out2[2]),$slib_sizex,$slib_sizey,white,script "$(slib_out2[1])";zoom 120;$slib_rotation,$slib_id


!exit

moveto /* time, axisAngle */ 0.0 { 722 -692 2 36.12} /* zoom, translation
*/  100.0 0.0 0.0  /* center, rotationRadius */ {0 0 0} 3.08 /* navigation
center, translation, depth */ {0 0 0} 0 0 0 /* cameraDepth, cameraX,
cameraY */  3.0 0.0 0.0;