![]() |
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: ![]() 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! |
AW: Problem mit hpgl Komponente
Zeige doch mal, was sein soll und was ist.
|
AW: Problem mit hpgl Komponente
Liste der Anhänge anzeigen (Anzahl: 2)
Anbei soll und ist.
Es wird nur die Diagonale gezeichnet. |
AW: Problem mit hpgl Komponente
Wird deine Grafik denn von anderen Viewern, z.B
![]() korrekt angezeigt? Grüße Steku |
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, ...) |
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... |
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. |
AW: Problem mit hpgl Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
evtl. wär dies noch noch eine Alternative. ![]() als Beispiel:
Delphi-Quellcode:
Ich habe mit der importierten Typbibliothek geararbeitet, da mit dem ActiveX Control Fehler auftraten.
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; Kostet ca. 35€ Gruß |
AW: Problem mit hpgl Komponente
Abgesehn davon, dass
Delphi-Quellcode:
bereits im Free eingebaut ist.
if assigned
Zitat:
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. |
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. |
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 ![]() Oder einfach Oleg kontaktieren. Grüsse, Mustafa. |
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. |
AW: Problem mit hpgl Komponente
Zitat:
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:
StrEnd kann man sich auch sparen, da bei #0 eh abgeschnitten wird und somit Copy garnicht mehr bekommt.
(xxxx = 'SP') or (xxxx = 'PU') or (xxx = 'PD') or ...
MatchStr(xxxx, ['SP', 'PU', 'PD', ...])
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 ; ) |
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 23:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz