ShapeSeet – Dynamische Daten

Sehr geehrter Herr Dr. Martin,
 
ich habe mir gerade Ihr Buch „Visio 2010 Programmierung“ zugelegt.
 
Ich habe ein Shape erstellt (Klimaschrank), das in den Abmessungen für eine Reihe von Modellen gleich ist, sich aber in den technischen Details unterscheidet. Ich habe mir deshalb eine Reihe von Shape Daten erstellt. Nun möchte ich die Shape Daten selbst (Properties) ändern, wenn ich das Modell in der Auswahlliste das Modell auswähle (CCD/U 41 A;CCD/U 61 A;CCD/U 81 A;CCD/U 121 A;CCD/U 171 A;CCD/U 201 A;CCD/U 110 CW;CCD/U 200 CW).
Ich habe mir mal das Beispiel mit der Flügelmutter angeschaut und versucht, den Durchmesser zu setzen. Dazu habe ich die Eigenschaft auf „Visible“ gesetzt und unter „Actions“ einen neuen Eintrag „Actions.Row_5“ mit „=SETF(GetRef(User.Diameter),Prop.Diameter)“ erzeugt. Leider bleibt der voreingestellte Wert immer erhalten, egal welchen Durchmesser ich angebe.
Wie kann man die Werte automatisch verändern? Muss ich dazu ein VBA Makro schreiben?
####
Hallo Herr P.,
 
Sie haben einen Parameter in der Formel vergessen, bzw. falsch eingetragen: Sie muss korrekt heißen:
 
=SETF(GetRef(Prop.Diameter.Invisible),FALSE)
 
wenn Sie die Eigenschaft einblenden woollen (Invibible = FALSE)
 
Sie können auch auf die Funktion GetRef verzichten und schreiben:
 
=SETF(„Prop.Diameter.Invisible“,TRUE)
 
wenn Sie sie wieder ausblenden wollen.
Oder Sie packen beide Funktionen in eine Zelle (dynamisch: ein- und ausschalten).
 
Wenn Sie den „Umweg“ übe eine benutzerdefinierte Zelle gehen, dann lautet die Formel:
 
=SETF(GetRef(User.Diameter),0)
 
oder fürs Ausschalten (die Alternative):
 
=SETF(„User.Diameter“,1)
 
Dann verweisen Sie in der Zelle Prop.Diameter.Invisible auf:
 
=User.Diameter
20160810Schraube02 20160810Schraube01

Action im ShapeSheet

Manchmal entgehen mir Dinge.
Ich gestehe, ich habe übersehen, dass Visio 2010 im ShapeSheet im Abschnitt „Action“ die beiden Spalten „BeginGroup“ und „FlyoutChild“ eingeführt hat. Die erste Spalte ist eigentlich nicht nötig, denn man kann auch mit einem Unterstrich im Menu arbeiten:
_Top
fügt vor dieser Zeile eine Trennlinie ein.
Praktisch ist jedoch „FlyoutChild – damit lassen sich Untermenüs erstellen. Visio hat bei den Shapes der Schablone „Zeitachsen-Shapes“ dies vorgemacht. Ein Blick ins Shapesheet zeigt, wie es funktioniert.
   20160428Action0120160428Action0220160428Action0320160428Action04

Umzug

Eine hübsche Fingerübung gestern in der Visio-Schulung:
Eine Teilnehmerin erhält vom Architekten Zeichnungen der Geschosse ihres Gebäudes. Die dxf-Dateien werden importiert und konvertiert.
Der Raum
Der Raum
Da es um die Möbelstücke darin geht, wird die Zeichnung auf ein Hintergrundblatt gelegt – ein Vordergrundblatt verwendet das Hintergrundblatt als Hintergrund.
Ein Shape für die Mitarbeiter wird erstellt. Beim Herausziehen werden die Informationen Zimmernummer, Abteilung, Quadratmeterzahl, Mitarbeitername und Durchwahl in einem Datenfenster abgefragt. Diese Informationen werden auf dem Shape angezeigt.
Mitarbeiterinformationen werden abgefragt.
Mitarbeiterinformationen werden abgefragt.
Die kleine Besonderheit: Wenn drei Mitarbeiter in einem Zimmer sitzen, wird das Shape größer und zeigt nun statt zwei eben die drei Namen an. Ein bisschen Shapesheet wird benötigt – auch zum Durchreichen der Daten von dem Gruppenshape an die Mitgliedsshapes, wo sie angezeigt werden.
Variable Höhe
Variable Höhe
Und schließlich noch ein paar Möbelstücke. Auch hier die Besonderheit: Beim Herausziehen wird abgefragt, ob sie neu sind (das heißt, ob sie angeschafft werden müssen). Wird die Frage bejaht, färbt sich das Shape ein (damit man die neuen Möbelstücke schneller finden kann).
Die Möbelstücke
Die Möbelstücke
Und schließlich wird ein Bericht generiert: Sammle alle Möbelstücke (alle Shapes, die auf dem Layer Möbel liegen) ein, die neu sind (deren Datenfeld bisduneu = WAHR); liste sie auf, gruppiere sie und zähle sie.
Und so wird die Liste für den Einkauf erstellt.
Wirklich ein schönes Beispiel.

