Thomas Wölfers Baustatik-Blog

Thomas Wölfers Baustatik-Blog

Das kann man doch bestimmt kurz einbauen...


Den Satz höre ich häufiger: Das kann man doch bestimmt kurz einbauen...

Gemein ist dabei eigentlich immer ein "ganz einfaches" Feature für die Baustatik. Nun geben wir uns ja redlich Mühe, Kundenwünsche zur erfüllen, nur: "Ganz einfach" ist eigentlich nie irgendwas. Um genau zu sein: Den Umfang, den schon die "einfachsten" Features in Form von Programmieraufwand annehmen, kann man sich kaum vorstellen. Hier ein kleines Beispiel:

Winkelstützmauer

In der Graphik für die Winkelstützmauer (ja ich weiss, die Zahlen die hier angezeigt werden machen keinen Sinn...) sollte folgendes erreicht werden:

  • Die Beschriftungen für die Bodenschichten sollten tabellarisch in die Graphik formatiert werden.
  • Die Tabellen sollten nicht in die Graphik reinragen
  • Die Bezeichnungen in den Tabellen sollten linksbündig sein
  • Die Werte sollten rechtsbündig sein
  • Rechts- bzw. Linksbündigkeit sollte auch über mehrere Bodenschichten hinweg vorliegen

Eigentlich "ganz einfach". Arbeitsaufwand: Etwa 220 Zeilen Programmcode und ca. 5 Stunden Arbeitsaufwand.

Nur, um ein paar Texte "hübscher" zu formatieren. Aber es macht ja Spaß... :-)


Paralle Programmierung


Gestern in München: TechTalk Parallele Programmierung mit Visual Studio 2010 und Intel Parallel Studio mit Dariusz Parys und Mario Deilmann.

Kurzfassung: War interessant.

Längere Fassung: Die Veranstaltung war grob in vier Teile unterteilt, davon ging es (leider) in drei Teilen hauptsächlich um nativen Code und diverse Intel Tools. Die sind sicherlich für viele von Interesse, mein Hauptinteresse wäre aber Managed Code und Visual Studio gewesen: Dieser Teil wurde von Dariusz bestritten der wohl ein wenig krank war - und darum eher kurz und (ein wenig zu) schnell abgehandelt wurde.

Insgesamt gesehen gab es zwar wenige Codebeispiele, dafür aber viel Hintergrundwissen rund ums entwickeln für multi-threaded Anwendungen: Auch wenn ich die Intel Tools eher nicht einsetzen werde sind viele Probleme wohl recht identisch - egal ob man managed oder nativen Code produziert. Was die Möglichkeiten in VS 2010 (und .Net 4.0) angeht wird man sich noch überraschen lassen müssen: Offenbar ist da noch vieles in Bewegung und unterscheidet sich sogar zwischen Beta 1 und Beta 2 noch stark. Im Kern ist aber eines klar: Man wird sich selbst nicht mehr um die Nutzung von Threads (oder dem ThreadPool) kümmern müssen - und das ist sicher mehr als wünschenswert.

Wer noch einen Platz bei den kommenden Terminen für den Talk bekommen kann: Hingehen.

Hintergrund Links: Parallel Computing bei MSDN, Parallel Programming for Managed Developers


Ein Makro zum verändern von Navigationspunkten


Manchmal möchte man einen oder mehrere bereits vorhandene Navigationspunkte verändern - dafür gibt es aber leider keine "wirklich" gute Funktion im normalen Umfang der Baustatik. Heute hatte ein Kunde ein derart gelagertes Problem, und darum haben wir ein kleines Makro zusammengebaut, mit dem man so etwas tun kann. Das folgende Makro tut folgendes: Es überträgt die ausgewählten Elemente sowie die Darstellungseigenschaften der aktuellen Ansicht in alle ausgewählen Navigationspunkte. Die Ergebnis-Einstellungen der ausgewählten Navigationspunkte bleiben erhalten.

Man kann das Makro einfach in den Makro-Editor kopieren und ausführen.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using DIE.Applications.Faltwerk.Objects.BeamStations;
using DIE.Framework.ApplicationModell.Commands;

namespace MeineMakros
{
    public class RepairNavi : UserCommandBase
    {
        public RepairNavi() : base(@"RepairNavi", @"RepairNavi")
        {
        }
        
        public override void Execute(IExecuteCommandContext context)
        {
         if(context.TargetDocument != null)
         {
            List<IBeamStation> beamStations = context.TargetDocument.GlobalSelection.GetObjects(typeof (IBeamStation)).ToList<IBeamStation>();

            if (beamStations.Count == 0)
            {
               MessageBox.Show("Wählen Sie zunächst Navigationspunkte aus.");
               return;
            }

            BeamStation template = new BeamStation();
            template.Init(context.TargetDocument, context.TargetView3d);

            foreach(BeamStation beamStation in beamStations)
            {
               beamStation.DefaultDisplayProperties = template.DefaultDisplayProperties;
               beamStation.SpecificDisplayProperties = template.SpecificDisplayProperties;
               beamStation.SpecificallyDisplayedGroups = template.SpecificallyDisplayedGroups;
            }
         }
        }
   }
}

 


Eine übersichtliche Liste aller Mix09 Videos


Die Videos der Mic09 Sessions stehen nun (fast) alle zum Download bereit - leider wie auch schon in den letzten Jahren in eher sehr chaotischer Form. Dankbarerweise hat sich Greg Duncan die Mühe gemacht, das mal zu konsolidieren: In seinem Blog gibts die Liste in übersichtlicher Form.

Übrigens: Die Audio-Qualität aller Videos die ich als WMV angesehen habe war fürchterlich - mit WMV-HQ war es hingegen ganz gut. Empfehle daher, von vornherein nur die HQ Titel anzusehen.


Internet Explorer cannot display this webpage


Situation: Man arbeitet unter Vista als Non-Admin mit Visual Studio und erstellt ein neues ASP.Net Web-Projekt. Als aller erstes versucht man dann, die erste fertige Seite im Browser anzeigen zu lassen. Dazu verwendet man den ins VS eingebauten Webserver. Beim IE bekommt man dann das hier:

(Bei anderen Browsern gehts auch nicht, aber davon habe ich keinen Shot.).

Lösung: Eine Konsole als Admin ausführen und nach \Windows\System32\drivers\etc gehen, und dort per "start notepad hosts" eine Kopie von Notepad zum bearbeiten der Hosts-Datei öffnen. Da drin ändert man dann die Zeile

::1   localhost

in

:::1   localhost

Dann gehts.


5 mal iterieren


Angenommen, man hat eine List<int> und jedes der Elemente daraus soll in ein Set<int>, das ungefähr so aussieht:

private class Set : Dictionary<int,int>
{
   public void Add( int v)
   {
      base.Add(v,v);
   }
}

Dann gibts mehr Möglichkeiten als man meinen möchte...

1.) Sehr Klassisch

private static void Foo0( List<int> list, Set dictionary )
{
   for( int i=0; i<list.Count; i++)
   {
      int v = list[i];
      dictionary.Add(v);
   }
}

2.) Klassisch

private static void Foo1(List<int> list, Set dictionary)
{
   foreach( int i in list)
   {
      dictionary.Add(i, i);
   }
}

3.) Per Delegate

private static void Foo2(List<int> list, Set dictionary)
{
  
list.ForEach(delegate(int i) { dictionary.Add(i, i); });
}

4.) Als Lamda-Expression

private static void Foo3(List<int> list, Set dictionary)
{
   list.ForEach( i => dictionary.Add(i,i));
}

5.) Als Method-Group

private static void Foo4(List<int> list, Set dictionary)
{
   list.ForEach(dictionary.Add);
}

 


Wie man herausfindet, ob die eigene C# Anwendung als x86 oder x64 läuft


Sofern man die "Platform Target" eines C# Projectes nicht explizit setzt, dann wird die Anwendung zur Laufzeit auf einer x86 Platform eine x86 Anwendung sein, und auf einer x64 Platform eine x64 Anwendung: Das ist praktisch, wenn man es nur mit managed Code zu tun hat, denn man bekommt die 64bit Variante quasi geschenkt.

Wenn man aber auch nativen Code hat muss man - je nachdem wie man die Anwendung baut - in Abhängigkeit der aktuellen Platform unterschiedliche DLLs laden. Also zum Beispiel die Calc32.dll für x86 und die Calc64.dll unter x64. Wie findet man aber nun heraus, ob man sich in einer x86 oder in einer x64 Umgebung befindet? MSDN läst sich zu diesem Thema nicht besonders aus; zumindest konnte ich nichts finden.

Allerdings liegt das vielleicht daran, das die Lösung mehr als einfach ist: Alles was man tun muss ist die Größe eines IntPtr anzusehen. Hat der Zeiger eine Größe von 8 Byte, dann befindet man sich in einer x64 Umgebung. (8 Byte mal 8 Bits => 64 bit).

Manche Dinge sind wirklich deutlich einfacher als man meinen sollte... :-)




Baustatik Demoversion ausprobieren »