Thomas Wölfers Baustatik-Blog

Thomas Wölfers Baustatik Blog

Codekana für Visual Studio: Erstes Release


Codekana für Visual Studio ist nun im ersten Release verfügbar. Das Ding kostet etwa 30 Euro - und ich kann es nur empfehlen: Weiss schon gar nicht mehr, wie ich ohne die Codekana-Erweiterungen leben konnte. (Achso: Es gibt auch eine 30-Tage-Testversion...)


Bald: Geometrie verschieben, rotieren, spiegeln


Das nächste Update von Baustatik steht demnächst an. Auf die neue Fensterverwaltung, die in diesem Zusammenhang kommen wird, war ich ja schon eingegangen. Ein anderer umfangreicher Punkt - von vielen Anwendern bisher schmerzlich vermisst - ist das verschieben, rotieren und spiegeln der Auswahl. Das wird aber im kommenden Update endilch auch drin sein. Konstrukte wie das aus der Abbildung sind dann also endlich deutlich weniger aufwendig herzustellen.


Leute gibts


Zum Beispiel der Mensch neben mir auf dem Rückflug Düsseldorf -> München. Er hatte auf den 50 Minuten Flug genau 2 Beschäftigungen: Nacktfotos diverser Damen aus einem Magazin bewundern und per Handy SMS abholen. Beide natürlich sehr verstohlen. So verstohlen das eben geht, wenn man Sitz an Sitz sitzt und das Heft A4 Format hat. Als er dann mit den SMS anfing, fing ich an mir Gedanken zu machen: Sagt ich nun was, oder glaube ich weiterhin daran, das das Handy-Verbot in Fliegern in Wirklichkeit keine Sicherheitsgeschichte ist, sondern in Wirklichkein nur eine Lärmbelästigungs-Vermeidungsregel. Ich habe dann nichts gesagt, und der Flieger kam heil runter.

Beweist natürlich gar nichts.


Der Fall mit der langen Berechnungszeit


Heute ist mir eine Datei untergekommen, bei der die Rechenzeit doch eher im unbrauchbaren Bereich lag: Das erzeugen des Netzes alleine brauchte fast 2 Stunden - damit kann man natürlich nicht vernünftig arbeiten. Beim System handelte es sich um eine Bodenplatte von etwa 100 x 30 m, die mit relativ vielen Einzellasten belastet war - außerdem waren ein paar Wände definiert.

Insgesamt gab es etwa 3600 Einzeleinwirkungen auf der Bodenplatte - und nach ein paar näheren Untersuchungen waren die es auch, die sich als das Problem herausstellten: Die Lasten waren als Knotenlasten und nicht als Faltwerkselement-Einzeleinwirkung definiert. Prinzipiell sollte es egal sein, welche der beiden Einwirkungsarten man verwenden - von der Performance her ist es aber so, das die deutlich besser wird, wenn man die Last als Faltwerkselement-Einzeleinwirkung definiert: In diesem Fall ist nämlich die zugehörige Platte schon bekannt und muss nicht erst ermittelt werden.

(Unabhängig davon ist das aktuelle Performance-Verhalten so nicht angebracht: Das werden wir auf jeden Fall nochmal näher untersuchen und verbessern.)

Die Lösung des Performance-Problems lag dann darin, das einfach alle Knoteneinwirkungen und Faltwerkselement-Einwirkungen "umgebaut" werden mussten. Man muss also die eine Einwirkung löschen, und dafür eine andere anlegen. Was kein Problem wäre - würde es sich nicht um 3600 Stück davon handeln. Die Lösung: Das folgende Makro. (Man erkennt schnell die Ähnlichkeit mit dem von gestern...:-) )


   IShell shell = context.TargetDocument.FindObject("NameDerPLatte", typeof(Shell)) as IShell;

   IDocObjectCollection loads = context.TargetDocument.GetObjects(typeof(INodeLoad));

   foreach (INodeLoad load in loads)
   {
      if( load.Lcs == LocalCoordinateSystem.Unit())
      {
         ShellSingleLoad newLoad = ShellSingleLoad.CreateNamed(context.TargetDocument);

         newLoad.ObjectName = load.ObjectName;
         newLoad.Loadcase = load.Loadcase;
         newLoad.LoadType = ShellSingleLoadTypes.Global;
         newLoad.SizeX = load.SizeX;
         newLoad.SizeY = load.SizeY;
         newLoad.SizeZ = load.SizeZ;
         newLoad.SizeXX = load.SizeXX;
         newLoad.SizeYY = load.SizeYY;
         newLoad.SizeZZ = load.SizeZZ;
         newLoad.Comment = load.Comment;
         newLoad.Node = load.Node;
         newLoad.Shell = shell;

         context.TargetDocument.RemoveObject(load);
         context.TargetDocument.AddObject(newLoad);
      }
   }

 