Dynamische Shapes

Hallo Herr Martin,
ich sitze heute im HomeOffice und wollte mir eine vermeintlich einfache Aufgabe stellen.
Ich möchte mir ein Shape bauen das ich als „Rahmen verwenden möchte“ Das Shape soll so aussehen.
Ich will das als Sammelplatz für andere Shapes nutzen (ähnlich einem Container)
______________________
Überschrift hat eine Zeile
______________________

______________________
Überschrift hat eine Zeile
und noch eine
______________________

______________________
Ich möchte das die Überschrift immer so Hoch ist wie der Text (Also nur der obere Kasten soll wachsen die Größe des unteren ergibt sich dadurch das ich sie durch ziehen einstelle)
Der Kasten soll nach oben wachsen und auch die Schrift soll immer nach oben verschoben werden.
Ich habe das bisher so gelöst das ich zwei Vierecke miteinander gruppiert habe. Ohne Gruppierung bekomme ich das hin aber so wie die beiden Vierecke gruppiert sind verhält sich das Kästchen Überschrift anders.
ich sehe im shapesheet das sich die Bezüge verändern aber irgendwie komme ich nicht dahinter wie ich es machen muss.
Mir ist zum Beispiel nicht klar wie ich die einzelnen Betsandteile einer Gruppe ansprechen kann. In diesem Fall vermute ich das wir 3 Elemente haben.
Das Shape der ersten Viereck, das Shape des zweiten Viereck und das Shape der Gruppe.
Es wäre toll wenn sie mir eine Visiodatei mit einem Beispiel schicken könnten. Ich habe leider ihre Unterlagen nicht zu Hause, da steht die Lösung eventuell drinn.
Danke Ihnen
Gruß AT.
Hallo Herr T.,
Gruppe ist klasse; mit einer Gruppe kommt man gut hin. Ich nehme zwei Rechtecke; gruppiere sie. Jedes der drei Shapes hat einen Namen (Develloper / Shape-Name). Bei mir: Sheet.5, Sheet.6 und Sheet.7. Bitte nicht ändern! (Kleiner bug im Shapesheet)
Ich habe den Pin des oberen Shapes auf Mitte / oben gesetzt, den Pin des unteren auf Mitte / unten (über View / Task-Pane / Size & Position)
Ich schreibe Text in das obere Shape. Die Height im Shapesheet lege ich fest: =GUARD(TEXTHEIGHT(TheText,1)) – also: Höhe so groß wie die Texthöhe.
Außerdem achte ich darauf, dass PinY auf: =Sheet.7!Height*1 liegt, also Oberkante an Oberkante.
Beim unteren Kästchen stelle ich im Shapesheet ein:
Height: =Sheet.7!Height-Sheet.5!Height
Ebenso: Unterkante an Unterkante, also: PinY: = =Sheet.7!Height*0
Okay. Ganz dolle ist es noch nicht – am Verhältnis Höhe und Breite und Schriftgröße müsste man noch arbeiten.
Hilft Ihnen das?
schöne Grüße
Rene Martin
Hallo Herr Martin,
danke für die Antwort. Ich hatte mich mühsam rangetastet und es letzten ende hinbekommen.
Ein Frage:
Visio benennt die Shapes selbst numerisch. Shape.97 etc.
Kann ich den Shapes Sinnvolle Namen geben. Beispiel:
Shape.Oberertext
Shape.Unterertext
und so weiter?
Das würde es einfacher machen wenn man darauf referenziert
Danke und Gruß
Hallo Herr T,

