Kalkulation

Spannende Frage in Visio: in einer Vorlage sollen die Daten von einem Shape an ein anderes weitergegeben werden und den verminderten Druck der Rohre durch die Anlage hindurch kalkulieren. Einen Teil habe ich heute programmieren können. Hat Spaß gemacht.

rohre

Kunst

Fast hätte ich es vergessen. Mein Kunst-Generierungsprogramm in das neue Visio-Buch einzufügen. Und den Code dazu:
Application.ActiveWindow.Selection.DeleteEx visDeleteNormal
intGrad = ActivePage.PageSheet.Cells(„Prop.Schwarzgrad“).Result(„“) For dblX = 1 To 32
For dblY = 1 To 32
Set vsRechteckshape = ActivePage.DrawRectangle _
(dblX / 2, dblY / 2, dblX / 2 + 0.5, dblY / 2 + 0.5)
dblZufall = Rnd * 100

If dblZufall < intGrad Then
vsRechteckshape.Cells(„FillForegnd“).Result(„“) = 0
End If
Next dblY
Next dblX

ActiveWindow.DeselectAll

grafik05 grafik06 grafik03 grafik04 grafik02 grafik01

London calling

Einfach toll diese Assistenten von Visio. Vor allem diejenigen, die man selbst bauen kann. Erinnerst sich noch jemand an den Assistenten, den Visio Corp mitgeliefert hat? London Calling!

Und hier das Ergebnis der U-Bahn-Suche

london02

Verfahrensablauf

Mit Visio kann man leicht Verfahrensabläufe darstellen. Mit einigen Zeilen Code kann man auch „Bewegung in die Sache bringen“, das heißt: die Shapes animieren lassen.
Sie finden das Beispiel auf meiner Homepage Papierfabrik, wo Sie das Beispiel herunterladen und den Code einsehen können. Mit einem Doppelklick auf den linken oberen LKW wird es gestartet.

papierfabrik

VBA