Beispielmakro: Stäbe zu Unterzügen


Vorab:

Makros in Baustatik
Erste Dokumentation für Baustatik-Makros

Es gibt Fälle, in denen man vorhandene Stäbe in Unterzüge umwandeln will - und zumindest zur Zeit liefern wir dafür keine fertige Funktion mit. Als Makro ist die Sache aber relativ einfach zu haben: Hier ein Makro, das genau diese Funktion erfüllt - zusammen mit ein paar Anmerkungen.

using System;
using DIE.Framework.ApplicationModell.Commands;
using DIE.Applications.Faltwerk.Objects.Beams;
using DIE.Applications.Faltwerk.Objects.BindingBeams;
using DIE.Framework.ObjectModell;

namespace MeineMakros
{
    public class stab2unterzug : UserCommandBase
    {
      // Initialisierung des Makrobefehls.
        public stab2unterzug() : base(@"stab2unterzug", @"übersetzt stäbe in unterzüge")
        {
        }
        
        // Einsprungsfunktion des Makros
        public override void Execute(IExecuteCommandContext context)
        {
            // alle balken holen (alternativ könnte man auch nur die
            // holen, die momentan ausgewäht sind.)
            IDocObjectCollection beams = context.TargetDocument.GetObjects( typeof(Beam));
            
            // über alle balken iterieren.
            foreach( IBeam beam in beams)
            {
                // für jeden balken einen neuen unterzug anlegen.
                BindingBeam bindingBeam = new BindingBeam();
                
                // all eigenschaften übertragen. die findet man in der
                // referenz-dokumentation (baustatik.chm) für die Objekte unter
                // https://www.die.de/blog/PermaLink.aspx?guid=d0d11a5f-9a4c-403b-8e48-1176fdf4b57b
                bindingBeam.ObjectName = beam.ObjectName;
                bindingBeam.StartProfile = beam.StartProfile;
                bindingBeam.EndProfile = beam.EndProfile;
                bindingBeam.Material = beam.Material;
                bindingBeam.DesignParameter = beam.DesignParameter;
                bindingBeam.AdditionalProfileRotation = beam.AdditionalProfileRotation;
                bindingBeam.Anfangsknoten = beam.Anfangsknoten;
                bindingBeam.Endknoten = beam.Endknoten;
                bindingBeam.RotLocalX = beam.RotLocalX;
                bindingBeam.StartJoint = beam.StartJoint;
                bindingBeam.EndJoint = beam.EndJoint;
                
                // den nicht mehr benötigten Stab löschen
                context.TargetDocument.RemoveObject( beam);
                
                // den neuen unterzug ins dokument tun
                context.TargetDocument.AddObject( bindingBeam);
            }
        }
    }
}

Wie man sieht: Auch wenn eine bestimmte Funktion nicht von uns mitgeliefert wird - mit wenigen Zeilen kann man sowas leicht selbst nachrüsten. :-)

 

stab2unterzug.cs (1.91 KB)

Eingabeaufforderung hier öffnen


Heute bei Raymond gefunden: Unter Vista enthält das Kontext-Menü im Explorer mehr Befehle, wenn man zusätzlich zum Rechtsklick auch die Shift-Taste drückt.  (Scheint nur auf den rechten Bereich des Explorers zuzutreffen.)

Im Fall von Ordnern gibt es zwei zusätzliche Befehle: "Eingabeaufforderung hier öffnen" - von früher aus den PowerToys unter dem Namen "Command Prompt her" bekannt, und "Als Pfad kopieren". Letzteres kopiert den kompletten Pfad zum Verzeichnis als Text in die Zwischenablage. Sehr praktisch für Skripte und ähnliche Anwendungen.