Seite 1 von 1

VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 12:21
von marcelx
Hallo,

wie kann ich eine Linie Hintern eine Box darstellen ohne die Reihenfolge der Darstellung zu ändern (zu erste AddPathBox dann AddPathLine)

Gruß
MarcelX

EDIT: Kommentar eingefügt

Code: Alles auswählen

If OpenWindow(0, 0, 0, 400, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 400, 200)
  If StartVectorDrawing(CanvasVectorOutput(0))
    ; Alle Box abfragen und darstellen
    MovePathCursor(40, 20)
    AddPathBox(50, 50, 200, 50)
    FillPath(#PB_Path_Preserve)
    
    ; Alle Linie abfragen und darstellen
    MovePathCursor(40, 20)
    AddPathLine(150, 100, #PB_Path_Relative)
    VectorSourceColor(RGBA(0, 255, 0, 255))

    StrokePath(2)
  
    StopVectorDrawing()
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 13:41
von Derren
Warum willst du die Reihenfolge nicht ändern.
So funktioniert "Drawing" nunmal, auch in der Realität.

Dann müsstest du die Linie bis zur Box zeichnen, von auf der anderen Seite der Box wieder weiter. Also eigentlich zwei Linien. Zuvor musst du natürlich die Schnittpunkte der Linie mit den Seiten der Box berechnen.

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 13:48
von marcelx
Der Code repräsentiert nicht die ganze Programm (es ist nur ein Beispiel).
Es ist so, dass die Box zu erste definiert werden und anschließen die Linie abgefragt und dargestellt.
Das Tränen der Linie wäre schwierig zu realisieren.

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 20:11
von ccode_new
Hallo!

Eine einfache Möglichkeit wäre:

Code: Alles auswählen

Procedure Drawing(ZEbene.i)
  If StartVectorDrawing(CanvasVectorOutput(0))
      If ZEbene = 0
        ; Alle Box abfragen und darstellen
        MovePathCursor(40, 20)
        AddPathBox(50, 50, 200, 50)
        FillPath(#PB_Path_Preserve)
      EndIf
      ; Alle Linie abfragen und darstellen
      If ZEbene = 1
        MovePathCursor(40, 20)
        AddPathLine(150, 100, #PB_Path_Relative)
        VectorSourceColor(RGBA(0, 255, 0, 255))
      EndIf
      StrokePath(2)
    StopVectorDrawing()
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 400, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 400, 200)
  
  Repeat
    Event = WaitWindowEvent()
    
    If #PB_Event_Repaint
      Drawing(1)
      Drawing(0)
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 20:37
von #NULL
@marcelx
Du musst die Datenbeschaffung und dass Zeichnen von einander trennen. Wenn du zuerst nur die Box hast, aber noch keine Daten für die Linie, dann speichere dir diese Boxdaten irgendwie und zeichne nur das was du hast (keine Linie, nur dir Box). Wenn du dann auch die Linendaten hast, zeichnest du alles erneut, erst die Line, dann die Box.

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 20:41
von marcelx
@ccode_new
interessant Lösung

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 20:45
von marcelx
#NULL
leider schwierig weil die Box bekannt sind und die Linie nachträglich aufgebaut werden auf die Box.
Was funktioniert ist z.B. alle Box ausgeben und wenn eine Linie dargestellt wurde, die Box nochmal ausgeben.

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 21:50
von Derren
Warum?

Ein StartDrawing()-StopDrawing() Block wird auf einmal ausgegeben. Zweimal etwas identisches zeichen macht also keinen Sinn.

Re: VectorDrawing Box im Vordergrund

Verfasst: 31.01.2020 22:56
von Nino
#NULL hat geschrieben:Du musst die Datenbeschaffung und dass Zeichnen von einander trennen.
Yup! Genau das ist das entscheidende Prinzip.