This is BBAtomLibraryManager.m in view mode; [Download] [Up]
/* BBAtomLibraryManager.m
*
* This is the major Part of the AtomLibrary. Controls Nibs and more. Can
* find the basic atom for any symbol (because it controls them)
*
* For interface-info see the header file. The comments in this file mostly
* cover only the real implementation details.
*
* Written by: Thomas Engel
* Created: 25.11.1993 (Copyleft)
* Last modified: 30.10.1994
*/
#import "BBAtomLibraryManager.h"
#import "../BBBasicAtom.h"
#import "../BBAppManager.h"
#import "../Inspector.subproj/BBMasterInspector.h"
#import <iconkit/IKCell.h>
#import <misckit/MiscSwapView.h>
#import <misckit/MiscString.h>
@implementation BBAtomLibraryManager
- init
{
self = [super init];
if( !self ) return self;
// OK. We really are an object...here we go with our init.
// So lets setup the default Library
atomList = [List new];
[self createSimpleDefaultLibrary];
return self;
}
- makeKeyAndOrderFront:sender
{
// If we have no panel we will load the NIB and show the C as first.
// Remember that we need a initial swap after loading the BIN.
if( !window )
{
if ([NXApp loadNibSection:"AtomLibrary.nib" owner:self] == nil)
NXRunAlertPanel( NULL, "Couldn't load AtomLibrary.nib",
"OK", NULL, NULL);
[self selectBasicAtomWithProtons:6];
[swapView swapContentView:self];
}
[window makeKeyAndOrderFront:self];
return self;
}
- atomList
{
return atomList;
}
- selectBasicAtom:anAtom
{
[nameField setStringValue:[anAtom name]];
[symbolField setStringValue:[anAtom symbol]];
[protonsField setIntValue:[anAtom protons]];
[dragWell setDelegate:anAtom];
[[dragWell controlView] display];
[[[NXApp delegate] inspector] inspect:anAtom];
return self;
}
- selectedBasicAtom
{
return [dragWell delegate];
}
- selectBasicAtomWithSymbol:(const char *)aString
{
[self selectBasicAtom:[self findBasicAtomWithSymbol:aString]];
return self;
}
- selectBasicAtomWithProtons:(short)protons
{
[self selectBasicAtom:[self findBasicAtomWithProtons:protons]];
return self;
}
- findBasicAtomWithSymbol:(const char *)aString
{
// We try to find the atom in our List that matches the given symbol string
// If there is none we will return the defaultAtom;
id matchingAtom;
id anAtom;
int i;
matchingAtom = defaultAtom;
for( i=0; i<[atomList count]; i++ )
{
anAtom = [atomList objectAt:i];
if( [[anAtom symbolObject] compareStr:aString] == 0 )
matchingAtom = anAtom;
}
return matchingAtom;
}
- findBasicAtomWithProtons:(short)protons
{
// We try to find the atom in our List that matches the given proton count
// If there is none we will return the defaultAtom;
id matchingAtom;
id anAtom;
int i;
matchingAtom = defaultAtom;
for( i=0; i<[atomList count]; i++ )
{
anAtom = [atomList objectAt:i];
if( [anAtom protons] == protons )
matchingAtom = anAtom;
}
return matchingAtom;
}
- createSimpleDefaultLibrary
{
// This methods is for the testing time and will be used in the later
// normals release to provide some kind of startup or emergancy atomLibrary
// that is always setup during the init phase.
// Loading a atomLibrary only replaces the atom definitions made here.
// This is how we can make sure that there will always the a atom for
// every atomKind.
// Could be define somewhere else but this is not subject to localization
// so we will hardcode it here.
id anAtom;
defaultAtom = [BBBasicAtom new];
[(BBBasicAtom *)defaultAtom setName:"Unknown"];
[defaultAtom setSymbol:"?"];
[defaultAtom setProtons:0];
[defaultAtom setNeutrons:0];
[defaultAtom setMass:0];
[defaultAtom setRadius:0.5];
[defaultAtom setColor:NXConvertRGBToColor( 0.7, 0.7, 0.7 )];
// First of all we created the defaultAtom. This atom does not appear in
// the atom list. It is the motherAtom of every other atom. So it contains
// the most general and very defaultish settings to every atom here.
// We will set the Neutrons to the most common N-count and the mass
// to the average mass for the atom type.
// The next are the most commonly used atoms: H C N O P S
// These are provided with some more settings. So our default library is
// useful to some extand.
anAtom = [self newLibAtom:"H" :"Hydrogen" withCore:1 :0 mass:1.00794];
[anAtom setRadius:0.37];
[anAtom setVanDerWaalsRadius:1.00];
[anAtom setColor:NXConvertRGBToColor( 1, 1, 1 )];
anAtom = [self newLibAtom:"C" :"Carbon" withCore:6 :6 mass:12.011];
[anAtom setRadius:0.77];
[anAtom setVanDerWaalsRadius:1.70];
[anAtom setColor:NXConvertRGBToColor( 0.3, 0.3, 0.3 )];
anAtom = [self newLibAtom:"N" :"Nitrogen" withCore:7 :7 mass:14.00674];
[anAtom setRadius:0.7];
[anAtom setVanDerWaalsRadius:1.5];
[anAtom setColor:NXConvertRGBToColor( 0, 0.5, 1 )];
anAtom = [self newLibAtom:"O" :"Oxygen" withCore:8 :8 mass:15.9994];
[anAtom setRadius:0.66];
[anAtom setVanDerWaalsRadius:1.4];
[anAtom setColor:NXConvertRGBToColor( 1, 0, 0 )];
anAtom = [self newLibAtom:"P" :"Phosphorus" withCore:15 :16
mass:30.973762];
[anAtom setRadius:1.1];
[anAtom setVanDerWaalsRadius:1.9];
[anAtom setColor:NXConvertRGBToColor( 1, 0.5, 0 )];
anAtom = [self newLibAtom:"S" :"Sulfur" withCore:16 :16 mass:32.066];
[anAtom setRadius:1.04];
[anAtom setVanDerWaalsRadius:1.8];
[anAtom setColor:NXConvertRGBToColor( 1, 1, 0 )];
// To be able to view or LOOK example molecules we will define some more
// atom types with color and radius.
// F Cl Br I Mg Ca Fe Co Zn
anAtom = [self newLibAtom:"F" :"Fluorine" withCore:9 :10 mass:18.9984032];
[anAtom setRadius:0.64];
[anAtom setVanDerWaalsRadius:1.4];
[anAtom setColor:NXConvertRGBToColor( 0.5, 1, 0 )];
anAtom = [self newLibAtom:"Cl" :"Chlorine" withCore:17 :18 mass:35.4527];
[anAtom setRadius:0.99];
[anAtom setVanDerWaalsRadius:1.8];
[anAtom setColor:NXConvertRGBToColor( 0.5, 1, 0.5 )];
anAtom = [self newLibAtom:"Br" :"Bromine" withCore:35 :44 mass:79.904];
[anAtom setRadius:1.14];
[anAtom setVanDerWaalsRadius:2.0];
[anAtom setColor:NXConvertRGBToColor( 0.72, 0.15, 0 )];
anAtom = [self newLibAtom:"I" :"Iodine" withCore:53 :74 mass:126.0447];
[anAtom setRadius:1.330];
[anAtom setVanDerWaalsRadius:2.2];
[anAtom setColor:NXConvertRGBToColor( 0.5, 0, 0.5 )];
anAtom = [self newLibAtom:"Mg" :"Magnsium" withCore:12 :12 mass:24.3050];
[anAtom setRadius:1.36];
[anAtom setVanDerWaalsRadius:1.36];
[anAtom setColor:NXConvertRGBToColor( 0.7, 0.7, 0.7 )];
anAtom = [self newLibAtom:"Ca" :"Calcium" withCore:20 :20 mass:40.078];
[anAtom setRadius:1.74];
[anAtom setVanDerWaalsRadius:1.74];
[anAtom setColor:NXConvertRGBToColor( 0.7, 0.7, 0.7 )];
anAtom = [self newLibAtom:"Fe" :"Iron" withCore:26 :30 mass:55.847];
[anAtom setRadius:1.16];
[anAtom setVanDerWaalsRadius:1.16];
[anAtom setColor:NXConvertRGBToColor( 0.8, 0.5, 0.5 )];
anAtom = [self newLibAtom:"Co" :"Cobalt" withCore:27 :32 mass:58.93320];
[anAtom setRadius:1.16];
[anAtom setVanDerWaalsRadius:1.16];
[anAtom setColor:NXConvertRGBToColor( 0.5, 0.8, 0.8 )];
anAtom = [self newLibAtom:"Zn" :"Zinc" withCore:30 :34 mass:65.39];
[anAtom setRadius:1.25];
[anAtom setVanDerWaalsRadius:1.25];
[anAtom setColor:NXConvertRGBToColor( 0.7, 0.7, 0.7 )];
// Now we define all the other atom types. But with no specific settings.
// They all refer to the defaultAtom.
// Especially the lack of radius info is a problem
[self newLibAtom:"He" :"Helium" withCore:2 :2 mass:4.002602];
[self newLibAtom:"Li" :"Lithium" withCore:3 :4 mass:6.941];
[self newLibAtom:"Be" :"Beryllium" withCore:4 :5 mass:9.012182];
[self newLibAtom:"B" :"Boron" withCore:5 :6 mass:10.811];
[self newLibAtom:"Ne" :"Neon" withCore:10: 10 mass:20.1797];
[self newLibAtom:"Na" :"Sodium" withCore:11 :12 mass:22.989768];
[self newLibAtom:"Al" :"Aluminium" withCore:13 :14 mass:26.981539];
[self newLibAtom:"Si" :"Silicon" withCore:14 :14 mass:28.0855];
[self newLibAtom:"Ar" :"Argon" withCore:18 :22 mass:39.948];
[self newLibAtom:"K" :"Potassium" withCore:19 :20 mass:39.0983];
[self newLibAtom:"Sc" :"Scandium" withCore:21 :24 mass:44.955910];
[self newLibAtom:"Ti" :"Titanium" withCore:22 :26 mass:47.88];
[self newLibAtom:"V" :"Vanadium" withCore:23 :28 mass:50.9415];
[self newLibAtom:"Cr" :"Chromium" withCore:24 :28 mass:51.9961];
[self newLibAtom:"Mn" :"Manganese" withCore:25 :30 mass:54.93805];
[self newLibAtom:"Ni" :"Nickel" withCore:28 :30 mass:58.69];
[self newLibAtom:"Cu" :"Copper" withCore:29 :34 mass:63.546];
[self newLibAtom:"Ga" :"Gallium" withCore:31 :38 mass:69.723];
[self newLibAtom:"Ge" :"Germanium" withCore:32 :42 mass:72.61];
[self newLibAtom:"As" :"Arsenic" withCore:33 :42 mass:74.92159];
[self newLibAtom:"Se" :"Selenium" withCore:34 :46 mass:78.96];
[self newLibAtom:"Kr" :"Krypton" withCore:36 :48 mass:83.80];
[self newLibAtom:"Rb" :"Rubidium" withCore:37 :48 mass:85.4678];
[self newLibAtom:"Sr" :"Strontium" withCore:38 :50 mass:87.62];
[self newLibAtom:"Y" :"Yttrium" withCore:39 :50 mass:88.90585];
[self newLibAtom:"Zr" :"Zirconium" withCore:40 :50 mass:91.224];
[self newLibAtom:"Nb" :"Niobium" withCore:41 :52 mass:92.90638];
[self newLibAtom:"Mo" :"Molybdenum" withCore:42 :56 mass:95.94];
[self newLibAtom:"Tc" :"Technetium" withCore:43 :56 mass:98.9063];
[self newLibAtom:"Ru" :"Ruthenium" withCore:44 :58 mass:101.07];
[self newLibAtom:"Rh" :"Rhodium" withCore:45 :58 mass:102.90550];
[self newLibAtom:"Pd" :"Palladium" withCore:46 :60 mass:106.42];
[self newLibAtom:"Ag" :"Silver" withCore:47 :60 mass:107.8682];
[self newLibAtom:"Cd" :"Cadmium" withCore:48 :66 mass:112.411];
[self newLibAtom:"In" :"Indium" withCore:49 :66 mass:114.82];
[self newLibAtom:"Sn" :"Tin" withCore:50 :70 mass:118.710];
[self newLibAtom:"Sb" :"Antimony" withCore:51 :70 mass:121.75];
[self newLibAtom:"Te" :"Tellurium" withCore:52 :78 mass:127.60];
[self newLibAtom:"Xe" :"Xenon" withCore:54 :78 mass:131.29];
[self newLibAtom:"Cs" :"Caesium" withCore:55 :78 mass:132.90543];
[self newLibAtom:"Ba" :"Barium" withCore:56 :82 mass:137.327];
[self newLibAtom:"La" :"Lanthanum" withCore:57 :82 mass:138.9055];
[self newLibAtom:"Ce" :"Cerium" withCore:58 :82 mass:140.115];
[self newLibAtom:"Pr" :"Praseodymium" withCore:59 :82 mass:140.90765];
[self newLibAtom:"Nd" :"Neodymium" withCore:60 :84 mass:144.24];
[self newLibAtom:"Pm" :"Promethium" withCore:61 :86 mass:146.9141];
[self newLibAtom:"Sm" :"Samarium" withCore:62 :90 mass:150.36];
[self newLibAtom:"Eu" :"Europium" withCore:63 :90 mass:151.965];
[self newLibAtom:"Gd" :"Gadolinium" withCore:64 :94 mass:157.25];
[self newLibAtom:"Tb" :"Therbium" withCore:65 :94 mass:158.92534];
[self newLibAtom:"Dy" :"Dysprosium" withCore:66 :98 mass:162.50];
[self newLibAtom:"Ho" :"Holmium" withCore:67 :98 mass:164.93032];
[self newLibAtom:"Er" :"Erbium" withCore:68 :98 mass:167.26];
[self newLibAtom:"Tm" :"Thulium" withCore:69 :100 mass:168.93421];
[self newLibAtom:"Yb" :"Ytterbium" withCore:70 :104 mass:173.04];
[self newLibAtom:"Lu" :"Lutetium" withCore:71 :104 mass:174.967];
[self newLibAtom:"Hf" :"Hafnium" withCore:72 :108 mass:178.49];
[self newLibAtom:"Ta" :"Tantalum" withCore:73 :108 mass:180.9479];
[self newLibAtom:"W" :"Tungsten" withCore:74 :110 mass:183.85];
[self newLibAtom:"Re" :"Rhenium" withCore:75 :112 mass:186.207];
[self newLibAtom:"Os" :"Osmium" withCore:76 :116 mass:190.2];
[self newLibAtom:"Ir" :"Iridium" withCore:77 :116 mass:192.22];
[self newLibAtom:"Pt" :"Platinum" withCore:78 :117 mass:195.08];
[self newLibAtom:"Au" :"Gold" withCore:79 :118 mass:196.96654];
[self newLibAtom:"Hg" :"Mercury" withCore:80 :122 mass:205.9];
[self newLibAtom:"Tl" :"Thallium" withCore:81 :124 mass:204.3833];
[self newLibAtom:"Pb" :"Lead" withCore:82 :126 mass:207.2];
[self newLibAtom:"Bi" :"Bismuth" withCore:83 :126 mass:208.98037];
[self newLibAtom:"Po" :"Polonium" withCore:84 :125 mass:208.9824];
[self newLibAtom:"At" :"Asthatine" withCore:85 :125 mass:209.9871];
[self newLibAtom:"Rn" :"Radon" withCore:86 :136 mass:222.0176];
[self newLibAtom:"Fr" :"Francium" withCore:87 :136 mass:223.0197];
[self newLibAtom:"Ra" :"Radium" withCore:88 :138 mass:226.0254];
[self newLibAtom:"Ac" :"Actinium" withCore:89 :138 mass:227.0278];
[self newLibAtom:"Th" :"Thorium" withCore:90 :142 mass:232.381];
[self newLibAtom:"Pa" :"Protactinium" withCore:91 :140 mass:231.0359];
[self newLibAtom:"U" :"Uranium" withCore:92 :146 mass:238.0289];
[self newLibAtom:"Np" :"Neptunium" withCore:93 :144 mass:237.0482];
[self newLibAtom:"Pu" :"Plutonium" withCore:94 :150 mass:244.0642];
[self newLibAtom:"Am" :"Americium" withCore:95 :148 mass:243.0614];
[self newLibAtom:"Cm" :"Curium" withCore:96 :151 mass:247.0703];
[self newLibAtom:"Bk" :"Berkelium" withCore:97 :150 mass:247.0703];
[self newLibAtom:"Cf" :"Californium" withCore:98 :153 mass:251.0796];
[self newLibAtom:"Es" :"Einsteinium" withCore:99 :153 mass:252.0829];
[self newLibAtom:"Fm" :"Fermium" withCore:100 :157 mass:257.0951];
[self newLibAtom:"Md" :"Mendelevium" withCore:101 :157 mass:258.0986];
[self newLibAtom:"No" :"Nobelium" withCore:102 :157 mass:259.1009];
[self newLibAtom:"Lr" :"Lawrencium" withCore:103 :157 mass:260.1053];
[self newLibAtom:"Rf" :"Rutherfordium" withCore:104 :157 mass:261.1087];
[self newLibAtom:"Ha" :"Hahnium" withCore:105 :157 mass:262.1138];
[self newLibAtom:"Unh" :"106" withCore:106 :157 mass:263.1182];
[self newLibAtom:"Uns" :"107" withCore:107 :155 mass:262.1229];
[self newLibAtom:"Uno" :"108" withCore:108 :157 mass:265];
[self newLibAtom:"Une" :"109" withCore:109 :157 mass:266];
// To create some special molecules or atoms we will define some non
// standard atom types. The R-Rest is predefined.. all different atoms
// will be mapped to 'Undefined'.
anAtom = [self newLibAtom:"R" :"Rest" withCore:200 :0 mass:0];
[anAtom setRadius:1.0];
[self newLibAtom:"?" :"Undefined" withCore:0 :0 mass:0];
return self;
}
- newLibAtom:(const char *)symbol:(const char*)name withCore:(short)p :(short)n
mass:(float)m
{
// This is a internal method to simplify the creation of the default
// atom library it is used to set the essential data for each atom.
// They are all linked to the defaultAtom.
id anAtom;
anAtom = [BBBasicAtom new];
[anAtom setMotherAtom:defaultAtom];
[(BBBasicAtom *)anAtom setName:name];
[anAtom setSymbol:symbol];
[anAtom setProtons:p];
[anAtom setNeutrons:n];
[anAtom setMass:m];
[atomList addObject:anAtom];
// To be sure that they never get free without our knowledge we add
// us to each atoms userlist.
[anAtom addUser:self];
return anAtom;
}
- windowDidBecomeMain:sender
{
// Here we get informed when we become the main window. This is the point
// to change the inspector to inspect our selection.
[[[NXApp delegate] inspector] inspect:[dragWell delegate]];
return self;
}
@end
/*
* History: 30.10.94 Switched to the MiscString.
*
* 14.05.94 Switched to new name: BB...
*
* 10.02.94 Made it MiscSwap able.
*
* 12.01.94 Added the default library setting.
*
* 11.01.94 Implemented the find..atom/neutrons methods
*
* 09.01.94 Started to implement the rela database work;
*
* 03.12.93 Added some first serious coding sections.
*
*
* Bugs: Yes.
*/These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.