3D-Konstrunktions-Engine für den Möbelbau mit Autoit möglich?

  • Servus...

    Neues dazu im Post 9

    Ich würde gerne ein neues Projekt machen und möchte dazu mal eure Meinung hören :!: .....

    Am besten erzähl ich als erstes mal wie ich auf die Idee gekommen bin. Ich arbeite jetzt seit knapp nem 3/4 Jahr als Holztechniker in nem Betrieb in der Nähe von Frankfurt in der Arbeitsvorbereitung. Wir haben in unserem Angebot einen Art Standartschrank der sich eigentlich sehr gut verkaufen lässt. Bei dieser Art von Schrank wird bei uns die Stückliste der Einzelteile immer noch von Hand geschrieben (zwar Teils kopiert aber halt zu viel von Hand). Auch der Mitarbeiter an der CNC (Computergesteuerte Bearbeitungsmaschine um Verbindungen vorzufertigen) fertigt die da zu passenden CNC-Programme komplett von Hand.

    Ich weiß jetzt nicht ob von Euch jemand das Programm IMOS kennt... aber dieses sehr teure Programm ermöglicht alles Oben genannte FAST vollautomatisch.... nur leider wesentlich zu Kompliziert und leider auch nur schwierig an neue spezielle Begebenheiten anzupassen.

    Meine Idee ist jetzt eine abgewandelte Art zu Entwickeln, die wesentlich einfacher ist und mehr wie eine Art Baukastensystem funktioniert.
    Ich denke mal dass solch ein Projekt eine sehr lange Entwicklungszeit benötigt. Am meisten Sorgen machen mir aber nicht die Gedanken über die Entwicklungszeit sondern welche sinnvollen Komponenten in Richtung Datenbank und grafischer Ausgabe ich wählen sollte.

    Als DB stehen natürlich viele zur Auswahl.... bis jetzt habe ich nur MySQL (XAMPP) und SQLite gearbeitet.
    Grafik sollte natürlich über die GDI zu realisieren sein. ( Denke dabei gerne an UEZ :thumbup: ) Habe auch schon was von der Irrlicht Engine gehört aber noch keine Erfahrungen damit gemacht.
    Würde halt mal gerne eure Meinung dazu hören....

    Damit ihr euch das in etwa vorstellen könnt was Grafisch darstellbar sein sollte habe ich mal ein Bild aus dem IMOS Konstruktionsmanager hier eingefügt.

    autoit.de/wcf/attachment/6568/

    Würde mich über konstruktive Kritik, Ideen und Hilfe freuen... 8|

    MFG chris :D

  • Hört sich gut an, hast wie immer großes vor :D

    Kennst du das Irrlicht-Engine? Vielleicht lässt es sich darüber realisieren. Empfehlen als DB würde ich SQLite, da du nicht an einen lokalen Webserver gebunden bist und der Funktionsumfang, Syntax und Geschwindigkeit ähnlich sind.

    Viel Erfolg! ;)

  • Ich war 4 Jahre lang CNC-Fräser in einer Möbeltischlerei.
    Wir hatten das so gelöst, daß die Stückliste per Hand geschrieben wurde (weiß jetzt leider das Optimierungsprogramm nicht mehr), z.b.:

    Zitat

    1 HA-L 2000 500 19...
    1 HA-R 2000 500 19...
    1 BO-O 962 479 19...
    5 FA 962 470 19...
    1 BO-U 962 479 19...


    und eine Software hat daraus berechnet, wie die einzelnen Teile gefräst werden müssen.
    Incl. Reihenlochbohrung, Türbänderbohrung, Rückwandnut, Dübelbohrungen, Offset für verschiedene Kantenstärken usw...

    Da kam es natürlich immer zu Problemen, besonders bei Spezialfällen...
    Deshalb wollte ich damals schon so eine Software, wie du sie vorhast, schreiben :)

    Wenn du die Darstellung nicht unbedingt 3D haben willst, sondern nur Dreitafelprojektion, dann geht das mit GDI+ eigentlich ganz einfach.

    Bei 3D muß ich leider passen...

    zumindest würd ich gerne etwas mithelfen;)

    mfgE

    Edit: Nein XNC kenn ich nicht, aber das Ausgabeformat kann ja beliebig sein, denk ich mal...

  • coool ^^....@eukalyptus
    naja das mit der Stückliste ist ja ganz ganz einfach auch die Woodwop Progs für so ne Standart Kiste sind natürlich variabel schreibbar sodass nur noch höhe/breite bzw. tiefe angepasst werden muss...

    Optimierungsmäßig sind wir mit ne Holzma-Bargstedt Kombination ( Plattensäge und vollautomatisches Plattenlager) so ziemlich aufm neuesten Stand nur an der CNC hägen wir echt in der Steinzeit fest ^^ und genau deshalb möchte ich es irgendwie so gestalen das nicht nur XNC sondern auch WoodWops mpr und andere ausgegeben werden können. aber bis wir da sind gibts noch massig Arbeit ^^

    Dachte halt schon an die GDI und an die Dimetrie ähnlich des Konstruktionsmanagers bei IMOS halt ^^

    Edit: @eukalyptus würd mich natürlich freuen wenn du mitmachen würdest ^^

    MFG chris :D

  • Also für die Visalisierung könntest du auf ein fertiges 3d Kern zurückgreifen, wie zB. das hier:
    Sketchup
    Ich meine da wird eine ActiveX DLL mit installiert, findest du über Oleview.(IDL auslesen)
    Ein freier Viewer für die SKP Dateien ist ebenfalls auf der Webseite.
    oder das hier für die Kundepräsentation über html.
    Sketchup Webexporter
    Über AutoitX könntest du die Bibliotheken steuern, erstellen und dein eigenes dynamisches Baukastensystem bauen.
    STL-DXF-Plugin
    Hier findest du ein Passendes Freeware Plugin für MeshData in STL oder DXF format.
    Das wiederum könnte dir Helfen deine Modelle in CNC Code umzuwandeln über das Programm hier:
    Es sei, du schreibst dein eigenen Exporter.
    FreeMill

    Übrigens, die 3dProgramme für den Möbelbau finde ich überteuert und die Visualisierung entspricht der Engine "Hundert Jahre vor den Affen"

    Deine Idee finde ich gut, hätte ich Zeit und mehr Erfahrung in Programmierung würde ich so ein Projekt auch wagen.
    MfG OpaEd

    - MfG OpaEd

  • waooooooo

    @opaed hammer echt... super Grundgedanken ^^ bin echt überrascht das ich hier damit auf so viel Ideen von anderen stoße!!!!
    aber warum wagen... mitmachen heißt das Konzept ^^...

    Muss mich morgen erst mal durch den ganzen Kram lesen den du mir da gelistet hast ^^...

    Edit: Achja zum Thema zu teuer... geb ich dir 100% recht!!! aber was die Visualisierung angeht guck dir mal IMOS 9.0 mit ImosNET an.
    da geht schon einiges ^^...

    MFG chris :D

  • Servus....

    [Blockierte Grafik: http://img696.imageshack.us/img696/1308/logoqst.png]

    Also ist zwar etwas her aber ich bin mal etwas weiter gekommen .... und ja es hat schon einen Namen ^^ Infiniti... leider muss ich sagen das mir die SketchUP Engine irgendwie nicht so gut gefällt. Vom ansteuern her und bearbeiten her.... die dazugehörige RubyConsole ist auch nicht so der hammer... aber vieleicht mache ich ja auch einfach was falsch??? Achja es gibt ja die Möglichkeit für Excel so Objekte zu erstellen.... geht das mit Sketchup auch? habe es mit oleview.exe wie in der Hilfe von Autoit probiert.... aber leider kein Ergebnis bekommen.... :cursing:

    ThisWorksList: :D

    • Variablen Schrank erstellen ohne Zwischenwände
    • Variable Dicken
    • Variable Sockelhöhe
    • Variable RW-Nutmaße u Einsprungsmaße
    • das ganze 3D in SketchUP darstellen....
    • Logo erstellt

    ToDoList: ;(

    • Grafische Oberfläche ( Inneneinteilung und Außenmaße eines Schrankes erstellen )
    • Datenbank ( SQLite )
    • auto Rendering ( immer aktuelle Ansicht der eingegebenen Variablen in der SketchUP 3D Engine )
    • verschiedene Oberfläschen über das Möbel legen

    Probleme: :cursing:

    • Ich würde gerne nur die 3D Ansicht von SketchUP in einen Gui einbetten...

    Was brauche ich um Infiniti ans laufen zu bekommen?

    • SketchUP runterladen und Installieren. SketchUP.exe Verzeichnis im Script gegebenenfalls anpassen ( Achtung bitte darauf achten das es die Deutsche Version ist. Am besten meinen Link benutzen :!: )
    • infiniti.rb ins ...\SketchUP\Plugins Verzeichnis kopieren, damit beim starten von SketchUp die RubyKonsole sich öffnet

    Wie siehts bis jetzt aus?

    [Blockierte Grafik: http://img3.imageshack.us/img3/2604/image1ua.jpg

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <string.au3>
    ;~ #include 'Infiniti_Startup.au3'

    [/autoit] [autoit][/autoit] [autoit]

    Local $_Infiniti_ProgrammName = "Infiniti 2010"
    Local $_Infiniti_Programmversion = "0.0.0.1"
    Local $_Infiniti_SketchUp_Verzeichnis = "C:\Programme\Google\Google SketchUp 7\SketchUp.exe"
    Local $_Infiniti_SketchUp_Main_WindowName = "SketchUp"
    Local $_Infiniti_SketchUp_Main_ConsoleName = "Ruby-Konsole"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _SketchUp_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $AbsoluterNullPunkt_x = 0
    Global $AbsoluterNullPunkt_y = 0
    Global $AbsoluterNullPunkt_z = 0
    Global $RW_Einsprung = 10
    Global $RW_Nuttiefe = 6
    Global $RW_Mat_dicke = 8
    Global $Materialdicke = 19
    Global $Totale_Breite = 1200
    Global $Totale_Hoehe = 2200
    Global $Totale_Tiefe = 400
    Global $Sockelhoehe = 60

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _Infiniti_Zeichne_Korpusseite_L($Totale_Hoehe,$Totale_Tiefe,$Materialdicke)
    _Infiniti_Zeichne_Korpusseite_R($Totale_Hoehe,$Totale_Tiefe,$Materialdicke)
    _Infiniti_Zeichne_OberBoden($Totale_Hoehe,$Totale_Tiefe,$Materialdicke)
    _Infiniti_Zeichne_UnterBoden($Totale_Hoehe,$Totale_Tiefe,$Materialdicke)
    _Infiniti_Zeichne_RW($Totale_Hoehe,$Totale_Tiefe,$Materialdicke)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Infiniti_Zeichne_RW($_Hoehe,$_Tiefe,$_Mat_Dicke)
    Return _SketchUp_Draw_Object($AbsoluterNullPunkt_x + $_Mat_Dicke - $RW_Nuttiefe _; Startpunkt Punkt 1 (Drehrichtung mit Uhrzeigersinn)
    ,$AbsoluterNullPunkt_y + $_Tiefe - $RW_Einsprung - $RW_Mat_dicke _
    ,$AbsoluterNullPunkt_z + $_Hoehe - $Materialdicke + $RW_Nuttiefe _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke - $RW_Nuttiefe _; Punkt 2
    ,$AbsoluterNullPunkt_y + $_Tiefe - $RW_Einsprung _
    ,$AbsoluterNullPunkt_z + $_Hoehe - $_Mat_Dicke + $RW_Nuttiefe _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke - $RW_Nuttiefe _;Punkt 3
    ,$AbsoluterNullPunkt_y + $_Tiefe - $RW_Einsprung _
    ,$AbsoluterNullPunkt_z + $Sockelhoehe + $_Mat_Dicke - $RW_Nuttiefe _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke - $RW_Nuttiefe _;Punkt 4
    ,$AbsoluterNullPunkt_y + $_Tiefe - $RW_Einsprung - $RW_Mat_dicke _
    ,$AbsoluterNullPunkt_z + $Sockelhoehe + $_Mat_Dicke - $RW_Nuttiefe _
    ,-($Totale_Breite - (2*$_Mat_Dicke)+(2*$RW_Nuttiefe))); Pushpull (Extrusion)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Infiniti_Zeichne_UnterBoden($_Hoehe,$_Tiefe,$_Mat_Dicke)
    Return _SketchUp_Draw_Object($AbsoluterNullPunkt_x + $_Mat_Dicke _; Startpunkt Punkt 1 (Drehrichtung mit Uhrzeigersinn)
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z + $Sockelhoehe + $_Mat_Dicke _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _;Punkt 2
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z + $Sockelhoehe + $_Mat_Dicke _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _;Punkt 3
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z + + $Sockelhoehe _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _; Punkt 4
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z + $Sockelhoehe _
    ,($Totale_Breite - (2*$_Mat_Dicke))); Pushpull (Extrusion)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Infiniti_Zeichne_OberBoden($_Hoehe,$_Tiefe,$_Mat_Dicke)
    Return _SketchUp_Draw_Object($AbsoluterNullPunkt_x + $_Mat_Dicke _; Startpunkt Punkt 1 (Drehrichtung mit Uhrzeigersinn)
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z + $_Hoehe _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _;Punkt 2
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z + $_Hoehe _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _;Punkt 3
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z + $_Hoehe - $_Mat_Dicke _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _; Punkt 4
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z + $_Hoehe - $_Mat_Dicke _
    ,($Totale_Breite - (2*$_Mat_Dicke))); Pushpull (Extrusion)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Infiniti_Zeichne_Korpusseite_L($_Hoehe,$_Tiefe,$_Mat_Dicke)
    Return _SketchUp_Draw_Object($AbsoluterNullPunkt_x _; Startpunkt Punkt 1 (Drehrichtung mit Uhrzeigersinn)
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _;Punkt 2
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z _
    ,$AbsoluterNullPunkt_x + $_Mat_Dicke _;Punkt 3
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z _
    ,$AbsoluterNullPunkt_x _; Punkt 4
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z _
    ,-$_Hoehe); Pushpull (Extrusion)
    EndFunc

    Func _Infiniti_Zeichne_Korpusseite_R($_Hoehe,$_Tiefe,$_Mat_Dicke)
    Return _SketchUp_Draw_Object($AbsoluterNullPunkt_x + $Totale_Breite _; Startpunkt Punkt 1 (Drehrichtung mit Uhrzeigersinn)
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z _
    ,$AbsoluterNullPunkt_x + $Totale_Breite - $_Mat_Dicke _;Punkt 2
    ,$AbsoluterNullPunkt_y _
    ,$AbsoluterNullPunkt_z _
    ,$AbsoluterNullPunkt_x + $Totale_Breite - $_Mat_Dicke _;Punkt 3
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z _
    ,$AbsoluterNullPunkt_x + $Totale_Breite _; Punkt 4
    ,$AbsoluterNullPunkt_y + $_Tiefe _
    ,$AbsoluterNullPunkt_z _
    ,-$_Hoehe); Pushpull (Extrusion)
    EndFunc
    ;~ $hDrawnOnject_Unterboden = _SketchUp_Draw_Object ()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _SketchUp_Camera_ZoomAll()

    [/autoit] [autoit][/autoit] [autoit]

    ;~ MsgBox(0,"", "HandleSeite1: "&$hDrawnOnject_Seite1&@CRLF _
    ;~ &"HandleSeite2: "&$hDrawnOnject_Seite2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ _SketchUp_Camera_SetNewView(7000,-7000,7000,1500,1000,0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ point4 = Geom::Point3d.new 0,0,0
    ;~ point5 = Geom::Point3d.new 100,100,100
    ;~ # returns a view
    ;~ status = view.drawing_color="red"
    ;~ status = view.draw_lines point4, point5

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Camera_ZoomAll()
    _SketchUp_Console_SendAction('viewZoomExtents:')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Console_SendAction($_action)
    _SketchUp_Console_Send('Sketchup.send_action "'&$_action&'"')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Camera_SetNewView($eyex,$eyey,$eyez,$targetx,$targety,$targetz)
    _SketchUp_Console_Send("eye = ["&$eyex&","&$eyey&","&$eyez&"]")
    _SketchUp_Console_Send("target = ["&$targetx&","&$targety&","&$targetz&"]")
    _SketchUp_Console_Send("up = [0,0,1]")
    _SketchUp_Console_Send("my_camera = Sketchup::Camera.new eye, target, up")
    _SketchUp_Console_Send("view = Sketchup.active_model.active_view")
    _SketchUp_Console_Send("view.camera = my_camera")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Draw_Object($p1x,$p1y,$p1z,$p2x,$p2y,$p2z,$p3x,$p3y,$p3z,$p4x,$p4y,$p4z,$pushpull)
    _SketchUp_Console_Send("pt1 = ["&$p1x&", "&$p1y&", "&$p1z&"]")
    _SketchUp_Console_Send("pt2 = ["&$p2x&", "&$p2y&", "&$p2z&"]")
    _SketchUp_Console_Send("pt3 = ["&$p3x&", "&$p3y&", "&$p3z&"]")
    _SketchUp_Console_Send("pt4 = ["&$p4x&", "&$p4y&", "&$p4z&"]")
    _SketchUp_Console_Send("face = entities.add_face pt1, pt2, pt3, pt4")
    $_return = _SketchUp_Console_Read()
    $_now = _StringBetween ($_return,':Face:','>')
    If IsArray($_now) Then
    _SketchUp_Console_Send("face.pushpull "&$pushpull)
    _SketchUp_Console_Send('face.material = m1');##################################
    Return $_now[0]
    Else
    SetError(1)
    Return 0
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Console_Send($send)
    If WinExists($_Infiniti_SketchUp_Main_ConsoleName) Then
    ControlSetText ($_Infiniti_SketchUp_Main_ConsoleName,'','[CLASS:Edit; INSTANCE:1]',$send&@CRLF)
    ControlSend ($_Infiniti_SketchUp_Main_ConsoleName,'','[CLASS:Edit; INSTANCE:1]' ,'{enter}')
    Else
    SetError (1)
    Return 0
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Console_Read()
    $_readout = StringSplit(ControlGetText($_Infiniti_SketchUp_Main_ConsoleName,'','[CLASS:Edit; INSTANCE:2]'),@CR)
    ;~ _ArrayDisplay($_readout)
    Return $_readout[$_readout[0]-1]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Console_CheckIfReady()
    $_Infiniti_Zeitmessung = TimerInit()
    While 1
    _SketchUp_Console_Send('# Infiniti Startup')
    $_readout = StringSplit(ControlGetText($_Infiniti_SketchUp_Main_ConsoleName,'','[CLASS:Edit; INSTANCE:2]'),@CR)
    If StringInStr($_readout[$_readout[0]-1],'nil') Then
    Return 1
    Else
    Sleep(50)
    EndIf
    If TimerDiff($_Infiniti_Zeitmessung) > 1000 Then
    MsgBox ( 16,$_Infiniti_ProgrammName,"SketchUp Konsole nicht bereit!!")
    SetError(1)
    Return 0
    EndIf
    WEnd
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SketchUp_Startup()
    If Not WinExists($_Infiniti_SketchUp_Main_WindowName) Then
    $_Infiniti_SketchUp_PID = Run ($_Infiniti_SketchUp_Verzeichnis)
    WinWait ($_Infiniti_SketchUp_Main_WindowName)
    WinWait ($_Infiniti_SketchUp_Main_ConsoleName,'',3)
    ;~ WinSetState ($_Infiniti_SketchUp_Main_ConsoleName,'', @SW_HIDE)
    _SketchUp_Console_CheckIfReady()
    _SketchUp_Console_Send("model = Sketchup.active_model")
    _SketchUp_Console_Send("entities = model.entities")
    _SketchUp_Console_Send("materials = model.materials")


    _SketchUp_Console_Send('m1 = materials.add "Korpusseite"')

    ;~ layers = model.layers
    ;~ layers.add "My Layer"
    ;~ activelayer = model.active_layer = layers[1]
    ;~ layer = model.active_layer
    EndIf
    If Not WinExists($_Infiniti_SketchUp_Main_ConsoleName) Then
    MsgBox ( 16,$_Infiniti_ProgrammName,"SketchUp Konsole nicht gefunden!!")
    SetError(1)
    Return 0
    EndIf
    EndFunc

    [/autoit]

    So bin mal gespannt was ihr davon haltet... ist ja nicht viel ^^ aber ein Anfang...

    MFG chris :D

  • Ich finde es etwas unpraktisch mit der Konsole, aber es scheint ja ganz gut zu gehen.
    SketchUp eignet sich nicht wirklich gut. Es gibt genug andere Programme. Für die muss man dann aber eine andere Skript-/Programmiersprache verwenden.
    Kann das auch texturiert oder eingefärbt werden?
    Von den Globalen Variablen kannst du viele als Konstanten definieren, dann ist die Wahrscheinlichkeit damit fehler zu machen niedriger.
    In die ToDo-Liste kann auch noch ein Speichersystem.

  • Also ich weiß nicht, wenn du einiges berechnen möchtest und 3d Rendern dann würde ich eine andere Sprache empfehlen, auch GUI-Technisch ist da einfach mehr möglich. Irgendwas einfaches wie C#. Zugriff auf alle gängigen Libs und haufenweise Beispiele in msdn und web.