Hallo zusammen
Ich schreibe gerade ein Plugin, welches unter Anderem die Daten von Shapes auslesen muss. Konkret will ich beispielsweise die Daten eines Class - Objekts eines UML - Diagramms analysieren. Leider bringe ich es nicht fertig, die Attribute sowie Operationen eines Class - Objekts auszulesen. Wenn ich Visio starte, kann ich die entsprechenden Daten auch nirgends im ShapeSheet finden??? Wo sind denn diese Daten gespeichert?
Mfg Ishildur
Hallo zusammne
Es ist wie verhext, ich habe mir nun eine Dumping - Funktion geschrieben, um ein entsprechendes Visio - Shape zu analysieren, aber ich kann die gesuchten Daten einfach partout nicht finden... 🙁
Wo könnte man denn noch danach suchen?
// -------------------------------- method "Dump_VisioShape" --------------------------------
private void Dump_VisioShape(Visio.Shape shp,String strNme,StreamWriter stmOut,bool bTop){
// check if this was the start of the recursion
if(bTop){
// create a new file - stream and write the html - header
stmOut = new StreamWriter(new BufferedStream(new FileStream("shape_dump.html",FileMode.Create)));
stmOut.WriteLine("<html>\n<head>\n<title>Shape: "+shp.NameU+"</title>\n</head>\n<body>\n<table border=\"1\" style=\"font-size:8pt\">");
stmOut.WriteLine("<tr><th>Eigenschaft</th><th>Wert</th></tr>");
}
// write general information about the current shape
stmOut.WriteLine("<tr><td colspan=\"2\" style=\"background-color:Gray\">"+(strNme = !String.IsNullOrEmpty(strNme) ? " -> " : "")+shp.NameU+"</td></tr>");
stmOut.WriteLine("<tr><td>Data1</td><td>"+(!String.IsNullOrEmpty(shp.Data1) ? shp.Data1 : "null")+"</td></tr>");
stmOut.WriteLine("<tr><td>Data2</td><td>"+(!String.IsNullOrEmpty(shp.Data2) ? shp.Data2 : "null")+"</td></tr>");
stmOut.WriteLine("<tr><td>Data3</td><td>"+(!String.IsNullOrEmpty(shp.Data3) ? shp.Data3 : "null")+"</td></tr>");
stmOut.WriteLine("<tr><td>ID</td><td>"+shp.ID.ToString()+"</td></tr>");
stmOut.WriteLine("<tr><td>ID16</td><td>"+shp.ID16.ToString()+"</td></tr>");
stmOut.WriteLine("<tr><td>Name</td><td>"+shp.Name+"</td></tr>");
stmOut.WriteLine("<tr><td>NameID</td><td>"+shp.NameID+"</td></tr>");
stmOut.WriteLine("<tr><td>NameU</td><td>"+shp.NameU+"</td></tr>");
stmOut.WriteLine("<tr><td>Text</td><td>"+(!String.IsNullOrEmpty(shp.Text) ? shp.Text : "null")+"</td></tr>");
// start a loop for all sections
for(short i=0;i<25;++i){
// check if the current sectione exists
if(shp.get_SectionExists(i,0) != 0){
// create a new subtable for the current section
stmOut.WriteLine("<tr><td colspan=\"2\"><table border=\"1\" style=\"font-size:8pt\">");
// start a loop for walking each row
for(short k=0,c=shp.get_RowCount(i);k<c;++k){
// create a new row
stmOut.Write("<tr>");
// start a loop for walking each column
for(short l=0;shp.get_CellsSRCExists(i,k,l,0) != 0;++l){
// determine the current cell
Visio.Cell cel = shp.get_CellsSRC(i,k,l);
// write the current cell to the html - file
stmOut.WriteLine("<td><table border=\"1\" style=\"font-size:8pt\">");
stmOut.Write("<tr><td>Name</td><td>"+cel.Name+"</td></tr>");
stmOut.Write("<tr><td>LocalName</td><td>"+cel.LocalName+"</td></tr>");
stmOut.Write("<tr><td>Result</td><td>"+cel.get_ResultStr(VisUnitCodes.visNoCast)+"</td></tr>");
stmOut.WriteLine("</table></td>");
}
// close the current row
stmOut.Write("</tr>");
}
// close the current section
stmOut.WriteLine("</table></td></tr>");
}
}
// call this entire procedure recursively for alls childs and their childs and...
foreach(Visio.Shape shp2 in shp.Shapes) this.PrintShape(shp2,strNme,stmOut,false);
// check if this was the start of the recursion
if(bTop){
// close the table, flush the content of the buffer and close the stream
stmOut.WriteLine("</table>\n</body>\n</html>");
stmOut.Flush();
stmOut.Close();
}
}
// ------------------------------------------------------------------------------------------
Also diese Daten müssen definitiv an einem anderen Ort drinn stehen. Gibt es eine Möglichkeit, Daten mit einem Shape zu "verknüpfen" oder sowas ähnliches?
Also ich hatte soeben gelesen, dass man in Office VB - Makros aufzeichnen kann. Hei klasse Sache, dachte ich mir, ich veränderä einfach die entsprechende Eigenschaft, welche ich mit C# auslesen möchte und zeichne das Ganze aus, dann weiss ich, wo diese Daten gespeichert sind. Ich kann zwar kein VB aber ich werde sicher in der Lage sein, den entsprechenden Code zu übersetzen.
Also los:
Tools -> Makro -> Makro aufzeichnen
Meine UML Class doppelklicken, ein Attribut und eine Operation hinzufügen
OK
Makro beenden
Tools -> Makro -> Makros -> Bearbeiten
Aber was finde ich vor: Eine leere Sub Procedure....
Also langsam fange ich mich doch an, ein wenig zu fragen...
Wenn ich meine UML Class verschiebe, dann erscheint der Code schliesslich, wenn ich das entsprechende Makro bearbeite. Auch sämtliche Daten, welche in den Cells stehen. Aber die Attribute und Eigenschaften werden einfach nicht aufgezeichnet.
Soll das etwa heissen, dass man auf diese Daten schlicht nicht zugreifen kann? Wie soll man dann bitte schön ein Reverse - Engineering machen??? Ich kann offenbar noch nicht einmal abfragen, ob eine UML Class als "Abstract" deklariert wurde...
Also ich hoffe doch sehr, dass ich damit falsch liege?
Lg Ishildur