Author: devuser devuser
I have writen a component from image which can show the preview-image in dwg file
Answer:
1 unit DWGView;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7 ExtCtrls;
8
9 type
10 BITMAPINFO256 = record
11 bmiHeader: BITMAPINFOHEADER;
12 bmiColors: array[0..255] of RGBQUAD;
13 end;
14
15 type
16 TNoPreviewEvent = procedure(Sender: TOBject) of object;
17 TFileErrorEvent = procedure(Sender: TOBject; DWGName: string) of object;
18
19 TDWGView = class(TImage)
20 private
21 FDWGVersion: string;
22 FDWGFile: string;
23 FNoPreviewEvent: TNoPreviewEvent;
24 FOnFileError: TFileErrorEvent;
25 FImage: TImage;
26 procedure SetDWGFile(const Value: string);
27 procedure SetFImage(const Value: TImage);
28 { Private declarations }
29 protected
30 procedure ReadDWG;
31 constructor TDWGView;
32 { Protected declarations }
33 public
34 { Public declarations }
35 published
36 { Published declarations }
37 property Image: TImage read FImage write SetFImage;
38
39 property DWGFile: string read FDWGFile write SetDWGFile;
40 property DWGVersion: string read FDWGVersion;
41 property OnNoPreview: TNoPreviewEvent read FNoPreviewEvent write
42 FNoPreviewEvent;
43 property OnFileError: TFileErrorEvent read FOnFileError write FOnFileError;
44 end;
45
46 procedure register;
47
48 implementation
49
50 procedure register;
51 begin
52 RegisterComponents('Voice', [TDWGView]);
53 end;
54
55 procedure TDWGView.ReadDWG;
56 var
57 DWGF: TFileStream; // ????ļ?
58 MemF: TMemoryStream; // ???????
59 BMPF: TMemoryStream; // ???ļ?
60 SentinelF: TMemoryStream; //?ֶ? 16ֽ?
61
62 bif: BITMAPINFO256; // ???ļ???
63 bfh: BITMAPFILEHEADER; // ???ļ??ļ?? 14ֽ?
64
65 PosSentinel: LongInt; // ?ֶ???
66
67 LenPreview: Integer; // ??ֶ?֮??????????ij?
68 RasterPreview: ShortInt; // ????????????ֽ????
69 // 0 ?????? 1 ??BMP?
70 // 2 ??WMF? 3 ????BMP??WMF?
71 PosBMP: Integer; // ?տ????????
72 LenBMP: Integer; // ???BITMAPFILEHEADER????????
73 IndexPreview: Integer;
74 TypePreview: Shortint; // ?????
75 begin
76 if Assigned(FOnFileError) then
77 FOnFileError(Self, FDWGFile);
78 DWGF := TFileStream.Create(FDWGFile, fmOpenRead);
79 BMPF := TMemoryStream.Create;
80 MemF := TMemoryStream.Create;
81 SentinelF := TMemoryStream.Create;
82 try
83 SetLength(FDWGVersion, 6);
84 DWGF.ReadBuffer(FDWGVersion[1], 6);
85 DWGF.Position := 13; // ?ļ???13֏???ֶ?
86 DWGF.read(PosSentinel, 4);
87 DWGF.Position := PosSentinel;
88 SentinelF.CopyFrom(DWGF, 16); // ????ֶ?
89 DWGF.read(LenPreview, 4); // ???
90 DWGF.read(RasterPreview, 1); // ????????
91 for IndexPreview := RasterPreview - 1 downto 0 do
92 begin
93 MemF.Position := 0;
94 MemF.CopyFrom(DWGF, 9); // ????? 9ֽ?
95 MemF.Position := 0;
96 MemF.read(TypePreview, 1); // TypePreview ?????
97 case TypePreview of
98 1: ; // ?????????
99 2:
100 begin
101 // BMP?,??DWG?ļ??BMP???????????BMP
102 // ???ļ??????BITMAPFILEHEADER???
103 MemF.Position := 1;
104 MemF.read(PosBMP, 4); // 2,5
105 MemF.read(LenBMP, 4); // 6,9
106 DWGF.Position := PosBMP;
107 DWGF.ReadBuffer(bif, sizeof(bif));
108
109 with bif do
110 begin
111 bmiColors[0].rgbBlue := 0;
112 bmiColors[0].rgbGreen := 0;
113 bmiColors[0].rgbRed := 0;
114
115 bmiColors[225].rgbBlue := 255;
116 bmiColors[225].rgbGreen := 255;
117 bmiColors[225].rgbRed := 255;
118 end;
119
120 bfh.bfType := $4D42;
121 bfh.bfSize := LenBMP + sizeof(bfh); //
122 bfh.bfReserved1 := 0;
123 bfh.bfReserved2 := 0;
124 bfh.bfOffBits := 14 + $28 + 1024;
125
126 BMPF.Position := 0;
127 BMPF.write(bfh, sizeof(bfh));
128 BMPF.WriteBuffer(bif, sizeof(bif));
129 BMPF.CopyFrom(DWGF, LenBMP - 1064);
130 BMPF.Position := 0;
131 Picture.Bitmap.LoadFromStream(BMPF);
132 end;
133 3: ; // WMF?ļ???22ֽ?Aldus?ļ??
134 end;
135
136 end;
137 finally
138 SentinelF.Free;
139 MemF.Free;
140 DWGF.Free;
141 BMPF.Free;
142 end;
143
144 end;
145
146 procedure TDWGView.SetDWGFile(const Value: string);
147 begin
148 FDWGFile := Value;
149 ReadDWG;
150 end;
151
152 procedure TDWGView.SetFImage(const Value: TImage);
153 begin
154 FImage := Value;
155 end;
156
157 constructor TDWGView.TDWGView;
158 begin
159 //TODO: Add your source code here
160 FDWGFile := '';
161 FDWGVersion := '';
162 end;
163
164 end.
|