Hallo Zusammen!
Ich arbeite zur Zeit an der Generierung eines Cross-Functional-Charts mit VBA & Visual Studio 2010.
Ich bin mittlerweile soweit, dass ich aus einer Excel-Tabelle meine Pages und die dazugehörigen Swimlanes erstellen kann.
Nun möchte ich Prozess-Shapes in die Swimlanes legen, habe aber noch keine Lösung dazu gefunden.
habe es schon mit der ContainerProperties.AddMember Methode versucht. Die Shapes werden zwar den richtigen Swimlanes zugeordnet, werden aber nicht im Swimlane sondern daneben und übereinander positioniert.
Hat vielleicht jemand eine IDee/Code-Beispiele/Link-Tipps, um diesem Problem Herr zu werden?
Außerdem würde ich mich über ein paar Link-Tipps zum Thema Visio-Koordinatensystem und die Positionierung von Shapes interessieren.
Ich verstehe nicht, was es mit den einheitenlosen Angaben beim Drop-befehl auf sich hat.
Wo positioniert Visio ein Shape wenn ich folgenden Befehl eingebe?
Page.Drop(master, 2.5, 4.5)
Millimeter-Angaben können es ja nicht sein, wenn ich sie nicht explizit angebe.
Ich danke im Voraus schon mal für jede Hilfe und wünsche allen einen angenehmen Tag.
Viele Grüße
B.
###############
Hallo Herr B.,
Sie sollten in Visio immer die Maßeinheit dazu schreiben. Leider verwendet er häufig cm, manchmal allerdings inch.
Der Befehl
ActivePage.Drop(mastObj, 2, 3.5)
positioniert das Shape – genauer: den Pin des Shapes (meistens Mitte/Mitte – steht im ShapeSheet) an die x-Position 2 inch und die y-Position 3,5 inch – IMMER gemessen von der linken unteren Ecke des Zeichenblattes. Das Shape können und sollten Sie danach dorthin platzieren, wo Sie es haben wollen.
Beispiel:
Sub Shape_Aus_Schablone02()
Dim stnObj As Document
Dim mastObj As Master
Dim shpObj As Shape
If SchabloneOffen(„BASFLO_M.vss“) = False Then
Documents.OpenEx „BASFLO_M.VSS“, visOpenDocked
End If
If GibtEsMastershape(„BASFLO_M.VSS“, „Start/Ende“) = False Then
MsgBox „Das Shape „“Start/Ende““ existiert nicht.“
Exit Sub
End If
Set stnObj = _
Documents(„BASFLO_M.VSS“)
Set mastObj = stnObj.Masters(„Start/Ende“)
Set shpObj = ActivePage.Drop(mastObj, 2, 3.5)
shpObj.Cells(„PinX“).Result(visMillimeters) = 100
shpObj.Cells(„PinY“).Result(visMillimeters) = 60
shpObj.Text = „Ich bin der Terminator!“
End Sub
Function SchabloneOffen(Schablonenname As String) As Boolean
Dim stnObj As Document
Dim blnOffen As Boolean
blnOffen = False
For Each stnObj In Application.Documents
If Schablonenname = stnObj.Name Then
blnOffen = True
Exit For
End If
Next
SchabloneOffen = blnOffen
End Function
Function GibtEsMastershape(Schablonenname As String, _
Mastershapename As String) As Boolean
Dim stnObj As Document
Dim blnVohanden As Boolean
Dim mastObj As Master
blnVohanden = False
Set stnObj = Application.Documents(Schablonenname)
For Each mastObj In stnObj.Masters
If mastObj.Name = Mastershapename Then
blnVohanden = True
Exit For
End If
Next
GibtEsMastershape = blnVohanden
End Function
oder hier noch zwei Beispiele zum exakten Platzieren:
Sub ZellWerteSchreiben01()
Dim shpRechteck As Shape
Set shpRechteck = ActivePage.DrawRectangle(0, 0, 0, 0)
With shpRechteck
.Cells(„Width“).Result(„mm“) = 40
.Cells(„Height“).Result(„mm“) = 20
.Cells(„Angle“).Result(visDegrees) = 0
.Cells(„PinX“).Result(visMillimeters) = 100
.Cells(„PinY“).Result(visMillimeters) = 60
End With
End Sub
Sub ZellWerteSchreiben02()
Dim shpRechteck As Shape
Set shpRechteck = ActivePage.DrawRectangle(0, 0, 0, 0)
With shpRechteck
.Cells(„Width“).Result(„mm“) = 40
.Cells(„Height“).Result(„mm“) = 20
.Cells(„LocPinX“).Formula = „=Width*0.75“
.Cells(„LocPinY“).Formula = „=Height*0.75“
.Cells(„Angle“).Result(visDegrees) = 0
.Cells(„PinX“).Result(visMillimeters) = 100
.Cells(„PinY“).Result(visMillimeters) = 60
End With
End Sub
Auf meiner Seite visio-training.de finden Sie unter Beispiele / Programmierung einige Beispiele zum exakten Positionieren: Autorennen, Papierfabrik, Viertaktmotor
viel Spaß mit Visio wünscht Ihnen
Rene Martin

VBA

