PinX und LocPinX

Gestern habe eine Visio-Zeichnung, aus der ich Informationen per Programmierung auslese, zurückgeschickt bekommen. Einige Informationen werden nicht gefunden, war der Vorwurf. Der Grund war schnell gefunden.
Der „Nachbarrtisch“ wurde nicht gefunden, weil ich davon ausgehe, dass der Pin sich immer in Mitte-Mitte des Shapes befindet. Wenn allerdings der Anwender (aus Versehen) den Pin verschiebt, so stimmen meine Programmierresultate nicht mehr.
Ich könnte nun die Position des LocPinX und LocPinY berechnen. Ich tendiere dazu in den Shapes die Funktion =Width*0.5 und Height*0.5 mit der Funktion GUARD zu sperren.

Pfeilrichtung

Ich lese per Programmierung die Laufrichtung von Gängen von Visio-Zeichnungen aus. Ich stutze, weil das Ergebnis nicht korrekt ist. Schaue mir die Zeichnungen genauer an: Warum zeigen einige Pfeile mit einem Winkel 90° nach links, während andere Pfeile mit dem Winkel -90° auch nach links zeigen? Die Lösung ist schnell gefunden: einige Pfeile wurden gespiegelt. Also muss man neben dem Winkel auch noch FlipY überprüfen. Dann findet man die Pfeilrichtung.

Gruppenschutz

Ich verwende diesen Pararmeter gerne und häufig in Visio.
Sicherlich ist Ihnen schon bei vielen Shapes aufgefallen, dass ein Schutz auf Ihnen liegt – das Aufheben der Gruppierung ist nicht möglich. Ein Blick in Entwicklertools / Shape-Design / Schutz hilft auch nicht weiter.
Der Schutz liegt eine Ebene tiefer: im ShapeSheet im Abschnitt „Protection“ wurde der Wert der Zelle „LockGroup“ auf 1 (True) gesetzt. So kann der Anwender nicht mehr versehentlich die Gruppierung aufheben ([Shift] + [Strg] + [U]).
Ich schalten diesen Schutzmechanismus gerne bei Shapes ein, die ich an Firmen ausliefere – ein kleiner Schutz.

Der Nummerierungsassistent

Amüsantes Problem, das letzte Woche in der Visio-Schulung aufgetreten ist:
Einer Firma arbeitet in Visio mit dem Nummerierungsassistenten. Die Nummer soll aber nicht im Shape sondern außerhalb angezeigt werden. Hierfür würde ein weiteres Shape angelegt, das die Nummer des ersten Shapes „zieht“, beispielsweise über:
=Sheet.1!Prop.ShapeNumber
Diese Nummer in den Shapedaten kann man nun anzeigen lassen.
Beide Shapes werden gruppiert, was allerdings zur Folge hat, dass sich der Verbindungspunkt nicht mehr in der Mitte des Shapes befindet, was man leicht feststellt, wenn man eine Verbindungslinie zieht.
Die Frage war: Wie bekommt man die Gruppe verkleinert?
Die Lösung: Man schiebt das „Nummernshape“ in das große Shape.
Anschließend legt man ein weiteres Shape auf die Gruppe, das man „zur Gruppe hinzufügt“ (Start / Anordnen / Gruppieren).
Nun kann man das „Hilfsshape“ wieder löschen und das Nummernshape zurückziehen.
Dann funktioniert das Verbinden.
Tipp: Wenn die Nummer nicht im Shape, also nicht auf der Gruppe erscheinen soll, schalten Sie beim Nummerieren die Option „Shape-Nummern ausblenden“ ein (zweite Registerkarte: „Weitere Optionen“)

Nachbarshapes

Der Befehl
SpatialRelation
ist klasse: damit kann man überprüfen, ob ein Shape in der Nähe eines anderen liegt. Durchläuft man mit einer Schleife alle Shapes, kann man schnell die Nachbarn herausfinden.
Allerdings: ich suche die benachbarten „Regale“ zu den Spirituosen und finde drei Regale (ich suche nur nach den weißen Shapes). Was tun? Also doch ein bisschen x- und y-Rechnung:
For j = 1 To UBound(strShapeNameMitText)
If vsBlatt.Shapes(strShapeNameMitText(j)).Cells(„FillForegnd“).Result(„in“) = 1 Then
If Asc(Left(vsBlatt.Shapes(strShapeNameMitText(j)).Text, 1)) <> 63 Then
If vsBlatt.Shapes(strShapeNameMitText(i)).SpatialRelation(vsBlatt.Shapes(strShapeNameMitText(j)), dblTolerance, visSpatialIncludeHidden) > 0 Then
If CInt(vsBlatt.Shapes(strShapeNameMitText(j)).Cells(„Angle“).Result(„deg“)) = 0 Then ‚ — waagrecht
If (vsBlatt.Shapes(strShapeNameMitText(j)).Cells(„PinX“).Result(„cm“) >= vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„PinX“).Result(„cm“) – _
vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„Width“).Result(„cm“) / 2 And _
vsBlatt.Shapes(strShapeNameMitText(j)).Cells(„PinX“).Result(„cm“) <= vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„PinX“).Result(„cm“) + _
vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„Width“).Result(„cm“) / 2) Then
xlZelle.Offset(lngExcelZeile, 8).Value = vsBlatt.Shapes(strShapeNameMitText(j)).Text
xlZelle.Offset(lngExcelZeile, 9).Value = vsBlatt.Shapes(strShapeNameMitText(j)).Name
lngExcelZeile = lngExcelZeile + 1
blnRegalierung = True
End If
Else
If (vsBlatt.Shapes(strShapeNameMitText(j)).Cells(„PinY“).Result(„cm“) >= vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„PinY“).Result(„cm“) – _
vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„Width“).Result(„cm“) / 2 And _
vsBlatt.Shapes(strShapeNameMitText(j)).Cells(„PinY“).Result(„cm“) <= vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„PinY“).Result(„cm“) + _
vsBlatt.Shapes(strShapeNameMitText(i)).Cells(„Width“).Result(„cm“) / 2) Then
xlZelle.Offset(lngExcelZeile, 8).Value = vsBlatt.Shapes(strShapeNameMitText(j)).Text
xlZelle.Offset(lngExcelZeile, 9).Value = vsBlatt.Shapes(strShapeNameMitText(j)).Name
lngExcelZeile = lngExcelZeile + 1
blnRegalierung = True
End If
End If
End If
End If
End If
Next

