This is BBMolecule.m in view mode; [Download] [Up]
/* BBMolecule.m * * This is where all the atoms, bonds an molecule infos are collected and * controlled. It just stores the basic data and has nothing to do with the * way a molecule is drawn! The actual drawing is perfromed by different * shapes. * * For interface-info see the header file. The comments in this file mostly * cover only the real implementation details. * * Written by: Thomas Engel * Created: 15.11.1993 (Copyleft) * Last modified: 17.05.1994 */ #import "BBMolecule.h" #import "BBAtom.h" #import "BBMoleculeShape.h" #import "BBRenderingStyle.h" @implementation BBMolecule - init { BBRenderingStyle * aStyle; N3DShader * aShader; self = [super init]; if( !self ) return self; // OK. We really are an object...here we go with our init. // By default we are the only visible group. This causes settings to be // global to the whole molecule. Defaults for color, style etc. // And the shapes should be colored as they are by their own nature. visibleRegions = [BBSuitcase new]; [visibleRegions setName:"Default Regions"]; [visibleRegions setImage:[NXImage findImageNamed:"RegionListIcon"]]; regionList = [BBSuitcase new]; [regionList setName:"Custom Regions"]; [regionList setImage:[NXImage findImageNamed:"RegionListIcon"]]; [self setName:"Untitled Molecule"]; [self setImage:[NXImage findImageNamed:"MoleculeIcon"]]; [self addObject:visibleRegions]; [self addObject:regionList]; // Here we will set the drawing and rotation style. // See the BUGS section for details. aStyle = [BBRenderingStyle new]; [aStyle setSurfaceType:N3D_SmoothSolids]; [aStyle setGeometryType:BB_RenderedShape]; aShader = [N3DShader new]; [aShader setShader:"matte"]; [aStyle setShader:aShader]; [aStyle setShadingQuality:BB_GoodQuality]; [aStyle setGeometryQuality:BB_GoodQuality]; [self setDrawingStyle:aStyle]; aStyle = [BBRenderingStyle new]; [aStyle setSurfaceType:N3D_ShadedWireFrame]; [aStyle setGeometryType:BB_RenderedShape]; aShader = [N3DShader new]; [aShader setShader:"matte"]; [aStyle setShader:aShader]; [aStyle setShadingQuality:BB_PoorQuality]; [aStyle setGeometryQuality:BB_PoorQuality]; [self setRotationStyle:aStyle]; return self; } - free { // Let's free what we created. The list cause the bonds, atoms, groups // and shapes to free themselves. // Atom- and BondList are freeed by our superclass. But their contents // would be not. Remember: Regions (=super) only handle references to // certain objects! [atomList freeObjects]; [bondList freeObjects]; [[regionList freeObjects] free]; [visibleRegions free]; return [super free]; } - setBeaker:aBeaker { beaker = aBeaker; // At the time set beaker is being called all the atoms are loaded and it // is save to create a region that does show every bond and atom. // I should creat a class that does always match the exact molecule data. // This should be easy by using the same suitcases inside the region as I // do inside the molecule. // I can use the molecule itself because if would end in a infinite tree!! [self visibleRegions]; return self; } - beaker { return beaker; } - addAtom:anAtom { // Befroe we will add a new atom we will set the reference to ourself. [anAtom setMolecule:self]; return [super addAtom:anAtom]; } - addRegion:aRegion { [regionList addObject:aRegion]; return self; } - regionList { return regionList; } - addVisibleRegion:aRegion { // Here we set the visible regions. This object is a list object that // has references to every region that should be drawn. [visibleRegions addObject:aRegion]; return self; } - visibleRegions { // If we don't have any visible regions we will create a default. // The default is the whole molecule. int i; if( [visibleRegions count] == 0 ) { if( defaultRegion ) [defaultRegion free]; defaultRegion = [BBRegion new]; [defaultRegion setName:"Whole Molecule"]; for( i=0; i<[atomList count]; i++ ) [defaultRegion addAtom:[atomList objectAt:i]]; for( i=0; i<[bondList count]; i++ ) [defaultRegion addBond:[bondList objectAt:i]]; [visibleRegions addObject:defaultRegion]; } return visibleRegions; } - defaultRegion { return defaultRegion; } - shapeClass { return [BBMoleculeShape class]; } - shape { id ourShape; ourShape = [[[self shapeClass] alloc] initFrom:[self visibleRegions] asPartOf:self]; return ourShape; } @end /* * History: 17.05.94 Added flexible shape creation. * * 02.05.94 Made it a BBSuitcase. * * 27.03.94 Init take care of defineing the draw/roteStyles. * * 10.03.94 Added a simple region addition to the visibleRegions * * 09.03.94 Made it a subclass of BBMoleculeGroup and changed the * name to BBRegion. And switched groups to regions. * * 15.01.94 Added the color support and visible groups. * * 12.01.94 Changed the naming stuff * * 10.01.94 Changed some methods to work properly with our * new objectWell. * * 28.12.93 Added the objectImage stuff to the old simple atom/bond * handling molecule methods. * Added the groupList. * * * Bugs: - Setting the name during init should support localization! * * - I'm not sure about freeing the visibleGroup objects..but I hope * it doesn't matter in future versions. * * - Init styles does not ask the prefs for the right settings. Hm. * Instead of definit some styles at startup I should connect to the * prefs StyleObjects and return them instead. This will allow updating * when they are changed...But doesHaveDrawingSetting should return NO * as long as we don't have one of our own!. * Maybe the BBRegion is a better place for those changes. * * - Creating the default region inside setBeaker is somewhat stupid but * currently a good quick hack :-) * * - I could set the name of the default molecule to something that * reflects the molecules name too. */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.