wenn Sie Visio programmieren, dann bemerken Sie, dass Visio innerhalb einer Datei jedem Shape eine eindeutige ID zuweist. Das ist sinnvoll. Die wird im Shapesheet nicht verwendet. Steht aber auch im Dialog Shape-Name
Darüber hinaus bekommt jedes Shape einen Namen. Den kann man ändern, um leichter darauf zugreifen zu können. Nur: Im Shapesheet wird leider der von Visio vergebene Name verlangt (ich weiß, ich weiß, ist blöde … ich habe mich auch schon geärgert).
Aber das Konzept ist wichtig, weil: Wenn Sie das Shape in eine Schablone ziehen und nun wieder aufs Zeichenblatt zurück, bekommt das Shape (oder die Shapes bei einer Gruppe) neue Namen, d.h. Nummern zugewiesen. Sonst würde es zu Konflikten kommen mit
=Sheet.77!Height

Wenn Sie dem Teilchen in der Schablone einen Namen geben (also aus Master.1 bspw. „Server“ machen), dann heißt das erste Shape, das aus der Schablone gezogen wird: Server, das zweite Server.2, das dritte Server.3, …

Und: Wenn Sie das Fenster Size & Position öffnen, dann sehen Sie dort in der Titelzeile den Namen.

Wie auch bei einigen anderen Fragen von Ihrer Seite: Schulterzucken meinerseits; hat sich jemand so ausgedacht; man hätte es auch anders machen können. Immerhin, wenn Sie einen falschen Namen im Shapesheet tippen (bspw.: =Sheet.104!) dann hilft Intellisense nicht mehr weiter. So erkenne ich, ob der Name korrekt ist.

schöne Grüße

Rene Martintroester

Daten verknüpfen

Hallo Rene,
wie geht es dir? Hoffe alles gut und ihr hattet wie wir hier heute schon den ersten Schneefall?

Ich bekomm es leider immer noch nicht hin, dass ich das Feld „Zeichnungs-Nr.:“ mit den passend Feld in den Shape-Daten verknüpfe, so dass ich nichts mehr ins Schriftfeld schreiben muss.  Wie Funktioniert das richtig und möglichst einfach? Weiter ist mir noch eingefallen, dass das Feld „Datum“ mit „Datum Rev.A“ immer übereinstimmen muss. Das kann man doch bestimmt auch zusammenfassen oder?

Viele liebe Grüße
Nils
#####
Hallo Nils,

zu Deinen Fragen:

1. nö – zum Glück noch kein Schnee. Zum Glück, weil ich Fahrrad fahre und keinen Schnee in der Stadt mag!

2. Layer-Schutz raus vom Block. Markiere das Feld „Zeichnungs-Nr.:“ (es sind mehrere Klicks nötig, weil wahrscheinlich Gruppe in der Gruppe in der Gruppe) Dort wird ein Datenfeld „Zeichnungsnummer“ angelegt. Im ShapeSheet holst Du Dir die Info des Zeichenblattes:
=ThePage!Prop.Zeichnungsnummer
Schriftfeld20151014_1
Shape auf der Zeichnung markieren; mit [F2] editieren, an das Ende des Textes klicken (sonst wird der Text überschrieben). Und dort wird mit Einfügen / Feld das Datenfeld eingefügt.

Schriftfeld20151014_2

3. Klar – Du kannst einen Bezug von einem Shape auf ein anderes machen. Schau nach, wie es heißt (hier: Sheet.439). Und dann verweist Du mit =Sheet.439!Prop.Datum auf die andere Zelle.
Übrigens würde ich die 0 im Feld Datum ausblenden mit:
=GUARD(IF(ThePage!Prop.Datum=0,““,ThePage!Prop.Datum))

Kommst Du damit klar?

Wenn nicht – frag mich einfach

lg

Rene

 

Intelligenter Block

