PACKETmatrixDEFINESdiagrammankoppeln,aenderungenspeichern,initcellmatrix,WRITE,NR,AUSGANG,EINGANG,UEBER,CELL,newcell,deletecell,cell,:=,mpos,objekt,typbezeichner,belegt,freieverknuepfungspunkte,belegteverknuepfungspunkte,link,loeschelink,variablenthesaurus,ergebnisthesaurus,formelthesaurus,parameterthesaurus,diagrammnameneintragen,aktuellermodellname,aktuellermodellkurzname,wdlauffaehig,anzahlmpos,getmpos:LETmaxi=20,maxj=10,maxlink=8,matrixtyp1=1107,matrixtyp2=1207,lengthfuerintimtext=2,to=1,from=2;TYPE LINK=STRUCT(INTrichtung,MPOSmpos,INTnr);TYPE CELL=STRUCT(BOOLstatus,MPOSmpos,ROWmaxlinkLINKfromorto,OBJEKTobj);TYPE MATRIX=STRUCT(ROWmaxiROWmaxjCELLmat,THESAURUSvthesaurus,ethesaurus,pthesaurus,fthesaurus,TEXTmodellname,modellkurzname,BOOLlauffaehig);BOUND MATRIX VARmatrix;DATASPACE VARds,nilwd;INITFLAG VARnilwdeingerichtet:=FALSE;PROCdiagrammankoppeln(DATASPACE VARmodellds):forget(ds);ds:=modellds;IFmatrixtyp1=type(ds)CORmatrixtyp2=type(ds)THENmatrix:=dsELSEerrorstop("Datenraum hat falschen Typ!")FI;forget(modellds)END PROCdiagrammankoppeln;PROCdiagrammnameneintragen(TEXT CONSTlangname,kurzname):matrix.modellname:=langname;matrix.modellkurzname:=kurznameEND PROCdiagrammnameneintragen;PROCaenderungenspeichern(TEXT CONSTdsname):IFmatrix.lauffaehigTHENtype(ds,matrixtyp2)ELSEtype(ds,matrixtyp1)FI;forget(dsname,quiet);copy(ds,dsname)END PROCaenderungenspeichern;PROCinitcellmatrix:INT VARi,j,l;forget(ds);IF NOTinitialized(nilwdeingerichtet)THENnilwd:=nilspace;felderinitialisieren;type(nilwd,matrixtyp1)FI;ds:=nilwd;matrix:=ds.felderinitialisieren:matrix:=nilwd;FORiFROM1UPTOmaxiREP FORjFROM1UPTOmaxjREPcell.obj:=new(nil);cell.mpos:=newmpos(i,j);cell.status:=FALSE;FORlFROM1UPTOmaxlinkREPcell.fromorto(l).richtung:=0;cell.fromorto(l).mpos:=null;cell.fromorto(l).nr:=0PER PER PER;matrix.vthesaurus:=emptythesaurus;matrix.ethesaurus:=emptythesaurus;matrix.pthesaurus:=emptythesaurus;matrix.fthesaurus:=emptythesaurus;matrix.modellname:="";matrix.modellkurzname:="";matrix.lauffaehig:=FALSE.cell:matrix.mat(i)(j).END PROCinitcellmatrix;OP:=(LINK VARl,LINK CONSTr):l.richtung:=r.richtung;l.mpos:=r.mpos;l.nr:=r.nrEND OP:=;CELL PROCcell(MPOS CONSTmpos):matrix.mat(impos(mpos))(jmpos(mpos))END PROCcell;CELL PROCcell(GPOS CONSTgpos):cell(mpos(gpos))END PROCcell;CELL PROCcell(INT CONSTi,j):matrix.mat(i)(j)END PROCcell;THESAURUS PROCvariablenthesaurus:matrix.vthesaurusEND PROCvariablenthesaurus;THESAURUS PROCergebnisthesaurus:matrix.ethesaurusEND PROCergebnisthesaurus;THESAURUS PROCparameterthesaurus:matrix.pthesaurusEND PROCparameterthesaurus;THESAURUS PROCformelthesaurus:matrix.fthesaurusEND PROCformelthesaurus;TEXT PROCaktuellermodellname:matrix.modellnameEND PROCaktuellermodellname;TEXT PROCaktuellermodellkurzname:matrix.modellkurznameEND PROCaktuellermodellkurzname;BOOL PROCwdlauffaehig:matrix.lauffaehigEND PROCwdlauffaehig;PROCwdlauffaehig(BOOL CONSTwert):matrix.lauffaehig:=wertEND PROCwdlauffaehig;PROCnewcell(OBJEKT CONSTobj,MPOS CONSTpos):initialisieren;verbindungen;inthesauruseinordnen.initialisieren:cell.obj:=obj;cell.mpos:=pos;cell.status:=TRUE;.verbindungen:INT VARi;FORiFROM1UPTOmaxlinkREPcell.fromorto(i).richtung:=0;cell.fromorto(i).mpos:=null;cell.fromorto(i).nr:=0PER.inthesauruseinordnen:i:=0;TEXT VARmposimtext:=text(impos(pos),lengthfuerintimtext)+text(jmpos(pos),lengthfuerintimtext);IFtyp(obj)=variableTHENinsert(matrix.vthesaurus,mposimtext,i)ELIFtyp(obj)=ergebnisTHENinsert(matrix.ethesaurus,mposimtext,i)ELIFtyp(obj)=parameterTHENinsert(matrix.pthesaurus,mposimtext,i)ELIFtyp(obj)=formelTHENinsert(matrix.fthesaurus,mposimtext,i)FI.cell:matrix.mat(impos(pos))(jmpos(pos)).END PROCnewcell;OP:=(CELL VARl,CELL CONSTr):CONCR(l):=CONCR(r)END OP:=;PROCdeletecell(MPOS CONSTm):deletecell(impos(m),jmpos(m))END PROCdeletecell;PROCdeletecell(INT CONSTi,j):matrix.mat(i)(j).status:=FALSE;INT VARd:=0;TEXT VARmposimtext:=text(i,lengthfuerintimtext)+text(j,lengthfuerintimtext);IFtyp(obj)=variableTHENdelete(matrix.vthesaurus,mposimtext,d)ELIFtyp(obj)=ergebnis THENdelete(matrix.ethesaurus,mposimtext,d)ELIFtyp(obj)=parameterTHENdelete(matrix.pthesaurus,mposimtext,d)ELIFtyp(obj)=formelTHENdelete(matrix.fthesaurus,mposimtext,d)FI.obj:matrix.mat(i)(j).obj.END PROCdeletecell;BOOL OP AUSGANG(CELL CONSTc,INT CONSTi):c.fromorto(i).richtung=toEND OP AUSGANG;BOOL OP EINGANG(CELL CONSTc,INT CONSTi):c.fromorto(i).richtung=fromEND OP EINGANG;MPOS OP UEBER(CELL CONSTc,INT CONSTi):c.fromorto(i).mposEND OP UEBER;INT OP NR(CELL CONSTc,INT CONSTi):c.fromorto(i).nrEND OP NR;TEXT PROCfreieverknuepfungspunkte(CELL CONSTc):TEXT VARfreiepunkte:="";INT VARi;FORiFROM1UPTOmaxlinkREP IF(c.fromorto(i).mpos=null)THENfreiepunkteCATtext(i,1)FI PER;freiepunkteEND PROCfreieverknuepfungspunkte;TEXT PROCbelegteverknuepfungspunkte(CELL CONSTc):TEXT VARfreiepunkte:="";INT VARi;FORiFROM1UPTOmaxlinkREP IF NOT(c.fromorto(i).mpos=null)THENfreiepunkteCATtext(i,1)FI PER;freiepunkteEND PROCbelegteverknuepfungspunkte;PROClink(MPOS CONSTsourcepos,INT CONSTsourcelinkpos,MPOS CONSTtargetpos,INT CONSTtargetlinkpos):source.fromorto(sourcelinkpos).richtung:=to;source.fromorto(sourcelinkpos).mpos:=targetpos;source.fromorto(sourcelinkpos).nr:=targetlinkpos;target.fromorto(targetlinkpos).richtung:=from;target.fromorto(targetlinkpos).mpos:=sourcepos;target.fromorto(targetlinkpos).nr:=sourcelinkpos.source:matrix.mat(impos(sourcepos))(jmpos(sourcepos)).target:matrix.mat(impos(targetpos))(jmpos(targetpos)).END PROClink;PROCloeschelink(MPOS CONSTactualmpos,INT CONSTnr):IFactualcellissourceTHENtarget.fromorto(targetlinkpos).richtung:=0;target.fromorto(targetlinkpos).mpos:=null;target.fromorto(targetlinkpos).nr:=0;source.fromorto(nr).richtung:=0;source.fromorto(nr).mpos:=null;source.fromorto(nr).nr:=0;ELIFactualcellistargetTHENsource.fromorto(sourcelinkpos).richtung:=0;source.fromorto(sourcelinkpos).mpos:=null;source.fromorto(sourcelinkpos).nr:=0;target.fromorto(nr).richtung:=0;target.fromorto(nr).mpos:=null;target.fromorto(nr).nr:=0FI.actualcell:matrix.mat(impos(actualmpos))(jmpos(actualmpos)).actualcellissource:INT VARsi:=impos(actualmpos),sj:=jmpos(actualmpos),ti:=impos(othermpos),tj:=jmpos(othermpos);actualcell.fromorto(nr).richtung=to.actualcellistarget:ti:=impos(actualmpos);tj:=jmpos(actualmpos);si:=impos(othermpos);sj:=jmpos(othermpos);actualcell.fromorto(nr).richtung=from.othermpos:actualcell.fromorto(nr).mpos.source:matrix.mat(si)(sj).target:matrix.mat(ti)(tj).targetlinkpos:source.fromorto(nr).nr.sourcelinkpos:target.fromorto(nr).nr.END PROCloeschelink;BOOL PROCbelegt(CELL CONSTc):c.statusENDPROCbelegt;BOOL PROCbelegt(MPOS CONSTm):matrix.mat(impos(m))(jmpos(m)).statusENDPROCbelegt;BOOL PROCbelegt(INT CONSTi,j):matrix.mat(i)(j).statusENDPROCbelegt;OBJEKT PROCobjekt(CELL CONSTc):c.objEND PROCobjekt;OBJEKT PROCobjekt(MPOS CONSTm):matrix.mat(impos(m))(jmpos(m)).objEND PROCobjekt;TEXT PROCtypbezeichner(CELL CONSTc):typbezeichner(objekt(c))END PROCtypbezeichner;OP WRITE(OBJEKT CONSTo,MPOS CONSTm):matrix.mat(impos(m))(jmpos(m)).obj:=oEND OP WRITE;MPOS PROCmpos(CELL CONSTc):c.mposEND PROCmpos;PROCgetmpos(THESAURUS CONSTt,MPOS VARm,INT VARi):TEXT VARmposimtext:="";get(t,mposimtext,i);IFmposimtext<>""THENm:=newmpos(int(subtext(mposimtext,1,lengthfuerintimtext)),int(subtext(mposimtext,1+lengthfuerintimtext,2*lengthfuerintimtext)))FI END PROCgetmpos;INT PROCanzahlmpos(THESAURUS CONSTt):INT VARi:=0,anzahl:=0;TEXT VARmposimtext:="";WHILEi""THENanzahlINCR1FI PER;anzahlEND PROCanzahlmpos;END PACKETmatrix;