Symmetrisches Shape

Hallo Herr Martin,
Das Zentrum des Shapes soll seine y-Koordinaten nicht verändern, nur die Linien sollen sich (symmetrisch?) verlängern und die Texte auf Höhe der Dreiecke bleiben. Wie mache ich so etwas?
Hallo Herr M.,
Die Antwort zu Ihrem Supply Limit: es gibt keine Taste, um die Höhe (oder Breite) symmetrisch zum Pin zu ändern. Man könnte es über das Fenster Ansicht / Größe und Position machen – umständlich!

Ich schlage ein bisschen ShapeSheet vor: Fügen Sie einen Controlpunkt ein und beziehen die beiden Labels, die beiden Dreiecke und die beiden Enden der Linie auf diesen Punkt.

Sie finden meine Lösung unten links in dem roten Kasten. Hilft das?

Ein Ventil

Heute fragte eine Teilnehmerin in der Visio-Schulung, wie man es machen kann, dass beim Vergrößern eines Ventils nur das „T“ wächst. Die Antwort: man muss einige relative Verweise durch absolute Zahlen ersetzen – dann wird weder das „N“ vergrößert noch ändert sich die Unterkante des „T“.

 

Hintergrund- und Vordergrund

Guten Tag Herr Martin,
Ich habe ihre Videos auf Video2Brain gesehen und angefangen mit Visio zu basteln. Ist es möglich im ShapeSheet des Zeichenblattes eine Referenz zu dem X Wert des Hintergrundes herzustellen?
Ziel ist es, dass das Hintergrundblatt ,bei Änderung von Hoch- in Querformat, sich automatisch anpasst.
Ich würde mich über eine Antwort freuen.

Mit freundlichen Grüßen FK.


Hallo Herr K.,
ja – verweisen Sie vom Hintergrundblatt auf das Vordergrundblatt, indem Sie bei PageWidth eintragen:
=Pages[Page-1]!ThePage!PageWidth
Analog bei PageHeight:
=Pages[Page-1]!ThePage!PageHeight
Und: dann sollten Sie Shapes die Hintergrundblattes auf die Größe verweisen lassen – also das Logo sitzt beispielsweise bei:
ThePage!PageWidth-10 mm
und bei
ThePage!PageHeight-10 mm
wenn die beiden LocPinX und LocPinY bei:
Width*1
und bei
Height*1 sitzen.

Hyperlinks in Excel auf Visio-Dateien

Erstaunlich:
ein kleines VBA-Skript schreibt die Namen aller Dateien eines Ordners in eine Exceltabelle.
Sub AlleVisioZeichnungen()
Dim strPfad As String
Dim strDatei As String
Dim i As Integer

strPfad = „D:\Eigene Dateien\Visio\contoso\“

strDatei = Dir(strPfad, vbNormal)
i = 2
Do While strDatei <> „“

If Right(strDatei, 4) = „.vsd“ Or Right(strDatei, 4) = „.vsdx“ Or Right(strDatei, 5) = „.vsdm“ Then
ActiveSheet.Cells(i, 1).Value = strDatei
Range(„A1“).Hyperlinks.Add Anchor:=ActiveSheet.Cells(i, 1), _
Address:=strPfad & strDatei, _
TextToDisplay:=strDatei
i = i + 1
End If

strDatei = Dir

Loop

End Sub

Nicht nur die Dateinamen, sondern erstellt auch einen Hyperlink auf die Datei.
20161127link01
Beim Aktivieren des Hyperlinks wird zwar die Datei geöffnet, allerdings nicht die Schablonen, die eigentlich mit dieser Datei verknüpft sind. Sehr ärgerlich!
20161127link02

Steuerelemente und Gruppen

Der Umgang mit den verschiedenen Koordinatensystemen in Visio ist nicht trivial:
Ein Shape besitzt einen PinX und PinY, die auf dem Zeichenblatt verortet sind. Ihre Position innerhalb des Shapes wird durch die Zellen LocPinX und LocPinY festgelegt. Darauf beziehen sich sowohl Textblöcke als auch andere Shapes, wenn das „Hauptshape“ eine Gruppe darstellt.
Gegeben sei eine solche Gruppe (Sheet.4) Liegt auf der Gruppe nun ein Steuerelement (ein Control), darf die Linie des inneren Shapes nicht auf
=Sheet.4!Controls.Row_1.Y
verweisen. Das Control bezieht sich auf die Geometrie der Gruppe. Man muss es auf
=Sheet.4!Controls.Row_1.Y-Sheet.4!Height/2
setzen. Der Faktor 0.5 kommt dadurch zustande, weil der LocPinY auf Height*0.5 liegt. Dann funktioniert es.
20161101controls01
20161101controls0220161101controls03