![]() |
NToBE ?
Ich hab folgenden (wohl FreePascal) Code. Da gibst eine (vermutlich) function NToBE.
Kennt die jemand?
Delphi-Quellcode:
procedure DecodeASCII85(ASource: string; var ADest: TFPVUByteArray);
var CurSrcPos, CurDestPos: Integer; lDataDWordPtr: PCardinal; lDataCurChar: Char; begin SetLength(ADest, 0); CurDestPos := 0; CurSrcPos := 1; while CurSrcPos <= Length(ASource) do begin lDataCurChar := ASource[CurSrcPos]; // Compressed block of zeroes if lDataCurChar = 'z' then begin SetLength(ADest, Length(ADest)+4); ADest[CurDestPos] := 0; ADest[CurDestPos+1] := 0; ADest[CurDestPos+2] := 0; ADest[CurDestPos+3] := 0; Inc(CurDestPos, 4); Inc(CurSrcPos, 1); Continue; end; // Common block of data: 5 input bytes generate 4 output bytes SetLength(ADest, Length(ADest)+4); lDataDWordPtr := @(ADest[CurDestPos]); if CurSrcPos+4 <= Length(ASource) then begin lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85 + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte(ASource[CurSrcPos+2])-33)*85*85 + (Byte(ASource[CurSrcPos+3])-33)*85 + (Byte(ASource[CurSrcPos+4])-33); lDataDWordPtr^ := NToBE(lDataDWordPtr^); end else if CurSrcPos+3 <= Length(ASource) then begin lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85 + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte(ASource[CurSrcPos+2])-33)*85*85 + (Byte(ASource[CurSrcPos+3])-33)*85 + (Byte('u')-33); lDataDWordPtr^ := NToBE(lDataDWordPtr^); SetLength(ADest, Length(ADest)-1); end else if CurSrcPos+2 <= Length(ASource) then begin lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85 + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte(ASource[CurSrcPos+2])-33)*85*85 + (Byte('u')-33)*85 + (Byte('u')-33); lDataDWordPtr^ := NToBE(lDataDWordPtr^); SetLength(ADest, Length(ADest)-2); end else if CurSrcPos+1 <= Length(ASource) then begin lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85 + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte('u')-33)*85*85 + (Byte('u')-33)*85 + (Byte('u')-33); lDataDWordPtr^ := NToBE(lDataDWordPtr^); SetLength(ADest, Length(ADest)-3); end else begin raise Exception.Create('[DecodeASCII85] Too few bytes remaining to decode!'); end; Inc(CurDestPos, 4); Inc(CurSrcPos, 5); end; end; |
AW: NToBE ?
Wenn du denkst zu wissen wo es her ist, dann schau da doch mal nach?
![]() PS: Man hätte natürlich auch da nachfragen können, wo man den Code her hat und ansonsten kann es nie schaden uns zu verraten von wo das kommt. |
AW: NToBE ?
Klar, hätte ich machen können, aber schließlich seid doch ihr hier meine Liebsten (Delphianer).:)
Ist von ![]() Falls jemand Zeit und Lust hat mitzumachen, ich schreibe gerade den dxfreader nach Delphi um (Ist mit Abstand der Beste was ich der Richtung bisher in Delphi gesehen habe?). Man braucht dazu die fpvutils, fpvectorial und dxfvectorialreader von dort. |
AW: NToBE ?
Habe mir das DXF-Ding gerade mal angeguckt.
Brauchst Du dies "DecodeASCII85" für die DXF überhaupt? |
AW: NToBE ?
Hi Bud. Nee, brauch ich nich, war mir aber heute morgen noch nicht bewußt. Das Ding ist übrigens vom dxf-fachlichen her echt gut aber die ganzen Results der functions als Klassen machen einem echt fertig. :shock:
Mach ich Records draus /wenn's geht oder ich schmeiß sie ganz raus weil ich ja nicht rendern muß sondern die Daten nur in meine Objecte einlesen muß. Ansonsten hat mir mein C++ Kumpel aus Freiburg auch versprochen, ggf. einen aktuellen Parser von C/ C++ (gibt’s anscheinend mehre Open Source Projekte) nach Delphi zu übersetzen. |
AW: NToBE ?
Also die Qualität kann ich so gerade nicht beurteilen, aber es muß wohl etwas umgeschrieben werden. Und irgendeine Art "Schnittstelle" mußte ja haben.
Hast Du Dich über diese LGPL-Lizenz informiert? Kann man die kommerziell einsetzen? |
AW: NToBE ?
Liste der Anhänge anzeigen (Anzahl: 1)
Jo. Das kann man so nicht verwenden. Ich habs mal laufen lassen. Wahnsinn (Siehe Anlage). Ich werd die units fpvutils und fpvectorial ganz rauschmeißen und nur die 3 Klassen TDXFToken, TDXFTokenizer und die TvDXFVectorialReader aus der dxfreader verwenden. Die ReadENTITIES bekommen das entsprechende Objekt meiner Software und ein Event um das einer Liste hinzuzufügen.
Wegen der Lizenz. Ich verwende grundsätzlich nichts was nicht abgeklärt ist. Normalerweise mache ich’s so, daß ich dem Autor eine Mail mit der überabeiteten unit schicke und frage an ob ich die so (auch ggf. kommerziell) verwenden kann. Dann kommt in aller Regel ein no poblem und es freut mich, daß sich überhaut mal jemand dafür interessiert. |
AW: NToBE ?
Zitat:
Edit: Hab gerade gesehen, dass da hierarchische Strukturen enthalten sind, so dass mein Ansatz nicht so richtig geht und Deiner etwas komplizierter wird. Glaube ich jetzt mal so... Edit: Geht doch.. |
AW: NToBE ?
Wenn man die Insert rausschmeißt geht's, ansonsten braucht man eine Liste innerhalb des Parsers.
BTW: Hast du die Einleseroutine verstanden? Wenn ja wie kommen FloatValue und IntValue in die DxfItems, da wird später nämlich munter drauf zugegriffen, ich sehe aber kein Einlesen? :gruebel:
Delphi-Quellcode:
TDxfToken = class
public GroupCode: integer; StrValue: string; FloatValue: double; IntValue: integer; Childs: TList; procedure Clear; constructor Create; destructor Destroy; override; end; TDxfTokenizer = class public Tokens: TList; function TablesSubsection(const Value: string): boolean; function BlocksSubsection(const Value: string): boolean; function EntitiesSubsection(const Value: string): boolean; procedure LoadFromFile(const FileName: string); procedure Clear; constructor Create; destructor Destroy; override; end; procedure TDxfTokenizer.LoadFromFile(const FileName: string); var I: integer; StrSectionGroupCode, StrSectionName: string; IntSectionGroupCode: integer; CurTokenBase, NextTokenBase, SectionTokenBase, LastBlockToken: TList; NewToken: TDxfToken; ParserState: integer; SL: TStringList; begin if FileExists(FileName) then begin SL := TStringList.Create; try Tokens.Clear; SL.LoadFromFile(FileName); CurTokenBase := Tokens; NextTokenBase := Tokens; I := 0; ParserState := 0; while I < SL.Count - 1 do begin CurTokenBase := NextTokenBase; // Now read and process the section name StrSectionGroupCode := SL.Strings[I]; IntSectionGroupCode := StrToInt(Trim(StrSectionGroupCode)); StrSectionName := SL.Strings[I + 1]; NewToken := TDxfToken.Create; NewToken.GroupCode := IntSectionGroupCode; NewToken.StrValue := StrSectionName; // Waiting for a section if ParserState = 0 then begin if (StrSectionName = 'SECTION') then begin ParserState := 1; NextTokenBase := NewToken.Childs; end else if (StrSectionName = 'EOF') then begin Exit; end // Comments can be in the beginning of the file and start with 999 else if (IntSectionGroupCode = 999) then begin // nothing to be done, let it add the token end else begin raise Exception.Create(Format( 'TDxfTokenizer.ReadFromStrings: Expected SECTION, but got: %s', [StrSectionname])); end; end // Processing the section name else if ParserState = 1 then begin if (StrSectionName = 'HEADER') or (StrSectionName = 'CLASSES') or (StrSectionName = 'OBJECTS') or (StrSectionName = 'THUMBNAILIMAGE') then begin ParserState := 2; SectionTokenBase := CurTokenBase; end else if (StrSectionName = 'BLOCKS') or (StrSectionName = 'TABLES') then begin ParserState := 4; SectionTokenBase := CurTokenBase; end else if (StrSectionName = 'ENTITIES') then begin ParserState := 3; SectionTokenBase := CurTokenBase; end else begin raise Exception.Create(Format( 'TDxfTokenizer.ReadFromStrings: Invalid section name: %s', [StrSectionname])); end; end // Reading a generic section else if ParserState = 2 then begin if StrSectionName = 'ENDSEC' then begin ParserState := 0; CurTokenBase := SectionTokenBase; NextTokenBase := Tokens; end; end // Reading the ENTITIES section else if ParserState = 3 then begin if EntitiesSubsection(StrSectionName) then begin CurTokenBase := SectionTokenBase; NextTokenBase := NewToken.Childs; end else if StrSectionName = 'ENDSEC' then begin ParserState := 0; CurTokenBase := SectionTokenBase; NextTokenBase := Tokens; end; end // Reading the TABLES or BLOCKS sections else if ParserState = 4 then begin // This orders the blocks themselves if TablesSubsection(StrSectionName) or BlocksSubsection(StrSectionName) then begin CurTokenBase := SectionTokenBase; NextTokenBase := NewToken.Childs; LastBlockToken := NewToken.Childs; end // This orders the entities inside blocks else if EntitiesSubsection(StrSectionName) and (LastBlockToken <> nil) then begin CurTokenBase := LastBlockToken; NextTokenBase := NewToken.Childs; end else if StrSectionName = 'ENDSEC' then begin ParserState := 0; CurTokenBase := SectionTokenBase; NextTokenBase := Tokens; end; end; CurTokenBase.Add(NewToken); Inc(I, 2); end; finally SL.Free; end; end; end; |
AW: NToBE ?
über dies StrValue in ReadFromStrings?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 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