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

Text an der selben Position

Der Kunde möchte bestimmte Texte stets an der gleichen Stelle auf einem Zeichenblatt positioniert haben. genau: einige Millimeter oberhalb einer Linie.
Nun: mit einem Bezug auf die Y-Position des Shapes ist das kein Problem. Über ein Steuerelement kann der Text dennoch verschoben werden. So wie auch die Position des querlaufenden Balkens.

20161018messstelle01

201610108messstelle02

Verbindungspunkte

Kunde möchte auf einer Linie ganz viele Verbindungspunkte haben. Nun ein paar Zeilen Code und schon sind die 96 Verbindungspunkte im gleichen Abstand zueinander gesetzt. So etwas mache ich nicht per Hand!
20161018verbindungspunkte
Sub Verbindungspunkte()
 
Dim vsShape As Shape
Dim i As Integer
Set vsShape = ActivePage.Shapes(„Sheet.430“)
vsShape.AddRows visSectionConnectionPts, i, 0, 96
For i = 1 To 96
vsShape.Section(visSectionConnectionPts).Row(i).Cell(0).FormulaU = „=2 mm+2 mm*“ & (i – 1) * 2
Next
 
End Sub

Verborgene Blätter und pdf

Amüsant: Für eine Firma habe ich eine Vorlage eingerichtet. Sie enthält ein Zeichenblatt mit mehreren Elementen. Die Vorlage enthält ein weiteres Zeichenblatt, das ich über das ShapeSheet ausgeblendet habe (UIVisibility 1).
Ein Blatt ist verborgen
Ein Blatt ist verborgen
Nun fragte mich der Kunde, warum beim pdf-Export zwei Blätter ausgedruckt werden. Natürlich mein verborgenes Blatt.
Leider ein Blatt zu viel im pdf-Dokument
Leider ein Blatt zu viel im pdf-Dokument
Um dies zu verhindern, schaue ich ins ShapeSheet, ob es dort eine Blatt-Eigenschaft „NonPrinting“ (wie beim Shape) gibt. Leider nein.
Nun – da ich nur die Informationen des verborgenen Blattes benötige, wandle ich es in ein Hintergrundblatt um. Und damit wird es auch nicht gedruckt.

Linienformate

Hallo Herr Martin,
für technische Zeichnung benötige bei Shapes unterschiedliche Kantenabrundungen: Rechteck und Kurven. Wie mache ich das?
Die Antwort: So etwas funktioniert nur mit mehreren Shapes (die Sie natürlich gruppieren können). Ein Shape kann nur ein Linienformat besitzen.
20160923linie01
20160923linie02