Changeset 155
- Timestamp:
- Sep 24, 2010 4:07:24 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ElementTable.py
r147 r155 1 1 #Element table for building periodic table with valences & JMOL colors 2 import wx 2 3 #Need these in case go back to this periodic table coloring scheme 3 import wx4 4 REcolor = wx.Colour(128, 128, 255) 5 5 Metcolor = wx.Colour(192, 192, 192) … … 11 11 White = wx.Colour(255, 255, 255) 12 12 ElTable = [ 13 (["H","H-1"], 0,0, "Hydrogen", White, 0.0000,wx.Colour( 0xff,0xff,0xff)),14 (["He",], 17,0, "Helium", Noblecolor, 0.0000,wx.Colour( 0xd9,0xff,0xff)),15 (["Li","Li+1"], 0,1, "Lithium", Alkcolor, 0.0004,wx.Colour( 0xcc,0x80,0xff)),16 (["Be","Be+2"], 1,1, "Beryllium", AlkEcolor, 0.0006,wx.Colour( 0xc2,0xff,0x00)),17 (["B",], 2,1, "Boron", NonMetcolor, 0.0012,wx.Colour( 0xff,0xb5,0xb5)),18 (["C",], 13,1, "Carbon", NonMetcolor, 0.0018,wx.Colour( 0x90,0x90,0x90)),19 (["N",], 14,1, "Nitrogen", NonMetcolor, 0.0030,wx.Colour( 0x30,0x50,0xf8)),20 (["O","O-1","O-2"], 15,1, "Oxygen", NonMetcolor, 0.0042,wx.Colour( 0xff,0x0d,0x0d)),21 (["F","F-1"], 16,1, "Fluorine", NonMetcolor, 0.0054,wx.Colour( 0x90,0xe0,0x50)),22 (["Ne",], 17,1, "Neon", Noblecolor, 0.0066,wx.Colour( 0xb3,0xe3,0xf5)),23 (["Na","Na+1"], 0,2, "Sodium", Alkcolor, 0.0084,wx.Colour( 0xab,0x5c,0xf2)),24 (["Mg","Mg+2"], 1,2, "Magnesium", AlkEcolor, 0.0110,wx.Colour( 0x8a,0xff,0x00)),25 (["Al","Al+3"], 2,2, "Aluminum", SemMetcolor, 0.0125,wx.Colour( 0xbf,0xa6,0xa6)),26 (["Si","Si+4"], 13,2, "Silicon", NonMetcolor, 0.0158,wx.Colour( 0xf0,0xc8,0xa0)),27 (["P",], 14,2, "Phosphorus", NonMetcolor, 0.0180,wx.Colour( 0xff,0x80,0x00)),28 (["S",], 15,2, "Sulphur", NonMetcolor, 0.0210,wx.Colour( 0xff,0xff,0x30)),29 (["Cl","Cl-1"], 16,2, "Chlorine", NonMetcolor, 0.0250,wx.Colour( 0x1f,0xf0,0x1f)),30 (["Ar",], 17,2, "Argon", Noblecolor, 0.0285,wx.Colour( 0x80,0xd1,0xe3)),31 (["K","K+1"], 0,3, "Potassium", Alkcolor, 0.0320,wx.Colour( 0x3d,0xff,0x00)),32 (["Ca","Ca+2"], 1,3, "Calcium", AlkEcolor, 0.0362,wx.Colour( 0x3d,0xff,0x00)),33 (["Sc","Sc+3"], 2,3, "Scandium", Metcolor, 0.0410,wx.Colour( 0xe6,0xe6,0xe6)),34 (["Ti","Ti+2","Ti+3","Ti+4"], 3,3, "Titanium", Metcolor, 0.0460,wx.Colour( 0xbf,0xc2,0xc7)),35 (["V","V+2","V+3","V+5"], 4,3, "Vanadium", Metcolor, 0.0510,wx.Colour( 0xa6,0xa6,0xab)),36 (["Cr","Cr+2","Cr+3"], 5,3, "Chromium", Metcolor, 0.0560,wx.Colour( 0x8a,0x99,0xc7)),37 (["Mn","Mn+2","Mn+3","Mn+4"], 6,3, "Manganese", Metcolor, 0.0616,wx.Colour( 0x9c,0x7a,0xc7)),38 (["Fe","Fe+2","Fe3"], 7,3, "Iron", Metcolor, 0.0680,wx.Colour( 0xe0,0x66,0x33)),39 (["Co","Co+2","Co+3"], 8,3, "Cobalt", Metcolor, 0.0740,wx.Colour( 0xf0,0x90,0xa0)),40 (["Ni","Ni+2","Ni+3"], 9,3, "Nickel", Metcolor, 0.0815,wx.Colour( 0x50,0xd0,0x50)),41 (["Cu","Cu+1","Cu+2"], 10,3, "Copper", Metcolor, 0.0878,wx.Colour( 0xc8,0x80,0x33)),42 (["Zn","Zn+2"], 11,3, "Zinc", Metcolor, 0.0960,wx.Colour( 0x7d,0x80,0xb0)),43 (["Ga","Ga+3"], 12,3, "Gallium", SemMetcolor, 0.104,wx.Colour( 0xc2,0x8f,0x8f)),44 (["Ge","Ge+4"], 13,3, "Germanium", SemMetcolor, 0.114,wx.Colour( 0x66,0x8f,0x8f)),45 (["As",], 14,3, "Arsenic", NonMetcolor, 0.120,wx.Colour( 0xbd,0x80,0xe3)),46 (["Se",], 15,3, "Selenium", NonMetcolor, 0.132,wx.Colour( 0xff,0xa1,0x00)),47 (["Br","Br-1"], 16,3, "Bromine", NonMetcolor, 0.141,wx.Colour( 0xa6,0x29,0x29)),48 (["Kr",], 17,3, "Krypton", Noblecolor, 0.150,wx.Colour( 0x5c,0xb8,0xd1)),49 (["Rb","Rb+1"], 0,4, "Rubidium", Alkcolor, 0.159,wx.Colour( 0x70,0x2e,0xb0)),50 (["Sr","Sr+2"], 1,4, "Strontium", AlkEcolor, 0.171,wx.Colour(0 x00,0xff,0x00)),51 (["Y","Y+3"], 2,4, "Yittrium", Metcolor, 0.180,wx.Colour( 0x94,0xff,0xff)),52 (["Zr","Zr+4"], 3,4, "Zirconium", Metcolor, 0.192,wx.Colour( 0x94,0xe0,0xe0)),53 (["Nb","Nb+3","Nb+5"], 4,4, "Niobium", Metcolor, 0.204,wx.Colour( 0x73,0xc2,0xc9)),54 (["Mo","Mo+3","Mo+5","Mo+6"], 5,4, "Molybdenium", Metcolor, 0.216,wx.Colour( 0x54,0xb5,0xb5)),55 (["Tc",], 6,4, "Technetium", Metcolor, 0.228,wx.Colour( 0x3b,0x9e,0x9e)),56 (["Ru","Ru+3","Ru+4"], 7,4, "Ruthenium", Metcolor, 0.246,wx.Colour( 0x24,0x8f,0x8f)),57 (["Rh","Rh+3","Rh+4"], 8,4, "Rhodium", Metcolor, 0.258,wx.Colour( 0x0a,0x7d,0x8c)),58 (["Pd","Pd+2","Pd+4"], 9,4, "Palladium", Metcolor, 0.270,wx.Colour(0 x00,0x69,0x85)),59 (["Ag","Ag+1","Ag+2"], 10,4, "Silver", Metcolor, 0.285,wx.Colour( 0xc0,0xc0,0xc0)),60 (["Cd","Cd+2"], 11,4, "Cadmium", Metcolor, 0.300,wx.Colour( 0xff,0xd9,0x8f)),61 (["In","In+3"], 12,4, "Indium", SemMetcolor, 0.318,wx.Colour( 0xa6,0x75,0x73)),62 (["Sn","Sn+2","Sn+4"], 13,4, "Tin", SemMetcolor, 0.330,wx.Colour( 0x66,0x80,0x80)),63 (["Sb","Sb+3","Sb+5"], 14,4, "Antimony", SemMetcolor, 0.348,wx.Colour( 0x9e,0x63,0xb5)),64 (["Te",], 15,4, "Tellurium", NonMetcolor, 0.363,wx.Colour( 0xd4,0x7a,0x00)),65 (["I","I-1"], 16,4, "Iodine", NonMetcolor, 0.384,wx.Colour( 0x94,0x00,0x94)),66 (["Xe",], 17,4, "Xenon", Noblecolor, 0.396,wx.Colour( 0x42,0x9e,0xb0)),67 (["Cs","Cs+1"], 0,5, "Caesium", Alkcolor, 0.414,wx.Colour( 0x57,0x17,0x8f)),68 (["Ba","Ba+2"], 1,5, "Barium", AlkEcolor, 0.438,wx.Colour(0 x00,0xc9,0x00)),69 (["La","La+3"], 2,5, "Lanthanium", Metcolor, 0.456,wx.Colour( 0x70,0xd4,0xff)),70 (["Ce","Ce+3","Ce+4"], 3.5,6.5, "Cerium", REcolor, 0.474,wx.Colour( 0xff,0xff,0xc7)),71 (["Pr","Pr+3","Pr+4"], 4.5,6.5, "Praseodymium",REcolor, 0.492,wx.Colour( 0xd9,0xff,0xc7)),72 (["Nd","Nd+3"], 5.5,6.5, "Neodymium", REcolor, 0.516,wx.Colour( 0xc7,0xff,0xc7)),73 (["Pm","Pm+3"], 6.5,6.5, "Promethium", REcolor, 0.534,wx.Colour( 0xa3,0xff,0xc7)),74 (["Sm","Sm+3"], 7.5,6.5, "Samarium", REcolor, 0.558,wx.Colour( 0x8f,0xff,0xc7)),75 (["Eu","Eu+2","Eu+3"], 8.5,6.5, "Europium", REcolor, 0.582,wx.Colour( 0x61,0xff,0xc7)),76 (["Gd","Gd+3"], 9.5,6.5, "Gadolinium", REcolor, 0.610,wx.Colour( 0x45,0xff,0xc7)),77 (["Tb","Tb+3"], 10.5,6.5, "Terbium", REcolor, 0.624,wx.Colour( 0x30,0xff,0xc7)),78 (["Dy","Dy+3"], 11.5,6.5, "Dysprosium", REcolor, 0.648,wx.Colour( 0x1f,0xff,0xc7)),79 (["Ho","Ho+3"], 12.5,6.5, "Holmium", REcolor, 0.672,wx.Colour(0 x00,0xff,0x9c)),80 (["Er","Er+3"], 13.5,6.5, "Erbium", REcolor, 0.696,wx.Colour(0 x00,0xe6,0x75)),81 (["Tm","Tm+3"], 14.5,6.5, "Thulium", REcolor, 0.723,wx.Colour(0 x00,0xd4,0x52)),82 (["Yb","Yb+2","Yb+3"], 15.5,6.5, "Ytterbium", REcolor, 0.750,wx.Colour(0 x00,0xbf,0x38)),83 (["Lu","Lu+3"], 16.5,6.5, "Lutetium", REcolor, 0.780,wx.Colour(0 x00,0xab,0x24)),84 (["Hf","Hf+4"], 3,5, "Hafnium", Metcolor, 0.804,wx.Colour( 0x4d,0xc2,0xff)),85 (["Ta","Ta+5"], 4,5, "Tantalum", Metcolor, 0.834,wx.Colour( 0x4d,0xa6,0xff)),86 (["W","W+6"], 5,5, "Tungsten", Metcolor, 0.864,wx.Colour( 0x21,0x94,0xd6)),87 (["Re",], 6,5, "Rhenium", Metcolor, 0.900,wx.Colour( 0x26,0x7d,0xab)),88 (["Os","Os+4"], 7,5, "Osmium", Metcolor, 0.919,wx.Colour( 0x26,0x66,0x96)),89 (["Ir","Ir+3","Ir+4"], 8,5, "Iridium", Metcolor, 0.948,wx.Colour( 0x17,0x54,0x87)),90 (["Pt","Pt+2","Pt+4"], 9,5, "Platinium", Metcolor, 0.984,wx.Colour( 0xd0,0xd0,0xe0)),91 (["Au","Au+1","Au+3"], 10,5, "Gold", Metcolor, 1.014,wx.Colour( 0xff,0xd1,0x23)),92 (["Hg","Hg+1","Hg+2"], 11,5, "Mercury", Metcolor, 1.046,wx.Colour( 0xb8,0xb8,0xd0)),93 (["Tl","Tl+1","Tl+3"], 12,5, "Thallium", SemMetcolor, 1.080,wx.Colour( 0xa6,0x54,0x4d)),94 (["Pb","Pb+2","Pb+4"], 13,5, "Lead", SemMetcolor, 1.116,wx.Colour( 0x57,0x59,0x61)),95 (["Bi","Bi+3","Bi+5"], 14,5, "Bismuth", SemMetcolor, 1.149,wx.Colour( 0x9e,0x4f,0xb5)),96 (["Po",], 15,5, "Polonium", SemMetcolor, 1.189,wx.Colour( 0xab,0x5c,0x00)),97 (["At",], 16,5, "Astatine", NonMetcolor, 1.224,wx.Colour( 0x75,0x4f,0x45)),98 (["Rn",], 17,5, "Radon", Noblecolor, 1.260,wx.Colour( 0x42,0x82,0x96)),99 (["Fr",], 0,6, "Francium", Alkcolor, 1.296,wx.Colour( 0x42,0x00,0x66)),100 (["Ra","Ra+2"], 1,6, "Radium", AlkEcolor, 1.332,wx.Colour(0 x00,0x7d,0x00)),101 (["Ac","Ac+3"], 2,6, "Actinium", Metcolor, 1.374,wx.Colour( 0x70,0xab,0xfa)),102 (["Th","Th+4"], 3.5,7.5, "Thorium", REcolor, 1.416,wx.Colour(0 x00,0xba,0xff)),103 (["Pa",], 4.5,7.5, "Protactinium",REcolor, 1.458,wx.Colour(0 x00,0xa1,0xff)),104 (["U","U+3","U+4","U+6"], 5.5,7.5, "Uranium", REcolor, 1.470,wx.Colour(0 x00,0x8f,0xff)),105 (["Np","Np+3","Np+4","Np+6"], 6.5,7.5, "Neptunium", REcolor, 1.536,wx.Colour(0 x00,0x80,0xff)),106 (["Pu","Pu+3","Pu+4","Pu+6"], 7.5,7.5, "Plutonium", REcolor, 1.584,wx.Colour(0 x00,0x6b,0xff)),107 (["Am",], 8.5,7.5, "Americium", REcolor, 1.626,wx.Colour( 0x54,0x5c,0xf2)),108 (["Cm",], 9.5,7.5, "Curium", REcolor, 1.669,wx.Colour( 0x78,0x5c,0xe3)),109 (["Bk",], 10.5,7.5, "Berkelium", REcolor, 1.716,wx.Colour( 0x8a,0x4f,0xe3)),110 (["Cf",], 11.5,7.5, "Californium", REcolor, 1.764,wx.Colour( 0xa1,0x36,0xd4)),111 (["Q","QA","QB","QC","QD"], 14.5,7.5, "Special form factor", REcolor, 0.000,wx.Colour( 0xa1,0x36,0xd4)),13 (["H","H-1"], 0,0, "Hydrogen", White, 0.0000,wx.Colour(255,255,255)), 14 (["He",], 17,0, "Helium", Noblecolor, 0.0000,wx.Colour(217,255,255)), 15 (["Li","Li+1"], 0,1, "Lithium", Alkcolor, 0.0004,wx.Colour(204,128,255)), 16 (["Be","Be+2"], 1,1, "Beryllium", AlkEcolor, 0.0006,wx.Colour(194,255,0)), 17 (["B",], 2,1, "Boron", NonMetcolor, 0.0012,wx.Colour(255,181,181)), 18 (["C",], 13,1, "Carbon", NonMetcolor, 0.0018,wx.Colour(144,144,144)), 19 (["N",], 14,1, "Nitrogen", NonMetcolor, 0.0030,wx.Colour(48,80,248)), 20 (["O","O-1","O-2"], 15,1, "Oxygen", NonMetcolor, 0.0042,wx.Colour(255,13,13)), 21 (["F","F-1"], 16,1, "Fluorine", NonMetcolor, 0.0054,wx.Colour(144,224,80)), 22 (["Ne",], 17,1, "Neon", Noblecolor, 0.0066,wx.Colour(179,227,245)), 23 (["Na","Na+1"], 0,2, "Sodium", Alkcolor, 0.0084,wx.Colour(171,92,242)), 24 (["Mg","Mg+2"], 1,2, "Magnesium", AlkEcolor, 0.0110,wx.Colour(138,255,0)), 25 (["Al","Al+3"], 2,2, "Aluminum", SemMetcolor, 0.0125,wx.Colour(191,166,166)), 26 (["Si","Si+4"], 13,2, "Silicon", NonMetcolor, 0.0158,wx.Colour(240,200,160)), 27 (["P",], 14,2, "Phosphorus", NonMetcolor, 0.0180,wx.Colour(255,128,0)), 28 (["S",], 15,2, "Sulphur", NonMetcolor, 0.0210,wx.Colour(255,255,48)), 29 (["Cl","Cl-1"], 16,2, "Chlorine", NonMetcolor, 0.0250,wx.Colour(31,240,31)), 30 (["Ar",], 17,2, "Argon", Noblecolor, 0.0285,wx.Colour(128,209,227)), 31 (["K","K+1"], 0,3, "Potassium", Alkcolor, 0.0320,wx.Colour(61,255,0)), 32 (["Ca","Ca+2"], 1,3, "Calcium", AlkEcolor, 0.0362,wx.Colour(61,255,0)), 33 (["Sc","Sc+3"], 2,3, "Scandium", Metcolor, 0.0410,wx.Colour(230,230,230)), 34 (["Ti","Ti+2","Ti+3","Ti+4"], 3,3, "Titanium", Metcolor, 0.0460,wx.Colour(191,194,199)), 35 (["V","V+2","V+3","V+5"], 4,3, "Vanadium", Metcolor, 0.0510,wx.Colour(166,166,171)), 36 (["Cr","Cr+2","Cr+3"], 5,3, "Chromium", Metcolor, 0.0560,wx.Colour(138,153,199)), 37 (["Mn","Mn+2","Mn+3","Mn+4"], 6,3, "Manganese", Metcolor, 0.0616,wx.Colour(156,122,199)), 38 (["Fe","Fe+2","Fe3"], 7,3, "Iron", Metcolor, 0.0680,wx.Colour(224,102,51)), 39 (["Co","Co+2","Co+3"], 8,3, "Cobalt", Metcolor, 0.0740,wx.Colour(240,144,160)), 40 (["Ni","Ni+2","Ni+3"], 9,3, "Nickel", Metcolor, 0.0815,wx.Colour(80,208,80)), 41 (["Cu","Cu+1","Cu+2"], 10,3, "Copper", Metcolor, 0.0878,wx.Colour(200,128,51)), 42 (["Zn","Zn+2"], 11,3, "Zinc", Metcolor, 0.0960,wx.Colour(125,128,176)), 43 (["Ga","Ga+3"], 12,3, "Gallium", SemMetcolor, 0.104,wx.Colour(194,143,143)), 44 (["Ge","Ge+4"], 13,3, "Germanium", SemMetcolor, 0.114,wx.Colour(102,143,143)), 45 (["As",], 14,3, "Arsenic", NonMetcolor, 0.120,wx.Colour(189,128,227)), 46 (["Se",], 15,3, "Selenium", NonMetcolor, 0.132,wx.Colour(255,161,0)), 47 (["Br","Br-1"], 16,3, "Bromine", NonMetcolor, 0.141,wx.Colour(166,41,41)), 48 (["Kr",], 17,3, "Krypton", Noblecolor, 0.150,wx.Colour(92,184,209)), 49 (["Rb","Rb+1"], 0,4, "Rubidium", Alkcolor, 0.159,wx.Colour(112,46,176)), 50 (["Sr","Sr+2"], 1,4, "Strontium", AlkEcolor, 0.171,wx.Colour(0,255,0)), 51 (["Y","Y+3"], 2,4, "Yittrium", Metcolor, 0.180,wx.Colour(148,255,255)), 52 (["Zr","Zr+4"], 3,4, "Zirconium", Metcolor, 0.192,wx.Colour(148,224,224)), 53 (["Nb","Nb+3","Nb+5"], 4,4, "Niobium", Metcolor, 0.204,wx.Colour(115,194,201)), 54 (["Mo","Mo+3","Mo+5","Mo+6"], 5,4, "Molybdenium", Metcolor, 0.216,wx.Colour(84,181,181)), 55 (["Tc",], 6,4, "Technetium", Metcolor, 0.228,wx.Colour(59,158,158)), 56 (["Ru","Ru+3","Ru+4"], 7,4, "Ruthenium", Metcolor, 0.246,wx.Colour(36,143,143)), 57 (["Rh","Rh+3","Rh+4"], 8,4, "Rhodium", Metcolor, 0.258,wx.Colour(10,125,140)), 58 (["Pd","Pd+2","Pd+4"], 9,4, "Palladium", Metcolor, 0.270,wx.Colour(0,105,133)), 59 (["Ag","Ag+1","Ag+2"], 10,4, "Silver", Metcolor, 0.285,wx.Colour(192,192,192)), 60 (["Cd","Cd+2"], 11,4, "Cadmium", Metcolor, 0.300,wx.Colour(255,217,143)), 61 (["In","In+3"], 12,4, "Indium", SemMetcolor, 0.318,wx.Colour(166,117,115)), 62 (["Sn","Sn+2","Sn+4"], 13,4, "Tin", SemMetcolor, 0.330,wx.Colour(102,128,128)), 63 (["Sb","Sb+3","Sb+5"], 14,4, "Antimony", SemMetcolor, 0.348,wx.Colour(158,99,181)), 64 (["Te",], 15,4, "Tellurium", NonMetcolor, 0.363,wx.Colour(212,122,0)), 65 (["I","I-1"], 16,4, "Iodine", NonMetcolor, 0.384,wx.Colour(148,0,148)), 66 (["Xe",], 17,4, "Xenon", Noblecolor, 0.396,wx.Colour(66,158,176)), 67 (["Cs","Cs+1"], 0,5, "Caesium", Alkcolor, 0.414,wx.Colour(87,23,143)), 68 (["Ba","Ba+2"], 1,5, "Barium", AlkEcolor, 0.438,wx.Colour(0,201,0)), 69 (["La","La+3"], 2,5, "Lanthanium", Metcolor, 0.456,wx.Colour(112,212,255)), 70 (["Ce","Ce+3","Ce+4"], 3.5,6.5, "Cerium", REcolor, 0.474,wx.Colour(255,255,199)), 71 (["Pr","Pr+3","Pr+4"], 4.5,6.5, "Praseodymium",REcolor, 0.492,wx.Colour(217,255,199)), 72 (["Nd","Nd+3"], 5.5,6.5, "Neodymium", REcolor, 0.516,wx.Colour(199,255,199)), 73 (["Pm","Pm+3"], 6.5,6.5, "Promethium", REcolor, 0.534,wx.Colour(163,255,199)), 74 (["Sm","Sm+3"], 7.5,6.5, "Samarium", REcolor, 0.558,wx.Colour(143,255,199)), 75 (["Eu","Eu+2","Eu+3"], 8.5,6.5, "Europium", REcolor, 0.582,wx.Colour(97,255,199)), 76 (["Gd","Gd+3"], 9.5,6.5, "Gadolinium", REcolor, 0.610,wx.Colour(69,255,199)), 77 (["Tb","Tb+3"], 10.5,6.5, "Terbium", REcolor, 0.624,wx.Colour(48,255,199)), 78 (["Dy","Dy+3"], 11.5,6.5, "Dysprosium", REcolor, 0.648,wx.Colour(31,255,199)), 79 (["Ho","Ho+3"], 12.5,6.5, "Holmium", REcolor, 0.672,wx.Colour(0,255,156)), 80 (["Er","Er+3"], 13.5,6.5, "Erbium", REcolor, 0.696,wx.Colour(0,230,117)), 81 (["Tm","Tm+3"], 14.5,6.5, "Thulium", REcolor, 0.723,wx.Colour(0,212,82)), 82 (["Yb","Yb+2","Yb+3"], 15.5,6.5, "Ytterbium", REcolor, 0.750,wx.Colour(0,191,56)), 83 (["Lu","Lu+3"], 16.5,6.5, "Lutetium", REcolor, 0.780,wx.Colour(0,171,36)), 84 (["Hf","Hf+4"], 3,5, "Hafnium", Metcolor, 0.804,wx.Colour(77,194,255)), 85 (["Ta","Ta+5"], 4,5, "Tantalum", Metcolor, 0.834,wx.Colour(77,166,255)), 86 (["W","W+6"], 5,5, "Tungsten", Metcolor, 0.864,wx.Colour(33,148,214)), 87 (["Re",], 6,5, "Rhenium", Metcolor, 0.900,wx.Colour(38,125,171)), 88 (["Os","Os+4"], 7,5, "Osmium", Metcolor, 0.919,wx.Colour(38,102,150)), 89 (["Ir","Ir+3","Ir+4"], 8,5, "Iridium", Metcolor, 0.948,wx.Colour(23,84,135)), 90 (["Pt","Pt+2","Pt+4"], 9,5, "Platinium", Metcolor, 0.984,wx.Colour(208,208,224)), 91 (["Au","Au+1","Au+3"], 10,5, "Gold", Metcolor, 1.014,wx.Colour(255,209,35)), 92 (["Hg","Hg+1","Hg+2"], 11,5, "Mercury", Metcolor, 1.046,wx.Colour(184,184,208)), 93 (["Tl","Tl+1","Tl+3"], 12,5, "Thallium", SemMetcolor, 1.080,wx.Colour(166,84,77)), 94 (["Pb","Pb+2","Pb+4"], 13,5, "Lead", SemMetcolor, 1.116,wx.Colour(87,89,97)), 95 (["Bi","Bi+3","Bi+5"], 14,5, "Bismuth", SemMetcolor, 1.149,wx.Colour(158,79,181)), 96 (["Po",], 15,5, "Polonium", SemMetcolor, 1.189,wx.Colour(171,92,0)), 97 (["At",], 16,5, "Astatine", NonMetcolor, 1.224,wx.Colour(117,79,69)), 98 (["Rn",], 17,5, "Radon", Noblecolor, 1.260,wx.Colour(66,130,150)), 99 (["Fr",], 0,6, "Francium", Alkcolor, 1.296,wx.Colour(66,0,102)), 100 (["Ra","Ra+2"], 1,6, "Radium", AlkEcolor, 1.332,wx.Colour(0,125,0)), 101 (["Ac","Ac+3"], 2,6, "Actinium", Metcolor, 1.374,wx.Colour(112,171,250)), 102 (["Th","Th+4"], 3.5,7.5, "Thorium", REcolor, 1.416,wx.Colour(0,186,255)), 103 (["Pa",], 4.5,7.5, "Protactinium",REcolor, 1.458,wx.Colour(0,161,255)), 104 (["U","U+3","U+4","U+6"], 5.5,7.5, "Uranium", REcolor, 1.470,wx.Colour(0,143,255)), 105 (["Np","Np+3","Np+4","Np+6"], 6.5,7.5, "Neptunium", REcolor, 1.536,wx.Colour(0,128,255)), 106 (["Pu","Pu+3","Pu+4","Pu+6"], 7.5,7.5, "Plutonium", REcolor, 1.584,wx.Colour(0,107,255)), 107 (["Am",], 8.5,7.5, "Americium", REcolor, 1.626,wx.Colour(84,92,242)), 108 (["Cm",], 9.5,7.5, "Curium", REcolor, 1.669,wx.Colour(120,92,227)), 109 (["Bk",], 10.5,7.5, "Berkelium", REcolor, 1.716,wx.Colour(138,79,227)), 110 (["Cf",], 11.5,7.5, "Californium", REcolor, 1.764,wx.Colour(161,54,212)), 111 (["Q","QA","QB","QC","QD"], 14.5,7.5, "Special form factor", REcolor, 0.000,wx.Colour(161,54,212)), 112 112 ] -
trunk/GSASII.py
r144 r155 17 17 import GSASIIplot as G2plt 18 18 import GSASIIpwdGUI as G2pdG 19 import OpenGL as ogl 19 20 20 21 # print versions … … 24 25 print "matplotlib: ",mpl.__version__ 25 26 print "numpy: ",np.__version__ 26 27 __version__ = '0.1.3' 27 print "OpenGL: ",ogl.__version__ 28 29 __version__ = '0.1.4' 28 30 29 31 # useful degree trig functions … … 264 266 if pltNum >= 0: #to avoid the startup with no plot! 265 267 pltPage = self.G2plotNB.nb.GetPage(pltNum) 266 pltPlot = pltPage.figure.gca() 268 # pltPlot = pltPage.figure.gca() 269 pltPlot = pltPage.figure 267 270 item = event.GetItem() 268 271 G2gd.MovePatternTreeToGrid(self,item) … … 520 523 parent = self.GetParent() 521 524 parent.Raise() 522 self.SetReturnCode(wx.ID_OK) 523 self.MakeModal(False) 525 self.EndModal(wx.ID_OK) 524 526 self.Destroy() 525 527 … … 527 529 parent = self.GetParent() 528 530 parent.Raise() 529 self.SetReturnCode(wx.ID_CANCEL) 530 self.MakeModal(False) 531 self.EndModal(wx.ID_CANCEL) 531 532 self.Destroy() 532 533 … … 592 593 parent = self.GetParent() 593 594 parent.Raise() 594 self.SetReturnCode(wx.ID_OK) 595 self.MakeModal(False) 595 self.EndModal(wx.ID_OK) 596 596 self.Destroy() 597 597 … … 599 599 parent = self.GetParent() 600 600 parent.Raise() 601 self.SetReturnCode(wx.ID_CANCEL) 602 self.MakeModal(False) 601 self.EndModal(wx.ID_CANCEL) 603 602 self.Destroy() 604 603 … … 810 809 SGData = {'SpGrp':'P 1'} 811 810 self.PatternTree.SetItemPyData(sub, \ 812 {'General':{'Name': 'phase name','Type':'nuclear','SGData':SGData,'Cell':[False,10.,10.,10.,90.,90.,90,1000.],813 'Scale':[False,1.0],'Pawley dmin':0.25},'Atoms':[] })811 {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,'Cell':[False,10.,10.,10.,90.,90.,90,1000.], 812 'Scale':[False,1.0],'Pawley dmin':0.25},'Atoms':[],'Drawing':{}}) 814 813 815 814 … … 841 840 i += 1 842 841 for item in DelItemList: 842 name = self.PatternTree.GetItemText(item) 843 843 self.PatternTree.Delete(item) 844 self.G2plotNB.Delete(name) 844 845 finally: 845 846 dlg.Destroy() … … 1004 1005 EXPfile = dlg.GetPath() 1005 1006 self.dirname = dlg.GetDirectory() 1006 Phase = G2IO.ReadEXPPhase( EXPfile)1007 Phase = G2IO.ReadEXPPhase(self,EXPfile) 1007 1008 finally: 1008 1009 dlg.Destroy() -
trunk/GSASIIElem.py
r153 r155 78 78 Drad = float(S[12:22]) 79 79 Arad = float(S[22:32]) 80 Vdrad = float(S[32:38]) 80 81 Color = ET.ElTable[Elements.index(Symbol)][6] 81 82 FFdata.close() 82 AtomInfo={'Symbol':Symbol,'Mass':Mass,'Z':Z,'Drad':Drad,'Arad':Arad,' Color':Color}83 AtomInfo={'Symbol':Symbol,'Mass':Mass,'Z':Z,'Drad':Drad,'Arad':Arad,'Vdrad':Vdrad,'Color':Color} 83 84 return AtomInfo 84 85 -
trunk/GSASIIIO.py
r142 r155 844 844 print 'index peak list saved' 845 845 846 def ReadEXPPhase( filename):846 def ReadEXPPhase(self,filename): 847 847 import GSASIIspc as G2spc 848 848 import GSASIIlattice as G2lat … … 930 930 Phase['General'] = {'Name':PhaseName,'Type':Ptype,'SGData':SGData,'Cell':[False,]+abc+angles+[Volume,],'Scale':[False,1.0]} 931 931 Phase['Atoms'] = Atoms 932 Phase['Drawing'] = {} 932 933 return Phase 933 934 … … 974 975 if Type[0] in '123456789': 975 976 Type = Type[1:] 976 Atom = [ int(S[22:27]),S[17:20].upper(),S[20:22],977 Atom = [S[22:27].strip(),S[17:20].upper(),S[20:22], 977 978 S[12:17].strip(),Type.strip(),'',XYZ[0],XYZ[1],XYZ[2], 978 979 float(S[55:61]),SytSym,Mult,'I',Uiso,0,0,0,0,0,0] … … 997 998 Phase['General'] = {'Name':PhaseName,'Type':'macromolecular','SGData':SGData,'Cell':[False,]+cell+[Volume,],'Scale':[False,1.0]} 998 999 Phase['Atoms'] = Atoms 1000 Phase['Drawing'] = {} 999 1001 1000 1002 return Phase -
trunk/GSASIIgrid.py
r149 r155 14 14 ] = [wx.NewId() for _init_coll_Atom_Items in range(6)] 15 15 16 [ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, 17 wxID_DRAWDELETE, wxID_DRAWFILLCELL, wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD, 18 ] = [wx.NewId() for _init_coll_DrawAtom_Items in range(8)] 19 16 20 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG, 17 21 wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, … … 40 44 41 45 def _init_coll_AtomsMenu(self,parent): 42 parent.Append(menu=self.AtomEdit, title='Edit atom list') 46 parent.Append(menu=self.AtomEdit, title='Edit') 47 48 def _init_coll_DrawAtomsMenu(self,parent): 49 parent.Append(menu=self.DrawAtomEdit, title='Edit') 43 50 44 51 def _init_coll_IndPeaksMenu(self,parent): … … 73 80 help='Select atoms to transform first') 74 81 82 def _init_coll_DrawAtom_Items(self,parent): 83 parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style', 84 help='Select atoms first') 85 parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label', 86 help='Select atoms first') 87 parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point', 88 help='View point is 1st atom selected') 89 parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms', 90 help='Add symmetry & cell equivalents to drawing set from selected atoms') 91 parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms', 92 help='Transform selected atoms by symmetry & cell translations') 93 parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere', 94 help='Fill coordination sphere for selected atoms') 95 parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell', 96 help='Fill unit cell with selected atoms') 97 parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms', 98 help='Delete atoms from drawing set') 99 75 100 def _init_coll_IndPeaks_Items(self,parent): 76 101 parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD, … … 121 146 122 147 self.AtomsMenu = wx.MenuBar() 148 self.DrawAtomsMenu = wx.MenuBar() 123 149 self.ImageMenu = wx.MenuBar() 124 150 self.MaskMenu = wx.MenuBar() … … 128 154 self.IndexMenu = wx.MenuBar() 129 155 self.AtomEdit = wx.Menu(title='') 156 self.DrawAtomEdit = wx.Menu(title='') 130 157 self.ImageEdit = wx.Menu(title='') 131 158 self.MaskEdit = wx.Menu(title='') … … 136 163 self._init_coll_AtomsMenu(self.AtomsMenu) 137 164 self._init_coll_Atom_Items(self.AtomEdit) 165 self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu) 166 self._init_coll_DrawAtom_Items(self.DrawAtomEdit) 138 167 self._init_coll_ImageMenu(self.ImageMenu) 139 168 self._init_coll_Image_Items(self.ImageEdit) -
trunk/GSASIIlattice.py
r110 r155 1 1 '''Perform lattice-related computations''' 2 2 3 import math 3 4 import numpy as np 4 5 import numpy.linalg as nl … … 118 119 '''Computes orthogonalization matrix from unit cell constants 119 120 cell is tuple with a,b,c,alpha, beta, gamma (degrees) 120 returns list of two 3x3 numpy arrays121 A for crystal to Cartesian transformations A*x = X122 B ( inverse) for Cartesian to crystal transformation B*X= x121 returns tuple of two 3x3 numpy arrays (A,B) 122 A for crystal to Cartesian transformations A*x = np.inner(A,x) = X 123 B (= inverse of A) for Cartesian to crystal transformation B*X = np.inner(B*x) = x 123 124 ''' 124 125 G,g = cell2Gmat(cell) … … 134 135 B = nl.inv(A) 135 136 return A,B 137 138 #def U2Uij(U): 139 # #returns the UIJ vector U11,U22,U33,U12,U13,U23 from tensor U 140 # return [U[0][0],U[1][1],U[2][2],U[0][1],U[0][2],U[1][2]] 141 # 142 #def Uij2U(Uij): 143 # #returns the thermal motion tensor U from Uij as numpy array 144 # return np.array([[Uij[0],Uij[3],Uij[4]],[Uij[3],Uij[1],Uij[5]],[Uij[4],Uij[5],Uij[2]]]) 145 # 146 def Uij2betaij(Uij,G): 147 ''' 148 Convert Uij to beta-ij tensors 149 input: 150 Uij - numpy array [Uij] 151 G - reciprocal metric tensor 152 returns: 153 beta-ij - numpy array [beta-ij] 154 ''' 155 pass 156 157 def criticalEllipse(prob): 158 ''' 159 Calculate critical values for probability ellipsoids from probability 160 ''' 161 if not ( 0.01 <= prob < 1.0): 162 return 1.54 163 coeff = np.array([6.44988E-09,4.16479E-07,1.11172E-05,1.58767E-04,0.00130554, 164 0.00604091,0.0114921,-0.040301,-0.6337203,1.311582]) 165 llpr = math.log(-math.log(prob)) 166 return np.polyval(coeff,llpr) 167 168 def CellBlock(nCells): 169 ''' 170 Generate block of unit cells n*n*n on a side; [0,0,0] centered, n = 2*nCells+1 171 currently only works for nCells = 0 or 1 (not >1) 172 ''' 173 if nCells: 174 N = 2*nCells+1 175 N2 = N*N 176 N3 = N*N*N 177 cellArray = [] 178 A = np.array(range(N3)) 179 cellGen = np.array([A/N2-1,A/N%N-1,A%N-1]).T 180 for cell in cellGen: 181 cellArray.append(cell) 182 return cellArray 183 else: 184 return [0,0,0] 185 186 187 188 #Permutations and Combinations 189 # Four routines: combinations,uniqueCombinations, selections & permutations 190 #These taken from Python Cookbook, 2nd Edition. 19.15 p724-726 191 # 192 def _combinators(_handle, items, n): 193 ''' factored-out common structure of all following combinators ''' 194 if n==0: 195 yield [ ] 196 return 197 for i, item in enumerate(items): 198 this_one = [ item ] 199 for cc in _combinators(_handle, _handle(items, i), n-1): 200 yield this_one + cc 201 def combinations(items, n): 202 ''' take n distinct items, order matters ''' 203 def skipIthItem(items, i): 204 return items[:i] + items[i+1:] 205 return _combinators(skipIthItem, items, n) 206 def uniqueCombinations(items, n): 207 ''' take n distinct items, order is irrelevant ''' 208 def afterIthItem(items, i): 209 return items[i+1:] 210 return _combinators(afterIthItem, items, n) 211 def selections(items, n): 212 ''' take n (not necessarily distinct) items, order matters ''' 213 def keepAllItems(items, i): 214 return items 215 return _combinators(keepAllItems, items, n) 216 def permutations(items): 217 ''' take all items, order matters ''' 218 return combinations(items, len(items)) 136 219 137 220 #reflection generation routines -
trunk/GSASIIphsGUI.py
r152 r155 24 24 cosd = lambda x: math.cos(x*math.pi/180.) 25 25 asind = lambda x: 180.*math.asin(x)/math.pi 26 27 def UpdatePhaseData(self,item,data,oldPage):28 29 class SymOpDialog(wx.Dialog):30 def __init__(self,parent,SGData):31 wx.Dialog.__init__(self,parent,-1,'Select symmetry operator',32 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)33 panel = wx.Panel(self)34 self.SGData = SGData35 self.OpSelected = [0,0,0,0,0,0]36 mainSizer = wx.BoxSizer(wx.VERTICAL)37 mainSizer.Add((5,5),0)38 if SGData['SGInv']:39 choice = ['No','Yes']40 self.inv = wx.RadioBox(panel,-1,'Choose inversion?',choices=choice)41 self.inv.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)42 mainSizer.Add(self.inv,0,wx.ALIGN_CENTER_VERTICAL)43 mainSizer.Add((5,5),0)44 if SGData['SGLatt'] != 'P':45 LattOp = G2spc.Latt2text(SGData['SGLatt']).split(';')46 self.latt = wx.RadioBox(panel,-1,'Choose cell centering?',choices=LattOp)47 self.latt.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)48 mainSizer.Add(self.latt,0,wx.ALIGN_CENTER_VERTICAL)49 mainSizer.Add((5,5),0)50 if SGData['SGLaue'] in ['-1','2/m','mmm','4/m','4/mmm']:51 Ncol = 252 else:53 Ncol = 354 OpList = []55 for M,T in SGData['SGOps']:56 OpList.append(G2spc.MT2text(M,T))57 self.oprs = wx.RadioBox(panel,-1,'Choose space group operator?',choices=OpList,58 majorDimension=Ncol)59 self.oprs.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)60 mainSizer.Add(self.oprs,0,wx.ALIGN_CENTER_VERTICAL)61 mainSizer.Add((5,5),0)62 mainSizer.Add(wx.StaticText(panel,-1," Choose unit cell?"),0,wx.ALIGN_CENTER_VERTICAL)63 mainSizer.Add((5,5),0)64 cellSizer = wx.BoxSizer(wx.HORIZONTAL)65 cellSizer.Add((5,0),0)66 cellName = ['X','Y','Z']67 self.cell = []68 for i in range(3):69 self.cell.append(wx.SpinCtrl(panel,-1,cellName[i],size=wx.Size(50,20)))70 self.cell[-1].SetRange(-3,3)71 self.cell[-1].SetValue(0)72 self.cell[-1].Bind(wx.EVT_SPINCTRL, self.OnOpSelect)73 cellSizer.Add(self.cell[-1],0,wx.ALIGN_CENTER_VERTICAL)74 mainSizer.Add(cellSizer,0,)26 27 class SymOpDialog(wx.Dialog): 28 def __init__(self,parent,SGData,New=True): 29 wx.Dialog.__init__(self,parent,-1,'Select symmetry operator', 30 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 31 panel = wx.Panel(self) 32 self.SGData = SGData 33 self.New = New 34 self.OpSelected = [0,0,0,0,0,0] 35 mainSizer = wx.BoxSizer(wx.VERTICAL) 36 mainSizer.Add((5,5),0) 37 if SGData['SGInv']: 38 choice = ['No','Yes'] 39 self.inv = wx.RadioBox(panel,-1,'Choose inversion?',choices=choice) 40 self.inv.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 41 mainSizer.Add(self.inv,0,wx.ALIGN_CENTER_VERTICAL) 42 mainSizer.Add((5,5),0) 43 if SGData['SGLatt'] != 'P': 44 LattOp = G2spc.Latt2text(SGData['SGLatt']).split(';') 45 self.latt = wx.RadioBox(panel,-1,'Choose cell centering?',choices=LattOp) 46 self.latt.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 47 mainSizer.Add(self.latt,0,wx.ALIGN_CENTER_VERTICAL) 48 mainSizer.Add((5,5),0) 49 if SGData['SGLaue'] in ['-1','2/m','mmm','4/m','4/mmm']: 50 Ncol = 2 51 else: 52 Ncol = 3 53 OpList = [] 54 for M,T in SGData['SGOps']: 55 OpList.append(G2spc.MT2text(M,T)) 56 self.oprs = wx.RadioBox(panel,-1,'Choose space group operator?',choices=OpList, 57 majorDimension=Ncol) 58 self.oprs.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 59 mainSizer.Add(self.oprs,0,wx.ALIGN_CENTER_VERTICAL) 60 mainSizer.Add((5,5),0) 61 mainSizer.Add(wx.StaticText(panel,-1," Choose unit cell?"),0,wx.ALIGN_CENTER_VERTICAL) 62 mainSizer.Add((5,5),0) 63 cellSizer = wx.BoxSizer(wx.HORIZONTAL) 64 cellSizer.Add((5,0),0) 65 cellName = ['X','Y','Z'] 66 self.cell = [] 67 for i in range(3): 68 self.cell.append(wx.SpinCtrl(panel,-1,cellName[i],size=wx.Size(50,20))) 69 self.cell[-1].SetRange(-3,3) 70 self.cell[-1].SetValue(0) 71 self.cell[-1].Bind(wx.EVT_SPINCTRL, self.OnOpSelect) 72 cellSizer.Add(self.cell[-1],0,wx.ALIGN_CENTER_VERTICAL) 73 mainSizer.Add(cellSizer,0,) 74 if self.New: 75 75 choice = ['No','Yes'] 76 76 self.new = wx.RadioBox(panel,-1,'Generate new positions?',choices=choice) 77 77 self.new.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 78 78 mainSizer.Add(self.new,0,wx.ALIGN_CENTER_VERTICAL) 79 mainSizer.Add((5,5),0) 80 81 OkBtn = wx.Button(panel,-1,"Ok") 82 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 83 cancelBtn = wx.Button(panel,-1,"Cancel") 84 cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel) 85 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 86 btnSizer.Add((20,20),1) 87 btnSizer.Add(OkBtn) 88 btnSizer.Add((20,20),1) 89 btnSizer.Add(cancelBtn) 90 btnSizer.Add((20,20),1) 91 92 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 93 panel.SetSizer(mainSizer) 94 panel.Fit() 95 self.Fit() 96 97 def OnOpSelect(self,event): 98 self.OpSelected = [0,0,0,[],0] 99 if self.SGData['SGInv']: 100 self.OpSelected[0] = self.inv.GetSelection() 101 if self.SGData['SGLatt'] != 'P': 102 self.OpSelected[1] = self.latt.GetSelection() 103 self.OpSelected[2] = self.oprs.GetSelection() 104 for i in range(3): 105 self.OpSelected[3].append(float(self.cell[i].GetValue())) 106 self.OpSelected[4] = self.new.GetSelection() 107 108 def GetSelection(self): 109 return self.OpSelected 110 111 def OnOk(self,event): 112 parent = self.GetParent() 113 parent.Raise() 114 self.SetReturnCode(wx.ID_OK) 115 self.MakeModal(False) 116 self.Destroy() 117 118 def OnCancel(self,event): 119 parent = self.GetParent() 120 parent.Raise() 121 self.SetReturnCode(wx.ID_CANCEL) 122 self.MakeModal(False) 123 self.Destroy() 124 79 mainSizer.Add((5,5),0) 80 81 OkBtn = wx.Button(panel,-1,"Ok") 82 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 83 cancelBtn = wx.Button(panel,-1,"Cancel") 84 cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel) 85 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 86 btnSizer.Add((20,20),1) 87 btnSizer.Add(OkBtn) 88 btnSizer.Add((20,20),1) 89 btnSizer.Add(cancelBtn) 90 btnSizer.Add((20,20),1) 91 92 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 93 panel.SetSizer(mainSizer) 94 panel.Fit() 95 self.Fit() 96 97 def OnOpSelect(self,event): 98 self.OpSelected = [0,0,0,[]] 99 if self.SGData['SGInv']: 100 self.OpSelected[0] = self.inv.GetSelection() 101 if self.SGData['SGLatt'] != 'P': 102 self.OpSelected[1] = self.latt.GetSelection() 103 self.OpSelected[2] = self.oprs.GetSelection() 104 for i in range(3): 105 self.OpSelected[3].append(float(self.cell[i].GetValue())) 106 if self.New: 107 self.OpSelected.append(self.new.GetSelection()) 108 109 def GetSelection(self): 110 return self.OpSelected 111 112 def OnOk(self,event): 113 parent = self.GetParent() 114 parent.Raise() 115 self.EndModal(wx.ID_OK) 116 self.Destroy() 117 118 def OnCancel(self,event): 119 parent = self.GetParent() 120 parent.Raise() 121 self.EndModal(wx.ID_CANCEL) 122 self.Destroy() 123 124 def UpdatePhaseData(self,item,data,oldPage): 125 125 126 Atoms = [] 126 127 self.SelectedRow = 0 127 128 128 129 def BookResize(event): 129 130 w,h = self.GetSize() 130 131 self.dataDisplay.SetSize(wx.Size(w,h)) 131 132 133 def UpdateGeneral(): 134 generalData = data['General'] 135 atomData = data['Atoms'] 136 generalData['AtomTypes'] = [] 137 generalData['NoAtoms'] = {} 138 generalData['BondRadii'] = [] 139 generalData['AngleRadii'] = [] 140 generalData['vdWRadii'] = [] 141 generalData['AtomMass'] = [] 142 generalData['Color'] = [] 143 colType = 1 144 colSS = 7 145 if generalData['Type'] =='macromolecular': 146 colType = 4 147 colSS = 10 148 for atom in atomData: 149 atom[colType] = atom[colType].lower().capitalize() #force to standard form 150 if generalData['AtomTypes'].count(atom[colType]): 151 generalData['NoAtoms'][atom[colType]] += atom[colSS-1]*float(atom[colSS+1]) 152 elif atom[colType] != 'UNK': 153 Info = G2elem.GetAtomInfo(atom[colType]) 154 generalData['AtomTypes'].append(atom[colType]) 155 generalData['BondRadii'].append(Info['Drad']) 156 generalData['AngleRadii'].append(Info['Arad']) 157 generalData['vdWRadii'].append(Info['Vdrad']) 158 generalData['AtomMass'].append(Info['Mass']) 159 generalData['NoAtoms'][atom[colType]] = atom[colSS-1]*float(atom[colSS+1]) 160 generalData['Color'].append(Info['Color']) 161 132 162 def FillGeneralGrid(): 133 163 rowLabels = ['Phase name','Phase type','Space group', 134 'Lattice ',' parameters','Scale factor',' Elements','No. per cell',135 'Atom weight',' ','Bond radii','Angleradii','Color']164 'Lattice ',' parameters','Scale factor','Density','Elements','No. per cell', 165 'Atom weight','Bond radii','Angle radii','vdw radii','Color'] 136 166 def SetLatticeParametersStyle(SGData,table): 137 167 clist = [1,2,3,4,5,6] … … 167 197 clist = [4,5] 168 198 for c in clist: 169 General.SetCellStyle(4,c,VERY_LIGHT_GREY,True) 170 199 General.SetCellStyle(4,c,VERY_LIGHT_GREY,True) 200 171 201 def RefreshGeneralGrid(event): 172 202 173 203 r,c = event.GetRow(),event.GetCol() 174 204 generalData['Name'] = table[0][0] … … 177 207 SpcGp = table[2][0] 178 208 SGErr,SGData = G2spc.SpcGroup(SpcGp) 179 if r == 2 and c == 0: 209 if r == 0: 210 self.G2plotNB.Rename(oldName,generalData['Name']) 211 elif r == 2 and c == 0: 180 212 if SGErr: 181 213 text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous'] … … 200 232 generalData['Scale'][1] = float(General.GetCellValue(5,1)) 201 233 General.ForceRefresh() 202 234 235 UpdateGeneral() 203 236 generalData = data['General'] 204 atomData = data['Atoms'] 205 generalData['AtomTypes'] = [] 206 generalData['NoAtoms'] = {} 207 generalData['BondRadii'] = [] 208 generalData['AngleRadii'] = [] 209 generalData['AtomMass'] = [] 210 generalData['Color'] = [] 211 colType = 1 212 colSS = 7 213 self.dataFrame.setSizePosLeft([600,350]) 214 if generalData['Type'] =='macromolecular': 215 colType = 4 216 colSS = 10 217 for atom in atomData: 218 atom[colType] = atom[colType].lower().capitalize() #force to standard form 219 if generalData['AtomTypes'].count(atom[colType]): 220 generalData['NoAtoms'][atom[colType]] += atom[colSS-1]*atom[colSS+1] 221 elif atom[colType] != 'UNK': 222 Info = G2elem.GetAtomInfo(atom[colType]) 223 generalData['AtomTypes'].append(atom[colType]) 224 generalData['BondRadii'].append(Info['Drad']) 225 generalData['AngleRadii'].append(Info['Arad']) 226 generalData['AtomMass'].append(Info['Mass']) 227 generalData['NoAtoms'][atom[colType]] = atom[colSS-1]*atom[colSS+1] 228 generalData['Color'].append(Info['Color']) 237 self.dataFrame.setSizePosLeft([750,340]) 229 238 colLabels = [] 230 239 colLabels += ['' for i in range(max(8,len(generalData['AtomTypes'])))] … … 242 251 rowLabels[6] = 'd min' 243 252 else: 244 table.append(generalData['AtomTypes']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #element list245 253 mass = 0. 246 254 for i,elem in enumerate(generalData['AtomTypes']): 247 255 mass += generalData['NoAtoms'][elem]*generalData['AtomMass'][i] 256 Volume = generalData['Cell'][7] 257 if generalData['Type'] == 'macromolecular' and mass > 0.0: 258 table.append([mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','','','']) 259 else: 260 table.append([mass/(0.6022137*Volume),'','','','','','','','']) 261 for i,elem in enumerate(generalData['AtomTypes']): 248 262 line.append(generalData['NoAtoms'][elem]) 249 Volume = generalData['Cell'][7]263 table.append(generalData['AtomTypes']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #element list 250 264 table.append(line+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #No. per cell 251 265 table.append(generalData['AtomMass']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #At. wt. 252 if generalData['Type'] == 'macromolecular' and mass > 0.0:253 table.append(['density',mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','',''])254 else:255 table.append(['density',mass/(0.6022137*Volume),'','','','','','',''])256 266 table.append(generalData['BondRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) 257 267 table.append(generalData['AngleRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) 268 table.append(generalData['vdWRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) 258 269 table.append(['','','','','','','','']) #contains colors 259 270 Types = [wg.GRID_VALUE_STRING for i in range(max(8,len(generalData['AtomTypes'])))] … … 275 286 General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,5)) 276 287 General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,5)) 277 General.SetReadOnly(9,c,isReadOnly=True)278 288 else: 279 289 General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,3)) 280 290 General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,3)) 281 for r in range(6,1 2):291 for r in range(6,13): 282 292 General.SetReadOnly(r,c,isReadOnly=True) 283 293 r = rowLabels.index('Color') … … 286 296 287 297 General.SetReadOnly(4,7,isReadOnly=True) #cell volume - no edit 288 General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated', #phase type 298 General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated', #phase type 289 299 'magnetic','macromolecular','Pawley'],False)) #- change only if no atoms 290 300 if line: #no.of atoms not zero! 291 301 General.SetReadOnly(1,0,isReadOnly=True) #can't change phase type 292 General.SetCellRenderer(4,0,wg.GridCellBoolRenderer()) #lattice parameters 302 General.SetCellRenderer(4,0,wg.GridCellBoolRenderer()) #lattice parameters 293 303 General.SetCellEditor(4,0,wg.GridCellBoolEditor()) 294 304 SetLatticeParametersStyle(SGData,table) 295 305 General.SetCellRenderer(5,1,wg.GridCellFloatRenderer(10,4)) #scale factor 296 306 General.SetCellEditor(5,1,wg.GridCellFloatEditor(10,4)) 297 General.SetCellRenderer(5,0,wg.GridCellBoolRenderer()) 307 General.SetCellRenderer(5,0,wg.GridCellBoolRenderer()) 298 308 General.SetCellEditor(5,0,wg.GridCellBoolEditor()) 299 General.SetCellRenderer( 9,1,wg.GridCellFloatRenderer(8,3))300 General.SetCellRenderer( 9,3,wg.GridCellFloatRenderer(8,3))301 309 General.SetCellRenderer(6,0,wg.GridCellFloatRenderer(8,3)) 310 General.SetCellRenderer(6,2,wg.GridCellFloatRenderer(8,3)) 311 302 312 def FillAtomsGrid(): 303 313 314 self.dataFrame.setSizePosLeft([700,300]) 304 315 generalData = data['General'] 305 316 atomData = data['Atoms'] 317 AAchoice = ": ,ALA,ARG,ASN,ASP,CYS,GLN,GLU,GLY,HIS,ILE,LEU,LYS,MET,PHE,PRO,SER,THR,TRP,TYR,VAL,MSE,HOH,UNK" 306 318 Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,X,XU,U,F,FX,FXU,FU", 307 319 wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,4', #x,y,z,frac 308 wg.GRID_VALUE_STRING,wg.GRID_VALUE_ NUMBER,wg.GRID_VALUE_CHOICE+":I,A",320 wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+":I,A", 309 321 wg.GRID_VALUE_FLOAT+':10,4', #Uiso 310 322 wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING, #Uij - placeholders … … 318 330 elif generalData['Type'] == 'macromolecular': 319 331 colLabels = ['res no','residue','chain'] + colLabels 320 Types = [wg.GRID_VALUE_ NUMBER,321 wg.GRID_VALUE_CHOICE+ ": ,ALA,ARG,ASN,ASP,CYS,GLN,GLU,GLY,HIS,ILE,LEU,LYS,MET,PHE,PRO,SER,THR,TRP,TYR,VAL,MSE,HOH,UNK",332 Types = [wg.GRID_VALUE_STRING, 333 wg.GRID_VALUE_CHOICE+AAchoice, 322 334 wg.GRID_VALUE_STRING] + Types 323 335 elif generalData['Type'] == 'modulated': 324 336 Types += [] 325 337 colLabels += [] 326 338 327 339 def RefreshAtomGrid(event): 328 340 329 341 def chkUij(Uij,CSI): 330 342 return Uij 331 343 332 344 r,c = event.GetRow(),event.GetCol() 333 345 if r < 0 and c < 0: 334 Atoms.ClearSelection() 346 for row in range(Atoms.GetNumberRows()): 347 Atoms.SelectRow(row,True) 335 348 if r < 0: #double click on col label! Change all atoms! 336 349 sel = -1 … … 341 354 choice = ['F - site fraction','X - coordinates','U - thermal parameters'] 342 355 elif Type in ['magnetic',]: 343 choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment'] 356 choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment'] 344 357 dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice) 345 358 if dlg.ShowModal() == wx.ID_OK: … … 348 361 for x in sel: 349 362 parms += choice[x][0] 350 dlg.Destroy() 363 dlg.Destroy() 351 364 elif Atoms.GetColLabelValue(c) == 'I/A': 352 365 choice = ['Isotropic','Anisotropic'] … … 357 370 dlg.Destroy() 358 371 elif Atoms.GetColLabelValue(c) == 'Type': 359 choice = generalData['AtomTypes'] 372 choice = generalData['AtomTypes'] 360 373 dlg = wx.SingleChoiceDialog(self,'Select','Atom types',choice) 361 374 if dlg.ShowModal() == wx.ID_OK: … … 411 424 Atoms.SelectRow(row,True) 412 425 dlg.Destroy() 426 elif Atoms.GetColLabelValue(c) == 'Uiso': #this needs to ask for value 427 pass #& then change all 'I' atoms 413 428 if sel >= 0 and noSkip: 414 429 ui = colLabels.index('U11') … … 434 449 Uij = atomData[r][ui:ui+6] 435 450 atomData[r][us] = (Uij[0]+Uij[1]+Uij[2])/3.0 436 atomData[r][ui:ui+6] = [0,0,0,0,0,0] 451 atomData[r][ui:ui+6] = [0,0,0,0,0,0] 437 452 Atoms.SetCellRenderer(r,us,wg.GridCellFloatRenderer(10,4)) 438 453 Atoms.SetCellStyle(r,us,WHITE,False) … … 441 456 Atoms.SetCellRenderer(r,ci,wg.GridCellStringRenderer()) 442 457 Atoms.SetCellValue(r,ci,'') 443 Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True) 458 Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True) 444 459 Atoms.SetCellValue(r,c,parms) 445 elif c < 0: #picked atom row446 self.SelectedRow = r447 460 elif Atoms.GetColLabelValue(c) in ['Name']: 448 461 atomData[r][c] = Atoms.GetCellValue(r,c) 449 462 elif Atoms.GetColLabelValue(c) in ['x','y','z']: 463 atomData[r][c] = float(Atoms.GetCellValue(r,c)) 450 464 ci = colLabels.index('x') 451 465 XYZ = atomData[r][ci:ci+3] … … 458 472 atomData[r][SScol] = Sytsym 459 473 atomData[r][Mulcol] = Mult 474 Atoms.SetCellValue(r,SScol,Sytsym) 475 Atoms.SetCellValue(r,Mulcol,str(Mult)) 460 476 if atomData[r][colLabels.index('I/A')] == 'A': 461 477 ui = colLabels.index('U11') … … 466 482 Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True) 467 483 if CSI[2][i]: 468 Atoms.SetCellStyle(r,ci,WHITE,False) 484 Atoms.SetCellStyle(r,ci,WHITE,False) 485 UpdateGeneral() 469 486 elif Atoms.GetColLabelValue(c) == 'I/A': 487 atomData[r][c] = Atoms.GetCellValue(r,c) 470 488 if atomData[r][c] == 'I': 471 489 Uij = atomData[r][c+2:c+8] … … 478 496 Atoms.SetCellRenderer(r,ci,wg.GridCellStringRenderer()) 479 497 Atoms.SetCellValue(r,ci,'') 480 Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True) 498 Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True) 481 499 else: 482 500 Uiso = atomData[r][c+1] … … 493 511 Atoms.SetCellStyle(r,ci,WHITE,False) 494 512 elif Atoms.GetColLabelValue(c) in ['U11','U22','U33','U12','U13','U23']: 513 atomData[r][c] = float(Atoms.GetCellValue(r,c)) 495 514 CSI = G2spc.GetCSuinel(atomData[r][colLabels.index('site sym')]) 496 value = atomData[r][c]497 515 iUij = CSI[0][c-colLabels.index('U11')] 498 516 for i in range(6): 499 517 if iUij == CSI[0][i]: 500 518 atomData[r][i+colLabels.index('U11')] = value*CSI[1][i] 501 Atoms.ForceRefresh() 502 519 elif Atoms.GetColLabelValue(c) == 'Uiso': 520 atomData[r][c] = float(Atoms.GetCellValue(r,c)) 521 data['Atoms'] = atomData 522 523 def RowSelect(event): 524 r,c = event.GetRow(),event.GetCol() 525 if r < 0 and c < 0: 526 if Atoms.IsSelection(): 527 Atoms.ClearSelection() 528 elif c < 0: #only row clicks 529 if event.ControlDown(): 530 if r in Atoms.GetSelectedRows(): 531 Atoms.DeselectRow(r) 532 else: 533 Atoms.SelectRow(r,True) 534 elif event.ShiftDown(): 535 for row in range(r+1): 536 Atoms.SelectRow(row,True) 537 else: 538 Atoms.ClearSelection() 539 Atoms.SelectRow(r,True) 540 503 541 def ChangeSelection(event): 504 542 r,c = event.GetRow(),event.GetCol() … … 514 552 Atoms.DeselectCol(c) 515 553 else: 516 Atoms.SelectCol(c,True) 517 554 Atoms.SelectCol(c,True) 555 518 556 def AtomTypeSelect(event): 519 557 r,c = event.GetRow(),event.GetCol() … … 528 566 atomData[r][c-1] = name[:1]+'(%d)'%(r+1) 529 567 PE.Destroy() 530 Atoms.ForceRefresh() 568 UpdateGeneral() 569 FillAtomsGrid() 531 570 else: 532 571 event.Skip() 533 572 534 573 table = [] 535 574 rowLabels = [] … … 544 583 Atoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid) 545 584 Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid) 585 Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect) 546 586 Atoms.Bind(wg.EVT_GRID_LABEL_RIGHT_CLICK, ChangeSelection) 547 587 Atoms.Bind(wg.EVT_GRID_SELECT_CELL, AtomTypeSelect) … … 571 611 if CSI[2][i]: 572 612 Atoms.SetCellStyle(row,ci,WHITE,False) 573 613 574 614 def AtomAdd(event): 575 615 atomData = data['Atoms'] … … 584 624 elif generalData['Type'] == 'magnetic': 585 625 atomData.append(['UNK','UNK','',0,0,0,1,Sytsym,Mult,0,'I',0.01,0,0,0,0,0,0,0,0,0]) 586 FillAtomsGrid() 626 FillAtomsGrid() 587 627 event.StopPropagation() 588 628 589 629 def AtomInsert(event): 590 630 indx = Atoms.GetSelectedRows() … … 602 642 elif generalData['Type'] == 'magnetic': 603 643 atomData.insert(indx,['UNK','UNK','',0,0,0,1,Sytsym,Mult,'I',0.01,0,0,0,0,0,0,0,0,0]) 604 FillAtomsGrid() 644 FillAtomsGrid() 605 645 event.StopPropagation() 606 646 607 647 def AtomDelete(event): 608 648 indx = Atoms.GetSelectedRows() … … 612 652 for ind in indx: 613 653 atom = atomData[ind] 614 del atomData[ind] 615 FillAtomsGrid() 654 del atomData[ind] 655 FillAtomsGrid() 616 656 event.StopPropagation() 617 657 618 658 def AtomRefine(event): 659 colLabels = [Atoms.GetColLabelValue(c) for c in range(Atoms.GetNumberCols())] 660 c = colLabels.index('refine') 619 661 indx = Atoms.GetSelectedRows() 620 662 if indx: … … 624 666 if Type in ['nuclear','macromolecular']: 625 667 choice = ['F - site fraction','X - coordinates','U - thermal parameters'] 626 elif Type in ['magnetic',]:627 choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment'] 668 elif Type == 'magnetic': 669 choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment'] 628 670 dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice) 629 671 if dlg.ShowModal() == wx.ID_OK: … … 631 673 parms = '' 632 674 for x in sel: 633 parms += choice[x][0] 634 dlg.Destroy() 635 colLabels = [Atoms.GetColLabelValue(c) for c in range(Atoms.GetNumberCols())] 636 c = colLabels.index('refine') 637 for r in indx: 638 atomData[r][c] = parms 639 Atoms.ForceRefresh() 640 641 def AtomModify(event): 675 parms += choice[x][0] 676 for r in indx: 677 atomData[r][c] = parms 678 Atoms.ForceRefresh() 679 dlg.Destroy() 680 681 def AtomModify(event): #intent to implement global modifications (+,-,*,/, etc.)? 642 682 indx = Atoms.GetSelectedRows() 643 683 if indx: 644 684 atomData = data['Atoms'] 645 685 generalData = data['General'] 646 647 def AtomTransform(event): 686 687 def AtomTransform(event): 648 688 indx = Atoms.GetSelectedRows() 649 689 if indx: … … 656 696 generalData = data['General'] 657 697 SGData = generalData['SGData'] 658 dlg = SymOpDialog(self,SGData )698 dlg = SymOpDialog(self,SGData,True) 659 699 try: 660 700 if dlg.ShowModal() == wx.ID_OK: … … 663 703 cent = SGData['SGCen'][Cent] 664 704 M,T = SGData['SGOps'][Opr] 705 print M,T 665 706 for ind in indx: 666 707 XYZ = np.array(atomData[ind][cx:cx+3]) … … 678 719 Uij = atom[cuij:cuij+6] 679 720 U = G2spc.Uij2U(Uij) 680 U = np.inner(np.inner(M .T,U),M)721 U = np.inner(np.inner(M,U),M) 681 722 Uij = G2spc.U2Uij(U) 682 723 atom[cuij:cuij+6] = Uij … … 687 728 Atoms.ClearSelection() 688 729 if New: 689 FillAtomsGrid() 690 else: 730 FillAtomsGrid() 731 else: 691 732 Atoms.ForceRefresh() 733 734 def SetupDrawingData(): 735 generalData = data['General'] 736 atomData = data['Atoms'] 737 AA3letter = ['ALA','ARG','ASN','ASP','CYS','GLN','GLU','GLY','HIS','ILE', 738 'LEU','LYS','MET','PHE','PRO','SER','THR','TRP','TYR','VAL','MSE','HOH','WAT','UNK'] 739 AA1letter = ['A','R','N','D','C','Q','E','G','H','I', 740 'L','K','M','F','P','S','T','W','Y','V','M',' ',' ',' '] 741 defaultDrawing = {'viewPoint':[[0.5,0.5,0.5],[0,0]],'showHydrogen':True,'backColor':[0,0,0],'depthFog':False, 742 'Zclip':50.0,'cameraPos':50.,'pickItem':'Atoms','showBadContacts':False, 743 'bondRadius':0.1,'ballScale':0.33,'vdwScale':0.67,'ellipseProb':50,'sizeH':0.50,'packing':False, 744 'unitCellBox':False,'showABC':True,'fogFactor':1.0,'showSymElem':False,'selectedAtoms':[], 745 'Rotation':[0.0,0.0,0.0,np.array([0,0])],'bondList':{}} 746 try: 747 drawingData = data['Drawing'] 748 except KeyError: 749 data['Drawing'] = {} 750 drawingData = data['Drawing'] 751 if not drawingData: #fill with defaults if empty 752 drawingData = copy.copy(defaultDrawing) 753 drawingData['Atoms'] = [] 754 if not drawingData['Atoms']: 755 for atom in atomData: 756 if generalData['Type'] == 'nuclear': 757 drawingData['Atoms'].append(atom[:2]+atom[3:6]+['1',]+['lines',]+ 758 ['',]+atom[9:17]+[[]]) 759 drawingData['atomPtrs'] = [2,1,6] #x, type & style 760 elif generalData['Type'] == 'macromolecular': 761 try: 762 oneLetter = AA3letter.index(atom[1]) 763 except ValueError: 764 oneLetter = -1 765 drawingData['Atoms'].append([atom[1].strip()+atom[0],]+ 766 [AA1letter[oneLetter]+atom[0],]+atom[2:5]+ 767 atom[6:9]+['1',]+['lines',]+['',]+atom[12:20]+[[]]) 768 drawingData['atomPtrs'] = [5,4,9] #x, type & style 769 elif generalData['Type'] == 'magnetic': 770 drawingData['Atoms'].append(atom[:2]+atom[3:6]+['lines',]+['',]+atom[9:20]+[[]]) 771 # elif generalData['Type'] == 'modulated': 772 # ????? for future 773 data['Drawing'] = drawingData 774 775 def UpdateDrawAtoms(): 776 self.dataFrame.setSizePosLeft([600,300]) 777 generalData = data['General'] 778 SetupDrawingData() 779 drawingData = data['Drawing'] 780 atomData = drawingData['Atoms'] 781 Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING, 782 wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5', #x,y,z 783 wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,lines,vdW balls,sticks,balls & sticks,ellipsoids,polyhedra", 784 wg.GRID_VALUE_CHOICE+": ,type,name,number",wg.GRID_VALUE_STRING,] 785 styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','polyhedra'] 786 labelChoice = [' ','type','name','number'] 787 colLabels = ['Name','Type','x','y','z','Sym Op','Style','Label','I/A'] 788 if generalData['Type'] == 'macromolecular': 789 colLabels = ['Residue','1-letter','Chain'] + colLabels 790 Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING]+Types 791 Types[8] = wg.GRID_VALUE_CHOICE+": ,lines,vdW balls,sticks,balls & sticks,ellipsoids,ribbons,schematic" 792 styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','ribbons','schematic'] 793 labelChoice = [' ','type','name','number','residue','1-letter','chain'] 794 Types[9] = wg.GRID_VALUE_CHOICE+": ,type,name,number,residue,1-letter,chain" 795 # elif generalData['Type'] == 'modulated': 796 # Types += [] 797 # colLabels += [] 798 799 def RefreshAtomGrid(event): 800 801 def SetChoice(name,c,n=0): 802 choice = [] 803 for r in range(len(atomData)): 804 if n: 805 srchStr = str(atomData[r][c][:n]) 806 else: 807 srchStr = str(atomData[r][c]) 808 if srchStr not in choice: 809 if n: 810 choice.append(str(atomData[r][c][:n])) 811 else: 812 choice.append(str(atomData[r][c])) 813 choice.sort() 814 815 dlg = wx.MultiChoiceDialog(self,'Select',name,choice) 816 if dlg.ShowModal() == wx.ID_OK: 817 sel = dlg.GetSelections() 818 parms = [] 819 for x in sel: 820 parms.append(choice[x]) 821 noSkip = False 822 drawAtoms.ClearSelection() 823 drawingData['selectedAtoms'] = [] 824 for row in range(len(atomData)): 825 test = atomData[row][c] 826 if n: 827 test = test[:n] 828 if test in parms: 829 drawAtoms.SelectRow(row,True) 830 drawingData['selectedAtoms'].append(row) 831 dlg.Destroy() 832 833 r,c = event.GetRow(),event.GetCol() 834 if r < 0 and c < 0: 835 for row in range(drawAtoms.GetNumberRows()): 836 drawingData['selectedAtoms'].append(row) 837 drawAtoms.SelectRow(row,True) 838 elif r < 0: #dclick on col label 839 sel = -1 840 Parms = False 841 noSkip = True 842 if drawAtoms.GetColLabelValue(c) == 'Style': 843 dlg = wx.SingleChoiceDialog(self,'Select','Atom drawing style',styleChoice) 844 if dlg.ShowModal() == wx.ID_OK: 845 sel = dlg.GetSelection() 846 parms = styleChoice[sel] 847 for r in range(len(atomData)): 848 atomData[r][c] = parms 849 drawAtoms.SetCellValue(r,c,parms) 850 FindBonds() 851 G2plt.PlotStructure(self,data) 852 dlg.Destroy() 853 elif drawAtoms.GetColLabelValue(c) == 'Label': 854 dlg = wx.SingleChoiceDialog(self,'Select','Atom labelling style',labelChoice) 855 if dlg.ShowModal() == wx.ID_OK: 856 sel = dlg.GetSelection() 857 parms = labelChoice[sel] 858 for r in range(len(atomData)): 859 atomData[r][c] = parms 860 drawAtoms.SetCellValue(r,c,parms) 861 G2plt.PlotStructure(self,data) 862 dlg.Destroy() 863 elif drawAtoms.GetColLabelValue(c) == 'Residue': 864 SetChoice('Residue',c,3) 865 elif drawAtoms.GetColLabelValue(c) == '1-letter': 866 SetChoice('1-letter',c,1) 867 elif drawAtoms.GetColLabelValue(c) == 'Chain': 868 SetChoice('Chain',c) 869 elif drawAtoms.GetColLabelValue(c) == 'Name': 870 SetChoice('Name',c) 871 elif drawAtoms.GetColLabelValue(c) == 'Sym Op': 872 SetChoice('Name',c) 873 elif drawAtoms.GetColLabelValue(c) == 'Type': 874 SetChoice('Type',c) 875 elif drawAtoms.GetColLabelValue(c) in ['x','y','z','I/A']: 876 drawAtoms.ClearSelection() 877 else: 878 if drawAtoms.GetColLabelValue(c) in ['Style','Label']: 879 atomData[r][c] = drawAtoms.GetCellValue(r,c) 880 FindBonds() 881 G2plt.PlotStructure(self,data) 882 883 def RowSelect(event): 884 r,c = event.GetRow(),event.GetCol() 885 if r < 0 and c < 0: 886 if drawAtoms.IsSelection(): 887 drawAtoms.ClearSelection() 888 elif c < 0: #only row clicks 889 if event.ControlDown(): 890 if r in drawAtoms.GetSelectedRows(): 891 drawAtoms.DeselectRow(r) 892 else: 893 drawAtoms.SelectRow(r,True) 894 elif event.ShiftDown(): 895 for row in range(r+1): 896 drawAtoms.SelectRow(row,True) 897 else: 898 drawAtoms.ClearSelection() 899 drawAtoms.SelectRow(r,True) 900 drawingData['selectedAtoms'] = [] 901 drawingData['selectedAtoms'] = drawAtoms.GetSelectedRows() 902 903 table = [] 904 rowLabels = [] 905 for i,atom in enumerate(drawingData['Atoms']): 906 table.append(atom[:colLabels.index('I/A')+1]) 907 rowLabels.append(str(i+1)) 908 909 atomTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types) 910 drawAtoms.SetTable(atomTable, True) 911 drawAtoms.SetMargins(0,0) 912 drawAtoms.AutoSizeColumns(True) 913 drawAtoms.SetColSize(colLabels.index('Style'),80) 914 drawAtoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid) 915 drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid) 916 drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect) 917 indx = drawingData['selectedAtoms'] 918 if indx: 919 for r in range(len(atomData)): 920 if r in indx: 921 drawAtoms.SelectRow(r) 922 for c in range(len(colLabels)): 923 if colLabels[c] not in ['Style','Label']: 924 attr = wg.GridCellAttr() #needs to be here - gets lost if outside loop! 925 attr.SetReadOnly(True) 926 attr.SetBackgroundColour(VERY_LIGHT_GREY) 927 drawAtoms.SetColAttr(c,attr) 928 FindBonds() 929 G2plt.PlotStructure(self,data) 930 931 def DrawAtomStyle(event): 932 indx = drawAtoms.GetSelectedRows() 933 if indx: 934 generalData = data['General'] 935 atomData = data['Drawing']['Atoms'] 936 cx,ct,cs = data['Drawing']['atomPtrs'] 937 styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','polyhedra'] 938 if generalData['Type'] == 'macromolecular': 939 styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','ribbons','schematic'] 940 dlg = wx.SingleChoiceDialog(self,'Select','Atom drawing style',styleChoice) 941 if dlg.ShowModal() == wx.ID_OK: 942 sel = dlg.GetSelection() 943 parms = styleChoice[sel] 944 for r in indx: 945 atomData[r][cs] = parms 946 drawAtoms.SetCellValue(r,cs,parms) 947 dlg.Destroy() 948 FindBonds() 949 G2plt.PlotStructure(self,data) 950 951 def DrawAtomLabel(event): 952 indx = drawAtoms.GetSelectedRows() 953 if indx: 954 generalData = data['General'] 955 atomData = data['Drawing']['Atoms'] 956 cx,ct,cs = data['Drawing']['atomPtrs'] 957 styleChoice = [' ','type','name','number'] 958 if generalData['Type'] == 'macromolecular': 959 styleChoice = [' ','type','name','number','residue','1-letter','chain'] 960 dlg = wx.SingleChoiceDialog(self,'Select','Atom label style',styleChoice) 961 if dlg.ShowModal() == wx.ID_OK: 962 sel = dlg.GetSelection() 963 parms = styleChoice[sel] 964 for r in indx: 965 atomData[r][cs+1] = parms 966 drawAtoms.SetCellValue(r,cs+1,parms) 967 dlg.Destroy() 968 G2plt.PlotStructure(self,data) 969 970 def SetViewPoint(event): 971 indx = drawAtoms.GetSelectedRows() 972 if indx: 973 atomData = data['Drawing']['Atoms'] 974 cx = data['Drawing']['atomPtrs'][0] 975 data['Drawing']['viewPoint'] = [atomData[indx[0]][cx:cx+3],[indx[0],0]] 976 drawAtoms.ClearSelection() #do I really want to do this? 977 G2plt.PlotStructure(self,data) 978 979 def noDuplicate(xyz,atomData): #be careful where this is used - it's slow 980 cx = data['Drawing']['atomPtrs'][0] 981 if True in [np.allclose(np.array(xyz),np.array(atom[cx:cx+3]),atol=0.0002) for atom in atomData]: 982 return False 983 else: 984 return True 985 986 def AddSymEquiv(event): 987 indx = drawAtoms.GetSelectedRows() 988 indx.sort() 989 if indx: 990 colLabels = [drawAtoms.GetColLabelValue(c) for c in range(drawAtoms.GetNumberCols())] 991 cx = colLabels.index('x') 992 cuia = colLabels.index('I/A') 993 cuij = cuia+2 994 atomData = data['Drawing']['Atoms'] 995 generalData = data['General'] 996 SGData = generalData['SGData'] 997 dlg = SymOpDialog(self,SGData,False) 998 try: 999 if dlg.ShowModal() == wx.ID_OK: 1000 Inv,Cent,Opr,Cell = dlg.GetSelection() 1001 Cell = np.array(Cell) 1002 cent = SGData['SGCen'][Cent] 1003 M,T = SGData['SGOps'][Opr] 1004 for ind in indx: 1005 XYZ = np.array(atomData[ind][cx:cx+3]) 1006 XYZ = np.inner(M,XYZ)+T 1007 if Inv: 1008 XYZ = -XYZ 1009 XYZ = XYZ+cent+Cell 1010 if noDuplicate(XYZ,atomData): 1011 atom = copy.copy(atomData[ind]) 1012 atom[cx:cx+3] = XYZ 1013 atom[cx+3] = str(((Opr+1)+100*Cent)*(1-2*Inv))+'+'+ \ 1014 str(int(Cell[0]))+str(int(Cell[1]))+str(int(Cell[2])) 1015 if atom[cuia] == 'A': 1016 Uij = atom[cuij:cuij+6] 1017 U = G2spc.Uij2U(Uij) 1018 U = np.inner(np.inner(M,U),M) 1019 Uij = G2spc.U2Uij(U) 1020 atom[cuij:cuij+6] = Uij 1021 atomData.append(atom) 1022 finally: 1023 dlg.Destroy() 1024 UpdateDrawAtoms() 1025 G2plt.PlotStructure(self,data) 1026 1027 def TransformSymEquiv(event): 1028 indx = drawAtoms.GetSelectedRows() 1029 indx.sort() 1030 if indx: 1031 atomData = data['Drawing']['Atoms'] 1032 colLabels = [drawAtoms.GetColLabelValue(c) for c in range(drawAtoms.GetNumberCols())] 1033 cx = colLabels.index('x') 1034 cuia = colLabels.index('I/A') 1035 cuij = cuia+2 1036 atomData = data['Drawing']['Atoms'] 1037 generalData = data['General'] 1038 SGData = generalData['SGData'] 1039 dlg = SymOpDialog(self,SGData,False) 1040 try: 1041 if dlg.ShowModal() == wx.ID_OK: 1042 Inv,Cent,Opr,Cell = dlg.GetSelection() 1043 Cell = np.array(Cell) 1044 cent = SGData['SGCen'][Cent] 1045 M,T = SGData['SGOps'][Opr] 1046 for ind in indx: 1047 XYZ = np.array(atomData[ind][cx:cx+3]) 1048 XYZ = np.inner(M,XYZ)+T 1049 if Inv: 1050 XYZ = -XYZ 1051 XYZ = XYZ+cent+Cell 1052 atom = atomData[ind] 1053 atom[cx:cx+3] = XYZ 1054 atom[cx+3] = str(((Opr+1)+100*Cent)*(1-2*Inv))+'+'+ \ 1055 str(int(Cell[0]))+str(int(Cell[1]))+str(int(Cell[2])) 1056 if atom[cuia] == 'A': 1057 Uij = atom[cuij:cuij+6] 1058 U = G2spc.Uij2U(Uij) 1059 U = np.inner(np.inner(M,U),M) 1060 Uij = G2spc.U2Uij(U) 1061 atom[cuij:cuij+6] = Uij 1062 data['Drawing']['Atoms'] = atomData 1063 finally: 1064 dlg.Destroy() 1065 UpdateDrawAtoms() 1066 G2plt.PlotStructure(self,data) 1067 1068 def FillCoordSphere(event): 1069 generalData = data['General'] 1070 Amat,Bmat = G2lat.cell2AB(generalData['Cell'][1:7]) 1071 radii = generalData['BondRadii'] 1072 atomTypes = generalData['AtomTypes'] 1073 try: 1074 indH = atomTypes.index('H') 1075 radii[indH] = 0.5 1076 except: 1077 pass 1078 indx = drawAtoms.GetSelectedRows() 1079 if indx: 1080 indx.sort() 1081 atomData = data['Drawing']['Atoms'] 1082 numAtoms = len(atomData) 1083 cx,ct,cs = data['Drawing']['atomPtrs'] 1084 generalData = data['General'] 1085 SGData = generalData['SGData'] 1086 cellArray = G2lat.CellBlock(1) 1087 for ind in indx: 1088 atomA = atomData[ind] 1089 xyzA = np.array(atomA[cx:cx+3]) 1090 indA = atomTypes.index(atomA[ct]) 1091 for atomB in atomData[:numAtoms]: 1092 indB = atomTypes.index(atomB[ct]) 1093 sumR = radii[indA]+radii[indB] 1094 xyzB = np.array(atomB[cx:cx+3]) 1095 for xyz in cellArray+xyzB: 1096 dist = np.sqrt(np.sum(np.inner(Amat,xyz-xyzA)**2)) 1097 if 0 < dist <= 0.85*sumR: 1098 if noDuplicate(xyz,atomData): 1099 newAtom = atomB[:] 1100 newAtom[cx:cx+3] = xyz 1101 atomData.append(newAtom) 1102 data['Drawing']['Atoms'] = atomData 1103 UpdateDrawAtoms() 1104 FindBonds() 1105 G2plt.PlotStructure(self,data) 1106 1107 def FillUnitCell(event): 1108 indx = drawAtoms.GetSelectedRows() 1109 indx.sort() 1110 if indx: 1111 atomData = data['Drawing']['Atoms'] 1112 colLabels = [drawAtoms.GetColLabelValue(c) for c in range(drawAtoms.GetNumberCols())] 1113 cx = colLabels.index('x') 1114 cuia = colLabels.index('I/A') 1115 cuij = cuia+2 1116 generalData = data['General'] 1117 SGData = generalData['SGData'] 1118 for ind in indx: 1119 atom = atomData[ind] 1120 XYZ = np.array(atom[cx:cx+3]) 1121 if atom[cuia] == 'A': 1122 Uij = atom[cuij:cuij+6] 1123 result = G2spc.GenAtom(XYZ,SGData,False,Uij) 1124 for item in result: 1125 atom = copy.copy(atomData[ind]) 1126 atom[cx:cx+3] = item[0] 1127 atom[cx+3] = str(item[2])+'+000' 1128 atom[cuij:cuij+6] = item[1] 1129 Opp = G2spc.Opposite(item[0]) 1130 for xyz in Opp: 1131 if noDuplicate(xyz,atomData): 1132 atom[cx:cx+3] = xyz 1133 atomData.append(atom[:]) 1134 else: 1135 result = G2spc.GenAtom(XYZ,SGData,False) 1136 for item in result: 1137 atom = copy.copy(atomData[ind]) 1138 atom[cx:cx+3] = item[0] 1139 atom[cx+3] = str(item[1])+'+000' 1140 Opp = G2spc.Opposite(item[0]) 1141 for xyz in Opp: 1142 if noDuplicate(xyz,atomData): 1143 atom[cx:cx+3] = xyz 1144 atomData.append(atom[:]) 1145 data['Drawing']['Atoms'] = atomData 1146 1147 UpdateDrawAtoms() 1148 G2plt.PlotStructure(self,data) 1149 1150 def FindBonds6(): 1151 cx,ct,cs = data['Drawing']['atomPtrs'] 1152 atomData = data['Drawing']['Atoms'] 1153 generalData = data['General'] 1154 Amat,Bmat = G2lat.cell2AB(generalData['Cell'][1:7]) 1155 radii = generalData['BondRadii'] 1156 atomTypes = generalData['AtomTypes'] 1157 try: 1158 indH = atomTypes.index('H') 1159 radii[indH] = 0.5 1160 except: 1161 pass 1162 for atom in atomData: 1163 atom[-1] = [] #clear out old bonds 692 1164 693 def UpdateDrawing(): 694 print 'Drawing' 1165 1166 def FindBonds(): 1167 cx,ct,cs = data['Drawing']['atomPtrs'] 1168 atomData = data['Drawing']['Atoms'] 1169 generalData = data['General'] 1170 Amat,Bmat = G2lat.cell2AB(generalData['Cell'][1:7]) 1171 radii = generalData['BondRadii'] 1172 atomTypes = generalData['AtomTypes'] 1173 try: 1174 indH = atomTypes.index('H') 1175 radii[indH] = 0.5 1176 except: 1177 pass 1178 for atom in atomData: 1179 atom[-1] = [] #clear out old bonds 1180 for i,atomA in enumerate(atomData): 1181 if atomA[cs] in ['lines','sticks','ellipsoids','balls & sticks','polyhedra']: 1182 xyzA = np.array(atomA[cx:cx+3]) 1183 indA = atomTypes.index(atomA[ct]) 1184 for j,atomB in enumerate(atomData): 1185 xyzB = np.array(atomB[cx:cx+3]) 1186 indB = atomTypes.index(atomB[ct]) 1187 Dx = xyzB-xyzA 1188 DX = np.inner(Amat,Dx) 1189 dist = np.sqrt(np.sum(DX**2)) 1190 sumR = radii[indA]+radii[indB] 1191 if 0 < dist <= 0.85*sumR: 1192 inc = i+1 1193 if atomA[cs] == 'polyhedra': 1194 atomA[-1].append(np.inner(Amat,Dx)) 1195 elif atomB[cs] != 'polyhedra': 1196 atomA[-1].append(Dx*radii[indA]/sumR) 1197 atomB[-1].append(-Dx*radii[indB]/sumR) 1198 1199 def DrawAtomsDelete(event): 1200 indx = drawAtoms.GetSelectedRows() 1201 indx.sort() 1202 if indx: 1203 atomData = data['Drawing']['Atoms'] 1204 indx.reverse() 1205 for ind in indx: 1206 atom = atomData[ind] 1207 del atomData[ind] 1208 UpdateDrawAtoms() 1209 G2plt.PlotStructure(self,data) 1210 event.StopPropagation() 1211 1212 def UpdateDrawOptions(): 1213 import copy 1214 import wx.lib.colourselect as wcs 1215 self.dataFrame.setSizePosLeft([300,470]) 1216 generalData = data['General'] 1217 SetupDrawingData() 1218 drawingData = data['Drawing'] 1219 if generalData['Type'] == 'nuclear': 1220 pickChoice = ['Atoms','Bonds','Torsions','Planes'] 1221 elif generalData['Type'] == 'macromolecular': 1222 pickChoice = ['Atoms','Residues','Chains','Bonds','Torsions','Planes','phi/psi'] 1223 1224 def OnZclip(event): 1225 drawingData['Zclip'] = Zclip.GetValue() 1226 ZclipTxt.SetLabel('Z clipping: '+'%.2fA'%(drawingData['Zclip']*drawingData['cameraPos']/100.)) 1227 G2plt.PlotStructure(self,data) 1228 1229 def OnCameraPos(event): 1230 drawingData['cameraPos'] = cameraPos.GetValue() 1231 cameraPosTxt.SetLabel('Camera Position: '+'%.2f'%(drawingData['cameraPos'])) 1232 ZclipTxt.SetLabel('Z clipping: '+'%.2fA'%(drawingData['Zclip']*drawingData['cameraPos']/100.)) 1233 G2plt.PlotStructure(self,data) 1234 1235 def OnBackColor(event): 1236 drawingData['backColor'] = event.GetValue() 1237 G2plt.PlotStructure(self,data) 1238 1239 def OnDepthFog(event): 1240 drawingData['depthFog'] = depthFog.GetValue() 1241 G2plt.PlotStructure(self,data) 1242 1243 def OnFogFactor(event): 1244 drawingData['fogFactor'] = fogFactor.GetValue()/100. 1245 fogFactorTxt.SetLabel('Fog factor: '+'%.2f'%(drawingData['fogFactor'])) 1246 G2plt.PlotStructure(self,data) 1247 1248 def OnBallScale(event): 1249 drawingData['ballScale'] = ballScale.GetValue()/100. 1250 ballScaleTxt.SetLabel('Ball scale: '+'%.2f'%(drawingData['ballScale'])) 1251 G2plt.PlotStructure(self,data) 1252 1253 def OnVdWScale(event): 1254 drawingData['vdwScale'] = vdwScale.GetValue()/100. 1255 vdwScaleTxt.SetLabel('van der Waals scale: '+'%.2f'%(drawingData['vdwScale'])) 1256 G2plt.PlotStructure(self,data) 1257 1258 def OnEllipseProb(event): 1259 drawingData['ellipseProb'] = ellipseProb.GetValue() 1260 ellipseProbTxt.SetLabel('Ellipsoid probability: '+'%d%%'%(drawingData['ellipseProb'])) 1261 G2plt.PlotStructure(self,data) 1262 1263 def OnBondRadius(event): 1264 drawingData['bondRadius'] = bondRadius.GetValue()/100. 1265 bondRadiusTxt.SetLabel('Bond radius, A: '+'%.2f'%(drawingData['bondRadius'])) 1266 G2plt.PlotStructure(self,data) 1267 1268 def OnShowABC(event): 1269 drawingData['showABC'] = showABC.GetValue() 1270 G2plt.PlotStructure(self,data) 1271 1272 def OnShowUnitCell(event): 1273 drawingData['unitCellBox'] = unitCellBox.GetValue() 1274 G2plt.PlotStructure(self,data) 1275 1276 def OnPacking(event): 1277 drawingData['packing'] = packing.GetValue() 1278 1279 def OnShowBadContacts(event): 1280 drawingData['showBadContacts'] = showBadContacts.GetValue() 1281 1282 def OnShowSymElem(event): 1283 drawingData['showSymElem'] = showSymElem.GetValue() 1284 1285 def OnShowHyd(event): 1286 drawingData['showHydrogen'] = showHydrogen.GetValue() 1287 G2plt.PlotStructure(self,data) 1288 1289 def OnSizeHatoms(event): 1290 try: 1291 value = max(0.1,min(1.2,float(sizeH.GetValue()))) 1292 except ValueError: 1293 value = 0.5 1294 drawingData['sizeH'] = value 1295 sizeH.SetValue("%.2f"%(value)) 1296 G2plt.PlotStructure(self,data) 1297 1298 def OnPickItem(event): 1299 drawingData['pickItem'] = pickChoice[pickItem.GetSelection()] 1300 1301 dataDisplay = wx.Panel(drawOptions) 1302 mainSizer = wx.BoxSizer(wx.VERTICAL) 1303 mainSizer.Add((5,5),0) 1304 mainSizer.Add(wx.StaticText(dataDisplay,-1,'Drawing controls:'),0,wx.ALIGN_CENTER_VERTICAL) 1305 mainSizer.Add((5,5),0) 695 1306 1307 slopSizer = wx.BoxSizer(wx.HORIZONTAL) 1308 slideSizer = wx.FlexGridSizer(7,2,5,0) 1309 slideSizer.AddGrowableCol(1,1) 1310 1311 cameraPosTxt = wx.StaticText(dataDisplay,-1, 1312 'Camera Position: '+'%.2f'%(drawingData['cameraPos']),name='cameraPos') 1313 slideSizer.Add(cameraPosTxt,0,wx.ALIGN_CENTER_VERTICAL) 1314 cameraPos = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=drawingData['cameraPos'],name='cameraSlider') 1315 cameraPos.SetRange(10,500) 1316 cameraPos.Bind(wx.EVT_SLIDER, OnCameraPos) 1317 slideSizer.Add(cameraPos,1,wx.EXPAND|wx.RIGHT) 1318 1319 ZclipTxt = wx.StaticText(dataDisplay,-1,'Z clipping: '+'%.2fA'%(drawingData['Zclip']*drawingData['cameraPos']/100.)) 1320 slideSizer.Add(ZclipTxt,0,wx.ALIGN_CENTER_VERTICAL) 1321 Zclip = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=drawingData['Zclip']) 1322 Zclip.SetRange(1,99) 1323 Zclip.Bind(wx.EVT_SLIDER, OnZclip) 1324 slideSizer.Add(Zclip,1,wx.EXPAND|wx.RIGHT) 1325 1326 vdwScaleTxt = wx.StaticText(dataDisplay,-1,'van der Waals scale: '+'%.2f'%(drawingData['vdwScale'])) 1327 slideSizer.Add(vdwScaleTxt,0,wx.ALIGN_CENTER_VERTICAL) 1328 vdwScale = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['vdwScale'])) 1329 vdwScale.Bind(wx.EVT_SLIDER, OnVdWScale) 1330 slideSizer.Add(vdwScale,1,wx.EXPAND|wx.RIGHT) 1331 1332 ellipseProbTxt = wx.StaticText(dataDisplay,-1,'Ellipsoid probability: '+'%d%%'%(drawingData['ellipseProb'])) 1333 slideSizer.Add(ellipseProbTxt,0,wx.ALIGN_CENTER_VERTICAL) 1334 ellipseProb = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=drawingData['ellipseProb']) 1335 ellipseProb.SetRange(1,99) 1336 ellipseProb.Bind(wx.EVT_SLIDER, OnEllipseProb) 1337 slideSizer.Add(ellipseProb,1,wx.EXPAND|wx.RIGHT) 1338 1339 ballScaleTxt = wx.StaticText(dataDisplay,-1,'Ball scale: '+'%.2f'%(drawingData['ballScale'])) 1340 slideSizer.Add(ballScaleTxt,0,wx.ALIGN_CENTER_VERTICAL) 1341 ballScale = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['ballScale'])) 1342 ballScale.Bind(wx.EVT_SLIDER, OnBallScale) 1343 slideSizer.Add(ballScale,1,wx.EXPAND|wx.RIGHT) 1344 1345 bondRadiusTxt = wx.StaticText(dataDisplay,-1,'Bond radius, A: '+'%.2f'%(drawingData['bondRadius'])) 1346 slideSizer.Add(bondRadiusTxt,0,wx.ALIGN_CENTER_VERTICAL) 1347 bondRadius = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['bondRadius'])) 1348 bondRadius.SetRange(1,25) 1349 bondRadius.Bind(wx.EVT_SLIDER, OnBondRadius) 1350 slideSizer.Add(bondRadius,1,wx.EXPAND|wx.RIGHT) 1351 1352 fogFactorTxt = wx.StaticText(dataDisplay,-1,'Fog factor: '+'%.2f'%(drawingData['fogFactor'])) 1353 slideSizer.Add(fogFactorTxt,0,wx.ALIGN_CENTER_VERTICAL) 1354 fogFactor = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['fogFactor'])) 1355 fogFactor.Bind(wx.EVT_SLIDER, OnFogFactor) 1356 slideSizer.Add(fogFactor,1,wx.EXPAND|wx.RIGHT) 1357 1358 slopSizer.Add(slideSizer,1,wx.EXPAND|wx.RIGHT) 1359 slopSizer.Add((10,5),0) 1360 mainSizer.Add(slopSizer,1,wx.EXPAND) 1361 1362 flexSizer = wx.FlexGridSizer(7,2,5,0) 1363 flexSizer.Add(wx.StaticText(dataDisplay,-1,'View Point: '),0,wx.ALIGN_CENTER_VERTICAL) 1364 VP = drawingData['viewPoint'][0] 1365 viewPoint = wx.TextCtrl(dataDisplay,value='%.3f, %.3f, %.3f'%(VP[0],VP[1],VP[2]), 1366 style=wx.TE_READONLY,size=wx.Size(120,20),name='viewPoint') 1367 viewPoint.SetBackgroundColour(VERY_LIGHT_GREY) 1368 flexSizer.Add(viewPoint,0,wx.ALIGN_CENTER_VERTICAL) 1369 1370 depthFog = wx.CheckBox(dataDisplay,-1,label='Use depth fog?') 1371 depthFog.Bind(wx.EVT_CHECKBOX, OnDepthFog) 1372 depthFog.SetValue(drawingData['depthFog']) 1373 flexSizer.Add(depthFog,0,wx.ALIGN_CENTER_VERTICAL) 1374 lineSizer = wx.BoxSizer(wx.HORIZONTAL) 1375 lineSizer.Add(wx.StaticText(dataDisplay,-1,'Background color:'),0,wx.ALIGN_CENTER_VERTICAL) 1376 backColor = wcs.ColourSelect(dataDisplay, -1,colour=drawingData['backColor'],size=wx.Size(25,25)) 1377 backColor.Bind(wcs.EVT_COLOURSELECT, OnBackColor) 1378 lineSizer.Add(backColor,0,wx.ALIGN_CENTER_VERTICAL) 1379 flexSizer.Add(lineSizer,0,) 1380 1381 showABC = wx.CheckBox(dataDisplay,-1,label='Show cell vectors?') 1382 showABC.Bind(wx.EVT_CHECKBOX, OnShowABC) 1383 showABC.SetValue(drawingData['showABC']) 1384 flexSizer.Add(showABC,0,wx.ALIGN_CENTER_VERTICAL) 1385 1386 unitCellBox = wx.CheckBox(dataDisplay,-1,label='Show unit cell?') 1387 unitCellBox.Bind(wx.EVT_CHECKBOX, OnShowUnitCell) 1388 unitCellBox.SetValue(drawingData['unitCellBox']) 1389 flexSizer.Add(unitCellBox,0,wx.ALIGN_CENTER_VERTICAL) 1390 1391 packing = wx.CheckBox(dataDisplay,-1,label='Packing diagram?') 1392 packing.Bind(wx.EVT_CHECKBOX, OnPacking) 1393 packing.SetValue(drawingData['packing']) 1394 flexSizer.Add(packing,0,wx.ALIGN_CENTER_VERTICAL) 1395 1396 showBadContacts = wx.CheckBox(dataDisplay,-1,label='Show bad contacts?') 1397 showBadContacts.Bind(wx.EVT_CHECKBOX, OnShowBadContacts) 1398 showBadContacts.SetValue(drawingData['showBadContacts']) 1399 flexSizer.Add(showBadContacts,0,wx.ALIGN_CENTER_VERTICAL) 1400 1401 showSymElem = wx.CheckBox(dataDisplay,-1,label='Show sym. elem.?') 1402 showSymElem.Bind(wx.EVT_CHECKBOX, OnShowSymElem) 1403 showSymElem.SetValue(drawingData['showSymElem']) 1404 flexSizer.Add(showSymElem,0,wx.ALIGN_CENTER_VERTICAL) 1405 1406 showHydrogen = wx.CheckBox(dataDisplay,-1,label='Show hydrogens?') 1407 showHydrogen.Bind(wx.EVT_CHECKBOX, OnShowHyd) 1408 showHydrogen.SetValue(drawingData['showHydrogen']) 1409 flexSizer.Add(showHydrogen,0,wx.ALIGN_CENTER_VERTICAL) 1410 1411 flexSizer.Add(wx.StaticText(dataDisplay,-1,'Hydrogen radius, A: '),0,wx.ALIGN_CENTER_VERTICAL) 1412 sizeH = wx.TextCtrl(dataDisplay,-1,value='%.2f'%(drawingData['sizeH']),style=wx.TE_PROCESS_ENTER) 1413 sizeH.Bind(wx.EVT_TEXT_ENTER,OnSizeHatoms) 1414 sizeH.Bind(wx.EVT_KILL_FOCUS,OnSizeHatoms) 1415 flexSizer.Add(sizeH,0,wx.ALIGN_CENTER_VERTICAL) 1416 1417 flexSizer.Add(wx.StaticText(dataDisplay,-1,'Pick items on drawing by: '),0,wx.ALIGN_CENTER_VERTICAL) 1418 pickItem = wx.Choice(dataDisplay,-1,choices=pickChoice) 1419 pickItem.Bind(wx.EVT_CHOICE, OnPickItem) 1420 pickItem.SetSelection(pickChoice.index(drawingData['pickItem'])) 1421 flexSizer.Add(pickItem,0,wx.ALIGN_CENTER_VERTICAL) 1422 mainSizer.Add(flexSizer,0,) 1423 mainSizer.SetMinSize(wx.Size(300,370)) 1424 1425 dataDisplay.SetSizer(mainSizer) 1426 self.dataFrame.SetSize(dataDisplay.Fit()) 1427 696 1428 def FillPawleyReflectionsGrid(): 697 1429 generalData = data['General'] 698 1430 699 1431 print 'Pawley reflections' 700 1432 701 1433 def OnPageChanged(event): 702 1434 page = event.GetSelection() … … 712 1444 FillAtomsGrid() 713 1445 elif text == 'General': 714 FillGeneralGrid() 1446 FillGeneralGrid() 715 1447 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 1448 elif text == 'Draw Options': 1449 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 1450 UpdateDrawOptions() 1451 G2plt.PlotStructure(self,data) 1452 elif text == 'Draw Atoms': 1453 self.dataFrame.SetMenuBar(self.dataFrame.DrawAtomsMenu) 1454 self.dataFrame.Bind(wx.EVT_MENU, DrawAtomStyle, id=G2gd.wxID_DRAWATOMSTYLE) 1455 self.dataFrame.Bind(wx.EVT_MENU, DrawAtomLabel, id=G2gd.wxID_DRAWATOMLABEL) 1456 self.dataFrame.Bind(wx.EVT_MENU, SetViewPoint, id=G2gd.wxID_DRAWVIEWPOINT) 1457 self.dataFrame.Bind(wx.EVT_MENU, AddSymEquiv, id=G2gd.wxID_DRAWADDEQUIV) 1458 self.dataFrame.Bind(wx.EVT_MENU, TransformSymEquiv, id=G2gd.wxID_DRAWTRANSFORM) 1459 self.dataFrame.Bind(wx.EVT_MENU, FillCoordSphere, id=G2gd.wxID_DRAWFILLCOORD) 1460 self.dataFrame.Bind(wx.EVT_MENU, FillUnitCell, id=G2gd.wxID_DRAWFILLCELL) 1461 self.dataFrame.Bind(wx.EVT_MENU, DrawAtomsDelete, id=G2gd.wxID_DRAWDELETE) 1462 UpdateDrawAtoms() 1463 G2plt.PlotStructure(self,data) 716 1464 else: 717 1465 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 718 1466 event.Skip() 719 1467 720 1468 if self.dataDisplay: 721 self.dataDisplay.Destroy() 1469 self.dataDisplay.Destroy() 722 1470 PhaseName = self.PatternTree.GetItemText(item) 723 1471 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) … … 725 1473 self.dataFrame.CreateStatusBar() 726 1474 self.dataDisplay = G2gd.GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize()) 727 1475 728 1476 General = G2gd.GSGrid(self.dataDisplay) 729 1477 FillGeneralGrid() 730 1478 self.dataDisplay.AddPage(General,'General') 731 1479 732 1480 GeneralData = data['General'] 733 1481 if GeneralData['Type'] == 'Pawley': … … 737 1485 Atoms = G2gd.GSGrid(self.dataDisplay) 738 1486 self.dataDisplay.AddPage(Atoms,'Atoms') 739 Drawing = wx.Window(self.dataDisplay) 740 self.dataDisplay.AddPage(Drawing,'Drawing') 741 1487 drawOptions = wx.Window(self.dataDisplay) 1488 self.dataDisplay.AddPage(drawOptions,'Draw Options') 1489 drawAtoms = G2gd.GSGrid(self.dataDisplay) 1490 self.dataDisplay.AddPage(drawAtoms,'Draw Atoms') 1491 742 1492 self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged) 743 1493 self.dataDisplay.SetSelection(oldPage) 744 1494 1495 -
trunk/GSASIIplot.py
r137 r155 3 3 import copy 4 4 import numpy as np 5 import numpy.linalg as nl 5 6 import wx 6 7 import wx.aui 8 import wx.glcanvas 7 9 import matplotlib as mpl 8 10 import GSASIIpath … … 12 14 import GSASIIpwdGUI as G2pdG 13 15 import GSASIIimgGUI as G2imG 16 import GSASIIphsGUI as G2phG 17 import GSASIIlattice as G2lat 18 import GSASIIspc as G2spc 19 from OpenGL.GL import * 20 from OpenGL.GLU import * 21 from OpenGL.GLUT import * 14 22 from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as Canvas 15 23 from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx as Toolbar … … 24 32 atand = lambda x: 180.*math.atan(x)/math.pi 25 33 26 class G2Plot(wx.Panel): 27 34 class G2PlotMpl(wx.Panel): 28 35 def __init__(self,parent,id=-1,dpi=None,**kwargs): 29 36 wx.Panel.__init__(self,parent,id=id,**kwargs) … … 38 45 sizer.Add(self.toolbar,0,wx.LEFT|wx.EXPAND) 39 46 self.SetSizer(sizer) 47 48 class G2PlotOgl(wx.Panel): 49 def __init__(self,parent,id=-1,dpi=None,**kwargs): 50 self.figure = wx.Panel.__init__(self,parent,id=id,**kwargs) 51 self.canvas = wx.glcanvas.GLCanvas(self,-1,**kwargs) 52 self.camera = {} 53 sizer=wx.BoxSizer(wx.VERTICAL) 54 sizer.Add(self.canvas,1,wx.EXPAND) 55 self.SetSizer(sizer) 40 56 41 57 class G2PlotNoteBook(wx.Panel): … … 55 71 self.plotList = [] 56 72 57 def add (self,name=""):58 page = G2Plot (self.nb)73 def addMpl(self,name=""): 74 page = G2PlotMpl(self.nb) 59 75 self.nb.AddPage(page,name) 60 76 … … 63 79 return page.figure 64 80 81 def addOgl(self,name=""): 82 page = G2PlotOgl(self.nb) 83 self.nb.AddPage(page,name) 84 85 self.plotList.append(name) 86 87 return page.figure 88 89 def Delete(self,name): 90 try: 91 item = self.plotList.index(name) 92 del self.plotList[item] 93 self.nb.DeletePage(item) 94 except ValueError: #no plot of this name - do nothing 95 return 96 65 97 def clear(self): 66 98 while self.nb.GetPageCount(): … … 68 100 self.plotList = [] 69 101 self.status.DestroyChildren() 102 103 def Rename(self,oldName,newName): 104 try: 105 item = self.plotList.index(oldName) 106 self.plotList[item] = newName 107 self.nb.SetPageText(item,newName) 108 except ValueError: #no plot of this name - do nothing 109 return 70 110 71 111 def OnPageChanged(self,event): … … 122 162 Plot = Page.figure.gca() #get a fresh plot after clf() 123 163 except ValueError,error: 124 Plot = self.G2plotNB.add ('Structure Factors').gca()164 Plot = self.G2plotNB.addMpl('Structure Factors').gca() 125 165 plotNum = self.G2plotNB.plotList.index('Structure Factors') 126 166 Page = self.G2plotNB.nb.GetPage(plotNum) … … 338 378 except ValueError,error: 339 379 newPlot = True 340 Plot = self.G2plotNB.add ('Powder Patterns').gca()380 Plot = self.G2plotNB.addMpl('Powder Patterns').gca() 341 381 plotNum = self.G2plotNB.plotList.index('Powder Patterns') 342 382 Page = self.G2plotNB.nb.GetPage(plotNum) … … 476 516 Plot = Page.figure.gca() 477 517 except ValueError,error: 478 Plot = self.G2plotNB.add ('Powder Lines').gca()518 Plot = self.G2plotNB.addMpl('Powder Lines').gca() 479 519 plotNum = self.G2plotNB.plotList.index('Powder Lines') 480 520 Page = self.G2plotNB.nb.GetPage(plotNum) … … 526 566 Plot = Page.figure.gca() 527 567 except ValueError,error: 528 Plot = self.G2plotNB.add ('Peak Widths').gca()568 Plot = self.G2plotNB.addMpl('Peak Widths').gca() 529 569 plotNum = self.G2plotNB.plotList.index('Peak Widths') 530 570 Page = self.G2plotNB.nb.GetPage(plotNum) … … 809 849 810 850 except ValueError,error: 811 Plot = self.G2plotNB.add ('2D Powder Image').gca()851 Plot = self.G2plotNB.addMpl('2D Powder Image').gca() 812 852 plotNum = self.G2plotNB.plotList.index('2D Powder Image') 813 853 Page = self.G2plotNB.nb.GetPage(plotNum) … … 962 1002 963 1003 except ValueError,error: 964 Plot = self.G2plotNB.add ('2D Integration').gca()1004 Plot = self.G2plotNB.addMpl('2D Integration').gca() 965 1005 plotNum = self.G2plotNB.plotList.index('2D Integration') 966 1006 Page = self.G2plotNB.nb.GetPage(plotNum) … … 1004 1044 else: 1005 1045 Page.canvas.draw() 1006 1007 1046 1008 1047 def PlotTRImage(self,tax,tay,taz,newPlot=False): 1009 1048 #a test plot routine - not normally used … … 1028 1067 1029 1068 except ValueError,error: 1030 Plot = self.G2plotNB.add ('2D Transformed Powder Image').gca()1069 Plot = self.G2plotNB.addMpl('2D Transformed Powder Image').gca() 1031 1070 plotNum = self.G2plotNB.plotList.index('2D Transformed Powder Image') 1032 1071 Page = self.G2plotNB.nb.GetPage(plotNum) … … 1078 1117 Page.canvas.draw() 1079 1118 1080 1119 def PlotStructure(self,data): 1120 generalData = data['General'] 1121 atomData = data['Atoms'] 1122 drawingData = data['Drawing'] 1123 drawAtoms = drawingData['Atoms'] 1124 Wt = [255,255,255,255] 1125 Rd = [255,0,0,255] 1126 Gr = [0,255,0,255] 1127 Bl = [0,0,255,255] 1128 uBox = np.array([[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,0,1],[1,0,1],[1,1,1],[0,1,1]]) 1129 uEdges = np.array([ 1130 [uBox[0],uBox[1]],[uBox[0],uBox[3]],[uBox[0],uBox[4]],[uBox[1],uBox[2]], 1131 [uBox[2],uBox[3]],[uBox[1],uBox[5]],[uBox[2],uBox[6]],[uBox[3],uBox[7]], 1132 [uBox[4],uBox[5]],[uBox[5],uBox[6]],[uBox[6],uBox[7]],[uBox[7],uBox[4]]]) 1133 uColors = [Rd,Gr,Bl,Wt, Wt,Wt,Wt,Wt, Wt,Wt,Wt,Wt] 1134 1135 def OnMouseDown(event): 1136 drawingData['Rotation'][3] = event.GetPosition() 1137 def OnMouseWheel(event): 1138 drawingData['cameraPos'] += event.GetWheelRotation()/24 1139 drawingData['cameraPos'] = max(10,min(500,drawingData['cameraPos'])) 1140 page = self.dataDisplay.GetSelection() 1141 if self.dataDisplay.GetPageText(page) == 'Draw Options': 1142 panel = self.dataDisplay.GetPage(page).GetChildren()[0].GetChildren() 1143 names = [child.GetName() for child in panel] 1144 panel[names.index('cameraPos')].SetLabel('Camera Position: '+'%.2f'%(drawingData['cameraPos'])) 1145 panel[names.index('cameraSlider')].SetValue(drawingData['cameraPos']) 1146 Draw() 1147 1148 def SetViewPointText(VP): 1149 page = self.dataDisplay.GetSelection() 1150 if self.dataDisplay.GetPageText(page) == 'Draw Options': 1151 panel = self.dataDisplay.GetPage(page).GetChildren()[0].GetChildren() 1152 names = [child.GetName() for child in panel] 1153 panel[names.index('viewPoint')].SetValue('%.3f, %.3f, %.3f'%(VP[0],VP[1],VP[2])) 1154 1155 def OnKey(event): 1156 keyCode = event.GetKeyCode() 1157 key,xyz = chr(keyCode),event.GetPosition() 1158 indx = drawingData['selectedAtoms'] 1159 cx,ct,cs = drawingData['atomPtrs'] 1160 if key in ['c','C']: 1161 drawingData['viewPoint'] = [[.5,.5,.5],[0,0]] 1162 drawingData['Rotation'] = [0.0,0.0,0.0,np.array([0,0])] 1163 SetViewPointText(drawingData['viewPoint'][0]) 1164 elif key in ['n','N']: 1165 drawAtoms = drawingData['Atoms'] 1166 pI = drawingData['viewPoint'][1] 1167 if indx: 1168 pI[0] = indx[pI[1]] 1169 Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3] 1170 pI[1] += 1 1171 if pI[1] >= len(indx): 1172 pI[1] = 0 1173 else: 1174 Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3] 1175 pI[0] += 1 1176 if pI[0] >= len(drawAtoms): 1177 pI[0] = 0 1178 drawingData['viewPoint'] = [[Tx,Ty,Tz],pI] 1179 SetViewPointText(drawingData['viewPoint'][0]) 1180 1181 elif key in ['p','P']: 1182 drawAtoms = drawingData['Atoms'] 1183 pI = drawingData['viewPoint'][1] 1184 if indx: 1185 pI[0] = indx[pI[1]] 1186 Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3] 1187 pI[1] -= 1 1188 if pI[1] < 0: 1189 pI[1] = len(indx)-1 1190 else: 1191 Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3] 1192 pI[0] -= 1 1193 if pI[0] < 0: 1194 pI[0] = len(drawAtoms)-1 1195 drawingData['viewPoint'] = [[Tx,Ty,Tz],pI] 1196 SetViewPointText(drawingData['viewPoint'][0]) 1197 1198 elif key in ['a','A']: 1199 print xyz,GetTruePosition(xyz) 1200 Draw() 1201 1202 def OnMouseMove(event): 1203 newxy = event.GetPosition() 1204 if event.Dragging(): 1205 if event.LeftIsDown(): 1206 SetRotation(newxy) 1207 elif event.RightIsDown(): 1208 SetTranslation(newxy) 1209 elif event.MiddleIsDown(): 1210 SetRotationZ(newxy) 1211 Draw() 1212 1213 def GetTruePosition(xy): 1214 View = glGetIntegerv(GL_VIEWPORT) 1215 x,y,z = gluUnProject(xy[0],xy[1],0,view=View) 1216 return x,y,z 1217 1218 def SetBackground(): 1219 R,G,B,A = Page.camera['backColor'] 1220 glClearColor(R,G,B,A) 1221 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 1222 1223 def SetLights(): 1224 glEnable(GL_DEPTH_TEST) 1225 glShadeModel(GL_SMOOTH) 1226 glEnable(GL_LIGHTING) 1227 glEnable(GL_LIGHT0) 1228 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,0) 1229 glLightfv(GL_LIGHT0,GL_AMBIENT,[1,1,1,.8]) 1230 glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1]) 1231 1232 def SetFog(): #doesn't work for some reason 1233 cPos = drawingData['cameraPos'] 1234 Zclip = drawingData['Zclip']*cPos/200. 1235 glFogi(GL_FOG_MODE,GL_LINEAR) 1236 glFogfv(GL_FOG_COLOR,Page.camera['backColor']) 1237 glFogf(GL_FOG_START,cPos-Zclip) 1238 glFogf(GL_FOG_END,cPos+Zclip) 1239 glFogf(GL_FOG_DENSITY,drawingData['fogFactor']) 1240 1241 def SetTranslation(newxy): 1242 Tx,Ty,Tz = drawingData['viewPoint'][0] 1243 oldxy = drawingData['Rotation'][3] 1244 dxy = newxy-oldxy 1245 Tx += dxy[0]*0.01 1246 Ty -= dxy[1]*0.01 1247 drawingData['Rotation'][3] = newxy 1248 drawingData['viewPoint'][0] = Tx,Ty,Tz 1249 1250 def SetRotation(newxy): 1251 anglex,angley,anglez,oldxy = drawingData['Rotation'] 1252 dxy = newxy-oldxy 1253 anglex += dxy[1] 1254 angley += dxy[0] 1255 oldxy = newxy 1256 drawingData['Rotation'] = [anglex,angley,anglez,oldxy] 1257 1258 def SetRotationZ(newxy): 1259 def sign(x): 1260 if x < 0: 1261 return -1 1262 else: 1263 return 1 1264 1265 anglex,angley,anglez,oldxy = drawingData['Rotation'] 1266 dxy = newxy-oldxy 1267 anglez += dxy[0]+dxy[1] 1268 oldxy = newxy 1269 drawingData['Rotation'] = [anglex,angley,anglez,oldxy] 1270 1271 def RenderBox(): 1272 glEnable(GL_COLOR_MATERIAL) 1273 glBegin(GL_LINES) 1274 for line,color in zip(uEdges,uColors): 1275 glColor4ubv(color) 1276 glVertex3fv(line[0]) 1277 glVertex3fv(line[1]) 1278 glEnd() 1279 glColor4ubv([0,0,0,0]) 1280 glDisable(GL_COLOR_MATERIAL) 1281 1282 def RenderUnitVectors(): 1283 glEnable(GL_COLOR_MATERIAL) 1284 glBegin(GL_LINES) 1285 for line,color in zip(uEdges,uColors)[:3]: 1286 glColor4ubv(color) 1287 glVertex3fv(line[0]) 1288 glVertex3fv(line[1]) 1289 glEnd() 1290 glColor4ubv([0,0,0,0]) 1291 glDisable(GL_COLOR_MATERIAL) 1292 1293 def RenderSphere(x,y,z,radius,color): 1294 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color) 1295 glPushMatrix() 1296 glTranslate(x,y,z) 1297 glMultMatrixf(B4mat.T) 1298 q = gluNewQuadric() 1299 gluSphere(q,radius,20,20) 1300 glPopMatrix() 1301 1302 def RenderEllipsoid(x,y,z,ellipseProb,E,R4,color): 1303 s1,s2,s3 = E 1304 glLightfv(GL_LIGHT0,GL_DIFFUSE,[.7,.7,.7,1]) 1305 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color) 1306 glPushMatrix() 1307 glTranslate(x,y,z) 1308 glMultMatrixf(B4mat.T) 1309 glMultMatrixf(R4.T) 1310 glEnable(GL_RESCALE_NORMAL) 1311 glScale(s1,s2,s3) 1312 q = gluNewQuadric() 1313 gluSphere(q,ellipseProb,20,20) 1314 glDisable(GL_RESCALE_NORMAL) 1315 glPopMatrix() 1316 glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1]) 1317 1318 def RenderBonds(x,y,z,Bonds,radius,color): 1319 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color) 1320 glPushMatrix() 1321 glTranslate(x,y,z) 1322 glMultMatrixf(B4mat.T) 1323 for bond in Bonds: 1324 glPushMatrix() 1325 Dx = np.inner(Amat,bond) 1326 Z = np.sqrt(np.sum(Dx**2)) 1327 azm = atan2d(-Dx[1],-Dx[0]) 1328 phi = acosd(Dx[2]/Z) 1329 glRotate(-azm,0,0,1) 1330 glRotate(phi,1,0,0) 1331 q = gluNewQuadric() 1332 gluCylinder(q,radius,radius,Z,20,2) 1333 glPopMatrix() 1334 glPopMatrix() 1335 1336 def RenderLines(x,y,z,Bonds,color): 1337 glEnable(GL_COLOR_MATERIAL) 1338 glPushMatrix() 1339 glTranslate(x,y,z) 1340 glBegin(GL_LINES) 1341 for bond in Bonds: 1342 glColor4fv(color) 1343 glVertex3fv([0,0,0]) 1344 glVertex3fv(bond) 1345 glEnd() 1346 glColor4ubv([0,0,0,0]) 1347 glPopMatrix() 1348 glDisable(GL_COLOR_MATERIAL) 1349 1350 def RenderPolyhedra(x,y,z,Faces,color): 1351 glPushMatrix() 1352 glTranslate(x,y,z) 1353 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color) 1354 glShadeModel(GL_SMOOTH) 1355 glMultMatrixf(B4mat.T) 1356 for face,norm in Faces: 1357 glPolygonMode(GL_FRONT,GL_FILL) 1358 glColor3fv(color[:3]) 1359 glBegin(GL_TRIANGLES) 1360 glNormal3fv(norm) 1361 for vert in face: 1362 glVertex3fv(vert) 1363 glEnd() 1364 glPopMatrix() 1365 1366 def RenderLabel(x,y,z,label,r): 1367 glPushMatrix() 1368 glTranslate(x,y,z) 1369 glMultMatrixf(B4mat.T) 1370 glDisable(GL_LIGHTING) 1371 glColor3f(0,1.,0) 1372 glRasterPos3f(r,r,r) 1373 for c in list(label): 1374 glutBitmapCharacter(GLUT_BITMAP_8_BY_13,ord(c)) 1375 glEnable(GL_LIGHTING) 1376 glPopMatrix() 1377 1378 def Draw(): 1379 import numpy.linalg as nl 1380 VS = np.array(Page.canvas.GetSize()) 1381 aspect = float(VS[0])/float(VS[1]) 1382 cPos = drawingData['cameraPos'] 1383 Zclip = drawingData['Zclip']*cPos/200. 1384 anglex,angley,anglez, = drawingData['Rotation'][:3] 1385 Tx,Ty,Tz = drawingData['viewPoint'][0] 1386 cx,ct,cs = drawingData['atomPtrs'] 1387 bondR = drawingData['bondRadius'] 1388 G,g = G2lat.cell2Gmat(cell) 1389 GS = G 1390 GS[0][1] = GS[1][0] = math.sqrt(GS[0][0]*GS[1][1]) 1391 GS[0][2] = GS[2][0] = math.sqrt(GS[0][0]*GS[2][2]) 1392 GS[1][2] = GS[2][1] = math.sqrt(GS[1][1]*GS[2][2]) 1393 ellipseProb = G2lat.criticalEllipse(drawingData['ellipseProb']/100.) 1394 1395 SetBackground() 1396 1397 glMatrixMode(GL_PROJECTION) 1398 glLoadIdentity() 1399 glViewport(0,0,VS[0],VS[1]) 1400 gluPerspective(20.,aspect,cPos-Zclip,cPos+Zclip) 1401 gluLookAt(0,0,cPos,0,0,0,0,1,0) 1402 SetLights() 1403 if drawingData['depthFog']: 1404 glEnable(GL_FOG) 1405 SetFog() 1406 else: 1407 glDisable(GL_FOG) 1408 1409 glMatrixMode(GL_MODELVIEW) 1410 glLoadIdentity() 1411 glRotate(anglez,0,0,1) 1412 glRotate(anglex,1,0,0) 1413 glRotate(angley,0,1,0) 1414 glMultMatrixf(A4mat.T) 1415 glTranslate(-Tx,-Ty,-Tz) 1416 if drawingData['unitCellBox']: 1417 RenderBox() 1418 if drawingData['showABC']: 1419 glPushMatrix() 1420 glTranslate(-.1,-.1,-.1) 1421 glScalef(1/cell[0],1/cell[1],1/cell[2]) 1422 RenderUnitVectors() 1423 glPopMatrix() 1424 for iat,atom in enumerate(drawingData['Atoms']): 1425 x,y,z = atom[cx:cx+3] 1426 Bonds = atom[-1] 1427 atNum = generalData['AtomTypes'].index(atom[ct]) 1428 CL = list(generalData['Color'][atNum]) 1429 CL.extend([255,]) 1430 color = np.array(CL)/255. 1431 radius = 0.5 1432 if 'balls' in atom[cs]: 1433 vdwScale = drawingData['vdwScale'] 1434 ballScale = drawingData['ballScale'] 1435 if 'H' == atom[ct]: 1436 if drawingData['showHydrogen']: 1437 if 'vdW' in atom[cs]: 1438 radius = vdwScale*generalData['vdWRadii'][atNum] 1439 else: 1440 radius = ballScale*drawingData['sizeH'] 1441 else: 1442 radius = 0.0 1443 else: 1444 if 'vdW' in atom[cs]: 1445 radius = vdwScale*generalData['vdWRadii'][atNum] 1446 else: 1447 radius = ballScale*generalData['BondRadii'][atNum] 1448 RenderSphere(x,y,z,radius,color) 1449 if 'sticks' in atom[cs]: 1450 RenderBonds(x,y,z,Bonds,bondR,color) 1451 elif 'ellipsoids' in atom[cs]: 1452 RenderBonds(x,y,z,Bonds,bondR,color) 1453 if atom[cs+2] == 'A': 1454 Uij = atom[cs+4:cs+10] 1455 U = np.multiply(G2spc.Uij2U(Uij),GS) 1456 U = np.inner(Amat,np.inner(U,Amat).T) 1457 E,R = nl.eigh(U) 1458 R4 = np.concatenate((np.concatenate((R,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0) 1459 E = np.sqrt(E) 1460 RenderEllipsoid(x,y,z,ellipseProb,E,R4,color) 1461 else: 1462 radius = ellipseProb*math.sqrt(abs(atom[cs+3])) 1463 RenderSphere(x,y,z,radius,color) 1464 elif 'lines' in atom[cs]: 1465 radius = 0.5 1466 RenderLines(x,y,z,Bonds,color) 1467 elif atom[cs] == 'sticks': 1468 radius = 0.5 1469 RenderBonds(x,y,z,Bonds,bondR,color) 1470 elif atom[cs] == 'polyhedra': 1471 if len(Bonds) > 2: 1472 FaceGen = G2lat.uniqueCombinations(Bonds,3) #N.B. this is a generator 1473 Faces = [] 1474 for face in FaceGen: 1475 vol = nl.det(face) 1476 if abs(vol) > 1.: 1477 if vol < 0.: 1478 face = [face[0],face[2],face[1]] 1479 norm = np.cross(face[1]-face[0],face[2]-face[0]) 1480 norm /= np.sqrt(np.sum(norm**2)) 1481 Faces.append([face,norm]) 1482 RenderPolyhedra(x,y,z,Faces,color) 1483 if atom[cs+1] == 'type': 1484 RenderLabel(x,y,z,atom[ct],radius) 1485 elif atom[cs+1] == 'name': 1486 RenderLabel(x,y,z,atom[ct-1],radius) 1487 elif atom[cs+1] == 'number': 1488 RenderLabel(x,y,z,str(iat+1),radius) 1489 elif atom[cs+1] == 'residue' and atom[ct-1] == 'CA': 1490 RenderLabel(x,y,z,atom[ct-4],radius) 1491 elif atom[cs+1] == '1-letter' and atom[ct-1] == 'CA': 1492 RenderLabel(x,y,z,atom[ct-3],radius) 1493 elif atom[cs+1] == 'chain' and atom[ct-1] == 'CA': 1494 RenderLabel(x,y,z,atom[ct-2],radius) 1495 1496 Page.canvas.SwapBuffers() 1497 1498 def OnSize(event): 1499 Draw() 1500 1501 try: 1502 plotNum = self.G2plotNB.plotList.index(generalData['Name']) 1503 Page = self.G2plotNB.nb.GetPage(plotNum) 1504 except ValueError,error: 1505 Plot = self.G2plotNB.addOgl(generalData['Name']) 1506 plotNum = self.G2plotNB.plotList.index(generalData['Name']) 1507 Page = self.G2plotNB.nb.GetPage(plotNum) 1508 Page.views = False 1509 view = False 1510 Page.SetFocus() 1511 Page.canvas.Bind(wx.EVT_MOUSEWHEEL, OnMouseWheel) 1512 Page.canvas.Bind(wx.EVT_LEFT_DOWN, OnMouseDown) 1513 Page.canvas.Bind(wx.EVT_RIGHT_DOWN, OnMouseDown) 1514 Page.canvas.Bind(wx.EVT_MIDDLE_DOWN, OnMouseDown) 1515 Page.canvas.Bind(wx.EVT_KEY_UP, OnKey) 1516 Page.canvas.Bind(wx.EVT_MOTION, OnMouseMove) 1517 Page.canvas.Bind(wx.EVT_SIZE, OnSize) 1518 cell = generalData['Cell'][1:7] 1519 Amat,Bmat = G2lat.cell2AB(cell) #Amat - crystal to cartesian, Bmat - inverse 1520 A4mat = np.concatenate((np.concatenate((Amat,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0) 1521 B4mat = np.concatenate((np.concatenate((Bmat,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0) 1522 Page.camera['position'] = drawingData['cameraPos'] 1523 Page.camera['viewPoint'] = np.inner(Amat,drawingData['viewPoint'][0]) 1524 Page.camera['backColor'] = np.array(list(drawingData['backColor'])+[0,])/255. 1525 Page.canvas.SetCurrent() 1526 Draw() 1527 -
trunk/GSASIIspc.py
r143 r155 2 2 3 3 import numpy as np 4 import math 4 5 import sys 5 6 import os.path as ospath … … 198 199 ''' 199 200 Translates a set of coordinates so that all values are >=0 and < 1 200 input: a list or numpy array of any length. Note that the object is modified in place.201 output: none 201 input: a list or numpy array of any length. 202 output: none; the object is modified in place. 202 203 ''' 203 204 for i,x in enumerate(XYZ): 204 x = ((x % 1.0)+1.0) % 1.0 205 if x > 0.9999: x = 0.0 206 XYZ[i] = x 205 XYZ[i] = (x-int(x))%1.0 207 206 208 def GenAtom(XYZ,SGData,ifAll=False): 207 def Opposite(XYZ,toler=0.0002): 208 ''' 209 Gives opposite corner, edge or face of unit cell for position within tolerance. 210 Result may be just outside the cell within tolerance 211 input: 212 XYZ: 0 >= np.array[x,y,z] > 1 as by MoveToUnitCell 213 toler: unit cell fraction tolerance making opposite 214 returns: 215 XYZ: array of opposite positions; always contains XYZ 216 ''' 217 perm3 = [[1,1,1],[0,1,1],[1,0,1],[1,1,0],[1,0,0],[0,1,0],[0,0,1],[0,0,0]] 218 TB = np.where(abs(XYZ-1)<toler,-1,0)+np.where(abs(XYZ)<toler,1,0) 219 perm = TB*perm3 220 cperm = ['%d%d%d'%(i,j,k) for i,j,k in perm] 221 D = dict(zip(cperm,perm)) 222 new = [] 223 for key in D: 224 new.append(np.array(D[key])+np.array(XYZ)) 225 return new 226 227 def GenAtom(XYZ,SGData,All=False,Uij=[]): 209 228 ''' 210 229 Generates the equivalent positions for a specified coordinate and space group 211 230 input: 212 XYZ an array, tuple or list containing 3 elements: x, y & z 213 SGData, from SpcGroup 214 ifAll=True causes the return to provide the unique set of 215 equivalent positions 216 =False causes the input position to be repeated. This is the default, 217 but why someone would want this, I am not sure. 218 Returns a list of two element tuples: 219 The first element is the coordinate as a three-element array and 220 the second describes the symmetry used to generate the site, of form [-][C]SS 221 C indicates a centering operation was used (omitted if the 1st, [0,0,0]) 222 SS is the symmetry operator number (1-24) 223 - indicates the center of symmetry was used (omitted otherwise) 231 XYZ an array, tuple or list containing 3 elements: x, y & z 232 SGData, from SpcGroup 233 All = True return all equivalent positions including duplicates 234 = False return only unique positions 235 Uij = [U11,U22,U33,U12,U13,U23] or [] if no Uij 236 return: [[XYZEquiv],Idup,[UijEquiv]] 237 [XYZEquiv] is list of equivalent positions (XYZ is first entry) 238 Idup = [-][C]SS where SS is the symmetry operator number (1-24), C (if not 0,0,0) 239 is centering operator number (1-4) and - is for inversion 240 [UijEquiv] - equivalent Uij; absent if no Uij given 224 241 ''' 225 242 XYZEquiv = [] 243 UijEquiv = [] 226 244 Idup = [] 227 245 X = np.array(XYZ) 228 246 MoveToUnitCell(X) 229 XYZEquiv.append(np.array(X))230 Idup.append(1)231 247 for ic,cen in enumerate(SGData['SGCen']): 232 248 C = np.array(cen) … … 236 252 T = np.array(ops[1]) 237 253 M = np.array(ops[0]) 238 newX = np.sum(M*X,axis=1)+T 254 newX = np.inner(M,X)+T 255 if len(Uij): 256 U = Uij2U(Uij) 257 U = np.inner(M,np.inner(U,M).T) 258 newUij = U2Uij(U) 239 259 if invers: 240 260 newX = -newX 241 261 newX += C 242 262 MoveToUnitCell(newX) 243 New = True 244 if ifAll: 263 if All: 245 264 if np.allclose(newX,X,atol=0.0002): 246 New = False 247 idup = 0 265 idup = 0 266 else: 267 if True in [np.allclose(newX,X,atol=0.0002) for oldX in XYZEquiv]: 268 idup = 0 269 if All or idup: 248 270 XYZEquiv.append(newX) 249 else:250 for oldX in XYZEquiv[:-1]:251 if np.allclose(newX,oldX,atol=0.0002):252 New = False253 idup = 0254 if New or ifAll:255 XYZEquiv.append(newX)256 if ifAll and len(XYZEquiv) == 2:257 Idup.append(1)258 else:259 271 Idup.append(idup) 260 if ifAll: 261 return zip(XYZEquiv[1:],Idup[1:]) #eliminate duplicate initial entry 272 if len(Uij): 273 UijEquiv.append(newUij) 274 if len(Uij): 275 return zip(XYZEquiv,UijEquiv,Idup) 262 276 else: 263 277 return zip(XYZEquiv,Idup) … … 454 468 SGData: from SpcGroup 455 469 Returns a two element tuple: 456 The 1st element is a code for the site symmetry (see Get OprPtrName)470 The 1st element is a code for the site symmetry (see GetKNsym) 457 471 The 2nd element is the site multiplicity 458 472 ''' … … 474 488 if SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm']: 475 489 Isym = 1073741824 476 Jdup = 1490 Jdup = 0 477 491 Xeqv = GenAtom(XYZ,SGData,True) 478 492 IRT = PackRot(SGData['SGOps'])
Note: See TracChangeset
for help on using the changeset viewer.