mirror of
http://gitlab.expertsoft.com.ua/git/expertcad
synced 2026-01-11 22:45:39 +02:00
556 lines
15 KiB
ObjectPascal
556 lines
15 KiB
ObjectPascal
unit U_PortsReIndex;
|
||
|
||
interface
|
||
|
||
uses
|
||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||
Dialogs, siComp, siLngLnk, StdCtrls, ExtCtrls, Buttons, Spin, ComCtrls,
|
||
ToolWin, U_SCSComponent, U_BaseCommon;
|
||
|
||
type
|
||
TF_PortsReIndex = class(TForm)
|
||
Button1: TButton;
|
||
Button2: TButton;
|
||
siLangLinked1: TsiLangLinked;
|
||
RApplyFor: TRadioGroup;
|
||
RComponIndexType: TRadioGroup;
|
||
SheetsOrderList: TListBox;
|
||
SheetOrderLabel: TLabel;
|
||
RComplectIndexType: TRadioGroup;
|
||
CheckBox1: TCheckBox;
|
||
SpinEdit1: TSpinEdit;
|
||
CheckBox2: TCheckBox;
|
||
SpinEdit2: TSpinEdit;
|
||
CantReidexChildCompon: TCheckBox;
|
||
ToolBar1: TToolBar;
|
||
ToolButton1: TToolButton;
|
||
ToolButton2: TToolButton;
|
||
ToolButton3: TToolButton;
|
||
RComponSortOrder: TRadioGroup;
|
||
procedure Button1Click(Sender: TObject);
|
||
procedure Button2Click(Sender: TObject);
|
||
procedure FormShow(Sender: TObject);
|
||
procedure RApplyForClick(Sender: TObject);
|
||
procedure FormCreate(Sender: TObject);
|
||
procedure ToolButton2Click(Sender: TObject);
|
||
procedure ToolButton1Click(Sender: TObject);
|
||
procedure ToolButton3Click(Sender: TObject);
|
||
Function GetComponListFromTreeSelection: TSCSComponents;
|
||
destructor Destroy; override;
|
||
procedure CantReidexChildComponClick(Sender: TObject);
|
||
procedure RComponIndexTypeClick(Sender: TObject);
|
||
procedure RComplectIndexTypeClick(Sender: TObject);
|
||
private
|
||
{ Private declarations }
|
||
public
|
||
{ Public declarations }
|
||
Procedure StartReindex;
|
||
Procedure DisableSheetsOrder;
|
||
Procedure EnableSheetsOrder;
|
||
Procedure LoadProjLists;
|
||
Procedure GetSheetsList(aList: TList);
|
||
procedure ReindexComponsPorts(aList: TList);
|
||
Procedure RemoveChildsFromList(var aList: TSCSComponents);
|
||
end;
|
||
|
||
var
|
||
F_PortsReIndex: TF_PortsReIndex;
|
||
CanReindexComplects, ByCreationOrder: Boolean;
|
||
LastClickedCompon: TSCSComponent;
|
||
currComponPortIndex, currChildComponPortIndex: integer;
|
||
ComponType: TComponentType;
|
||
Tree_Selection: TSCSComponents;
|
||
|
||
implementation
|
||
|
||
uses USCS_Main, U_MAIN, U_ESCadClasess, U_SCSClasses,
|
||
U_SCSLists, U_LNG;
|
||
|
||
{$R *.dfm}
|
||
|
||
Procedure TF_PortsReIndex.RemoveChildsFromList(var aList: TSCSComponents);
|
||
var i: integer;
|
||
currCompon, ParentCompon: TSCSComponent;
|
||
ComponToRemoveList: TSCSComponents;
|
||
begin
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...)
|
||
ComponToRemoveList := TSCSComponents.Create(false); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
for I := 0 to aList.Count - 1 do
|
||
begin
|
||
currCompon := aList[i];
|
||
if Assigned(currCompon.Parent) then
|
||
begin
|
||
if currCompon.Parent is TSCSComponent then
|
||
begin
|
||
ParentCompon := TSCSComponent(currCompon.Parent);
|
||
if aList.IndexOf(ParentCompon) <> -1 then
|
||
begin
|
||
ComponToRemoveList.Add(currCompon);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
for i := 0 to ComponToRemoveList.Count - 1 do
|
||
aList.Remove(ComponToRemoveList[i]);
|
||
ComponToRemoveList.Free;
|
||
end;
|
||
|
||
Function TF_PortsReIndex.GetComponListFromTreeSelection: TSCSComponents;
|
||
var Node: TTreeNode;
|
||
i: integer;
|
||
currCompon: TSCSComponent;
|
||
begin
|
||
Result := TSCSComponents.Create(false);
|
||
for i := 0 to F_ProjMan.Tree_Catalog.SelectionCount - 1 do
|
||
begin
|
||
Node := F_ProjMan.Tree_Catalog.Selections[i];
|
||
if Node <> nil then
|
||
begin
|
||
if Node.Data <> nil then
|
||
begin
|
||
if PObjectData(Node.Data).ObjectID > -1 then
|
||
currCompon := F_ProjMan.GSCSBase.CurrProject.GetComponentFromReferencesList(PObjectData(Node.Data).ListID, PObjectData(Node.Data).ObjectID);
|
||
if currCompon <> nil then
|
||
begin
|
||
if currCompon.IsLine = biFalse then
|
||
Result.Add(currCompon);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
if Result.Count > 1 then
|
||
RemoveChildsFromList(Result);
|
||
end;
|
||
|
||
destructor TF_PortsReIndex.Destroy;
|
||
begin
|
||
Tree_Selection.Free;
|
||
inherited;
|
||
end;
|
||
|
||
Procedure TF_PortsReIndex.GetSheetsList(aList: TList);
|
||
var i: integer;
|
||
ComponList: TSCSComponents;
|
||
CurrCompon: TSCSComponent;
|
||
CurrList: TSCSList;
|
||
begin
|
||
if RApplyFor.Enabled then
|
||
begin
|
||
case RApplyfor.ItemIndex of
|
||
0: begin
|
||
for i := 0 to Tree_Selection.Count - 1 do
|
||
begin
|
||
CurrList := F_ProjMan.GSCSBase.CurrProject.GetListByID(Tree_Selection[i].ListID);
|
||
if aList.IndexOf(CurrList) = -1 then
|
||
aList.Add(CurrList);
|
||
end;
|
||
end;
|
||
1: aList.Add(F_ProjMan.GSCSBase.CurrProject.CurrList);
|
||
2: begin
|
||
for i := 0 to SheetsOrderList.Count - 1 do
|
||
begin
|
||
aList.Add(SheetsOrderList.Items.Objects[i]);
|
||
end;
|
||
end;
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
for i := 0 to Tree_Selection.Count - 1 do
|
||
begin
|
||
CurrList := F_ProjMan.GSCSBase.CurrProject.GetListByID(Tree_Selection[i].ListID);
|
||
if aList.IndexOf(CurrList) = -1 then
|
||
aList.Add(CurrList);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.ReindexComponsPorts(aList: TList);
|
||
var i, j, k: integer;
|
||
ComponList: TSCSComponents;
|
||
CurrList: TSCSList;
|
||
ComponIdex, StartChildIndex: Integer;
|
||
CurrCompon: TSCSComponent;
|
||
|
||
Procedure ReindexPorts(aCompon: TSCSComponent; var aIndex: Integer; aIsChild: Boolean = False);
|
||
var i: integer;
|
||
StartIndex: integer;
|
||
begin
|
||
// ReindexPorts
|
||
for i := 0 to aCompon.Interfaces.Count - 1 do
|
||
begin
|
||
if aCompon.Interfaces[i].TypeI = itFunctional then
|
||
begin
|
||
if aCompon.Interfaces[i].IsPort = biTrue then
|
||
begin
|
||
aCompon.Interfaces[i].NppPort := aIndex;
|
||
inc(aIndex);
|
||
end;
|
||
end;
|
||
end;
|
||
// ReindexChildPorts
|
||
if CanReindexComplects then
|
||
begin
|
||
for i := 0 to aCompon.ChildComplects.Count - 1 do
|
||
begin
|
||
if RComplectIndexType.ItemIndex = 0 then
|
||
ReindexPorts(aCompon.ChildComplects[i], aIndex, True)
|
||
else
|
||
begin
|
||
StartIndex := 1;
|
||
if CheckBox2.Checked then
|
||
StartIndex := SpinEdit2.Value;
|
||
ReindexPorts(aCompon.ChildComplects[i], aIndex, True)
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
Procedure SortComponByUserOrder;
|
||
var i: integer;
|
||
CanSort: Boolean;
|
||
begin
|
||
if ComponList.Count > 0 then
|
||
begin
|
||
CanSort := True;
|
||
while CanSort do
|
||
begin
|
||
CanSort := False;
|
||
case RComponSortOrder.ItemIndex of
|
||
0: begin
|
||
for i := 0 to ComponList.Count - 2 do
|
||
begin
|
||
if ComponList[i].ID > ComponList[i + 1].ID then
|
||
begin
|
||
CanSort := True;
|
||
ComponList.Exchange(i, i + 1);
|
||
end;
|
||
end;
|
||
end;
|
||
1: begin
|
||
for i := 0 to ComponList.Count - 2 do
|
||
begin
|
||
if ComponList[i].SortID > ComponList[i + 1].SortID then
|
||
begin
|
||
CanSort := True;
|
||
ComponList.Exchange(i, i + 1);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
begin
|
||
ComponList := TSCSComponents.Create(false);
|
||
for i:= 0 to aList.Count - 1 do
|
||
begin
|
||
//currList := TSCSList(aList);
|
||
currList := TSCSList(aList[i]);
|
||
// Select Compons
|
||
if RApplyFor.Enabled then
|
||
begin
|
||
if RApplyFor.ItemIndex = 0 then // by selection
|
||
begin
|
||
ComponList.Assign(Tree_Selection);
|
||
if ComponList.Count > 1 then
|
||
begin
|
||
for j := ComponList.Count - 1 downto 0 do
|
||
begin
|
||
if ComponList[j].ListID <> CurrList.ListID then
|
||
ComponList.Remove(ComponList[j]);
|
||
end;
|
||
end;
|
||
end
|
||
else // by ComponentType
|
||
begin
|
||
ComponList.Assign(CurrList.ComponentReferences);
|
||
for j := ComponList.Count - 1 downto 0 do
|
||
begin
|
||
if ComponList[j].IsLine = biTrue then
|
||
ComponList.Remove(ComponList[j])
|
||
else
|
||
if ComponList[i].ComponentType.NamePlural <> ComponType.NamePlural then
|
||
ComponList.Remove(ComponList[j]);
|
||
end;
|
||
RemoveChildsFromList(ComponList);
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
ComponList.Assign(Tree_Selection);
|
||
if ComponList.Count > 1 then
|
||
begin
|
||
for j := ComponList.Count - 1 downto 0 do
|
||
begin
|
||
if ComponList[j].ListID <> CurrList.ListID then
|
||
ComponList.Remove(ComponList[j]);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
SortComponByUserOrder;
|
||
|
||
for j := 0 to ComponList.Count - 1 do
|
||
begin
|
||
CurrCompon := ComponList[i];
|
||
if RComponIndexType.ItemIndex = 0 then
|
||
begin
|
||
ReindexPorts(currCompon, currComponPortIndex);
|
||
if CanReindexComplects then
|
||
begin
|
||
for k := 0 to CurrCompon.ChildComplects.Count - 1 do
|
||
begin
|
||
if RComplectIndexType.ItemIndex = 0 then
|
||
begin
|
||
ReindexPorts(CurrCompon.ChildComplects[k], currComponPortIndex, True)
|
||
end
|
||
else
|
||
begin
|
||
if CheckBox2.Checked then
|
||
StartChildIndex := Spinedit2.value
|
||
else
|
||
StartChildIndex := 1;
|
||
|
||
ReindexPorts(CurrCompon.ChildComplects[k], StartChildIndex, True);
|
||
end;
|
||
end;
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
for k := 0 to CurrCompon.ChildComplects.Count - 1 do
|
||
begin
|
||
if RComplectIndexType.ItemIndex = 0 then
|
||
begin
|
||
ReindexPorts(CurrCompon.ChildComplects[k], currComponPortIndex, True)
|
||
end
|
||
else
|
||
begin
|
||
if CheckBox2.Checked then
|
||
StartChildIndex := Spinedit2.value
|
||
else
|
||
StartChildIndex := 1;
|
||
|
||
ReindexPorts(CurrCompon.ChildComplects[k], StartChildIndex, True);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
//ReindexPortsByList
|
||
end;
|
||
end;
|
||
|
||
|
||
|
||
Procedure TF_PortsReIndex.StartReindex;
|
||
var i: integer;
|
||
SheetsList: TList; //
|
||
SCSCompon: TSCSComponent;
|
||
begin
|
||
CanReindexComplects := not CantReidexChildCompon.Checked; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
ByCreationOrder := (RComplectIndexType.ItemIndex = 0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
SheetsList := TList.Create; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
RemoveChildsFromList(Tree_Selection);
|
||
|
||
LastClickedCompon := F_ProjMan.GetActualSelectedComponent;
|
||
|
||
ComponType := LastClickedCompon.ComponentType;
|
||
|
||
currComponPortIndex := 1;
|
||
|
||
if CheckBox1.Checked then
|
||
currComponPortIndex := Spinedit1.Value;
|
||
|
||
if CanReindexComplects then
|
||
begin
|
||
currChildComponPortIndex := 1;
|
||
if CheckBox2.Checked then
|
||
currChildComponPortIndex := Spinedit1.Value;
|
||
end;
|
||
|
||
GetSheetsList(SheetsList);
|
||
ReindexComponsPorts(SheetsList);
|
||
//free memory
|
||
SheetsList.Free;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.ToolButton1Click(Sender: TObject);
|
||
var i, currIndex: integer;
|
||
begin
|
||
if SheetsOrderList.Count > 1 then
|
||
begin
|
||
currIndex := SheetsOrderList.ItemIndex;
|
||
if currIndex < SheetsOrderList.Items.Count then
|
||
begin
|
||
SheetsOrderList.Items.Exchange(currIndex, currIndex + 1);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.ToolButton2Click(Sender: TObject);
|
||
var i, currIndex: integer;
|
||
begin
|
||
if SheetsOrderList.Count > 1 then
|
||
begin
|
||
currIndex := SheetsOrderList.ItemIndex;
|
||
if currIndex > 0 then
|
||
begin
|
||
SheetsOrderList.Items.Exchange(currIndex, currIndex - 1);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.ToolButton3Click(Sender: TObject);
|
||
begin
|
||
LoadProjLists;
|
||
end;
|
||
|
||
Procedure TF_PortsReIndex.DisableSheetsOrder;
|
||
begin
|
||
SheetsOrderList.Enabled := False;
|
||
SheetOrderLabel.Enabled := False;
|
||
end;
|
||
|
||
Procedure TF_PortsReIndex.EnableSheetsOrder;
|
||
begin
|
||
SheetsOrderList.Enabled := True;
|
||
SheetOrderLabel.Enabled := True;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.Button1Click(Sender: TObject);
|
||
begin
|
||
ModalResult := mrOK;
|
||
StartReindex;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.Button2Click(Sender: TObject);
|
||
begin
|
||
ModalResult := mrCancel;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.CantReidexChildComponClick(Sender: TObject);
|
||
begin
|
||
if CantReidexChildCompon.checked then
|
||
begin
|
||
CheckBox2.Enabled := False;
|
||
SpinEdit2.Enabled := False;
|
||
RComplectIndexType.Enabled := False
|
||
end
|
||
else
|
||
begin
|
||
CheckBox2.Enabled := True;
|
||
SpinEdit2.Enabled := True;
|
||
RComplectIndexType.Enabled := True;
|
||
end;
|
||
end;
|
||
|
||
Procedure TF_PortsReIndex.LoadProjLists;
|
||
var i: integer;
|
||
prLists: TstringList;
|
||
begin
|
||
prLists := TStringList.Create;
|
||
for i := 0 to F_ProjMan.GSCSBase.CurrProject.ProjectLists.Count - 1 do
|
||
begin
|
||
if F_ProjMan.GSCSBase.CurrProject.ProjectLists[i].Setting.ListType = lt_Normal then
|
||
prLists.AddObject(F_ProjMan.GSCSBase.CurrProject.ProjectLists[i].GetNameForVisible, F_ProjMan.GSCSBase.CurrProject.ProjectLists[i]);
|
||
end;
|
||
SheetsOrderList.Items.Clear;
|
||
SheetsOrderList.Items.Assign(prLists);
|
||
prLists.Free;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.FormCreate(Sender: TObject);
|
||
begin
|
||
{ RComponIndexType.Buttons[1].Checked := True;
|
||
RComplectIndexType.Buttons[1].Checked := True;
|
||
RApplyFor.Buttons[1].Checked := true;}
|
||
RComponIndexType.ItemIndex := 0;
|
||
RComplectIndexType.ItemIndex := 0;
|
||
RApplyFor.ItemIndex := 0;
|
||
RComponSortOrder.ItemIndex := 1;
|
||
Tree_Selection := nil;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.FormShow(Sender: TObject);
|
||
var i: integer;
|
||
prLists: TStringList;
|
||
begin
|
||
ModalResult := mrNone;
|
||
if Tree_Selection <> nil then
|
||
FreeAndNil(Tree_Selection);
|
||
|
||
Tree_Selection := GetComponListFromTreeSelection; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>)
|
||
//RemoveChildsFromList(Tree_Selection);
|
||
if Tree_Selection.Count > 1 then
|
||
RApplyFor.Enabled := False
|
||
else
|
||
RApplyFor.Enabled := True;
|
||
LoadProjLists;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.RApplyForClick(Sender: TObject);
|
||
var i: integer;
|
||
begin
|
||
if RApplyFor.ItemIndex = 2 then
|
||
begin
|
||
EnableSheetsOrder;
|
||
end
|
||
else
|
||
DisableSheetsOrder;
|
||
end;
|
||
|
||
procedure TF_PortsReIndex.RComplectIndexTypeClick(Sender: TObject);
|
||
begin
|
||
if RComplectIndexType.ItemIndex = 0 then
|
||
begin
|
||
CheckBox2.Enabled := False;
|
||
SpinEdit2.Enabled := False;
|
||
end
|
||
else
|
||
begin
|
||
CheckBox2.Enabled := True;
|
||
SpinEdit2.Enabled := True;
|
||
end;
|
||
end;
|
||
|
||
Procedure TF_PortsReIndex.RComponIndexTypeClick(Sender: TObject);
|
||
begin
|
||
if RComponIndexType.ItemIndex = 0 then
|
||
begin
|
||
CantReidexChildCompon.Enabled := True;
|
||
if CantReidexChildCompon.checked then
|
||
begin
|
||
CheckBox2.Enabled := False;
|
||
SpinEdit2.Enabled := False;
|
||
RComplectIndexType.Enabled := False
|
||
end
|
||
else
|
||
begin
|
||
RComplectIndexType.Enabled := True;
|
||
if RComplectIndexType.ItemIndex = 0 then
|
||
begin
|
||
CheckBox2.Enabled := False;
|
||
SpinEdit2.Enabled := False;
|
||
end
|
||
else
|
||
begin
|
||
CheckBox2.Enabled := True;
|
||
SpinEdit2.Enabled := True;
|
||
end;
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
CantReidexChildCompon.Enabled := False;
|
||
CheckBox2.Enabled := True;
|
||
SpinEdit2.Enabled := True;
|
||
RComplectIndexType.Enabled := True;
|
||
end;
|
||
end;
|
||
|
||
end.
|