Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem mit hpgl Komponente (https://www.delphipraxis.net/211909-problem-mit-hpgl-komponente.html)

iphi 20. Nov 2022 14:46

Delphi-Version: 7

Problem mit hpgl Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich möchte eine HPGL-Grafik anzeigen und habe im Netz außer sündhaft teuren Kaufkomponenten nur diese alte HPGL-Grafik-Komponente für Delphi5 gefunden:
http://delphi.icm.edu.pl/ftp/d50free/hpgl2.zip
Nach einer kleinen Änderung (Konstante in Variable verändert) kompiliert sie unter Delphi7, meine einfache HPGL-Datei (Pfeil aus 4 Strichen) wird aber nicht korrekt angezeigt und ich komme nicht drauf warum. Ich zweifle schon an der Komponente...
Habe mein Projekt mit der korrigierten Komponente und dem plt-File (=hpgl) mal gezippt und angehängt.

Hat schon mal jemand diese Komponente erfolgreich benutzt? Kann vielleicht mal jemand drüber schauen?

Danke!

zeras 20. Nov 2022 15:48

AW: Problem mit hpgl Komponente
 
Zeige doch mal, was sein soll und was ist.

iphi 20. Nov 2022 18:11

AW: Problem mit hpgl Komponente
 
Liste der Anhänge anzeigen (Anzahl: 2)
Anbei soll und ist.
Es wird nur die Diagonale gezeichnet.

Steku 20. Nov 2022 19:13

AW: Problem mit hpgl Komponente
 
Wird deine Grafik denn von anderen Viewern, z.B https://www.sharecad.org/
korrekt angezeigt?

Grüße
Steku

himitsu 20. Nov 2022 20:55

AW: Problem mit hpgl Komponente
 
Der Die Webseite zeigt ja nichtmal das Wikipedia-Beispiel richtig an.

Im Grunde ist das eine einfache Scriptsprache mit wenigen Befehlen.
Das müsste sich auch in andere Scriptsprachen übersetzen und dann dort ausführen lassen. (Bash, Python, VBScript, PascalScipt, ...)

iphi 20. Nov 2022 21:21

AW: Problem mit hpgl Komponente
 
Meine hpgl-Datei ist korrekt, die wird von anderen Viewern korrekt angezeigt, s. hochgeladenes soll-Bild.

Ich habe so langsam den Eindruck, die Komponente wurde mutwillig mit Fehlern versehen. Ein paar davon habe ich inzwischen gefunden...

P.S. Wäre schade, den Code verkommen zu lassen. Der ist ziemlich umfangreich und prinzipiell ganz clever gemacht...

TurboMagic 21. Nov 2022 08:56

AW: Problem mit hpgl Komponente
 
Wenn die Lizenz das erlaubt, könntest du's ja als GitHub Projekt anlegen,
dann finden sich evtl. auch noch andere Interessenten/Mitstreiter die daran mit arbeiten.

mmw 21. Nov 2022 21:32

AW: Problem mit hpgl Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

evtl. wär dies noch noch eine Alternative.

https://www.swplot.com/wplot.htm

als Beispiel:

Delphi-Quellcode:
myplot := TXplot32.Create(self);

  try
    myplot.Parent := self;
    myplot.Width := self.Width;
    myplot.Height := self.Height;

    myplot.DynamicalyResize:=true;
    myplot.DynamicalyTrim:=true;
    myplot.DynamicalyZoom:=True;

    myplot.PreferExactTrim := true;
    myplot.ProportionalAspectRatio := true;
    myplot.ShowInPlaceMenu := true;
    myplot.ShowPropertiesDialog := true;
    myplot.ShowPopupMenu:=true;

 except
  if assigned(myplot) then myplot.free;
 end;
Ich habe mit der importierten Typbibliothek geararbeitet, da mit dem ActiveX Control Fehler auftraten.

Kostet ca. 35€

Gruß

himitsu 21. Nov 2022 22:12

AW: Problem mit hpgl Komponente
 
Abgesehn davon, dass
Delphi-Quellcode:
if assigned
bereits im Free eingebaut ist.
Zitat:

Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;

Ist an dieser Stelle es immer Assigned.
Also nutzlos, da immer True und unnötig, weil Innen das gleiche Ergebnis.

Ausnahme ein kolossaler Fehler ala BufferOverun.
Und da ist die Prüfung eh egal, weil das Ergebnis keinen Wert besitzt, wenn der Programmcode und/oder Arbeitspeicher korrupt sind.

Jens01 22. Nov 2022 11:41

AW: Problem mit hpgl Komponente
 
Ich hab sowas mal mit ner alten DXF Komponente gemacht. Das kann sehr zeitaufwendig werden.
Mit einem neueren Delphi würde ich die Listen auf generische Listen umstellen und die Datei mit TStringlist o.ä. laden. Dann ist die Hälfte des Codes eliminiert.
Wenn Du das hast, dann kann man den Code besser überblicken und sehen, was er da macht. Dann kannst Du den Code ggf korrigieren.
So wie der Code jetzt aussieht, wirst Du kein Überblick finden.

mdadali 24. Nov 2022 12:01

AW: Problem mit hpgl Komponente
 
Hallo iphi,

Ich arbeite mit LiteCad von Kolbasoft.
Hier gibt es mehrere Plugins mit Sourcode (DXF, SVG, HPGL.. in C++).

Ich habe deine test file geöffnet. Es wird leider nichts angezeigt.
Du kannst LiteCad SDK (LiteCAD-Demo Anwendung und Plugins) herunterladen.
Oder einfach Oleg kontaktieren.

Grüsse,
Mustafa.

DaCoda 24. Nov 2022 16:46

AW: Problem mit hpgl Komponente
 
Vielleicht hilft dir das ein bisschen weiter, habe ich mal gemacht zu Testzwecken...

Delphi-Quellcode:
unit HpglUtils;

interface

uses
  Windows,
  System.Classes,
  System.Types,
  Vcl.Graphics,
  Vcl.Forms,
  System.SysUtils,
  System.IOUtils;

const
  PenColors: array [1 .. 8] of TColor = (clRed, clYellow, clLime, clAqua, clBlue, clFuchsia, clGray, clSilver);
  clDrawArea                         = $00393431;

  HpglScaleFactor = 40.0;

type
  TOnDraw = procedure(Point: TPoint; PenDown: Boolean; PenColor: TColor) of object;
  TOnPlot = procedure(Point: TPoint) of object;

  THpgl = class(TObject)
  private
    FOnDraw: TOnDraw;
    FOnPlot: TOnPlot;
    FPenDown: Boolean;
    FPenColor: TColor;
    slData: TStringList;
  public
    constructor Create;
    destructor Destroy; override;
    function HpglToInteger(HpglValue: Integer): Integer;
    function HpglToReal(HpglValue: Integer): Real;
    function LoadFromFile(FileName: TFileName): Boolean;

    procedure Plot;

    property OnDraw: TOnDraw read FOnDraw write FOnDraw;
    property OnPlot: TOnPlot read FOnPlot write FOnPlot;
  end;

var
  Hpgl: THpgl;

implementation

uses
  System.StrUtils;

constructor THpgl.Create;
begin
  inherited Create;
  slData := TStringList.Create;
end;

destructor THpgl.Destroy;
begin
  if Assigned(slData) then
      FreeANdNil(slData);
  inherited Destroy;
end;

function THpgl.HpglToReal(HpglValue: Integer): Real;
begin
  Result := HpglValue / HpglScaleFactor;
end;

function THpgl.HpglToInteger(HpglValue: Integer): Integer;
begin
  Result := Round(HpglToReal(HpglValue));
end;

function THpgl.LoadFromFile(FileName: TFileName): Boolean;
var
  slTemp: TStringList;
  F, P: PChar;
  sDummy: string;
begin
  slTemp := TStringList.Create;
  try
    try
      slTemp.Delimiter := ';';
      slTemp.StrictDelimiter := True;
      slTemp.LoadFromFile(FileName);
      Result := True;
      slData.Clear;
      if (slTemp.DelimitedText = '') then
          Exit;
      P := PChar(slTemp.DelimitedText);
      while P^ <> #0 do begin
          F := P;
        P := AnsiStrPos(P, ';');
        if (P = nil) then
            P := StrEnd(F);
        sDummy := Copy(F, 0, P - F);
        if (LeftStr(sDummy, 2) = 'SP') or (LeftStr(sDummy, 2) = 'PU') or (LeftStr(sDummy, 2) = 'PD') or (LeftStr(sDummy, 2) = 'PA') then begin
          if (LeftStr(sDummy, 2) = 'PU') or (LeftStr(sDummy, 2) = 'PD') then begin
              slData.Add(LeftStr(sDummy, 2));
            if RightStr(sDummy, Length(sDummy) - 2) <> '' then
                slData.Add(RightStr(sDummy, Length(sDummy) - 2));
          end else begin
              slData.Add(sDummy);
          end;
        end;
        if P^ <> #0 then
            Inc(P);
      end;
    except
        Result := False;
    end;
  finally
      FreeANdNil(slTemp);
  end;
end;

procedure THpgl.Plot;
var
  Loop: Integer;
  Point: TPoint;
begin
  FPenDown := False;
  for Loop := 0 to slData.Count - 1 do begin
    if Application.Terminated then
        Exit;
    if slData.Strings[Loop] = 'PU' then begin
        FPenDown := False;
    end else if slData.Strings[Loop] = 'PD' then begin
        FPenDown := True;
    end else if LeftStr(slData.Strings[Loop], 2) = 'PA' then begin
        Point.X := SplitString(RightStr(slData.Strings[Loop], Length(slData.Strings[Loop]) - 2), ',')[0].ToInteger;
      Point.Y := SplitString(RightStr(slData.Strings[Loop], Length(slData.Strings[Loop]) - 2), ',')[1].ToInteger;
      if Assigned(OnDraw) then
        OnDraw(Point, FPenDown, FPenColor);
    end else if LeftStr(slData.Strings[Loop], 2) = 'SP' then begin
      if Length(slData.Strings[Loop]) > 2 then begin
          FPenColor := PenColors[(RightStr(slData.Strings[Loop], Length(slData.Strings[Loop]) - 2)).ToInteger];
      end;
    end;  
  end;
end;

end.

himitsu 24. Nov 2022 17:09

AW: Problem mit hpgl Komponente
 
Zitat:

Delphi-Quellcode:
Copy(F, 0, P - F);

Strings fangen bei 1 an mit Zählen ... wenn es bei 0 falsch Zählt, dann hat man eben Pech.



Statt LeftStr würde ich ein StartsStr benutzen
oder ein MatchStrin, wenn mehreres verglichen wird.

Delphi-Quellcode:
(LeftStr(sDummy, 2) = 'SP')
StartsStr('SP', sDummy)
Delphi-Quellcode:
(xxxx = 'SP') or (xxxx = 'PU') or (xxx = 'PD') or ...
MatchStr(xxxx, ['SP', 'PU', 'PD', ...])
StrEnd kann man sich auch sparen, da bei #0 eh abgeschnitten wird und somit Copy garnicht mehr bekommt.
Delphi-Quellcode:
********F := P;
********P := AnsiStrPos(P, ';');
********if (P = nil) then
************P := StrEnd(F);
********sDummy := Copy(F, 0, P - F);
Delphi-Quellcode:
********sDummy := P;
        i := Pos(';', sDummy);
        if i > 0 then
          sDummy := LeftStr(sDummy, i-1); // sDummy := Copy(sDummy, 1, i-1); ODER Delete(sDummy, i-1+1, MaxInt); //  eventuell auch i statt i-1 (inkl. oder exkl. dem ; )

DaCoda 24. Nov 2022 17:55

AW: Problem mit hpgl Komponente
 
Hi Himitsu,

sicher gibt es einiges zum optimieren, der Code sollte auch nur ein Beispiel sein um aufzuzeigen, das es gar nicht so schwer ist HPGL/2 zu verarbeiten.
Ich benötigte diese Unit vor 10 Jahren :-) Und da war es eben gut :-)

Aber ich werde bei Gelegenheit das ganze mal verbessern, Danke für deine Anmerkungen, finde ich sehr gut!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz