seeseekey.net - Invictus Deus Ex Machina

Für ein U-Bahn-System welches ich auf meinem Minecraft-Server bauen wollte, war ich auf der Suche nach einem System um in einen Bahnhof einzufahren und nach einer gewissen Wartezeit wieder in die Richtung Fahrrichtung zu fahren, falls der Spieler nicht vorher aus der Lore aussteigt.

Das System von oben

Herausgekommen ist ein System, bei welchem der Zug einfährt und ein Redstone-Signal mit einer Aktivierungsschiene auslöst. Dieses Signal aktiviert eine Trichter-Clock. Über die Größe der Trichter-Clock kann die Zeitdauer des Stops auf dem Bahnhof bestimmt werden. Sobald die Trichter-Clock einmal im Kreis gelaufen ist, löst sie ein Signal aus und schießt den Zug ab. Damit das Signal lang genug ist wird eine Schaltung zur Verlängerung des Signals genutzt. Ansonsten würde der Zug während der Anfahrt stecken bleiben.

Die Signalverlängerung

Das Problem das der Zug in die richtige Richtung fährt, wurde dadurch gelöst das er vor dem Stopp eine Erhöhung befahren muss und in der Erhöhung zum stehen kommt. Bekommen die Schienen wieder das Redstone-Signal erledigt die Schwerkraft den Rest. Damit sind manuelle Abschüsse ebenfalls möglich.

Das Visual Studio formatiert den Quellcode automatisch nach den eingestellten Richtlinien. Wenn man nun aber die Richtlinien ändert, steht man vor dem Problem, das der Quelltext noch nach den alten Richtlinien formatiert ist.

Die Formatierungseinstellungen im Visual Studio

Die Formatierungseinstellungen im Visual Studio

Leider gibt es keine direkte Option im Visual Studio um den bestehenden Quelltext am Stück neu zu formatieren. Allerdings kommt man mit einem kleinen Makro (abgeleitet vom VS Formater Macro) an dieser Stelle weiter. Dazu wird im Visual Studio die Package Manager Console (zu finden unter Tools -> NuGet Package Manager -> Package Manager Console) geöffnet und dort folgendes eingegeben:

function f($projectItems) { $projectItems | ? { $_.Name -ne $null -and $_.Name.EndsWith( ".cs" ) -and -not $_.Name.EndsWith( ".Designer.cs" ) } | % { $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}') ; $win.Activate() ; $DTE.ExecuteCommand('Edit.FormatDocument') } ; if ($projectItems) { $projectItems | % { f($_.projectItems) } } }
 
$dte.Solution.Projects | % { f($_.ProjectItems) }

Das Visual Studio öffnet nun alle *.cs Dateien in der geöffneten Solution und formatiert die Quelltexte neu. Dieser Vorgang ist dabei relativ langsam und führt bei größeren Projekten dazu das das Visual Studio einfriert. Auf Stack Overflow gibt es eine elegantere Lösung:

function FormatItems($projectItems) {
    $projectItems |
    % {
        # Write-Host "    Examining item: $($_.Name)";

        if ($_.Name -and $_.Name.ToLower().EndsWith(".cs") `
            -and (-not $_.Name.ToLower().Contains(".designer."))) {

            $win = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}');
            $win.Activate();

            $dte.ExecuteCommand('Edit.FormatDocument');

            if (!$_.Saved) {
                Write-Host "    Saving modified file: $($_.Name)";
                $dte.ExecuteCommand('File.SaveSelectedItems');
            }

            $dte.ExecuteCommand('Window.CloseDocumentWindow');
        }

        if ($_.ProjectItems -and ($_.ProjectItems.Count -gt 0)) {
            # Write-Host "    Opening sub-items of $($_.Name)";

            FormatItems($_.ProjectItems);
        }
    };
}

$dte.Solution.Projects | % {
    Write-Host "-- Project: $($_.Name)";

    FormatItems($_.ProjectItems)
}
;

Bei dieser Lösung wird jede Datei nach der Neuformatierung, gespeichert und wieder geschlossen. Leider wird auch diese Lösung von Datei zu Datei langsamer, so das sie für größere Projekte wiederrum unbrauchbar ist. Mit der Extension Format Document gibt es eine Lösung welche schnell genug ist, allerdings funktioniert diese nur unter Visual Studio 2010. Nach einigen Anpassungen habe ich eine Version gebaut, welche auch unter Visual Studio 2012 und 2013 läuft. Das Problem an dieser Variante ist, das Dateien in Ordnern nur berücksichtigt werden wenn der Ordner im Solution Explorer geöffnet ist. Alles in allem ist keine der vorgestellten Lösungen wirklich optimal, allerdings kann man viele Fälle mit den vorgestellten Lösungen lösen.

Einen Smart in Parkposition zu bringen ist ein interessantes Unterfangen. Normalerweise stellt man das Auto ab und zieht die Handbremse an. Das ist im Winter allerdings mit Vorsicht zu genießen, da es unter Umstände passieren kann das die Bremse in diesem Fall festfriert und sich das Auto dann gar nicht mehr bewegt.

Die Schaltungsgestaltung in einem Smart

Die Schaltungsgestaltung in einem Smart

Wie parkt man also in diesem Fall? Da der Smart ein automatisiertes Schaltgetriebe hat, kann man nicht einfach einen Gang einlegen. Der Schlüssel lässt sich in der Stellung „A“ nicht entfernen. Auch eine Parkposition („P“) ist nicht vorhanden. Aber auch für diesen Fall gibt es eine Lösung. So reicht es einfach in den Rückwärtsgang („R“) zu schalten und anschließend den Schlüssel zu ziehen. Schon ist der Smart aus und ein Gang eingelegt, welcher das wegrollen verhindert.

Eine Automatik ist nur dann gut wenn man sie abschalten kann. So ist es auch manchmal beim Visual Studio mit der automatischen Codeformatierung. So nehme man folgende Klasse:

public class Trash: ContextBoundObject
{
    public Trash() : base()
    {
       throw new NotImplementedException();
    }
}

Die automatische Codeformatierung mach daraus folgendes:

public class Trash: ContextBoundObject
{
    public Trash()
        : base()
    {
       throw new NotImplementedException();
    }
}

Das „base“ wird dabei einfach umgebrochen. Das Problem ist das es (augenscheinlich) keine Einstellung gibt um das ganze zu verhindern.

Der Visual Studio Options Dialog

Und so muss man mit einer Automatik leben, die man nicht deaktivieren kann. Da sollte Microsoft mal etwas nachbessern oder mir verraten wie es geht 😉

Weitere Informationen gibt es unter:
https://seeseekey.net/archive/2434
http://stackoverflow.com/questions/1023014/how-to-stop-visual-studio-from-auto-formatting-certain-parts-of-code