Guten Abend,
Ich habe da ein kleines Problem mit Visio und VBA und hoffe, dass mir jemand weiter helfen kann.
Mein selbst erstelltes Shape besteht aus 5 Textfeldern, die untereinander liegen. Quasi eine Tabelle mit 5 Zeilen und 1 Spalte. Ich schaffe es, auf das Shape per VBA zuzugreifen und den Text des Shapes zu manipulieren, jedoch gelingt mir das nicht mit den einzelnen Textfeldern.
Jedem Textfeld habe ich einen Namen vergeben, um nicht unbedingt über die ID darauf zugreifen zu müssen.
Leider hat das nicht geklappt.
Über Tipps oder Links zu hilfreichen Seiten würde ich mich sehr freuen und bedanke mich im Voraus für die Mühe.
Viele Grüße
###############
Hallo Herr B.,
ich vermute, Sie haben die Shapes gruppiert. Angenommen, die Gruppe heißt „Gruppe“ (in Visio 2010 kann ich dies in der Registerkarte „Entwicklertools“ Shape-Name einstellen – bis Visio 2007 in „Format / Objektdaten“. Angenommen die Shapes heißen T1, T2, … T5
Sie greifen auf die Shapes immer über die Hierarchie zu, also beispielsweiseweise folgendermaßen:
Sub TexteSchreiben()
Dim i As Integer
For i = 1 To 5
ActivePage.Shapes(„Gruppe“).Shapes(„T“ & i).Text = „Hallo ich bin es!“
Next
End Sub
Oder einzeln:
Sub MehrTexteSchreiben()
Dim vsDok As Document
Dim vsSeite As Page
Dim vsGruppe As Shape
Dim vsKasten As Shape
Set vsDok = ActiveDocument
Set vsSeite = vsDok.Pages(„Zeichenblatt-1“)
Set vsGruppe = vsSeite.Shapes(„Gruppe“)
Set vsKasten = vsGruppe.Shapes(„T1“)
vsKasten.Text = „ich bin der erste“
Set vsKasten = vsGruppe.Shapes(„T2“)
vsKasten.Text = „und ich der zweite“
Set vsKasten = vsGruppe.Shapes(„T3“)
vsKasten.Text = „und ich der dritte“
‚ […]
End Sub
Übrigens: kennen Sie mein Visio-Programmierbuch?
Microsoft Visio 2010-Programmierung: Visio 2010 effizient anpassen und erweitern [Gebundene Ausgabe]
schöne Grüße
Rene Martin

VBA: Geometrie-Sektion

Sehr geehrter Herr Martin
Ich hatte mir bereits vor Jahren das sehr gute Buch von ihnen „Visio programmieren“ gekauft.
Es hat immer sehr gut zu dem Visio Verständnis beigetragen. Nun konnte ich eine Fragestellung nicht beantworten:
Wie kann ich mit VBA in der Geometrie-Section eines Verbinders den Zeilentyp auslesen. (MoveTo,Linteto, Arcto usw)

Mehr anzeigen
Hinergrund ist folgender:
In einer sehr großen Visiodatei gibt es eine große Zahl an Verbindern (ca 250) Ich möchte nun die Daten der Verbinder in einer Textdatei speichern, um später den Verbinder wieder genau so herstellen kann wie diese einmal gewesen sind.
Ich bekomme nun bereits die via Code die Werte, aber nicht den Zeilentyp (MoveTo,Linteto, Arcto usw) Gibt es eine Möglichkeit diesen Zeilentyp zu ermitteln?
In Schnittpunkten mit anderen Verbinder wird von Visio automatisch ein ArcTo hinzugefügt; Ich denke das brauche ich nicht mit zu speichern.
Es wäre sehr nett wenn sie mir eine Antwort geben könnten.
Im Internet bin ich nach langer Suche leider nicht fündig geworden.
mit freundlichen Grüßen
N.L.
Sehr geehrter Herr L.,
Die Antwort: Nun Sie können den Zeilentyp mit der Eigenschaft RowType ermitteln. In Ihrem Beispiel füge ich den folgenden Code ein:
[…]
For currow = 0 To (nRows – 1)
nCells = shp.RowsCellCount(curGeomSect, currow)
Select Case shp.RowType(VisSectionIndices.visSectionFirstComponent, currow)
Case 137
MsgBox „visTagComponent“
Case 138
MsgBox „visTagMoveTo“
Case 139
MsgBox „visTagLineTo“
Case 140
MsgBox „visTagArcTo“
Case 141
MsgBox „visTagInfiniteLine“
Case 143
MsgBox „visTagEllipse“
Case 144
MsgBox „visTagEllipticalArcTo“
Case 165
MsgBox „visTagSplineBeg“
Case 166
MsgBox „visTagSplineSpan“
Case 193
MsgBox „visTagPolylineTov
Case 195
MsgBox „visTagNURBSTo“
Case 136
MsgBox „visTagTab0“
Case 150
MsgBox „visTagTab2“
Case 151
MsgBox „visTagTab10“
Case 181
MsgBox „visTagTab60“
Case 153
MsgBox „visTagCnnctPt“
Case 185
MsgBox „visTagCnnctNamed“
Case 162
MsgBox „visTagCtlPt“
Case 170
MsgBox „visTagCtlPtTip“
End Select
For curCell = 0 To (nCells – 1)
[…]
viel Spaß mit Visio
Rene Martin