Hübsche Frage heute in der Visio-Schulung.
Wir hätten gerne einen Block, der beim Herausziehen Informationen abfragt. Diese Informationen sollen an bestimmte Stellen des Blocks geschrieben werden. Außerdem soll der Block in der rechten unteren Ecke stehen.
Das letzte ist schnell realisiert: Im ShapeSheet wird in der Zelle PinX eingetragen:
=GUARD(ThePage!PageWidth-10 mm)
Bei PinY:
=GUARD(10mm)
Für das erste Problem wird auf der Gruppe Daten definiert (hier: Prozess, Version, Verfasser).
In drei Mitgliedsshapes wird jeweils eines der Datenfelder angelegt, also: Prozess, Version und Verfasser.
Ein Verweis vom inneren zum äußeren Shape, beispielsweise:
=Sheet.52!Prop.Verfasser
zieht sich die Dateninformation. Diese wird nun über ein Feld eingefügt.
Über „Verhalten“ kann man verhindern, dass der Anwender aus Versehen in die Gruppe hineingelangt.
Über „Schutz“ kann man verhindern, dass der Anwender aus Versehen das Gruppenshape beschriftet.

Der Block wird herausgezogen
Der Block wird herausgezogen

Das Fenster „Shapedaten“

Es ist einfach und effektiv.
Ein Kunde hat an ein Zeichenblatt Datenfelder gebunden, die in einem Anmerkungsfeld rechts unten angezeigt werden. Da einige Benutzer dieses Fenster schließen, ist ein Mechanismus vonnöten, mit dem man wieder schnell öffnen kann. Na – eine Zeile „Action“ im ShapeShape. Der Befehl DoCmd(1312) öffnet jedoch das allgemeine, über dem Blatt schwebende Datenfenster. Schöner wäre das Andockfenster. Da ich den Befehl dafür nicht weiß, bemühe ich den Makrorekorder. Er zeichnet auf:
[…]
Application.ActiveWindow.Windows.ItemFromID(visWinIDCustProp).Visible = True
[…]
Im Objektkatalog finde ich die Zahl 1658 für die Konstante visWinIDCustProp. Und mit DoCmd(1658) wird das Andockfenster geöffnet.

Das Andockfenster wird geöffnet.
Das Andockfenster wird geöffnet.

Steuerelemente / Controls

Eine Firma möchte für Ihre technischen Zeichnungen einen Funktionsrahmen haben. Er soll jedoch nicht nur als Rechteck dargestellt werden, sondern möglicherweise Ausbuchtungen besitzen.
Nun – ein paar Zeilen Code im ShapeSheet und einige Steuerelemente ermöglichen dies.

Der Rahmen kann durchaus ein paar "Dellen" haben.
Der Rahmen kann durchaus ein paar „Dellen“ haben.

Funktionsrahmen20150904_1

Zugriff auf andere Seiten per ShapeSheet

Manchmal entdecke ich Dinge erst sehr viel später.
Ich dachte, dass es nicht funktioniert, auf ein Shape zuzugreifen, das auf einem anderen Zeichenblatt liegt. Die Hilfe liefert, dass der Verweis auf das andere Shape mit
=Pages[Blattname]!Shapename!Zelle
erfolgt. Ein Versuch:
=Pages[Zeichenblatt-2]!Sheet.1!Width
scheitert. Der Grund: Man darf nicht den Namen des Zeichenblattes (hier: Zeichenblatt-2), sondern den internen Namen (Hier: Page-2) verwenden. Wie ermittelt man ihn? Mit einer Zeile Code:
MsgBox ActivePage.NameU
Und dann liefert
=Pages[Page-2]!Sheet.1!Width
oder
=Pages[Page-2]!Sheet.1!Prop.Name
ein korrektes Ergebnis.

Leitungen

Servicefläche

Lustige Sache: Ein Kunde wollte bei einem technischen Gerät eine Service Fläche haben. Also füge ich in die Gruppe eine solche schraffierte Fläche ein. Natürlich soll die Fläche in der Größe variabel sein. Also wird der Gruppe ein Kontrollelement hinzugefügt, die Ecken des Rechtecks verweisen im ShapeSheet auf dieses Kontrollelement, man schränkt die Bewegung des Kontrollelements auf eine Richtung ein und gibt ihm eine Beschriftung und „schützt“ die Gruppe: der Anwender darf nur die Gruppe auswählen – nicht die Mitgliedselemente der Gruppe.

Servicefläche
Servicefläche