Wir bauen uns ein CAD

  • Hallo zusammen!

    Seit kurzem bin ich begeisterter AutoIt-User und habe mich nach einigen Probe-Skripts auch gleich an ein großes Projekt gewagt.
    Nun würde jeder dem entgegenhalten, dass man fertige CAD-Programme in allen Preislagen kaufen kann. Das ist natürlich richtig und ich kenne AutoCAD, wie auch das preiswertere TurboCAD, wobei letzteres von mir intensiv benutzt wird.
    Der Reiz an der Sache ist eigentlich die Umsetzung der vielfältigen Funktionen eines CAD-Programms mit dem Mitteln von AutoIt.
    OpenSource-CAD gibt es nur spärlich und mit diesbezüglicher Literatur dazu ist es auch nicht weit her.

    Ein solches Projekt ist also eine richtige Herausforderung und lernen kann man auch sehr viel dabei.

    Frage:
    Wen interessiert so etwas?
    Wer würde daran mitarbeiten wollen?

    Mit sommerlichen Grüssen aus Berlin

    PSblnkd

  • Man muß ja nicht gleich ein Auto haben wollen, wenn's zunächst ein Fahrrad auch tut - im Klartext:

    Sicherlich sind die heute verfügbaren CAD alle (?) 3D-fähig und haben einen riesigen Funktionsumfang,
    aber auch diese haben einmal klein angefangen und zwar mit 2D.
    Wenn Ihr in die beigefügte pdf schaut, ist dort auch schon der Screenshot einer (teil-)fertige Bedieneroberfläche zu sehen.
    Um nicht die Übersicht zu verlieren, schreibe ich parallel zum Quelltext einen stets aktualisierten Entwicklungsbericht (Inhaltsverzeichnis in der pdf).
    Das ist insbesondere dann notwendig, wenn man noch weitere "Baustellen" so nebenbei zu betreuen hat.

    Wenn sich hier allgemeines Interesse breit machen sollte, werde ich auch weiter über die aktuellen Fortschritte berichten.
    Mithilfe, Diskussion und Kritik wird gern angenommen!

    Mit sommerlichen Grüssen

    PSblnkd

  • Moin...

    also... klar ne schöne Idee ist das natürlich schon... Auch wenn es heißt warum das Rad neu erfinden...
    aber manchmal will man halt auch mal selber Sachen neu erfinden ;)

    Ich arbeite Beruflich in einer Schreinerrei und benutze Täglich AutoCAD2009, Imos und manchmal Spirit.
    Daher bin ich einfach der Meinung das das einfach viel zu Heftig/Umfangreich ist was du da vor hast.
    Zumal es tausende CAD Versionen gibt.
    Ein weiterer Punkt ist sicherlich die schnelligkeit von Autoit.... für 2D vleicht noch ausreichend...
    Aber bei 3D denke ich nicht, dass es da mithalten kann.... :?:

    Ich hatte auch schonmal die Idee ein eigenes CAD zu schreiben. Hab es dann aber auch sein gelassen und habe mich mehr
    auf eine Konstruktionsengine ( Imos ähnlich ) für Möbelkorpen konzentriert, die auf AutoCAD aufsetzt...
    [ offen ] 3D-Konstrunktions-Engine für den Möbelbau mit Autoit möglich?

    Leider ist zur Zeit das Projekt etwas eingeschlafen.... :cursing:
    Wenn meine anderen 2 Projekte fertig sind werde Ich da aber weiter machen... :wacko:

    Für was wolltest du das CAD entwickeln? Also welchen Berufszweig?

    MFG chris :D

  • Eigentlich hatte ich ein wenig mehr Begeisterung erwartet und vielleicht den einen oder anderen Mitstreiter...

    Natürlich braucht man das Rad nicht neu zu erfinden, aber ich hatte ja schon dargelegt, warum ich mich mit diesem Thema befassen will.
    Es ist höchst interessant, macht Spaß und man kann sehr viel lernen, wenn man sich tiefgründig mit Problemen befassen muß, die zwar durch andere schon irgendwie gelöst wurden - nur wie, das ist halt nicht (mehr) bekannt...

    Damit Ihr seht, daß ich in der Zwischenzeit nicht untätig gewesen bin - das derzeitige Ergebnis ist anbei.

    Nach Entzippen und Start der "CAD.exe" sollte die Bedieneroberfläche zu sehen sein, wie bereits in "Ein CAD.pdf" abgebildet. Die Menüs sind noch alle ohne Funktion, lediglich die Schaltfläche "Einfache Linie" ist schon aktiv. Durch Drücken auf diese Schaltfläche (= Modus "Einfach Linie zeichnen") erscheinen links unten vier weitere Eingabefelder nebst Beschriftung. Dort können die Koordinaten der Anfangs- und Endpunkte der zu zeichenden Linie eingegeben werden und mit "ENTER"-Abschluß wird dann die Linie auf der Grafikfläche gezeichnet.
    Ebenfalls möglich ist derzeit schon das Linen-Zeichnen mit der Mouse. Dazu wird am gewünschten Anfangspunkt mit der Mouse auf die Grafikfläche geklickt - die Line "hängt" jetzt am Mouse-Cursor - und mit einem weiteren Mouseklick am Endpunkt wird die Linie gezeichnet. Die Anfangs- und Endkoordinaten der Linie werden laufend in den vier Eingabefeldern angezeigt.
    Eine Größenveränderung der GUI mit der Mouse ist ebenfalls möglich, allerdings sind mir dabei noch nicht alle Eventualitäten geglückt...

    Es würde mich sehr freuen, wenn sich jemand - oder auch mehrere - ernsthaft daran beteiligen wollen. Die Quelle und der bereits erwähnte aktuelle Entwicklungsbericht stehen zur Verfügung.

    Mit sommerlichen Grüßen aus Berlin

    PSblnkd

  • Prinzipell ist das ganze schon ein recht interessantes Projekt und eine große Herausforderung.
    Hab leider zu wenig Zeit um mitzumachen. Aber den Code würd ich mir gern mal anschauen.
    /Edit: Wär toll wenn du den mal hochladen könntest, führ nicht gern unbekannte exe'n aus. /EditEnd
    Nutzt du zum zeichnen GDI, OpenGl, oder ganz was anderes?
    Lg

  • Huhu...

    Sorry Ich wollte das ganze nicht in Frage stellen oder dich demotivieren... 8o
    Aber alleine die Berechnung des Hintergrundes und des Größenverhältnis solltest du dir genau überlegen. :!:
    Das ist alles überhaupt nicht einfach... obwohl es nur 2D ist...

    Ich brauche in meinem aktuellen Projekt auch eine 2D Rasterfläche mit Verhältnissen und XY Achse...
    Daher stell ich dir mal meine Lösung hier rein....vieleicht kannst du es ja gebrauchen...

    Spoiler anzeigen
    [autoit]


    #include <GDIP.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    #include <misc.au3>

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

    ;=================================================================
    ; Opts / Startups
    ;=================================================================
    Opt("GUIOnEventMode", 1)
    Opt("MouseCoordMode",2)
    Opt("WinTitleMatchMode", 4)
    _GDIPlus_Startup()

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

    ;=================================================================
    ; Declarieren
    ;=================================================================
    ; Gui Verhältnisse
    Global Const $Gui_Width = 800 ; Breite des Guis
    Global Const $Gui_Height = 800

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

    ; Verhältnisse
    Global $relation = 1 ; Verhältnis von allem
    Global $Anp_relation = 20 ; Raster Verhältnis

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

    ; Hintergrund Raster
    Global $hPen_RasterLine1 = _GDIPlus_PenCreate(0xFF444444) ; Pen der Rasterlinien

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

    ; X u Y Achsen
    Global $hBrush_XAchse = _GDIPlus_BrushCreateSolid (0xFFCE1414) ; Brush für die X Achsenbeschriftung
    Global $hBrush_YAchse = _GDIPlus_BrushCreateSolid (0xFF2DF32D) ; Brush für die Y Achsenbeschriftung
    Global $hFormat_XYAchse = _GDIPlus_StringFormatCreate() ; Format für die Achsenbeschriftung
    Global $hFamily_XYAchse = _GDIPlus_FontFamilyCreate ("Arial") ; Schriftart für die Achsenbeschriftung
    Global $hFont_XYAchse = _GDIPlus_FontCreate ($hFamily_XYAchse, 8, 0); GDI Schrift erstellen für Achsenbeschriftung
    Global $hPen_XAchse = _GDIPlus_PenCreate(0xFFCE1414,1) ; Pen der X Achse
    Global $hPen_YAchse = _GDIPlus_PenCreate(0xFF2DF32D,1) ; Pen der Y Achse
    Global $Main_AchseY = 60 ; 0 Punkt der Y Achse im Gui
    Global $Main_AchseX = $Gui_Height - 60 ; 0 Punkt der X Achse im Gui

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

    ;==================================================================
    ; Toolbargui erstellen
    ;==================================================================
    ;~ $hGui_Toolbar = GUICreate($Programm_Name, $GuiTool_Width, $GuiTool_Height,0,0)
    ;~ GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
    ;~ $hToolbar = _GUICtrlToolbar_Create($hGui_Toolbar)
    ;~ $aSize = _GUICtrlToolbar_GetMaxSize($hToolbar)

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

    ;==================================================================
    ; Gui erstellen
    ;==================================================================
    $hGui_Raster = GUICreate('test', $Gui_Width, $Gui_Height,-1,-1,-1, _
    BitOR($WS_EX_TOOLWINDOW,$WS_EX_WINDOWEDGE));,$hGui_Toolbar)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui_Raster)
    $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($Gui_Width, $Gui_Height, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

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

    ;==================================================================
    ; Rintergrundraster Pfad erstellen
    ;==================================================================
    $hPath = _GDIPlus_PathCreate($FillModeWinding)
    For $i = 0 To 1000
    _GDIPlus_PathAddLine($hPath, $i, 0, $i, 1000)
    _GDIPlus_PathCloseFigure($hPath)
    _GDIPlus_PathAddLine($hPath, 0, $i, 1000, $i)
    _GDIPlus_PathCloseFigure($hPath)
    Next
    $aBounds = _GDIPlus_PathGetWorldBounds($hPath)
    ;~ _ArrayDisplay ( $aBounds )
    ;==================================================================

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

    GUIRegisterMsg($WM_MOUSEWHEEL, "_WM_MOUSEWHEEL")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")

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

    GUISetState(@SW_SHOW,$hGui_Raster)

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

    _CAD_ReDrawBuffer()
    _WinAPI_RedrawWindow($hGui_Raster, 0, 0, 5)

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

    _CAD_Draw_XY_Achs()
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBmpBuffer, 0, 0,$Gui_Width, $Gui_Height)

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

    ;==================================================================
    ; Main While
    ;==================================================================
    $timerinit_DoppelklickRad = 0
    While 1
    Sleep(5)

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

    ; Linksklick
    If WinActive ( $hGui_Raster ) And _IsPressed('01') Then

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

    EndIf

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

    ;Rechtsklick
    If WinActive ( $hGui_Raster ) And _IsPressed('02') Then

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

    EndIf

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

    ; Doppelklick aufs Rad
    If WinActive ( $hGui_Raster ) and _IsPressed ( '04' ) and TimerDiff( $timerinit_DoppelklickRad ) > 50 _
    and TimerDiff( $timerinit_DoppelklickRad ) < 300 Then
    $Main_AchseY = 60 ; Umstellen auf alles Anzeigen
    $Main_AchseX = $Gui_Height - 60 ; Umstellen auf alles Anzeigen
    $relation = 1
    _CAD_ReDrawBuffer()
    _CAD_Draw_XY_Achs()
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBmpBuffer, 0, 0,$Gui_Width, $Gui_Height)
    EndIf

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

    ; Verschieben mit Mausrad
    If WinActive ( $hGui_Raster ) And _IsPressed("04") Then
    GUISetCursor ( 0,0, $hGui_Raster)
    $timerinit_DoppelklickRad = TimerInit()
    $MousePos_Wheel_1nd = MouseGetPos()
    Do
    $MousePos_Wheel_2nd = MouseGetPos()
    If $MousePos_Wheel_2nd[0] <> $MousePos_Wheel_1nd[0] Or _
    $MousePos_Wheel_2nd[1] <> $MousePos_Wheel_1nd[1] Then
    $Main_AchseY+= ($MousePos_Wheel_2nd[0] - $MousePos_Wheel_1nd[0])
    $Main_AchseX+= ($MousePos_Wheel_2nd[1] - $MousePos_Wheel_1nd[1])
    If $Main_AchseX > 1600*($relation+0.8) Then
    ;ganz oben
    $Main_AchseX = 1600*($relation+0.8)
    EndIf
    If $Main_AchseX < -800*($relation+0.8) Then
    ;ganz unten
    $Main_AchseX = -800*($relation+0.8)
    EndIf
    If $Main_AchseY > 1600*($relation+0.8) Then
    ;ganz links
    $Main_AchseY = 1600*($relation+0.8)
    EndIf
    If $Main_AchseY < -800*($relation+0.8) Then
    ;ganz rechts
    $Main_AchseY = -800*($relation+0.8)
    EndIf
    _CAD_ReDrawBuffer()
    _CAD_Draw_XY_Achs()
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBmpBuffer, 0, 0,$Gui_Width, $Gui_Height)
    $MousePos_Wheel_1nd[0] = $MousePos_Wheel_2nd[0]
    $MousePos_Wheel_1nd[1] = $MousePos_Wheel_2nd[1]
    EndIf
    Until _IsPressed("04") = False
    GUISetCursor( 2,0,$hGui_Raster )
    EndIf
    WEnd

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

    ;==================================================================
    ; F U N K T I O N E N
    ;==================================================================

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

    Func _CAD_Draw_XY_Achs()
    _GDIPlus_GraphicsDrawLine ( $hBuffer, 0,$Main_AchseX,$Gui_Width,$Main_AchseX,$hPen_XAchse )
    _GDIPlus_GraphicsDrawLine ( $hBuffer, $Main_AchseY,0,$Main_AchseY,$Gui_Height,$hPen_YAchse )

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

    ; Beschriftungen der Achsen
    Local $Main_AchseX_draw
    Local $Main_AchseY_draw
    If $Main_AchseX+5 > $Gui_Height-28 Then
    $Main_AchseX_draw = $Gui_Height-28
    Else
    $Main_AchseX_draw = $Main_AchseX+5
    EndIf
    If $Main_AchseY < -1 Then
    $Main_AchseY_draw = 5
    Else
    $Main_AchseY_draw = $Main_AchseY+5
    EndIf

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

    $tLayout_XAchse = _GDIPlus_RectFCreate (5,$Main_AchseX_draw, 100, 15)
    _GDIPlus_GraphicsDrawStringEx ($hBuffer, 'X-Achse y: '&$Main_AchseX, $hFont_XYAchse, $tLayout_XAchse, $hFormat_XYAchse, $hBrush_XAchse)
    $tLayout_YAchse = _GDIPlus_RectFCreate ($Main_AchseY_draw,$Gui_Height-15, 100, 15)
    _GDIPlus_GraphicsDrawStringEx ($hBuffer, 'Y-Achse x: '&$Main_AchseY, $hFont_XYAchse, $tLayout_YAchse, $hFormat_XYAchse, $hBrush_YAchse)
    _GDIPlus_GraphicsDrawString ( $hBuffer,'Verhältnis: 1:'&StringReplace(Round($relation,2),'.',',')&@CRLF& _
    'X Achse y= '&Round($Main_AchseX,2)&@CRLF& _
    'Y Achse x= '&Round($Main_AchseY,2),$Gui_Width-115,$Gui_Height-50) ; Verhältnis anzeigen
    EndFunc

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

    Func _CAD_ReDrawBuffer()
    _GDIPlus_GraphicsClear($hBuffer, 0xFF666666)
    $hPathClone = _GDIPlus_PathClone($hPath)

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

    ; Aufbau der Punkte für den Pfad...
    ;
    ; X1,Y1 ------------- X2,Y2
    ; | - | - | - | - | - |
    ; | - | - | - | - | - |
    ; | - | - | - | - | - |
    ; | - | Gitter - | - |
    ; | - | - | - | - | - |
    ; | - | - | - | - | - |
    ; X3,Y3 ------------- X4,Y4

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

    Dim $aPoints[5][2] =[[4, 0], _ ;
    [$Main_AchseY-(($Gui_Width * $relation*$Anp_relation)/2) , $Main_AchseX-(($Gui_Height*$relation*$Anp_relation)/2)], _ ;X1,Y1
    [$Main_AchseY+(($Gui_Width * $relation*$Anp_relation)/2), $Main_AchseX-(($Gui_Height*$relation*$Anp_relation)/2)], _ ;X2,Y2
    [$Main_AchseY-(($Gui_Width * $relation*$Anp_relation)/2) , $Main_AchseX+(($Gui_Height*$relation*$Anp_relation)/2)], _ ;X3,Y3
    [$Main_AchseY+(($Gui_Width * $relation*$Anp_relation)/2), $Main_AchseX+(($Gui_Height*$relation*$Anp_relation)/2)]] ;X4,Y4
    ; 0 0 300 300
    _GDIPlus_PathWarp($hPathClone, 0, $aPoints, $aBounds[0], $aBounds[1], $aBounds[2], $aBounds[3])
    _GDIPlus_GraphicsDrawPath($hBuffer, $hPathClone, $hPen_RasterLine1)
    _GDIPlus_PathDispose($hPathClone)
    EndFunc ;==>_CAD_ReDrawBuffer

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func WM_ERASEBKGND($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return True
    EndFunc ;==>WM_ERASEBKGND

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

    Func _WM_MOUSEWHEEL($hWnd, $Msg, $wParam, $lParam)
    If WinActive ( $hGui_Raster ) And Not _IsPressed(04) Then
    Local $bDown = 1
    If BitShift($wParam, 16) > 0 Then $bDown = 0
    Switch $bDown
    Case 1
    $relation *= 0.8
    $relation_Add = False
    Case Else
    $relation *= 1.2
    $relation_Add = True
    EndSwitch
    If $relation > 1 Then
    ;max vergrößert
    $relation = 1
    EndIf
    If $relation < 0.20 Then
    ;max verkleinert
    $relation = 0.20
    EndIf
    _CAD_ReDrawBuffer()
    _WinAPI_RedrawWindow($hWnd, 0, 0, 5)
    _CAD_Draw_XY_Achs()
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBmpBuffer, 0, 0,$Gui_Width, $Gui_Height)
    Return $GUI_RUNDEFMSG
    EndIf
    EndFunc ;==>_WM_MOUSEWHEEL

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

    Func _Exit()
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_PenDispose($hPen_RasterLine1)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    PS: Achja du brauchst die GDIP.au3 hab sie dir mal angehangen...

    MFG chris :D

  • chrisatack
    Alizame

    Vielen Dank für eure Code.
    Da es z.T. mit der Kommentierung nicht weit her ist, muß ich das erst mal in Ruhe durchforsten.
    Momentan bin ich beruflich wieder stark eingespannt, aber wenn es Neues zu berichten gibt, stehe ich wieder hier auf der Matte.
    Leider hat nur ein AutoIt-User mir seine Hilfe angeboten bei diesen - zugegebenermaßen - Mammutprojekt.

    Aber es wird werden und wenn's ohne Eure Hilfe nicht weitergeht - naja dann gibt's ja noch dieses Forum.

    Mit sommerlichen Grüßen aus Berlin

    PSblnkd

  • Andere Leute liegen faul in der Sonne - ich habe mir wieder ein paar Gedanken gemacht, wie es weitergehen kann.

    Zitat- Auszüge aus dem Enwicklungsbericht:

    Mit der Programmierung der LINE-Funktionalität wurde gezeigt, wie eine Linie im Grafik-Fenster gezeichnet werden kann. Während mittels Konsoleneingabe erzeugte Linien bereits mehrfach dargestellt werden können, ist das bei der Mouse-unterstützten Variante nicht so. Hier wird durch die programmierte Funktionalität vor jedem Neuzeichen einer Linie das Grafik-Fenster gelöscht, so daß immer nur die zuletzt gezeichnete Linie zu sehen ist.
    Das ist unbefriedigend! 

    Außerdem ist es nicht möglich, im Nachgang irgendwelche Eigenschaften der Linie zu ändern – und sei es auch nur die Farbe. Das hängt mit der besonderen Wirkungsweise der GDI-Funktionalität zusammen, die anhand übergebener Parameter eigenständig die Linie zeichnet und zwar direkt im Bildwiederholspeicher der Grafik-Einheit (-Karte). Sind die Parameter an das GDI übergeben und die Linie ist gezeichnet, hat man dann darauf keinen Zugriff mehr. 

    Um die Parameter einer Linie (oder eines anderen Grafik-Objektes) ändern zu können, sowie weitere Funktionalität zu ermöglichen – insbesondere die Zeichnung mit den allen darin enthaltenen Grafik-Elementen abspeichern, bzw. auch laden zu können, muß man sich eines internen Hilfsmittels bedienen.

    Das kann mit zwei Methoden realisiert werden: 

    - Parameter-Array 
    - Parameter-Datenbank 

    Leider haben die in AutoIt definierte Arrays eine Größenbeschränkung von 64 Dimensionen (das könnte ausreichen) aber mit max. 2^24 (16 777 216) Einträgen insgesamt sind dann auch die Anzahl der zu verwaltenden Grafik-Elemente begrenzt. 

    Alternativ könnte auch mit einer Datenbank gearbeitet werden...(???)...na ich weis nicht... 

    In dem Parameter-Array sind alle Parameter jedes Grafik-Elements enthalten, welches bereits erzeugt wurde, bzw. welche als Datei abgespeichert waren und nun wieder geladen wurden.
    Zur Darstellung der Grafiken im Grafik-Fenster werden der Reihe nach alle Grafik-Elemente aus dem Array ausgelesen und dem GDI zum Zeichnen übergeben.
    Hier liegt dann auch der besondere Vorteil solcher Technologie, weil man damit in der Lage ist, nur bestimmte Bereiche der gesamten Grafik-Collection auszuwählen (z.B. für die Zoom- und Pan-Funktionalität) und Änderungen an den einzelnen Grafik-Elementen im Array vornehmen kann, worauf dann eine Aktualisierung der Darstellung im Grafik-Fenster vorgenommen wird. 

    Wie müsste ein solches Parameter-Array angelegt werden, mit welcher Struktur?
    In professionellen CAD-Programmen ist das eines der best gehüteten Geheimnisse. Durch Analyse offengelegter Schnittstellen kann man zwar einige Rückschlüsse ziehen, aber auch die propritären Datenformate abgespeicherter Zeichnungen geben hier nur wenig Einblicke in die Interna jedes kommerziellen CAD-Programms. 

    Soweit für heute...später geht's dann weiter... 
    Bin sehr gespannt auf Eure Meinungen dazu!


    MbG aus Berlin

    PSblnkd

  • PSblnkd:

    Zu dem Thema mit den Arrays und der Nachbearbeitung kannst du dir ja mal mein 3D Programm(3D Programm) anschauen, das man in 2 D ebenso umsetzen kann, wenn nicht sogar besser, da weniger berechnungen offen stehen. Die arrays kann man nicht nur beschränkt deklarieren sondern immer um eins vergrößern, wenn das aktuell letzte Teil/Zeile mit Daten gefüllt wird. Ich helfe dir gerne, daher bei Fragen einfach PM.

    irgendwo gibts auch noch nen Thread, wo name22 ein super beispielscript für das zeichnen von linien wie in einem Programm reingestellt hat, das mir bei meinem 3 D Programm auch sehr geholfen hat. ich finds nur leider nicht mehr...

    Einmal editiert, zuletzt von mazZ (7. August 2010 um 00:05)

  • Wen du ernsthaft dabeibleibst, wirst du es IHRGENDWANN haben :D
    Ich geb dir mal ein tip ^^
    aus dem "tip" entstand auch dieses Programm.
    Die Leute die diese programm "Programmieren" liessen kenn ich :D soquasi mein Chef ^^

    Der Chef sah einmal seiner Tochter zu beim "Simseln" (Sims)
    da hat er gesehen wie die game programmiere (EA) das mit dem Häuserbau geregelt haben.
    Nähmlich "Vorgefehrtigte" Items die man belibig färbenkann.....
    Mauern einfache 2D elemente ³ (Soll heissen,aus mehreren 2D mach 3D)
    die man belibig mit "Pics" überzihen kann....

    Im Klartext, aus 2D machste 3D wen du dabei die passende Berechnung hast, kannst du die leistung auf ein Minimum reduziehren....

    Die lezte Phase (Damit mein ich wirklich die Allerlezte) währen dann Meshes
    (Einfach gesagt.....2D Dreiecke die grade mal 1nm dick sind werden "Wen mann sie zusammenfügt" zu 3D
    Siehe Bild (von lexocad-Meine jetzige Arbeit)
    Bei bild siht man die Front des Regiozuges der SBB namens RABe
    Der komplet NUR aus 2D Dreiecken besteht (Mein Proejekt atm,halt noch in Arbeit :D)
    7.jpg = "Show Meshes"
    6.jpg = "Ohne die meshes zu zeigen" da siht man dan,ob man Schön oder Schlampig (Sry fürs wort) gearbeitet hat.

    Lads dir einfach mal Runter und teste das Programm, dan wirst du da ganz schnell auf viele dinge im kopf stossen wie du dein Prog machen könntest :D

    Mfg Skilkor

  • Die Sommerpause ist vorbei und nun geht's wieder weiter...

    chrisatack
    Ich hatte mich mal etwas eingehender mit Deinem CAD-Programm befasst, ohne jetzt wirklich alle Deteils auf Anhieb zu verstehen. Interessant ist aber die Implementierung eines Gitternetzes und - wenn ich das richtig sehe - auch eines x/y-Lineals. Die eigentliche Zeichenfunktion hast Du offensichtlich mit der Buffer-Technologie realisiert, was mir bisher leider nicht gelungen ist.
    Weiterhin interessant ist aber - und deshalb auch meine Zeilen dazu - die neue Version der UDF "GDIP.au3". Diese ist offensichtlich eine wesentlich erweiterte Version der alten, in der AutoIt-Installation enthaltenen "GDI+.au3". Leider gibt es dazu keine Hilfe-Unterstützung in der Form, wie bei der alten. Die intern enthaltenen Text-Passagen sind bei der praktischen Arbeit nicht wirklich hilfreich - und das nicht nur, weil sie nur in englisch sind.
    Um Verwechslungen zu vermeiden, sollte die "neue GDIP.au3" besser "GDIPext.au3" benannt werden.

    Im Zusammenhang mit der Bearbeitung des CAD-Themas ist mir auch aufgefallen, daß es recht hilfreich sein könnte - vor allem für die hier offensichtlich auch vertretenen Spiele-Programmierer - wenn es eine Implementierung der DirectX-Technologie als UDF geben würde - so zu sagen als Alternative zu OpenGL.

    Doch zurück zum Projekt.

    Das Problem mit der Flackerei im Grafikfenster beim Ziehen einer Linie hat mich doch sehr beschäftigt.
    Nach dem GDI+-Tutorial von "Ubuntu" sollte dieses mit der sog. "Buffer-Technologie" behoben werden können. Leider habe ich das bisher trotz vielfältigen Versuchen nicht hinbekommen. Mir ist da aber eine andere Lösung eingefallen. Hier wieder ein Auszug aus dem aktuellen Entwicklungsbericht:

    Die dauernde Löschung des Grafik-Fensters bewirkt unschönes Flackern desselben, wenn mit der Mouse eine Linie gezogen wird. Möglicherweise könnte damit Abhilfe geschaffen werden (oder der Mangel vermindert werden), in dem statt jedes Mal das Grafik-Fenster zu löschen und anschließend neu aufzubauen, ein Objekt (in diesem Fall eine Linie) mit den gleichen Koordinaten gezeichnet wird – allerdings jetzt mit einem „weißen Pen“. Damit wird das Objekt auf dem weißen Hintergrund unsichtbar.
    Vorraussetzung ist dazu allerdings, daß die letzten Koordinaten zwischengespeichert werden, da mit jeder Mouse-Verschiebung neue Koordinaten erzeugt werden. 
    Mit der Aufgabe "Ersetzen der Komplett-Löschung des Grafikfensters durch nochmaliges Überschreiben der zuvor gezeichneten Linie mit den gleichen Koordinaten, aber diesmal mit weißem Pen“ wurde der gesamte Code überarbeitet, neu geordnet und in der Quelle „CADnew.au3“ abgelegt.

    Durch diese neue Version wird bei der Mouse-Verschiebung eine vorher gezeichnete Line unsichtbar und weil nunmehr keine dauernde Löschung des ganzen Grafikfensters vorgenommen werden muß, gibt auch kein „Flackern“ mehr.

    So schön, wie diese Routine jetzt auch „flackerfrei“ funktioniert, hat sie jedoch immer noch den Nachteil, daß vorher mit der Mouse gezeichnete Linien-Objekte wieder unsichtbar werden. Das ist natürlich so nicht gewollt und somit keine generelle Lösung des Problems. Es macht nicht viel Sinn, wenn man beim Zeichnen einer Linie, z.B. von, oder zu einem bestimmten Punkt eines vorhandenen Objektes, diesen fortan nicht mehr sehen kann.

    Eine genaue Untersuchung des o. g. Problems ergab jedoch, daß nur die mit der Mouse gezeichnete Linien-Objekte wieder verschwinden, während mittels Parameter-Eingabe und Enter gezeichnete Linien-Objekte davon nicht betroffen sind. Der o.g. Effekt ist nachvollziehbar, weil bei einem neu mit der Mouse zu zeichnenden Linien-Objekt ebenso, wie bei den laufenden Zeichenprozessen in UP MouseMove die vorher gezeichnete Linie mit weißem Pen überschrieben wird.

    Das Problem wurde mit einer einfachen If...Then-Abfrage gelöst und das Ergebnis ist im Anhang zu sehen. Als nächstes soll dann das Parameter-Array eingebunden werden und somit die Selection-Funktionalität u.a. vorbereitet werden. Das Zeichen von anderen Primitiven, wie Kreis und Rechteck usw. dürfte sich nach der grundlegenden Wegbereitung als relativ einfach erweisen.

    Leider habe ich von "ahnungslos" - welcher sich bisher als Einzigster bereit erklärte, daran mitzuarbeiten - nichts wieder gehört, nach dem ich ihm den vollständigen Quelltext nebst aktuellen Entwicklungsbericht geschickt hatte. Mail-Anfragen blieben unbeantwortet. - Schade!

    Es wird aber trotzdem weitergehen, auch wenn ich hier als Einzelkämpfer dastehe....

    Bis demnächst mit sonnigen Grüssen aus Berlin

    PSblnkd

    Einmal editiert, zuletzt von PSblnkd (19. September 2010 um 10:24)

  • Hey
    1. Es heißt AutoIt ...
    2. Als Anfänger würde ich das auf garkeinen Fall machen.
    => Lerne erst mal die Grundlagen usw. dann kann man sich immer nocht mit GDI+ geschäftigen.
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

  • AntiSpeed

    1. AutoIt - wie sonst ???

    2. Ich lerne schnell - bevor Du solch abfällige Bemerkungen machst, solltest Du Dir erst einmal das - zugegebenermaßen vorläufige - Ergebnis im Attachment anschauen. Deinen (möglicherweise) Anfänger-Status solltest Du nicht mit dem meinem vergleichen - da bin ich nun doch offensichtlich schon darüberhinaus.

    Und was Deine Rechtschreibung anbetrifft - na, lassen wir das lieber....

    Auf solche unkonstruktiven Beiträge kann man sicher verzichten!

    PSblnkd

  • Das unprodukive Geplänkel persönlicher Image-Pflege der letzten beiden Beiträge hat doch meinen Ehrgeiz recht beflügelt, obwohl - wie sich nun offensichtlich herausstellt - ich hier bei diesem Thema allein auf weiter Flur bin.

    Sei's drum - wie versprochen - es geht weiter.

    Anbei der letzte Stand der Entwicklung mit Linien-, Rechteck- und Kreisfunktionalität. Zusätzlich ist ein Auszug aus dem aktuellen Entwicklungsbericht dabei - betreffend das Parameter-Array, der dann auch gleich zu der weiter unten aufgeführten Fragestellung führt.
    Das Parameter-Array wird in der aktuellen Version CADnew02.exe bereits verwendet - in Vorbereitung zu der als nächstens zu implementieren "Selection"-Funktion. Diese ist ebenfalls bereits ansatzweise implementiert, d.h. wenn man auf das neue Button mit dem Pfeil drückt, wird dieses in der althergebrachten Weise aktiviert mit versenkten Kanten dargestellt.

    Die weitere Funktionalität ist aber noch offen - und da könnte ich Eure Hilfe bzw. Anregung gebrauchen.

    Die "Selection"-Funktion soll ein im Grafik-Fenster der GUI sichtbares Grafik-Element (Objekt) auswählen, wenn man um dieses ein Markierungs-Rechteck zieht. Dieses Markierungs-Rechteck muß dabei nicht das ganze Objekt einschließen (ist u.U. manchmal auch gar nicht zweckmäßig).
    Wie ich bereits beschrieben habe, sind alle Grafik-Elemente mit ihren spezifischen Parametern im Parameter-Array (siehe Anhang) abgelegt.
    Aufgabe ist es nun, eine Strategie, bzw. Verfahren zu finden, welches das mit dem Markierungsrahmen gekennzeichnete Element im Grafik-Fenster der GUI in der Auflistung im Parameter-Array zu finden. Als Ausgangsdaten stehen die X/Y-Koordinatenwerte des Markierungs-Rechtecks links-oben und rechts-unten, sowie die Werte im Parameter-Array zur Verfügung.

    Wird das betreffende Element gefunden, soll es zum Zeichen dessen gekennzeichnet werden, z.B. durch eine andere Farbgebung und/oder mit kleinen Markierungs-Kreisen/Rechtecken an relevanten Punkten des Elementes (z.B. Anfangs- und Endpunkt bei LINE). Danach kann es dann hinsichtlich seiner Eigenschaften (Farbe usw.) über ein weiteres Dialog-Fenster manipuliert werden. Aber auch an weitere Bearbeitungen ist gedacht:
    Kopieren-Einfügen als neues Objekt, Verschieben usw.
    Dazu bedarf es dann noch einer weiteren Ausgestaltung der "Selection"-Funktion, wie z.B. das Hinzufügen von Bezugspunkten.

    Nun bin ich sehr gespannt auf Eure konstruktiven Beiträge.

    Edit:

    Mir ist gerade aufgefallen, daß in der gezippten Version CADnewXX.exe die Bottum-Bilder nicht erscheinen. Diese werden also offensichtlich in der Exe nur als Verweis hinterlegt, so daß man die Bildchen mit dazupacken muß. Das Starten der Exe aus der Zip führt nicht zum Erfolg - man muß die Zip wirklich auspacken, am besten in einen separaten Ordner.

    Mit herbstlichen Grüßen an einem sonnigen Sonntag aus Berlin

    PSblnkd

  • Nach dem "regen Interesse" Eurerseits zu dem Thema müsste ich eigentlich die Überschrift ändern in "Ich baue..."

    Tatsächlich hatte ich auf mehr Resonanz und konstruktive Hilfe gehofft - aber so ist es, wie so oft im Leben - im Erstfall steht man ganz allein auf der Matte.

    Da sich das "Selection"-Problem für mich doch viel komplizierter herausstellte, als zunächst angenommen, hat es auch eine ganze Weile gedauert bis zur Realisierung dieses Entwicklungsschrittes.

    Anbei ist die neueste Version "CADnew03" nebst einem Auszug aus dem aktuellen Entwicklungsbericht.
    Die neue Funktionalität im Vergleich zur verangegangenen bezieht sich auf die Realisierung der "Selection"-Funktion (Pfeil-Button) - allerdings mit der Einschränkung, dass bisher nur "LINE"-Objekte unterstützt werden.
    Selection von RECT- und CIRCLE-Objekten geht noch nicht.
    Die weitere Ausgestaltung der Selection-Funktion bzgl. Eigenschaftsdialog, Bezugspunkte und Weiteres, was schon früher angesprochen wurde, harrt noch der Realisierung.

    Bei den Überlegungen zur Selection von RECT-Objekten ist mir aufgefallen, dass man diese auch als zusammengesetzte LINE-Objekte betrachten kann, d.h., das wäre dann die erste Anwendung des Features "Group". Dazu bedarf es wiederum einiger umfangreicher Umbauarbeiten...

    Bisher besteht das Programm aus mehr als 1300 Codezeilen!

    Mit winterlichen Grüßen aus Berlin - an einem verschneiten Donnerstag

    PSblnkd


  • Tatsächlich hatte ich auf mehr Resonanz und konstruktive Hilfe gehofft - aber so ist es, wie so oft im Leben - im Erstfall steht man ganz allein auf der Matte.

    Schonmal dran gedacht, das schlicht niemand interesse daran hat ein CAD nachzubauen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.