CAD - Gummiband darstellen

Anfängerfragen zum Programmieren mit PureBasic.
Kasulke
Beiträge: 2
Registriert: 11.10.2009 12:07
Computerausstattung: AMD Athlon X2 5000, Windows XP-Sp2

CAD - Gummiband darstellen

Beitrag von Kasulke »

Hallo Leute

Ich Versuche schon seit Tagen das Problem zu lösen doch ohne Erfolg
vielleicht kann mir jemand von euch helfen...

Ich möchte ein Gummiband darstellen (Linie X-Achse + Y-Achse)..wie man es von eimem CAD-Programm kennt-
über einem SrollareaGadget das ein ImageGadget enthält ..anzeigt(ohne gedrückte Mousetaste...ständig)
auf dem ImageGadget befinden sich Meßlinien die ich mit Hilfe des Fadenkreuz - Gummiband auswerten möchte.
(siehe Beispiel)

das Problem ist das wenn ich den sichtbaren Bereich per GrabImage abspeichere bevor die X,Y -Achsen gezeichnet werden
und wieder anzeige als ImageGadget der Bildschirm sehr stark flackert -... so gehts nicht

durch Zufall bin ich auf ein Phänomen gestosen das mir vielleicht weiter helfen könnte.
immer wenn ich die Mouse aus dem Scrollbereich herrausbewege werden die Linie des Gummibands gelöscht und
der Scrollbereich inerhalb von Windows automatisch neu dargestellt ohne zu flackern. super.....die alte Gummibandlinien
sind gelöscht.
gibt es ne Möglichkeit diesen " Refresh" per Programm-Befehl automatisch auszulösen ohne das ich die Mouse
aus dem Srollarea bewegen muß ?...dann könnte ich nämlich wechselweise Gummiband zeichnen und wieder löschen

Ich habe zu dem Thema Gummiband hier im Forum ne andere Lösung mit OpenScreen gefunden allerdings möchte ich das
auf normaler Windows-Ebene lösen...nicht mit OpenScreen-oder OpenWindowedScreen

PureBasic 4.31 (Windows-X86)
Windows XP

Code: Alles auswählen

Procedure Messwerte_Anzeigen(); Schreibt Meßdaten in Image(10)
StartDrawing(ImageOutput(10)) ;es werden Meßlinien gezeichnet zur Auswertung..(nur Beispiel keine Orginal Meßdaten)
For a=0 To 7600 Step 20
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,50,x2,50,$1717E8)
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,100,x2,100,$9CE452)
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,150,x2,150,$CB2323)
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,200,x2,200,$15DBD9)
Next a 
StopDrawing()
EndProcedure


If OpenWindow(8, 0, 200, 1200, 900, "Seq-Draw",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget )
CreateImage(10, 1400, 730);Bildschirm für Meßwerte 
  CreateImage(12, 1, 930);Gummiband X-Achse
 ScrollAreaGadget(14, 30,30, 981,700, 1900, 830, 3) ;ScrollArea im Window für ImageGadget-15...Meßwerte anzeigen
 ImageGadget(15,0, 0, 1400,730, ImageID(10))
 ImageGadget(16,30, 30, 1,930, ImageID(12)); Gummiband X-Achse
 HideWindow(8, 1) 
Messwerte_Anzeigen()
HideWindow(8, 0);Meßdaten werden angezeigt

Repeat 
 Event = WaitWindowEvent() 
 x=WindowMouseX(8)
y=WindowMouseY(8)
 If event =512 And x>30 And y>30 ;Mouse wird bewegt Event(512)... (x>30= X And y>30) ..Mouse ist im Scrollbereich
ImageGadget(16,x-30, 0, 1,930, ImageID(12)); Fadenkreuz X anzeigen...

;StartDrawing(WindowOutput(8)):LineXY(x-30,30,x-30,760,$FCFFFF):StopDrawing()
  Delay(30)
EndIf
 Until  Event = #PB_Event_CloseWindow 
EndIf

End
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: CAD - Gummiband darstellen

