Laden...

Daten innerhalb von Shapes (Visio 2007)

Letzter Beitrag vor 15 Jahren 4 Posts 2.120 Views
Daten innerhalb von Shapes (Visio 2007)

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