Changeset 57
- Timestamp:
- Apr 29, 2010 9:30:47 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 16 added
- 6 deleted
- 3 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIspc.py
r41 r57 5 5 import sys 6 6 import os.path as ospath 7 # determine a binary path pased on the host OS and the python version, path is relative to 8 # location of this file 7 8 # determine a binary path based on the host OS and the python version, path 9 # is relative to the location of this file 9 10 if sys.platform == "win32": 10 11 bindir = 'binwin%d.%d' % sys.version_info[0:2] 11 12 elif sys.platform == "darwin": 12 13 bindir = 'binmac%d.%d' % sys.version_info[0:2] 14 if sys.byteorder == 'big': 15 bindir += 'PPC' 16 elif sys.platform == "linux2": 17 bindir = 'binlinux%d.%d' % sys.version_info[0:2] 13 18 else: 14 19 bindir = 'bin' 15 if ospath.exists(ospath.join(sys.path[0],bindir)) and ospath.join(sys.path[0],bindir) not in sys.path: 16 sys.path.insert(0,ospath.join(sys.path[0],bindir)) 20 mypath = ospath.split(ospath.abspath( __file__ ))[0] 21 bindir = ospath.join(mypath,bindir) 22 if ospath.exists(bindir): 23 if bindir not in sys.path: sys.path.insert(0,bindir) 24 else: 25 print 'Expected binary directory (%s) for pyspg not found' % bindir 26 # use local bin directory preferentially 27 bindir = ospath.join(mypath,'bin') 28 if ospath.exists(bindir): 29 if bindir not in sys.path: sys.path.insert(0,bindir) 17 30 18 31 import pyspg as pyd … … 499 512 return GetKNsym(str(Isym)),Mult 500 513 514 # self-test materials follow. Requires files in directory testinp 515 def test0(): 516 '''test #0: exercise MoveToUnitCell''' 517 msg = "MoveToUnitCell failed" 518 v = [0,1,2,-1,-2]; MoveToUnitCell(v); assert v==[0,0,0,0,0], msg 519 v = np.array([-.1]); MoveToUnitCell(v); assert abs(v-0.9) < 1e-6, msg 520 v = np.array([.1]); MoveToUnitCell(v); assert abs(v-0.1) < 1e-6, msg 521 522 def test1(): 523 ''' test #1: SpcGroup and SGPrint against previous results''' 524 testdir = ospath.join(mypath,'testinp') 525 if ospath.exists(testdir): 526 if testdir not in sys.path: sys.path.insert(0,testdir) 527 import spctestinp 528 def CompareSpcGroup(spc, referr, refdict, reflist): 529 'Compare output from GSASIIspc.SpcGroup with results from a previous run' 530 # if an error is reported, the dictionary can be ignored 531 msg = "failed on space group %s" % spc 532 result = SpcGroup(spc) 533 if result[0] == referr and referr > 0: return True 534 keys = result[1].keys() 535 #print result[1]['SpGrp'] 536 assert len(keys) == len(refdict.keys()), msg 537 for key in keys: 538 #print key, type(refdict[key]) 539 if key == 'SGOps' or key == 'SGCen': 540 assert len(refdict[key]) == len(result[1][key]), msg 541 for i in range(len(refdict[key])): 542 assert np.allclose(result[1][key][i][0],refdict[key][i][0]), msg 543 assert np.allclose(result[1][key][i][1],refdict[key][i][1]), msg 544 else: 545 assert result[1][key] == refdict[key], msg 546 assert reflist == SGPrint(result[1]), 'SGPrint ' +msg 547 for spc in spctestinp.SGdat: 548 CompareSpcGroup(spc, 0, spctestinp.SGdat[spc], spctestinp.SGlist[spc] ) 549 550 def test2(): 551 ''' test #2: SpcGroup against cctbx (sgtbx) computations''' 552 testdir = ospath.join(mypath,'testinp') 553 if ospath.exists(testdir): 554 if testdir not in sys.path: sys.path.insert(0,testdir) 555 import sgtbxtestinp 556 def CompareWcctbx(spcname, cctbx_in, debug=0): 557 'Compare output from GSASIIspc.SpcGroup with results from cctbx.sgtbx' 558 cctbx = cctbx_in[:] # make copy so we don't delete from the original 559 spc = (SpcGroup(spcname))[1] 560 if debug: print spc['SpGrp'] 561 if debug: print spc['SGCen'] 562 latticetype = spcname.strip().upper()[0] 563 # lattice type of R implies Hexagonal centering", fix the rhombohedral settings 564 if latticetype == "R" and len(spc['SGCen']) == 1: latticetype = 'P' 565 assert latticetype == spc['SGLatt'], "Failed: %s does not match Lattice: %s" % (spcname, spc['SGLatt']) 566 onebar = [1] 567 if spc['SGInv']: onebar.append(-1) 568 for (op,off) in spc['SGOps']: 569 for inv in onebar: 570 for cen in spc['SGCen']: 571 noff = off + cen 572 MoveToUnitCell(noff) 573 mult = tuple((op*inv).ravel().tolist()) 574 if debug: print "\n%s: %s + %s" % (spcname,mult,noff) 575 for refop in cctbx: 576 if debug: print refop 577 # check the transform 578 if refop[:9] != mult: continue 579 if debug: print "mult match" 580 # check the translation 581 reftrans = list(refop[-3:]) 582 MoveToUnitCell(reftrans) 583 if all(abs(noff - reftrans) < 1.e-5): 584 cctbx.remove(refop) 585 break 586 else: 587 assert False, "failed on %s:\n\t %s + %s" % (spcname,mult,noff) 588 for key in sgtbxtestinp.sgtbx: 589 CompareWcctbx(key, sgtbxtestinp.sgtbx[key]) 590 591 def test3(): 592 ''' test #3: exercise SytSym (includes GetOprPtrName, GenAtom, GetKNsym) 593 for selected space groups against info in IT Volume A ''' 594 def ExerciseSiteSym (spc, crdlist): 595 'compare site symmetries and multiplicities for a specified space group' 596 msg = "failed on site sym test for %s" % spc 597 (E,S) = SpcGroup(spc) 598 assert not E, msg 599 for t in crdlist: 600 symb, m = SytSym(t[0],S) 601 if symb.strip() != t[2].strip() or m != t[1]: 602 print spc,t[0],m,symb 603 assert m == t[1] 604 #assert symb.strip() == t[2].strip() 605 606 ExerciseSiteSym('p 1',[ 607 ((0.13,0.22,0.31),1,'1'), 608 ((0,0,0),1,'1'), 609 ]) 610 ExerciseSiteSym('p -1',[ 611 ((0.13,0.22,0.31),2,'1'), 612 ((0,0.5,0),1,'-1'), 613 ]) 614 ExerciseSiteSym('C 2/c',[ 615 ((0.13,0.22,0.31),8,'1'), 616 ((0.0,.31,0.25),4,'2(010)'), 617 ((0.25,.25,0.5),4,'-1'), 618 ((0,0.5,0),4,'-1'), 619 ]) 620 ExerciseSiteSym('p 2 2 2',[ 621 ((0.13,0.22,0.31),4,'1'), 622 ((0,0.5,.31),2,'2(001)'), 623 ((0.5,.31,0.5),2,'2(010)'), 624 ((.11,0,0),2,'2(100)'), 625 ((0,0.5,0),1,'222'), 626 ]) 627 ExerciseSiteSym('p 4/n',[ 628 ((0.13,0.22,0.31),8,'1'), 629 ((0.25,0.75,.31),4,'2(001)'), 630 ((0.5,0.5,0.5),4,'-1'), 631 ((0,0.5,0),4,'-1'), 632 ((0.25,0.25,.31),2,'4(001)'), 633 ((0.25,.75,0.5),2,'-4(001)'), 634 ((0.25,.75,0.0),2,'-4(001)'), 635 ]) 636 ExerciseSiteSym('p 31 2 1',[ 637 ((0.13,0.22,0.31),6,'1'), 638 ((0.13,0.0,0.833333333),3,'2(100)'), 639 ((0.13,0.13,0.),3,'2(110)'), 640 ]) 641 ExerciseSiteSym('R 3 c',[ 642 ((0.13,0.22,0.31),18,'1'), 643 ((0.0,0.0,0.31),6,'3'), 644 ]) 645 ExerciseSiteSym('R 3 c R',[ 646 ((0.13,0.22,0.31),6,'1'), 647 ((0.31,0.31,0.31),2,'3(111)'), 648 ]) 649 ExerciseSiteSym('P 63 m c',[ 650 ((0.13,0.22,0.31),12,'1'), 651 ((0.11,0.22,0.31),6,'m(100)'), 652 ((0.333333,0.6666667,0.31),2,'3m(100)'), 653 ((0,0,0.31),2,'3m(100)'), 654 ]) 655 ExerciseSiteSym('I a -3',[ 656 ((0.13,0.22,0.31),48,'1'), 657 ((0.11,0,0.25),24,'2(100)'), 658 ((0.11,0.11,0.11),16,'3(111)'), 659 ((0,0,0),8,'-3(111)'), 660 ]) 661 662 if __name__ == '__main__': 663 test0() 664 test1() 665 test2() 666 test3() 667 print "OK" -
trunk/testinp/genselftest.py
r30 r57 1 1 ''' 2 this generates space group tables for ~all 230 space groups in 3 standard settings using the GSASIIspc.SpcGroup routine 4 (N.B. R space groups are set in both hex and rhomb. settings so there 5 are more than 230 tests generated). 6 7 Run this redirected to SGdat.py to create the input file. 2 this generates space group tables for all 230 space groups in 3 standard settings using the GSASIIspc.SpcGroup routine. A number 4 of redundant tests are computed, so more than 230 test cases are generated. 5 6 The output from this is placed in spctestinp.py which contains two dictionaries, 7 SGdat and SGlist that can be used for testing. 8 8 9 ''' 9 10 import sys … … 22 23 sglist[spc] = GSASIIspc.SGPrint(D) 23 24 24 #cubic 25 duplist = [] 26 ###################################################################### 27 #cubic (36) 28 ###################################################################### 25 29 GenSGdat('p 2 3') 26 30 GenSGdat('f 2 3') … … 31 35 GenSGdat('p n -3') 32 36 GenSGdat('f m 3') 33 GenSGdat('f d -3')34 GenSGdat('i m -3')37 GenSGdat('f d 3') 38 GenSGdat('i m 3') 35 39 GenSGdat('p a 3') 36 40 GenSGdat('i a 3') … … 59 63 GenSGdat('i m -3 m') 60 64 GenSGdat('i a -3 d') 61 # ortho 65 # duplicates (IT A naming) 66 GenSGdat('p m -3') # dup: as before 67 duplist.append(('p m 3', 'p m -3')) 68 GenSGdat('f m -3') # dup: as before 69 duplist.append(('f m 3','f m -3')) 70 GenSGdat('f d -3') # dup: as before 71 duplist.append(('f d 3','f d -3')) 72 GenSGdat('i m -3') # dup: as before 73 duplist.append(('i m 3','i m -3')) 74 GenSGdat('p a -3') # dup: as before 75 duplist.append(('p a 3','p a -3')) 76 GenSGdat('i a -3') # dup: as before 77 duplist.append(('i a 3','i a -3')) 78 ###################################################################### 79 # ortho (59) 80 ###################################################################### 62 81 GenSGdat('p 2 2 2') 63 82 GenSGdat('p 2 2 21') … … 119 138 GenSGdat('i b c a') 120 139 GenSGdat('i m m a') 121 # tetragonal 140 ###################################################################### 141 # tetragonal (68) 142 ###################################################################### 122 143 GenSGdat('p 4') 123 144 GenSGdat('p 41') … … 125 146 GenSGdat('p 43') 126 147 GenSGdat('i 4') 127 GenSGdat('i 41 1 1')148 GenSGdat('i 41') 128 149 GenSGdat('p -4') 129 150 GenSGdat('i -4') 130 151 GenSGdat('p 4/m') 131 152 GenSGdat('p 42/m') 132 #GenSGdat('p 4/n 1 ') # does not work133 153 GenSGdat('p 4/n') 134 154 GenSGdat('p 42/n') … … 141 161 GenSGdat('p 42 2 2') 142 162 GenSGdat('p 42 21 2') 143 GenSGdat('p 43 2 2 163 GenSGdat('p 43 2 2') 144 164 GenSGdat('p 43 21 2') 145 165 GenSGdat('i 4 2 2') … … 147 167 GenSGdat('p 4 m m') 148 168 GenSGdat('p 4 b m') 149 GenSGdat('p 2 c m')169 GenSGdat('p 42 c m') 150 170 GenSGdat('p 42 n m') 151 171 GenSGdat('p 4 c c') … … 189 209 GenSGdat('i 41/a m d') 190 210 GenSGdat('i 41/a c d') 191 # triclinic 211 # duplicate -- note gives wrong Laue class 212 #GenSGdat('i 41 1 1') # dup: as before 213 #duplist.append(('i 41','i 41 1 1')) 214 #GenSGdat('p 4/n 1 ') # does not work 215 ###################################################################### 216 # triclinic (2) 217 ###################################################################### 192 218 GenSGdat('p 1') 193 219 GenSGdat('p -1') 194 # monoclinic 220 ###################################################################### 221 # monoclinic (13) 222 ###################################################################### 195 223 GenSGdat('p 2') 196 224 GenSGdat('p 21') 197 GenSGdat('c 2 1 1')225 GenSGdat('c 2') 198 226 GenSGdat('p m') 199 227 GenSGdat('p c') 200 228 GenSGdat('c m') 201 229 GenSGdat('c c') 202 GenSGdat('p 1 2/m 1')230 GenSGdat('p 2/m') 203 231 GenSGdat('p 21/m') 204 232 GenSGdat('c 2/m') 205 233 GenSGdat('p 2/c') 206 234 GenSGdat('p 21/c') 207 GenSGdat('c 1 2/c 1') 208 # trigonal 235 GenSGdat('c 2/c') 236 # duplicates 237 GenSGdat('c 1 2 1') # dup: as before 238 duplist.append(('c 2','c 1 2 1')) 239 GenSGdat('c 1 2/c 1') # dup: as before 240 duplist.append(('c 2/c','c 1 2/c 1')) 241 GenSGdat('p 1 2/m 1') # dup: as before 242 duplist.append(('p 2/m','p 1 2/m 1')) 243 ###################################################################### 244 # trigonal (25) 245 ###################################################################### 246 GenSGdat('p 3') 209 247 GenSGdat('p 31') 210 GenSGdat('p 32 1 1')248 GenSGdat('p 32') 211 249 GenSGdat('r 3') 212 GenSGdat('r 3 r')213 250 GenSGdat('p -3') 214 251 GenSGdat('r -3') 215 GenSGdat('r -3 r')216 252 GenSGdat('p 3 1 2') 217 253 GenSGdat('p 3 2 1') … … 220 256 GenSGdat('p 32 1 2') 221 257 GenSGdat('p 32 2 1') 222 GenSGdat('r 3 2 h') 223 GenSGdat('r 3 2 r') 258 GenSGdat('r 3 2') 224 259 GenSGdat('p 3 m 1') 225 260 GenSGdat('p 3 1 m') 226 261 GenSGdat('p 3 c 1') 227 262 GenSGdat('p 3 1 c') 228 GenSGdat('r 3 m h') 229 GenSGdat('r 3 m r') 263 GenSGdat('r 3 m') 230 264 GenSGdat('r 3 c') 231 GenSGdat('r 3 c r')232 265 GenSGdat('p -3 1 m') 233 266 GenSGdat('p -3 1 c') 234 267 GenSGdat('p -3 m 1') 235 268 GenSGdat('p -3 c 1') 236 GenSGdat('r -3 m') 237 GenSGdat('r -3 m r') 269 GenSGdat('r -3 m') 238 270 GenSGdat('r -3 c') 239 GenSGdat('r -3 c r') 240 # hexagonal 271 # duplicate 272 GenSGdat('r 3 r') # dup: rhomb setting 273 GenSGdat('r -3 r') # dup: rhomb setting 274 GenSGdat('r 3 2 r') # dup: rhomb setting 275 GenSGdat('r -3 c r') # dup: rhomb setting 276 GenSGdat('r 3 m r') # dup: rhomb setting 277 GenSGdat('r 3 c r') # dup: rhomb setting 278 GenSGdat('r -3 m r') # dup: rhomb setting 279 GenSGdat('p 32 1 1') # dup: as before 280 duplist.append(('p 32','p 32 1 1')) 281 GenSGdat('r 3 2 h') # dup: hex setting 282 duplist.append(('r 3 2','r 3 2 h')) 283 GenSGdat('r 3 m h') # dup: hex setting 284 duplist.append(('r 3 m','r 3 m h')) 285 ###################################################################### 286 # hexagonal (27) 287 ###################################################################### 241 288 GenSGdat('p 6') 242 289 GenSGdat('p 61') 243 GenSGdat('p 65 1 1')290 GenSGdat('p 65') 244 291 GenSGdat('p 62') 245 292 GenSGdat('p 64') 246 293 GenSGdat('p 63') 247 294 GenSGdat('p -6') 248 GenSGdat('p 6/m 1 1')295 GenSGdat('p 6/m') 249 296 GenSGdat('p 63/m') 250 297 GenSGdat('p 6 2 2') … … 266 313 GenSGdat('p 63/m c m') 267 314 GenSGdat('p 63/m m c') 268 # non-standard space groups 269 GenSGdat('p 1 1 2/m') 270 GenSGdat('p 2/m 1 1') 271 GenSGdat('F -1') 272 GenSGdat('a 2 2 2') 273 274 275 print "# output from GSASIIspc computed on platform",sys.platform,"on",datetime.date.today() 276 print "import numpy as np" 277 print "array = np.array" 278 print "float32=np.float32" 279 print 'SGdat = {' 315 # duplicate 316 GenSGdat('p 65 1 1') # dup: as before 317 duplist.append(('p 65','p 65 1 1')) 318 GenSGdat('p 6/m 1 1') # dup: as before 319 duplist.append(('p 6/m','p 6/m 1 1')) 320 ###################################################################### 321 # non-standard space group settings 322 ######################################################################G 323 GenSGdat('p 1 1 2/m') # dup: non-standard 324 GenSGdat('p 2/m 1 1') # dup: non-standard 325 GenSGdat('F -1') # dup: non-standard 326 GenSGdat('a 2 2 2') # dup: non-standard 327 328 # do a bit of internal consistency checking 329 import numpy as np 330 array = np.array 331 float32=np.float32 332 # check for internal agreement with duplicates 333 for key1,key2 in duplist: 334 msg = "checking %s against %s" % (key1, key2) 335 keys = sgdat[key1].keys() 336 assert len(keys) == len(sgdat[key2].keys()), msg 337 for key in keys: 338 if key == 'SGOps': 339 assert len(sgdat[key2][key]) == len(sgdat[key1][key]), msg 340 for i in range(len(sgdat[key2][key])): 341 assert np.allclose(sgdat[key1][key][i][0],sgdat[key2][key][i][0]), msg 342 assert np.allclose(sgdat[key1][key][i][1],sgdat[key2][key][i][1]), msg 343 elif key == 'SGCen': 344 assert len(sgdat[key2][key]) == len(sgdat[key1][key]), msg 345 for i in range(len(sgdat[key2][key])): 346 assert np.allclose(sgdat[key1][key][i][0],sgdat[key2][key][i][0]), msg 347 assert np.allclose(sgdat[key1][key][i][1],sgdat[key2][key][i][1]), msg 348 elif key == 'SpGrp': # expect this to differ 349 pass 350 else: 351 assert sgdat[key1][key] == sgdat[key2][key], msg+': key = '+key 352 353 354 fp = open('spctestinp.py','w') 355 fp.write("# output from GSASIIspc computed on platform %s on %s\n" % 356 (sys.platform, datetime.date.today()) ) 357 fp.write("import numpy as np\n") 358 fp.write("array = np.array\n") 359 fp.write("float32=np.float32\n") 360 fp.write('# testing %s space groups (25 dups/non-standard)\n' % len(sgdat)) 361 fp.write('SGdat = {\n') 280 362 for spc in sgdat: 281 print ('"%s":' % spc),sgdat[spc],","282 print "}" 283 284 print 'SGlist = {' 363 fp.write('"%s": %s ,\n' % (spc,sgdat[spc],)) 364 fp.write("}\n") 365 366 fp.write('SGlist = {\n') 285 367 for spc in sgdat: 286 print ('"%s":' % spc),sglist[spc],"," 287 print "}" 368 fp.write('"%s": %s ,\n' % (spc,sglist[spc],)) 369 fp.write("}\n") 370 fp.close() -
trunk/testinp/gensgtbx.py
r30 r57 2 2 ''' 3 3 Generate symmetry operations in cctbx.sgtbx for use in testing the 4 GSASII space group generation code. I think one of the 230 spacegroups 5 is missing from the list below; but there are two settings included for the 6 rhombohedral groups. 7 8 Redirect output to sgtbxdat.py to create the input file for testing. 4 GSASII space group generation code. All 230 spacegroups are tested plus 5 rhombohedral settings of R space groups. 6 7 The output from this is placed in sgtbxtestinp.py which contains a dictionary 8 sgtbx that can be used for testing. 9 9 10 ''' 10 11 11 12 from cctbx import sgtbx 13 import sys 14 import datetime 12 15 13 16 def GenSGdat(spc): 14 print "'%s': [" % spc17 fp.write("'%s': [\n" % spc) 15 18 s=sgtbx.space_group_info(spc) 16 19 for s1 in s.group(): 17 print s1.as_double_array(),"," 18 print "],\n" 19 print "sgtbx = {" 20 # print s1.as_double_array() 21 fp.write("%s ,\n" % (s1.as_double_array(),)) 22 fp.write("],\n\n") 23 24 fp = open('sgtbxtestinp.py','w') 25 fp.write("# output from sgtbx computed on platform %s on %s\n" % 26 (sys.platform, datetime.date.today()) ) 27 fp.write("sgtbx = {\n") 20 28 #cubic 21 29 GenSGdat('p 2 3') … … 121 129 GenSGdat('p 43') 122 130 GenSGdat('i 4') 123 #GenSGdat('i 41 1 1') # not accepted by cctbx124 131 GenSGdat('i 41') 125 132 GenSGdat('p -4') … … 127 134 GenSGdat('p 4/m') 128 135 GenSGdat('p 42/m') 129 #GenSGdat('p 4/n 1 ') # does not work130 136 GenSGdat('p 4/n') 131 137 GenSGdat('p 42/n') … … 138 144 GenSGdat('p 42 2 2') 139 145 GenSGdat('p 42 21 2') 140 GenSGdat('p 43 2 2 146 GenSGdat('p 43 2 2') 141 147 GenSGdat('p 43 21 2') 142 148 GenSGdat('i 4 2 2') … … 144 150 GenSGdat('p 4 m m') 145 151 GenSGdat('p 4 b m') 146 GenSGdat('p 2 c m')152 GenSGdat('p 42 c m') 147 153 GenSGdat('p 42 n m') 148 154 GenSGdat('p 4 c c') … … 183 189 GenSGdat('p 42/n c m') 184 190 GenSGdat('i 4/m m m') 185 GenSGdat('i 4/m c m 191 GenSGdat('i 4/m c m') 186 192 GenSGdat('i 41/a m d') 187 193 GenSGdat('i 41/a c d') … … 192 198 GenSGdat('p 2') 193 199 GenSGdat('p 21') 194 GenSGdat('c 2 1 1')200 GenSGdat('c 2') 195 201 GenSGdat('p m') 196 202 GenSGdat('p c') 197 203 GenSGdat('c m') 198 204 GenSGdat('c c') 199 GenSGdat('p 1 2/m 1')205 GenSGdat('p 2/m') 200 206 GenSGdat('p 21/m') 201 207 GenSGdat('c 2/m') 202 208 GenSGdat('p 2/c') 203 209 GenSGdat('p 21/c') 204 GenSGdat('c 1 2/c 1')210 GenSGdat('c 2/c') 205 211 # trigonal 212 GenSGdat('p 3') 206 213 GenSGdat('p 31') 207 #GenSGdat('p 32 1 1') # not accepted by cctbx208 214 GenSGdat('p 32') 209 215 GenSGdat('r 3') … … 239 245 GenSGdat('p 6') 240 246 GenSGdat('p 61') 241 #GenSGdat('p 65 1 1') # not accepted by cctbx242 247 GenSGdat('p 65') 243 248 GenSGdat('p 62') … … 245 250 GenSGdat('p 63') 246 251 GenSGdat('p -6') 247 #GenSGdat('p 6/m 1 1') # not accepted by cctbx248 252 GenSGdat('p 6/m') 249 253 GenSGdat('p 63/m') … … 266 270 GenSGdat('p 63/m c m') 267 271 GenSGdat('p 63/m m c') 268 269 print "}" 272 # non-standard 273 GenSGdat('p 21 1 1') 274 GenSGdat('p 1 21 1') 275 GenSGdat('p 1 1 21') 276 fp.write("}\n") 277 fp.close()
Note: See TracChangeset
for help on using the changeset viewer.