123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- unit tpPeg;
- interface
- uses
- Classes, tpGatherTree, ZhAPI, mPegFilter;
- type
- TtpPegNode = class
- private
- FRelaNode: TtpGatherTreeNode;
- FRelaGclNodes: TList;
- FBeginPeg: string;
- FEndPeg: string;
- FBeginPegNum: Double;
- FEndPegNum: Double;
- procedure LoadGclNodes(ANode: TtpGatherTreeNode);
- function GetPeg: string;
- function GetPegLength: Double;
- public
- constructor Create(ANode: TtpGatherTreeNode; APegFilter: TPegFilter);
- destructor Destroy; override;
- function IsPegIn(ABeginPegNum, AEndPegNum: Double): Boolean;
- function IsPegRela(ABeginPegNum, AEndPegNum: Double): Boolean;
- procedure LoadRelaGclNodes;
- property RelaNode: TtpGatherTreeNode read FRelaNode;
- property RelaGclNodes: TList read FRelaGclNodes;
- property Peg: string read GetPeg;
- property BeginPeg: string read FBeginPeg;
- property EndPeg: string read FEndPeg;
- property BeginPegNum: Double read FBeginPegNum;
- property EndPegNum: Double read FEndPegNum;
- property PegLength: Double read GetPegLength;
- end;
- TtpPegList = class
- private
- FPegNodes: TList;
- FBeginPegNum: Double;
- FEndPegNum: Double;
- FTotalPrice: Double;
- function GetPeg(AIndex: Integer): TtpPegNode;
- function GetCount: Integer;
- function GetBeginPeg: string;
- function GetEndPeg: string;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Clear;
- procedure SortPegs;
- procedure SaveDebugData(const AFileName: string);
- procedure AddPegs(APeg: TtpPegNode);
- procedure LoadRelaGclNodes;
- function TrialTotalPrice(ABeginPegNum, AEndPegNum: Double): Double;
- property Count: Integer read GetCount;
- property Peg[AIndex: Integer]: TtpPegNode read GetPeg;
- property BeginPegNum: Double read FBeginPegNum;
- property BeginPeg: string read GetBeginPeg;
- property EndPegNum: Double read FEndPegNum;
- property EndPeg: string read GetEndPeg;
- property TotalPrice: Double read FTotalPrice;
- end;
- implementation
- uses Math, SysUtils, UtilMethods, CacheTree;
- { TtpPegNode }
- constructor TtpPegNode.Create(ANode: TtpGatherTreeNode; APegFilter: TPegFilter);
- begin
- FRelaNode := ANode;
- FRelaGclNodes := TList.Create;
- FBeginPeg := APegFilter.BeginPeg;
- FBeginPegNum := APegFilter.BeginPegNum;
- if APegFilter.EndPeg = '' then
- begin
- FEndPeg := FBeginPeg;
- FEndPegNum := FBeginPegNum;
- end
- else
- begin
- FEndPeg := APegFilter.EndPeg;
- FEndPegNum := APegFilter.EndPegNum;
- end;
- end;
- destructor TtpPegNode.Destroy;
- begin
- FRelaGclNodes.Free;
- inherited;
- end;
- function TtpPegNode.GetPeg: string;
- begin
- Result := RelaNode.Name;
- end;
- function TtpPegNode.GetPegLength: Double;
- begin
- Result := FEndPegNum - FBeginPegNum;
- end;
- function TtpPegNode.IsPegIn(ABeginPegNum, AEndPegNum: Double): Boolean;
- begin
- Result := (FBeginPegNum >= ABeginPegNum) and (FEndPegNum <= AEndPegNum);
- end;
- function TtpPegNode.IsPegRela(ABeginPegNum, AEndPegNum: Double): Boolean;
- begin
- Result := ((FBeginPegNum < ABeginPegNum) and (FEndPegNum > ABeginPegNum)) or
- ((FBeginPegNum < AEndPegNum) and (FEndPegNum > AEndPegNum));
- end;
- procedure TtpPegNode.LoadGclNodes(ANode: TtpGatherTreeNode);
- var
- vChild: TtpGatherTreeNode;
- begin
- if not Assigned(ANode) then Exit;
- if Assigned(ANode.FirstChild) then
- begin
- vChild := TtpGatherTreeNode(ANode.FirstChild);
- while Assigned(vChild) do
- begin
- LoadGclNodes(vChild);
- vChild := TtpGatherTreeNode(vChild.NextSibling);
- end;
- end
- else if ANode.B_Code <> '' then
- begin
- FRelaGclNodes.Add(ANode);
- ANode.RelaPeg := True;
- end;
- end;
- procedure TtpPegNode.LoadRelaGclNodes;
- begin
- FRelaGclNodes.Clear;
- LoadGclNodes(FRelaNode);
- end;
- { TtpPegList }
- procedure TtpPegList.Clear;
- begin
- FTotalPrice := 0;
- ClearObjects(FPegNodes);
- end;
- constructor TtpPegList.Create;
- begin
- FPegNodes := TList.Create;
- FBeginPegNum := 0;
- FEndPegNum := 0;
- FTotalPrice := 0;
- end;
- destructor TtpPegList.Destroy;
- begin
- Clear;
- FPegNodes.Free;
- inherited;
- end;
- function TtpPegList.GetPeg(AIndex: Integer): TtpPegNode;
- begin
- Result := TtpPegNode(FPegNodes.Items[AIndex]);
- end;
- function TtpPegList.GetCount: Integer;
- begin
- Result := FPegNodes.Count;
- end;
- procedure TtpPegList.SaveDebugData(const AFileName: string);
- var
- i: Integer;
- sgs: TStringList;
- vPeg: TtpPegNode;
- begin
- sgs := TStringList.Create;
- try
- for i := 0 to Count - 1 do
- begin
- vPeg := Peg[i];
- sgs.Add(Format('×®ºÅ%s: Æðµã: %f ÖÕµã: %f', [vPeg.Peg, vPeg.BeginPegNum, vPeg.EndPegNum]));
- end;
- finally
- sgs.SaveToFile(AFileName);
- sgs.Free;
- end;
- end;
- procedure TtpPegList.SortPegs;
- function PegCompare(Item1, Item2: Pointer): Integer;
- var
- vPeg1, vPeg2: TtpPegNode;
- begin
- vPeg1 := TtpPegNode(Item1);
- vPeg2 := TtpPegNode(Item2);
- if vPeg1.BeginPegNum > vPeg2.BeginPegNum then
- Result := 1
- else if vPeg1.BeginPegNum < vPeg2.BeginPegNum then
- Result := -1
- else if vPeg1.PegLength > vPeg2.PegLength then
- Result := 1
- else if vPeg1.PegLength < vPeg2.PegLength then
- Result := -1
- else
- Result := 0;
- end;
- begin
- FPegNodes.Sort(@PegCompare);
- end;
- procedure TtpPegList.AddPegs(APeg: TtpPegNode);
- begin
- FPegNodes.Add(APeg);
- FBeginPegNum := Min(FBeginPegNum, APeg.BeginPegNum);
- FEndPegNum := Max(FEndPegNum, APeg.EndPegNum);
- FTotalPrice := FTotalPrice + APeg.RelaNode.TotalPrice;
- end;
- procedure TtpPegList.LoadRelaGclNodes;
- var
- iPeg: Integer;
- vPeg: TtpPegNode;
- begin
- for iPeg := 0 to FPegNodes.Count - 1 do
- begin
- vPeg := TtpPegNode(FPegNodes.Items[iPeg]);
- vPeg.LoadRelaGclNodes;
- end;
- end;
- function TtpPegList.GetBeginPeg: string;
- begin
- Result := Num2Peg(FBeginPegNum);
- end;
- function TtpPegList.GetEndPeg: string;
- begin
- Result := Num2Peg(FEndPegNum);
- end;
- function TtpPegList.TrialTotalPrice(ABeginPegNum,
- AEndPegNum: Double): Double;
- var
- iPeg: Integer;
- vPegNode: TtpPegNode;
- begin
- Result := 0;
- for iPeg := 0 to FPegNodes.Count - 1 do
- begin
- vPegNode := Peg[iPeg];
- if vPegNode.IsPegIn(ABeginPegNum, AEndPegNum) then
- Result := Result + vPegNode.RelaNode.TotalPrice;
- end;
- end;
- end.
|