mirror of
http://gitlab.expertsoft.com.ua/git/expertcad
synced 2026-01-11 17:25:39 +02:00
342 lines
8.5 KiB
ObjectPascal
342 lines
8.5 KiB
ObjectPascal
{************************************************************}
|
|
{ Delphi VCL Extensions }
|
|
{ }
|
|
{ Basic constants and types }
|
|
{ }
|
|
{ Copyright (c) 2002-2004 SoftGold software company }
|
|
{ }
|
|
{************************************************************}
|
|
unit sgConsts;
|
|
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows;
|
|
|
|
// Constants
|
|
const
|
|
Info_0 = 0;
|
|
Text_1 = 1;
|
|
Name_2 = 2;
|
|
Text_3 = 3;
|
|
Text_4 = 4;
|
|
Text_5 = 5;
|
|
LineTypeName_6 = 6;
|
|
TextFont_7 = 7;
|
|
LayerName_8 = 8;
|
|
VarName_9 = 9;
|
|
XFirst_10 = 10;
|
|
XOther_11 = 11;
|
|
XOther_12 = 12;
|
|
XOther_13 = 13;
|
|
XOther_14 = 14;
|
|
XOther_15 = 15;
|
|
XOther_16 = 16;
|
|
XOther_17 = 17;
|
|
XOther_18 = 18;
|
|
YFirst_20 = 20;
|
|
YOther_21 = 21;
|
|
YOther_22 = 22;
|
|
YOther_23 = 23;
|
|
YOther_24 = 24;
|
|
YOther_25 = 25;
|
|
YOther_26 = 26;
|
|
YOther_27 = 27;
|
|
YOther_28 = 28;
|
|
ZFirst_30 = 30;
|
|
ZOther_31 = 31;
|
|
ZOther_32 = 32;
|
|
ZOther_33 = 33;
|
|
ZOther_34 = 34;
|
|
ZOther_35 = 35;
|
|
ZOther_36 = 36;
|
|
ZOther_37 = 37;
|
|
Elevation_38 = 38;
|
|
TableOfEntity_39 = 39;
|
|
Float_40 = 40;
|
|
Float_41 = 41;
|
|
Float_42 = 42;
|
|
Float_43 = 43;
|
|
Float_44 = 44;
|
|
Float_45 = 45;
|
|
Float_46 = 46;
|
|
Float_47 = 47;
|
|
Float_48 = 48;
|
|
FloatRepeated_49 = 49;
|
|
Float_211 = 211;
|
|
Float_221 = 221;
|
|
Float_231 = 231;
|
|
Angle_50 = 50;
|
|
Angle_51 = 51;
|
|
Angle_52 = 52;
|
|
Angle_53 = 53;
|
|
Angle_54 = 54;
|
|
Angle_55 = 55;
|
|
Angle_56 = 56;
|
|
Angle_57 = 57;
|
|
Angle_58 = 58;
|
|
Visible_60 = 60;
|
|
ColorNumber_62 = 62;
|
|
EntitysBegin_66 = 66;
|
|
PaperSpace_67 = 67;
|
|
Integer_68 = 68;
|
|
Integer_69 = 69;
|
|
Integer_70 = 70;
|
|
Integer_71 = 71;
|
|
Integer_72 = 72;
|
|
Integer_73 = 73;
|
|
Integer_74 = 74;
|
|
Integer_75 = 75;
|
|
Integer_76 = 76;
|
|
Integer_77 = 77;
|
|
Integer_78 = 78;
|
|
Integer_79 = 79;
|
|
Integer_90 = 90;
|
|
Integer_91 = 91;
|
|
Integer_92 = 92;
|
|
Integer_93 = 93;
|
|
Integer_97 = 97;
|
|
Integer_290 = 290;
|
|
Integer_1070 = 1070;
|
|
Extrusion_210 = 210;
|
|
Extrusion_220 = 220;
|
|
Extrusion_230 = 230;
|
|
String_330 = 330;
|
|
String_331 = 331;
|
|
String_340 = 340;
|
|
String_341 = 341;
|
|
Integer_370 = 370;
|
|
String_1000 = 1000;
|
|
String_1005 = 1005;
|
|
Float_1040 = 1040;
|
|
|
|
UserDigit = 23111;
|
|
|
|
sModel = 'Model';
|
|
sLayout = 'Layout1';
|
|
sACADXDataAppName = 'ACAD';
|
|
sActiveVPort = '*ACTIVE';
|
|
sModelSpace = '*MODEL_SPACE';
|
|
sPaperSpace = '*PAPER_SPACE';
|
|
|
|
sTextStyleStandardName = 'STANDARD';
|
|
|
|
// Names of a DXF-entities
|
|
sPolyline = 'Polyline';
|
|
sCircle = 'Circle';
|
|
sEllipse = 'Ellipse';
|
|
sHatchEntity = 'HATCH';
|
|
sPatternSOLID = 'SOLID';
|
|
sPatternANSI31 = 'ANSI31';// FDiagonal, BDiagonal
|
|
sPatternANSI37 = 'ANSI37';// DiagCross
|
|
sPatternNET = 'NET'; // Cross
|
|
sPatternLINE = 'LINE'; // Horizintal, Vertical
|
|
|
|
// Default numbers of parts for parsing circle and spline
|
|
iDefaultNumberOfCircleParts = 16;
|
|
iDefaultNumberOfSplineParts = 25;
|
|
|
|
//Maximum count of the lines in a dotted polyline or curve
|
|
//(if count of lines more then iMaxNumDottedLines we draws solid-polyline)
|
|
iMaxNumDottedLines = 1000;
|
|
|
|
//It is necessary for comparison floating-point numbers
|
|
fAccuracy = 0.000001;
|
|
// bad value for all singles
|
|
BadSingValue: Single = -24444444;
|
|
|
|
|
|
sImpossiblePointerID = '#';
|
|
sFilledArrowForLeader = 'Filled_arrow_for_leader';
|
|
sNewBlockID = '#NewBlockID';
|
|
|
|
// Types
|
|
type
|
|
PFPoint = ^TFPoint;
|
|
TFPoint = record
|
|
X: single;
|
|
Y: single;
|
|
Z: single;
|
|
end;
|
|
|
|
PdxfPoint = ^TdxfPoint;
|
|
TdxfPoint = record
|
|
X,Y,Z: Single;
|
|
end;
|
|
|
|
TFRect = record
|
|
case Integer of
|
|
0: (Left, Top, Z1, Right, Bottom, Z2: Single);
|
|
1: (TopLeft, BottomRight: TFPoint);
|
|
end;
|
|
|
|
PdxfData = ^TdxfData;
|
|
TdxfData = packed record
|
|
Tag: Word; // classindex, DXF_LINE, DXF_SOLID etc.
|
|
Count: Word; // number of child entities
|
|
TickCount: Word;
|
|
Flags: Byte; // Flags byte
|
|
// for polylines: low bit <> 0 - is closed
|
|
// for layers: low bit <> 0 - is invisible
|
|
Style: Byte; // Style (pen, brush...) - for future versions
|
|
Dimension: Integer;
|
|
DashDots: PdxfPoint;
|
|
DashDotsCount: Integer;
|
|
Color: Integer; // Color of entity
|
|
Ticks: Pointer;
|
|
Thickness: Single;// for future versions
|
|
Rotation: Single; // Text or block rotation angle
|
|
Layer: PChar; // Layer name (only one layer for element)
|
|
Text: PChar; // Pointer to text string
|
|
FontName: PChar;
|
|
Handle: THandle;
|
|
Unused: Integer;
|
|
Point: TdxfPoint; // Coordinates of the first point
|
|
Point1: TdxfPoint; // Coordinates of the second point
|
|
Point2: TdxfPoint; // Coordinates of the third point
|
|
Point3: TdxfPoint; // Coordinates of the fourth point
|
|
case Integer of
|
|
0: (Radius,StartAngle,EndAngle: Single); // for arcs (NOT in DXFEnum)
|
|
1: (Block: THandle; Scale: TdxfPoint); // for Inserts (NOT in DXFEnum)
|
|
2: (FHeight,FScale,RWidth,RHeight: Single; HAlign,VAlign: Byte); // for Text
|
|
3: (Points: PdxfPoint); // for polylines (in DXFEnum)
|
|
//4: (Point2, Point3: TdxfPoint);
|
|
end;
|
|
|
|
// Axes in 3-Dimensional cartesian coordinates
|
|
TsgAxes = (axisX, axisY, axisZ);
|
|
|
|
TsgHatchStyle = (hsSolid, hsPatternData, hsHorizontal, hsVertical, hsFDiagonal,
|
|
hsBDiagonal, hsCross, hsDiagCross);
|
|
|
|
TsgImportMode = (imView, imImport);
|
|
|
|
TFMatrix = array[0..3,0..2] of Single;
|
|
|
|
function Degree(ARadian: Extended): Extended;
|
|
function ConvToFloatDef(const S: string; const Value: Extended): Extended;
|
|
function MakeFPoint(X, Y, Z: Single): TFPoint;
|
|
function MakeFRect(Left, Top, Z1, Right, Bottom, Z2: Single): TFRect;
|
|
function MakeFPointFromDXF(const AdxfPoint: TdxfPoint): TFPoint;
|
|
function IdentityMat: TFMatrix;
|
|
function IsRotated(const M: TFMatrix): Boolean;
|
|
//function MatFromExtr(const P: TFPoint; Angle: Single): TFMatrix;
|
|
procedure MatOffset(var M: TFMatrix; const P: TFPoint);
|
|
function MatXMat(const A,B: TFMatrix): TFMatrix;
|
|
function PtXMat(const P: TFPoint; const M: TFMatrix): TFPoint;
|
|
function Radian(Angle: Extended): Extended;
|
|
function StdMat(const S, P: TFPoint): TFMatrix;
|
|
|
|
implementation
|
|
|
|
uses Math, SysUtils, Graphics;
|
|
|
|
function ConvToFloatDef(const S: string; const Value: Extended): Extended;
|
|
begin
|
|
if not TextToFloat(PChar(S), Result, fvExtended) then
|
|
Result := Value;
|
|
end;
|
|
|
|
function MakeFPoint(X, Y, Z: Single): TFPoint;
|
|
begin
|
|
Result.X := X;
|
|
Result.Y := Y;
|
|
Result.Z := Z;
|
|
end;
|
|
|
|
function MakeFRect(Left, Top, Z1, Right, Bottom, Z2: Single): TFRect;
|
|
begin
|
|
Result.Left := Left;
|
|
Result.Top := Top;
|
|
Result.Z1 := Z1;
|
|
Result.Right := Right;
|
|
Result.Bottom := Bottom;
|
|
Result.Z2 := Z2;
|
|
end;
|
|
|
|
function MakeFPointFromDXF(const AdxfPoint: TdxfPoint): TFPoint;
|
|
begin
|
|
Result.X := AdxfPoint.X;
|
|
Result.Y := AdxfPoint.Y;
|
|
Result.Z := AdxfPoint.Z;
|
|
end;
|
|
|
|
function Radian(Angle: Extended): Extended;
|
|
begin
|
|
Result := Angle * Pi / 180;
|
|
end;
|
|
|
|
function Degree(ARadian: Extended): Extended;
|
|
begin
|
|
Result := ARadian * 180 / Pi;
|
|
end;
|
|
|
|
function PtXMat(const P: TFPoint; const M: TFMatrix): TFPoint;
|
|
function Part(I: Integer): Extended;
|
|
begin
|
|
Result := P.X * M[0,I] + P.Y * M[1,I] + P.Z * M[2,I] + M[3,I];
|
|
end;
|
|
begin
|
|
Result.X := Part(0);
|
|
Result.Y := Part(1);
|
|
Result.Z := Part(2);
|
|
end;
|
|
|
|
function MatXMat(const A,B: TFMatrix): TFMatrix;
|
|
var
|
|
I,J: Integer;
|
|
begin
|
|
for I := 0 to 3 do
|
|
begin
|
|
for J := 0 to 2 do
|
|
Result[I,J] := A[I,0] * B[0,J] + A[I,1] * B[1,J] + A[I,2] * B[2,J];
|
|
end;
|
|
for J := 0 to 2 do
|
|
Result[3,J] := Result[3,J] + B[3,J];
|
|
end;
|
|
|
|
function IsRotated(const M: TFMatrix): Boolean;
|
|
var
|
|
I,J: Integer;
|
|
begin
|
|
Result := False;
|
|
for I := 0 to 2 do
|
|
begin
|
|
for J := 0 to 2 do
|
|
begin
|
|
if I = J then
|
|
Continue;
|
|
Result := M[I,J] <> 0.0;
|
|
if Result then
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure MatOffset(var M: TFMatrix; const P: TFPoint);
|
|
begin
|
|
M[3,0] := P.X;
|
|
M[3,1] := P.Y;
|
|
M[3,2] := P.Z;
|
|
end;
|
|
|
|
function StdMat(const S,P: TFPoint): TFMatrix;
|
|
begin
|
|
FillChar(Result, SizeOf(Result), 0);
|
|
Result[0,0] := S.X;
|
|
Result[1,1] := S.Y;
|
|
Result[2,2] := S.Z;
|
|
MatOffset(Result,P);
|
|
end;
|
|
|
|
function IdentityMat: TFMatrix;
|
|
begin
|
|
FillChar(Result, SizeOf(Result), 0);
|
|
Result[0,0] := 1;
|
|
Result[1,1] := 1;
|
|
Result[2,2] := 1;
|
|
end;
|
|
|
|
end.
|