Beitrag von alter Mann »

Ich würde es so machen :

Code: Alles auswählen

Procedure Messwerte_Anzeigen(); Schreibt Meßdaten in Image(10)
StartDrawing(ImageOutput(10)) ;es werden Meßlinien gezeichnet zur Auswertung..(nur Beispiel keine Orginal Meßdaten)
For a=0 To 7600 Step 20
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,50,x2,50,$1717E8)
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,100,x2,100,$9CE452)
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,150,x2,150,$CB2323)
x1=Random(34)+a:x2=Random(34)+a
LineXY (x1,200,x2,200,$15DBD9)
Next a
StopDrawing()
EndProcedure


If OpenWindow(8, 0, 200, 1200, 900, "Seq-Draw",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget )
CreateImage(10, 1400, 730);Bildschirm für Meßwerte
CreateImage(11, 1400, 730);Image fuer Bildschirm
  ;CreateImage(12, 1, 930);Gummiband X-Achse
ScrollAreaGadget(14, 30,30, 981,700, 1900, 830, 3) ;ScrollArea im Window für ImageGadget-15...Meßwerte anzeigen
ImageGadget(15,0, 0, 1400,730, ImageID(11))
CloseGadgetList()

Messwerte_Anzeigen()
StartDrawing(ImageOutput(11)):DrawImage(ImageID(10),0,0,1400,730):StopDrawing()
SetGadgetState(15,ImageID(11))

Repeat
Event = WaitWindowEvent()
x=WindowMouseX(8)
y=WindowMouseY(8)
If event =512 And x>30 And y>30 ;Mouse wird bewegt Event(512)... (x>30= X And y>30) ..Mouse ist im Scrollbereich

StartDrawing(ImageOutput(11)):DrawImage(ImageID(10),0,0,1400,730):LineXY(x-30,30,x-30,760,$FCFFFF):StopDrawing()
SetGadgetState(15,ImageID(11))
  Delay(30)
EndIf
Until  Event = #PB_Event_CloseWindow
EndIf

End
Win11 64Bit / PB 6.0
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: CAD - Gummiband darstellen

Beitrag von Kurzer »

Und ich so:

Code: Alles auswählen

If OpenWindow(0, 100, 200, 600, 600, "CAD-Lines")

   Mxold = -400 : Myold = -400
   StartDrawing(WindowOutput(0))
    For t = 0 To 2000
       Circle (10+Random(580), 10+Random(580), Random(10), (t%$ff)<<16 + (t%$ff)<<8 + t%$ff)
    Next t
  StopDrawing()

  Repeat
    EventID = WaitWindowEvent(25)
      
    If EventID = 512
        StartDrawing(WindowOutput(0))
          DrawingMode(#PB_2DDrawing_XOr)

          LineXY (Mxold, 0, Mxold, 600, $ffffff)
          LineXY (0, Myold, 600, Myold, $ffffff)

          Mxnew = WindowMouseX(0) : Mynew = WindowMouseY(0)

          LineXY (Mxnew, 0, Mxnew, 600, $ffffff)
          LineXY (0, Mynew, 600, Mynew, $ffffff)

          Mxold = Mxnew : Myold = Mynew
       StopDrawing()
      EndIf
  Until EventID = #PB_Event_CloseWindow
EndIf 
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Kasulke
Beiträge: 2
Registriert: 11.10.2009 12:07
Computerausstattung: AMD Athlon X2 5000, Windows XP-Sp2

Re: CAD - Gummiband darstellen

Beitrag von Kasulke »

@Hallo alter Mann
funktioniert ja wunderbar vielen Dank... .. gleich ein Volltreffer
:allright:
@Kurzer
sieht auch sehr gut aus läst sich warscheinlich auch so machen...
:allright:

beide Vorschläge gehen wogegen der Entwurf vom alten Mann am schnellsten umgesetzt ist weil ich am wenigsten
ändern müßte....mal sehen



Vielen Dank für eure Hilfe...sehr gutes Forum !
:D
Antworten